Запуск бота в фоновом режиме¶
Чтобы Python- (или любой другой) бот работал непрерывно, автоматически перезапускался при сбоях и загружался после перезагрузки сервера, недостаточно просто выполнить python main.py. Нужна полноценная фоновая служба.
Ниже — три проверенных метода: от простого (screen) до промышленного (systemd). Выбирайте в зависимости от требований.
Подготовка среды¶
-
Разместите код бота, например, в
/home/user/bot: -
Создайте и активируйте виртуальное окружение для изоляции зависимостей:
-
Установите зависимости:
-
Проверьте запуск вручную:
Примечание
Не запускайте бота от root, если это не требуется. Лучше создать отдельного пользователя:
Способ 1. screen — быстрый запуск (для тестов и разработки)¶
Плюсы: проще всего начать.
Минусы: не перезапускается после падения или перезагрузки — не подходит для продакшена.
Установка:
Запуск:
Управление:
| Действие | Команда |
|---|---|
| Отключиться от сессии (оставить в фоне) | Ctrl + A, затем D |
| Посмотреть список сеансов | screen -ls |
| Вернуться в сессию | screen -r bot |
| Завершить сессию изнутри | Ctrl + A, затем K → Y |
Информация
При перезагрузке сервера или падении скрипта — бот останется выключенным. Используйте только для временных задач.
Способ 2. systemd — стандарт Linux для служб (рекомендуется)¶
Плюсы: автозапуск, перезапуск при ошибках, логирование, интеграция с системой.
Минусы: требуется написать конфиг.
-
Создайте unit-файл:
-
Вставьте конфиг (адаптируйте пути и пользователя!):
[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 -
Активируйте службу:
-
Проверьте статус и логи:
Советы по безопасности
Запретите службе доступ к ненужным частям системы (через 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-бота:
Полезные команды:
| Команда | Назначение |
|---|---|
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!).