Files
felhom.eu/documentation/audits/night2-2026-10-20/P4/immich-offsite-plan.md
T

46 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# R-49 — Immich's off-site copy: what it holds, and two ways to shrink it (2026-10-20)
Status: **measure and plan only — nothing changed.** Night brief part 2 (run by day), Part 4. Architecture: `07-backup-architecture.md`
(the off-site tier = the recovery unit + the app's mandatory data). Measured read-only on scratch guest 9202 (demo-hp), Immich
v3.2.4 + `ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0`, data on the drive `/mnt/sizing-bench`, 09:0x UTC.
## What today's off-site copy holds
The off-site tier copies the recovery unit (`backups/primary/immich/`, 1 160 553 825 B) and the mandatory drive folder
`appdata/immich/` (166 077 159 B) — about **1.33 GB** in all. The external library `media/photos` is `optional` (not off-site;
0 B here anyway).
| Part | Where | Bytes | Share | Can it come back without the copy? |
|---|---|---:|---:|---|
| ML model cache | unit `volume-dumps/immich_immich_ml_cache.tar` (volume 823 835 298 B) | 823 764 480 | 62 % | **Yes** — Immich downloads the models again when a smart-search or face job first needs them |
| Raw database folder | unit `volume-dumps/immich_immich_postgres_data.tar` (volume 282 169 461 B) | 283 049 472 | 21 % | **Yes, if** a restore from the logical dump alone is proven (below) |
| Immich's own database backups | `appdata/immich/backups/` | 115 367 547 | 9 % | Yes — a second copy of what the logical dump already holds; it grows every night |
| Logical database dump | unit `db-dumps/immich-postgres.sql` | 53 711 763 | 4 % | **No** — this IS the household's albums, people, metadata |
| Originals | `appdata/immich/upload/` | 48 673 663 | 4 % | **No** — the photos themselves |
| Thumbnails | `appdata/immich/thumbs/` | 2 035 910 | <1 % | Yes — Immich regenerates them |
| Redis | volume `immich_immich_redis_data` (31 594 479 B) | — | — | not in the unit (a queue cache) |
**What must survive: 102 MB of 1.33 GB (8 %).** The 2026-07-19 measurement (R-49) said the same shape: ~60 % model cache.
## Two options
| | A — leave out all three re-fetchable parts | B — leave out only the model cache |
|---|---|---|
| Off-site size here | ~105 MB (dump + originals + thumbnails + unit metadata) — **−92 %** | ~510 MB — **−62 %** |
| What a restore then needs | the models download again (~824 MB, from Immich's model host) before smart search and face recognition work again — the photos, albums and timeline work at once; the database is rebuilt from the logical dump alone into an EMPTY volume (no raw folder to lay under it) | the models download again, as in A; the database comes back as today (volume, then dump) |
| The proof it needs | (1) one off-site restore of Immich onto a box with an empty model cache: photos and albums read back, then a smart search answers after the download (time measured); (2) **one off-site restore from the dump alone** into an empty database volume, on this vectorchord image: the extensions and vector indexes come back, the row counts match, Immich starts and searches — today's restore always lays the raw folder first, so this has never been run | only proof (1) |
| Risk | the dump-only database restore is the unmeasured part; if the vector extension needs more than the dump gives, a restore would fail where it works today (option A's put-back keeps the app as it was, but the backup would be weaker) | none new: the cache is a cache |
| Also | Immich's own `backups/` folder needs a catalog class (`excluded`) — a template change in the `hdd` block | a catalog change: the model-cache volume marked as not captured |
Not measured today: the model download's time and size on a real line (the 824 MB is the cache as it stands, which holds every
model this box used); the off-site bytes after restic's compression and de-duplication (the table is the plain size).
## Pick: B now, then A's other two parts after proof (2)
B removes 62 % of the copy with no new risk — the strongest case R-49 named first — and needs only proof (1). The raw database
folder and Immich's own backups are another 30 %, but leaving out the raw folder changes HOW the database comes back, and that
path has never run for this extension image; it should be a separate step with its own proof, not ride along.
**If the operator does nothing:** every Immich household keeps sending ~12× its real data off-site each night, against its
quota and transfer.