April 6

Полная инструкция: Let’s Encrypt + Hysteria2 для Remnawave

Введение

В этой инструкции мы настроим автоматическое получение и обновление TLS-сертификатов от Let’s Encrypt и подключим их к ноде Remnawave для работы протокола Hysteria2 (QUIC + TLS).

Что вы получите:
— Действующий сертификат для вашего домена (например, h2.example.com)
— Интеграцию с контейнером Remnawave через Docker volume
— Автообновление сертификатов раз в месяц через cron

Требования

  • Сервер с открытым портом 80 (на время первого получения сертификата) и 443 (для работы Hysteria)
  • Установленный Docker и Docker Compose
  • Домен, направленный A-записью на IP вашего сервера
  • Установленная и работающая нода Remnawave (обычно в /opt/remnanode)

1. Подготовка и установка Certbot

Создадим рабочую директорию для Certbot и базовый docker-compose.yml.

bash

mkdir -p /opt/certbot && cd /opt/certbot
nano docker-compose.yml

Вставьте следующее содержимое:

yaml

services:
  certbot:
    container_name: certbot
    image: certbot/certbot
    network_mode: host
    volumes:
      - ./certs:/etc/letsencrypt

Сохраните (Ctrl+O, Enter, Ctrl+X).

Что здесь происходит:
network_mode: host — Certbot сможет слушать порт 80 на хосте
./certs:/etc/letsencrypt — сертификаты будут храниться в /opt/certbot/certs

2. Первичное получение сертификата

Перед запуском убедитесь, что порт 80 свободен (ни Nginx, ни нода Remnawave, ни другие сервисы его не занимают).

Замените:

  • your-domain.com → ваш домен (например, h2.mysite.com)
  • admin@your-domain.com → ваш email

bash

docker run --rm \
  -v $(pwd)/certs:/etc/letsencrypt \
  -v $(pwd)/var-lib-letsencrypt:/var/lib/letsencrypt \
  --network host \
  certbot/certbot certonly --standalone \
  --non-interactive --agree-tos \
  --email admin@your-domain.com \
  -d your-domain.com

Пример с реальными данными:

bash

docker run --rm \
  -v $(pwd)/certs:/etc/letsencrypt \
  -v $(pwd)/var-lib-letsencrypt:/var/lib/letsencrypt \
  --network host \
  certbot/certbot certonly --standalone \
  --non-interactive --agree-tos \
  --email admin@example.com \
  -d h2.example.com

После успешного выполнения сертификаты появятся в папке:

text

/opt/certbot/certs/live/your-domain.com/
├── fullchain.pem
├── privkey.pem
└── ...

3. Проброс сертификатов в Remnawave

Теперь подключим папку с сертификатами к контейнеру ноды Remnawave.

bash

cd /opt/remnanode
nano docker-compose.yml

Найдите секцию volumes: внутри services.remnanode и добавьте строку:

yaml

services:
  remnanode:
    ...
    volumes:
      - '/opt/certbot/certs:/etc/letsencrypt:ro'   # <-- добавить эту строку

Важно: режим :ro означает read-only — безопасно.

Пример готового блока:

yaml

services:
  remnanode:
    image: remnawave/backend:latest
    container_name: remnanode
    restart: always
    network_mode: host
    volumes:
      - ./data:/app/data
      - '/opt/certbot/certs:/etc/letsencrypt:ro'

Перезапустите ноду:

bash

docker compose down && docker compose up -d

4. Настройка профиля Hysteria2 в панели Remnawave

В веб-панели Remnawave при создании или редактировании профиля узла (node) вставьте следующий JSON.

⚠️ Обязательно замените your-domain.com на ваш реальный домен в путях keyFile и certificateFile.

json

{
  "log": { "loglevel": "none" },
  "inbounds": [
    {
      "tag": "HYSTERIA-BBR",
      "port": 443,
      "listen": "0.0.0.0",
      "protocol": "hysteria",
      "settings": {
        "clients": [],
        "version": 2
      },
      "streamSettings": {
        "network": "hysteria",
        "security": "tls",
        "finalmask": {
          "quicParams": { "debug": false, "congestion": "bbr" }
        },
        "tlsSettings": {
          "alpn": ["h3"],
          "certificates": [
            {
              "keyFile": "/etc/letsencrypt/live/your-domain.com/privkey.pem",
              "certificateFile": "/etc/letsencrypt/live/your-domain.com/fullchain.pem"
            }
          ]
        },
        "hysteriaSettings": { "version": 2 }
      }
    }
  ],
  "outbounds": [
    { "tag": "DIRECT", "protocol": "freedom" },
    { "tag": "BLOCK", "protocol": "blackhole" }
  ],
  "routing": {
    "rules": [
      { "ip": ["geoip:private"], "outboundTag": "BLOCK" },
      { "domain": ["geosite:private"], "outboundTag": "BLOCK" },
      { "protocol": ["bittorrent"], "outboundTag": "BLOCK" }
    ]
  }
}

Что важно:

  • Путь к сертификатам — внутри контейнера Remnawave: /etc/letsencrypt/live/...
  • Именно туда мы пробросили папку /opt/certbot/certs на хосте
  • Протокол Hysteria2 работает поверх QUIC, поэтому указан alpn: ["h3"]

5. Автоматическое обновление сертификатов (Cron)

Сертификаты Let’s Encrypt действительны 90 дней. Настроим ежемесячное обновление.

bash

crontab -e

Добавьте строку (запуск 28-го числа каждого месяца в 00:00):

text

0 0 28 * * cd /opt/certbot && docker compose run --rm certbot renew

Как проверить вручную:

bash

cd /opt/certbot
docker compose run --rm certbot renew --dry-run
--dry-run — тестовый режим без реального обновления.

Проверка работоспособности

  1. Сертификат получен:bashls /opt/certbot/certs/live/your-domain.com/
  2. Remnawave видит сертификаты:bashdocker exec remnanode ls /etc/letsencrypt/live/your-domain.com/
  3. Порт 443 слушается:bashss -tulpn | grep 443
  4. Подключение клиентом Hysteria2 — используйте ваши ключи из панели Remnawave.

Устранение типичных проблем

Проблема

Решение

port 80 is already in use

Остановите nginx / apache / другой сервис: systemctl stop nginx

Сертификат не обновляется в cron

Проверьте путь: cd /opt/certbot должен работать. Добавьте --debug в команду renew

Remnawave не видит файлы

Убедитесь, что volume проброшен именно в /etc/letsencrypt, а не в другую папку

Hysteria2 не стартует

Проверьте JSON: нет ли лишних запятых. Убедитесь, что keyFile и certificateFile указывают на существующие файлы внутри контейнера


Итог

Вы настроили:

  • ✅ Автоматическое получение Let’s Encrypt сертификата для вашего домена
  • ✅ Проброс сертификатов в контейнер Remnawave
  • ✅ Рабочий профиль Hysteria2 с TLS и BBR
  • ✅ Ежемесячное обновление сертификатов через cron

Теперь ваша нода Remnawave готова принимать Hysteria2 соединения по защищённому TLS каналу.