EQVPS

Дръж бот работещ 24/7 на VPS (така че никога да не умира тихо)

15.06.2026 г. · 3 мин четене · EQVPS Team

Има два начина, по които бот „не работи“ на сървър. Очевидният: спира в секундата, в която затвориш SSH. Коварният: работи добре два дни, срива се в 4 сутринта на някаква необработена грешка, а ти научаваш часове по-късно, когато някой попита защо е паднал. И двата имат едно и също решение, и то не е „помни да го рестартираш“ — то е да предадеш работата на systemd, който държи нещата включени, за да не се налага ти.

Защо умира, когато излезеш

Ако си го стартирал с python bot.py в SSH сесията си, процесът е дете на тази сесия. Затвори сесията, процесът си отива с нея. nohup и & замазват това, но не ти дават рестарт-при-срив и старт-при-boot — така че си решил малкия проблем и си запазил големия.

Реалното решение: 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

Два реда вършат тежката работа:

Когато все още се държи зле — прочети логовете

Бот, който продължава да прави crash-loop, не се поправя с по-силно рестартиране; нещо реално е сгрешено. systemd хваща stdout/stderr, така че:

systemctl status mybot          # включен или паднал, последен exit code
journalctl -u mybot -n 100      # скорошни логове + грешката, на която е умрял
journalctl -u mybot -f          # следи на живо

Причината почти винаги е точно там: липсваща environment променлива, необработено изключение, API timeout, OOM kill. Поправи товаRestart=always е предпазна мрежа, не лек за реален бъг.

Съвет: ако логовете показват, че ботът бива убит за памет, надраснал си машината — виж ръководството за оразмеряване.

Кога tmux или pm2 имат смисъл вместо това

systemd не е единственият отговор, само най-добрият избор по подразбиране:

За единичен винаги включен бот или агент, systemd е най-простото нещо, което реално работи — вече е на сървъра, не се нуждае от допълнителен инструментариум и прави рестарт, старт-при-boot и логване извън кутията.

Честното заключение

Времето на работа не е за по-голям сървър или повече дисциплина — то е за това да не връзваш процеса си към лаптопа си. Увий го в systemd unit с Restart=always и enable, и проверявай journalctl, когато нещо не е наред. Направи това веднъж и ботът ти стои включен, независимо дали гледаш, или спиш. (Нова машина? Заключи я първо — винаги включен бот е и винаги включена цел.)


Нужно ти е къде да го пуснеш? Nano план ($3/месец) държи бот жив 24/7 — systemd прави останалото.

Въпроси

Защо ботът ми спира, когато затворя SSH?

Защото си го стартирал вътре в SSH сесията си, така че е вързан към тази сесия и умира, когато се разкачиш. Решението е да го пуснеш като фонова услуга, независима от входа ти — systemd е чистият начин, tmux е бързият начин.

Как да авто-рестартирам бот, когато се срине?

Пусни го като systemd услуга с Restart=always и малко забавяне RestartSec. systemd тогава пренасочва процеса в рамките на секунди след всеки срив, безкрайно, без бавачене. Този единствен ред е разликата между „умря в 4 сутринта“ и „примигна и се възстанови“.

Как да накарам бот да стартира автоматично след рестарт?

systemctl enable на услугата ти. 'enable' я свързва да стартира при boot, 'start' я пуска сега — направи и двете (systemctl enable --now). След всеки рестарт ботът се връща сам, без ти да влизаш.

systemd или pm2 или tmux — кой да използвам?

systemd за всичко реално и дълготрайно: то се справя с рестарт, старт-при-boot и логване нативно, без допълнителен инструментариум. tmux е чудесен за бърз тест или гледане на интерактивно изпълнение. pm2 е разумен, ако живееш в Node и искаш таблото му, но е още едно нещо за поддържане живо. За единичен винаги включен бот systemd печели на простота.

Как да видя защо ботът ми продължава да се срива?

journalctl -u yourbot -n 100 показва скорошните логове и грешката, на която е умрял; добави -f, за да следиш на живо. Тук обикновено се крие реалната причина — липсваща env променлива, необработено изключение, API timeout. Поправи това, не рестартирай сляпо.

← Обратно към блогаВиж планове и цени →

Коментари

Още няма коментари. Бъди първият.

Остави коментар

Коментарите се модерират преди да се появят.