Night brief part 2 (run by day 2026-10-20): register 160 -> 156 (closed R-1001, R-1011, R-1167, R-1070, R-1010, R-893, R-1169; opened R-1171..R-1173; R-1019/R-462 narrowed, R-49 READY -> D21, R-1083 re-stated); 07 §6.3 option A as the design; STATUS morning list; report part 2; P4 Immich plan, P7 release evidence
gates / gates (push) Successful in 12m57s

This commit is contained in:
admin committed 2026-10-20 11:06:00 +02:00
1 parent bcaa9576b2
commit 5c487313fa
12 files changed
+327 -24

No files matched your search

@@ -0,0 +1,45 @@
# 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.
@@ -0,0 +1,4 @@
# per-box floors 0.336.0 / MinAgent 0.158.1 set 08:51:06Z; image sha256:93cd67d871125877e935a024765075b5a0b7c0e7683e1165976ff7a654fe8d73 (clean clone 93fb251; rc.1 on 9202 first)
demo-felhom|0.336.0|2026-10-20 08:54:55
demo-hp|0.336.0|2026-10-20 08:54:56
tester-1|0.336.0|2026-10-20 08:54:54
@@ -0,0 +1,27 @@
=== demo-hp (enkisfelhom.hu) 08:53:38
containers: 24 running; not healthy/running: traefik Up 4 days;
unhealthy: 0
2026/10/20 08:51:19 updater.go:855: [INFO] [selfupdate] Post-update startup: update successful (0.335.0 → 0.336.0)
allow-list refusals since start: 0
2026/10/20 08:51:19 sync.go:142: [INFO] [sync] Initial sync: Sablonok naprakészek — nincs változás
installed apps (stacks with app.yaml): 12
public https://felhom.enkisfelhom.hu/: 302
public https://files.enkisfelhom.hu/: 200
=== demo-felhom (demo-felhom.eu) 08:53:41
containers: 9 running; not healthy/running: traefik Up 4 days;
unhealthy: 0
2026/10/20 08:51:08 [INFO] [selfupdate] Post-update startup: update successful (0.335.0 → 0.336.0)
allow-list refusals since start: 0
2026/10/20 08:51:11 [INFO] [sync] Initial sync: Sablonok naprakészek — nincs változás
installed apps (stacks with app.yaml): 5
public https://felhom.demo-felhom.eu/: 302
public https://files.demo-felhom.eu/: 200
=== tester-1 (enkicsifelhom.hu) 08:53:42
containers: 10 running; not healthy/running: traefik Up 4 days;
unhealthy: 0
2026/10/20 08:51:18 [INFO] [selfupdate] Post-update startup: update successful (0.335.0 → 0.336.0)
allow-list refusals since start: 0
2026/10/20 08:51:19 [INFO] [sync] Initial sync: Sablonok naprakészek — nincs változás
installed apps (stacks with app.yaml): 3
public https://felhom.enkicsifelhom.hu/: 302
public https://files.enkicsifelhom.hu/: 200
@@ -0,0 +1,33 @@
control NEGATIVE (a stub answering 200 over plain http): convicted, as it must (200 -)
== tester-1 (enkicsifelhom.hu): 6 public name(s)
OK control POSITIVE http://felhom.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://felhom.enkicsifelhom.hu/r1033-check?q=1
OK http://files.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://files.enkicsifelhom.hu/r1033-check?q=1
OK http://no-such-name-r1033.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://no-such-name-r1033.enkicsifelhom.hu/r1033-check?q=1
OK http://paperless.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://paperless.enkicsifelhom.hu/r1033-check?q=1
OK http://paste.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://paste.enkicsifelhom.hu/r1033-check?q=1
OK http://wiki.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://wiki.enkicsifelhom.hu/r1033-check?q=1
== demo-hp (enkisfelhom.hu): 14 public name(s)
OK http://arcade.enkisfelhom.hu/r1033-check?q=1 -> 301 https://arcade.enkisfelhom.hu/r1033-check?q=1
OK http://books.enkisfelhom.hu/r1033-check?q=1 -> 301 https://books.enkisfelhom.hu/r1033-check?q=1
OK http://docs.enkisfelhom.hu/r1033-check?q=1 -> 301 https://docs.enkisfelhom.hu/r1033-check?q=1
OK http://felhom.enkisfelhom.hu/r1033-check?q=1 -> 301 https://felhom.enkisfelhom.hu/r1033-check?q=1
OK http://files.enkisfelhom.hu/r1033-check?q=1 -> 301 https://files.enkisfelhom.hu/r1033-check?q=1
OK http://gist.enkisfelhom.hu/r1033-check?q=1 -> 301 https://gist.enkisfelhom.hu/r1033-check?q=1
OK http://ha.enkisfelhom.hu/r1033-check?q=1 -> 301 https://ha.enkisfelhom.hu/r1033-check?q=1
OK http://no-such-name-r1033.enkisfelhom.hu/r1033-check?q=1 -> 301 https://no-such-name-r1033.enkisfelhom.hu/r1033-check?q=1
OK http://papir.enkisfelhom.hu/r1033-check?q=1 -> 301 https://papir.enkisfelhom.hu/r1033-check?q=1
OK http://paste.enkisfelhom.hu/r1033-check?q=1 -> 301 https://paste.enkisfelhom.hu/r1033-check?q=1
OK http://pdf.enkisfelhom.hu/r1033-check?q=1 -> 301 https://pdf.enkisfelhom.hu/r1033-check?q=1
OK http://plex.enkisfelhom.hu/r1033-check?q=1 -> 301 https://plex.enkisfelhom.hu/r1033-check?q=1
OK http://travel.enkisfelhom.hu/r1033-check?q=1 -> 301 https://travel.enkisfelhom.hu/r1033-check?q=1
OK http://wiki.enkisfelhom.hu/r1033-check?q=1 -> 301 https://wiki.enkisfelhom.hu/r1033-check?q=1
== demo-felhom (demo-felhom.eu): 8 public name(s)
OK http://felhom.demo-felhom.eu/r1033-check?q=1 -> 301 https://felhom.demo-felhom.eu/r1033-check?q=1
OK http://files.demo-felhom.eu/r1033-check?q=1 -> 301 https://files.demo-felhom.eu/r1033-check?q=1
OK http://gist.demo-felhom.eu/r1033-check?q=1 -> 301 https://gist.demo-felhom.eu/r1033-check?q=1
OK http://no-such-name-r1033.demo-felhom.eu/r1033-check?q=1 -> 301 https://no-such-name-r1033.demo-felhom.eu/r1033-check?q=1
OK http://prowlarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://prowlarr.demo-felhom.eu/r1033-check?q=1
OK http://radarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://radarr.demo-felhom.eu/r1033-check?q=1
OK http://sonarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://sonarr.demo-felhom.eu/r1033-check?q=1
OK http://torrent.demo-felhom.eu/r1033-check?q=1 -> 301 https://torrent.demo-felhom.eu/r1033-check?q=1
== every public name redirects http -> https
@@ -0,0 +1,16 @@
== demo-hp
dashboard sign-in: 302
the Fajlok button goes to: https://files.enkisfelhom.hu/_felhom/sso
the pass answer goes to: https://files.enkisfelhom.hu/files/; files cookie set: 1
FileBrowser with the files cookie: felhom-household admin: False modify: True
FileBrowser without it, a fresh browser: HTTP 401
dashboard sign-out: 302
after the sign-out, the files cookie sends the browser to: https://felhom.enkisfelhom.hu/__files/open?to=%2Ffiles%2F
== tester-1
dashboard sign-in: 302
the Fajlok button goes to: https://files.enkicsifelhom.hu/_felhom/sso
the pass answer goes to: https://files.enkicsifelhom.hu/files/; files cookie set: 1
FileBrowser with the files cookie: felhom-household admin: False modify: True
FileBrowser without it, a fresh browser: HTTP 401
dashboard sign-out: 302
after the sign-out, the files cookie sends the browser to: https://felhom.enkicsifelhom.hu/__files/open?to=%2Ffiles%2F
@@ -0,0 +1,22 @@
2026-10-20T08:54:35Z
global floor:
HTTP/1.1 303 See Other
Location: /configuration?flash=floor_set
read back (hub DB with WAL):
min_controller_version|0.336.0
min_controller_version_declared_min_agent|0.336.0=0.158.1
clear the per-box floors:
== tester-1
HTTP/1.1 303 See Other
Location: /customers/tester-1?flash=floor_set
== demo-hp
HTTP/1.1 303 See Other
Location: /customers/demo-hp?flash=floor_set
== demo-felhom
HTTP/1.1 303 See Other
Location: /customers/demo-felhom?flash=floor_set
Error: in prepare, no such table: customers
per-box floors after the clear (customer_configs):
demo-felhom|''|''
demo-hp|''|''
tester-1|''|''