Перейти к содержимому

Вебхуки и reverse-proxy

ЮKassa, CryptoBot, Platega, Heleket и Tribute сообщают об оплате вебхуком — запросом на ваш сервер. Туда же панель Remnawave шлёт свои события. Бот принимает их на порту 8080 внутри контейнера (порт меняется в Система → 🔗 Вебхуки → 🔌 Порт бота).

Путь Для чего
/webhook/yookassa ЮKassa
/webhook/cryptobot CryptoBot
/webhook/platega Platega
/webhook/heleket Heleket
/webhook/tribute Tribute
/webhook/remnawave события панели
/healthz проверка «жив ли бот»

В боте это экран Система → 🔗 Вебхуки. Вариантов два.

A. За прокси панели — если бот стоит на одном сервере с панелью. Порты 80/443 уже заняты прокси панели (Caddy/nginx), встроенный HTTPS не нужен. Кнопка 📋 Инструкция выдаст готовый блок для Caddy или nginx: он направляет /webhook/ на remnabot:8080. Добавьте его в конфиг прокси и перезапустите прокси. Затем задайте 🔗 Базовый URL — например, https://panel.example.com.

B. Встроенный HTTPS — если бот на отдельном сервере и порты 80/443 свободны. Бот сам получит сертификат Let’s Encrypt.

  1. Направьте домен A-записью на сервер бота (например, bot.example.com).
  2. 🌐 Публичный HTTPS → 🔗 Домен → 🚀 Применить. Бот откроет порты 80/443 и перезапустится; сертификат выпустится при первом запросе.

Если порты заняты, бот не применит настройку и предложит вариант A.

Когда домен или базовый URL задан, на экране 🔗 Вебхуки появятся готовые адреса. Их нужно вписать в кабинет провайдера:

  • ЮKassa: https://ВАШ_ДОМЕН/webhook/yookassa
  • CryptoBot: https://ВАШ_ДОМЕН/webhook/cryptobot
  • Platega: https://ВАШ_ДОМЕН/webhook/platega
  • Tribute: https://ВАШ_ДОМЕН/webhook/tribute — подробно в Tribute
  • Heleket: вписывать не нужно — бот сам передаёт адрес https://ВАШ_ДОМЕН/webhook/heleket в каждом счёте

Вебхуку на слово бот не верит. Оплату ЮKassa и Platega он перепроверяет запросом к провайдеру, у CryptoBot, Heleket и Tribute сверяет подпись. Поддельный запрос подписку не выдаст.

Если вебхук не дошёл, бот сам периодически перепроверяет неоплаченные счета ЮKassa, CryptoBot, Platega и Heleket и довыдаёт подписку. Tribute сам повторяет доставку. Но вебхук всё равно стоит настроить: с ним подписка выдаётся сразу.

Нужен для уведомлений пользователям: «подписка скоро истечёт», «подписка истекла», «трафик исчерпан», «доступ приостановлен/восстановлен», а также для отчётов торрент-блокера.

  1. В .env панели Remnawave:
    WEBHOOK_ENABLED=true
    WEBHOOK_URL=https://ВАШ_ДОМЕН/webhook/remnawave
    WEBHOOK_SECRET_HEADER=длинная-случайная-строка
  2. Ту же строку впишите в боте: Система → 🔗 Вебхуки → 🔑 Секрет панели. Без секрета отчёты торрент-блокера не принимаются.
  3. На панели 2.8.0 и новее для напоминаний об окончании включите ещё EXPIRATION_NOTIFICATIONS_ENABLED=true.

Reverse-proxy и безопасность (рекомендации для прода)

Заголовок раздела «Reverse-proxy и безопасность (рекомендации для прода)»

Для продакшена, особенно с мини-аппом и кабинетом, лучше поставить перед ботом свой reverse-proxy (Caddy / nginx) или Cloudflare, а не выставлять бота в интернет напрямую. Советы:

  • Wildcard-сертификат *.ваш-домен на прокси. Сертификат на конкретный хост попадает в публичные логи (crt.sh) — по ним кабинет легко найти.
  • Бот без root. За прокси боту не нужны порты 80/443 — держите его на 127.0.0.1:8080.
  • Фаервол. Наружу только 80/443. За Cloudflare пускайте на сервер только его адреса — так реальный IP не виден сканерам.
  • fail2ban / CrowdSec на прокси против перебора паролей и сканирования. У кабинета есть и свой лимит: 15 попыток входа за 5 минут с одного адреса.
  • Разные домены для кабинета, панели и страницы подписки.
  • CAA-запись в DNS, чтобы сертификат на ваш домен мог выпустить только ваш центр сертификации.

Пример nginx для кабинета на отдельном поддомене (бот на 127.0.0.1:8080):

server {
listen 443 ssl;
server_name cab.example.com;
ssl_certificate /etc/ssl/wildcard.pem;
ssl_certificate_key /etc/ssl/wildcard.key;
# Чек об оплате — до 12 МБ; по умолчанию nginx пускает только 1 МБ.
client_max_body_size 16m;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme; # обязательно
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
# Медленная загрузка чека с телефона не должна обрываться.
proxy_request_buffering off;
proxy_read_timeout 120s;
proxy_send_timeout 120s;
}
}

Если отдать боту весь домен (location /) нельзя, проксируйте на тот же порт отдельные пути: /webhook/, /miniapp/, /api/, путь кабинета (по умолчанию /cabinet/), /flags/ и /brand/ (логотип).

Для входа в кабинет через Telegram укажите домен кабинета у @BotFather командой /setdomain.