Backups
Monitor your database backups
Get alerted the moment a nightly backup doesn't run — instead of discovering it during a restore.
The problem
Backups are the classic silent failure. The cron job runs, the dump fails — disk full, expired credentials, a network blip — and nothing tells you. You find out weeks later, mid-incident, when the restore you desperately need turns out to be empty or missing entirely.
How SteadyCron solves it
- 1 Create a heartbeat check matching your backup schedule (e.g. daily at 02:00) and set a grace period that absorbs normal variance.
- 2 At the end of your backup script, ping SteadyCron on success — and explicitly on failure if the dump command errors.
- 3 If the success ping doesn't arrive within the grace period, SteadyCron alerts you via email, Slack, Discord, Telegram, or webhook.
#!/usr/bin/env bash
TOKEN=<your-ping-token>
if pg_dump "$DATABASE_URL" | zstd | age -r "$KEY" > /backups/db.sql.zst.age; then
curl -fsS https://ping.steadycron.com/$TOKEN
else
curl -fsS https://ping.steadycron.com/$TOKEN/fail
fi
Jobs
| weekly-digest-email | HTTP | 0 9 * * 1 | in 2 days | 3 days ago | ||
| nightly-db-backup | Heartbeat | 0 2 * * * | in 19 h | 5 h ago | ||
| stripe-reconciliation | HTTP | 0 */4 * * * | in 38 min | 3 h ago | ||
| cache-warmup | HTTP | */15 * * * * | in 11 min | now | ||
| search-index-sync | Heartbeat | */30 * * * * | in 6 min | 24 min ago |
| seed-test-data | HTTP | 0 4 * * * | in 14 h | 10 h ago | ||
| preview-env-cleanup | Heartbeat | 0 */6 * * * | in 2 h | 4 h ago | ||
| trial-expiry-sweep | HTTP | 0 6 * * * | — | yesterday |
Every job's status, schedule, and last run — at a glance.
Why a heartbeat, not just an exit code
Your script’s exit code only matters if something is watching it — and on a lone VM, nothing is. A heartbeat moves the “did it run?” question off the box that might itself be down. If the server reboots, the disk fills, or cron is misconfigured, the ping simply never arrives, and SteadyCron tells you.
Catch backups that hang, too
Send a /start ping at the top of the script. If a backup begins but never sends
its /success or /fail — because it hung on a lock or ran out of memory —
SteadyCron flags the run as stuck, not just late.
Related documentation
Stop finding out the hard way
Start on the free tier — no credit card required.
Start free