Если запустить бота командой python3 bot.py, он будет работать в текущем терминале. При закрытии SSH-соединения, завершении процесса или перезагрузке сервера бот может остановиться.
Systemd решает эту проблему, управляя ботом как отдельной службой. После настройки бот сможет запускаться вместе с сервером и автоматически перезапускаться при завершении процесса.
Такой подход подходит для ботов, которые получают сообщения через long polling. Если бот использует webhook, дополнительно потребуется настроить веб-сервер и HTTPS.
Подключитесь к VDS по SSH. Если сервер новый, сначала выполните базовую настройку системы по инструкции Подготовка сервера Linux к работе.
Обновите список пакетов и установите Python с необходимыми инструментами:
apt update
apt install -y python3 python3-pip python3-venv
Создайте отдельную директорию для проекта:
mkdir -p /srv/mybot
cd /srv/mybot
В примере используется путь /srv/mybot. Если вы выберете другую директорию, её потребуется указать во всех последующих командах и в конфигурации systemd.
Создайте виртуальное окружение:
python3 -m venv venv
Установите библиотеку для работы с Telegram Bot API:
/srv/mybot/venv/bin/pip install pyTelegramBotAPI
Использование полного пути к pip позволяет установить библиотеку именно в созданное окружение. Активировать его для выполнения команд в этой статье не требуется.
Создайте файл с кодом:
nano /srv/mybot/bot.py
Добавьте следующий пример:
import telebot
TOKEN = "ВАШ_ТОКЕН"
bot = telebot.TeleBot(TOKEN)
@bot.message_handler(commands=["start"])
def start_message(message):
bot.send_message(message.chat.id, "Бот работает!")
bot.infinity_polling()
Замените ВАШ_ТОКЕН токеном своего бота, полученным через BotFather. Токен предоставляет доступ к управлению ботом, поэтому его нельзя публиковать или передавать посторонним.
В примере бот отвечает на команду /start. Метод infinity_polling() запускает получение обновлений Telegram и позволяет библиотеке повторять попытки подключения при некоторых сетевых сбоях.
Сохраните файл и запустите бота вручную:
/srv/mybot/venv/bin/python /srv/mybot/bot.py
Откройте Telegram, перейдите к своему боту и отправьте команду /start. Если бот ответил сообщением, значит, код и подключение к Telegram работают.
Остановите тестовый процесс сочетанием Ctrl+C. На этом этапе бот завершится, поскольку он запущен непосредственно в терминале. Далее настроим systemd, чтобы не запускать его вручную после каждого перезапуска сервера.
Создадим отдельного пользователя без права входа в интерактивную оболочку:
useradd --system --no-create-home --shell /usr/sbin/nologin mybot
Передадим ему права на чтение файлов проекта:
chown -R root:mybot /srv/mybot
chmod 750 /srv/mybot
chmod 640 /srv/mybot/bot.py
chmod 750 /srv/mybot/venv/bin
chmod 750 /srv/mybot/venv/bin/python
Создайте unit-файл, описывающий работу службы:
nano /etc/systemd/system/mybot.service
Добавьте конфигурацию:
[Unit]
Description=Telegram Bot
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=mybot
Group=mybot
WorkingDirectory=/srv/mybot
ExecStart=/srv/mybot/venv/bin/python /srv/mybot/bot.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
В конфигурации важны несколько параметров:
User и Group определяют пользователя и группу, от имени которых запускается бот.WorkingDirectory задаёт рабочую директорию приложения.ExecStart указывает точные пути к Python и файлу бота.Restart=always предписывает перезапускать службу после завершения процесса.RestartSec=5 задаёт паузу перед повторным запуском, чтобы при постоянной ошибке бот не перезапускался слишком часто.After и Wants помогают запускать службу после начала настройки сети.Systemd не активирует виртуальное окружение автоматически, поэтому команда должна указывать интерпретатор внутри venv.
Сохраните файл. Затем сообщите systemd об изменениях:
systemctl daemon-reload
Включите автозапуск и запустите службу:
systemctl enable --now mybot.service
Параметр enable добавляет службу в автозагрузку, а --now запускает её сразу. Выполнять команды отдельно не требуется.
Убедитесь, что systemd запустил бота:
systemctl status mybot.service
Если всё настроено правильно, в выводе появится статус active (running).
После этого отправьте боту команду /start в Telegram, чтобы проверить обработку сообщений.
Для просмотра последних записей журнала используйте:
journalctl -u mybot.service -n 50 --no-pager
Если нужно наблюдать за работой бота в реальном времени, выполните:
journalctl -u mybot.service -f
Эти команды особенно полезны, когда служба запускается, но бот не отвечает. В журнале могут быть сообщения об ошибках Python, недоступности Telegram API или проблемах с настройками.
Чтобы выйти из режима просмотра журнала, нажмите Ctrl+C. Это завершит просмотр, но не остановит службу.
Если вы изменили код бота, перезапустите службу:
systemctl restart mybot.service
После изменения самого unit-файла сначала выполните systemctl daemon-reload, а затем перезапустите службу. Изменения обычного Python-кода не требуют повторной загрузки конфигурации systemd.
Храните токен отдельно от кода. Не добавляйте токен в публичный репозиторий и не публикуйте его в логах. Для небольшого проекта можно вынести его в отдельный файл окружения с ограниченными правами доступа, а затем подключить этот файл через параметр EnvironmentFile в конфигурации systemd.
Ограничьте права процесса. Боту обычно не нужны права администратора. Отдельный пользователь позволяет изолировать его от других приложений и уменьшает возможные последствия уязвимости.
Следите за журналом службы. Если бот перестал отвечать, сначала проверьте systemctl status mybot.service и journalctl -u mybot.service -n 50. Перезапуск без изучения ошибки может лишь временно скрыть проблему.
После настройки systemd Telegram-бот работает как фоновая служба, запускается вместе с сервером и автоматически перезапускается при завершении процесса. Для управления им достаточно команд systemctl status, systemctl restart и journalctl.
Такой вариант подходит для небольших ботов, уведомлений, автоматизации и других Python-приложений, которым требуется постоянная работа на VDS.