Вебхук для Telegram-бота на Node.js: HTTPS, nginx и secret_token
Как настроить вебхук Telegram-бота на Node.js: требования к HTTPS и портам, nginx, secret_token, setWebhook, локальная отладка и почему бот не отвечает.
Вебхук для Telegram-бота на Node.js: HTTPS, nginx и secret_token
26 Сентября, 2026 Автор: Максим МВебхук для Telegram-бота на Node.js: HTTPS, nginx, secret_token и отладка
Разбираемся, как перевести Telegram-бота на вебхук: требования Telegram, настройка сервера и сертификата, защита секретным токеном и типичные ошибки, из-за которых бот молчит.
Пока бот живёт на ноутбуке разработчика, long polling удобен: процесс сам забирает обновления у Telegram, не нужны ни домен, ни сертификат. Но в продакшене у polling есть минусы: процесс должен работать постоянно, его сложно масштабировать на несколько экземпляров, а в serverless он не работает вовсе. Вебхук решает это: Telegram сам присылает каждое обновление POST-запросом на ваш адрес. Разберём, как настроить вебхук для Telegram-бота на Node.js от начала до конца.
Что нужно для вебхука
- Публичный HTTPS-адрес. Telegram отправляет обновления только по HTTPS с валидным сертификатом. Подойдёт бесплатный сертификат Let's Encrypt.
- Поддерживаемый порт. Telegram принимает вебхуки на портах 443, 80, 88 и 8443. На практике используют 443, а приложение слушает внутренний порт за прокси.
- Токен бота от @BotFather.
- Секретный токен вебхука — строка, по которой вы отличите запросы Telegram от поддельных. Про неё ниже.
Шаг 1. Сертификат и nginx
Классическая схема: nginx принимает HTTPS на 443 порту и проксирует запросы в Node.js-приложение на локальном порту 3000. Сертификат удобно выпустить через acme.sh или certbot. Минимальная конфигурация nginx:
server {
listen 443 ssl;
server_name bot.example.ru;
ssl_certificate /etc/ssl/certs/bot.example.ru.crt;
ssl_certificate_key /etc/ssl/private/bot.example.ru.key;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Пошагово — выпуск сертификата, автопродление, запуск через pm2 — в руководстве по развёртыванию.
Шаг 2. Секретный токен: зачем он нужен
Адрес вебхука — не секрет: он может попасть в логи, в репозиторий, в скриншот. Без проверки
любой, кто его знает, сможет отправить боту поддельное обновление «от имени» любого
пользователя. Поэтому при установке вебхука Telegram позволяет задать
secret_token — тогда в каждом запросе приходит заголовок
X-Telegram-Bot-Api-Secret-Token с этим значением. Сервер должен сверять его и
отклонять запросы без правильного заголовка.
Сгенерируйте случайный секрет:
node -e "console.log(require('crypto').randomBytes(24).toString('base64url'))"
Шаг 3. Бот на Node.js
Приём вебхука, проверку секретного заголовка и отправку ответов берёт на себя адаптер Telegram
во фреймворке
umbot. В .env проекта:
TELEGRAM_TOKEN=123456:ABC-DEF...
TELEGRAM_WEBHOOK_SECRET=сгенерированный_секрет
Код бота:
import { Bot, FALLBACK_COMMAND } from 'umbot';
import { TelegramAdapter } from 'umbot/plugins';
process.loadEnvFile(); // загружает .env в process.env (встроено в Node.js 20.12+)
const bot = new Bot()
.use(new TelegramAdapter(process.env.TELEGRAM_TOKEN))
.setAppConfig({
isLocalStorage: true,
tokens: {
// запросы без правильного заголовка получат 401 до выполнения логики
telegram: { webhookSecret: process.env.TELEGRAM_WEBHOOK_SECRET },
},
});
bot.addCommand('start', ['/start', 'привет'], (_, bc) => {
bc.text = 'Привет! Бот работает через вебхук.';
bc.buttons.addBtn('Помощь');
});
bot.addCommand(FALLBACK_COMMAND, [], (userCommand, bc) => {
bc.text = `Вы написали: ${userCommand}`;
});
bot.start('127.0.0.1', 3000); // снаружи доступен только через nginx
Сборка и запуск: npm run build, затем pm2 start dist/index.js — чтобы
процесс перезапускался после падения и перезагрузки сервера. Если у вас уже есть сервер на
Express или Fastify, отдельный порт не нужен: бот подключается к существующему маршруту через
bot.webhookHandle(req, res).
Шаг 4. Регистрация вебхука в Telegram
Вебхук устанавливается методом setWebhook. Секрет — тот же, что в
.env:
curl "https://api.telegram.org/bot<ТОКЕН>/setWebhook" \
-d "url=https://bot.example.ru/" \
-d "secret_token=<СЕКРЕТ>"
Проверить состояние — методом getWebhookInfo: он показывает текущий адрес,
количество неотправленных обновлений и последнюю ошибку доставки.
curl "https://api.telegram.org/bot<ТОКЕН>/getWebhookInfo"
Обратите внимание: пока вебхук установлен, long polling не работает — Telegram не отдаёт
обновления через getUpdates. Чтобы вернуться к polling (например, для локальной
отладки), удалите вебхук методом deleteWebhook.
Как отлаживать вебхук локально
Поднимать сервер ради каждой правки не нужно. Два способа:
-
Туннель.
ngrok http 3000или cloudflared выдаёт временный HTTPS-адрес, который пробрасывает запросы на ваш компьютер. Установите его вебхуком — и Telegram будет присылать обновления прямо в локальный процесс. -
Без сети. Логику бота можно проверять вовсе без Telegram: в umbot класс
BotTestзапускает диалог в консоли и прогоняет автотесты, не отправляя запросы в API. Подробно — в статье про тестирование без публикации.
Типичные ошибки: почему бот молчит
| Симптом | Причина | Что сделать |
|---|---|---|
| В getWebhookInfo ошибка SSL | Самоподписанный сертификат или неполная цепочка | Используйте fullchain-сертификат (Let's Encrypt) |
| Все запросы получают 401 | Секрет в setWebhook и в приложении не совпадает | Переустановите вебхук с тем же секретом, что в .env |
| Копятся неотправленные обновления | Приложение не запущено или nginx не проксирует на нужный порт | Проверьте процесс (pm2) и proxy_pass |
| Бот отвечает с большой задержкой или дублями | Сервер отвечает слишком долго, Telegram повторяет доставку | Отвечайте быстро, тяжёлую работу выносите в фон |
| Polling перестал работать | Установлен вебхук | Вызовите deleteWebhook |
Вебхук без своего сервера
Если сервер держать не хочется, вебхук можно направить в облачную функцию: код выполняется только в момент обновления, а оплата идёт за вызовы. Для этого сценария важно хранить состояние пользователей во внешней базе данных — у функций нет постоянной файловой системы и памяти между вызовами. Как это устроено на примере Yandex Cloud Functions — в статье про serverless-навык.
Частые вопросы
Что лучше: вебхук или long polling? Для продакшена — вебхук: не нужен постоянно работающий опрос, проще масштабировать, работает в serverless. Для локальной разработки и небольших ботов на одном процессе polling проще.
Можно ли повесить несколько ботов на один сервер? Да: у каждого бота свой адрес или путь вебхука. В umbot одно приложение может принимать и Telegram, и другие платформы — Алису, VK, MAX — по одному адресу.
Обязателен ли secret_token? Технически нет, но без него любой, кто узнал адрес вебхука, может подделывать сообщения. Для продакшена — обязателен.
Куда дальше
- Telegraf или grammY — что выбрать — сравнение библиотек для Telegram-ботов.
- Конфигурация и безопасность umbot — токены, .env и проверка подписи вебхуков.
- Разработка и сопровождение ботов — если нужен бот с настроенной инфраструктурой под ключ.
Рекомендую к прочтению следующие статьи:
Спецпроекты с Алисой: возможности для бизнеса и разработчиков – на Conversations V
21 и 22 июня в Санкт-Петербурге — живьем и онлайн! — пройдет Conversations V, конференция по разговорному AI для бизнеса и разработчиков!
Читать статью
Первое фото коробки колонки «Яндекс.Станция Макс»
В сеть утекло изображение упаковочной коробки «Яндекс.Станции Макс» — новой умной колонки от компании «Яндекс».
Читать статью
Алиса появилась в умных колонках JBL – обычной и переносной
Алиса появилась в умных колонках – стационарной JBL Link Music и портативной JBL Link Portable. Обе модели отличаются фирменным объёмным звуком JBL и подойдут всем любителям музыки.
Читать статью
Алиса научилась читать статьи на сайтах
Как часто бывает так, что вышла какая-то интересная статья, но не очень хочется или просто нет времени её прочитать? Не беда, теперь Алиса Сможет прочитать эту статью.
Читать статью
Алиса поможет заправляться, не выходя из машины
С помощью Алисы в Навигаторе теперь можно не только построить маршрут до нужной АЗС, но и оплатить топливо в Яндекс.Заправках.
Читать статью
Комментарии
Оставить комментарий
Как со мной связаться?
Свяжитесь со мной по любому поводу!
Я с радостью отвечу на все вопросы!
Телефон:
+7(909) 281 35-20Почта:
maximco36895@yandex.ruДополнительная почта:
info@maxim-m.ruЯ в социальных сетях: