API
WebAPI бота, 30 вебхуков Remnawave, bulk-операции.
11.1 WebAPI бота (порт 8080)
Включение: WEB_API_ENABLED=true, WEB_API_PORT=8080, WEB_API_ALLOWED_ORIGINS=* (или конкретные), WEB_API_TOKEN=/WEB_API_DEFAULT_TOKEN= (6–20 символов)
пруф.
Проверка: {"status":"ok","api_version":"1.0.0","bot_version":"…","features":{"monitoring":true,…}}
пруф. «Метод Not Allowed» без ключа — норм
пруф.
Публикация через reverse-proxy: nginx/caddy/traefik, скрывать /docs /redoc /openapi.json в проде, WEB_API_REQUEST_LOGGING отключить, ограничить по IP/VPN
пруф.
REST-эндпоинты: /promo-offers (GET/POST/{id}/logs/templates), /pages (CRUD политика/оферта/FAQ/правил), /broadcasts, /api/system/stats, /api/bandwidth-stats/nodes/{uuid}/users/legacy (Remna 2.4+), /menu-layout (GET список JSON, PATCH /menu-layout/buttons/{button_id} raw JSON)
пруф.
Пагинация ?limit=/offset, токен Bearer Authorization: Bearer <WEB_API_TOKEN>
пруф.
11.2 Webhooks Remnawave → Bedolaga (30 событий, v3.10.0, 10.02.2026)
- В боте:
REMNAWAVE_WEBHOOK_ENABLED=true,REMNAWAVE_WEBHOOK_PATH=/remnawave-webhook,REMNAWAVE_WEBHOOK_SECRET=<openssl rand -hex 32>(мин 32, реально 64 символа). - В панели .env:
WEBHOOK_URL=https://hooks.domen.ru/remnawave-webhook,WEBHOOK_SECRET_HEADER=<тот же секрет>(exact 64, только a-z 0-9 A-Z) пруф. - События (30): user.expired/.disabled/.enabled/.limited/.traffic_reset/.modified/.deleted/.revoked/.created/.first_connected/.bandwidth_usage_threshold_reached/.not_connected/.expired_24_hours_ago; user_hwid_devices.added/.deleted; node.created/.modified/.disabled/.enabled/.deleted/.connection_lost/.connection_restored/.traffic_notify; service.panel_started/.login_attempt_failed/.login_attempt_success/.subpage_config_changed; crm.infra_billing_node_payment_in_7_days/.in_48hrs/.in_24hrs/.due_tod… пруф
- Ивенты задаются в панели .env (WEBHOOK_EVENTS=user.expired,…) пруф.
- Порядок запуска: сначала бот+прокси, потом панель (иначе после 3 неудачных попыток вебхук вырубается) пруф.
- Проверка:
curl -s https://hooks.domain.com/remnawave-webhook | jq→{"status":"ok","service":"remnawave_webhook","enabled":true}пруф. - «У ремны есть три попытки достучаться до вебхука, если не получилось — больше не пытается и не срёт ошибками» пруф.
11.3 Единый webhook-сервер Bedolaga (v2.6.0, 07.11.2025)
FastAPI на порту 8080 для всех компонентов (Telegram webhook + платёжные колбэки + админ API + мини-приложение)
пруф. Режимы: BOT_RUN_MODE=webhook|polling|both. Минимальный .env:
BOT_TOKEN=
ADMIN_IDS=
BOT_RUN_MODE=webhook
WEBHOOK_URL=https://hooks.domain.com
WEBHOOK_PATH=/webhook
WEBHOOK_SECRET_TOKEN=super-secret-token
WEB_API_ENABLED=true
WEB_API_PORT=8080Платёжки ходят по разным путям: /tribute-webhook, /yookassa-webhook, /cryptobot-webhook, /mulenpay-webhook, /pal24-webhook, /wata-webhook, /heleket-webhook, /platega-webhook, /overpay-webhook, /freekassa-webhook, /cloudpayments-webhook, /rollypay-webhook, /urlpay-webhook, /remnawave-webhook пруф. Ручная переустановка вебхука (после переезда/переноса):
https://api.telegram.org/bot<TOKEN>/setwebhook?url=https://<ДОМЕН>/webhook&ip_address=<АЙПИ>&secret_token=<СЕКРЕТ>(ТГ кэширует айпи вебхуков старого сервера до 3 дней) пруф. WEBHOOK_MAX_QUEUE_SIZE=1024, WEBHOOK_WORKERS=4 — дефолт; при массовых активациях промокодов поднять х4-х8 пруф.
11.4 Bulk-операции через Remnawave REST API
Массовая смена fingerprint (legiz, 25.05.2026, пруф) — PATCH /api/hosts:
API_URL="https://YOUR_PANEL_URL"
TOKEN="YOUR_TOKEN"
NEW_FP="firefox" # chrome | firefox | safari | ios | android | edge | qq | random | randomized
UUIDS=$(curl -s -X GET "$API_URL/api/hosts" \
-H "Authorization: Bearer $TOKEN" \
| python3 -c "import sys,json; [print(h['uuid']) for h in json.load(sys.stdin)['response']]")
for UUID in $UUIDS; do
curl -s -X PATCH "$API_URL/api/hosts" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"uuid\": \"$UUID\", \"fingerprint\": \"$NEW_FP\"}"
donePowerShell-версия (fp только у хостов с chrome):
$API_URL = "https://YOUR_PANEL_URL"; $TOKEN = "YOUR_TOKEN"
$OLD_FP = "chrome"; $NEW_FP = "firefox"
$headers = @{ "Authorization" = "Bearer $TOKEN"; "Content-Type" = "application/json" }
$hosts = (Invoke-RestMethod -Uri "$API_URL/api/hosts" -Method GET -Headers $headers).response
$targets = $hosts | Where-Object { $_.fingerprint -eq $OLD_FP }
foreach ($h in $targets) {
$body = @{ uuid = $h.uuid; fingerprint = $NEW_FP } | ConvertTo-Json
Invoke-RestMethod -Uri "$API_URL/api/hosts" -Method PATCH -Headers $headers -Body $body | Out-Null
}Тем же патчем можно менять sni, alpn, allowInsecure, port, path и др. пруф. Тот же патч — присвоение хоста к ноде:
curl -X PATCH "$REMNA_API_BASE_URL/api/hosts" \
-H "Authorization: Bearer $REMNA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"uuid":"<host-uuid>","nodes":["<node-uuid>"]}'пруф.
Перевыпуск подписок при смене домена саб-ссылки: в ремне массовые действия → «отозвать подписку» = POST /api/users/bulk/revoke-subscription
пруф.
11.5 Патчи/PR, на которые ссылаются
- Xray-core PR 6258 (
injectHosts{"tagPrefix":"proxy"}) пруф. - Xray-core PR 6181 (possible fp-related) пруф.
- Xray-core PR 5414 (доп. правки) пруф.
- Xray-core discussions 4113 (полная документация xhttp) пруф.
- Xray-core PR 6307 (слеши) пруф.
- Xray-core issue 6264 (детект по UUID) пруф.
- aiogram PR 1761 (Bot API 9.4, цветные кнопки) пруф.
- Bedolaga PR 2847 (WEBHOOK_TORRENT_DETECTED) пруф.
- Bedolaga PR 3066–3070, cabinet PR 492–493, 551 пруф.
- Bedolaga PR 2655 (ИИ-поддержка, промпт) пруф.