Skip to content

chore(secrets): point the heartbeat at a watcher that expects it (#407) - #408

Merged
Gerrrt merged 1 commit into
mainfrom
gerrrt/heartbeat-to-healthchecks-407
Sep 9, 2026
Merged

chore(secrets): point the heartbeat at a watcher that expects it (#407)#408
Gerrrt merged 1 commit into
mainfrom
gerrrt/heartbeat-to-healthchecks-407

Conversation

@Gerrrt

@Gerrrt Gerrrt commented Sep 9, 2026

Copy link
Copy Markdown
Owner

The heartbeat now pings a healthchecks.io check instead of ntfy.sh. This is the fix #359 asked for and the one that empties #407's problem in one step: ntfy's free budget goes back to the three real channels.

Secret: ALERTMANAGER_HEARTBEAT_URL re-keyed to the check's ping URL. Set by the operator with make secrets-edit; the encrypted file is the only thing in this diff. Value length checked (56 bytes), never printed.

Verified on the live stack after make render && make reload:

  • check_alert_channels.py --live: heartbeat_url points at hc-ping.com, which watches for absence — PASS, where it warned before.
  • 20 webhook deliveries in the two hours since, zero failures, no Alertmanager errors.
  • ntfy 429s stopped.

Docs: verify-the-alert-path.md's watcher banner becomes Done 2026-09-09 with the email-not-ntfy reasoning; observability.md's dead man's switch paragraphs say armed and not yet proven. The drill that proves it is #288, now runnable.

Checks: make check-docs, scripts/lint.sh, check_sops_rules.py, check-sops-encrypted.sh.

Refs #288, #359, #407.

🤖 Generated with Claude Code

Every receiver posted to ntfy.sh, the heartbeat included. ntfy is a push
service and cannot notice a ping that never arrives (#359), and the 5-minute
heartbeat was spending about 240 of ntfy.sh's 250 free messages a day, so
real alerts were refused at the end of every day (#407) — nine criticals on
2026-09-08 among them.

ALERTMANAGER_HEARTBEAT_URL now points at a healthchecks.io check, period 5m,
grace 15m, notifying by email rather than through ntfy, since the whole
house shares one public address and one ntfy budget. Set from the main
checkout with make secrets-edit; re-encrypted here, never decrypted in the
open. check_alert_channels.py --live reads the destination as hc-ping.com
and passes. Measured after the reload: 20 webhook deliveries in two hours,
zero failures, and ntfy's 429s stopped.

The runbook's "this has not been done" banner becomes "done 2026-09-09", and
observability.md says the switch is armed and not yet proven — the drill is
#288, which this unblocks. Refs #288, #359, #407.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@Gerrrt
Gerrrt merged commit e537f3d into main Sep 9, 2026
3 checks passed
@Gerrrt
Gerrrt deleted the gerrrt/heartbeat-to-healthchecks-407 branch September 9, 2026 02:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The heartbeat receiver is not a dead man's switch — nothing watches for its absence

1 participant