Skip to content

Schedules — everything that runs on a clock, in clock order

One table. If it is not here it does not run. Times are local (America/New_York).

When What Mechanism Runs as Log / result
every 1 min restart wg-easy if stopped wg-docker-watchdog.timer root journal
every 5 min VPN egress check → homer tile angel crontab vpn-check angel ~/torrentvpn/homer/assets/vpn-status.json
hourly :00 rsnapshot hourly (24 kept) /etc/cron.d/rsnapshot root rsnapshot's own
01:00 docker-backup.sh/mnt/storage/docker-backups/snapshots/ (7 kept) root crontab root /var/log/docker-backup.log
01:30 rescue-sync.sh/mnt/rescue archive + host/ + Kuma heartbeat root crontab root /var/log/rescue-sync.log
02:00 Immich nightly DB dump (14 kept) Immich internal container /mnt/storage/immich/backups/
02:20 precious-sync.sh copy + sampled verify angel crontab angel /var/log/precious-sync.log
02:30 / 02:35 Sun / 02:40 1st / 02:45 Jan 1 rsnapshot daily / weekly / monthly / yearly /etc/cron.d/rsnapshot root
02:50 history-backup backup — restic snapshot into the parity-protected repo angel crontab angel ~/.local/state/history-backup/history-backup.log
03:00 Tue / Thu / Sat smartd long self-test sdc / sdd / sdb; short tests nightly 02:00–03:00 /etc/smartd.conf -s smartd smartctl -l selftest; ntfy on failure
03:15 erp-backup backup — encrypted DB dumps (InvenTree/listmonk/immich) + vaultwarden sqlite → local + R2 embeddedera-backups angel crontab angel ~/.local/state/erp-backup/erp-backup.log; ntfy on failure
03:30 daily SnapRAID sync via guard → precheck → snapraid -l … sync snapraid-sync.timer (Persistent) root /var/log/snapraid/sync-YYYYMMDD.log; snapraid-alert@ on failure
03:45 training-sync prealarm (deadline 04:30) angel crontab angel ~/.claude/routines/training-sync.log, last-run-prealarm.json
04:00 Sun SnapRAID scrub -p 12 -o 7 snapraid-scrub.timer (Persistent) root /var/log/snapraid/scrub-YYYYMMDD.log
05:00 1st Sun precious-sync.sh --verify-full (sha256 every file) angel crontab angel precious log
05:30 Sun history-backup weekly — prune, 2 % data check, restore drill, off-box copy angel crontab angel history log; ntfy on drill/prune
06:10 training-sync morning (deadline 13:00) angel crontab angel routines log
06:15 Sun erp-backup verify — restores newest InvenTree dump into a throwaway postgres, checks row counts angel crontab angel ~/.local/state/erp-backup/erp-backup.log; ntfy on failure
07:15 (+≤5 min) sop-tasks --yes — failing sop-audit checks ↔ Kanboard tasks (SOP-017), after the 06:50 Monday audit sop-tasks.timer (Persistent, user) angel (systemd --user) stdout via journalctl --user -u sop-tasks
05:30 Sunday kicad-check.timer ERC/DRC across every KiCad project, saved for the audit
23:40 daily tasks-metrics.timer snapshot the task register into the reports DB for Grafana
06:40 + 15:40 daily surfaces-check.timer internal pages: gate holds, page renders, scripts parse, APIs answer
every 5 min task-verify.timer checks every task in a Review column against its Verify: block; closes it, bounces it with Missing:, or asks a human verifier (SOP-017 v1.1)
07:20 daily kanboard-cron.timer Kanboard's own cronjob: overdue notifications, recurring tasks
hourly :05, 07–21 tasks-notify.timer one batched email per person when something happened on their tasks (assigned, Verified, Missing, check waiting, closed); under the daily mail budget
07:30 daily tasks-digest.timer one email per person: overdue, due today, due this week
09:30 daily tasks-digest-canary.timer pages if the digest did not run at all
09:00 (+≤5 min) rescue-watchdog — archive age/size/device check rescue-watchdog.timer (Persistent) root /var/log/rescue-watchdog.log
21:00 training-sync evening (deadline 23:45) angel crontab angel routines log
one-shot 09-08 23:00 · 09-09 08:00 · 09-11 08:00 maint-badblocks · maint-drill · maint-dedupe (hardening items 17, 15, 16 B) maint-*.timer, dated, not Persistent root ~/maintenance/output/<job>-<date>.md + ntfy — see processes/scheduled-maintenance
continuous hd-idle spins parity down after 1800 s idle hd-idle.service root /var/log/hd-idle.log
continuous smartd 30-min attribute poll → /var/lib/smartmontools/attrlog.*.csv smartmontools.service root those CSVs (world-readable)
Sun 03:10 e2scrub_allno-op (LVM only, no LVs) e2scrub_all.timer root

Ordering that matters: docker-backup (01:00) before rescue-sync (01:30); Immich dump (02:00) before precious-sync (02:20) before history-backup (02:50) before the 03:30 sync (so parity covers the new packs); sync (03:30) before scrub (Sun 04:00); sdb's Saturday long test may defer past 03:00 under standby and overlap Sunday's scrub — harmless, slower.

Root's crontab is not readable by angel; the 01:00/01:30 entries are asserted by rescue-sync.sh:5-6 and the log timestamps (01:00, 01:31–01:35 on 09-08).

Connected to

If you change this

  • Hits: the ordering above · rescue-watchdog MAX_AGE_H=30 assumes a nightly build · training-sync deadlines are hard-coded per mode (training-sync:20-22).
  • Does not hit: anything not on this table.

See

  • Source: systemctl list-timers --all · crontab -l · /etc/cron.d/rsnapshot · /etc/smartd.conf