← К библиотеке
Панель Практика

Подключение ноды и выпуск первой подписки

Панель стоит, домен резолвится, суперадмин создан. Дальше цепляем первую ноду и выпускаем клиента, который реально подключится. Команды копируй по порядку, свои данные впиши в конструктор сверху. Механику всего этого разбирали в парной теории.

Читать теорию

Готовим сервер ноды

Нода — отдельный сервер, не тот, где панель. На нём нужен только Docker, всё остальное панель зальёт сама:

bash
# ставим docker одной командой
curl -fsSL https://get.docker.com | sh

Базовую защиту хоста (SSH по ключу, файервол, fail2ban) на ноде повтори так же, как на панели — про это отдельный чеклист старта. Пока считаем, что сервер чистый и готов.

Регистрируем ноду в панели

Идём в панель, Nodes → Create new node. Заполняем:

  • Имя — внутреннее, для тебя (например, DE-01).
  • Страна — для отображения клиенту.
  • Address — IP или домен сервера ноды.
  • Port — порт агента ноды, по умолчанию 2222.
  • Config Profile — выбираешь профиль (можно загрузить готовый VLESS Reality через «Load from GitHub» и доработать).
  • Инбаунды — галочками отмечаешь, какие включить на этой ноде.

Панель покажет блок «Important information» с секретным ключом — это SECRET_KEY, единственный пароль ноды к панели. И даст готовый docker-compose.yml с уже подставленными портом и ключом.

Ставим агент на ноду

Копируешь из карточки ноды готовый compose (кнопка Copy docker-compose.yml) — там уже подставлены NODE_PORT и SECRET_KEY. Кладёшь на сервер ноды:

docker-compose.yml
services:
  remnanode:
    image: remnawave/node:latest
    network_mode: host
    cap_add: [NET_ADMIN]
    restart: always
    environment:
      - NODE_PORT=2222
      - SECRET_KEY=КЛЮЧ_ИЗ_ПАНЕЛИ

Поднимаем:

bash
docker compose up -d
docker compose logs -f

Через несколько секунд в панели нода станет online. Что произошло: агент законнектился к панели, авторизовался по ключу, панель запушила ему Xray-JSON профиля с включёнными инбаундами, агент поднял Xray. Для Reality сертификаты не нужны — маскировка работает без них.

Открываем порт ноды

Файервол должен пускать наружу рабочий порт транспорта (обычно 443), а порт агента — только с IP панели, чтобы никто чужой не стучался в управление:

bash
ufw allow 443/tcp
ufw allow from PANEL_IP to any port 2222 proto tcp   # агент ноды только с панели

Собираем видимость: хост и сквад

Нода online, но клиент её пока не увидит — надо достроить цепочку. Вспомни формулу: сервер виден, только если инбаунд включён на ноде, отдан хостом и входит в сквад пользователя.

  1. Hosts → Create host. Указываешь:
    - Remark — имя, которое увидит клиент (например, 🇩🇪 DE-01).
    - Address — адрес ноды.
    - Inbound — тот самый инбаунд, что включён на ноде. Порт подтянется из него.
    - Fingerprint (в расширенных) — ставь firefox, пустым оставлять нельзя.
  2. Squads → создаёшь сквад (тариф) и добавляешь в него этот инбаунд. Без этого шага подписка будет пустой.

Создаём клиента и выпускаем подписку

Теперь пользователь. Users → Create:

  • Username — логин клиента.
  • Срок действия (expireAt) — до какой даты активен.
  • Лимит трафика — сколько гигабайт (или безлимит).
  • Сквады — добавляешь клиента в созданный сквад.
  • Лимит устройств (hwidDeviceLimit) — против шеринга.

Панель сгенерит клиенту CLIENT_UUID и ссылку-подписку. Эту ссылку клиент вставляет в приложение (Happ, v2rayTun, любой xray-клиент) — и получает список серверов. Всё, первый пользователь готов.

Проверяем руками

Не верь панели на слово. Бери подписку тестового клиента, вставляй в приложение, подключайся и смотри реальный выход:

bash
# с устройства под VPN — должен показать IP ноды, а не твой домашний
curl -s https://api.ipify.org

Вернулся IP ноды — цепочка собралась: клиент → нода → интернет. Если подписка пустая — почти наверняка забыл добавить инбаунд в сквад. Если соединение висит — смотри логи ноды и файервол:

bash
# на ноде — жив ли контейнер и что в логах
docker compose logs --tail 50

Бэкап — прямо сейчас

Как только появился первый живой клиент — сделай бэкап базы панели. Нет бэкапа = один сбой = потеря всех клиентов:

bash
cd /opt/remnawave
docker compose exec -T remnawave-db pg_dump -U postgres postgres > backup-$(date +%F).sql
tar czf conf-$(date +%F).tgz .env docker-compose.yml

Храни его вне сервера. Про полноценную схему бэкапа и восстановления — отдельная практика в этом разделе.

Первая нода живёт, первый клиент подключается. Дальше по разделу — брендинг страницы подписки под свой сервис, тонкая настройка хостов и защита панели. А механику того, что ты сейчас собрал, разбирали в парной теории «Ноды и подписки».

Следующий гайд Брендинг страницы подписки под свой сервис → Не понравилась статья или что-то непонятно? Напишите мне — помогу или поправлю. @notrealvpn →
Материал носит образовательный характер и посвящён инженерии сетевой инфраструктуры. Вы отвечаете за соблюдение законов своей юрисдикции.