Бот отвечает на каждое сообщение, пока вы не закроете крышку ноутбука. После этого пользователи остаются без ответа. Небольшой 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 или вебхуки: выбор, определяющий требования к серверу
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-бот работал круглосуточно, его нужно перезапускать после сбоев и перезагрузок. На 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-бота
В таблице сравниваются пять начальных платных тарифов для хостинга 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.
Обсуждение
Комментарии
Войдите, чтобы присоединиться к обсуждению.