Подключение панели
Бот работает поверх 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__TOKEN | API-ключ / 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_SECRET | HMAC-секрет входящих вебхуков панели |
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-key —
AUTH_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/Caddy —
REMNAWAVE__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 |
Пустой список сквадов не отправляется
При обновлении пользователя пустое членство в сквадах не передаётся на панель — пустой список заменил бы набор сквадов на «ничего» и выкинул юзера со всех серверов. Пусто = «не трогать».
Дальше: Синхронизация · Вебхук панели · Авто-техрежим · Мок-панель
