Как обеспечить бесперебойную работу бота

После окончания разработки бота вам потребуется запустить его в работу.
Запустить бота можно и из консоли на компьютере или сервере, но этот способ имеет много минусов, не совместимых с нормальной эксплуатацией бота.

Проблемы запуска из консоли:

  1. При выходе из терминала бот перестает работать
  2. При возникновении ошибок или исключений бот также вылетает
  3. Что бы запустить бот нужно активировать виртуальную среду
  4. При перезапуске сервера бот не включится автоматически
  5. Сложное управление ботами

Поэтому проще администрировать бота, если он будет работать в фоне, не вылетать при ошибках и при перезагрузке сервера включаться автоматически.
Для этого можно использовать утилиту systemd в Linux.

В этой статье приведены действия, подразумевающие, что у вас уже:

Шаг 1. Создать юнит systemd

systemd - менеджер служб со множеством функций.
Одна из них - запуск скриптов в фоне, или по другому демонизация.

💡 Демон - программа, запускаемая в фоновом режиме

То, как именно будет запущена программа, описывается в файлах, называемых юнитами.
Создадим такой юнит для бота.

1. Перейдите в директорию /etc/systemd/system/

cd /etc/systemd/system/

2. Создайте файл с расширением .service - юнит для бота

nano example_bot.service

Создастся файл example_bot.service

3. Создайте юнит

Этот юнит написан для проекта бота со структурой:


	/opt/ 
	├── example_bot/ # рабочий каталог
	│ ├── bot.py # файл бота
	│ └── bot_env/ # каталог виртуальной среды
	

Содержимое example_bot.service:


	[Unit]
	Description=example bot
	After=network.target

	[Service]
	User=root # замените пользователя, если нужно
	WorkingDirectory=/opt/example_bot # замените путь до каталога на ваш
	ExecStart=/example_bot/bot_env/bin/python3 bot.py # замените путь до виртуальной среды на ваш
	Restart=always

	[Install]
	WantedBy=multi-user.target

Разбор конфигурации


Вы можете что-то добавить или убрать в зависимости от своих задач.
Видно три секции:
[Unit] - описание юнита и установка зависимостей
[Service] - какими командами и под каким пользователем надо запускать сервис
[Install] - в каком уровне запуска должен стартовать сервис
Этих трёх секций достаточно для создания простого демона

Переменные секции [Unit]:
Description - описание юнита
Можно написать название бота
After - после запуска каких сервисов запускать сервис
В данном случае переменная равна network.target - запускать после настройки сети.
Это не обязательное условие.
Также можно и добавить своё: например After=mysql.service - запуск после запуска mysql

Переменные секции [Service]:
User - пользователь, под которым запущен бот
Тут указан root. Можно задать ещё и группу (Group=your_group)
WorkingDirectory - рабочий каталог
Он будет установлен как текущий, перед запуском.
Нужно указать каталог, в котором находится ваш бот.
В этом случае /opt/example_bot
ExecStart - команда для старта сервиса
В этом случае /example_bot/bot_env/bin/python3 bot.py.
Это значит:
1. Перейти в каталог виртуальной среды /example_bot/bot_env/bin/
2. Найти в каталоге исполняемый файл python3
3. Передать ему в качестве аргумента скрипт бота bot.py
Если у вас нет виртуальной среды, то команда может выглядеть так:
ExecStart=/usr/bin/python3 /example_bot/bot.py
Restart - как перезапускать сервис
В этом случае always - сервис будет перезапускаться всегда, независимо от причины. Это оптимально для работы телеграм бота.

Переменные секции [Install]: WantedBy - в каких условиях должен активироваться устанавливаемый юнит В нашем случае multi-user.target - при любой нормальной загрузке

Подробнее про возможности systemd можно почитать:
pdf-файл: systemd для администраторов (Русский перевод)
wiki.archlinux.org: Шпаргалка по systemd

Шаг 2. Запустить демон

У нас готов файл example_bot.service
Теперь можно запустить юнит командой:

systemctl start example_bot

Добавить его в автозапуск:

systemctl enable example_bot

Посмотреть статус:

systemctl status example_bot
Если все нормально, то статус будет active

Это значит, что бот запущен и работает.

Другие команды systemd


systemctl stop example_bot # остановка юнита
systemctl reload example_bot # перезапустить с новыми настройками
systemctl daemon-reload # перезагрузка настроек systemd

Шаг 3. Исправление ошибок

Если во время запуска вы видите, что демон не запустился

Если статус failed

Посмотрите журнал логов командой

journalctl -u example_bot # или journalctl -f -u example_bot для вывода в реальном времени
Посмотрите ошибку в логах

Например в данном случае видно ошибку No such file or directory.
Это значит, что файл не найден и мы скорее всего ошиблись в путях.
Обычно все ошибки systemd пишутся понятным тектом в логах и их не составляет труда исправить.

Заказать VDS для бесперебойного запуска бота можно выбрав тариф ниже.

Тарифы на VDS

Стартовый

CPU

1 ядро

RAM

1Gb

SSD

10Gb NVMe

ip: 1шт ipv4

DDoS protect

Выберите ОС:

210р/мес

Базовый

CPU

2 ядра

RAM

2Gb

SSD

40Gb NVMe

ip: 1шт ipv4

DDoS protect

Выберите ОС:

593р/мес

Продвинутый

CPU

4 ядра

RAM

6Gb

SSD

100Gb NVMe

ip: 1шт ipv4

DDoS protect

Выберите ОС:

995р/мес

Последнее в блоге