Skip to content

Подключение панели

Бот работает поверх Remnawave — это единственная поддерживаемая панель. Всё общение — исходящие HTTP-вызовы к API панели плюс входящие вебхуки от неё (см. Вебхук панели). Подключение настраивается переменными окружения REMNAWAVE__* в .env.

Переменные окружения

ПеременнаяЗначение
REMNAWAVE__BASE_URLБазовый URL панели, например https://panel.example.com. Для панели в локальной/докер-сети — http://
REMNAWAVE__AUTH_TYPEСтратегия авторизации: api_key | bearer | basic | caddy. По умолчанию api_key
REMNAWAVE__TOKENAPI-ключ / bearer-токен панели
REMNAWAVE__BASIC_USER / REMNAWAVE__BASIC_PASSWORDТолько для AUTH_TYPE=basic
REMNAWAVE__CADDY_API_KEYТолько если панель за Caddy secret-key
REMNAWAVE__CF_ACCESS_CLIENT_ID / REMNAWAVE__CF_ACCESS_CLIENT_SECRETОпционально: Cloudflare Access
REMNAWAVE__SECRET_KEY_COOKIEОпционально: кука вида name:value, которую ставит nginx/Caddy
REMNAWAVE__WEBHOOK_SECRETHMAC-секрет входящих вебхуков панели
REMNAWAVE__FORCE_LOCALПусто = автоопределение «локальная/внешняя»; true/false = принудительно

Авторизация

Токен из REMNAWAVE__TOKEN отправляется сразу двумя заголовкамиX-Api-Key и Authorization: Bearer (для AUTH_TYPE=api_key и bearer поведение одинаковое). Разные деплои панели доверяют разным заголовкам, поэтому бот шлёт оба — это снимает самый частый источник «не подключается».

Ответ панели 401/403 — это ошибка авторизации: бот не ретраит её, а падает сразу с внятным сообщением. Транзиентные сбои (таймауты, 5xx) ретраятся автоматически — 4 попытки с экспоненциальным backoff от 0.5 с и джиттером.

Панель за прокси

Поддерживаются типовые схемы защиты панели, поверх основной авторизации:

  • Caddy secret-keyAUTH_TYPE=caddy + REMNAWAVE__CADDY_API_KEY: ключ уходит заголовком X-Api-Key.
  • Cloudflare Access — заполни CF_ACCESS_CLIENT_ID и CF_ACCESS_CLIENT_SECRET: заголовки CF-Access-Client-Id / CF-Access-Client-Secret добавляются к любому типу авторизации.
  • Кука от nginx/CaddyREMNAWAVE__SECRET_KEY_COOKIE=имя:значение: кука ставится на каждый запрос.

Локальная и внешняя панель

Если панель доступна по «голому» http внутри докер-сети, её trust-логика отвергнет запрос без правильных заголовков. Бот определяет локальную панель автоматически — по хосту localhost, *.local, имени докер-сервиса без точек (например remnawave) или приватному/loopback IP — и в этом случае:

X-Forwarded-Proto: https
X-Forwarded-For: 127.0.0.1
X-Real-IP: 127.0.0.1
Host: localhost

плюс отключает проверку TLS. Внешний домен — обычный https с проверкой сертификата. Автоопределение можно перебить: REMNAWAVE__FORCE_LOCAL=true или false.

Проверка версии

Минимальная поддерживаемая версия панели — 2.8.0. Бот пробит версию запросом GET /api/system/health:

  • версия известна и ниже 2.8.0 — жёсткая ошибка;
  • панель не отдаёт версию (типично для бэкенда v2 — health и stats версию не возвращают) — бот пишет предупреждение и продолжает работать, считая панель современной.

Это capability-probe, а не пин версии: по возможностям панели строится набор флагов (пример дрейфа — happ/encrypt удалён в 2.8.0), и бизнес-код проверяет флаг, а не номер версии. Статус подключения и версия видны на дашборде кабинета.

Проверка end-to-end

make smoke прогоняет против настроенной панели весь цикл: профиль подключения, авторизацию, probe версии и провижининг тестового пользователя.

Что бот делает на панели

Один panel-user на одну подписку, с постоянным short_id в имени (sub_<short_id>). Операции:

ОперацияКогда
Создание пользователяПокупка / триал / выдача подписки
Обновление (лимиты, срок, сквады)Продление, смена тарифа, досып трафика
Enable / disableАктивация, отключение (возврат, бан, истечение)
УдалениеУдаление подписки
Сброс трафикаОбнуление счётчика использования
Revoke подпискиРотация ссылки-подписки (старая перестаёт работать)
Сброс соединенийПринудительный разрыв активных подключений
HWID-устройства: список и отвязкаЭкран устройств в боте/миниаппе, см. Устройства
Internal squads: списокПродаваемые локации, зеркалятся в Серверы
Ноды: список со статусамиПериодический синк, см. Синхронизация
Онлайн-IP по нодам (ip-control)Детект шеринга, см. Device guard

Пустой список сквадов не отправляется

При обновлении пользователя пустое членство в сквадах не передаётся на панель — пустой список заменил бы набор сквадов на «ничего» и выкинул юзера со всех серверов. Пусто = «не трогать».

Дальше: Синхронизация · Вебхук панели · Авто-техрежим · Мок-панель

MIT License · сделано для тех, кто продаёт VPN, а не настраивает ботов