Files
doc/ks4/local-backup-cron.md
T
Julien LutranandClaude Fable 5 a0e3a7dd86 doc: split per-host READMEs, gitea cross-repo links, consistency pass
- nuc/README.md and ks4/README.md carry the host sections (+ network
  flows) that lived in the top-level README; links rebased
- top README: repo links (doc/scripts on git.lutran.fr), index points
  at the new per-host pages
- cross-repo references now use https://git.lutran.fr/julien/scripts
  instead of relative ../scripts paths that resolve nowhere
- plakar-s3-data.md and plakar-incus-integration.md marked SUPERSEDED
  / RETIRED with pointers to restic-backup.md; their measurements and
  rationale kept
- install.md, local-backup-cron.md, incus-copy.md: crontab sections
  updated to the live schedule (01:00 replicas, 05:00 restic, Sun
  maintenance); retired legs labelled as such
- restic-backup.md: status live, cutover recorded, post-GC memory
  estimate, seed plan dated
- seafile-gc.md: online GC noted, stale 'crons commented out' removed
- ks2/: what-ks2-does-today rewritten (nothing writes to it any more),
  legs table and gates reflect restic, decommission steps updated
- db-exclude replaces the plakar-era config name (script keeps a
  fallback)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-28 16:04:07 +02:00

2.0 KiB

local backup cron on ks4 (leg 1)

Enabled 2026-08-22 (both ks4 backup crons had been commented out — no backup of any kind was running). Overview of all legs: ../backup-strategy.md.

What runs now (root crontab on ks4)

0 1 * * * /root/scripts/incus-copy.sh -p backup -s backup >> /var/log/incus-copy.log 2>&1
  • 01:00local leg: incus copy --refresh of all instances into project backup on the sdb5 backup zpool (replaces the old push to ks2; see incus-copy.md). The S3 instance leg (restic-backup.md §6) chains onto this same line once seeded — it reads the replicas this job just refreshed.
  • The rsync stopgap to ks2 (incus-backup.sh, 04:00) and the plakar data leg (04:30) are both retired; S3 backups are restic's job at 05:00.

Cleanup done the same day

  • ks2: incus delete biwiki spot (abandoned instances — freed space on the 95 %-full data pool)
  • ks4: incus delete spot --project backup

Verification

# all instances present, incl. livetrail (first copy is a full send)
sudo incus list --project backup -c ns -f csv
# cron runs land here (manual screen runs don't):
sudo tail /var/log/incus-copy.log /var/log/incus-backup.log
# rsync leg freshness, on ks2:
ls -lat /backup/ns3061243/ | head

Notes:

  • flock in both scripts makes overlapping cron/manual runs abort safely instead of racing.
  • Replicas get boot.autostart=false set by the script — they must never fight the live instances for their static IPs.
  • Keep snapshots.schedule set on the sources so refreshes stay ZFS-incremental (a refresh without common snapshots falls back to rsync). Corollary: the cron must run at least every snapshots.expiry (7 d) — a longer gap expires every common snapshot and the next refresh silently degrades to a full re-send (observed 2026-08-22: seafile re-sent 933 G after the weeks-long gap while the crons were commented out).