1. Гайды
  2. Панели и Xray

Нода Remnawave: установка и подключение к панели

Как панель разговаривает с нодой, откуда берётся SECRET_KEY, как поставить ноду по официальной инструкции и закрыть её порт управления от всех, кроме панели.

Актуально для Remnawave 3.4.4, Remnawave Node 3.4.1 (по официальному репозиторию на 2026-09-24)Обновлено 24.09.2026 7 мин чтения

Установка ноды в документации Remnawave выглядит как «скопируй compose из панели и вставь на сервер». Это правда. Остальное (что внутри этого compose, почему порт ноды нельзя оставлять открытым и что делать, когда нода не выходит в online) документация оставляет на тебя.

Заметка

Гайд опирается на панель Remnawave 3.4.4 и ноду 3.4.1 (релизы в remnawave/backend и remnawave/node на 2026-09-24). Панель предполагается уже установленной: Remnawave с нуля. Переменные между версиями менялись (по базе сообщества, в 2.3.0 переменные ноды APP_PORT/SSL_CERT сменились на NODE_PORT/SECRET_KEY, см. Релизы), так что сверяйся с .env.sample и docker-compose-prod.yml репозитория ноды.

Как нода связана с панелью

Панель не содержит Xray-core. Ядро живёт в контейнере remnanode, а панель им управляет: отправляет конфигурацию, забирает статистику, перезапускает.

  • Кто кому звонит. Нода слушает порт NODE_PORT и принимает на нём внутренние API-запросы от панели. Больше этот порт ни для чего не используется. Соединение инициирует панель, поэтому на сервере панели для нод ничего открывать не нужно.
  • Как защищено. По исходникам ноды это HTTPS-сервер с TLS 1.3 и обязательным клиентским сертификатом (requestCert + rejectUnauthorized), то есть взаимная проверка сертификатов, mTLS.
  • Что такое SECRET_KEY. Упакованный набор из сертификата корневого CA панели, сертификата и ключа ноды, подписанных этим CA, и публичного ключа JWT панели. Нода при старте проверяет набор и печатает в лог рамку SECRET_KEY OK или SECRET_KEY INVALID.
  1. Панель
  2. remnanode
  3. Xray-core
Управление: панель сама подключается к ноде на NODE_PORT и передаёт конфигурацию в Xray-core
  1. Клиент
  2. Xray-core
  3. Интернет
Трафик пользователей идёт мимо панели: клиент подключается к инбаунду Xray на ноде

Корневой CA хранится в базе панели (таблица keygen). Отсюда два следствия. Дамп базы восстанавливает панель вместе с CA, и старые ноды подключаются как раньше. Потеря базы или команда Reset certs в Rescue CLI означает новый SECRET_KEY для каждой ноды.

Не делай так

Опыт сообщества (июль 2026): все ключи нод одной панели подписаны одним CA, и ротации при повторном использовании нет. Был случай, когда docker-compose.yml новой ноды по ошибке запустили на уже работающей, и он заработал ( Установка и обновление, Docker-compose). Compose ноды содержит секрет, храни его как пароль.

Требования

По документации: Ubuntu или Debian, минимум 1 ядро и 1 ГБ RAM. Сама нода лёгкая, но Xray под нагрузкой может съесть заметно CPU и памяти. Нужен Docker с плагином Compose:

sudo curl -fsSL https://get.docker.com | sh

Установка

Порядок из документации: сначала нода создаётся в панели, потом compose переносится на сервер.

1. Каталог на сервере ноды

mkdir /opt/remnanode && cd /opt/remnanode

2. Нода в панели

Nodes → Management → +. Основные поля:

ПолеЧто вписать
Countryстрана сервера
Internal nameимя для себя
AddressIP или домен ноды
Node Portпорт управления, который нода будет слушать для панели
Consumptionмножитель учёта трафика: 1.0 обычно, 0.5 половина, 2.0 вдвое

Дальше кнопка Copy docker-compose.yml.

3. Compose на сервере

cd /opt/remnanode && nano docker-compose.yml

Вставляешь скопированное. По структуре это совпадает с docker-compose-prod.yml из репозитория ноды, только с твоими значениями:

/opt/remnanode/docker-compose.ymlyaml
services:
  remnanode:
    image: remnawave/node:latest
    container_name: remnanode
    hostname: remnanode
    network_mode: host
    restart: always
    cap_add:
      - NET_ADMIN
    ulimits:
      nofile:
        soft: 1048576
        hard: 1048576
    environment:
      - NODE_PORT=2222
      - SECRET_KEY="сюда панель подставит ключ"
  • network_mode: host: контейнер живёт в сетевом стеке хоста, Xray слушает порты инбаундов прямо на сервере, публиковать их через ports: не нужно. Побочный эффект: NODE_PORT тоже слушается на всех интерфейсах сервера.
  • cap_add: NET_ADMIN: в сообществе после 2.7.4 его добавляли вручную при обновлении ( Установка и обновление). По релизам, начиная с Node 2.6.0 с этой capability нода сбрасывает соединения пользователя, удалённого из Xray ( Релизы). В официальном compose он уже есть.

Лайфхак

latest удобен, пока панель и ноды обновляются вместе. В сообществе в августе 2026 ловили несовместимость новой ноды со старой панелью и лечили тем, что фиксировали версию образа ( Ошибки → фиксы). Теги версий на Docker Hub есть, например remnawave/node:3.4.1.

4. Запуск

docker compose up -d && docker compose logs -f -t

В логе ищешь рамку SECRET_KEY OK. Если там SECRET_KEY INVALID, ключ скопирован с обрезанными символами или от другой панели.

5. Профиль конфигурации

В карточке создания ноды Next, выбираешь Config Profile, затем Create.

Config Profile в терминах Remnawave это полная конфигурация Xray-core для ноды со всеми инбаундами и общими настройками. На ноду назначается ровно один профиль, но в профиле может быть сколько угодно инбаундов, и для каждой ноды можно выбрать, какие из них включить. После ноды нужен хост (Hosts): точка входа, которую увидит клиент в подписке. Сразу после установки панели есть автоматически созданный профиль по умолчанию. Рабочий профиль с VLESS и Reality собирается по гайду VLESS + Reality, вариант с XHTTP и своим сайтом-заглушкой в гайде XHTTP и selfsteal.

Файрвол

Документация отдельно предупреждает: закрой NODE_PORT в файрволе ноды для всех, кроме IP панели.

Порт управления открыт всем

ufw allow 2222

Такую строку можно встретить в пошаговых инструкциях из чатов ( Установка и обновление). mTLS не пустит чужого, но порт виден сканерам и обнаруживает ноду.

tcp dport 2222 ip saddr $PANEL_IP accept

Порт отвечает только панели, остальные пакеты режет политика drop.

Только для панели

За основу бери конфиг из гайда nftables: минимальный файрвол и добавь правила ноды в цепочку input:

/etc/nftables.conf (фрагмент)bash
define PANEL_IP = 203.0.113.10

table inet filter {
  chain input {
    type filter hook input priority filter; policy drop;
    # ... established, lo, icmp, ssh как в базовом конфиге ...

    # управление нодой: только с IP панели
    tcp dport 2222 ip saddr $PANEL_IP accept

    # порты инбаундов из профиля, например VLESS Reality на 443
    tcp dport 443 accept
  }
}

Замени 2222 на свой NODE_PORT, а список клиентских портов сверь с инбаундами профиля. Если панель ходит к ноде по IPv6, нужно аналогичное правило с ip6 saddr.

Нода работает в network_mode: host, поэтому Docker не создаёт для неё правил проброса портов, и цепочка input действительно фильтрует её трафик. С контейнерами на ports: это не так, подробности в гайде Docker для панелей и ботов.

Заметка

Если прямой связи панель → нода нет (IP панели блокируется по пути, нода за NAT), в сообществе в августе 2026 обсуждали туннель между серверами: WireGuard, NetBird, SOCKS5 ( Установка и обновление). Про WireGuard есть гайд WireGuard между серверами.

sysctl

Дефолтное ядро не рассчитано на сотни клиентов. BBR, буферы и лимиты описаны в гайде sysctl для ноды.

Проверка, что нода online

  • В Nodes → Management статус показывают иконка слева и цвет карточки. У подключённой ноды в карточке видны uptime Xray-core, число подключений, версии Xray и ноды.
  • Логи самой ноды:
cd /opt/remnanode && docker compose logs -f -t
  • Логи Xray-core внутри контейнера:
docker exec remnanode xlogs
  • Конфиг, с которым Xray запущен сейчас (Rescue CLI ноды):
docker exec -it remnanode cli --dump-config

Если SECRET_KEY из панели скопировать не получается, его выдаёт Rescue CLI панели: docker exec -it remnawave cli, пункт Get SECRET_KEY for a Remnawave Node.

Логи Xray в файл

Официальный рецепт: смонтировать /var/log/remnanode в контейнер (volumes: - '/var/log/remnanode:/var/log/remnanode'), в профиле указать "error": "/var/log/remnanode/error.log" и "access": "/var/log/remnanode/access.log". Документация предупреждает: без ротации логи забьют диск.

/etc/logrotate.d/remnanodebash
/var/log/remnanode/*.log {
      size 50M
      rotate 5
      compress
      missingok
      notifempty
      copytruncate
  }
mkdir -p /var/log/remnanode && logrotate -vf /etc/logrotate.d/remnanode

Бэкапить на ноде почти нечего: конфигурация хранится в панели. В сообществе ноду переподнимают за несколько минут, сохраняя только compose и логи ( Установка и обновление).

Обновление

cd /opt/remnanode && docker compose pull && docker compose down && docker compose up -d && docker compose logs -f

Сначала панель, потом ноды. Подробности и откат в гайде Обновления без поломок.

Типовые ошибки

СимптомПричина и что делать
XML-RPC fault: SPAWN_ERROR: xrayXray не стартовал, почти всегда из-за ошибки в конфиге. Причина видна в docker exec remnanode xlogs, исправляется в профиле в панели (официальная страница Common errors).
SECRET_KEY INVALID при стартеКлюч повреждён или не от этой панели. Скопируй заново из карточки ноды или через Rescue CLI панели.
Все ноды отвалились разом после работ с панельюСброшены сертификаты (Reset certs) или панель поднята на пустой базе: CA новый, ключи всех нод надо перевыпустить.
Client network socket disconnected before secure TLS connection was establishedСообщество, август 2026: новая нода на старой панели 2.8.0. Лечили фиксацией версии ноды в compose ( Ошибки → фиксы).
EPROTO с alert 40Сообщество, август 2026: обновить панель ( Ошибки → фиксы).
Нода online, но у пользователей её нетНет хоста или нода не в скваде пользователя. Сообщество: создать хост, добавить во внутренний сквад, обновить подписку ( индекс ошибок).
Нода не отвечает панелиПроверь с сервера панели, что NODE_PORT доступен именно с её IP: правило ip saddr с опечаткой или старый IP панели после переезда.

Остальные случаи с датами в индексе ошибок и в разделе Ошибки → фиксы.

Источники