Skip to main content

Обзор

Бот управляет VPN подписками через API панели Remnawave. Все операции с пользователями, серверами и трафиком проходят через единый API клиент.

Поддерживаемые версии панели

Обновление на Remnawave 3.0.0

Ломающее изменение в боте v4.0.0. В Remnawave 3.0.0 у пользователей панели больше нет прежних UUID — идентичность стала числовой. Бот перешёл на неё целиком: клиент API, сервисный слой, хендлеры, миддлвари, Web API и кабинет.
Что нужно сделать при обновлении:
1

Обновите панель до 3.0.0

Бот версии v4.0.0 и новее работает с числовой идентичностью. Обновляйте панель и бота согласованно.
2

Перепишите TRAFFIC_EXCLUDED_USER_UUIDS

Переменная переименована в TRAFFIC_EXCLUDED_USER_IDS, и формат значений изменился: вместо UUID нужны числовые id панельных пользователей. Автоматически сконвертировать нельзя — прежних UUID в панели уже не существует. Возьмите id заново из панели.
3

Дождитесь бэкфила

При первом старте бот проставляет числовые remnawave_id существующим подпискам, сверяясь с панелью. Прогон идёт батчами и переживает перезапуск — вручную ничего запускать не нужно.
Бэкфил устроен консервативно: подписка без надёжного соответствия в панели остаётся без remnawave_id и попадает в лог, а не привязывается наугад. Такие подписки синхронизируются после того, как соответствие появится.

Совместимость с Remnawave 2.7.0

Начиная с версии 2.7.0 панели поддерживаются:
  • MONTH_ROLLING — стратегия сброса трафика с помесячным скользящим окном
  • Per-inbound метрики — разбивка трафика по отдельным inbound в реальном времени
  • Обновлённая модель данных нод — вложенные объекты versions / system вместо плоских полей
  • Webhook torrent_blocker.report — событие при обнаружении торрент-трафика
  • Webhook subpage_config_changed — автоматическая инвалидация кэша конфигурации приложения при изменении подстраницы

Настройка подключения

Если бот и панель на одном сервере в Docker, используйте внутренний адрес: REMNAWAVE_API_URL=http://remnawave:3000

Защита панели

Для панелей, защищённых через remnawave-reverse-proxy:

Методы авторизации

Автосинхронизация

Бот синхронизирует данные с панелью:
  • При старте бота — полная синхронизация
  • По расписанию — в указанное время
  • По команде — через админ-панель
Синхронизируются:
  • Серверы (сквады) и их статус
  • Пользователи — сопоставление Telegram ID с аккаунтами панели
  • Подписки — актуальные даты и параметры

Двунаправленная синхронизация end_date

Панель является авторитетным источником для end_date на активных подписках. Как webhook-событие user.modified, так и пакетная синхронизация обновляют end_date в обоих направлениях — вперёд и назад. Ранее принимались только обновления «вперёд» (дата в панели > локальная дата). Теперь изменения, сделанные администратором в панели (например, сокращение подписки), корректно передаются в бота.
60-секундная защита между webhook-событием и пакетной синхронизацией по-прежнему предотвращает конфликты.

Синхронизация в мультитарифном режиме

При MULTI_TARIFF_ENABLED=true каждая подписка получает собственного пользователя в панели (user_{telegram_id}_{short_id}). Синхронизация работает по remnawave_uuid на уровне подписки, а не пользователя.
  • Panel → Bot: создание подписок для новых пользователей панели
  • Bot → Panel: matching по суффиксу _short_id в username
  • Email/OAuth: синхронизация всех пользователей панели для email
  • Автопривязка: legacy user-level UUID автоматически привязывается к подписке при миграции

Webhooks от панели (real-time события)

Для мгновенной реакции на события подписок вместо периодической синхронизации.

Настройка

1. Переменные окружения:
Сгенерируйте секрет: openssl rand -hex 32
Усиление безопасности webhook-верификации. Все платёжные провайдеры переведены на fail-closed модель: CryptoBot, Heleket и Tribute отклоняют запросы при отсутствии API-ключа. Для сравнения подписей используется hmac.compare_digest (timing-safe). CloudPayments отклоняет запросы при отсутствии заголовка подписи.
2. В панели Remnawave:
  • URL: https://hooks.domain.com/remnawave-webhook
  • Secret: тот же, что в REMNAWAVE_WEBHOOK_SECRET
3. Проверка:

Поддерживаемые события

При включённых webhooks бот защищает подписки от перезаписи данными из периодической синхронизации в течение 60 секунд после получения события.

Уведомления пользователям

При получении webhook-событий бот может отправлять уведомления пользователям в Telegram (или по email для email-only пользователей).

Главный переключатель

Если false — ни одно пользовательское уведомление не отправляется, даже если отдельные типы включены.

Настройка по типам

Каждый тип уведомления можно включить или выключить отдельно. Все по умолчанию включены.

Примеры сообщений

Подписка истекает завтра:
Лимит трафика исчерпан:
Первое подключение:

Тихие события

Некоторые webhook-события обрабатываются без уведомления пользователю:
Все переменные WEBHOOK_NOTIFY_* можно менять без перезапуска бота через админ-панель (Настройки).

Мониторинг серверов

Бот отправляет уведомления администраторам при:
  • Падении сервера (недоступен)
  • Высокой нагрузке CPU/RAM
  • Аномальном трафике
  • Восстановлении после падения

GeoCheck нод

Проверка географии выхода ноды прямо из админки кабинета (v4.1.0). Кнопка в карточке ноды открывает модалку: выбор маршрута (по умолчанию / конкретный IP / интерфейс), ожидание результата, затем отчёт картинкой или тем же отчётом в JSON. Есть копирование JSON, скачивание SVG, повтор проверки и полноэкранный режим.
Требуется Remnawave Panel и Node 3.3.0+. Кнопка показывается только для подключённых нод подходящей версии — на старых нодах её просто нет.Проверка асинхронная: постановка задачи возвращает job_id, результат опрашивается отдельно. Нода может отвечать до минуты.

Имена пользователей в панели

Шаблон имени задаётся REMNAWAVE_USER_USERNAME_TEMPLATE (по умолчанию user_{telegram_id}).
Начиная с v3.66.0 кириллица в подставляемых значениях транслитерируется — панель не принимает не-ASCII в имени пользователя, и раньше такие пользователи не создавались.
Remnawave 2.8.0 удалил серверную генерацию crypt-ссылок (/api/system/tools/happ/encrypt). Начиная с v3.63.0 бот шифрует ссылки локально публичным RSA-ключом Happ — так же, как это делает subpage панели (happ://crypt4/...). Официальный Happ API (crypto.happ.suhapp://crypt5/...) остаётся запасным путём.
Выключатели нужны на крайний случай. HAPP_CRYPTOLINK_LOCAL_ENCRYPTION_ENABLED=false — если Happ ротирует ключ и до обновления бота ссылки нужно гнать через API. HAPP_CRYPTOLINK_API_FALLBACK_ENABLED=false — если обращения к внешнему сервису недопустимы; тогда crypt-ссылки останутся только у тех пользователей, у кого они уже сохранены в базе.