Remnawave: панель и нода на своём VPS
Remnawave это бесплатная панель с открытым кодом для управления серверами Xray. В ней заводят пользователей, раздают им ссылки на подписку и подключают сколько угодно серверов-нод. Разберём, как поднять панель и одну ноду на двух VPS, чтобы панель не торчала в интернет, а нода принимала команды только от неё.
Когда нужна Remnawave, а когда хватит 3x-ui
3x-ui ставится на один сервер и управляет Xray прямо на нём. Для одного VPS и пары устройств этого достаточно, см. свой VLESS Reality сервер через 3x-ui.
Remnawave устроена иначе: панель отдельно, ноды отдельно. Это удобно, если:
- серверов несколько, например основной и запасной на случай блокировки IP;
- доступом пользуется семья, и каждому нужна одна ссылка подписки, в которой сразу все серверы;
- хочется менять конфигурацию Xray в одном месте и раскатывать её на все ноды.
Если ничего из этого не про вас, начните с 3x-ui. Remnawave сложнее и требует больше ресурсов.
Только для личного использования
Remnawave с Reality на серверах OBLAKO разрешён, если панелью и нодами пользуетесь вы и ваш домашний круг, а в SNI нод стоит ваш собственный домен. Это прямо допускают правила. Продавать доступ, держать публичный сервис или раздавать подписки в открытых каналах запрещено, подробнее в статье Личный VPN на VPS.
Схема и какие серверы взять
Панель не содержит Xray. Трафик пользователей идёт только через ноды, а панель хранит базу, раздаёт подписки и отправляет нодам конфигурацию. В документации Remnawave нода ставится на отдельный сервер, и на практике так проще: обоим нужен порт 443. Панели он нужен для HTTPS, ноде для Reality.
| Роль | Требования Remnawave | Тариф OBLAKO |
|---|---|---|
| Панель | минимум 2 ядра и 2 GB, лучше 4 GB | VPS-3 (2 vCPU, 4 GB) |
| Нода | минимум 1 ядро и 1 GB | VPS-1 или VPS-2 |
Тарифы и цены на странице VPS. На обоих серверах лучше Ubuntu 24.04 или Debian 12.
Что понадобится
- Два VPS: под панель и под ноду. Как заказать, смотрите в инструкции Как заказать VPS.
- Домен или поддомен для панели, A-запись которого указывает на IP сервера панели. Домен можно купить в панели OBLAKO в разделе Домены.
- Доступ по SSH к обоим серверам.
Дальше в командах IP_ПАНЕЛИ и IP_НОДЫ это адреса ваших серверов, а panel.example.com это домен панели.
Шаг 1. Установите Docker на оба сервера
Панель, база, нода и обратный прокси работают в контейнерах. На каждом сервере выполните:
apt update && apt upgrade -y
curl -fsSL https://get.docker.com | sh
docker compose versionПоследняя команда должна вывести версию плагина Compose. Если она ругается, Docker установился не полностью.
Шаг 2. Поднимите панель
На сервере панели создайте каталог и скачайте официальные файлы:
mkdir -p /opt/remnawave && cd /opt/remnawave
curl -o docker-compose.yml https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/docker-compose-prod.yml
curl -o .env https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/.env.sampleВ .env лежат служебные секреты и пароль базы с примерными значениями. Замените их случайными строками:
sed -i "s/^APP_SECRET=.*/APP_SECRET=$(openssl rand -hex 64)/" .env
sed -i "s/^METRICS_PASS=.*/METRICS_PASS=$(openssl rand -hex 64)/" .env
sed -i "s/^WEBHOOK_SECRET_HEADER=.*/WEBHOOK_SECRET_HEADER=$(openssl rand -hex 64)/" .env
pw=$(openssl rand -hex 24)
sed -i "s/^POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=$pw/" .env
sed -i "s|^\(DATABASE_URL=\"postgresql://postgres:\)[^\@]*\(@.*\)|\1$pw\2|" .envОткройте .env в редакторе (nano .env) и пропишите домен в трёх переменных:
PANEL_DOMAIN=panel.example.com, из него панель собирает прямые ссылки;FRONT_END_DOMAIN=panel.example.com, адрес, по которому вы будете открывать панель;SUB_PUBLIC_DOMAIN=panel.example.com/api/sub, адрес, с которого клиенты забирают подписки.
Запустите контейнеры:
docker compose up -d && docker compose logs -f -tЧерез несколько секунд в логах появится сообщение о старте. Выйдите из просмотра логов по Ctrl+C, контейнеры продолжат работать.
Почему панель пока не открывается
Официальный docker-compose.yml публикует порт панели только на 127.0.0.1. Так и нужно: снаружи к панели ходят только через обратный прокси с HTTPS. Не меняйте адрес на 0.0.0.0, иначе панель окажется в интернете без шифрования.
Шаг 3. Настройте обратный прокси
Самый короткий путь из документации Remnawave это Caddy: он сам получает сертификат Let's Encrypt. Создайте каталог и файл конфигурации:
mkdir -p /opt/remnawave/caddy && cd /opt/remnawave/caddy
nano CaddyfileСодержимое Caddyfile, вместо panel.example.com ваш домен:
https://panel.example.com {
encode
reverse_proxy * http://remnawave:3000
}
:443 {
tls internal
respond 204
}Второй блок отвечает пустой страницей на запросы к серверу по IP или чужому имени. Сканер, который пришёл на IP, не увидит панель.
Рядом создайте docker-compose.yml для Caddy. Он подключается к той же Docker-сети, что и панель:
services:
caddy:
image: caddy:2.9
container_name: caddy
restart: always
ports:
- '0.0.0.0:443:443'
- '0.0.0.0:80:80'
networks:
- remnawave-network
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy-ssl-data:/data
networks:
remnawave-network:
name: remnawave-network
external: true
volumes:
caddy-ssl-data:Запустите его командой docker compose up -d и откройте https://panel.example.com. При первом входе панель предложит создать учётную запись. Первый зарегистрированный становится главным администратором, поэтому сделайте это сразу после запуска Caddy, пока адрес никто не нашёл. Придумайте длинный пароль.
Шаг 4. Добавьте ноду в панели
В панели откройте Nodes, затем Management, и нажмите +. Укажите имя, страну и IP_НОДЫ в поле адреса.
Обратите внимание на поле Node Port. Через этот порт панель отдаёт ноде команды и конфигурацию, пользовательский трафик через него не ходит. Возьмите любой свободный порт, например 2222.
Нажмите Copy docker-compose.yml: панель скопирует готовую конфигурацию ноды с секретным ключом. Окно пока не закрывайте.
Шаг 5. Запустите ноду
На сервере ноды создайте каталог и вставьте скопированную конфигурацию:
mkdir -p /opt/remnanode && cd /opt/remnanode
nano docker-compose.yml
docker compose up -d && docker compose logs -f -tВернитесь в панель, нажмите Next, выберите профиль конфигурации и нажмите Create. Через несколько секунд нода станет зелёной.
Шаг 6. Закройте порт ноды для всех, кроме панели
Порт управления ноды не должен быть доступен из интернета. Документация Remnawave прямо просит открыть его только для IP панели. Нода работает в режиме network_mode: host, поэтому правила ufw к ней применяются как к обычной программе на сервере:
apt install -y ufw
ufw allow OpenSSH
ufw allow 443/tcp
ufw allow from IP_ПАНЕЛИ to any port 2222 proto tcp
ufw enable
ufw statusЕсли в профиле есть другие входящие порты, например для сайта-заглушки на 80, откройте и их.
На сервере панели ufw мало что даёт: Docker публикует порты в обход его правил. Защитой там служит то, что панель слушает только 127.0.0.1, а снаружи открыт один Caddy.
Шаг 7. Настройте Reality на своём домене
Панель создаёт стартовый профиль, но маскировку под чужой сайт вроде google.com в 2026 году вычисляют быстро. Надёжнее self-steal: нода маскируется под ваш собственный сайт на вашем домене. Как это устроено и как поднять сайт-заглушку, разобрано в статье Блокировки VLESS Reality и переход на self-steal. В Remnawave те же параметры Reality (target, serverNames, ключи) задаются в профиле конфигурации, а не в файле на сервере.
Как выбрать имя для маскировки, если своего сайта пока нет, смотрите в статье SNI для Reality.
Домен панели и домен ноды
Для self-steal на ноде возьмите отдельный домен или поддомен, не домен панели. Тогда по сертификату ноды нельзя выйти на вашу панель.
Шаг 8. Создайте пользователей
В разделе Users создайте пользователя для каждого члена семьи, задайте лимит трафика и срок, если нужно. В карточке пользователя есть ссылка на подписку. Её открывают в клиенте с поддержкой подписок Xray, и все ваши ноды появляются в нём сами.
Не публикуйте эти ссылки: по ним подключится любой, у кого они окажутся.
Как защитить панель сильнее
- Вход с двухфакторной проверкой. У Remnawave есть готовый образ
remnawave/caddy-with-auth: он ставится вместо обычного Caddy и требует логин и одноразовый код ещё до страницы панели. Настройка описана в разделе Panel Security документации. - Неочевидный поддомен. Не называйте его
panelилиadmin, такие имена перебирают первыми. - Одна точка входа. Не открывайте наружу порты базы, Redis и самой панели, даже на время.
Обновление
Сначала обновляйте панель, потом ноды. На сервере панели:
cd /opt/remnawave && docker compose pull && docker compose down && docker compose up -d
docker image pruneНа сервере ноды:
cd /opt/remnanode && docker compose pull && docker compose down && docker compose up -dДержите панель и ноды на одной ветке версий. На конец октября 2026 года это 3.4: панель 3.4.7, нода 3.4.3. Новая нода со старой панелью может не подключиться, поэтому перед обновлением загляните в список изменений на GitHub проекта.
Если нода не подключается
- Проверьте, что порт ноды открыт именно для
IP_ПАНЕЛИ:ufw statusна ноде. - Посмотрите логи ноды:
cd /opt/remnanode && docker compose logs -f. - Сверьте версии панели и ноды, обновите ту, что отстала.
- Если нода подключилась, но клиенты не соединяются, проверьте, не заблокирован ли IP сервера, по инструкции Как понять, что IP заблокирован.