Телеграм-бот на машине: запуск и автозапуск
Как разместить телеграм-бота на VDS: изоляция под своим пользователем, служба 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/токен {
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, а не надейтесь, что не заметят.