Skip to content

History repo — every nightly version of the photos and projects, inside parity

A restic 0.19.1 repository on the pool holding versioned, deduplicated, encrypted snapshots of immich/{library,upload,backups,profile} + the DB-derived motion-photo originals + EmbeddedEra/. It is the answer to "keep the version history even if a drive dies": the repo is a few thousand immutable pack files, so SnapRAID protects it — unlike rsnapshot's 3.5M-hardlink forest, which never can be.

Why this shape

Storage-snapshots (133 G, disk1 only, excluded) held the only version history and dies with disk1. Putting it in parity would take the array from 45k to 3.6M files and trip the precheck's 500-deletion limit every hour as rsnapshot rotates. A dedup archiver stores the same history as ~thousands of large files that never change after being written — parity-friendly, and the same repo replicates off-box unchanged (item 05).

Shape

  • Repo: /mnt/storage/backups/restic-history (/backups/ is not excluded in snapraid.conf). Repo id f4bf4273…, format v2. Initialised 2026-09-08 16:31.
  • Initial run 2026-09-08 16:35–17:03 (27 min): snapshot 35c93e2b, 21,503 files, 93.66 GiB logical → 90 G on disk in 5,399 pack files, all placed on disk2 by mergerfs mfs. Restore drill PASSIMG_8441.heic restored and byte-identical. Report: reports/history-initial-2026-09-08 (copy of ~/maintenance/output/…).
  • Parity coverage confirmed: the 2026-09-09 03:30 sync ran clean (Everything OK, 14 min) with the repo included. Nightly 09-09 02:50: snapshot 3d3668c5, +6.4 GiB — 22,518 new paths under EmbeddedEra/Yara added that day were captured first night. Until a sync runs after a snapshot, that snapshot's packs are on one disk only — the same-day window every SnapRAID write has.
  • Encryption: password at ~/.config/restic/password (0600, 40 chars). Losing it loses the repo. It must also live in the password manager — it is deliberately not on the rescue USB.
  • Config: ~/.config/restic/env — repo, password file, cache, and commented-out B2_* + HISTORY_OFFBOX_REPO for the off-box replica, HISTORY_KUMA_PUSH_URL for a heartbeat.
  • Retention: keep 30 daily · 12 weekly · 24 monthly · 5 yearly (same shape as rsnapshot, minus hourlies — the job is nightly).
  • Sources are read as angel (plex group); no root anywhere. Immich thumbs/ and encoded-video/ are skipped except the originals the DB says live there (13 today — the Samsung motion-photo trap).
  • Nightly cost: only changed files are read (immich originals are immutable, so history is nearly free); a snapshot adds a handful of pack files → small snapraid diff. Weekly prune can delete packs; the job warns via ntfy if that exceeds 400 (precheck aborts at 500).
  • State + log: ~/.local/state/history-backup/ (history-backup.log, last-<mode>.json, extra-originals.list cache).

What it does and does not promise

Drive that dies Current photos + projects Version history
any one data disk parity parity (from 2026-09-09 forward)
parity disk untouched untouched
NVMe (OS) on the array on the array — if the password is in the password manager
two data disks NVMe copy lost until the off-box replica exists
the whole box lost lost — item 05
  • History before 2026-09-08 (rsnapshot, back to 2026-03) is still disk1-only. Importable as a one-off if it matters.
  • Anything written after 02:50 is unprotected until the next night (parity at 03:30, NVMe at 02:20, this repo at 02:50).
  • downloads/ is excluded from parity by design.

Connected to

If you change this

  • Hits: free space on the pool (repo ≈ live data + deltas; 6.1 TB free) · snapraid diff counts after a prune · the off-box replica if HISTORY_OFFBOX_REPO is set (restic copy pushes every snapshot).
  • Does not hit: the live data (read-only), precious-sync, rsnapshot, containers.
  • Moving the repo off the pool silently removes its parity protection — the job's guard refuses to run unless df says the repo is on mergerfs.

Surfaces

Surface Role
history-backup status snapshots, size, last results
restic snapshots / restic ls latest / restic restore latest --include <path> --target <dir> with ~/.config/restic/env sourced
ntfy plex-hgviaey failures; weekly drill result; prune warnings

See

  • Source: ~/.local/bin/history-backup · ~/.config/restic/env · report reports/history-initial-2026-09-08.md