Один скрипт для установки и ежедневного администрирования Remnawave Node
на Ubuntu LTS и Debian stable. Ничего не нужно устанавливать — запускается одной командой.
Important
Скрипт запускается от root. Перед установкой рекомендуется иметь доступ к VPS-консоли провайдера на случай ошибки в DNS, firewall или сетевых настройках.
bash <(curl -Ls https://raw.githubusercontent.com/OverlayNode/Remnanode-manager/main/install.sh)Запускается только install.sh — ядро: установка и управление нодой, Reality, профиль Xray, шапка и главное меню. Остальное вынесено в модули и подгружается при первом открытии соответствующего пункта меню:
| Модуль | Что внутри |
|---|---|
sites |
сайты-заглушки: каталог шаблонов, уникализация |
routing |
geo-файлы roscomvpn, DNS, политика РФ-трафика, клиентская маршрутизация |
panel |
Remnawave Panel API |
warp, psiphon, tor, zapret |
внешние выходы и обход DPI |
monitor |
live-монитор, ресурсы, порты, логи, диагностика |
admin |
UFW, BBR, swap, ping, fail2ban, обновления, бэкапы |
Модуль берётся из каталога modules/ рядом со скриптом (клон репозитория), из /usr/local/lib/remnanode/modules (установленная команда) или скачивается из GitHub в /run/remnanode-manager/modules. Скачанный модуль проходит bash -n и должен совпадать по версии с ядром — иначе он не загружается. Шаблоны сайтов скачиваются только в момент выбора шаблона.
По желанию можно поставить команду remnanode вместе со всеми модулями, чтобы запускать меню без curl и без сети (меню → «Администрирование» → «Установить команду remnanode» или install.sh install-command). Повторный запуск этого пункта обновляет команду и модули.
git clone https://github.com/OverlayNode/Remnanode-manager.git
cd Remnanode-manager
bash -n install.sh modules/*.sh
sudo ./install.shПри запуске из клона модули и шаблоны берутся из локальных каталогов, без обращения к сети.
- Установка Node — три сценария:
- только RemnaNode (Xray внутри ноды);
- RemnaNode + Selfsteal + SSL;
- Selfsteal для уже установленной Node (существующий Compose дополняется, а не перезаписывается).
- Версия Node — обновление, выбор тега с Docker Hub, откат на предыдущую версию по digest (работает даже с
latest), закрепление версии. - Сайты-заглушки — 12 готовых шаблонов; при каждом развёртывании сайт уникализируется.
- Протоколы — VLESS TCP (RAW) + Reality + Vision, VLESS XHTTP + Reality, Hysteria2: любой один или сразу все; 3–12 случайных shortIds, ротация ключей.
- Routing — roscomvpn geosite/geoip на ноде с ежедневным автообновлением; РФ и белые списки, блокировка торрентов, клиентская маршрутизация для Happ и шаблона подписки.
- DNS — раздельный: РФ-домены через РФ-резолверы, остальное через зарубежный DoH; перехват клиентского DNS на ноде — защита от утечек.
- Модули — WARP, Psiphon, Tor (с мостами obfs4/webtunnel/snowflake), Zapret2.
- Мониторинг — шапка со статусами и метриками, live-монитор, Docker, порты и подключения, логи, диагностика, тест скорости.
- Администрирование — UFW, BBR, swap, ping, fail2ban, обновление системы, очистка Docker, бэкапы.
- Remnawave Panel API — обновление Config Profile с diff и backup (режимы merge и full).
При каждом открытии меню показывается состояние сервера:
● Node ONLINE Ver: 2.1.3
● Xray RUNNING Ver: 25.9.11
● Selfsteal HEALTHY nginx · status-page · SSL 71d
● Panel CONNECTED API ✓
CPU 8% RAM 624 MB / 2 GB Disk 18%
Load 0.08 Uptime 14d 8h Docker RUNNING
IPv4 185.xxx.xxx.xxx
IPv6 — нет
| Строка | Как определяется |
|---|---|
| Node | ONLINE — контейнер запущен, Node API слушает порт и Xray работает; WAITING — API поднят, Panel ещё не прислала конфиг; DEGRADED, OFFLINE |
| Xray | процесс xray / rw-core; версия — из бинарника в контейнере |
| Selfsteal | healthcheck nginx-selfsteal и наличие /dev/shm/nginx.sock, текущий шаблон, дни до конца сертификата |
| Panel | CONNECTED — есть соединение Panel → Node или Xray получил конфиг; API ✓/✗ — если сохранён API-токен |
| IPv4/IPv6 | публичные адреса интерфейсов; за NAT — внешний адрес (кешируется на час) |
| Пункт меню | Что делает |
|---|---|
| 1. RemnaNode | Docker, Compose, UFW, контейнер remnanode. Inbound'ы настраиваются в Panel |
| 2. RemnaNode + Selfsteal + SSL | + домен, сертификат Let's Encrypt (acme.sh), nginx-selfsteal на /dev/shm/nginx.sock, сайт-заглушка, Xray-профиль с RAW / XHTTP / Hysteria2 |
| 3. Selfsteal к установленной Node | находит Compose существующей ноды и безопасно дополняет его через PyYAML (с backup и docker compose config) |
После установки можно подключить roscomvpn geo-файлы — скрипт предложит это сам.
При установке Selfsteal (и в меню «Xray profile» → «Настроить inbound'ы заново») можно выбрать один протокол или любую комбинацию: 1, 1,3, 2,3, 1,2,3.
| # | Протокол | Порт по умолчанию | Маскировка |
|---|---|---|---|
| 1 | VLESS TCP (RAW) + REALITY + Vision | 443/tcp |
Reality → собственный Selfsteal-сайт |
| 2 | VLESS XHTTP + REALITY | 8443/tcp (или 443, если RAW не выбран) |
Reality → собственный Selfsteal-сайт, случайный path |
| 3 | Hysteria2 | 443/udp |
TLS-сертификат домена ноды |
TCP и UDP 443 используются одновременно без конфликта.
При подключении из РФ ТСПУ режет или замедляет QUIC/HTTP3 на UDP 443 к зарубежным IP, а Hysteria2 по умолчанию выглядит именно как QUIC. При выборе Hysteria2 скрипт предлагает включить Salamander — обфускацию, после которой трафик выглядит как случайный UDP.
Remnawave берёт параметры обфускации для ссылки hysteria2:// не из inbound'а, а из настроек Host, поэтому после включения нужно вставить выведенный скриптом JSON в Panel → Hosts → хост HYSTERIA2 → Final mask, например:
{"udp":[{"type":"salamander","settings":{"password":"<пароль из profile-info>"}}]}Без этого клиент получит ссылку без obfs и не подключится. Включить или выключить Salamander позже: меню «Xray profile» → «Hysteria2: обфускация Salamander».
Если Hysteria2 не подключается — меню «Xray profile» → «Проверить Hysteria2». Проверка по шагам покажет, где обрыв: inbound в профиле, Xray слушает UDP-порт (то есть Panel применила профиль), UFW, сертификат и его домен, доступ контейнера к ключу, ошибки в логах ноды, профиль и пароль обфускации в Panel. Firewall провайдера (security group) должен отдельно пропускать UDP-порт. Flow xtls-rprx-vision назначается пользователям в Panel только для RAW, не для XHTTP. Ноде без Selfsteal (пункт 1) inbound'ы задаются в Panel: для Reality и Hysteria2 нужны домен и сертификат, которые настраивает Selfsteal.
Меню «Управление Node»:
- обновить —
pullтекущего тега; digest прежнего образа сохраняется для отката; - выбрать версию — список тегов
remnawave/nodeс Docker Hub; - откатиться — возврат на сохранённый digest; если после смены версии нода не поднялась, откат предлагается автоматически;
- закрепить — образ фиксируется по digest, обновления перестают его менять.
Шаблоны лежат в templates/sites. Все сделаны на чистых HTML, CSS, JS и SVG, без внешних CDN и шрифтов, и совместимы со строгим CSP nginx (без inline-скриптов и стилей, без форм и полей паролей).
cloud-gateway![]() |
status-page![]() |
dev-docs![]() |
file-transfer![]() |
cdn-edge![]() |
analytics-saas![]() |
photo-studio![]() |
game-studio![]() |
unit-converter![]() |
net-diagnostics![]() |
maintenance![]() |
tech-blog![]() |
Скриншоты сделаны с одним из случайных вариантов: цвет и бренд на сервере будут другими.
Даже один и тот же шаблон при каждом развёртывании и при каждой перегенерации (меню «Сайт-заглушка» → «Перегенерировать») отличается:
- случайный префикс всех CSS-классов (
xq-banner,pks-banner, …); - случайный каталог ресурсов и имена файлов (
/static/7a01cf/524db1fe.css,/dist/974da2/…); - случайный оттенок палитры, бренд, версия, build-метки;
- случайное число бессмысленных, но валидных CSS-правил, дополнения в JS, атрибуты
<body>; - случайная минификация HTML;
- собственный favicon.
В итоге у HTML, CSS и JS каждый раз другие SHA-256, размеры и структура. Предыдущие 5 версий сайта хранятся в backups/, откат — одним пунктом меню.
Бренд можно задать постоянный или оставить случайным при каждом развёртывании.
Целевая схема: РФ-сайты и белые списки — напрямую, торренты — блок, всё остальное — через прокси.
| Уровень | Что делает | Где |
|---|---|---|
| Клиент | Решает, что идёт в VPN, а что напрямую. Только здесь «РФ → напрямую» действительно работает: трафик к РФ-сайтам не покидает страну и идёт с IP пользователя | Happ-маршрутизация или Xray JSON-шаблон подписки в Remnawave |
| Нода (Config Profile в Panel) | Страховка: что делать, если такой трафик всё же пришёл на ноду. Торренты блокируются всегда | Config Profile, который скрипт генерирует и может отправить в Panel |
| Файлы на ноде | geosite/geoip roscomvpn для ext:-правил |
/opt/remnanode/geo, монтируются в контейнер по одному файлу |
По умолчанию РФ-трафик, пришедший на ноду, блокируется: так клиенты с неправильной маршрутизацией не светят зарубежный IP ноды перед российскими сервисами. Политику можно сменить на direct или warp (меню «Routing»).
- Запросы собственного DNS-резолвера Xray → DIRECT; клиентский DNS (порт 53) → перехват
dns-out geoip:private,geosite:private→ BLOCK- BitTorrent (протокол + трекеры из roscomvpn) → BLOCK
- Реклама и телеметрия → BLOCK (опционально)
- Домены модулей → TOR / PSIPHON / WARP
category-ru,whitelist,geoip:direct,geoip:whitelist→ политика RU (по умолчанию BLOCK)- Всё остальное → DIRECT (выход ноды)
Warning
Если включены geo-файлы roscomvpn, профиль содержит ext:roscom-geosite.dat:…. Xray не запустится на ноде без этих файлов — включи geo на всех нодах, которые используют этот Config Profile. Без geo-файлов скрипт автоматически использует встроенные geosite:category-ru / geoip:ru.
Меню «Routing» → «DNS».
| Запрос | Резолвер по умолчанию | Как защищён |
|---|---|---|
РФ-домены (category-ru, whitelist, .ru / .su / .рф) |
Яндекс 77.88.8.8, 77.88.8.1 |
ответ принимается, только если IP российский (expectIPs), иначе запрос уходит к зарубежному DNS |
| Все остальные | DoH Cloudflare + Google | зашифрован — ни провайдер ноды, ни ТСПУ не видят имён |
| DNS клиентов внутри туннеля (порт 53) | перехватывается на ноде | обрабатывается той же split-схемой вместо резолвера, который указал клиент |
Резолверы меняются в меню: для РФ — Яндекс (UDP или DoH) или свой список; для остальных — Cloudflare, Google, Quad9 или свой список. Запросы самого резолвера Xray всегда идут напрямую — иначе запрос к Яндекс-DNS попал бы под geoip:ru → BLOCK.
Одной ноды для этого недостаточно — нужны три условия, и скрипт готовит всё для каждого:
- РФ-трафик идёт с клиента напрямую — с домашнего IP, а не через зарубежную ноду. Это клиентская маршрутизация (ниже). Нода по умолчанию блокирует пришедший к ней РФ-трафик, чтобы ошибка в настройках клиента не засветила её IP.
- РФ-домены резолвятся РФ-DNS напрямую, остальные — через DoH в туннеле. Так РФ-сервисы получают «домашние» ответы, а зарубежные DNS-запросы не уходят мимо VPN.
- РФ-приложения исключены из VPN целиком (раздельное туннелирование по приложениям в Happ / v2rayNG). На Android и iOS приложение видит сам факт VPN-интерфейса независимо от маршрутизации — единственная защита от этого — не пускать его в VPN. Скрипт формирует список популярных РФ-приложений (
profiles/client-ru-apps.txt); проверь названия пакетов в своём клиенте.
Меню «Routing» → «Клиентская маршрутизация»:
- ссылка
happ://routing/onadd/…и JSON для Happ: РФ + whitelist напрямую с РФ-DoH, остальное через прокси с зарубежным DoH, торренты в блок, geo-файлы roscomvpn; routing.rulesиdnsдля Xray JSON-шаблона подписки Remnawave (тегиproxy/direct/block);- список РФ-приложений для исключения из VPN.
Сгенерированные профили ноды и клиентский DNS-блок проверены xray run -test (Xray-core 26.3).
| Модуль | Источник | Как подключается | Примечание |
|---|---|---|---|
| WARP | Chara-Freedom/vps-warp | outbound WARP: freedom + sockopt.interface: warp |
default route ОС не меняется; домены — в routing/warp.list |
| Psiphon | Chara-Freedom/vps-psiphon | outbound PSIPHON: SOCKS5 127.0.0.1:1080, только TCP |
ставится с --bind-loopback; не использовать как выход из страны с DPI |
| Tor | пакет tor |
outbound TOR: SOCKS5 127.0.0.1:9050 |
мосты obfs4 / webtunnel / snowflake для серверов в РФ; .onion → Tor |
| Zapret2 | bol-van/zapret2 | обработка исходящего трафика сервера (nfqws2) | архив релиза сверяется с sha256sum.txt; интерактивный install_easy.sh, blockcheck2 для подбора стратегии |
Сторонние установщики WARP и Psiphon скачиваются во временный файл и проходят bash -n. Перед запуском скрипт показывает URL и SHA-256 и ждёт подтверждения.
Меню «Remnawave Panel API»:
- Сохранить URL панели и API-токен (
/opt/remnanode/panel.env,0600). - Выбрать Config Profile.
- Отправить профиль:
- merge — inbound'ы панели остаются, заменяются
outbounds,routing,dns(подходит для любой ноды); - full — профиль заменяется целиком (для Selfsteal-нод со сгенерированными inbound'ами).
- merge — inbound'ы панели остаются, заменяются
Перед отправкой текущий профиль сохраняется в backups/ и показывается diff (приватные ключи скрыты). Используются GET /api/config-profiles, GET /api/config-profiles/{uuid} и PATCH /api/config-profiles.
Токен не обязателен: без него статус Panel в шапке определяется по связи панели с нодой.
- Live-монитор — шапка, топ процессов,
docker stats, подключения по inbound'ам с числом уникальных IP; обновление каждые 3 с. - Сервер подробно — ОС, CPU, RAM, swap, диски, сеть, трафик интерфейсов, BBR, NTP.
- Порты — слушающие сокеты, нагрузка по inbound'ам, топ-10 IP.
- Логи — RemnaNode (в том числе в реальном времени), nginx, журнал скрипта, системные ошибки, UFW, WARP / Psiphon / Tor.
- Диагностика — Docker, контейнеры, firewall, geo-файлы, модули, DNS, сертификаты, TLS через Reality fallback, проверка профиля в Xray ноды.
- Администрирование — UFW (открыть или закрыть порт, разрешить IP), BBR, swap, ответы на ping, fail2ban для SSH,
apt upgrade, очистка Docker, перезагрузка. - Бэкапы — архив
/opt/remnanode(без кеша и старых бэкапов) и восстановление.
install.sh # интерактивное меню
install.sh status # только шапка
install.sh install-command # установить команду remnanode
install.sh geo-update # обновить geo-файлы roscomvpn
install.sh site-refresh # перегенерировать сайт с новым отпечатком
install.sh profile # пересобрать Xray profile/opt/remnanode/
├── docker-compose.yml Compose ноды (0600)
├── installer.conf состояние скрипта
├── reality.env Reality keys и shortIds (0600)
├── panel.env URL и токен Panel API (0600)
├── nginx.conf конфигурация Selfsteal
├── ssl/ сертификат и ключ
├── html/ текущий сайт-заглушка
├── geo/ roscom-geosite.dat, roscom-geoip.dat
├── routing/ warp.list, psiphon.list, tor.list
├── profiles/ xray-profile.json, profile-info.txt, клиентские routing / DNS / приложения
├── backups/ бэкапы, копии сайта, профили из Panel
└── .cache/ кеш каталога шаблонов
/usr/local/bin/remnanode команда (после install-command)
/usr/local/lib/remnanode/modules/ модули установленной команды
/run/remnanode-manager/modules/ кеш скачанных модулей (до перезагрузки)
/usr/local/sbin/remnanode-geo-update ежедневное обновление geo (systemd timer)
/var/log/remnanode-manager.log журнал
| Порт / endpoint | Назначение | Публичный доступ |
|---|---|---|
SSH (обычно 22/tcp) |
администрирование | нужен администратору |
2222/tcp |
RemnaNode API, подключение Panel → Node | желательно только с IP/CIDR Panel |
80/tcp |
ACME HTTP-01 | нужен для выпуска и продления сертификата |
443/tcp |
VLESS RAW + Reality | клиентам |
8443/tcp |
VLESS XHTTP + Reality | клиентам, если используется XHTTP |
443/udp |
Hysteria2 | клиентам, если используется Hysteria2 |
/dev/shm/nginx.sock |
Reality Selfsteal target | локальный UNIX socket |
127.0.0.1:1080 |
Psiphon SOCKS | только локально |
127.0.0.1:9050 |
Tor SOCKS | только локально |
| Адрес | Когда |
|---|---|
raw.githubusercontent.com, codeload.github.com |
запуск скрипта, модули при первом открытии, каталог шаблонов, команда remnanode |
download.docker.com, Docker Hub |
установка Docker, образы, список тегов remnawave/node |
get.acme.sh, Let's Encrypt |
выпуск и продление сертификата |
github.com/hydraponique/roscomvpn-* |
geo-файлы (при включении и ежедневно) |
api.github.com/repos/bol-van/zapret2 |
установка Zapret2 |
| DNS-резолверы из настроек (по умолчанию Яндекс, Cloudflare, Google) | резолв доменов Xray на ноде |
| URL вашей панели | только при настроенном Panel API |
api.ipify.org |
внешний IPv4, только если на интерфейсах нет публичного адреса |
speed.cloudflare.com, www.cloudflare.com/cdn-cgi/trace, check.torproject.org |
только по запросу: тест скорости и проверки модулей |
Скрипт не отправляет телеметрию.
bash -n install.sh modules/*.sh
bash tests/test_install.sh # нужны jq и openssl
shellcheck -x install.sh modules/*.sh tests/*.sh tools/*.sh
bash tools/render-previews.sh # пересобрать preview.png (Chrome/Chromium + python3)Новый модуль — файл modules/<name>.sh со строкой RNM_MODULE_VERSION="<версия ядра>"; его имя добавляется в RNM_MODULES, а пункт меню вызывает open_module_menu <name> <функция>. При смене версии ядра обновляется маркер во всех модулях.
Новый шаблон — это каталог templates/sites/<name>/ с файлами index.html, 404.html, manifest.json, CSS/JS/SVG. В нём доступны плейсхолдеры:
| Плейсхолдер | Значение |
|---|---|
__P__ |
префикс классов |
__BRAND__, __BRAND_SLUG__ |
бренд |
__DOMAIN__ |
домен ноды |
__HUE__, __HUE2__ |
оттенки палитры |
__SEED__ |
число для JS |
__VERSION__, __BUILD__ |
версия и build-метка |
__YEAR__ |
текущий год |
Ссылки на ресурсы должны быть абсолютными (/style.css, /assets/x.svg). Тесты проверяют, что после рендера не остаётся плейсхолдеров, inline-скриптов и стилей, форм, а все ссылки ведут на существующие файлы.
- Не публикуйте
installer.conf,reality.env,panel.env,docker-compose.ymlи бэкапы: тамSECRET_KEY, приватные ключи и токены. - Регенерация Reality keys или shortIds требует обновить клиентские конфигурации.
- Не назначайте один TCP-порт одновременно RAW и XHTTP.
- Firewall провайдера (security group) нужно настраивать отдельно.
Сразу после запуска VPS на Ubuntu автоматическое обновление может удерживать /var/lib/dpkg/lock-frontend. Удалять lock-файл вручную нельзя. Скрипт ждёт освобождения APT до 600 секунд; таймаут можно изменить:
APT_LOCK_TIMEOUT=1200 bash <(curl -Ls https://raw.githubusercontent.com/OverlayNode/Remnanode-manager/main/install.sh)Проверь, что на ноде есть файлы (меню «Мониторинг» → «Диагностика», раздел Routing / geo). Если профиль с ext:-правилами назначен ноде без geo-файлов, включи на ней geo или отправь в Panel профиль без них.












