Как обеспечить бесперебойную работу бота
После окончания разработки бота вам потребуется запустить его в работу.
Запустить бота можно и из консоли на компьютере или сервере, но этот способ имеет много минусов, не совместимых с нормальной эксплуатацией бота.
Проблемы запуска из консоли:
- При выходе из терминала бот перестает работать
- При возникновении ошибок или исключений бот также вылетает
- Что бы запустить бот нужно активировать виртуальную среду
- При перезапуске сервера бот не включится автоматически
- Сложное управление ботами
Поэтому проще администрировать бота, если он будет работать в фоне, не вылетать при ошибках и при перезагрузке сервера включаться автоматически.
Для этого можно использовать утилиту systemd
в Linux.
В этой статье приведены действия, подразумевающие, что у вас уже:
- Есть сервер на Linux (В данном случае используется Ubuntu 22.04 LTS)
- Произведена начальная настройка сервера
- Развернуто виртуальное окружение и установлены необходимые библиотеки для бота
- Файлы бот загружены на сервер (Инструкция для scp, Инструкция для WinSCP)
Шаг 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
Это значит, что бот запущен и работает.
Другие команды systemd
systemctl stop example_bot # остановка юнита
systemctl reload example_bot # перезапустить с новыми настройками
systemctl daemon-reload # перезагрузка настроек systemd
Шаг 3. Исправление ошибок
Если во время запуска вы видите, что демон не запустился
Посмотрите журнал логов командой
journalctl -u example_bot # или journalctl -f -u example_bot для вывода в реальном времени
Например в данном случае видно ошибку No such file or directory
.
Это значит, что файл не найден и мы скорее всего ошиблись в путях.
Обычно все ошибки systemd
пишутся понятным тектом в логах и их не составляет труда исправить.
Заказать VDS для бесперебойного запуска бота можно выбрав тариф ниже.
Тарифы на VDS
Стартовый
CPU
RAM
SSD
ip: 1шт ipv4
DDoS protect
Выберите ОС:
210р/мес
Базовый
CPU
RAM
SSD
ip: 1шт ipv4
DDoS protect
Выберите ОС:
593р/мес
Продвинутый
CPU
RAM
SSD
ip: 1шт ipv4
DDoS protect
Выберите ОС:
995р/мес