Remnawave

Работа с Remnawave

Подключение, миграция пользователей, аналитика трафика, балансировка текстовых ключей и режим NO LIMIT+.

Первичная настройка

💡
Remnawave — отдельная панель управления VPN-пользователями. Бот подключается к ней по API и управляет пользователями автоматически.

Шаг 1 — Установка панели Remnawave

Панель можно поставить на внешнем сервере или на том же сервере, что и бот (под ботом). Сама панель в обоих случаях ставится по официальной документации:

docs.rw — Remnawave Panel
Внешний сервер — Reverse Proxy

После панели настройте reverse proxy по официальной инструкции (Caddy, Nginx, Traefik и др.):

docs.rw — Reverse Proxies
Под ботом — скрипт Reverse Proxy

На сервере с ботом (nginx уже есть) после установки панели запустите скрипт: SSL Let's Encrypt и прокси на Remnawave. Тот же скрипт можно использовать и на внешнем сервере вместо ручной настройки из docs.rw.

bash
curl -fsSL https://update.3xstore.ru/remnawave/install_nginx.sh | bash -s -- вашдомен.ru admin@gmail.com

Образец конфига — /root/bot/service/remnawave.conf, на сервере панели: /etc/nginx/conf.d/remnawave.conf (прокси на 127.0.0.1:3000). Все шаблоны: Полезное → сервисные шаблоны.

⚠️
Аргументы: отдельный домен или поддомен для Remnawave и email для Certbot. Это не домен бота. Пример: бот на bot.example.com — панель на panel.example.com. A-запись этого домена должна смотреть на сервер, где запускаете скрипт.
⚠️
Subscription Page устанавливать не нужно. Бот использует собственную страницу подписки (SUBPAGE). Раздел Subscription Page из документации Remnawave пропустите.

Шаг 2 — Подключение к боту

После установки панели откройте Remnawave → Настройки → Подключение и заполните блоки на этой вкладке:

  • 1Включите переключатель «Включить Remnawave» (remnawave_enabled).
  • 2В блоке «Подключение к панели»:
    remnawave_base_url URL панели, например https://panel.example.com.
    Если Remnawave стоит на том же сервере, что и бот — укажите http://127.0.0.1:3000 (loopback, без публичного домена). Перенос панели с отдельного VPS: Скрипт бекапа → перенос под бота.
    remnawave_api_token API-токен из настроек панели Remnawave — с полными правами.
  • 3В блоке «Новые пользователи и миграция»:
    remnawave_default_internal_squad_uuid UUID сквада при платном продлении. Также запасной вариант для триала
    remnawave_trial_internal_squad_uuid UUID сквада при выдаче триала. Пустое = как при продлении. Необязательно — заполнять не нужно, если триал и оплата идут в один сквад.
    remnawave_default_traffic_limit_gb Лимит трафика по умолчанию в ГБ. 0 = безлимит.
    Несколько вариантов использования:
    • ограничение трафика на триале — при продлении тарифом с traffic_gb = 0 лимит сбросится в безлимит;
    • если используете NO LIMIT+ — поле обязательно заполните (не оставляйте 0).
  • 4Нажмите Сохранить на странице Remnawave. Бот начнёт создавать новых пользователей в Remnawave.
✅
После сохранения можно проверить подключение — попробуйте выдать триал или создать тестового пользователя через бота.

Добавление и миграция

💡
Миграция выполняется в один клик через раздел веб-админки Инструменты → Миграция. Все данные берутся из базы данных бота — дополнительный экспорт не нужен.
⚠️
Миграция не обязательна. Она нужна только в отдельных случаях:
  • переход со старых версий бота, где была только панель 3XUI;
  • перенос клиентов на новую панель Remnawave.

Использованный трафик клиентов не мигрируется — в новой панели счётчик начнётся с нуля. Срок подписки и UUID сохраняются.

Подготовка перед миграцией

  • 1Установите и полностью настройте панель Remnawave — добавьте серверы, настройте Squad, укажите API-токен в веб-админке.
  • 2Убедитесь, что параметр remnawave_default_traffic_limit_gb выставлен корректно — именно это значение будет присвоено каждому клиенту при миграции:
    Remnawave → Настройки → Подключение
    remnawave_default_traffic_limit_gb = 0   # 0 = безлимит; для NO LIMIT+ укажите лимит
    💡
    Значение используется при регистрации новых пользователей и при миграции. 0 означает безлимитный трафик.
  • 3 Рекомендуется остановить сервис бота на время миграции, чтобы исключить конфликты при одновременной обработке запросов:
    bash
    systemctl stop vpn-bot

Запуск миграции

  • 1Откройте веб-админку → Инструменты → Миграция.
  • 2Выберите направление миграции: в Remnawave.
  • 3Нажмите кнопку запуска — бот обработает всех пользователей из базы данных и создаст их в Remnawave с текущими сроками подписки.
  • 4После завершения миграции запустите бота обратно:
    bash
    systemctl start vpn-bot

После миграции

✅
Все пользователи переходят на Remnawave. Продление, выдача подписки и управление устройствами выполняются через Remnawave.
📊
Ограничение трафика задаётся через remnawave_default_traffic_limit_gb (Remnawave → Настройки → Подключение). 0 = безлимит. Для NO LIMIT+ укажите лимит, не ноль.
⏭️
Пользователи, у которых UUID пустой, пропускаются. Пользователи, уже существующие в Remnawave, также пропускаются без ошибки.
📶
Использованный трафик не переносится. В панели счётчик начнётся с нуля; лимит задаётся remnawave_default_traffic_limit_gb.

Аналитика трафика

💡
Трафик клиентов в веб-админке (таблица «Клиенты», карточка пользователя) собирается через node-traffic exporter — контейнер на сервере Remnawave, который раз в 10 минут читает Postgres и отправляет сжатый снимок на вебхук бота.

Перед установкой — что должно быть готово

Экспортёр использует те же параметры, что уже прописаны в /opt/remnawave/.env (DATABASE_URL, WEBHOOK_URL, WEBHOOK_SECRET_HEADER). Дополнительно настраивать его конфиг не нужно — но сначала проверьте три пункта ниже.

  • 1Nginx на сервере бота — location для вебхука Remnawave (см. следующий блок).
  • 2Webhook в Remnawave — WEBHOOK_ENABLED, WEBHOOK_URL, WEBHOOK_SECRET_HEADER в /opt/remnawave/.env.
  • 3Веб-админка бота — включено «Принимать вебхуки от Remnawave» и заполнен «Секрет вебхука» (тот же 64-символьный ключ).

Шаг 1 — Location в Nginx (сервер бота)

Убедитесь, что в конфиге Nginx на сервере бота присутствует блок для вебхука Remnawave. Откройте конфиг:

bash
nano /etc/nginx/conf.d/xuiweb.conf

Найдите или добавьте следующий блок внутри секции server { }, перед закрывающей скобкой:

nginx
location /remnawave/webhook {
    proxy_pass http://127.0.0.1:8081/remnawave/webhook;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Content-Type $content_type;
    proxy_set_header Content-Length $content_length;
    proxy_read_timeout 30s;
    proxy_connect_timeout 30s;
    proxy_send_timeout 30s;
}

Сохраните файл (Ctrl+O → Enter → Ctrl+X) и перезагрузите Nginx:

bash
nginx -t && systemctl reload nginx

Шаг 2 — Настройка вебхука в Remnawave

На сервере с Remnawave откройте файл .env:

bash
cd /opt/remnawave
nano .env

Найдите блок # Webhook configuration и выставьте следующие значения:

.env
# Webhook configuration
WEBHOOK_ENABLED=true
WEBHOOK_URL=https://бот.ваш-домен.ru/remnawave/webhook
# WEBHOOK_SECRET_HEADER уже сгенерирован при установке — не меняйте, просто скопируйте
WEBHOOK_SECRET_HEADER=<ваш_секрет_64_символа>

Не забудьте пересоздать контейнеры с новым .env:

bash
cd /opt/remnawave
docker compose up -d
docker compose logs -f -t
⚠️
Значение WEBHOOK_SECRET_HEADER по умолчанию уже есть в .env Remnawave (64 символа a-z, 0-9, A-Z) — генерировать новый не нужно. Скопируйте его из файла и вставьте в Remnawave → Настройки → Вебхуки и NO LIMIT → поле remnawave_webhook_secret.

Шаг 3 — Веб-админка бота

Откройте Remnawave → Настройки → Вебхуки и NO LIMIT:

  • 1Включите переключатель «Принимать вебхуки от Remnawave» (remnawave_webhook_enabled).
  • 2Скопируйте значение WEBHOOK_SECRET_HEADER из /opt/remnawave/.env (уже есть по умолчанию, генерировать новый не нужно) и вставьте в поле «Секрет вебхука» (remnawave_webhook_secret). Сохраните страницу.
✅
Если все три шага выполнены (Nginx, webhook в Remnawave, секрет в веб-админке) — для аналитики трафика больше ничего настраивать не нужно, кроме установки экспортёра на сервере Remnawave (следующий шаг). Не путайте с режимом NO LIMIT+: заполнение безлимитного сквада (remnawave_traffic_exhausted_squad_uuid) не обязательно, если вы не используете NO LIMIT+.

Шаг 4 — Установка экспортёра (сервер Remnawave)

На сервере с Remnawave выполните одну команду от root. Скрипт создаст каталог /opt/remnawave_node_exporter, скачает архив, соберёт Docker-контейнер и запустит его в сети Remnawave. Настройки читаются автоматически из /opt/remnawave/.env.

bash
curl -fsSL https://update.3xstore.ru/remnawave_node_exporter/install2.sh | bash

Проверка логов после установки:

bash
cd /opt/remnawave_node_exporter && docker compose logs -f
⚠️
Важно. Если Nginx, webhook Remnawave и секрет в веб-админке уже настроены — или у вас полностью настроен режим NO LIMIT+ — никаких дополнительных действий не требуется, кроме установки скрипта экспортёра на сервере Remnawave командой выше.

Балансировка текстовых ключей

💡
Балансировка ключей — это «один ключ на имя» для текстовой подписки (vless://, vmess://, trojan:// и т.п.). Когда в Remnawave у вас несколько хостов с одинаковой «логической» группой имени (🇪🇺 Евро WIFI 1, … 2, … 3), xuiweb при каждом обновлении подписки оставляет пользователю одну строку — 🇪🇺 Евро WIFI — и подставляет один случайный ключ из пула, а не все три сразу.

Это не то же самое, что умная балансировка JSON для Happ/INCY: JSON-подписка (xrayConfig) этой функцией не меняется.

Зачем это нужно

Remnawave при дублировании remark автоматически добавляет суффиксы 1, 2, 3 к имени хоста. Если у вас три ноды с одним «логическим» сервером, без балансировки клиент увидит три одинаковых кнопки в приложении. С включённой балансировкой — одну кнопку, а фактическое подключение распределяется между нодами.

  • ✓Меньше шума в списке серверов у пользователя
  • ✓Равномерная нагрузка между дубликатами при режиме random
  • ✓Исключение offline и перегруженных нод при режиме online

Как это работает

  1. Пользователь обновляет подписку в клиенте → запрос идёт на SUBPAGE (/sub/{uuid}).
  2. xuiweb получает от Remnawave список текстовых ключей (plain links).
  3. Если в админке включена «Балансировка текстовых ключей», ключи группируются по «базовому» имени (см. правила ниже).
  4. Из каждой группы выбирается один ключ — по режиму random или online.
  5. Имя в фрагменте ключа (#… или ps у vmess) перезаписывается на каноническое — без цифры 1/2/3 в конце.

Правила группировки имён в Remnawave

Имена хостов в панели Один пул балансировки? Что увидит клиент
🇪🇺 Евро WIFI 1, … 2, … 3 Да — одна группа Одна строка 🇪🇺 Евро WIFI
🇪🇺 Евро WIFI 1 [PC], … 2 [PC] Отдельный пул для [PC] 🇪🇺 Евро WIFI [PC]
🇪🇺 Евро WIFI 1 и 🇪🇺 Евро WIFI 1 [MOBILE] Нет — разные пулы Две разные кнопки (общая и mobile)

Поддерживаемые теги платформы: [PC], [MOBILE], [ROUTER], [TV] (регистр не важен). Теги не смешиваются между собой и с «общими» хостами без тега.

Настройка в веб-админке

Откройте Remnawave → Настройки → Подключение → блок «Доп возможности», переключатель «Балансировка текстовых ключей (один ключ на имя)»:

Параметр Описание
sub_link_dedup_enabled Включить балансировку текстовых ключей
sub_link_dedup_mode random — случайный ключ из пула при каждом обновлении подписки.
online — случайный среди «здоровых» (нода online, usersOnline ≤ порога).
sub_link_dedup_online_threshold Порог онлайна на ноде (режим online). Ключ не выдаётся, если на привязанной ноде хоста пользователей больше порога.
sub_link_dedup_online_interval_sec Как часто xuiweb опрашивает Remnawave API (/api/hosts/, /api/nodes/) для режима online (по умолчанию 60 сек).
⚠️
Режим online смотрит на ноду, привязанную к хосту в Remnawave (Хосты → Редактировать хост → Хост ноды). Без привязанной ноды хост в этом режиме не фильтруется по нагрузке и всегда считается «здоровым».

Привязка ноды к хосту (для режима online)

Чтобы xuiweb мог отсеивать offline и перегруженные серверы, у каждого хоста в пуле балансировки должна быть указана нода:

  • 1Remnawave → Хосты (Hosts)
  • 2Откройте нужный хост → Редактировать
  • 3В блоке Хост ноды (Host nodes) выберите ноду, на которой реально крутится этот inbound
  • 4Сохраните. Повторите для всех хостов в группе (… 1, … 2, … 3)

xuiweb сопоставляет ключ с хостом по адресу и порту из подписки, затем читает usersOnline и статус (isConnected) привязанной ноды через API Remnawave.

Пример: до и после

Без балансировки — три ключа в подписке:

🇪🇺 Евро WIFI 1
🇪🇺 Евро WIFI 2
🇪🇺 Евро WIFI 3

С балансировкой — одна строка, при следующем обновлении может выпасть другая нода из того же пула:

🇪🇺 Евро WIFI

Частые вопросы

Работает ли с JSON-подпиской (Happ / INCY)?
Нет. Только для plain-текстовой выдачи. Для JSON используйте умную балансировку Xray.

Нужно ли что-то менять в Remnawave кроме имён хостов?
Для режима random — достаточно имён с суффиксами 1/2/3 и переключателя в админке. Для режима online дополнительно привяжите ноду в каждом хосте: Хосты → Редактировать → Хост ноды.

Можно ли балансировать только по нагрузке, без случайности?
Нет — внутри «здорового» пула выбор всё равно случайный. Режим online лишь отсекает offline и перегруженные ноды.

Что если все ноды в пуле offline или перегружены (режим online)?
Ключ из этой группы в подписку не попадёт — пользователь не увидит эту строку до появления «здоровой» ноды.

Режим NO LIMIT+

💡
NO LIMIT+ — функция для тех, кто полностью перешёл на Remnawave и хочет ограничивать трафик на отдельных группах серверов. При исчерпании лимита у клиента с успешной оплатой подписки бот переключает его на безлимитный сквад, уведомляет и сбрасывает счётчик трафика. На триале без оплаты сквад и трафик не меняются. После продления или докупки GB клиент возвращается на дефолтный сквад с лимитом.
⚠️
Для NO LIMIT+ обязательно заполните remnawave_default_traffic_limit_gb на вкладке Remnawave → Настройки → Подключение (не оставляйте 0). Без лимита вебхук об исчерпании трафика не сработает.

Шаг 1 — Проверка и настройка Nginx

Убедитесь, что в конфиге Nginx на сервере бота присутствует блок для вебхука Remnawave. Откройте конфиг:

bash
nano /etc/nginx/conf.d/xuiweb.conf

Найдите или добавьте следующий блок внутри секции server { }, перед закрывающей скобкой:

nginx
location /remnawave/webhook {
    proxy_pass http://127.0.0.1:8081/remnawave/webhook;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Content-Type $content_type;
    proxy_set_header Content-Length $content_length;
    proxy_read_timeout 30s;
    proxy_connect_timeout 30s;
    proxy_send_timeout 30s;
}

Сохраните файл (Ctrl+O → Enter → Ctrl+X) и перезагрузите Nginx:

bash
nginx -t && systemctl reload nginx

Шаг 2 — Настройка вебхука в Remnawave

На сервере с Remnawave откройте файл .env:

bash
cd /opt/remnawave
nano .env

Найдите блок # Webhook configuration и выставьте следующие значения:

.env
# Webhook configuration
WEBHOOK_ENABLED=true
WEBHOOK_URL=https://бот.ваш-домен.ru/remnawave/webhook
# WEBHOOK_SECRET_HEADER уже сгенерирован при установке — не меняйте, просто скопируйте
WEBHOOK_SECRET_HEADER=<ваш_секрет_64_символа>

Не забудьте пересоздать контейнеры с новым .env:

bash
cd /opt/remnawave
docker compose up -d
docker compose logs -f -t
⚠️
Значение WEBHOOK_SECRET_HEADER по умолчанию уже есть в .env Remnawave (64 символа a-z, 0-9, A-Z) — генерировать новый не нужно. Скопируйте его из файла и вставьте в Remnawave → Настройки → Вебхуки и NO LIMIT → поле remnawave_webhook_secret.

Шаг 3 — Настройка Squad и нод в панели Remnawave

  • 1Откройте панель Remnawave и найдите ноды, которые хотите сделать безлимитными.
  • 2В настройках каждой такой ноды установите коэффициент потребления = 0. Это критически важно — только ноды с коэффициентом 0 не тратят трафик пользователя.
    ⚠️
    Без коэффициента 0 трафик будет продолжать расходоваться даже в «безлимитном» скваде.
  • 3Создайте новый внутренний сквад (Internal Squad) и добавьте в него все ноды с коэффициентом 0. При желании можно добавить хосты-заглушки и включить их в этот же сквад.
  • 4Скопируйте UUID нового сквада — он понадобится на следующем шаге.

Шаг 4 — Настройка в веб-админке бота

Откройте Remnawave → Настройки → Вебхуки и NO LIMIT:

  • 1Включите «Принимать вебхуки от Remnawave» (remnawave_webhook_enabled), если вебхук настроен на панели.
  • 2Заполните поля ниже и сохраните страницу.
remnawave_webhook_secret Скопируйте WEBHOOK_SECRET_HEADER из /opt/remnawave/.env (уже сгенерирован при установке)
remnawave_traffic_exhausted_squad_uuid UUID безлимитного сквада (из шага 3). Можно несколько UUID через запятую

Как работает логика при исчерпании трафика

Remnawave отправляет вебхук боту о том, что трафик пользователя исчерпан.
Если это триал без успешной оплаты подписки — сквад и трафик не меняются. Клиент остаётся как был. Приходит уведомление с предложением продлить подписку.
Если оплата уже была — бот сбрасывает счётчик трафика до 0 и переключает клиента на безлимитный сквад.
Оплативший клиент получает уведомление: трафик закончился, доступ переключён на безлимитные серверы.
При следующем продлении подписки (дни) или докупке GB — пользователь возвращается на дефолтный сквад с лимитом трафика.

Важные нюансы

⚠️
Уже существующие клиенты. Если включаете NO LIMIT+ на рабочей базе — обязательно сбросьте им трафик и добавьте хотя бы 1 GB через массовые операции Remnawave. Иначе вебхук об исчерпании может не сработать.
💡
Триал без оплаты. Пока у клиента нет успешной оплаты подписки, NO LIMIT+ не применяется: сквад не переключается, трафик не сбрасывается и в безлимит не переводится. Клиент остаётся в том же скваде с тем же лимитом. После первой оплаты исчерпание трафика работает как обычно.
💡
Ручные действия в веб-админке не трогают сквад.
  • Ручное продление дней учитывает NO LIMIT+ и не меняет сквад — клиент остаётся там, где был.
  • Ручные манипуляции с GB (добавить / сбросить / уменьшить) никаких действий со сквадами не делают.
Возврат на дефолтный сквад с лимитом — только при оплаченном продлении подписки или докупке GB клиентом.