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
gates / gates (push) Successful in 12m57s
This commit is contained in:
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|''|''
|
||||
Reference in new issue
Block a user