Telegram Bot Webhook + VPS + Nginx + SSL: покрокове production-розгортання
Покроковий туторіал, як розгорнути Telegram bot webhook на VPS через Nginx і SSL: домен, локальний процес бота, сертифікат Let’s Encrypt, reverse proxy, реєстрація webhook і фінальна перевірка.

Висновок
У цій схемі Telegram звертається до одного публічного HTTPS-маршруту, а сам процес бота залишається приватним усередині сервера.
127.0.0.1:3000.setWebhook.getWebhookInfo.Спочатку приведіть сервер у стан, у якому нормально працюють випуск сертифіката й reverse proxy.
Спрямуйте домен на публічну IP-адресу VPS
Створіть A-запис для хоста, який використовуватимете для webhook, наприклад bot.example.com.
Запустіть бота на localhost
Прив’яжіть застосунок бота до 127.0.0.1:<port>. Не відкривайте сам бот напряму на публічному інтерфейсі.
Залиште публічний край простим
Пропускайте публічний трафік тільки через Nginx. Застосунок бота має обробляти updates, а не TLS, редіректи чи публічну маршрутизацію.
Початковий стан
DNS має резолвитись на VPS, бот має слухати локально, а порти 80 і 443 мають бути доступні.
Випустіть сертифікат до того, як переведете webhook на фінальний HTTPS-маршрут.
Встановіть Certbot
Використовуйте офіційну інтеграцію для Nginx, щоб випуск і renewal працювали за документованим сценарієм [7].
Отримайте сертифікат для webhook-хоста
Запитуйте сертифікат саме для того домену, який реєструватимете в Telegram.
Переходьте на DNS-01 тільки коли HTTP-01 недоступний
Використовуйте DNS-01, коли не можна задіяти порт 80 або коли потрібен wildcard-сертифікат [9].
Результат
На сервері вже є валідний сертифікат для webhook-домену, і можна переходити до фінальної HTTPS-конфігурації Nginx.
Зробіть один HTTP server block для редіректу і один HTTPS server block для фінального reverse proxy. До локального процесу бота проксіюйте лише webhook-шлях [4][5][6].
Використовуйте конфіг такого типу:
server {
listen 80;
listen [::]:80;
server_name bot.example.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name bot.example.com;
ssl_certificate /etc/letsencrypt/live/bot.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/bot.example.com/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
client_max_body_size 20m;
location = /healthz {
add_header Content-Type text/plain;
return 200 "ok\n";
}
location /telegram/webhook {
proxy_pass http://127.0.0.1:3000/telegram/webhook;
proxy_http_version 1.1;
proxy_connect_timeout 5s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
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;
}
location / {
return 404;
}
}Після збереження конфігурації перезавантажте Nginx. Сам бот лишається приватним на 127.0.0.1, а Telegram бачить тільки HTTPS-маршрут, який публікує Nginx.
Що робить цей конфіг
HTTP переводить на HTTPS, HTTPS завершує TLS, а до процесу бота доходить лише webhook-шлях.
Реєструйте фінальну публічну HTTPS-адресу лише після того, як Nginx і SSL уже працюють. Передайте secret_token і перевіряйте його в застосунку через заголовок X-Telegram-Bot-Api-Secret-Token [1].
Зареєструйте webhook:
curl -X POST "https://api.telegram.org/bot$BOT_TOKEN/setWebhook" -d "url=https://bot.example.com/telegram/webhook" -d "secret_token=replace_with_a_long_random_value" -d 'allowed_updates=["message","callback_query"]'Після цього перевірте стан:
curl "https://api.telegram.org/bot$BOT_TOKEN/getWebhookInfo"Через allowed_updates обмежте доставку лише тими типами оновлень, які бот реально обробляє. Якщо доставка зламалась, читайте pending_update_count і останню помилку в getWebhookInfo [1].
Правило реєстрації
Реєструйте webhook тільки після того, як HTTPS endpoint уже реально доступний і валідний.
Після реєстрації webhook пройдіться цим списком перевірок.
Домен резолвиться на публічну IP-адресу VPS
Перевірте саме той hostname, який ви передали в setWebhook.
Бот слухає тільки localhost
Тримайте процес на 127.0.0.1:<port>.
Порти 80 і 443 відкриті
Перевірте і локальні firewall-правила, і мережеві правила на боці провайдера [10].
Nginx проксіює лише webhook-шлях
Не робіть надто широких публічних proxy-правил на весь застосунок.
Застосунок перевіряє secret token header
Відхиляйте запити, у яких токен не збігається з налаштованим [1].
Telegram бачить webhook без помилок
Після перших live-запитів перевірте getWebhookInfo [1].
Ціль розгортання
Стабільне розгортання має валідний сертифікат, один публічний HTTPS-маршрут і приватний процес бота.
Більшість проблем із webhook виникає через кілька повторюваних помилок.
Запускати бот на 0.0.0.0 і відкривати його напряму в інтернет.
Реєструвати webhook до того, як HTTPS endpoint став доступним.
Приймати будь-який POST на webhook-маршрут без перевірки secret token [1].
Робити повільну синхронну обробку прямо всередині webhook-запиту замість швидкого підтвердження.
Забувати, що getUpdates не працює, поки активний webhook [1].
Спільний патерн
Проблеми тут майже завжди виникають через неправильну публікацію, неправильну послідовність дій або відсутність перевірки запиту.
Потрібен публічний HTTPS endpoint, до якого Telegram може стабільно достукатися. VPS — найпростіший спосіб тримати в одному місці домен, Nginx, випуск сертифікатів і firewall-правила.
Ні. Поки webhook активний, Telegram вимикає `getUpdates` для цього бота.
Telegram документує підтримку портів 443, 80, 88 і 8443. У більшості production-сценаріїв публічною HTTPS-точкою входу має бути 443.
Так застосунок не потрапляє під публічну мережеву поверхню. Nginx приймає зовнішній HTTPS-трафік, а бот бачить тільки внутрішні proxy-запити.
Спочатку перевірте публічний HTTPS-маршрут, потім запустіть `getWebhookInfo` і прочитайте останню помилку та `pending_update_count`.
Ці джерела підтверджують поведінку Telegram webhook, схему Nginx reverse proxy, логіку SSL і firewall-налаштування, використані в цьому туторіалі.
PAS7 Studio допомагає розгортати Telegram-ботів із нормальним webhook-routing, reverse proxy, автоматичним оновленням сертифікатів, керуванням процесом застосунку, міграцією з polling і production-hardening усього стеку.
Пов'язані статті
AI SEO / GEO у 2026: ваші наступні клієнти — не люди, а агенти
Пошук зміщується від кліків до відповідей. Боти та AI-агенти сканують, цитують, рекомендують і дедалі частіше купують. Дізнайтесь, що таке AI SEO / GEO, чому класичного SEO вже недостатньо, і як PAS7 Studio допомагає брендам перемагати у «агентному» вебі.
Найпотужніший чіп від Apple? M5 Pro і M5 Max б'ють рекорди
Аналітичний розбір Apple M5 Pro і M5 Max станом на березень 2026 року. Пояснюємо, чому ці чіпи можна вважати найпотужнішими професійними ноутбучними SoC від Apple, як вони виглядають на тлі M4 Pro, M4 Max, M1 Pro, M1 Max і що показують у порівнянні з актуальними Intel та AMD.
Artemis II і код, який веде до Місяця
У цьому блозі розбираємо місію NASA Artemis II, яка стартувала 1 квітня 2026 року, і пояснюємо, що вона насправді говорить про сучасну інженерію: бортове ПЗ, резервні контури, симуляції, телеметрію, людський контроль і дуже обережну роль ШІ в космічній сфері.
Автоматичне тегування та пошук збережених посилань
Інтеграція з GDrive/S3/Notion для автоматичного тегування та швидкого пошуку через пошукові API
Професійна розробка для вашого бізнесу
Створюємо сучасні веб-рішення та боти для бізнесу. Дізнайтеся, як ми можемо допомогти вам досягти цілей.