Перейти до основного вмісту
Знижка 50% усі плани, обмежений час. Від $2.48/mo
Залишилося: 11 хв
Хмарна архітектура та IT

Найкращий VPS для Telegram-бота: long polling, вебхуки, IPv4 і місячна вартість

C Автор: Chike 11 хв читання
Хостинг Telegram-бота на VPS із постійним з’єднанням

Бот відповідає на кожне повідомлення, доки ви не закриєте кришку ноутбука. Після цього користувачі залишаються без відповіді. Невеликий VPS розв’язує проблему за кілька доларів на місяць. Найкращий VPS для Telegram-бота залежить від способу отримання оновлень: бот запитує їх у Telegram або Telegram надсилає їх боту.

Цей вибір визначає потрібні порти й сертифікат, а також необхідність підключення через публічний IPv4.

Коротко

  • Для одного бота на VPS використовуйте long polling. Йому не потрібні домен, сертифікат чи відкритий порт.
  • Вебхукам потрібні HTTPS на порту 443, 80, 88 або 8443 і публічна IPv4-адреса. Telegram не доставляє вебхуки через IPv6.
  • 512 MB of RAM is a workable start for one bot with no local database.
  • Підтримуйте роботу бота за допомогою systemd або політики перезапуску Docker, якщо вже використовуєте контейнери.
  • Обирайте провайдера з огляду на IPv4 і запас оперативної пам’яті, а не лише ціну в прайс-листі.

Long polling чи вебхуки: вибір, що визначає вимоги до сервера

З’єднання long polling і вебхуків між Telegram та VPS

Telegram-бот отримує оновлення одним із двох способів. За long polling бот викликає getUpdates, а Telegram тримає запит відкритим до надходження оновлення або завершення часу очікування, тож кожне з’єднання починається з вашого сервера. Для вебхука ви один раз реєструєте URL через setWebhook, і Telegram надсилає на нього кожне оновлення POST-запитом через HTTPS.

Вимога Long polling (getUpdates) Вебхук (setWebhook)
Вхідний порт Не потрібен; лише вихідні запити HTTPS на 443, 80, 88 або 8443
Публічний IPv4 Не потрібен Потрібен; IPv6 для вебхуків не підтримується
Домен і сертифікат Не потрібні Сертифікат обов’язковий; зазвичай використовують домен, але CN самопідписаного сертифіката може містити IP
Процес Працює безперервно Безперервно відповідає на HTTPS-запити

Стовпець про вебхуки відповідає вимогам Telegram до вебхуків.

Щоб дізнатися, який спосіб використовує бот, надішліть запит до Bot API:

curl "https://api.telegram.org/bot<YOUR_TOKEN>/getWebhookInfo"

Якщо відповідь містить "url":"", вебхук не налаштовано, тож бот може використовувати long polling. У grammY метод bot.start() типово використовує long polling; python-telegram-bot використовує run_polling() або run_webhook().

Для одного бота на окремому VPS я б обрав long polling — це також типова рекомендація grammY. Вебхуки виграють, коли на сервері вже працює зворотний проксі (вебсервер, що пересилає HTTPS-запити вашому боту), кілька ботів використовують одну кінцеву точку HTTPS або ви працюєте на безсерверній платформі. Для цього варіанта Caddy отримує та поновлює сертифікат без завдання cron.

Короткий збій затримує повідомлення, але не призводить до їх втрати. За правилами оновлень Bot API, Telegram зберігає оновлення до 24 годин, доки бот не отримає їх будь-яким із двох способів, і повторює невдалі запити вебхуків, перш ніж припинити спроби.

Якщо вебхук безпосередньо займає власний порт, обмежте доступ до цього порту опублікованими Telegram діапазонами адрес джерела. Якщо порт 443 спільно використовує зворотний проксі, що обслуговує інші сайти, застосуйте обмеження лише до шляху вебхука або покладіться на секретний токен Telegram замість блокування всього іншого HTTPS-трафіку. У посібнику з вебхуків наведено два діапазони адрес джерела та попередження, що вони можуть змінитися. Якщо UFW використовується як брандмауер хоста:

sudo ufw allow 22/tcp    # keep SSH open before you enable the firewall

sudo ufw allow proto tcp from 149.154.160.0/20 to any port 443

sudo ufw allow proto tcp from 91.108.4.0/22 to any port 443

sudo ufw allow 80/tcp    # if your HTTPS setup uses HTTP validation or redirects HTTP to HTTPS

sudo ufw enable

Замініть 443, якщо вебхук слухає порт 80, 88 або 8443. Ці правила захищають бота, що працює безпосередньо на хості. У документації Docker щодо брандмауера зазначено, що опублікований порт обходить UFW, тому контейнер вебхука, запущений із -p 443:443, залишається відкритим для всіх. Також установіть secret_token у setWebhook. Telegram передає його в заголовку X-Telegram-Bot-Api-Secret-Token кожного запиту, а ваш обробник відхиляє запити без нього.

Безперервна робота бота: systemd або Docker

Підтримання роботи Telegram-бота за допомогою systemd або Docker

Щоб Telegram-бот працював цілодобово, його потрібно перезапускати після збоїв і перезавантажень. На VPS це робить systemd або Docker, якщо бот постачається як образ.

Юніт systemd — короткий файл конфігурації, який повідомляє системі ініціалізації, як запускати й перезапускати програму. Створіть /etc/systemd/system/telegram-bot.service:

[Unit]
Description=Telegram bot
After=network-online.target
Wants=network-online.target

[Service]
User=bot
WorkingDirectory=/opt/bot
EnvironmentFile=/opt/bot/.env
ExecStart=/opt/bot/venv/bin/python bot.py
# Node: ExecStart=/usr/bin/node bot.js
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Помістіть токен у файл .env у папці проєкту як BOT_TOKEN=... і зчитуйте через os.environ["BOT_TOKEN"] (Node: process.env.BOT_TOKEN), щоб він не зберігався в коді. Потім скопіюйте проєкт у потрібне місце та запустіть його:

sudo mkdir -p /opt/bot

sudo cp -r ~/your-bot/. /opt/bot/        # your project, after git clone or scp from your machine; include .env and requirements.txt

sudo apt install -y python3-venv         # Debian/Ubuntu

sudo useradd --system --no-create-home bot

sudo chown -R bot:bot /opt/bot

sudo -u bot python3 -m venv /opt/bot/venv

sudo -u bot /opt/bot/venv/bin/pip install -r /opt/bot/requirements.txt

# Node: skip the venv and pip commands above, then run:

cd /opt/bot && sudo -u bot npm ci

sudo chmod 600 /opt/bot/.env

sudo systemctl daemon-reload

sudo systemctl enable --now telegram-bot

systemctl status telegram-bot    # look for: Active: active (running)

sudo journalctl -u telegram-bot -f    # follow the bot's logs

Restart=always перезапускає бота і після штатного завершення, і після збою; on-failure пропускає штатні завершення, згідно з посібником systemd.service. RestartSec=5 задає інтервал між спробами, а WantedBy=multi-user.target разом з enable запускає бота під час завантаження. Якщо він постійно перезапускається, sudo journalctl -u telegram-bot -n 50 покаже трасування помилки. Спершу перевірте, чи задано BOT_TOKEN.

Еквівалент у Docker — один прапорець:

docker run -d --name telegram-bot --restart unless-stopped --env-file .env your-bot-image

docker logs -f telegram-bot

У Compose потрібен рядок restart: unless-stopped. Згідно з документацією Docker щодо політик перезапуску, контейнер відновлює роботу після завершення процесу або перезапуску демона, але не після вашої ручної зупинки. Це охоплює перезавантаження, якщо сам Docker запускається під час завантаження системи, що відбувається типово в Debian і Ubuntu. В інших системах виконайте sudo systemctl enable docker.service.

Моє правило: для одного скрипту на невеликому сервері — systemd без додаткового демона в пам’яті. Якщо вже збираєте образи або запускаєте інші контейнери, використовуйте Docker, враховуючи, що його демон займає частину оперативної пам’яті.

Жоден інструмент не повідомляє, що бот недоступний. Це може зробити push-монітор Uptime Kuma на другому сервері. Бот за таймером звертається до URL монітора, а Uptime Kuma сповіщає вас у Telegram, коли звернення припиняються.

Де підводять безкоштовний хостинг і домашні сервери

Render зупиняє безкоштовний вебсервіс після 15 хвилин без вхідного трафіку, а документація безкоштовного тарифу Render оцінює пробудження приблизно в хвилину. Бот із polling не отримує вхідного трафіку, тому його зупиняють. Бота з вебхуком пробуджує POST-запит Telegram, але після затишшя відбувається холодний запуск. Тому придатність безкоштовного хостингу для Telegram-бота залежить від способу отримання оновлень.

Посібник grammY називає безсерверні платформи вдалим варіантом для вебхуків, тоді як long polling потребує машини, що працює цілодобово. Fly.io виставляє рахунки за використанням і вимагає прив’язати картку.

Raspberry Pi або старий ПК можуть обслуговувати бота з polling, доки працюють машина, живлення та з’єднання. Для домашніх вебхуків також потрібні публічна адреса й переадресація портів. Для аматорського бота будь-якого з цих безкоштовних варіантів може вистачити.

VPS підходить для обох способів за фіксованою місячною ціною.

Порівняння п’яти VPS-провайдерів для Telegram-бота

Порівняння п’яти VPS-провайдерів для хостингу Telegram-бота

У таблиці порівнюються п’ять початкових платних тарифів для хостингу Telegram-бота за заявленими місячними цінами станом на жовтень 2026 року, без податків. Акційні ціни позначено окремо.

Провайдер Характеристики початкового тарифу Ціна на місяць Публічний IPv4 Виставлення рахунків
Cloudzy 1 vCPU (AMD EPYC), 512 МБ DDR5, 20 ГБ NVMe, 1 ТБ трафіку $2.48 за акцією ($4.95 зазвичай) Включено разом з IPv6 Погодинна або помісячна
DigitalOcean 1 vCPU, 512 МіБ, 10 ГіБ SSD, 500 ГіБ трафіку Від $4 Включено Посекундна, не вище місячної ціни
Vultr 1 vCPU, 512 МБ, 10 ГБ SSD, 512 ГБ трафіку Від $2.50 лише з IPv6; від $3.50 з IPv4 Лише в тарифі за $3.50 Погодинна або помісячна
Hetzner (Німеччина/Фінляндія) 2 vCPU, 4 ГБ, 40 ГБ SSD, 20 ТБ трафіку Від €5.49 без ПДВ Додатково, від €0.50/місяць без ПДВ (IPv6 безкоштовно) Погодинна, не вище місячної ціни
Linode (Akamai) 1 vCPU, 1 ГБ, 25 ГБ сховища, 1 ТБ трафіку Від $5 Включено Погодинна або помісячна

Тариф Vultr лише з IPv6 не має IPv4, а ціна Hetzner не включає IPv4-адресу. Без неї жоден із цих варіантів не може приймати вебхуки.

Бот із polling може працювати лише через IPv6, оскільки api.telegram.org має IPv6-адресу. Вона потрібна й усім іншим ресурсам, до яких він звертається, зокрема реєстрам пакетів, вашому Git-хостингу та кожному викликаному API. Перед вибором перевірте кожен хост:

dig +short AAAA api.telegram.org

dig +short AAAA github.com

dig +short AAAA pypi.org    # repeat for every host your bot or its installs reach

Порожня відповідь означає, що хост не має IPv6-адреси.

Чи вистачить Telegram-боту 512 МБ?

Я б почав із 512 МБ для одного бота без локальної бази даних. Документація python-telegram-bot не вказує вимог до пам’яті. Усе залежить від сусідніх процесів на сервері: ОС, демона Docker, якщо він використовується, та локальної бази даних. Вимірюйте споживання.

free -m                   # "available" is your headroom; the Swap row shows swap use

ps -o rss,cmd -p "$(systemctl show -p MainPID --value telegram-bot)"   # bot's resident memory, in KB

docker stats --no-stream  # per-container memory, if the bot runs in Docker

journalctl -k | grep -i "out of memory"   # kernel OOM kills

Завершення через нестачу пам’яті (OOM kill) — це зупинка процесу ядром для звільнення оперативної пам’яті. systemd перезапускає бота, тож запис у журналі може бути єдиним свідченням. Переходьте на 1 ГБ, коли з’являються OOM kill, постійно використовується swap або перед додаванням локальної бази даних чи другого бота.

Що обрати

Для одного бота я б обрав тариф із 512 МБ та включеним публічним IPv4. Далі вибір провайдера залежить від ціни, запасу ресурсів і розташування користувачів.

  • Найнижча поточна місячна ціна: Cloudzy за $2.48 під час акції зі знижкою 50%, із включеними IPv4 та IPv6.
  • Найнижча поточна ціна з IPv4: Cloudzy за $2.48 за акцією. Виділений IPv4 та IPv6 включено.
  • 1 GB of headroom for Docker or a small database: Linode, from $5 a month.
  • Кілька ботів або база даних, користувачі в Європі: Hetzner дає найбільше ресурсів за євро в цій таблиці, коли тариф є в наявності (у жовтні 2026 року він значився як недоступний). Для вебхуків додайте плату за IPv4.
  • Більше диска й трафіку за 512 МБ: Cloudzy. Серед тарифів із 512 МБ він має найбільше сховища (20 ГБ NVMe проти 10) і трафіку (1 ТБ проти приблизно 500 ГБ), із включеними IPv4 та IPv6. За поточною акційною ціною Cloudzy також дешевший за інші початкові тарифи в цьому порівнянні.

За поточною акційною ціною Cloudzy поєднує найнижчу місячну вартість у цьому порівнянні з більшими обсягами сховища й трафіку, ніж інші тарифи з 512 МБ. Тариф Cloudzy з 512 МБ оплачується погодинно та має 14-денну гарантію повернення грошей, тож ви можете кілька днів попрацювати з ботом на ньому перед остаточним рішенням. Оберіть найближчу до користувачів локацію, розгорніть Linux VPS Cloudzy і додайте наведений вище юніт systemd.

Часті запитання

Який найдешевший VPS може запускати Telegram-бота?

Станом на жовтень 2026 року тариф Cloudzy з 512 МБ — найдешевший із п’яти: $2.48 на місяць під час акції зі знижкою 50%, із включеними виділеним IPv4 та IPv6. Звичайна ціна — $4.95 на місяць. Варіант Vultr лише з IPv6 трохи дорожчий, від $2.50.

Навіщо вебхукам Telegram HTTPS?

Згідно з посібником із вебхуків, Telegram вимагає SSL/TLS для вебхуків незалежно від порту. Він відхиляє звичайний HTTP і приймає TLS 1.2 та новіші версії. Без TLS кожен POST-запит передавав би повідомлення користувачів незашифрованими. Підходить сертифікат Let's Encrypt, а також самопідписаний сертифікат, завантажений через setWebhook.

Чи може Telegram-бот працювати з 512 МБ оперативної пам’яті?

Зазвичай так, якщо це один бот без локальної бази даних. Стежте за завершеннями через нестачу пам’яті в журналі ядра та переходьте на 1 ГБ, якщо вони з’являються або коли додаєте базу даних.

Як забезпечити запуск Telegram-бота після перезавантаження?

Увімкніть його службу systemd командою sudo systemctl enable --now telegram-bot або запустіть контейнер із --restart unless-stopped і ввімкніть docker.service, щоб Docker запускався під час завантаження.

Чи обмежує Telegram частоту запитів ботів за IP-адресою?

У FAQ Telegram щодо обмежень ботів їх описано окремо для бота й чату; перехід на новий сервер не слід вважати способом обходу цих обмежень. У разі перевищення ліміту API повертає HTTP 429 зі значенням retry_after. Зачекайте вказану кількість секунд перед повторною спробою.

Який регіон сервера обрати для Telegram-бота?

Оберіть локацію, найближчу до користувачів і сервісів, які викликає бот, а потім виміряйте час з’єднання з кожного розглянутого регіону командою curl -o /dev/null -s -w '%{time_connect}\n' https://api.telegram.org.

Поділитися

Обговорення

Коментарі

Увійдіть, щоб долучитися до обговорення.

Більше з блогу

Продовжуйте читати.

Готові розгортати? Від $2,48/міс.

Незалежна хмара з 2008 року. AMD EPYC, NVMe, 40 Gbps. Повернення коштів за 14 днів.