Работа с Remnawave
Подключение, миграция пользователей, аналитика трафика, балансировка текстовых ключей и режим NO LIMIT+.
Первичная настройка
Шаг 1 — Установка панели Remnawave
Панель можно поставить на внешнем сервере или на том же сервере, что и бот (под ботом). Сама панель в обоих случаях ставится по официальной документации:
docs.rw — Remnawave PanelПосле панели настройте reverse proxy по официальной инструкции (Caddy, Nginx, Traefik и др.):
docs.rw — Reverse ProxiesНа сервере с ботом (nginx уже есть) после установки панели запустите скрипт: SSL Let's Encrypt и прокси на Remnawave. Тот же скрипт можно использовать и на внешнем сервере вместо ручной настройки из docs.rw.
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). Все шаблоны: Полезное → сервисные шаблоны.
bot.example.com — панель на panel.example.com.
A-запись этого домена должна смотреть на сервер, где запускаете скрипт.
Шаг 2 — Подключение к боту
После установки панели откройте Remnawave → Настройки → Подключение и заполните блоки на этой вкладке:
- 1Включите переключатель «Включить Remnawave» (
remnawave_enabled). - 2В блоке «Подключение к панели»:
- 3В блоке «Новые пользователи и миграция»:
- 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_default_traffic_limit_gb (Remnawave → Настройки → Подключение). 0 = безлимит. Для NO LIMIT+ укажите лимит, не ноль.remnawave_default_traffic_limit_gb.Аналитика трафика
Перед установкой — что должно быть готово
Экспортёр использует те же параметры, что уже прописаны в /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. Откройте конфиг:
nano /etc/nginx/conf.d/xuiweb.conf
Найдите или добавьте следующий блок внутри секции server { }, перед закрывающей скобкой:
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:
nginx -t && systemctl reload nginx
Шаг 2 — Настройка вебхука в Remnawave
На сервере с Remnawave откройте файл .env:
cd /opt/remnawave nano .env
Найдите блок # Webhook configuration и выставьте следующие значения:
# Webhook configuration WEBHOOK_ENABLED=true WEBHOOK_URL=https://бот.ваш-домен.ru/remnawave/webhook # WEBHOOK_SECRET_HEADER уже сгенерирован при установке — не меняйте, просто скопируйте WEBHOOK_SECRET_HEADER=<ваш_секрет_64_символа>
Не забудьте пересоздать контейнеры с новым .env:
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). Сохраните страницу.
remnawave_traffic_exhausted_squad_uuid)
не обязательно, если вы не используете NO LIMIT+.
Шаг 4 — Установка экспортёра (сервер Remnawave)
На сервере с Remnawave выполните одну команду от root. Скрипт создаст каталог /opt/remnawave_node_exporter, скачает архив, соберёт Docker-контейнер и запустит его в сети Remnawave. Настройки читаются автоматически из /opt/remnawave/.env.
curl -fsSL https://update.3xstore.ru/remnawave_node_exporter/install2.sh | bash
Проверка логов после установки:
cd /opt/remnawave_node_exporter && docker compose logs -f
Балансировка текстовых ключей
vless://, vmess://, trojan:// и т.п.).
Когда в Remnawave у вас несколько хостов с одинаковой «логической» группой имени
(🇪🇺 Евро WIFI 1, … 2, … 3), xuiweb при каждом обновлении подписки
оставляет пользователю одну строку — 🇪🇺 Евро WIFI — и подставляет
один случайный ключ из пула, а не все три сразу.
Это не то же самое, что умная балансировка JSON для Happ/INCY: JSON-подписка (
xrayConfig) этой функцией не меняется.
Зачем это нужно
Remnawave при дублировании remark автоматически добавляет суффиксы 1, 2, 3 к имени хоста. Если у вас три ноды с одним «логическим» сервером, без балансировки клиент увидит три одинаковых кнопки в приложении. С включённой балансировкой — одну кнопку, а фактическое подключение распределяется между нодами.
- ✓Меньше шума в списке серверов у пользователя
- ✓Равномерная нагрузка между дубликатами при режиме random
- ✓Исключение offline и перегруженных нод при режиме online
Как это работает
- Пользователь обновляет подписку в клиенте → запрос идёт на SUBPAGE (
/sub/{uuid}). - xuiweb получает от Remnawave список текстовых ключей (plain links).
- Если в админке включена «Балансировка текстовых ключей», ключи группируются по «базовому» имени (см. правила ниже).
- Из каждой группы выбирается один ключ — по режиму
randomилиonline. - Имя в фрагменте ключа (
#…или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+
remnawave_default_traffic_limit_gb на вкладке Remnawave → Настройки → Подключение (не оставляйте 0). Без лимита вебхук об исчерпании трафика не сработает.Шаг 1 — Проверка и настройка Nginx
Убедитесь, что в конфиге Nginx на сервере бота присутствует блок для вебхука Remnawave. Откройте конфиг:
nano /etc/nginx/conf.d/xuiweb.conf
Найдите или добавьте следующий блок внутри секции server { }, перед закрывающей скобкой:
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:
nginx -t && systemctl reload nginx
Шаг 2 — Настройка вебхука в Remnawave
На сервере с Remnawave откройте файл .env:
cd /opt/remnawave nano .env
Найдите блок # Webhook configuration и выставьте следующие значения:
# Webhook configuration WEBHOOK_ENABLED=true WEBHOOK_URL=https://бот.ваш-домен.ru/remnawave/webhook # WEBHOOK_SECRET_HEADER уже сгенерирован при установке — не меняйте, просто скопируйте WEBHOOK_SECRET_HEADER=<ваш_секрет_64_символа>
Не забудьте пересоздать контейнеры с новым .env:
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Заполните поля ниже и сохраните страницу.
Как работает логика при исчерпании трафика
0 и переключает клиента на безлимитный сквад.Важные нюансы
- Ручное продление дней учитывает NO LIMIT+ и не меняет сквад — клиент остаётся там, где был.
- Ручные манипуляции с GB (добавить / сбросить / уменьшить) никаких действий со сквадами не делают.