Однажды у меня на проде «упал» процесс, и это случилось как раз в пятницу вечером — конечно же, я уже отключилась от работы. Сайт, завязанный на этом процессе, просто перестал отвечать. И всё это время, пока я пила чай и смотрела сериал, никто не понимал, что случилось. В понедельник — ах да, извините, забыли поставить авто‑перезапуск в
systemd
Сегодня расскажу, как настроить auto-healing на VPS с помощью systemd, чтобы сервисы сами восстанавливались при сбоях. Подойдёт для Ubuntu, Debian, CentOS — везде, где есть
systemd
Зачем вообще нужен auto-healing?
Если приложение или скрипт внезапно упал, а вы об этом узнаёте спустя сутки — это упущенные пользователи, ошибки в логах и стресс. Особенно если VPS используется для:
- микросервисов,
- веб-серверов (nginx, Apache),
- прокси,
- Telegram-ботов,
- VPN-сервисов (WireGuard, OpenVPN),
- cron-скриптов.
Решение — systemd restart on failure
Пример из моей практики: auto-restart для Node.js
У меня был простой сервис на Node.js, который обрабатывал API-запросы. Иногда он крашился при особых типах данных, пока я не нашла баг. Чтобы не ждать, пока я починю всё, я добавила auto-restart в его юнит:
[Unit] Description=My Node.js API After=network.target [Service] ExecStart=/usr/bin/node /home/myuser/my-api/index.js Restart=on-failure RestartSec=5 StartLimitBurst=3 StartLimitIntervalSec=60 User=myuser Environment=NODE_ENV=production [Install] WantedBy=multi-user.target
Сохраняем файл как
/etc/systemd/system/my-api.service
Теперь, если процесс “падает”,
systemd
Расшифровка параметров:
- — перезапускать, если процесс завершился с ошибкой.
Restart=on-failure
- — ждать 5 секунд перед перезапуском.
RestartSec=5
- и
StartLimitBurst=3
— максимум 3 перезапуска за 60 секунд.StartLimitIntervalSec=60
- — путь до исполняемого файла.
ExecStart
Также поддерживаются другие значения
Restart
Параметр | Что означает |
---|---|
no | Не перезапускать (по умолчанию) |
always | Перезапускать всегда, даже при exit 0 |
on-failure | Только если завершилось с ошибкой |
on-abnormal | Только при сигнале или core dump |
on-watchdog | При watchdog timeout |
on-abort | Только если завершено сигналом |
Как отследить ошибки: systemctl
и логи
systemctl
После настройки можно наблюдать поведение:
sudo systemctl status my-api
Если хотите увидеть, почему сервис «упал» — смотрим:
journalctl -u my-api
Если сервис упал слишком часто, и systemd его «заморозил», нужно сбросить счётчик:
sudo systemctl reset-failed my-api
Ещё примеры из жизни
Telegram-бот
[Service] ExecStart=/usr/bin/python3 /home/user/bot/main.py Restart=always RestartSec=10
WireGuard туннель
[Service] ExecStart=/usr/bin/wg-quick up wg0 ExecStop=/usr/bin/wg-quick down wg0 Restart=on-failure RestartSec=3
Прокси на Go
[Service] ExecStart=/usr/local/bin/myproxy Restart=always RestartSec=5 User=proxyuser
systemd health-check (ждём как родного)
Если вы хотите ещё более продвинуто — можно настроить WatchdogSec
NotifyAccess=all
sd_notify
Вопрос: а что если VPS ребутнулся?
Тогда просто добавьте:
[Install] WantedBy=multi-user.target
И выполните:
sudo systemctl enable my-api
Теперь сервис запустится при старте системы.
В результате…
Если бы мне кто-то сказал ещё на старте моей практики, что одна строчка
Restart=on-failure
systemd
VPS на год? Мы добавим сверху
Сэкономьте месяц — просто введите