Telegram-бот на сервері: запуск і автозапуск
Як розмістити Telegram-бота на VPS: ізоляція під власним користувачем, сервіс systemd, зберігання токена, логи та обробка збоїв мережі.
Оновлено 23 серпня 2026 р.
Боту потрібен постійно запущений процес — саме тут безкоштовний хостинг закінчується і починається VDS. Боту майже не потрібні ресурси: навіть VDS-1 (1 ядро, 2 ГБ) впорається з ботом на тисячі користувачів.
Розміщення
Окремий користувач і каталог — щоб бот не працював від імені root:
useradd -r -m -d /srv/bot -s /usr/sbin/nologin botuser
cd /srv/bot && sudo -u botuser git clone https://github.com/you/bot.git .
sudo -u botuser python3 -m venv venv
sudo -u botuser venv/bin/pip install -r requirements.txt
Для Node.js: npm ci --omit=dev замість venv.
Тримайте токен у файлі середовища, а не в коді:
install -o botuser -g botuser -m 600 /dev/null /srv/bot/.env
echo 'BOT_TOKEN=123456:ABC...' > /srv/bot/.env
Файл із токеном не повинен потрапити до репозиторію: додайте його в .gitignore перед першим комітом.
Служба
/etc/systemd/system/tgbot.service:
[Unit]
Description=Telegram bot
After=network-online.target
Wants=network-online.target
[Service]
User=botuser
WorkingDirectory=/srv/bot
EnvironmentFile=/srv/bot/.env
ExecStart=/srv/bot/venv/bin/python -u bot.py
Restart=always
RestartSec=10
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now tgbot
journalctl -u tgbot -f
Прапорець -u у Python вимикає буферизацію виводу — без нього логи з'являться в journal із затримкою на кілька хвилин або не з'являться взагалі.
Long polling чи webhook
Long polling простіший: бот сам опитує Telegram, і вам не потрібно нічого відкривати назовні. Для більшості завдань цього достатньо.
Webhook швидший і ощадніший щодо трафіку, але потребує домену й сертифіката:
location /bot/token {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
Знадобляться Let's Encrypt і зворотний проксі. Telegram неохоче приймає самопідписані сертифікати — використовуйте звичайний.
Ніколи не повинно працювати дві копії бота одночасно: Telegram доставляє оновлення лише одному отримувачу, і боти почнуть відповідати з перебоями. Після правок робіть restart, а не другий запуск.
Дані
SQLite достатньо для налаштувань і статистики — файл поруч із ботом. Окремий сервер бази даних потрібен лише тоді, коли в бота є вебпанель або кілька процесів.
Типові помилки
| Симптом | Причина |
|---|---|
Conflict: terminated by other getUpdates | Працюють дві копії бота |
| Бот замовкає після ночі | Не налаштовано Restart=always, і процес впав під час збою мережі |
Unauthorized | Токен відкликано або скопійовано із зайвими пробілами |
| Немає логів | Буферизація виводу або запис у файл замість stdout |
| Вручну працює, як служба падає | Немає змінних середовища в systemd |
Токен, який з'явився на скриншоті, у публічному репозиторії чи в чужому чаті, вважається скомпрометованим. Відкличте його через BotFather і змініть файл
.env— не розраховуйте на те, що ніхто не помітить.