MAATRIX / Блог / Как держать бота онлайн 24/7: полное руководство

Как держать бота онлайн 24/7: полное руководство

Блог MAATRIX · 2026-07-07

Главная задача любого бота — быть онлайн всегда. Разберём, как заставить бота подниматься после перезагрузки сервера, самому вставать после падения, переживать разрывы сети и оповещать о сбоях. Всё на штатном systemd, без сторонних костылей.

Почему 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'\n[Unit]\nDescription=My bot\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nUser=botuser\nWorkingDirectory=/home/botuser/mybot\nEnvironmentFile=/home/botuser/mybot/.env\nExecStart=/home/botuser/mybot/venv/bin/python bot.py\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\nEOF
", 'After/Wants=network-online.target — ждём готовности сети перед стартом. Restart=always — перезапуск при любом завершении. WantedBy=multi-user.target — включить в автозагрузку. Активируем:', '
sudo systemctl daemon-reload\nsudo systemctl enable --now mybot\nsudo systemctl status mybot
']

Автоперезапуск: тонкая настройка

['Restart=always поднимает бота при любом выходе. Но если бот падает сразу на старте (например, из-за ошибки в коде), systemd будет перезапускать его в цикле. Чтобы не молотить бесконечно, ограничьте частоту перезапусков.', '
# в секции [Service]:\nRestart=always\nRestartSec=5\nStartLimitIntervalSec=300\nStartLimitBurst=5
', 'Эта связка означает: не больше 5 перезапусков за 300 секунд. Если бот падает чаще — systemd остановит попытки и пометит сервис как failed, чтобы вы заметили системную проблему, а не маскировали её вечными рестартами. Проверить историю перезапусков:', '
systemctl show mybot -p NRestarts\njournalctl -u mybot | grep -i restart
']

Старт после перезагрузки сервера

['Ключ к автозагрузке — команда enable. Она создаёт симлинк, по которому systemd запустит бота при следующей загрузке. Проверить, что бот действительно в автозапуске:', '
systemctl is-enabled mybot\n# должно вывести: enabled
', 'Проверить на практике — самый честный тест. Перезагрузите сервер и убедитесь, что бот поднялся сам:', '
sudo reboot\n# после переподключения по SSH:\nsystemctl status mybot
', 'Если статус active (running) без ручного запуска — автозагрузка настроена верно.']

Устойчивость к разрывам сети и API

['Даже идеальный systemd не спасёт, если сам бот не умеет переподключаться. Разрыв связи с Telegram, биржей или БД — норма жизни, и код должен это переживать: оборачивайте сетевые вызовы в try/except с повторами, а не падайте при каждом таймауте.', 'Хороший паттерн — бесконечный цикл с переподключением и паузой. Если исключение всё же вылетит наружу, systemd поднимет процесс заново, но лучше обработать разрыв внутри, не теряя состояние.', "
import time\nwhile True:\n    try:\n        run_bot()  # основной цикл\n    except Exception as e:\n        print(f'Сбой: {e}, переподключение через 5с')\n        time.sleep(5)
"]

Мониторинг аптайма и оповещения

['«Онлайн 24/7» стоит проверять, а не предполагать. Настройте оповещение о падении: systemd умеет запускать сервис-нотификатор при сбое основного через директиву OnFailure.', '
# в [Unit] бота:\nOnFailure=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

Частые вопросы

Как заставить бота стартовать после перезагрузки?

Оформите его systemd-сервисом и выполните systemctl enable. После этого бот поднимается при каждой загрузке автоматически — проверьте командой systemctl is-enabled.

Что делать, если бот перезапускается в цикле?

Добавьте StartLimitIntervalSec и StartLimitBurst — они ограничат число рестартов. Если лимит превышен, сервис пометится failed, и вы увидите реальную ошибку в journalctl.

Достаточно ли systemd для аптайма 24/7?

systemd обеспечивает автозапуск и перезапуск, но код должен уметь переподключаться, а сервер — быть надёжным. Вместе это и даёт настоящий аптайм 24/7.