EQVPS

Тримаємо бота 24/7 на VPS (щоб він не падав мовчки)

Jun 15, 2026 · 2 min read · EQVPS Team

Бот «не працює» на сервері двома способами. Очевидний: зупиняється, щойно ви закриваєте SSH. Підступний: працює собі два дні, падає о 4 ранку на якомусь необробленому винятку, і ви дізнаєтесь про це за години, коли хтось питає, чому він лежить. В обох одне рішення, і це не «не забувати перезапускати» — це передати роботу systemd, який тримає все живим за вас.

Чому помирає при виході

Якщо запустили python bot.py у SSH-сесії, процес — її нащадок. Закрили сесію — процес із нею. nohup і & маскують це, але не дають ні рестарту при падінні, ні старту при завантаженні — тож ви розв'язали дрібну проблему й зберегли велику.

Реальне рішення: systemd-сервіс

Це все цілком. Створіть /etc/systemd/system/mybot.service:

[Unit]
Description=My bot
After=network-online.target

[Service]
WorkingDirectory=/home/youruser/mybot
ExecStart=/home/youruser/mybot/venv/bin/python bot.py
Restart=always
RestartSec=5
User=youruser
Environment=API_KEY=...

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now mybot

Усю важку роботу роблять два рядки:

Якщо все ще барахлить — читайте логи

Бот, що крэш-лупить, не лагодиться «перезапустити сильніше»; щось реально не так. systemd ловить stdout/stderr, тож:

systemctl status mybot          # живий/лежить, останній код виходу
journalctl -u mybot -n 100      # свіжі логи + помилка, на якій помер
journalctl -u mybot -f          # стежити наживо

Причина майже завжди прямо там: відсутня змінна оточення, необроблений виняток, таймаут API, OOM-kill. Лагодьте їїRestart=always це страховка, не ліки від реального багу.

Підказка: якщо логи показують, що бота вбивають за пам'ять — ви переросли сервер, див. гайд по sizing.

Коли натомість підходять tmux чи pm2

systemd не єдина відповідь, просто найкращий дефолт:

Для одного постійного бота чи агента systemd — найпростіше, що реально працює: він уже на сервері, не вимагає зайвих інструментів і робить рестарт, старт-при-завантаженні й логування з коробки.

Чесний підсумок

Аптайм — не про сервер побільше чи більше дисципліни, а про те, щоб не прив'язувати процес до ноутбука. Оберніть у systemd-юніт із Restart=always і enable, і дивіться journalctl, коли щось не так. Зробіть це раз — і бот тримається, дивитесь ви чи спите. (Новий сервер? Спершу закрийте його — бот 24/7 це й мішень 24/7.)

FAQ

Чому бот зупиняється при закритті SSH?

Бо ви запустили його всередині SSH-сесії, і він прив'язаний до неї — помирає з відключенням. Рішення — запустити як фоновий сервіс, незалежний від вашого входу: systemd — чистий шлях, tmux — швидкий.

Як авто-перезапускати бота при падінні?

Запустіть як systemd-сервіс із Restart=always і невеликим RestartSec. systemd тоді піднімає процес за секунди після будь-якого падіння, нескінченно, без нагляду. Цей один рядок — різниця між «помер о 4 ранку» і «блимнув і відновився».

Як зробити, щоб бот стартував після перезавантаження?

systemctl enable вашого сервісу. «enable» прив'язує старт до завантаження, «start» запускає зараз — робіть обидва (systemctl enable --now). Після будь-якого перезавантаження бот повертається сам, без вашого входу.

systemd, pm2 чи tmux — що обрати?

systemd для всього реального й довгоживучого: рестарт, старт-при-завантаженні й логування нативно, без зайвих інструментів. tmux хороший для швидкого тесту чи інтерактивного прогону. pm2 розумний, якщо живете в Node і хочете його дашборд, але це ще один процес, який треба тримати живим. Для одного постійного бота systemd виграє простотою.

Як зрозуміти, чому бот падає?

journalctl -u yourbot -n 100 показує свіжі логи й помилку, на якій він помер; додайте -f, щоб стежити наживо. Зазвичай тут і ховається реальна причина — відсутня змінна оточення, необроблений виняток, таймаут API. Лагодьте її, не перезапускайте наосліп.

← Back to blogSee plans & pricing →