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 insnapraid.conf). Repo idf4bf4273…, 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 mergerfsmfs. Restore drill PASS —IMG_8441.heicrestored 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: snapshot3d3668c5, +6.4 GiB — 22,518 new paths underEmbeddedEra/Yaraadded 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-outB2_*+HISTORY_OFFBOX_REPOfor the off-box replica,HISTORY_KUMA_PUSH_URLfor 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. Immichthumbs/andencoded-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. Weeklyprunecan 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.listcache).
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¶
- owned-by: datasets, snapraid-array (the protection), mergerfs-pool
- joins: precious-copy (copy 2 — the NVMe mirror that never deletes; this is copy 3 with history), containers/immich (DB query each run), processes/history-backup, processes/rsnapshot (kept running; shrink its retention once this has weeks of depth)
- looks-like-but-is-not:
Storage-snapshots(rsnapshot, unprotected);docker-backups/(container configs, also excluded).
If you change this¶
- Hits: free space on the pool (repo ≈ live data + deltas; 6.1 TB free) ·
snapraid diffcounts after a prune · the off-box replica ifHISTORY_OFFBOX_REPOis set (restic copypushes 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
dfsays the repo is onmergerfs.
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· reportreports/history-initial-2026-09-08.md