Как держать бота онлайн 24/7: полное руководство
Главная задача любого бота — быть онлайн всегда. Разберём, как заставить бота подниматься после перезагрузки сервера, самому вставать после падения, переживать разрывы сети и оповещать о сбоях. Всё на штатном 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.