VDS · Приложения и боты

Телеграм-бот на машине: запуск и автозапуск

Как разместить телеграм-бота на 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, а не надейтесь, что не заметят.