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_all — no-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¶
- joins: every process card; alerting
If you change this¶
- Hits: the ordering above ·
rescue-watchdogMAX_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