Heartbeat для cron, бэкапов и демонов
Самая частая боль системного администратора: cron «как бы работает», но последний бэкап в /var/backups лежит трёхнедельной давности, и ты узнаёшь об этом ровно тогда, когда базу нужно восстанавливать.
Вместо «активной» проверки с дашбордами и алёртами в Prometheus можно сделать пассивную проверку через Heartbeat: cron просто отправляет короткий ping в Notifly при каждом успешном запуске, а если очередной ping не пришёл вовремя — Notifly сам пришлёт уведомление.
Шаг 1. Создаём heartbeat в админке
Заголовок раздела «Шаг 1. Создаём heartbeat в админке»app.notifly.ru → раздел Heartbeats → Создать.
Параметры для классического часового бэкапа:
| Поле | Значение |
|---|---|
| Название | Cron бэкапа PostgreSQL |
| Канал | infra (любой, через который шлёте алёрты) |
| Интервал (сек) | 3600 (раз в час) |
| Допуск (сек) | 300 (5 минут запас) |
| Текст alert | Бэкап PostgreSQL не запустился — проверьте сервер! |
| Приоритет alert | 9 — громкое всплывающее уведомление |
| Текст recovery | Бэкап снова работает. |
Скопируйте Ping URL из таблицы — он выглядит как
https://your-notifly/heartbeat/ping/H....
Шаг 2. Дёргаем ping из cron
Заголовок раздела «Шаг 2. Дёргаем ping из cron»/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 «Бэкап не запустился».
Шаг 3. Та же схема для systemd timer
Заголовок раздела «Шаг 3. Та же схема для systemd timer»Если вы перешли с 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/nullExecStartPost исполняется только если основной ExecStart завершился успешно.
Шаг 4. Проверяем
Заголовок раздела «Шаг 4. Проверяем»Симулируем «упавший» бэкап — заглушим pg-backup.sh так, чтобы он сразу завершался ошибкой:
sudo systemctl edit --runtime --force fake-broken-backup.service <<EOF[Service]Type=oneshotExecStart=/bin/falseExecStartPost=/usr/bin/curl -fsS https://your-notifly/heartbeat/ping/H... -o /dev/nullEOFЗапустите его — 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, и сеть, и скрипт отработал успешно. Любая дырка в этой цепочке — и через минуту вам прилетает уведомление.