Remnawave – это панель для управления VPN-серверами на ядре Xray. Через неё удобно создавать пользователей, раздавать им подписки, ограничивать трафик и сроки, а также подключать несколько серверов (нод) к одной панели. Проект бесплатный, с открытым исходным кодом и официальной документацией.
В этой статье мы собрали установку целиком, от выбора серверов F3 Cloud до подключения первого клиента. Команды взяты из официальной документации, и всю установку мы прошли сами на панели версии 3.4.5, поэтому названия кнопок и скриншоты совпадают с тем, что вы увидите. Настройки брандмауэра, резервного копирования и советы по маскировке мы добавили от себя.
Из чего состоит Remnawave
- Панель – веб-интерфейс и API, база данных PostgreSQL и кеш Valkey. Сама панель трафик пользователей не пропускает.
- Нода – лёгкий контейнер с ядром Xray. Именно к нодам подключаются пользователи. Панель управляет нодами по защищённому соединению.
- Страница подписки – необязательный компонент. Показывает пользователю красивую страницу с инструкцией и скрывает адрес панели.
Порядок установки важен
Пока к панели не подключена ни одна нода, пользователи подключиться не смогут. Поэтому установка всегда идёт в одном порядке: панель, обратный прокси, нода, профиль, хост и пользователи.
Что понадобится
Два сервера
Разработчики рекомендуют ставить панель и ноду на разные серверы. На одном сервере панель и нода будут спорить за порт 443.
А при блокировке IP-адреса ноды вы потеряете и доступ к панели.
| Роль | Требования Remnawave | Рекомендуемый тариф F3 Cloud |
|---|---|---|
| Панель | от 2 ядер и 2 ГБ ОЗУ, лучше 4 ядра и 4 ГБ, диск 20 ГБ | DE-RZ9-2 (2 vCPU, 4 ГБ ОЗУ, 60 ГБ NVMe) |
| Нода | от 1 ядра и 1 ГБ ОЗУ | DE-Promo для личного использования, DE-RZ9-1 для канала 1 Гбит/с |
На оба сервера установите Ubuntu или Debian. Как заказать сервер, описано в статье о заказе виртуального сервера.
Домен
Понадобятся две A-записи:
panel.ваш-домен.comуказывает на IP-адрес сервера панели;cdn.ваш-домен.comуказывает на IP-адрес сервера ноды.
Отдельное имя для ноды позволяет потом сменить IP-адрес сервера, не обновляя подписки у пользователей.
Выбирайте нейтральные имена
Не используйте в домене и поддоменах слова vpn, proxy, xray, vless, reality, remnawave, node и похожие. Имя сервера передаётся в открытом виде, и такие слова легко отследить по списку. Лучше cdn.example.com, photos.example.com или сам домен без поддомена.
Про Cloudflare
Документация Remnawave советует проксировать домен панели через Cloudflare, если в вашем регионе он работает стабильно. Из России сервисы Cloudflare сейчас работают с перебоями, поэтому мы рекомендуем оставить проксирование выключенным (серое облако).
Для домена ноды проксирование должно быть выключено всегда, ведь Reality работает только при прямом подключении к серверу.
1. Подготовьте оба сервера
Подключитесь к каждому серверу по SSH, например через Termius, и выполните одинаковые команды.
# Обновляем систему
apt update && apt upgrade -y
# Устанавливаем Docker официальным скриптом
curl -fsSL https://get.docker.com | sh
# Проверяем, что Docker и плагин Compose работают
docker --version && docker compose versionЕсли обе команды показали версии, Docker готов.

Docker и Compose установлены
2. Установите панель
Все команды этого шага выполняются на сервере панели.
# Создаём папку и скачиваем официальные файлы docker-compose.yml и .env
mkdir /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 и укажите свой домен в трёх строках.
FRONT_END_DOMAIN=panel.ваш-домен.com
PANEL_DOMAIN=panel.ваш-домен.com
SUB_PUBLIC_DOMAIN=panel.ваш-домен.com/api/subВ SUB_PUBLIC_DOMAIN не пишите https:// и косую черту в конце. Сохраните файл сочетанием Ctrl + O.
Закройте редактор сочетанием Ctrl + X.
Запустите панель и посмотрите журнал запуска.
docker compose up -d && docker compose logs -f -tКогда в журнале появится заставка с версией Remnawave, панель запустилась. Выйдите из просмотра журнала сочетанием Ctrl + C, контейнеры продолжат работать.

Панель запустилась
Не открывайте сервисы наружу
Все сервисы Remnawave слушают только адрес 127.0.0.1 и недоступны из интернета напрямую. Не меняйте это в docker-compose.yml. Доступ к панели должен идти только через обратный прокси из следующего шага.
Если вы изменили .env
После любых изменений в .env контейнеры нужно пересоздать, а не просто перезапустить: docker compose down && docker compose up -d.
3. Настройте Caddy и HTTPS
Remnawave поддерживает Caddy, Nginx и Traefik. Проще всего настроить Caddy, он сам получает и продлевает сертификат Let's Encrypt.
# Создаём папку и файл настроек Caddy
mkdir -p /opt/remnawave/caddy && cd /opt/remnawave/caddy && nano CaddyfileВставьте в файл настройки ниже, заменив домен на свой.
https://panel.ваш-домен.com {
encode
reverse_proxy * http://remnawave:3000
}
:443 {
tls internal
respond 204
}Второй блок отвечает пустой страницей на любые обращения не к вашему домену, например при сканировании по IP-адресу.
Создайте рядом файл docker-compose.yml для Caddy командой nano docker-compose.yml и вставьте в него следующее.
services:
caddy:
image: caddy:2.9
container_name: 'caddy'
hostname: 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
driver: bridge
external: true
volumes:
caddy-ssl-data:
driver: local
external: false
name: caddy-ssl-dataЗапустите Caddy.
docker compose up -d && docker compose logs -f -tЧерез минуту откройте в браузере https://panel.ваш-домен.com. Должна появиться страница регистрации панели с действующим сертификатом.
4. Зарегистрируйте администратора
При первом открытии панель предложит создать аккаунт супер-админа. Первый зарегистрированный пользователь становится главным администратором, поэтому зарегистрируйтесь сразу после запуска Caddy.
Придумайте юзернейм, затем нажмите Сгенерировать и скопировать, чтобы панель сама создала надёжный пароль, и сразу сохраните его в менеджер паролей. После этого нажмите Зарегистрироваться.

Регистрация главного администратора
Если потеряли доступ к панели
Сбросить администратора можно встроенной утилитой восстановления. Запустите на сервере панели команду docker exec -it remnawave cli.
5. Подключите ноду
На сервере ноды создайте папку для неё.
mkdir /opt/remnanode && cd /opt/remnanodeВ панели откройте раздел Ноды и нажмите +. Заполните форму:
- Внутреннее название – любое понятное вам имя, например
DE-Frankfurt-1; - Страна – страна сервера, её флаг увидят пользователи;
- Домен или IP – адрес ноды, например
cdn.ваш-домен.com; - Node Port – порт, через который панель управляет нодой. По умолчанию это
2222.

Создание ноды
Нажмите Скопировать docker-compose.yml. Панель скопирует готовый файл примерно такого вида.
services:
remnanode:
container_name: remnanode
hostname: remnanode
image: remnawave/node:latest
network_mode: host
restart: always
cap_add:
- NET_ADMIN
ulimits:
nofile:
soft: 1048576
hard: 1048576
environment:
- NODE_PORT=2222
- SECRET_KEY="ключ из панели"На сервере ноды откройте редактор командой nano docker-compose.yml, вставьте скопированное содержимое, сохраните файл и запустите ноду.
docker compose up -d && docker compose logs -f -tВ журнале появится таблица с портом API, версией Xray и характеристиками сервера. Значит, нода запустилась и ждёт панель.

Нода запустилась
Вернитесь в панель и нажмите Далее. На шаге Конфигурация ядра нажмите Выбрать и отметьте пока профиль по умолчанию Default-Profile, рабочий профиль мы создадим в следующем шаге. Нажмите Создать ноду. Через несколько секунд появится сообщение «Подключение установлено. Xray Core запущен и работает!».

Панель подключилась к ноде
Закройте порт ноды от посторонних
Порт ноды нужен только панели. Разрешите подключение к нему исключительно с IP-адреса сервера панели, команды есть в разделе «Брандмауэр» ниже.
6. Создайте профиль VLESS Reality
По умолчанию панель создаёт профиль Default-Profile с одним подключением Shadowsocks. Для обхода блокировок добавьте профиль VLESS Reality.
- Откройте раздел Профили, нажмите +, введите название профиля, например
VLESS-Reality, и нажмите Создать. Откроется редактор профиля. - Под редактором рядом с кнопкой Форматировать нажмите кнопку меню и выберите Загрузить с GitHub.
- Выберите шаблон Example VLESS-TCP-REALITY config и нажмите Загрузить шаблон. В нём уже есть подключение
VLESS_TCP_REALITYна порту 443.

Выбор шаблона профиля
Сразу после загрузки панель подсветит ошибку please fill in a valid value for "target". Это нормально, шаблон нужно дозаполнить.

Шаблон загружен, осталось заполнить поля Reality
Ключи для Reality проще всего сгенерировать прямо на сервере ноды.
# Создаём пару ключей Reality. Значение PrivateKey вставьте в поле privateKey
docker exec remnanode xray x25519
# Создаём значение для массива shortIds
openssl rand -hex 8В блоке realitySettings заполните поля:
privateKey– значение PrivateKey из первой команды;shortIds– значение из второй команды, внутри квадратных скобок и кавычек;targetиserverNames– адрес сайта для маскировки и его имя, подробнее в предупреждении ниже.
Внизу редактора должно появиться сообщение Xray config is valid. Нажмите Сохранить.
Не маскируйтесь под крупные чужие сайты
Не указывайте в target и serverNames сайты вроде google.com, microsoft.com или apple.com, это один из главных признаков, по которым сейчас блокируют серверы. Надёжнее всего маскироваться под собственный домен по схеме self-steal. Для этого поставьте на сервер ноды nginx с сайтом на вашем домене, в target укажите 127.0.0.1:8443, в serverNames – свой домен и задайте xver: 0. Пошаговая инструкция есть в статье о self-steal для VLESS Reality.
Осталось включить новое подключение для ноды и пользователей.
- В разделе Ноды откройте свою ноду, в блоке Конфигурация ядра нажмите кнопку изменения, отметьте профиль
VLESS-Realityи сохраните ноду. - Откройте Пользователи → Внутренние сквады, нажмите на
Default-Squad, отметьте галочкой профильVLESS-Realityи сохраните. Без этого пользователи не получат новое подключение.

Профиль VLESS-Reality включён в Default-Squad
7. Создайте хост
Хост определяет, какой адрес и какие параметры получат пользователи в подписке.
- Откройте Подписка → Хосты и нажмите +.
- Включите переключатель Видимость хоста. По умолчанию он выключен, и такой хост в подписку не попадёт.
- В поле Примечание укажите понятное пользователям название, например «Германия».
- Нажмите на блок Инбаунд не выбран, отметьте
VLESS_TCP_REALITYи подтвердите выбор. Порт подставится сам. - В поле Адрес укажите
cdn.ваш-домен.com. - В блоке Опции нажмите Добавить, выберите Отпечаток и укажите
firefox. - Нажмите Сохранить.

Хост с отпечатком firefox
Почему firefox, а не chrome
С конца 2025 года системы фильтрации трафика у российских провайдеров (ТСПУ) оценивают TLS-подключение сразу по нескольким признакам, это подсеть хостинга, имя сайта (SNI) и отпечаток клиента. Отпечаток chrome стоит по умолчанию почти во всех VPN-приложениях и панелях, поэтому сочетание «отпечаток Chrome и IP-адрес дата-центра» стало для фильтров надёжным признаком прокси. Пользователи сообщают, что при нескольких одновременных подключениях с таким отпечатком соединение «замораживается» на несколько минут, а переход на firefox помогает.
Отпечаток edge раньше тоже помогал, но с сентября 2026 года он несовместим с новыми версиями Xray. Начиная с Xray 26.9.8 (входит, например, в 3X-UI 3.8.0 и новее) сервер Reality принимает только клиентов с постквантовым обменом ключами ML-KEM. Профиль edge в Xray соответствует старому Edge 85 без ML-KEM, и подключение с ним не установится. Профиль firefox поддерживает ML-KEM, если в приложении ядро Xray 26.3.23 или новее, поэтому держите клиенты обновлёнными. Значения random и randomized тоже не используйте, они могут выбрать профиль без ML-KEM.
8. Создайте пользователя и подписку
- Откройте раздел Пользователи и нажмите +.
- Укажите Юзернейм без пробелов. Изменить его потом будет нельзя.
- Задайте Лимит трафика,
0означает без ограничений. - Проверьте Дату окончания, по умолчанию панель ставит срок в одни сутки.
- В блоке Внутренние сквады отметьте
Default-Squad. - Нажмите Создать.

Создание пользователя
Откройте созданного пользователя. В его карточке есть поле Ссылка на подписку вида https://panel.ваш-домен.com/api/sub/идентификатор, рядом кнопка копирования. Эту ссылку и отправьте пользователю.

Карточка пользователя и ссылка на подписку
Подключение клиента
Скопируйте ссылку на подписку из карточки пользователя и импортируйте её в приложение, как показано в инструкции по импорту. Подписка обновляется сама, поэтому при изменениях на сервере пользователям ничего не нужно настраивать заново.
Брандмауэр
В официальной документации нет команд для брандмауэра, поэтому приводим наш вариант на базе UFW. Если вы перенесли SSH на другой порт, укажите его вместо 22.
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable# Вместо IP_ПАНЕЛИ укажите IP-адрес сервера панели
ufw allow 22/tcp
ufw allow 443/tcp
ufw allow from IP_ПАНЕЛИ to any port 2222 proto tcp
ufw enableОстальные меры защиты описаны в статье о защите сервера от несанкционированного доступа.
Страница подписки (необязательно)
Отдельная страница подписки скрывает адрес панели от пользователей и показывает им инструкцию по подключению. Её можно поставить на тот же сервер, что и панель.
- Добавьте A-запись для домена подписки, например
sub.ваш-домен.com, и укажите его в файле/opt/remnawave/.envв переменнойSUB_PUBLIC_DOMAIN. Затем пересоздайте контейнер панели командойcd /opt/remnawave && docker compose down remnawave && docker compose up -d. - Создайте токен в разделе Настройки → Токены API.
- Создайте папку
/opt/remnawave/subscriptionи в ней файл.env.
APP_PORT=3010
REMNAWAVE_PANEL_URL=http://remnawave:3000
REMNAWAVE_API_TOKEN=токен_из_панели- Там же создайте
docker-compose.yml.
services:
remnawave-subscription-page:
image: remnawave/subscription-page:latest
container_name: remnawave-subscription-page
hostname: remnawave-subscription-page
restart: always
env_file:
- .env
ports:
- '127.0.0.1:3010:3010'
networks:
- remnawave-network
networks:
remnawave-network:
driver: bridge
external: true- Запустите страницу командой
docker compose up -dи добавьте в/opt/remnawave/caddy/Caddyfileновый блок.
https://sub.ваш-домен.com {
encode
reverse_proxy * http://remnawave-subscription-page:3010
}- Перезапустите Caddy командой
cd /opt/remnawave/caddy && docker compose down && docker compose up -d.
Обновление
Сначала обновите панель, затем ноды.
# На сервере панели
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Если установлена страница подписки, обновите и её из папки /opt/remnawave/subscription той же командой.
Резервное копирование
Официальной инструкции по резервному копированию у Remnawave нет. Достаточно сохранять базу данных и файлы настроек, ведь кеш Valkey ничего важного на диске не хранит. Мы делаем это так.
cd /opt/remnawave
# Сохраняем базу данных в файл с сегодняшней датой
docker exec remnawave-db pg_dump -U postgres postgres > backup-$(date +%F).sql
# Сохраняем файлы настроек в архив
tar czf remnawave-config-$(date +%F).tar.gz .env docker-compose.yml caddy/CaddyfileСкачивайте копии на свой компьютер или в другое хранилище, копия на том же сервере не поможет, если с ним что-то случится. Подробнее о резервных копиях мы рассказали в отдельной статье.
Частые проблемы
Панель не открывается
Проверьте, что A-запись домена панели указывает на IP-адрес сервера. Затем посмотрите журналы командой docker compose logs в папках /opt/remnawave и /opt/remnawave/caddy. Если Caddy не смог получить сертификат, причина будет в его журнале.
Нода не подключается к панели
Убедитесь, что порт 2222 на сервере ноды открыт для IP-адреса панели, а SECRET_KEY скопирован в docker-compose.yml полностью. Журнал ноды можно посмотреть командой docker compose logs в папке /opt/remnanode.
Профиль не сохраняется, ошибка про target
Сообщение please fill in a valid value for "target" значит, что в блоке realitySettings не заполнены поля шаблона. Заполните target, serverNames, privateKey и shortIds, как описано в шаге 6.
Ошибка SPAWN_ERROR: xray
Xray на ноде не смог запуститься с этим профилем, чаще всего из-за ошибки в настройках или занятого порта. Посмотрите журнал Xray командой docker exec remnanode xlogs и исправьте профиль.
Пользователь не видит сервер в подписке
Проверьте три вещи. Профиль включён в Default-Squad, пользователь состоит в этом скваде, а у хоста включён переключатель Видимость хоста. По умолчанию новый хост создаётся выключенным.
Подключение есть, но сайты не открываются
Проверьте, что serverNames, ключи и shortIds в профиле совпадают с тем, что получает клиент, и что IP-адрес ноды не заблокирован у провайдера.
Наши ресурсы
Telegram-канал: https://t.me/f3cloud_news
Сайт хостинга: https://f3cloud.com