Перейти к содержимому

Heartbeat для cron, бэкапов и демонов

Самая частая боль системного администратора: cron «как бы работает», но последний бэкап в /var/backups лежит трёхнедельной давности, и ты узнаёшь об этом ровно тогда, когда базу нужно восстанавливать.

Вместо «активной» проверки с дашбордами и алёртами в Prometheus можно сделать пассивную проверку через Heartbeat: cron просто отправляет короткий ping в Notifly при каждом успешном запуске, а если очередной ping не пришёл вовремя — Notifly сам пришлёт уведомление.

app.notifly.ru → раздел HeartbeatsСоздать.

Параметры для классического часового бэкапа:

ПолеЗначение
НазваниеCron бэкапа PostgreSQL
Каналinfra (любой, через который шлёте алёрты)
Интервал (сек)3600 (раз в час)
Допуск (сек)300 (5 минут запас)
Текст alertБэкап PostgreSQL не запустился — проверьте сервер!
Приоритет alert9 — громкое всплывающее уведомление
Текст recoveryБэкап снова работает.

Скопируйте Ping URL из таблицы — он выглядит как https://your-notifly/heartbeat/ping/H....

/etc/cron.d/pg-backup:

NOTIFLY_PING="https://your-notifly/heartbeat/ping/H..."
0 * * * * postgres /usr/local/bin/pg-backup.sh \
&& curl -fsS "$NOTIFLY_PING" -o /dev/null

Ключевая идея: ping вызывается через &&, то есть только при успехе скрипта. Если бэкап вернул ненулевой код — ping не отправится, а через час+5 минут прилетит alert «Бэкап не запустился».

Если вы перешли с cron на systemd timer, drop-in делается без правки оригинала:

Окно терминала
sudo systemctl edit pg-backup.service
[Service]
ExecStartPost=/usr/bin/curl -fsS https://your-notifly/heartbeat/ping/H... -o /dev/null

ExecStartPost исполняется только если основной ExecStart завершился успешно.

Симулируем «упавший» бэкап — заглушим pg-backup.sh так, чтобы он сразу завершался ошибкой:

Окно терминала
sudo systemctl edit --runtime --force fake-broken-backup.service <<EOF
[Service]
Type=oneshot
ExecStart=/bin/false
ExecStartPost=/usr/bin/curl -fsS https://your-notifly/heartbeat/ping/H... -o /dev/null
EOF

Запустите его — ping не уйдёт, а через интервал+допуск секунд придёт push.

  • Бэкапы любых баз и файловых систем — caнит во время паники бесценен.
  • Сертификаты и cron-обновления Let’s Encrypt — heartbeat раз в сутки, алёрт «certbot не отработал».
  • Ротация логов — раз в неделю.
  • Импорт-экспорт между системами — heartbeat на час/день/неделю.
  • IoT-датчики — устройство раз в 5 минут «звонит домой» через curl, пропадание сети тут же приведёт к алёрту.

Если вы знаете, что сервер уйдёт на обслуживание, и не хотите получать ложные алёрты:

  • В админке: иконка ⏸ в строке heartbeat-а;
  • через API: POST /heartbeat/<id>/pause, потом …/resume;
  • через MCP: попросить ассистента «приостанови heartbeat бэкапов на час».

Когда вернётесь — resume, и проверка возобновится с нового времени.

Почему это надёжнее, чем алёрты «при ошибке»

Заголовок раздела «Почему это надёжнее, чем алёрты «при ошибке»»

Активные алёрты («что-то сломалось») молчат, если cron вообще не запустился, если crontab пропал, если сервер выключили. Heartbeat-проверка молчит только тогда, когда всё реально работает: у вас есть и сервер, и cron, и сеть, и скрипт отработал успешно. Любая дырка в этой цепочке — и через минуту вам прилетает уведомление.