46 lines
4.3 KiB
Markdown
46 lines
4.3 KiB
Markdown
# 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.
|