Как держать бота онлайн 24/7: полное руководство
Главная задача любого бота — быть онлайн всегда. Разберём, как заставить бота подниматься после перезагрузки сервера, самому вставать после падения, переживать разрывы сети и оповещать о сбоях. Всё на штатном systemd, без сторонних костылей.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Почему nohup и screen — плохая идея
Новички запускают бота через nohup python bot.py & или в сессии screen/tmux. Это работает ровно до первой перезагрузки сервера: после ребута бот не поднимется, потому что никто его не запустит. А ещё такой процесс не перезапускается после падения — упал по исключению, и всё, тишина до вашего вмешательства.
Правильный инструмент для фоновых служб в Linux — systemd. Это штатный менеджер сервисов: он запускает бота при загрузке системы, следит за процессом, перезапускает упавший и ведёт журнал логов. Никаких сторонних пакетов ставить не нужно — systemd уже есть в Ubuntu и Debian.
- Старт после ребута — systemd поднимает сервис автоматически.
- Автоперезапуск — упавший процесс встаёт сам.
- Журнал логов — journalctl хранит вывод бота.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для бота 24/7Базовый unit-файл бота
Оформляем бота как systemd-сервис. Разберём каждую директиву — здесь важна каждая строка.
sudo tee /etc/systemd/system/mybot.service > /dev/null <<'EOF'
[Unit]
Description=My bot
After=network-online.target
Wants=network-online.target
[Service]
User=botuser
WorkingDirectory=/home/botuser/mybot
EnvironmentFile=/home/botuser/mybot/.env
ExecStart=/home/botuser/mybot/venv/bin/python bot.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
After/Wants=network-online.target — ждём готовности сети перед стартом. Restart=always — перезапуск при любом завершении. WantedBy=multi-user.target — включить в автозагрузку. Активируем:
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo systemctl status mybot
Автоперезапуск: тонкая настройка
Restart=always поднимает бота при любом выходе. Но если бот падает сразу на старте (например, из-за ошибки в коде), systemd будет перезапускать его в цикле. Чтобы не молотить бесконечно, ограничьте частоту перезапусков.
# в секции [Service]:
Restart=always
RestartSec=5
StartLimitIntervalSec=300
StartLimitBurst=5
Эта связка означает: не больше 5 перезапусков за 300 секунд. Если бот падает чаще — systemd остановит попытки и пометит сервис как failed, чтобы вы заметили системную проблему, а не маскировали её вечными рестартами. Проверить историю перезапусков:
systemctl show mybot -p NRestarts
journalctl -u mybot | grep -i restart
Старт после перезагрузки сервера
Ключ к автозагрузке — команда enable. Она создаёт симлинк, по которому systemd запустит бота при следующей загрузке. Проверить, что бот действительно в автозапуске:
systemctl is-enabled mybot
# должно вывести: enabled
Проверить на практике — самый честный тест. Перезагрузите сервер и убедитесь, что бот поднялся сам:
sudo reboot
# после переподключения по SSH:
systemctl status mybot
Если статус active (running) без ручного запуска — автозагрузка настроена верно.
Устойчивость к разрывам сети и API
Даже идеальный systemd не спасёт, если сам бот не умеет переподключаться. Разрыв связи с Telegram, биржей или БД — норма жизни, и код должен это переживать: оборачивайте сетевые вызовы в try/except с повторами, а не падайте при каждом таймауте.
Хороший паттерн — бесконечный цикл с переподключением и паузой. Если исключение всё же вылетит наружу, systemd поднимет процесс заново, но лучше обработать разрыв внутри, не теряя состояние.
import time
while True:
try:
run_bot() # основной цикл
except Exception as e:
print(f'Сбой: {e}, переподключение через 5с')
time.sleep(5)
Мониторинг аптайма и оповещения
«Онлайн 24/7» стоит проверять, а не предполагать. Настройте оповещение о падении: systemd умеет запускать сервис-нотификатор при сбое основного через директиву OnFailure.
# в [Unit] бота:
OnFailure=notify-fail@%n.service
Сервис notify-fail шлёт сообщение в Telegram при падении бота — вы узнаёте о проблеме мгновенно. Дополнительно полезен внешний heartbeat: бот раз в минуту пингует сервис вроде healthchecks, и если пинг пропал, приходит алерт.
Но фундамент аптайма — надёжный сервер под ботом. На тарифах MAATRIX это AMD EPYC + NVMe с высоким аптаймом дата-центра, локации UK, США и РФ, ежедневные бэкапы и root-доступ для полной настройки systemd. Оплата картой РФ, СБП, криптой (BTC/ETH/USDT) или токеном MAAT — удобно из России. От $8/мес.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для бота 24/7Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Как заставить бота стартовать после перезагрузки?
Оформите его systemd-сервисом и выполните systemctl enable. После этого бот поднимается при каждой загрузке автоматически — проверьте командой systemctl is-enabled.
Что делать, если бот перезапускается в цикле?
Добавьте StartLimitIntervalSec и StartLimitBurst — они ограничат число рестартов. Если лимит превышен, сервис пометится failed, и вы увидите реальную ошибку в journalctl.
Достаточно ли systemd для аптайма 24/7?
systemd обеспечивает автозапуск и перезапуск, но код должен уметь переподключаться, а сервер — быть надёжным. Вместе это и даёт настоящий аптайм 24/7.