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 существует для очень больших объёмов, но на старте он почти наверняка не нужен.
Честные оговорки
- Гигиена токена: здесь он вписан прямо в unit-файл для наглядности — нормально на закрытом сервере, но для чего-то общего грузите его из root-only
EnvironmentFileи никогда не коммитьте в git. Утёк? Отзовите в BotFather, выпустите новый. - Тяжёлые боты: если бот сам делает работу (генерация картинок, локальная модель) — он уже не крошечный, увеличивайте размер.
Вот и всё. Сначала закройте сервер по чек-листу безопасности, положите сервис — и бот остаётся онлайн независимо от вас. На крипто-оплаченном VPS он может работать через минуту после того, как вы решились.