EQVPS

Как захостить Telegram-бота на VPS (и чтобы он не падал)

Jun 15, 2026 · 2 min read · EQVPS Team

Telegram-бот, который работает, только пока открыт ноутбук, на самом деле не работает — он демонстрируется. Чтобы он реально был онлайн, отвечал в 3 ночи, переживал ваши перезагрузки и свои падения, ему нужен сервер. Вот весь путь от начала до конца, с командами.

Сначала хорошая новость: бот — крошечная нагрузка. Почти всё время он простаивает в ожидании сообщений, поэтому самый дешёвый сервер тянет его легко — без выделенного IP, без домена, без наворотов.

1. Токен у BotFather

В Telegram напишите @BotFather, отправьте /newbot, выберите имя и username. Он выдаст токен вида 12345:AAH.... Относитесь к нему как к паролю — у кого токен, тот управляет ботом.

2. Минимальный бот

Зайдите на сервер по SSH, поставьте Python и библиотеку:

sudo apt update && sudo apt install -y python3-venv
mkdir ~/mybot && cd ~/mybot
python3 -m venv venv && source venv/bin/activate
pip install python-telegram-bot

Бот, который отвечает — ~/mybot/bot.py:

import os
from telegram.ext import ApplicationBuilder, CommandHandler

async def start(update, ctx):
    await update.message.reply_text("Живой и на сервере. 🟢")

app = ApplicationBuilder().token(os.environ["BOT_TOKEN"]).build()
app.add_handler(CommandHandler("start", start))
app.run_polling()

Обратите внимание: токен читается из переменной окружения, а не зашит в код. Это важно для следующего шага.

3. То, что реально держит бота: systemd

Если просто запустить python bot.py, он умрёт, как только вы закроете SSH. systemd-сервис — то, что заставляет его пережить выход, падения и перезагрузки. Создайте /etc/systemd/system/mybot.service:

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

[Service]
WorkingDirectory=/home/youruser/mybot
Environment=BOT_TOKEN=12345:AAH...ваш-токен
ExecStart=/home/youruser/mybot/venv/bin/python bot.py
Restart=always
RestartSec=5
User=youruser

[Install]
WantedBy=multi-user.target

Затем:

sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo systemctl status mybot      # должно быть active (running)
journalctl -u mybot -f           # живые логи

Restart=always — строка, которая делает всю работу: упал — вернулся через 5 секунд. enable — поднимется после перезагрузки. Это и есть разница между «я как-то запускал бота» и «мой бот онлайн».

4. Почему без домена и открытых портов

Бот использует long polling — сам ходит в Telegram за апдейтами, так что внутрь ничего стучаться не должно. Ни публичного URL, ни входящего правила файрвола, ни выделенного IP. Именно поэтому NAT-VPS (общий IP, SSH на порту) — нормальный и дешёвый дом для бота. Webhook существует для очень больших объёмов, но на старте он почти наверняка не нужен.

Честные оговорки

Вот и всё. Сначала закройте сервер по чек-листу безопасности, положите сервис — и бот остаётся онлайн независимо от вас. На крипто-оплаченном VPS он может работать через минуту после того, как вы решились.

FAQ

Какой VPS нужен для Telegram-бота?

Самый маленький. Бот почти всё время простаивает, ожидая апдейты, так что 1 ГБ RAM и 2 ядра хватает большинству ботов — даже довольно загруженным. Больше нужно, только если бот сам делает тяжёлую работу (обработка картинок, локальная модель, большая БД).

Как держать бота запущенным после закрытия SSH?

Запускать как systemd-сервис. В отличие от запуска в терминале, systemd держит его живым после выхода, перезапускает при падении и поднимает после перезагрузки. Это и есть разница между игрушкой и тем, что стабильно работает.

Почему бот останавливается, когда я отключаюсь?

Потому что вы запустили его в SSH-сессии, и он умирает с её концом. Оберните в systemd-сервис (или tmux для быстрого теста) — и он работает независимо от вашего входа.

Нужен ли домен или webhook для Telegram-бота?

Нет. Long polling (getUpdates) не требует публичного URL, домена и входящего порта — бот сам ходит в Telegram. Поэтому NAT-VPS без выделенного IP отлично подходит для бота. Webhook — опциональная оптимизация для больших объёмов.

Безопасно ли держать токен бота на VPS?

Да, если относиться к нему как к паролю: держать в переменной окружения или файле, читаемом только пользователем бота, не коммитить в git и закрыть сервер SSH-ключами. Утёк — отзовите в BotFather и выпустите новый.

← Back to blogSee plans & pricing →