Перейти к содержанию

Запуск бота в фоновом режиме

Чтобы Python- (или любой другой) бот работал непрерывно, автоматически перезапускался при сбоях и загружался после перезагрузки сервера, недостаточно просто выполнить python main.py. Нужна полноценная фоновая служба.

Ниже — три проверенных метода: от простого (screen) до промышленного (systemd). Выбирайте в зависимости от требований.


Подготовка среды

  1. Разместите код бота, например, в /home/user/bot:

    mkdir -p /home/user/bot && cd /home/user/bot
    

  2. Создайте и активируйте виртуальное окружение для изоляции зависимостей:

    python3 -m venv venv
    source venv/bin/activate
    

  3. Установите зависимости:

    pip install -r requirements.txt
    # Если файла нет — установите вручную, например: pip install python-telegram-bot
    

  4. Проверьте запуск вручную:

    python main.py
    

Примечание

Не запускайте бота от root, если это не требуется. Лучше создать отдельного пользователя:

sudo adduser --disabled-login botuser
sudo chown -R botuser:botuser /home/user/bot

Способ 1. screen — быстрый запуск (для тестов и разработки)

Плюсы: проще всего начать.
Минусы: не перезапускается после падения или перезагрузки — не подходит для продакшена.

Установка:

sudo apt update && sudo apt install screen -y

Запуск:

screen -S bot  # создаём именованную сессию
source venv/bin/activate
python main.py

Управление:

Действие Команда
Отключиться от сессии (оставить в фоне) Ctrl + A, затем D
Посмотреть список сеансов screen -ls
Вернуться в сессию screen -r bot
Завершить сессию изнутри Ctrl + A, затем KY

Информация

При перезагрузке сервера или падении скрипта — бот останется выключенным. Используйте только для временных задач.


Способ 2. systemd — стандарт Linux для служб (рекомендуется)

Плюсы: автозапуск, перезапуск при ошибках, логирование, интеграция с системой.
Минусы: требуется написать конфиг.

  1. Создайте unit-файл:

    sudo nano /etc/systemd/system/bot.service
    

  2. Вставьте конфиг (адаптируйте пути и пользователя!):

    [Unit]
    Description=Telegram Bot Service
    After=network.target
    StartLimitIntervalSec=30
    StartLimitBurst=5
    
    [Service]
    Type=simple
    User=botuser                 # ← рекомендуется не root!
    Group=botuser
    WorkingDirectory=/home/user/bot
    ExecStart=/home/user/bot/venv/bin/python /home/user/bot/main.py
    Restart=always
    RestartSec=10
    Environment="PYTHONUNBUFFERED=1"  # чтобы логи не буферизовались
    
    # Безопасность (опционально, но желательно)
    NoNewPrivileges=true
    PrivateTmp=true
    ProtectSystem=strict
    ProtectHome=true
    ReadWritePaths=/home/user/bot/data/  # если боту нужен доступ к данным
    
    [Install]
    WantedBy=multi-user.target
    

  3. Активируйте службу:

    sudo systemctl daemon-reload
    sudo systemctl enable bot.service   # автозапуск при загрузке
    sudo systemctl start bot.service    # запустить сейчас
    

  4. Проверьте статус и логи:

    sudo systemctl status bot.service
    journalctl -u bot.service -f --since "1 hour ago"
    

Советы по безопасности

Запретите службе доступ к ненужным частям системы (через ProtectSystem, ReadOnlyPaths);

Если боту нужен только интернет — добавьте RestrictNetwork=true и настройте IPAddressAllow=...;

Используйте RuntimeDirectory= для временных файлов.


Способ 3. PM2 — менеджер процессов (для Node.js, но поддерживает Python)

Плюсы: простота, встроенные логи, мониторинг, веб-интерфейс.
Минусы: требует Node.js, избыточен для простых Python-ботов.

Установка:

# Установите Node.js и npm (если ещё не установлены)
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs

# Установите PM2 глобально
sudo npm install -g pm2

Запуск Python-бота:

cd /home/user/bot
pm2 start main.py --name "my-bot" --interpreter ./venv/bin/python

Полезные команды:

Команда Назначение
pm2 list Список процессов
pm2 logs my-bot Просмотр логов
pm2 monit Мониторинг в реальном времени
pm2 startup Настроить автозапуск после перезагрузки
pm2 save Сохранить текущие процессы

Информация

После pm2 startup следуйте инструкциям в терминале — PM2 сам сгенерирует systemd-юнит для автозапуска.


Сравнение методов

Критерий screen systemd PM2
Автозапуск после reboot нет да да (требует pm2 startup)
Перезапуск при падении нет да да
Логирование Только в сессии journalctl Встроенные логи
Безопасность Низкая Высокая (настройка изоляции) Средняя
Сложность настройки Низкая Средняя Низкая (но требует Node.js)
Подходит для продакшена нет Рекомендуется да (если уже используете Node.js)

Дополнительно

Настройте алертинг при остановке бота (например, через systemd+ healthchecks.io);

Регулярно обновляйте зависимости (pip list --outdated);

Используйте .env-файлы и python-dotenv для хранения токенов (и исключите их из Git!).

question_mark
Я могу вам чем-то помочь?
question_mark
ИИ Помощник ×