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 він може працювати за хвилину після того, як ви наважилися.