PAS7 Studio
До всіх статей

Telegram Bot Webhook + VPS + Nginx + SSL: покрокове production-розгортання

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

08 квіт. 2026 р.· 6 хв читання· Туторіал
Кому підійдеBackend engineersDevOps engineersФаундери, які розгортають внутрішніх ботівКоманди, що переходять із polling на webhookРозробники, які запускають Telegram-ботів на VPS
Розгортання Telegram bot webhook на VPS через Nginx reverse proxy та SSL-сертифікат

У цій схемі Telegram звертається до одного публічного HTTPS-маршруту, а сам процес бота залишається приватним усередині сервера.

Спрямуйте домен на VPS.
Запустіть бота на локальному порту, наприклад 127.0.0.1:3000.
Поставте Nginx як публічний reverse proxy.
Випустіть валідний SSL-сертифікат через Let’s Encrypt.
Зареєструйте webhook у Telegram через setWebhook.
Перевірте доставку через getWebhookInfo.

Спочатку приведіть сервер у стан, у якому нормально працюють випуск сертифіката й reverse proxy.

01

Спрямуйте домен на публічну IP-адресу VPS

Створіть A-запис для хоста, який використовуватимете для webhook, наприклад bot.example.com.

02

Запустіть бота на localhost

Прив’яжіть застосунок бота до 127.0.0.1:<port>. Не відкривайте сам бот напряму на публічному інтерфейсі.

03

Відкрийте порти 80 і 443

Порт 80 потрібен для Let’s Encrypt HTTP-01, а порт 443 — для фінального HTTPS webhook-маршруту [7][9][10].

04

Залиште публічний край простим

Пропускайте публічний трафік тільки через Nginx. Застосунок бота має обробляти updates, а не TLS, редіректи чи публічну маршрутизацію.

Початковий стан

DNS має резолвитись на VPS, бот має слухати локально, а порти 80 і 443 мають бути доступні.

Випустіть сертифікат до того, як переведете webhook на фінальний HTTPS-маршрут.

01

Встановіть Certbot

Використовуйте офіційну інтеграцію для Nginx, щоб випуск і renewal працювали за документованим сценарієм [7].

02

Отримайте сертифікат для webhook-хоста

Запитуйте сертифікат саме для того домену, який реєструватимете в Telegram.

03

Запустіть dry-run перевірку renewal

Перевірте оновлення сертифіката до того, як вважати розгортання завершеним [7][8].

04

Переходьте на DNS-01 тільки коли HTTP-01 недоступний

Використовуйте DNS-01, коли не можна задіяти порт 80 або коли потрібен wildcard-сертифікат [9].

Результат

На сервері вже є валідний сертифікат для webhook-домену, і можна переходити до фінальної HTTPS-конфігурації Nginx.

Зробіть один HTTP server block для редіректу і один HTTPS server block для фінального reverse proxy. До локального процесу бота проксіюйте лише webhook-шлях [4][5][6].

Використовуйте конфіг такого типу:

NGINX
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:

BASH
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"]'

Після цього перевірте стан:

BASH
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].

Сертифікат валідний, renewal протестований

Не викидайте certbot renew --dry-run із чеклиста розгортання [7][8].

Nginx проксіює лише webhook-шлях

Не робіть надто широких публічних proxy-правил на весь застосунок.

Застосунок перевіряє secret token header

Відхиляйте запити, у яких токен не збігається з налаштованим [1].

Telegram бачить webhook без помилок

Після перших live-запитів перевірте getWebhookInfo [1].

Ціль розгортання

Стабільне розгортання має валідний сертифікат, один публічний HTTPS-маршрут і приватний процес бота.

Більшість проблем із webhook виникає через кілька повторюваних помилок.

Запускати бот на 0.0.0.0 і відкривати його напряму в інтернет.

Пробувати використовувати звичайний HTTP для webhook, хоча Telegram вимагає HTTPS [1][2].

Блокувати порт 80 під час HTTP-01 валідації й зривати випуск сертифіката [7][9].

Реєструвати webhook до того, як HTTPS endpoint став доступним.

Приймати будь-який POST на webhook-маршрут без перевірки secret token [1].

Робити повільну синхронну обробку прямо всередині webhook-запиту замість швидкого підтвердження.

Забувати, що getUpdates не працює, поки активний webhook [1].

Спільний патерн

Проблеми тут майже завжди виникають через неправильну публікацію, неправильну послідовність дій або відсутність перевірки запиту.

Чи потрібен VPS для Telegram bot webhook?

Потрібен публічний HTTPS endpoint, до якого Telegram може стабільно достукатися. VPS — найпростіший спосіб тримати в одному місці домен, Nginx, випуск сертифікатів і firewall-правила.

Чи можна одночасно використовувати getUpdates і webhook?

Ні. Поки webhook активний, Telegram вимикає `getUpdates` для цього бота.

Які порти Telegram підтримує для webhook?

Telegram документує підтримку портів 443, 80, 88 і 8443. У більшості production-сценаріїв публічною HTTPS-точкою входу має бути 443.

Навіщо тримати бота на localhost?

Так застосунок не потрапляє під публічну мережеву поверхню. Nginx приймає зовнішній HTTPS-трафік, а бот бачить тільки внутрішні proxy-запити.

Що перевіряти першим, якщо оновлення не доходять?

Спочатку перевірте публічний HTTPS-маршрут, потім запустіть `getWebhookInfo` і прочитайте останню помилку та `pending_update_count`.

Ці джерела підтверджують поведінку Telegram webhook, схему Nginx reverse proxy, логіку SSL і firewall-налаштування, використані в цьому туторіалі.

Перевірено: 08 квіт. 2026 р.Актуально для: Webhook-розгортання Telegram Bot APIАктуально для: Односерверні VPS-інсталяціїАктуально для: Nginx reverse proxyАктуально для: Випуск сертифікатів Let’s EncryptАктуально для: Ubuntu та Debian-подібні Linux-сервериПеревірено з: Telegram Bot API `setWebhook`Перевірено з: Telegram Bot API `getWebhookInfo`Перевірено з: Nginx `proxy_pass`Перевірено з: SSL termination у NginxПеревірено з: Certbot для NginxПеревірено з: Сценарії Let’s Encrypt HTTP-01 і DNS-01Перевірено з: Правила firewall через UFW

PAS7 Studio допомагає розгортати Telegram-ботів із нормальним webhook-routing, reverse proxy, автоматичним оновленням сертифікатів, керуванням процесом застосунку, міграцією з polling і production-hardening усього стеку.

Пов'язані статті

growth

AI SEO / GEO у 2026: ваші наступні клієнти — не люди, а агенти

Пошук зміщується від кліків до відповідей. Боти та AI-агенти сканують, цитують, рекомендують і дедалі частіше купують. Дізнайтесь, що таке AI SEO / GEO, чому класичного SEO вже недостатньо, і як PAS7 Studio допомагає брендам перемагати у «агентному» вебі.

blogs

Найпотужніший чіп від Apple? M5 Pro і M5 Max б'ють рекорди

Аналітичний розбір Apple M5 Pro і M5 Max станом на березень 2026 року. Пояснюємо, чому ці чіпи можна вважати найпотужнішими професійними ноутбучними SoC від Apple, як вони виглядають на тлі M4 Pro, M4 Max, M1 Pro, M1 Max і що показують у порівнянні з актуальними Intel та AMD.

blogs

Artemis II і код, який веде до Місяця

У цьому блозі розбираємо місію NASA Artemis II, яка стартувала 1 квітня 2026 року, і пояснюємо, що вона насправді говорить про сучасну інженерію: бортове ПЗ, резервні контури, симуляції, телеметрію, людський контроль і дуже обережну роль ШІ в космічній сфері.

telegram-media-saver

Автоматичне тегування та пошук збережених посилань

Інтеграція з GDrive/S3/Notion для автоматичного тегування та швидкого пошуку через пошукові API

Професійна розробка для вашого бізнесу

Створюємо сучасні веб-рішення та боти для бізнесу. Дізнайтеся, як ми можемо допомогти вам досягти цілей.