diff --git a/CONTEXT.md b/CONTEXT.md index bdd0c114..237c2894 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -16,6 +16,21 @@ > and holds nothing of its own; this file does hold its own content, namely the standing rulings below. +> **2026-09-30 (day) — operator notes, and the last six PostgreSQL apps.** Notes recorded first (`09` §3): **the brief +> ran by day** — every backup and automatic-update test started by hand (the night chain's debug action; demo-hp's +> window moved for the test and put back), nothing waited for a night; **Tester-2's pre-checks** (the Cloudflare tunnel +> route, the two connect mails) were confirmed done by the operator. Decision 52 (seed through the database) was offered +> by the reviewer and **NOT used** — all three hard apps have a front-door seed (outline `installation.create`, rallly +> sign-up with its own e-mail code read from its table, sparkyfitness better-auth), so it is not recorded. **Outcome:** +> catalog `25ffd89` rallly, `aeb0cd6` outline, `1666572` sparkyfitness (15) → PostgreSQL 18, each bench + box 9202 + one +> undo case; zipline, adventurelog, immich STAY (upstream runs the same or an older major) — **R-463 CLOSED, 8 of 11 +> moved**. Part F (both venues, one commit each): bookstack 26.09.1 `54ca055`, kimai 2.67.0 `d75d1fd` (the plain tag = the +> Apache image by digest), audiobookshelf 2.37.1, n8n 2.42.1, navidrome 0.64.2, grafana 13.2.3, komga 1.28.0; immich v3.2.4 +> NOT moved — its first start at today's pin OOM-killed its database on the bench (R-732). Rows: R-730, R-731, R-732. +> **R-687 item 4 proven live on demo-hp** (two deferrals, the backup after the leg, success). Currency audit: +> `audits/catalog-currency-2026-09-30.md` (31 apps can update at night after the session). No controller/agent/hub +> release. Report: `REPORT-pg-last-six-2026-09-30.md`. + > **2026-09-30 — operator rulings 50 (apps go off-site by themselves, A) and 51 (ep0 drill archives removed; the > restore test takes only the box's own).** `09` §3. 50: when the customer has off-site, every newly installed app is > in the off-site copy; over quota the page names the largest and the household chooses; history is never deleted to diff --git a/REPORT-pg-last-six-2026-09-30.md b/REPORT-pg-last-six-2026-09-30.md new file mode 100644 index 00000000..ea72a6f4 --- /dev/null +++ b/REPORT-pg-last-six-2026-09-30.md @@ -0,0 +1,74 @@ +# REPORT — 2026-09-30 (day): the last six PostgreSQL apps, the demo boxes by day, the gate's wait seen live, catalog currency, stale rows + +**Tester-2 (read only, hub `GET /configs` + `/hosts`, 12:03 CEST):** +- The customer record `Tester-2` (sajatfelhom.hu) exists; config `v0.283.1 MANAGED`. +- **No box has registered** — status and version read `—`, no host in `/hosts`. +- So no installed apps and no `app_update.unattended` value exist to read yet. + +## The Part table + +| part | outcome | why / where | +|---|---|---| +| 0 Tester-2 | **done** (3 lines above) | `audits/pg-last-six-2026-09-30/P0/` | +| A1 upstream table | **done** — 3 target 18, 3 stay | `audits/pg-last-six-2026-09-30/README.md`, `A1/upstream-notes.md` | +| A2 special images | **done, no build** — immich and adventurelog both stay by the rule; immich's 18 images would also swap an extension | same | +| A3 fixtures | **done** — sparkyfitness, rallly, outline all through the front door; decision 52 NOT needed | catalog `e6f3ec2` | +| A4 two venues + undo | **done** — rallly `25ffd89`, outline `aeb0cd6`, sparkyfitness `1666572` → 18; one undo case each; none `memory_tight` | `bench/`, `box/` | +| B demo boxes by day | **done / changed** — no demo box has any of the three moved PostgreSQL apps (nothing installed for it); the Part F apps bookstack + kimai on demo-hp were stepped by the chain press of Part C and read „Naprakész" after | `C/C1-*`, `C/C9-after.txt` | +| C gate waits for the leg | **done — PROVEN LIVE** on demo-hp: two deferral lines while the leg stepped two apps, the backup started on the first poll after the leg ended, and succeeded (9.98 GB); config + window put back and read back | `C/README.md` | +| D catalog currency | **done** — 25 of 53 behind inside a major, 19 across; night-updatable **28 (+1) → 31 (+1)** after the session | `audits/catalog-currency-2026-09-30.md` | +| E stale rows | **done** — R-463 closed, R-446 + R-440 narrowed, STATUS; **E4 changed:** no tag — the ISO's build commit cannot be proven and `installer-v*` is the wrong line → R-730 | `E/` | +| F more self-updating apps | **7 of 8 done** — bookstack, kimai, audiobookshelf, n8n, navidrome, grafana, komga; **immich not moved** (first start OOM on the bench, twice → R-732) | `F/README.md` | + +No controller, agent or hub release. The golden is not behind anything new; the waiver runs to 2026-10-04 (a weekly bake is due +before then — unchanged by this session). + +## Claims in the brief that turned out wrong (or right), named + +- **Six apps and images as listed** — right. +- **"outline and rallly have no front-door seed route"** — WRONG. outline: `POST /api/installation.create` (its self-hosted + first run). rallly: its own sign-up, with the e-mail code read from its own `verifications` row in place of a mailbox. +- **zipline "closed sign-up, no route" (R-624)** — WRONG for a fresh install: `POST /api/setup` is its first-run route (the old + fixture called two other paths). zipline stays on 16 anyway. +- **"immich upstream still runs an older major than ours"** — right: upstream runs 14 (ours 16). +- **"the PostGIS target carries the same PostGIS major"** — moot (adventurelog stays on 16); every candidate tag is PostGIS 3.x + and a dump/load needs no `postgis_extensions_upgrade()`. +- **"the night-chain action does not include the whole-guest backup"** — right (its header, and live: the backup came from the + quiesce loop's own poll, not the chain). +- **"a manual leg sets the flag the gate reads"** — right, and now proven live (the deferral fired during a manual chain). +- **"R-446 is stale"** — right (it said READY TO BUILD; the box half shipped in v0.269.x) → narrowed. +- **"the installer 1.29.0 is untagged"** — right, but **the fix named was wrong**: `installer-v*` is the host-install script's line + (1.28.0 on main), and 1.29.0 is the ISO's; and the ISO was built from an uncommitted tree → R-730, no tag. +- **Part C "if the tier is not due, shorten its cadence"** — not needed: demo-hp's local tier WAS due, because the space + preflight had refused it 10 times since 2026-09-27 (R-548 note). No cadence was changed. +- **Part C "set the backup window"** — the window lives in the product's own setting (`settings.json`, via `POST /backups/window`), + not in `controller.yaml`; it was put back by clearing that key with the controller stopped (it had never been set). +- **Decision 52 "outline, rallly and zipline never move without it"** — two of them moved without it; the third stays by the + upstream rule, not for want of a seed. + +## Decisions I took + +None. Decision 52 was offered and was not needed, so it is not recorded (`09` §3, 2026-09-30 note). + +## Rows + +Register **361 → 364**. Closed: R-463. Narrowed: R-446, R-440. Opened: **R-730** (the ISO build names a commit that is not the +image), **R-731** (tag-shape switches + two release checks), **R-732** (immich's first start OOM-killed its database on the bench). +Notes added: R-462, R-548, R-624, R-687 (item 4 proven; the manual-chain deferral text). + +## Teardown (three layers) + +- **Machine:** 9202 — every test app removed through the product (volumes none left; four drive folders kept by R-442's refusal, + as found before today), `controller.yaml` restored (`git.repo_url` = the live catalog, read back). demo-hp 9201 — `controller.yaml` + IDENTICAL to `controller.yaml.pre-gate-day`, `backup_window_start` cleared, the page reads 02:30 / 03:30 / 04:15 / 04:30–08:30, + poll 5m; bookstack and kimai stepped (intended: they were moved in the live catalog today and would have stepped tonight). + demo-felhom — untouched (it has none of the moved apps). +- **Host:** bench LXC 9401 destroyed, its template removed, host temp files removed; drill repo reset to the live `main` + (`403a8f5`), image lines identical, `has_actions: False`. +- **Hub:** read only; nothing provisioned. +- **Consequence stated:** demo-hp's local whole-guest tier ran at 13:37 today, so it next runs at the 2026-10-02 04:30 window. + +## Numbers moved + +`unproven.py --summary`: unchanged — walked 20, partial 17, built 14, missing 4, **not walked 35 of 55**. Evidence left the machines at the end of each phase (every bench edge was copied +off before the next started; the box logs are written on DooPlex by the walk tools). diff --git a/STATUS.md b/STATUS.md index 67228120..e8b68584 100644 --- a/STATUS.md +++ b/STATUS.md @@ -1,26 +1,28 @@ # STATUS — what works, what's broken, what's next -**Ready for the first real tester (Tester-2): yes, once you check two things — the tunnel's route in Cloudflare, and which of the two connect mails your friend uses.** +**Ready for the first real tester (Tester-2): yes. You confirmed the tunnel route and the connect mails (2026-09-30).** -**Updated 2026-09-30. Both demo boxes run controller 0.283.1 and host agent 0.138.0. Hub 0.126.0. New installs get golden 0.283.1 with agent 0.138.0 (baked and vouched 2026-09-30).** +**Updated 2026-09-30 (afternoon). Both demo boxes run controller 0.283.1 and host agent 0.138.0. Hub 0.126.0. New installs get golden 0.283.1 with agent 0.138.0. No new release today.** -**Decisions today** (yours, recorded): every new app goes off-site by itself (50); the three drill backups on ep0 go, and the restore test uses only the box's own backups (51). +**Tester-2 — read only, from the hub.** +- The customer record exists and its settings are ready. +- **Tester-2's box has not registered yet.** So there are no apps and no update switch to read. +- When Tester-2 installs an app, the box updates it at night by itself, like the demo boxes. -**Tester-2 — what I checked, read only.** -- Done: tunnel key pasted; the domain has exactly one DNS record, and it points at that same tunnel; off-site on (100 GB, a fresh storage account); DR tier on; e-mail language English. -- **Check yourself:** the tunnel's route. My Cloudflare key could read DNS but not tunnels. It must say `*.sajatfelhom.hu` → `https://traefik`, with „No TLS Verify" ticked. -- **Two connect mails went out** (the customer was created twice). Only one link works. Tell your friend: if one says "expired", use the other. The live one is valid until 7 October. +**Decisions today:** none taken by me. The "seed test data through the database" choice was **not needed**, so it is not recorded. **What I did, and it worked.** -- **Apps go off-site by themselves now.** Older apps get one button. If the apps do not fit in 100 GB, the page names the biggest. The box never deletes old copies to make room — I checked; it never did. -- **A Stop holds during a backup.** The first version was wrong in real use; my live test caught it, and the second version is proven live. -- **ep0 is clean:** the three old drill backups are gone; the other customers' backups are unchanged. -- **A returning customer gets a new link** from a button on the expired link's page. -- **The volunteer guide is current** (six stale lines fixed). -- **Two false operator mails on a new box's first day are gone.** +- **The last six database apps are decided.** Three moved to the newer database version (rallly, outline, sparkyfitness). Each was tested on the test bench and on the scratch box, and each one's automatic undo was tested too. Three stay where they are (zipline, adventurelog, immich), because their makers use the same or an older version. **All eleven database apps are now done.** +- **More apps can update themselves at night:** 31 apps (plus nextcloud when a full copy exists), up from 28 this morning. Seven more apps got a newer version today, each tested on the bench and on the scratch box: bookstack, kimai, audiobookshelf, n8n, navidrome, grafana, komga. +- **immich did not move.** On the test bench its database ran out of memory during immich's very first start, twice. On the scratch box it installed fine. I filed it to measure properly; a customer's first install of immich may hit it. +- **The full-system backup now waits for app updates — seen live.** On the HP demo box it waited twice while two apps updated, then started, and it worked. The box's settings are back as before. +- **The HP demo box had no full-system backup since 29 Sept** (its disk was just too full to fit one). Today's test made a fresh one. The problem is the old known one: the box's system disk is small. +- **How current the catalog is:** 25 of 53 apps are a little behind their makers, 19 are a big version behind. The plan for which apps to test next is written. +- **Old register rows fixed.** The "up to date" badge is honest now for every app with a test record. -**Rows.** 5 closed, 2 opened. The list went from 359 to 361 rows. +**Rows.** 1 closed, 2 narrowed, 3 opened. The list went from 361 to 364 rows. **What needs you.** -1. **The Tester-2 tunnel route** (above). If you do nothing and it is missing, your friend's dashboard answers an error page. -2. **D4, the image copies:** unchanged. If you do nothing, nothing changes. +1. **Nothing new.** No app needed a bigger memory limit. +2. **The golden waiver ends on 4 October.** No release happened today, so nothing changes. A weekly bake is due before then. +3. **D4, the image copies:** unchanged. If you do nothing, nothing changes. diff --git a/documentation/architecture/09-update-architecture.md b/documentation/architecture/09-update-architecture.md index 0a4bcd4f..23ba2749 100644 --- a/documentation/architecture/09-update-architecture.md +++ b/documentation/architecture/09-update-architecture.md @@ -569,6 +569,24 @@ R-636's louder repeated alarm. Same day, operator: the first real tester gets a NEW customer record (`Tester-2`, domain `sajatfelhom.hu`), not `tester-1`; and CC rewrites the volunteer guide as measured (R-722). +### 2026-09-30 (day) — operator notes, recorded before the work + +- **The day brief runs by day.** Every backup and automatic-update test is started by hand — the night chain's debug + action (`POST /api/debug/backup/night-chain`), or demo-hp's backup window moved for one test and put back. Nothing waits + for a real night. +- **Tester-2's pre-checks** (the tunnel route in Cloudflare, the two connect mails) were done by the operator (handoff + 2026-09-30 §4). +- **A decision 52 was offered by the reviewer and NOT taken** — *may a PostgreSQL conversion proof seed through the + database when an app has no headless front-door seed?* It was to be recorded only if used. It was not needed: all three + apps it was written for have a front-door seed after all (outline's self-hosted `installation.create`, rallly's own + sign-up with the e-mail code read from its own table in place of a mailbox, sparkyfitness's better-auth). The number 52 + stays free. + +**Outcome (same day):** decision 42's rule applied to the last six PostgreSQL apps from each upstream's compose — rallly, +outline and sparkyfitness (from 15) move to **18** (each upstream runs 18), each proven on both venues with one undo case +on 9202 (catalog `25ffd89`, `aeb0cd6`, `1666572`); **zipline, adventurelog and immich stay on 16** (their upstreams run 16, +16 and 14). All eleven PostgreSQL apps are now decided (R-463 closed). `audits/pg-last-six-2026-09-30/`. + --- ## 3b. ANSWERED 2026-09-23 — the seven questions Slices 6 and 7 needed @@ -1345,6 +1363,15 @@ what the part can do to a household's data if it is wrong, not how likely that i | **10** | **SHIPPED FOR DOCMOST — controller v0.273.0 + catalog `6a4a5f0` (harness v4, the gate's proof clause), proven live on 9202 2026-09-25** (`audits/night-2026-09-26/D/`): one press converted docmost 16 → 18 in **9.9 s** of engine work (**42 s** end to end), the check equal (2 databases, 48 tables, 71 rows), `PG_VERSION` 18, the seed read back; the load failing (an extension 18 lacks) → **undone in 43.6 s**; the app unhealthy on 18 → **undone in 148 s** (90 s drill health timeout); the controller SIGKILLed one second after the volume was emptied → the restart **undid it in 40 s**; each ending on 16 with the seed read back. The old datadir's copy is kept until a backup is proven after the conversion. Decisions 35, 37, 38. Every other PostgreSQL app stays refused by the gate until its own two-venue proof. *(Before:)* **PostgreSQL majors converted by the box.** A guarded-update step: `pg_dumpall` from the old engine, a NEW datadir (the old one kept aside, never deleted, until the check passes), load, check; then each of the eleven apps proven on the bench before its catalog move. | 16, R-463 | **2 + 3** | 1 (the same load discipline), 4 | **HIGH** — it rebuilds the datadir; bounded by keeping the old datadir aside | | **11** | **Fleet view** — per compose service: installed ref, catalog ref, badge state in the report; the hub lists boxes behind. | 18, R-451 | 2 | — | none — **deferred by the ruling** until the fleet grows | +**Dated note 2026-09-30 — how current the catalog is** (`audits/catalog-currency-2026-09-30.md`, measured from the +registries, the 2026-09-21 method). **25 of 53 apps were behind upstream inside a major and 19 across one** (37 behind in +some way) that morning. **The night rule, read from the leg's code** (`legCandidate`): an app can update itself at night +when the catalog's ladder holds a `proven` step from the box's pin, not marked `needs_person` (and, for a +`files_may_change` step, only with a fresh whole copy). **28 apps + nextcloud (conditional) in the morning; 31 + nextcloud +after the day's moves** (rallly, outline, sparkyfitness got their first steps; bookstack and kimai new heads); 21 have no +ladder at all and are never updated at night. Part 10 is now decided for all eleven PostgreSQL apps (8 moved, 3 stay); +part 7's gate wait (decision 20) was seen live on demo-hp the same day (R-687 item 4). + **Recommended order: 1 → 2 + 3 → 4 → 5 → 6 → 7 → 8 → 9 → 10**, part 11 when the fleet grows. **Total for 1–10: ≈ 22 evenings.** The automatic caller (7) is deliberately late: it is the only part that acts with nobody watching, and every part before it is what makes that safe. Parts 8 and 9 are small diff --git a/documentation/audits/catalog-currency-2026-09-30.md b/documentation/audits/catalog-currency-2026-09-30.md new file mode 100644 index 00000000..53caed68 --- /dev/null +++ b/documentation/audits/catalog-currency-2026-09-30.md @@ -0,0 +1,402 @@ +# Catalog currency — measured 2026-09-30 + +Catalog `app-catalog-felhom.eu` main = `64461979250b` (clean tree). Controller source read at +`felhom-controller` main = `d48da6c`. Read-only. Measured from DooPlex against the public registries +with anonymous tokens. No box was touched. Nothing was pulled. Nothing was committed. + +Method: the 2026-09-21 method (`UPDATE-ARC-STATE-2026-09-21.md` §3, `update-arc-2026-09-21/00-drift.py`), +adapted in `catalog-currency-2026-09-30/00-currency.py`. What changed is written at the top of that script. + +## 1. Headline numbers + +**53 apps · 79 `image:` lines · 67 distinct pins.** 53 lines are exact releases, 24 are floating lines +(12 distinct), 1 is Felhom's own image, 1 could not be measured (plant-it: the repository is gone). + +| question | apps | +|---|---| +| **behind upstream inside the same major** (any image) | **25 of 53** | +| **behind upstream across a major** (any image) | **19 of 53** | +| behind in either way | 37 of 53 | +| — inside the major, exact pins only | 24 | +| — across a major, exact pins only | 8 (gitea, gokapi, gramps-web, homepage, jellyfin, nextcloud, paperless-ngx, sparkyfitness) | +| — across a major, only because a floating engine line has a newer major | 14 (postgres → 18, redis → 8, mariadb → 13.0, postgis → 18, claper 2.5 → 3.0) | + +**Can update itself at night today:** + +| number | apps | what it counts | +|---|---|---| +| **(a)** a box at the pin just before the catalog's head gets a step tonight | **28**, plus **1** conditional (nextcloud) | the controller's own rule, catalog side (§4) | +| **(b)** the catalog's ladder has ≥1 `proven` entry | **29** | a looser count | +| never, today | **24** | no `update_ladder:` at all → skip reason `no_test_record` | + +(a) and (b) differ by one app only. Every entry in all 29 ladders is `proven`, and no entry has +`needs_person`. The one difference is nextcloud: its newest step has `files_may_change`, so the leg +takes it only when a fresh whole copy of the app is on the box. + +**What (a) does NOT say.** It says the catalog offers a step. It does not say how many boxes are at a +pin that matches. Nobody measured the fleet's pins today. A box installed from today's catalog is at +the head and has nothing to do. And a night step only goes to the catalog's head, which is itself +behind upstream for 37 apps. + +### 1a. After the same day's moves (added by the session, 2026-09-30 afternoon) + +The tables below are the MORNING measurement (catalog `6446197`). The session then moved five apps on both venues: +rallly, outline and sparkyfitness to PostgreSQL 18 (their first ladder steps), bookstack 26.05.5 → 26.09.1 and kimai +apache-2.57.0 → 2.67.0 (+ the Part F apps named in `pg-last-six-2026-09-30/F/`). Re-running `04-analyse.py` on the +afternoon catalog with the same registry data: **night (a) 31 + nextcloud conditional; (b) 32 carry a proven step; 21 +have no ladder.** The "behind upstream" counts are not re-measured; bookstack and kimai are now at their newest release +inside the major. + +## 2. What could not be measured — stated, not guessed + +1. **plant-it** (`msdeluise/plant-it:0.10.0`): Docker Hub gives 401 on the tag list, and its catalog + API gives **404** for the repository. Same finding as 2026-09-21. The app is `lifecycle: abandoned`. +2. **recipe-importer**: Felhom's own image (`gitea.dooplex.hu`), not upstream. Not compared. +3. **Upload dates**: not measured for any image. ghcr's anonymous API has no timestamp. Not needed + for this question, so not attempted. +4. **Whether the newest tag is a GA release.** The filter is by tag name only (rc, beta, alpha, dev, + nightly, …). Two results need a person to check: `mariadb:13.0` (a two-part line tag exists; GA not + checked) and `gitea/gitea:28.0.0` (pushed to Docker Hub 2026-09-30 00:15 UTC, the same day; a + version renumbering, not checked). +5. **Tag shape switches.** The rule compares only tags of the same shape. A control pass + (`09-shape-switch-check.txt`) looked for higher versions under ANY shape for every pin called + "up to date". It found three real switches, applied by hand with their tag lists + (`10-shape-switch-detail.txt`): + - **gramps-web** `v25.6.0`: upstream dropped the `v`. It is at `26.9.1`. Calendar versions, so 25→26 + is counted as across a major. + - **jellyfin** `10.11.11`: upstream 12 uses two-part tags. It is at `12.1` (12.0 had rc1..rc7). + - **kimai** `apache-2.57.0`: upstream stopped the `apache-` tags. Plain `2.67.0` exists. Whether it + is the same Apache variant is NOT checked. + Two more hits were noise: sonarr (`5.14-2.0.0…-ls5`, a develop-style tag) and tandoor (a + `dependabot-…` branch tag). The control ran only on pins called up to date, and not on floating + lines. A switch hiding behind a pin already called "behind" would change only its "newest" value. +6. **Floating pins — did the tag move?** 18 of 24 floating lines resolve to **exactly the digest + the ladder recorded when the step was tested**. None has moved since its test. 6 cannot be compared, + because the app has no ladder: outline (postgres 16, redis 7), rallly (postgres 16), sparkyfitness + (postgres 15), zipline (postgres 16), wger (`2.6`). +7. **Majors for 0.x and calendar versions.** "Major" is the first number of the tag, as written. For + `v0.x` apps a minor step can be breaking. For calendar versions (bookstack 26.05, home-assistant + 2026.9, actualbudget 26.9, papra 26.6) the first number is a year. This table does not interpret it. +8. **ghcr rate limit.** immich-server and immich-machine-learning got HTTP 429 on the first run. They + were measured on a slower retry (`02-retry-429-run.txt`). Nothing is left at 429. + +## 3. Per image + +"Floating (line)" = the tag names a version LINE, not a release: fewer than three numbers in its +first version run (`12.3`, `16-alpine`, `16-3.5-alpine`, immich's `16-vectorchord…`). For a floating +line, "newest same major" is the newest line of the same shape in that major. "Newest at all" is the +newest line of that shape. + +| app | service | pinned | newest same major | newest at all | behind in major | behind across major | note | +|---|---|---|---|---|---|---|---| +| actualbudget | actualbudget | `26.9.0` | `26.9.0` | `26.9.0` | no | no | | +| adventurelog | adventurelog | `v0.13.0` | `v0.13.0` | `v0.13.0` | no | no | | +| adventurelog | adventurelog-postgres | `16-3.5-alpine` | `16-3.5-alpine` | `18-3.6-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| adventurelog | adventurelog-frontend | `v0.13.0` | `v0.13.0` | `v0.13.0` | no | no | | +| audiobookshelf | audiobookshelf | `2.36.1` | `2.37.1` | `2.37.1` | yes | no | | +| bentopdf | bentopdf | `v2.8.6` | `v2.8.8` | `v2.8.8` | yes | no | | +| bookstack | bookstack | `26.05.5` | `26.09.1` | `26.09.1` | yes | no | | +| bookstack | bookstack-db | `12.3` | `12.3` | `13.0` | no | yes | floating (line); digest = ladder's tested digest | +| calcom | calcom | `v6.2.0` | `v6.2.0` | `v6.2.0` | no | no | | +| calcom | calcom-postgres | `18-alpine` | `18-alpine` | `18-alpine` | no | no | floating (line); digest = ladder's tested digest | +| calibre-web | calibre-web | `v4.0.6` | `v4.0.8` | `v4.0.8` | yes | no | | +| claper | claper | `2.5` | `2.5` | `3.0` | no | yes | floating (line); digest = ladder's tested digest | +| claper | claper-postgres | `17-alpine` | `17-alpine` | `18-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| code-server | code-server | `4.129.0` | `4.139.1` | `4.139.1` | yes | no | | +| crafty-controller | crafty-controller | `4.10.7` | `4.11.0` | `4.11.0` | yes | no | | +| docmost | docmost | `0.96.0` | `0.96.0` | `0.96.0` | no | no | | +| docmost | docmost-postgres | `18-alpine` | `18-alpine` | `18-alpine` | no | no | floating (line); digest = ladder's tested digest | +| docmost | docmost-redis | `7-alpine` | `7-alpine` | `8-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| emby | emby | `4.11.0.3` | `4.11.0.4` | `4.11.0.4` | yes | no | | +| ghost | ghost | `6.65.0-alpine` | `6.67.0-alpine` | `6.67.0-alpine` | yes | no | | +| gitea | gitea | `1.27.0` | `1.27.3` | `28.0.0` | yes | yes | | +| glance | glance | `v0.8.5` | `v0.8.6` | `v0.8.6` | yes | no | | +| gokapi | gokapi | `v1.9.6` | `v1.9.6` | `v2.2.4` | no | yes | | +| grafana | grafana | `13.2.2` | `13.2.3` | `13.2.3` | yes | no | | +| gramps-web | gramps-web | `v25.6.0` | `v25.6.0` | `26.9.1` | no | yes | SHAPE SWITCH: upstream dropped the `v` prefix in 2026 (26.x.y); calendar versions, so the 25→26 step is a new year, counted as across | +| home-assistant | home-assistant | `2026.9.3` | `2026.9.4` | `2026.9.4` | yes | no | | +| homebox | homebox | `0.26.2` | `0.26.2` | `0.26.2` | no | no | | +| homepage | homepage | `v1.13.2` | `v1.13.2` | `v2.4.0` | no | yes | | +| immich | immich-server | `v3.2.2` | `v3.2.4` | `v3.2.4` | yes | no | measured on retry after ghcr 429 | +| immich | immich-machine-learning | `v3.2.2` | `v3.2.4` | `v3.2.4` | yes | no | measured on retry after ghcr 429 | +| immich | immich-postgres | `16-vectorchord0.4.3-pgvectors0.2.0` | `16-vectorchord0.4.3-pgvectors0.3.0` | `17-vectorchord0.4.3-pgvectors0.3.0` | yes | yes | floating (line); digest = ladder's tested digest | +| immich | immich-redis | `7-alpine` | `7-alpine` | `8-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| jellyfin | jellyfin | `10.11.11` | `10.11.11` | `12.1` | no | yes | SHAPE SWITCH: upstream 12.x publishes two-part tags (`12.1`); 12.0 went through rc1..rc7 | +| kimai | kimai | `apache-2.57.0` | `2.67.0` | `2.67.0` | yes | no | SHAPE SWITCH: upstream stopped publishing `apache-` tags after 2.57.0; plain `2.67.0` exists (whether it is the same apache variant is NOT checked) | +| kimai | kimai-db | `11.8` | `11.8` | `13.0` | no | yes | floating (line); digest = ladder's tested digest | +| komga | komga | `1.27.1` | `1.28.0` | `1.28.0` | yes | no | | +| mealie | mealie | `v3.28.0` | `v3.28.0` | `v3.28.0` | no | no | | +| n8n | n8n | `2.41.2` | `2.42.1` | `2.42.1` | yes | no | | +| navidrome | navidrome | `0.64.1` | `0.64.2` | `0.64.2` | yes | no | | +| nextcloud | nextcloud | `34.0.4-apache` | `34.0.4-apache` | `35.0.1-apache` | no | yes | | +| nextcloud | nextcloud-db | `12.3` | `12.3` | `13.0` | no | yes | floating (line); digest = ladder's tested digest | +| nextcloud | nextcloud-redis | `7-alpine` | `7-alpine` | `8-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| onlyoffice | onlyoffice | `9.4.0` | `9.4.0` | `9.4.0` | no | no | | +| opengist | opengist | `1.15` | `1.15` | `1.15` | no | no | floating (line); digest = ladder's tested digest | +| outline | outline | `1.9.1` | `1.10.1` | `1.10.1` | yes | no | | +| outline | outline-postgres | `16-alpine` | `16-alpine` | `18-alpine` | no | yes | floating (line); no ladder digest to compare | +| outline | outline-redis | `7-alpine` | `7-alpine` | `8-alpine` | no | yes | floating (line); no ladder digest to compare | +| paperless-ngx | paperless-webserver | `2.20.15` | `2.20.15` | `3.2.1` | no | yes | | +| paperless-ngx | paperless-postgres | `18-alpine` | `18-alpine` | `18-alpine` | no | no | floating (line); digest = ladder's tested digest | +| paperless-ngx | paperless-redis | `7-alpine` | `7-alpine` | `8-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| papra | papra | `26.6.2-rootless` | `26.6.2-rootless` | `26.6.2-rootless` | no | no | | +| plant-it | plant-it | `0.10.0` | ? | ? | ? | ? | NOT MEASURED: HTTPError: 401 Client Error: Unauthorized for url: https://r | +| plex | plex | `1.41.4.9463-630c9f557` | `1.43.4.10903-e5521bd8c` | `1.43.4.10903-e5521bd8c` | yes | no | | +| privatebin | privatebin | `2.0.6` | `2.0.6` | `2.0.6` | no | no | | +| radarr | radarr | `6.4.4` | `6.4.4` | `6.4.4` | no | no | | +| rallly | rallly | `4.11.1` | `4.15.3` | `4.15.3` | yes | no | | +| rallly | rallly-postgres | `16-alpine` | `16-alpine` | `18-alpine` | no | yes | floating (line); no ladder digest to compare | +| recipe-importer | recipe-importer | `v0.9.11` | — | — | n/a | n/a | Felhom's own image, not upstream | +| romm | romm | `5.3.1` | `5.3.1` | `5.3.1` | no | no | | +| romm | romm-db | `11.8` | `11.8` | `13.0` | no | yes | floating (line); digest = ladder's tested digest | +| romm | romm-redis | `7-alpine` | `7-alpine` | `8-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| seerr | seerr | `2.7.3` | `2.7.3` | `2.7.3` | no | no | | +| sonarr | sonarr | `4.0.20` | `4.0.20` | `4.0.20` | no | no | | +| sparkyfitness | sparkyfitness-db | `15-alpine` | `15-alpine` | `18-alpine` | no | yes | floating (line); no ladder digest to compare | +| sparkyfitness | sparkyfitness-server | `v0.17.3` | `v0.17.3` | `v1.7.3` | no | yes | | +| sparkyfitness | sparkyfitness-frontend | `v0.17.3` | `v0.17.3` | `v1.7.3` | no | yes | | +| tandoor | tandoor | `2.6.15` | `2.6.15` | `2.6.15` | no | no | | +| tandoor | tandoor-postgres | `17-alpine` | `17-alpine` | `18-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| termix | termix | `2.8.0` | `2.8.0` | `2.8.0` | no | no | | +| uptime-kuma | uptime-kuma | `2.4.0` | `2.5.5` | `2.5.5` | yes | no | | +| vaultwarden | vaultwarden | `1.36.0-alpine` | `1.37.3-alpine` | `1.37.3-alpine` | yes | no | | +| vikunja | vikunja | `2.6.0` | `2.6.0` | `2.6.0` | no | no | | +| wanderer | wanderer | `v0.20.0` | `v0.21.0` | `v0.21.0` | yes | no | | +| wanderer | wanderer-db | `v0.20.0` | `v0.21.0` | `v0.21.0` | yes | no | | +| wanderer | wanderer-search | `v1.36.0` | `v1.54.2` | `v1.54.2` | yes | no | | +| wger | wger | `2.6` | `2.7` | `2.7` | yes | no | floating (line); no ladder digest to compare | +| wishlist | wishlist | `v0.67.1` | `v0.67.1` | `v0.67.1` | no | no | | +| zipline | zipline | `4.6.1` | `4.8.0` | `4.8.0` | yes | no | | +| zipline | zipline-postgres | `16-alpine` | `16-alpine` | `18-alpine` | no | yes | floating (line); no ladder digest to compare | + +## 4. The night rule, from the code + +Source: `felhom-controller/controller/internal/stacks/unattended.go` at `d48da6c`, function +`legCandidate` (L392–463). `RunUpdateLeg` (L221) → `runUpdateLeg` (L232–347) calls it for every +deployed, non-protected app (L276–281) and presses `StartGuardedUpdate` only when it returns no reason +(L311–321). The ladder reader is `ladder.go` (`LoadLadder` L83, `sameRefs` L118, `nextLadderStep` +L152, which makes the same choice, L163). + +In order, an app is skipped when: + +| code line | skip | condition | +|---|---|---| +| L397–407 | `held` | a hold on the app | +| L400 | `stopped_by_household` | the household stopped it | +| L408–416 | current / `ahead` / `order_unknown` | `CatalogOrder` is not Behind | +| L417–419 | `unpinned` | app.yaml has no `pinned_images` | +| L422–424 | `no_test_record` | the template has no `update_ladder:` | +| L426–432 | — | picks the NEWEST entry whose `from` equals the box's pin, every service, exactly | +| L433–435 | `no_test_record` | no match, and the pin is the head's `to` (behind only on a digest no step records) | +| L436–438 | `older_than_ladder` | no match at all: the box is older than the ladder | +| L441 | `not_proven` | the entry's verdict is not `proven` | +| L444 | `needs_person` | `marks.needs_person` is set and not blank | +| L447 | `failed_before` | the same step was undone or held on this ladder (R-680) | +| L450–458 | `files_may_change_no_whole_copy` | `marks.files_may_change` and no fresh whole copy on the box | + +After that, `StartGuardedUpdate` can still refuse for box reasons: `no_backup`, `engine_no_test`, +`memory`, `disk`, `busy`… (`UpdatePreflight`, `update.go` L368 on; the checks at L431–470). + +**Definition used for (a).** For each app, take a box whose pin is the `from` of the ladder's +newest entry (one step behind the head). Apply the catalog-side rows above (L422–458) to the entry +the code would pick. Count "yes" when nothing skips it, and "conditional" when only +`files_may_change` stands in the way. The box-side rows (hold, stop, failed_before, whole copy, +refusals) are not in this count, because they depend on the box. + +Three things this rule means, read from the code: + +- **A box older than the ladder is never pressed** (L436–438). For 21 apps the ladder's first entry is + a backfill of the 2026-09-21/22 move (`backfilled`). A box installed before that move matches it and + can climb. A box older than that `from` cannot. +- **A digest-only change is never pressed at night.** A box at the head tag with an older digest is + "behind" by `digestBehind` (updateorder.go L95), but no entry has that `from`, so L433–435 skips it. +- **The 11 backfilled head entries are harness v1** (no memory watch). The box does not read + `harness_version`, only `verdict`, so it presses them like any other: actualbudget, audiobookshelf, + bookstack, grafana, home-assistant, papra, privatebin, radarr, sonarr, termix, vikunja. + +## 5. Per app — the ladder + +"Head = compose" is the gate's rule 3 (`check-test-record.py`, run today: 53 read, 29 with a ladder, +0 convicted, `03-check-test-record.txt`). "Box one step behind, tonight" is number (a). + +| app | entries | proven | of which backfilled | needs_person | files_may_change | engine conversion | head = compose | box one step behind, tonight | catalog_since | +|---|---|---|---|---|---|---|---|---|---| +| actualbudget | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| adventurelog | 1 | 1 | 0 | 0 | 0 | 0 | yes | yes | 2026-09-27 | +| audiobookshelf | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| bentopdf | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-12 | +| bookstack | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| calcom | 1 | 1 | 0 | 0 | 0 | 1 | yes | yes | 2026-09-28 | +| calibre-web | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-12 | +| claper | 1 | 1 | 0 | 0 | 0 | 1 | yes | yes | 2026-09-28 | +| code-server | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| crafty-controller | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-06-26 | +| docmost | 2 | 2 | 1 | 0 | 0 | 1 | yes | yes | 2026-09-25 | +| emby | 2 | 2 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| ghost | 2 | 2 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| gitea | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| glance | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-09-21 | +| gokapi | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| grafana | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| gramps-web | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| home-assistant | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| homebox | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-19 | +| homepage | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| immich | 2 | 2 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| jellyfin | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| kimai | 1 | 1 | 0 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| komga | 1 | 1 | 0 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| mealie | 2 | 2 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-25 | +| n8n | 3 | 3 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-25 | +| navidrome | 2 | 2 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| nextcloud | 2 | 2 | 1 | 0 | 1 | 0 | yes | conditional: files_may_change (needs a fresh whole copy) | 2026-09-23 | +| onlyoffice | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| opengist | 1 | 1 | 0 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| outline | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| paperless-ngx | 1 | 1 | 0 | 0 | 0 | 1 | yes | yes | 2026-09-27 | +| papra | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| plant-it | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-21 | +| plex | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-02-15 | +| privatebin | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| radarr | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| rallly | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| recipe-importer | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-12 | +| romm | 3 | 3 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| seerr | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| sonarr | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| sparkyfitness | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| tandoor | 2 | 2 | 1 | 0 | 0 | 1 | yes | yes | 2026-09-27 | +| termix | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| uptime-kuma | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-09-21 | +| vaultwarden | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| vikunja | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| wanderer | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-21 | +| wger | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-19 | +| wishlist | 1 | 1 | 0 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| zipline | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | + +## 6. Plan for R-462 — widen the upgrade harness + +**Order.** First: what a household loses if an update goes wrong. Then: how far behind. +**T1** = a database engine service, or household files the backup marks `mandatory`. +**T2** = household data in the app's own volume (SQLite or files). **T3** = little or no household data. + +**Cost, per app.** The only measured numbers are in R-462: a proven edge takes 6.4–305 s (median 72 s) +plus the 600 s soak, a failing edge ~556 s, and a new fixture dominates everything else (the database +legs were costed at 21–34 CC-hours for 15 services, `09` §6.4). So: **fixture exists** = one bench run +plus one box run. **Fixture needed** = write a seed and a read-back through the app's own interface, +with a negative control, first. **No route** = the harness can only answer `inconclusive`. + +### 6.1 Do next — in this order + +1. **immich** (T1, fixture exists). Server and ML `v3.2.2 → v3.2.4`, and a newer pgvectors line inside + PostgreSQL 16. Cheapest high-value run: the fixture exists and the step is inside the major. +2. **bookstack** (T1, fixture exists). `26.05.5 → 26.09.1`. The fixture proves the database half only + (R-460). +3. **kimai** (T1, fixture exists). `2.57.0 → 2.67.0`, but the tag shape changed (`apache-` is gone). + A person must first confirm which plain tag is the Apache image. Then one run. +4. **calibre-web** (T1, **fixture needed**). `v4.0.6 → v4.0.8`, household books marked `mandatory`, + and no ladder at all. The first new fixture to write. +5. **gitea** (T2, fixture exists but fails at the web installer, R-624). `1.27.0 → 1.27.3`. Cheap: + the installer-form POST was never written. It unblocks gitea's first ladder entry. +6. **The T2 apps with a fixture and a step inside the major** — one run each: audiobookshelf, emby, + ghost, grafana, home-assistant, komga, n8n, navidrome. This is the bulk and costs machine time only. +7. **T2 apps that need a new fixture and are behind inside the major:** wanderer (3 images, incl. + meilisearch `v1.36 → v1.54`), uptime-kuma, crafty-controller, wger. + +### 6.2 Majors — human work by the 2026-09-02 ruling, not harness bulk + +nextcloud 34 → 35, paperless-ngx 2 → 3, gokapi 1 → 2, homepage 1 → 2, sparkyfitness 0.17 → 1.7, +gitea 1 → 28 (check first), jellyfin 10 → 12, gramps-web v25 → 26. Engine lines: redis 7 → 8 (6 apps), +mariadb → 13.0 (bookstack, kimai, nextcloud, romm; GA not checked), PostgreSQL for the R-463 remainder +(adventurelog/postgis, immich, outline, rallly, sparkyfitness on 15, zipline). + +### 6.3 The honest ceiling — CORRECTED the same day + +The morning version of this section named 8 apps that can only ever be `inconclusive`. **Three of them were wrong**, +measured on the bench the same afternoon: **outline** has a front-door first-run route (`POST /api/installation.create`, +refused once a workspace exists), **rallly** signs up through its own API with the six-digit e-mail code read from its own +table in place of a mailbox, and **zipline** 4's first-run route is `POST /api/setup` (the old fixture called two other +paths). outline and rallly moved on both venues the same day; zipline's fixture now tries `/api/setup` first. + +**What remains in the class:** vaultwarden (closed sign-up by design, R-624) and code-server (a browser IDE); plex (a +plex.tv claim token), homepage and onlyoffice (no household data) are no-route by nature. Plus plant-it (image gone) and +recipe-importer (our own image; a fixture is needed). So the most the harness can prove is **47 of 53**. + +### 6.4 The whole ranking + +| rank | app | data at risk | ladder entries | images behind in major | across major | fixture | +|---|---|---|---|---|---|---| +| 1 | outline | T1: DB engine: outline-postgres | 0 | 1 | 2 | ~~no route~~ **fixture written 2026-09-30** (`installation.create`); moved to PG 18 the same day | +| 2 | rallly | T1: DB engine: rallly-postgres | 0 | 1 | 1 | ~~no route~~ **fixture written 2026-09-30** (sign-up + its own e-mail code); moved to PG 18 the same day | +| 3 | zipline | T1: DB engine: zipline-postgres | 0 | 1 | 1 | ~~no route~~ **first-run route `POST /api/setup` measured 2026-09-30**; fixture fixed; PG stays 16 | +| 4 | calibre-web | T1: household files (backup class mandatory) | 0 | 1 | 0 | fixture needed | +| 5 | sparkyfitness | T1: DB engine: sparkyfitness-db | 0 | 0 | 3 | fixture needed | +| 6 | immich | T1: DB engine: immich-postgres; household files (backup class mandatory) | 2 | 3 | 2 | fixture exists | +| 7 | bookstack | T1: DB engine: bookstack-db | 1 | 1 | 1 | fixture exists | +| 8 | kimai | T1: DB engine: kimai-db | 1 | 1 | 1 | fixture exists | +| 9 | nextcloud | T1: DB engine: nextcloud-db; household files (backup class mandatory) | 2 | 0 | 3 | fixture exists | +| 10 | claper | T1: DB engine: claper-postgres | 1 | 0 | 2 | fixture exists | +| 11 | paperless-ngx | T1: DB engine: paperless-postgres; household files (backup class mandatory) | 1 | 0 | 2 | fixture exists | +| 12 | romm | T1: DB engine: romm-db | 3 | 0 | 2 | fixture exists | +| 13 | adventurelog | T1: DB engine: adventurelog-postgres | 1 | 0 | 1 | fixture exists | +| 14 | docmost | T1: DB engine: docmost-postgres | 2 | 0 | 1 | fixture exists | +| 15 | tandoor | T1: DB engine: tandoor-postgres | 2 | 0 | 1 | fixture exists | +| 16 | calcom | T1: DB engine: calcom-postgres | 1 | 0 | 0 | fixture exists | +| 17 | wanderer | T2: household data in the app's own volume (SQLite / files) | 0 | 3 | 0 | fixture needed | +| 18 | gitea | T2: household data in the app's own volume (SQLite / files) | 0 | 1 | 1 | fixture exists, fails at the web installer (R-624, fixable) | +| 19 | code-server | T2: household data in the app's own volume (SQLite / files) | 0 | 1 | 0 | no route: its front door is a browser IDE behind one password | +| 20 | crafty-controller | T2: household data in the app's own volume (SQLite / files) | 0 | 1 | 0 | fixture needed | +| 21 | plex | T2: household data in the app's own volume (SQLite / files) | 0 | 1 | 0 | no route: the first-run claim needs a token minted at plex.tv by a real Plex acc | +| 22 | uptime-kuma | T2: household data in the app's own volume (SQLite / files) | 0 | 1 | 0 | fixture needed | +| 23 | vaultwarden | T2: household data in the app's own volume (SQLite / files) | 0 | 1 | 0 | no route by design: closed sign-up (R-624) | +| 24 | wger | T2: household data in the app's own volume (SQLite / files) | 0 | 1 | 0 | fixture needed | +| 25 | gokapi | T2: household data in the app's own volume (SQLite / files) | 0 | 0 | 1 | fixture needed | +| 26 | gramps-web | T2: household data in the app's own volume (SQLite / files) | 0 | 0 | 1 | fixture exists | +| 27 | jellyfin | T2: household data in the app's own volume (SQLite / files) | 0 | 0 | 1 | fixture exists | +| 28 | homebox | T2: household data in the app's own volume (SQLite / files) | 0 | 0 | 0 | fixture exists | +| 29 | plant-it | T2: household data in the app's own volume (SQLite / files) | 0 | 0 | 0 | fixture needed | +| 30 | recipe-importer | T2: household data in the app's own volume (SQLite / files) | 0 | 0 | 0 | fixture needed | +| 31 | seerr | T2: household data in the app's own volume (SQLite / files) | 0 | 0 | 0 | fixture needed | +| 32 | audiobookshelf | T2: household data in the app's own volume (SQLite / files) | 1 | 1 | 0 | fixture exists | +| 33 | emby | T2: household data in the app's own volume (SQLite / files) | 2 | 1 | 0 | fixture exists | +| 34 | ghost | T2: household data in the app's own volume (SQLite / files) | 2 | 1 | 0 | fixture exists | +| 35 | grafana | T2: household data in the app's own volume (SQLite / files) | 1 | 1 | 0 | fixture exists | +| 36 | home-assistant | T2: household data in the app's own volume (SQLite / files) | 1 | 1 | 0 | fixture exists | +| 37 | komga | T2: household data in the app's own volume (SQLite / files) | 1 | 1 | 0 | fixture exists | +| 38 | n8n | T2: household data in the app's own volume (SQLite / files) | 3 | 1 | 0 | fixture exists | +| 39 | navidrome | T2: household data in the app's own volume (SQLite / files) | 2 | 1 | 0 | fixture exists | +| 40 | actualbudget | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 41 | mealie | T2: household data in the app's own volume (SQLite / files) | 2 | 0 | 0 | fixture exists | +| 42 | opengist | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 43 | papra | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 44 | privatebin | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 45 | radarr | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 46 | sonarr | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 47 | termix | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 48 | vikunja | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 49 | wishlist | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 50 | bentopdf | T3: little or no household data (stateless or config only) | 0 | 1 | 0 | fixture needed | +| 51 | glance | T3: little or no household data (stateless or config only) | 0 | 1 | 0 | fixture needed | +| 52 | homepage | T3: little or no household data (stateless or config only) | 0 | 0 | 1 | no route: a dashboard rendered from config files in the template | +| 53 | onlyoffice | T3: little or no household data (stateless or config only) | 0 | 0 | 0 | no route: a stateless document server: it holds no household data of its own, so | + +## 7. Files + +In `catalog-currency-2026-09-30/`: + +| file | what | +|---|---| +| `00-currency.py` | the measurement (registries, read-only) | +| `01-currency-raw.json`, `01-currency-run.txt` | its raw output | +| `02-retry-429.py`, `02-retry-429-run.txt` | the slower retry for the two ghcr 429 rows | +| `03-check-test-record.txt` | the catalog's own ladder gate, run today | +| `04-analyse.py`, `04-analyse-run.txt` | tables and counts (offline; the night rule is in its header) | +| `05-summary.json` | the counts and app lists | +| `06-`, `07-`, `08-*.md` | the three tables above | +| `09-shape-switch-check.txt`, `10-shape-switch-detail.txt` | the shape-switch control | + +**Findings that should become register rows** (this session did not edit the register — read-only +brief): the three tag-shape switches (gramps-web, jellyfin, kimai), which the badge and any shape-based +tool read as "up to date"; and the `gitea 28.0.0` / `mariadb 13.0` tags, which need a GA check before +anyone plans on them. diff --git a/documentation/audits/catalog-currency-2026-09-30/00-currency.py b/documentation/audits/catalog-currency-2026-09-30/00-currency.py new file mode 100644 index 00000000..ef2113f4 --- /dev/null +++ b/documentation/audits/catalog-currency-2026-09-30/00-currency.py @@ -0,0 +1,234 @@ +#!/usr/bin/env python3 +"""Catalog currency audit, 2026-09-30. Read-only, DooPlex-only, anonymous public registry API. + +Adapted from documentation/audits/update-arc-2026-09-21/00-drift.py (same bearer-token flow and the +same Link pagination for /v2//tags/list; same lscr.io date-rebuild exclusion; same unstable +markers). Changes, and why: + - reads the pins straight from the catalog checkout (scripts/ladder.py images_in — the same reading + the gates make), not from a hand-built pins.json; + - one generic tag tokenizer for every pin (numbers vs the text between them; a long hex token is a + build hash, a wildcard). Two tags are comparable only when the text between their numbers is + identical and they have the same count of numbers. So `postgres:16-alpine` compares only with + `-alpine`, `nextcloud:34.0.4-apache` only with `..-apache`; + - reports BOTH the newest within the pin's major (first number equal) and the newest at all; + - classifies a pin as FLOATING when it names a version LINE, not an exact release: fewer than three + version numbers in the tag's leading version run (e.g. `mariadb:12.3`, `postgres:16-alpine`, + `redis:7-alpine`, `postgis:16-3.5-alpine`, immich's `postgres:16-vectorchord...`); + - for floating pins, also resolves the tag's CURRENT digest (HEAD, no pull, no rate-limit count on + Docker Hub) and compares it with the digest the app's ladder recorded when the step was tested. +Nothing is pulled; nothing is written outside the output directory. + +Usage: python3 00-currency.py +""" +import json +import os +import re +import sys +import time + +import requests + +CAT = sys.argv[1] +OUT = sys.argv[2] +sys.path.insert(0, os.path.join(CAT, "scripts")) +import ladder # noqa: E402 + +S = requests.Session() +S.headers.update({"User-Agent": "felhom-catalog-currency-audit/1.0 (read-only measurement)"}) + + +def bearer(www): + parts = www[len("Bearer "):].split(",") + d = {} + for p in parts: + k, v = p.split("=", 1) + d[k.strip()] = v.strip('"') + r = S.get(d["realm"], params={"service": d.get("service"), "scope": d.get("scope")}, timeout=20) + r.raise_for_status() + j = r.json() + return j.get("token") or j.get("access_token") + + +def get(url, headers=None, method="GET", params=None, _tok={}): + headers = dict(headers or {}) + host = url.split("/")[2] + if host in _tok: + headers["Authorization"] = "Bearer " + _tok[host] + r = S.request(method, url, headers=headers, params=params, timeout=30) + if r.status_code == 401 and "WWW-Authenticate" in r.headers: + tok = bearer(r.headers["WWW-Authenticate"]) + headers["Authorization"] = "Bearer " + tok + r = S.request(method, url, headers=headers, params=params, timeout=30) + return r + + +def tags_all(host, repo): + url = f"https://{host}/v2/{repo}/tags/list" + r = get(url, params={"n": 1000}) + r.raise_for_status() + auth = r.request.headers.get("Authorization") + tags = list(r.json().get("tags") or []) + link = r.headers.get("Link") + pages = 1 + while link and pages < 1000: + m = re.search(r'<([^>]+)>;\s*rel="next"', link) + if not m: + break + nxt = m.group(1) + if nxt.startswith("/"): + nxt = f"https://{host}{nxt}" + r = S.get(nxt, headers={"Authorization": auth} if auth else {}, timeout=30) + r.raise_for_status() + tags.extend(r.json().get("tags") or []) + link = r.headers.get("Link") + pages += 1 + return tags + + +ACCEPT = ("application/vnd.docker.distribution.manifest.v2+json," + "application/vnd.docker.distribution.manifest.list.v2+json," + "application/vnd.oci.image.manifest.v1+json,application/vnd.oci.image.index.v1+json") + + +def digest(host, repo, tag): + r = get(f"https://{host}/v2/{repo}/manifests/{tag}", headers={"Accept": ACCEPT}, method="HEAD") + if r.status_code != 200: + return None, f"HTTP {r.status_code}" + return r.headers.get("Docker-Content-Digest"), None + + +def host_repo(ref_repo): + for h in ("ghcr.io", "lscr.io", "registry.gitlab.com", "gitea.dooplex.hu", "quay.io"): + if ref_repo.startswith(h + "/"): + return h, ref_repo[len(h) + 1:] + if "/" not in ref_repo: + return "registry-1.docker.io", "library/" + ref_repo + return "registry-1.docker.io", ref_repo + + +def split_ref(ref): + ref = ref.split("@")[0] + slash = ref.rfind("/") + colon = ref.rfind(":") + if colon > slash: + return ref[:colon], ref[colon + 1:] + return ref, "latest" + + +UNSTABLE = ("rc", "beta", "alpha", "dev", "nightly", "canary", "edge", "preview", "snapshot", "-pr", "test", "unstable") +HASH_RE = re.compile(r"(?", tag.lower()) + parts = re.split(r"(\d+)", t) + nums = tuple(int(p) for p in parts[1::2]) + if not nums: + return None + shape = tuple(parts[0::2]) + return shape, nums + + +def lead_run_len(tag): + m = re.search(r"\d+(?:\.\d+)*", tag) + return len(m.group(0).split(".")) if m else 0 + + +def is_floating(tag): + if not re.search(r"\d", tag): + return True # `latest`-style: no version at all + return lead_run_len(tag) < 3 + + +def unstable(tag): + low = tag.lower() + return any(mk in low for mk in UNSTABLE) + + +def newest(tags, cur): + c = tokenize(cur) + if not c: + return None + shape, nums = c + best_all = best_maj = None + for t in tags: + if unstable(t) and not unstable(cur): + continue + p = tokenize(t) + if not p or p[0] != shape or len(p[1]) != len(nums): + continue + if any(n >= 20000 for n in p[1]) and not any(n >= 20000 for n in nums): + continue # lscr.io-style date rebuild tag, not a release (see 00-drift.py) + if best_all is None or p[1] > best_all[1]: + best_all = (t, p[1]) + if p[1][0] == nums[0] and (best_maj is None or p[1] > best_maj[1]): + best_maj = (t, p[1]) + return {"cur": nums, "all": best_all, "maj": best_maj} + + +def ladder_digests(app_dir): + fy = os.path.join(app_dir, ".felhom.yml") + entries, _r, _e = ladder.parse(open(fy, encoding="utf-8").read()) + if not entries: + return {}, None + head = entries[-1] + return head.get("digest", {}), head.get("tested_at") + + +def main(): + tdir = os.path.join(CAT, "templates") + rows = [] + cache = {} + for app in sorted(os.listdir(tdir)): + d = os.path.join(tdir, app) + imgs = ladder.images_in(open(os.path.join(d, "docker-compose.yml"), encoding="utf-8").read()) + ldig, ltested = ladder_digests(d) + for svc, ref in imgs.items(): + repo, tag = split_ref(ref) + host, hrepo = host_repo(repo) + row = {"app": app, "service": svc, "ref": ref, "repo": repo, "tag": tag, "host": host, + "floating": is_floating(tag)} + if host == "gitea.dooplex.hu": + row["status"] = "internal" + rows.append(row) + print(f"{app}/{svc}: internal image, not upstream") + continue + try: + if (host, hrepo) not in cache: + cache[(host, hrepo)] = tags_all(host, hrepo) + time.sleep(0.15) + tags = cache[(host, hrepo)] + row["n_tags"] = len(tags) + row["pinned_tag_listed"] = tag in tags + res = newest(tags, tag) + if res is None: + row["status"] = "unparsed" + else: + row["status"] = "ok" + ba, bm = res["all"], res["maj"] + row["newest_all"] = ba[0] if ba else None + row["newest_major"] = bm[0] if bm else None + row["behind_within_major"] = bool(bm and bm[1] > res["cur"]) + row["behind_across_major"] = bool(ba and ba[1][0] > res["cur"][0]) + row["major"] = res["cur"][0] + if row["floating"]: + dg, err = digest(host, hrepo, tag) + row["current_digest"] = dg + row["digest_error"] = err + row["ladder_digest"] = ldig.get(svc) + row["ladder_tested_at"] = ltested + if dg and ldig.get(svc): + row["moved_since_tested"] = dg != ldig.get(svc) + except Exception as e: # recorded, never guessed + row["status"] = "error" + row["error"] = f"{type(e).__name__}: {e}"[:300] + rows.append(row) + print(f"{app}/{svc}: {tag} -> maj={row.get('newest_major')} all={row.get('newest_all')} " + f"float={row['floating']} {row['status']} {row.get('error','')}") + json.dump(rows, open(os.path.join(OUT, "01-currency-raw.json"), "w"), indent=1) + print("rows", len(rows)) + + +if __name__ == "__main__": + main() diff --git a/documentation/audits/catalog-currency-2026-09-30/01-currency-raw.json b/documentation/audits/catalog-currency-2026-09-30/01-currency-raw.json new file mode 100644 index 00000000..9279691d --- /dev/null +++ b/documentation/audits/catalog-currency-2026-09-30/01-currency-raw.json @@ -0,0 +1,1448 @@ +[ + { + "app": "actualbudget", + "service": "actualbudget", + "ref": "actualbudget/actual-server:26.9.0", + "repo": "actualbudget/actual-server", + "tag": "26.9.0", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 3075, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "26.9.0", + "newest_major": "26.9.0", + "behind_within_major": false, + "behind_across_major": false, + "major": 26 + }, + { + "app": "adventurelog", + "service": "adventurelog", + "ref": "ghcr.io/seanmorley15/adventurelog-backend:v0.13.0", + "repo": "ghcr.io/seanmorley15/adventurelog-backend", + "tag": "v0.13.0", + "host": "ghcr.io", + "floating": false, + "n_tags": 16, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v0.13.0", + "newest_major": "v0.13.0", + "behind_within_major": false, + "behind_across_major": false, + "major": 0 + }, + { + "app": "adventurelog", + "service": "adventurelog-postgres", + "ref": "postgis/postgis:16-3.5-alpine", + "repo": "postgis/postgis", + "tag": "16-3.5-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 159, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "18-3.6-alpine", + "newest_major": "16-3.5-alpine", + "behind_within_major": false, + "behind_across_major": true, + "major": 16, + "current_digest": "sha256:47e961a569fd52ff31f0fe205ed91eeab17d9f5fff6722e6d7ea6b588748b293", + "digest_error": null, + "ladder_digest": "sha256:47e961a569fd52ff31f0fe205ed91eeab17d9f5fff6722e6d7ea6b588748b293", + "ladder_tested_at": "2026-09-27T10:29:35Z", + "moved_since_tested": false + }, + { + "app": "adventurelog", + "service": "adventurelog-frontend", + "ref": "ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0", + "repo": "ghcr.io/seanmorley15/adventurelog-frontend", + "tag": "v0.13.0", + "host": "ghcr.io", + "floating": false, + "n_tags": 16, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v0.13.0", + "newest_major": "v0.13.0", + "behind_within_major": false, + "behind_across_major": false, + "major": 0 + }, + { + "app": "audiobookshelf", + "service": "audiobookshelf", + "ref": "ghcr.io/advplyr/audiobookshelf:2.36.1", + "repo": "ghcr.io/advplyr/audiobookshelf", + "tag": "2.36.1", + "host": "ghcr.io", + "floating": false, + "n_tags": 133, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "2.37.1", + "newest_major": "2.37.1", + "behind_within_major": true, + "behind_across_major": false, + "major": 2 + }, + { + "app": "bentopdf", + "service": "bentopdf", + "ref": "ghcr.io/alam00000/bentopdf:v2.8.6", + "repo": "ghcr.io/alam00000/bentopdf", + "tag": "v2.8.6", + "host": "ghcr.io", + "floating": false, + "n_tags": 507, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v2.8.8", + "newest_major": "v2.8.8", + "behind_within_major": true, + "behind_across_major": false, + "major": 2 + }, + { + "app": "bookstack", + "service": "bookstack", + "ref": "lscr.io/linuxserver/bookstack:26.05.5", + "repo": "lscr.io/linuxserver/bookstack", + "tag": "26.05.5", + "host": "lscr.io", + "floating": false, + "n_tags": 2452, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "26.09.1", + "newest_major": "26.09.1", + "behind_within_major": true, + "behind_across_major": false, + "major": 26 + }, + { + "app": "bookstack", + "service": "bookstack-db", + "ref": "mariadb:12.3", + "repo": "mariadb", + "tag": "12.3", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 957, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "13.0", + "newest_major": "12.3", + "behind_within_major": false, + "behind_across_major": true, + "major": 12, + "current_digest": "sha256:805c8e104bd563d5bfa24fadd3f31cd419ea859cb5277f32b5dbf2db714f9ed1", + "digest_error": null, + "ladder_digest": "sha256:805c8e104bd563d5bfa24fadd3f31cd419ea859cb5277f32b5dbf2db714f9ed1", + "ladder_tested_at": "2026-09-21T18:25:39.453490+00:00", + "moved_since_tested": false + }, + { + "app": "calcom", + "service": "calcom", + "ref": "calcom/cal.com:v6.2.0", + "repo": "calcom/cal.com", + "tag": "v6.2.0", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 406, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v6.2.0", + "newest_major": "v6.2.0", + "behind_within_major": false, + "behind_across_major": false, + "major": 6 + }, + { + "app": "calcom", + "service": "calcom-postgres", + "ref": "postgres:18-alpine", + "repo": "postgres", + "tag": "18-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 1427, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "18-alpine", + "newest_major": "18-alpine", + "behind_within_major": false, + "behind_across_major": false, + "major": 18, + "current_digest": "sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873", + "digest_error": null, + "ladder_digest": "sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873", + "ladder_tested_at": "2026-09-28T09:44:27Z", + "moved_since_tested": false + }, + { + "app": "calibre-web", + "service": "calibre-web", + "ref": "crocodilestick/calibre-web-automated:v4.0.6", + "repo": "crocodilestick/calibre-web-automated", + "tag": "v4.0.6", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 105, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v4.0.8", + "newest_major": "v4.0.8", + "behind_within_major": true, + "behind_across_major": false, + "major": 4 + }, + { + "app": "claper", + "service": "claper", + "ref": "ghcr.io/claperco/claper:2.5", + "repo": "ghcr.io/claperco/claper", + "tag": "2.5", + "host": "ghcr.io", + "floating": true, + "n_tags": 46, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "3.0", + "newest_major": "2.5", + "behind_within_major": false, + "behind_across_major": true, + "major": 2, + "current_digest": "sha256:4f733dc50b0c77517db402541f88c5489d4c9eedb32ac6c5eef7cadd8a594196", + "digest_error": null, + "ladder_digest": "sha256:4f733dc50b0c77517db402541f88c5489d4c9eedb32ac6c5eef7cadd8a594196", + "ladder_tested_at": "2026-09-28T08:52:08Z", + "moved_since_tested": false + }, + { + "app": "claper", + "service": "claper-postgres", + "ref": "postgres:17-alpine", + "repo": "postgres", + "tag": "17-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 1427, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "18-alpine", + "newest_major": "17-alpine", + "behind_within_major": false, + "behind_across_major": true, + "major": 17, + "current_digest": "sha256:b0f9560a2de083e2cc7382e75f808c7381a32852a7ec49117deedb300e552b24", + "digest_error": null, + "ladder_digest": "sha256:b0f9560a2de083e2cc7382e75f808c7381a32852a7ec49117deedb300e552b24", + "ladder_tested_at": "2026-09-28T08:52:08Z", + "moved_since_tested": false + }, + { + "app": "code-server", + "service": "code-server", + "ref": "lscr.io/linuxserver/code-server:4.129.0", + "repo": "lscr.io/linuxserver/code-server", + "tag": "4.129.0", + "host": "lscr.io", + "floating": false, + "n_tags": 2121, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "4.139.1", + "newest_major": "4.139.1", + "behind_within_major": true, + "behind_across_major": false, + "major": 4 + }, + { + "app": "crafty-controller", + "service": "crafty-controller", + "ref": "registry.gitlab.com/crafty-controller/crafty-4:4.10.7", + "repo": "registry.gitlab.com/crafty-controller/crafty-4", + "tag": "4.10.7", + "host": "registry.gitlab.com", + "floating": false, + "n_tags": 53, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "4.11.0", + "newest_major": "4.11.0", + "behind_within_major": true, + "behind_across_major": false, + "major": 4 + }, + { + "app": "docmost", + "service": "docmost", + "ref": "docmost/docmost:0.96.0", + "repo": "docmost/docmost", + "tag": "0.96.0", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 88, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "0.96.0", + "newest_major": "0.96.0", + "behind_within_major": false, + "behind_across_major": false, + "major": 0 + }, + { + "app": "docmost", + "service": "docmost-postgres", + "ref": "postgres:18-alpine", + "repo": "postgres", + "tag": "18-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 1427, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "18-alpine", + "newest_major": "18-alpine", + "behind_within_major": false, + "behind_across_major": false, + "major": 18, + "current_digest": "sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873", + "digest_error": null, + "ladder_digest": "sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873", + "ladder_tested_at": "2026-09-25T12:01:05Z", + "moved_since_tested": false + }, + { + "app": "docmost", + "service": "docmost-redis", + "ref": "redis:7-alpine", + "repo": "redis", + "tag": "7-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 1196, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "8-alpine", + "newest_major": "7-alpine", + "behind_within_major": false, + "behind_across_major": true, + "major": 7, + "current_digest": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499", + "digest_error": null, + "ladder_digest": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499", + "ladder_tested_at": "2026-09-25T12:01:05Z", + "moved_since_tested": false + }, + { + "app": "emby", + "service": "emby", + "ref": "emby/embyserver:4.11.0.3", + "repo": "emby/embyserver", + "tag": "4.11.0.3", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 760, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "4.11.0.4", + "newest_major": "4.11.0.4", + "behind_within_major": true, + "behind_across_major": false, + "major": 4 + }, + { + "app": "ghost", + "service": "ghost", + "ref": "ghost:6.65.0-alpine", + "repo": "ghost", + "tag": "6.65.0-alpine", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 2443, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "6.67.0-alpine", + "newest_major": "6.67.0-alpine", + "behind_within_major": true, + "behind_across_major": false, + "major": 6 + }, + { + "app": "gitea", + "service": "gitea", + "ref": "gitea/gitea:1.27.0", + "repo": "gitea/gitea", + "tag": "1.27.0", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 901, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "28.0.0", + "newest_major": "1.27.3", + "behind_within_major": true, + "behind_across_major": true, + "major": 1 + }, + { + "app": "glance", + "service": "glance", + "ref": "glanceapp/glance:v0.8.5", + "repo": "glanceapp/glance", + "tag": "v0.8.5", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 105, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v0.8.6", + "newest_major": "v0.8.6", + "behind_within_major": true, + "behind_across_major": false, + "major": 0 + }, + { + "app": "gokapi", + "service": "gokapi", + "ref": "f0rc3/gokapi:v1.9.6", + "repo": "f0rc3/gokapi", + "tag": "v1.9.6", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 39, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v2.2.4", + "newest_major": "v1.9.6", + "behind_within_major": false, + "behind_across_major": true, + "major": 1 + }, + { + "app": "grafana", + "service": "grafana", + "ref": "grafana/grafana:13.2.2", + "repo": "grafana/grafana", + "tag": "13.2.2", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 1997, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "13.2.3", + "newest_major": "13.2.3", + "behind_within_major": true, + "behind_across_major": false, + "major": 13 + }, + { + "app": "gramps-web", + "service": "gramps-web", + "ref": "ghcr.io/gramps-project/grampsweb:v25.6.0", + "repo": "ghcr.io/gramps-project/grampsweb", + "tag": "v25.6.0", + "host": "ghcr.io", + "floating": false, + "n_tags": 105, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v25.6.0", + "newest_major": "v25.6.0", + "behind_within_major": false, + "behind_across_major": false, + "major": 25 + }, + { + "app": "home-assistant", + "service": "home-assistant", + "ref": "ghcr.io/home-assistant/home-assistant:2026.9.3", + "repo": "ghcr.io/home-assistant/home-assistant", + "tag": "2026.9.3", + "host": "ghcr.io", + "floating": false, + "n_tags": 4541, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "2026.9.4", + "newest_major": "2026.9.4", + "behind_within_major": true, + "behind_across_major": false, + "major": 2026 + }, + { + "app": "homebox", + "service": "homebox", + "ref": "ghcr.io/sysadminsmedia/homebox:0.26.2", + "repo": "ghcr.io/sysadminsmedia/homebox", + "tag": "0.26.2", + "host": "ghcr.io", + "floating": false, + "n_tags": 5874, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "0.26.2", + "newest_major": "0.26.2", + "behind_within_major": false, + "behind_across_major": false, + "major": 0 + }, + { + "app": "homepage", + "service": "homepage", + "ref": "ghcr.io/gethomepage/homepage:v1.13.2", + "repo": "ghcr.io/gethomepage/homepage", + "tag": "v1.13.2", + "host": "ghcr.io", + "floating": false, + "n_tags": 197, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v2.4.0", + "newest_major": "v1.13.2", + "behind_within_major": false, + "behind_across_major": true, + "major": 1 + }, + { + "app": "immich", + "service": "immich-server", + "ref": "ghcr.io/immich-app/immich-server:v3.2.2", + "repo": "ghcr.io/immich-app/immich-server", + "tag": "v3.2.2", + "host": "ghcr.io", + "floating": false, + "status": "ok", + "n_tags": 30725, + "pinned_tag_listed": true, + "newest_all": "v3.2.4", + "newest_major": "v3.2.4", + "behind_within_major": true, + "behind_across_major": false, + "major": 3, + "retried_after_429": true + }, + { + "app": "immich", + "service": "immich-machine-learning", + "ref": "ghcr.io/immich-app/immich-machine-learning:v3.2.2", + "repo": "ghcr.io/immich-app/immich-machine-learning", + "tag": "v3.2.2", + "host": "ghcr.io", + "floating": false, + "status": "ok", + "n_tags": 206974, + "pinned_tag_listed": true, + "newest_all": "v3.2.4", + "newest_major": "v3.2.4", + "behind_within_major": true, + "behind_across_major": false, + "major": 3, + "retried_after_429": true + }, + { + "app": "immich", + "service": "immich-postgres", + "ref": "ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0", + "repo": "ghcr.io/immich-app/postgres", + "tag": "16-vectorchord0.4.3-pgvectors0.2.0", + "host": "ghcr.io", + "floating": true, + "n_tags": 174, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "17-vectorchord0.4.3-pgvectors0.3.0", + "newest_major": "16-vectorchord0.4.3-pgvectors0.3.0", + "behind_within_major": true, + "behind_across_major": true, + "major": 16, + "current_digest": "sha256:1a078b237c1d9b420b0ee59147386b4aa60d3a07a8e6a402fc84a57e41b043a4", + "digest_error": null, + "ladder_digest": "sha256:1a078b237c1d9b420b0ee59147386b4aa60d3a07a8e6a402fc84a57e41b043a4", + "ladder_tested_at": "2026-09-23T19:58:59Z", + "moved_since_tested": false + }, + { + "app": "immich", + "service": "immich-redis", + "ref": "redis:7-alpine", + "repo": "redis", + "tag": "7-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 1196, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "8-alpine", + "newest_major": "7-alpine", + "behind_within_major": false, + "behind_across_major": true, + "major": 7, + "current_digest": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499", + "digest_error": null, + "ladder_digest": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499", + "ladder_tested_at": "2026-09-23T19:58:59Z", + "moved_since_tested": false + }, + { + "app": "jellyfin", + "service": "jellyfin", + "ref": "jellyfin/jellyfin:10.11.11", + "repo": "jellyfin/jellyfin", + "tag": "10.11.11", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 13706, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "10.11.11", + "newest_major": "10.11.11", + "behind_within_major": false, + "behind_across_major": false, + "major": 10 + }, + { + "app": "kimai", + "service": "kimai", + "ref": "kimai/kimai2:apache-2.57.0", + "repo": "kimai/kimai2", + "tag": "apache-2.57.0", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 383, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "apache-2.57.0", + "newest_major": "apache-2.57.0", + "behind_within_major": false, + "behind_across_major": false, + "major": 2 + }, + { + "app": "kimai", + "service": "kimai-db", + "ref": "mariadb:11.8", + "repo": "mariadb", + "tag": "11.8", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 957, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "13.0", + "newest_major": "11.8", + "behind_within_major": false, + "behind_across_major": true, + "major": 11, + "current_digest": "sha256:79d59758afc91b89b120b0a8904d637f5a3b3e1c4900f29b740d6d46c72fef68", + "digest_error": null, + "ladder_digest": "sha256:79d59758afc91b89b120b0a8904d637f5a3b3e1c4900f29b740d6d46c72fef68", + "ladder_tested_at": "2026-09-23T19:58:59Z", + "moved_since_tested": false + }, + { + "app": "komga", + "service": "komga", + "ref": "gotson/komga:1.27.1", + "repo": "gotson/komga", + "tag": "1.27.1", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 488, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "1.28.0", + "newest_major": "1.28.0", + "behind_within_major": true, + "behind_across_major": false, + "major": 1 + }, + { + "app": "mealie", + "service": "mealie", + "ref": "ghcr.io/mealie-recipes/mealie:v3.28.0", + "repo": "ghcr.io/mealie-recipes/mealie", + "tag": "v3.28.0", + "host": "ghcr.io", + "floating": false, + "n_tags": 91, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v3.28.0", + "newest_major": "v3.28.0", + "behind_within_major": false, + "behind_across_major": false, + "major": 3 + }, + { + "app": "n8n", + "service": "n8n", + "ref": "n8nio/n8n:2.41.2", + "repo": "n8nio/n8n", + "tag": "2.41.2", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 5594, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "2.42.1", + "newest_major": "2.42.1", + "behind_within_major": true, + "behind_across_major": false, + "major": 2 + }, + { + "app": "navidrome", + "service": "navidrome", + "ref": "deluan/navidrome:0.64.1", + "repo": "deluan/navidrome", + "tag": "0.64.1", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 3309, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "0.64.2", + "newest_major": "0.64.2", + "behind_within_major": true, + "behind_across_major": false, + "major": 0 + }, + { + "app": "nextcloud", + "service": "nextcloud", + "ref": "nextcloud:34.0.4-apache", + "repo": "nextcloud", + "tag": "34.0.4-apache", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 2523, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "35.0.1-apache", + "newest_major": "34.0.4-apache", + "behind_within_major": false, + "behind_across_major": true, + "major": 34 + }, + { + "app": "nextcloud", + "service": "nextcloud-db", + "ref": "mariadb:12.3", + "repo": "mariadb", + "tag": "12.3", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 957, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "13.0", + "newest_major": "12.3", + "behind_within_major": false, + "behind_across_major": true, + "major": 12, + "current_digest": "sha256:805c8e104bd563d5bfa24fadd3f31cd419ea859cb5277f32b5dbf2db714f9ed1", + "digest_error": null, + "ladder_digest": "sha256:805c8e104bd563d5bfa24fadd3f31cd419ea859cb5277f32b5dbf2db714f9ed1", + "ladder_tested_at": "2026-09-23T20:16:04Z", + "moved_since_tested": false + }, + { + "app": "nextcloud", + "service": "nextcloud-redis", + "ref": "redis:7-alpine", + "repo": "redis", + "tag": "7-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 1196, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "8-alpine", + "newest_major": "7-alpine", + "behind_within_major": false, + "behind_across_major": true, + "major": 7, + "current_digest": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499", + "digest_error": null, + "ladder_digest": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499", + "ladder_tested_at": "2026-09-23T20:16:04Z", + "moved_since_tested": false + }, + { + "app": "onlyoffice", + "service": "onlyoffice", + "ref": "onlyoffice/documentserver:9.4.0", + "repo": "onlyoffice/documentserver", + "tag": "9.4.0", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 204, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "9.4.0", + "newest_major": "9.4.0", + "behind_within_major": false, + "behind_across_major": false, + "major": 9 + }, + { + "app": "opengist", + "service": "opengist", + "ref": "ghcr.io/thomiceli/opengist:1.15", + "repo": "ghcr.io/thomiceli/opengist", + "tag": "1.15", + "host": "ghcr.io", + "floating": true, + "n_tags": 58, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "1.15", + "newest_major": "1.15", + "behind_within_major": false, + "behind_across_major": false, + "major": 1, + "current_digest": "sha256:7edc91273ee7d10a17406da8a08c803158baaff984c39b789c1313473d068f21", + "digest_error": null, + "ladder_digest": "sha256:7edc91273ee7d10a17406da8a08c803158baaff984c39b789c1313473d068f21", + "ladder_tested_at": "2026-09-23T19:39:21Z", + "moved_since_tested": false + }, + { + "app": "outline", + "service": "outline", + "ref": "outlinewiki/outline:1.9.1", + "repo": "outlinewiki/outline", + "tag": "1.9.1", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 287, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "1.10.1", + "newest_major": "1.10.1", + "behind_within_major": true, + "behind_across_major": false, + "major": 1 + }, + { + "app": "outline", + "service": "outline-postgres", + "ref": "postgres:16-alpine", + "repo": "postgres", + "tag": "16-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 1427, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "18-alpine", + "newest_major": "16-alpine", + "behind_within_major": false, + "behind_across_major": true, + "major": 16, + "current_digest": "sha256:721873c34ceb9f8d8fc265984940dc982404c105f19ad51be9fdc5970a6080ea", + "digest_error": null, + "ladder_digest": null, + "ladder_tested_at": null + }, + { + "app": "outline", + "service": "outline-redis", + "ref": "redis:7-alpine", + "repo": "redis", + "tag": "7-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 1196, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "8-alpine", + "newest_major": "7-alpine", + "behind_within_major": false, + "behind_across_major": true, + "major": 7, + "current_digest": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499", + "digest_error": null, + "ladder_digest": null, + "ladder_tested_at": null + }, + { + "app": "paperless-ngx", + "service": "paperless-webserver", + "ref": "ghcr.io/paperless-ngx/paperless-ngx:2.20.15", + "repo": "ghcr.io/paperless-ngx/paperless-ngx", + "tag": "2.20.15", + "host": "ghcr.io", + "floating": false, + "n_tags": 206, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "3.2.1", + "newest_major": "2.20.15", + "behind_within_major": false, + "behind_across_major": true, + "major": 2 + }, + { + "app": "paperless-ngx", + "service": "paperless-postgres", + "ref": "postgres:18-alpine", + "repo": "postgres", + "tag": "18-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 1427, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "18-alpine", + "newest_major": "18-alpine", + "behind_within_major": false, + "behind_across_major": false, + "major": 18, + "current_digest": "sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873", + "digest_error": null, + "ladder_digest": "sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873", + "ladder_tested_at": "2026-09-27T09:50:50Z", + "moved_since_tested": false + }, + { + "app": "paperless-ngx", + "service": "paperless-redis", + "ref": "redis:7-alpine", + "repo": "redis", + "tag": "7-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 1196, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "8-alpine", + "newest_major": "7-alpine", + "behind_within_major": false, + "behind_across_major": true, + "major": 7, + "current_digest": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499", + "digest_error": null, + "ladder_digest": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499", + "ladder_tested_at": "2026-09-27T09:50:50Z", + "moved_since_tested": false + }, + { + "app": "papra", + "service": "papra", + "ref": "ghcr.io/papra-hq/papra:26.6.2-rootless", + "repo": "ghcr.io/papra-hq/papra", + "tag": "26.6.2-rootless", + "host": "ghcr.io", + "floating": false, + "n_tags": 91, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "26.6.2-rootless", + "newest_major": "26.6.2-rootless", + "behind_within_major": false, + "behind_across_major": false, + "major": 26 + }, + { + "app": "plant-it", + "service": "plant-it", + "ref": "msdeluise/plant-it:0.10.0", + "repo": "msdeluise/plant-it", + "tag": "0.10.0", + "host": "registry-1.docker.io", + "floating": false, + "status": "error", + "error": "HTTPError: 401 Client Error: Unauthorized for url: https://registry-1.docker.io/v2/msdeluise/plant-it/tags/list?n=1000" + }, + { + "app": "plex", + "service": "plex", + "ref": "plexinc/pms-docker:1.41.4.9463-630c9f557", + "repo": "plexinc/pms-docker", + "tag": "1.41.4.9463-630c9f557", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 230, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "1.43.4.10903-e5521bd8c", + "newest_major": "1.43.4.10903-e5521bd8c", + "behind_within_major": true, + "behind_across_major": false, + "major": 1 + }, + { + "app": "privatebin", + "service": "privatebin", + "ref": "privatebin/pdo:2.0.6", + "repo": "privatebin/pdo", + "tag": "2.0.6", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 86, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "2.0.6", + "newest_major": "2.0.6", + "behind_within_major": false, + "behind_across_major": false, + "major": 2 + }, + { + "app": "radarr", + "service": "radarr", + "ref": "lscr.io/linuxserver/radarr:6.4.4", + "repo": "lscr.io/linuxserver/radarr", + "tag": "6.4.4", + "host": "lscr.io", + "floating": false, + "n_tags": 15824, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "6.4.4", + "newest_major": "6.4.4", + "behind_within_major": false, + "behind_across_major": false, + "major": 6 + }, + { + "app": "rallly", + "service": "rallly", + "ref": "lukevella/rallly:4.11.1", + "repo": "lukevella/rallly", + "tag": "4.11.1", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 208, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "4.15.3", + "newest_major": "4.15.3", + "behind_within_major": true, + "behind_across_major": false, + "major": 4 + }, + { + "app": "rallly", + "service": "rallly-postgres", + "ref": "postgres:16-alpine", + "repo": "postgres", + "tag": "16-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 1427, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "18-alpine", + "newest_major": "16-alpine", + "behind_within_major": false, + "behind_across_major": true, + "major": 16, + "current_digest": "sha256:721873c34ceb9f8d8fc265984940dc982404c105f19ad51be9fdc5970a6080ea", + "digest_error": null, + "ladder_digest": null, + "ladder_tested_at": null + }, + { + "app": "recipe-importer", + "service": "recipe-importer", + "ref": "gitea.dooplex.hu/admin/recipe-importer:v0.9.11", + "repo": "gitea.dooplex.hu/admin/recipe-importer", + "tag": "v0.9.11", + "host": "gitea.dooplex.hu", + "floating": false, + "status": "internal" + }, + { + "app": "romm", + "service": "romm", + "ref": "rommapp/romm:5.3.1", + "repo": "rommapp/romm", + "tag": "5.3.1", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 374, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "5.3.1", + "newest_major": "5.3.1", + "behind_within_major": false, + "behind_across_major": false, + "major": 5 + }, + { + "app": "romm", + "service": "romm-db", + "ref": "mariadb:11.8", + "repo": "mariadb", + "tag": "11.8", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 957, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "13.0", + "newest_major": "11.8", + "behind_within_major": false, + "behind_across_major": true, + "major": 11, + "current_digest": "sha256:79d59758afc91b89b120b0a8904d637f5a3b3e1c4900f29b740d6d46c72fef68", + "digest_error": null, + "ladder_digest": "sha256:79d59758afc91b89b120b0a8904d637f5a3b3e1c4900f29b740d6d46c72fef68", + "ladder_tested_at": "2026-09-23T20:00:03Z", + "moved_since_tested": false + }, + { + "app": "romm", + "service": "romm-redis", + "ref": "redis:7-alpine", + "repo": "redis", + "tag": "7-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 1196, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "8-alpine", + "newest_major": "7-alpine", + "behind_within_major": false, + "behind_across_major": true, + "major": 7, + "current_digest": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499", + "digest_error": null, + "ladder_digest": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499", + "ladder_tested_at": "2026-09-23T20:00:03Z", + "moved_since_tested": false + }, + { + "app": "seerr", + "service": "seerr", + "ref": "fallenbagel/jellyseerr:2.7.3", + "repo": "fallenbagel/jellyseerr", + "tag": "2.7.3", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 141, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "2.7.3", + "newest_major": "2.7.3", + "behind_within_major": false, + "behind_across_major": false, + "major": 2 + }, + { + "app": "sonarr", + "service": "sonarr", + "ref": "lscr.io/linuxserver/sonarr:4.0.20", + "repo": "lscr.io/linuxserver/sonarr", + "tag": "4.0.20", + "host": "lscr.io", + "floating": false, + "n_tags": 6338, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "4.0.20", + "newest_major": "4.0.20", + "behind_within_major": false, + "behind_across_major": false, + "major": 4 + }, + { + "app": "sparkyfitness", + "service": "sparkyfitness-db", + "ref": "postgres:15-alpine", + "repo": "postgres", + "tag": "15-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 1427, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "18-alpine", + "newest_major": "15-alpine", + "behind_within_major": false, + "behind_across_major": true, + "major": 15, + "current_digest": "sha256:f7d23353e1b15400d22ebe31189f4d314b87a4c129cc400c8c2d8d4ca127bf81", + "digest_error": null, + "ladder_digest": null, + "ladder_tested_at": null + }, + { + "app": "sparkyfitness", + "service": "sparkyfitness-server", + "ref": "codewithcj/sparkyfitness_server:v0.17.3", + "repo": "codewithcj/sparkyfitness_server", + "tag": "v0.17.3", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 109, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v1.7.3", + "newest_major": "v0.17.3", + "behind_within_major": false, + "behind_across_major": true, + "major": 0 + }, + { + "app": "sparkyfitness", + "service": "sparkyfitness-frontend", + "ref": "codewithcj/sparkyfitness:v0.17.3", + "repo": "codewithcj/sparkyfitness", + "tag": "v0.17.3", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 114, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v1.7.3", + "newest_major": "v0.17.3", + "behind_within_major": false, + "behind_across_major": true, + "major": 0 + }, + { + "app": "tandoor", + "service": "tandoor", + "ref": "ghcr.io/tandoorrecipes/recipes:2.6.15", + "repo": "ghcr.io/tandoorrecipes/recipes", + "tag": "2.6.15", + "host": "ghcr.io", + "floating": false, + "n_tags": 241, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "2.6.15", + "newest_major": "2.6.15", + "behind_within_major": false, + "behind_across_major": false, + "major": 2 + }, + { + "app": "tandoor", + "service": "tandoor-postgres", + "ref": "postgres:17-alpine", + "repo": "postgres", + "tag": "17-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 1427, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "18-alpine", + "newest_major": "17-alpine", + "behind_within_major": false, + "behind_across_major": true, + "major": 17, + "current_digest": "sha256:b0f9560a2de083e2cc7382e75f808c7381a32852a7ec49117deedb300e552b24", + "digest_error": null, + "ladder_digest": "sha256:b0f9560a2de083e2cc7382e75f808c7381a32852a7ec49117deedb300e552b24", + "ladder_tested_at": "2026-09-27T10:07:25Z", + "moved_since_tested": false + }, + { + "app": "termix", + "service": "termix", + "ref": "ghcr.io/lukegus/termix:2.8.0", + "repo": "ghcr.io/lukegus/termix", + "tag": "2.8.0", + "host": "ghcr.io", + "floating": false, + "n_tags": 115, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "2.8.0", + "newest_major": "2.8.0", + "behind_within_major": false, + "behind_across_major": false, + "major": 2 + }, + { + "app": "uptime-kuma", + "service": "uptime-kuma", + "ref": "louislam/uptime-kuma:2.4.0", + "repo": "louislam/uptime-kuma", + "tag": "2.4.0", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 405, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "2.5.5", + "newest_major": "2.5.5", + "behind_within_major": true, + "behind_across_major": false, + "major": 2 + }, + { + "app": "vaultwarden", + "service": "vaultwarden", + "ref": "vaultwarden/server:1.36.0-alpine", + "repo": "vaultwarden/server", + "tag": "1.36.0-alpine", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 305, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "1.37.3-alpine", + "newest_major": "1.37.3-alpine", + "behind_within_major": true, + "behind_across_major": false, + "major": 1 + }, + { + "app": "vikunja", + "service": "vikunja", + "ref": "vikunja/vikunja:2.6.0", + "repo": "vikunja/vikunja", + "tag": "2.6.0", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 39, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "2.6.0", + "newest_major": "2.6.0", + "behind_within_major": false, + "behind_across_major": false, + "major": 2 + }, + { + "app": "wanderer", + "service": "wanderer", + "ref": "flomp/wanderer-web:v0.20.0", + "repo": "flomp/wanderer-web", + "tag": "v0.20.0", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 67, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v0.21.0", + "newest_major": "v0.21.0", + "behind_within_major": true, + "behind_across_major": false, + "major": 0 + }, + { + "app": "wanderer", + "service": "wanderer-db", + "ref": "flomp/wanderer-db:v0.20.0", + "repo": "flomp/wanderer-db", + "tag": "v0.20.0", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 67, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v0.21.0", + "newest_major": "v0.21.0", + "behind_within_major": true, + "behind_across_major": false, + "major": 0 + }, + { + "app": "wanderer", + "service": "wanderer-search", + "ref": "getmeili/meilisearch:v1.36.0", + "repo": "getmeili/meilisearch", + "tag": "v1.36.0", + "host": "registry-1.docker.io", + "floating": false, + "n_tags": 1088, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v1.54.2", + "newest_major": "v1.54.2", + "behind_within_major": true, + "behind_across_major": false, + "major": 1 + }, + { + "app": "wger", + "service": "wger", + "ref": "wger/server:2.6", + "repo": "wger/server", + "tag": "2.6", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 20, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "2.7", + "newest_major": "2.7", + "behind_within_major": true, + "behind_across_major": false, + "major": 2, + "current_digest": "sha256:997ead43aabdcd67d054f933e07d2b23875f01bf43271a267cb7796925ca27c4", + "digest_error": null, + "ladder_digest": null, + "ladder_tested_at": null + }, + { + "app": "wishlist", + "service": "wishlist", + "ref": "ghcr.io/cmintey/wishlist:v0.67.1", + "repo": "ghcr.io/cmintey/wishlist", + "tag": "v0.67.1", + "host": "ghcr.io", + "floating": false, + "n_tags": 107, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "v0.67.1", + "newest_major": "v0.67.1", + "behind_within_major": false, + "behind_across_major": false, + "major": 0 + }, + { + "app": "zipline", + "service": "zipline", + "ref": "ghcr.io/diced/zipline:4.6.1", + "repo": "ghcr.io/diced/zipline", + "tag": "4.6.1", + "host": "ghcr.io", + "floating": false, + "n_tags": 1370, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "4.8.0", + "newest_major": "4.8.0", + "behind_within_major": true, + "behind_across_major": false, + "major": 4 + }, + { + "app": "zipline", + "service": "zipline-postgres", + "ref": "postgres:16-alpine", + "repo": "postgres", + "tag": "16-alpine", + "host": "registry-1.docker.io", + "floating": true, + "n_tags": 1427, + "pinned_tag_listed": true, + "status": "ok", + "newest_all": "18-alpine", + "newest_major": "16-alpine", + "behind_within_major": false, + "behind_across_major": true, + "major": 16, + "current_digest": "sha256:721873c34ceb9f8d8fc265984940dc982404c105f19ad51be9fdc5970a6080ea", + "digest_error": null, + "ladder_digest": null, + "ladder_tested_at": null + } +] \ No newline at end of file diff --git a/documentation/audits/catalog-currency-2026-09-30/01-currency-run.txt b/documentation/audits/catalog-currency-2026-09-30/01-currency-run.txt new file mode 100644 index 00000000..b0464111 --- /dev/null +++ b/documentation/audits/catalog-currency-2026-09-30/01-currency-run.txt @@ -0,0 +1,80 @@ +actualbudget/actualbudget: 26.9.0 -> maj=26.9.0 all=26.9.0 float=False ok +adventurelog/adventurelog: v0.13.0 -> maj=v0.13.0 all=v0.13.0 float=False ok +adventurelog/adventurelog-postgres: 16-3.5-alpine -> maj=16-3.5-alpine all=18-3.6-alpine float=True ok +adventurelog/adventurelog-frontend: v0.13.0 -> maj=v0.13.0 all=v0.13.0 float=False ok +audiobookshelf/audiobookshelf: 2.36.1 -> maj=2.37.1 all=2.37.1 float=False ok +bentopdf/bentopdf: v2.8.6 -> maj=v2.8.8 all=v2.8.8 float=False ok +bookstack/bookstack: 26.05.5 -> maj=26.09.1 all=26.09.1 float=False ok +bookstack/bookstack-db: 12.3 -> maj=12.3 all=13.0 float=True ok +calcom/calcom: v6.2.0 -> maj=v6.2.0 all=v6.2.0 float=False ok +calcom/calcom-postgres: 18-alpine -> maj=18-alpine all=18-alpine float=True ok +calibre-web/calibre-web: v4.0.6 -> maj=v4.0.8 all=v4.0.8 float=False ok +claper/claper: 2.5 -> maj=2.5 all=3.0 float=True ok +claper/claper-postgres: 17-alpine -> maj=17-alpine all=18-alpine float=True ok +code-server/code-server: 4.129.0 -> maj=4.139.1 all=4.139.1 float=False ok +crafty-controller/crafty-controller: 4.10.7 -> maj=4.11.0 all=4.11.0 float=False ok +docmost/docmost: 0.96.0 -> maj=0.96.0 all=0.96.0 float=False ok +docmost/docmost-postgres: 18-alpine -> maj=18-alpine all=18-alpine float=True ok +docmost/docmost-redis: 7-alpine -> maj=7-alpine all=8-alpine float=True ok +emby/emby: 4.11.0.3 -> maj=4.11.0.4 all=4.11.0.4 float=False ok +ghost/ghost: 6.65.0-alpine -> maj=6.67.0-alpine all=6.67.0-alpine float=False ok +gitea/gitea: 1.27.0 -> maj=1.27.3 all=28.0.0 float=False ok +glance/glance: v0.8.5 -> maj=v0.8.6 all=v0.8.6 float=False ok +gokapi/gokapi: v1.9.6 -> maj=v1.9.6 all=v2.2.4 float=False ok +grafana/grafana: 13.2.2 -> maj=13.2.3 all=13.2.3 float=False ok +gramps-web/gramps-web: v25.6.0 -> maj=v25.6.0 all=v25.6.0 float=False ok +home-assistant/home-assistant: 2026.9.3 -> maj=2026.9.4 all=2026.9.4 float=False ok +homebox/homebox: 0.26.2 -> maj=0.26.2 all=0.26.2 float=False ok +homepage/homepage: v1.13.2 -> maj=v1.13.2 all=v2.4.0 float=False ok +immich/immich-server: v3.2.2 -> maj=None all=None float=False error HTTPError: 429 Client Error: Too Many Requests for url: https://ghcr.io/v2/immich-app/immich-server/tags/list?last=commit-43b76ddf3408f82e9ac2d0d82814c7508e962cc7&n=1000 +immich/immich-machine-learning: v3.2.2 -> maj=None all=None float=False error HTTPError: 429 Client Error: Too Many Requests for url: https://ghcr.io/v2/immich-app/immich-machine-learning/tags/list?last=pr-13094-armnn&n=1000 +immich/immich-postgres: 16-vectorchord0.4.3-pgvectors0.2.0 -> maj=16-vectorchord0.4.3-pgvectors0.3.0 all=17-vectorchord0.4.3-pgvectors0.3.0 float=True ok +immich/immich-redis: 7-alpine -> maj=7-alpine all=8-alpine float=True ok +jellyfin/jellyfin: 10.11.11 -> maj=10.11.11 all=10.11.11 float=False ok +kimai/kimai: apache-2.57.0 -> maj=apache-2.57.0 all=apache-2.57.0 float=False ok +kimai/kimai-db: 11.8 -> maj=11.8 all=13.0 float=True ok +komga/komga: 1.27.1 -> maj=1.28.0 all=1.28.0 float=False ok +mealie/mealie: v3.28.0 -> maj=v3.28.0 all=v3.28.0 float=False ok +n8n/n8n: 2.41.2 -> maj=2.42.1 all=2.42.1 float=False ok +navidrome/navidrome: 0.64.1 -> maj=0.64.2 all=0.64.2 float=False ok +nextcloud/nextcloud: 34.0.4-apache -> maj=34.0.4-apache all=35.0.1-apache float=False ok +nextcloud/nextcloud-db: 12.3 -> maj=12.3 all=13.0 float=True ok +nextcloud/nextcloud-redis: 7-alpine -> maj=7-alpine all=8-alpine float=True ok +onlyoffice/onlyoffice: 9.4.0 -> maj=9.4.0 all=9.4.0 float=False ok +opengist/opengist: 1.15 -> maj=1.15 all=1.15 float=True ok +outline/outline: 1.9.1 -> maj=1.10.1 all=1.10.1 float=False ok +outline/outline-postgres: 16-alpine -> maj=16-alpine all=18-alpine float=True ok +outline/outline-redis: 7-alpine -> maj=7-alpine all=8-alpine float=True ok +paperless-ngx/paperless-webserver: 2.20.15 -> maj=2.20.15 all=3.2.1 float=False ok +paperless-ngx/paperless-postgres: 18-alpine -> maj=18-alpine all=18-alpine float=True ok +paperless-ngx/paperless-redis: 7-alpine -> maj=7-alpine all=8-alpine float=True ok +papra/papra: 26.6.2-rootless -> maj=26.6.2-rootless all=26.6.2-rootless float=False ok +plant-it/plant-it: 0.10.0 -> maj=None all=None float=False error HTTPError: 401 Client Error: Unauthorized for url: https://registry-1.docker.io/v2/msdeluise/plant-it/tags/list?n=1000 +plex/plex: 1.41.4.9463-630c9f557 -> maj=1.43.4.10903-e5521bd8c all=1.43.4.10903-e5521bd8c float=False ok +privatebin/privatebin: 2.0.6 -> maj=2.0.6 all=2.0.6 float=False ok +radarr/radarr: 6.4.4 -> maj=6.4.4 all=6.4.4 float=False ok +rallly/rallly: 4.11.1 -> maj=4.15.3 all=4.15.3 float=False ok +rallly/rallly-postgres: 16-alpine -> maj=16-alpine all=18-alpine float=True ok +recipe-importer/recipe-importer: internal image, not upstream +romm/romm: 5.3.1 -> maj=5.3.1 all=5.3.1 float=False ok +romm/romm-db: 11.8 -> maj=11.8 all=13.0 float=True ok +romm/romm-redis: 7-alpine -> maj=7-alpine all=8-alpine float=True ok +seerr/seerr: 2.7.3 -> maj=2.7.3 all=2.7.3 float=False ok +sonarr/sonarr: 4.0.20 -> maj=4.0.20 all=4.0.20 float=False ok +sparkyfitness/sparkyfitness-db: 15-alpine -> maj=15-alpine all=18-alpine float=True ok +sparkyfitness/sparkyfitness-server: v0.17.3 -> maj=v0.17.3 all=v1.7.3 float=False ok +sparkyfitness/sparkyfitness-frontend: v0.17.3 -> maj=v0.17.3 all=v1.7.3 float=False ok +tandoor/tandoor: 2.6.15 -> maj=2.6.15 all=2.6.15 float=False ok +tandoor/tandoor-postgres: 17-alpine -> maj=17-alpine all=18-alpine float=True ok +termix/termix: 2.8.0 -> maj=2.8.0 all=2.8.0 float=False ok +uptime-kuma/uptime-kuma: 2.4.0 -> maj=2.5.5 all=2.5.5 float=False ok +vaultwarden/vaultwarden: 1.36.0-alpine -> maj=1.37.3-alpine all=1.37.3-alpine float=False ok +vikunja/vikunja: 2.6.0 -> maj=2.6.0 all=2.6.0 float=False ok +wanderer/wanderer: v0.20.0 -> maj=v0.21.0 all=v0.21.0 float=False ok +wanderer/wanderer-db: v0.20.0 -> maj=v0.21.0 all=v0.21.0 float=False ok +wanderer/wanderer-search: v1.36.0 -> maj=v1.54.2 all=v1.54.2 float=False ok +wger/wger: 2.6 -> maj=2.7 all=2.7 float=True ok +wishlist/wishlist: v0.67.1 -> maj=v0.67.1 all=v0.67.1 float=False ok +zipline/zipline: 4.6.1 -> maj=4.8.0 all=4.8.0 float=False ok +zipline/zipline-postgres: 16-alpine -> maj=16-alpine all=18-alpine float=True ok +rows 79 diff --git a/documentation/audits/catalog-currency-2026-09-30/02-retry-429-run.txt b/documentation/audits/catalog-currency-2026-09-30/02-retry-429-run.txt new file mode 100644 index 00000000..194f7f53 --- /dev/null +++ b/documentation/audits/catalog-currency-2026-09-30/02-retry-429-run.txt @@ -0,0 +1,8 @@ +429, waiting 20 s +429, waiting 20 s +429, waiting 20 s +ghcr.io/immich-app/immich-server:v3.2.2 30725 v3.2.4 v3.2.4 +429, waiting 20 s +429, waiting 20 s +429, waiting 20 s +ghcr.io/immich-app/immich-machine-learning:v3.2.2 206974 v3.2.4 v3.2.4 diff --git a/documentation/audits/catalog-currency-2026-09-30/02-retry-429.py b/documentation/audits/catalog-currency-2026-09-30/02-retry-429.py new file mode 100644 index 00000000..db1fd0f2 --- /dev/null +++ b/documentation/audits/catalog-currency-2026-09-30/02-retry-429.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 +"""Re-measure the rows 00-currency.py recorded as HTTP 429 (ghcr rate limit), slower, and merge them +into 01-currency-raw.json. Same functions, same rules; only the pacing differs.""" +import importlib.util, json, sys, time +sys.argv = ["x", "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu", "."] +spec = importlib.util.spec_from_file_location("c", "00-currency.py") +c = importlib.util.module_from_spec(spec); spec.loader.exec_module(c) +orig = c.S.get +def slow_get(*a, **k): + for i in range(8): + r = orig(*a, **k) + if r.status_code != 429: + time.sleep(1.0) + return r + wait = int(r.headers.get("Retry-After", "0") or 0) or 20 * (i + 1) + print("429, waiting", wait, "s"); time.sleep(wait) + return r +c.S.get = slow_get +rows = json.load(open("01-currency-raw.json")) +for row in rows: + if "429" not in row.get("error", ""): + continue + host, hrepo = c.host_repo(row["repo"]) + tags = c.tags_all(host, hrepo) + res = c.newest(tags, row["tag"]) + row.pop("error"); row["status"] = "ok"; row["n_tags"] = len(tags); row["pinned_tag_listed"] = row["tag"] in tags + ba, bm = res["all"], res["maj"] + row["newest_all"] = ba[0] if ba else None; row["newest_major"] = bm[0] if bm else None + row["behind_within_major"] = bool(bm and bm[1] > res["cur"]); row["behind_across_major"] = bool(ba and ba[1][0] > res["cur"][0]) + row["major"] = res["cur"][0]; row["retried_after_429"] = True + print(row["ref"], len(tags), row["newest_major"], row["newest_all"]) +json.dump(rows, open("01-currency-raw.json", "w"), indent=1) diff --git a/documentation/audits/catalog-currency-2026-09-30/03-check-test-record.txt b/documentation/audits/catalog-currency-2026-09-30/03-check-test-record.txt new file mode 100644 index 00000000..f6320f70 --- /dev/null +++ b/documentation/audits/catalog-currency-2026-09-30/03-check-test-record.txt @@ -0,0 +1 @@ +test-record gate — 53 template(s) read, 29 carry a ladder, 0 convicted diff --git a/documentation/audits/catalog-currency-2026-09-30/04-analyse-run.txt b/documentation/audits/catalog-currency-2026-09-30/04-analyse-run.txt new file mode 100644 index 00000000..59fee3ca --- /dev/null +++ b/documentation/audits/catalog-currency-2026-09-30/04-analyse-run.txt @@ -0,0 +1,26 @@ +{ + "unique_pins": 67, + "unique_floating_pins": 12, + "images": { + "images": 79, + "exact": 53, + "floating": 24, + "internal": 1, + "unmeasured": 1 + }, + "image_rows_behind_within_major": 29, + "image_rows_behind_across_major": 28, + "apps_behind_within_major_any_image": 25, + "apps_behind_across_major_any_image": 19, + "apps_behind_within_major_exact_pins_only": 24, + "apps_behind_across_major_exact_pins_only": 8, + "apps_behind_within_major_floating_only": 2, + "apps_behind_across_major_floating_only": 14, + "apps_behind_at_all": 37, + "night_a_unconditional": 28, + "night_a_conditional": 1, + "night_b_any_proven": 29 +} +night (a) unconditional 28 ['actualbudget', 'adventurelog', 'audiobookshelf', 'bookstack', 'calcom', 'claper', 'docmost', 'emby', 'ghost', 'grafana', 'home-assistant', 'immich', 'kimai', 'komga', 'mealie', 'n8n', 'navidrome', 'opengist', 'paperless-ngx', 'papra', 'privatebin', 'radarr', 'romm', 'sonarr', 'tandoor', 'termix', 'vikunja', 'wishlist'] +night (a) conditional 1 ['nextcloud'] +night (b) any proven 29 diff --git a/documentation/audits/catalog-currency-2026-09-30/04-analyse.py b/documentation/audits/catalog-currency-2026-09-30/04-analyse.py new file mode 100644 index 00000000..b97683fe --- /dev/null +++ b/documentation/audits/catalog-currency-2026-09-30/04-analyse.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python3 +"""Turn 01-currency-raw.json + the catalog's ladders + the fixture registries into the audit tables. +Offline: reads files only. Usage: python3 04-analyse.py + +THE NIGHT RULE, as the controller codes it (felhom-controller d48da6c, internal/stacks/unattended.go +legCandidate L392-463, with nextLadderStep ladder.go L152-199). Catalog-side part only — a box can +still skip for its own reasons (held, stopped, switch off, failed_before, no fresh whole copy, W+5h, +or a guarded-update refusal: no_backup / memory / disk / busy): + * the template has an update_ladder (else no_test_record, L423-424); + * the NEWEST entry whose `from` equals the box's pinned images EXACTLY, every service (sameRefs, + L426-432) — none: older_than_ladder, or no_test_record when the box is at the head (L433-439); + * that entry's verdict is "proven" (L441), and marks.needs_person is null/blank (L444); + * marks.files_may_change → only with a fresh whole copy on the box (L450-461) — "conditional". +""" +import json +import os +import sys + +CAT, OUT = sys.argv[1], sys.argv[2] +sys.path.insert(0, os.path.join(CAT, "scripts")) +import ladder # noqa: E402 +import upgrade_fixtures as fx1 # noqa: E402 (bench-native fixtures) + +# the box fixture modules import nothing heavy; read their registries as the bench does +import upgrade_fixtures_box as fxb # noqa: E402 +import upgrade_fixtures_box28 as fxb28 # noqa: E402 + +rows = json.load(open(os.path.join(OUT, "01-currency-raw.json"))) + +# SHAPE SWITCHES found by the control (09-shape-switch-check.txt, detail in 10-shape-switch-detail.txt): +# the upstream now releases under a DIFFERENT tag shape, so the shape rule read "up to date". Applied +# here by hand, each with the tag list that shows it. sonarr (a `5.14-2.0.0...-ls5` develop-style tag) +# and tandoor (a `dependabot-...` branch tag) were flagged by the same control and are NOT releases — +# left as measured. +SHAPE_SWITCH = { + "ghcr.io/gramps-project/grampsweb:v25.6.0": dict(newest_major="v25.6.0", newest_all="26.9.1", + behind_within_major=False, behind_across_major=True, + shape_note="upstream dropped the `v` prefix in 2026 (26.x.y); calendar versions, so the 25→26 step is a new year, counted as across"), + "jellyfin/jellyfin:10.11.11": dict(newest_major="10.11.11", newest_all="12.1", + behind_within_major=False, behind_across_major=True, + shape_note="upstream 12.x publishes two-part tags (`12.1`); 12.0 went through rc1..rc7"), + "kimai/kimai2:apache-2.57.0": dict(newest_major="2.67.0", newest_all="2.67.0", + behind_within_major=True, behind_across_major=False, + shape_note="upstream stopped publishing `apache-` tags after 2.57.0; plain `2.67.0` exists (whether it is the same apache variant is NOT checked)"), +} +for r in rows: + if r["ref"] in SHAPE_SWITCH: + r.update(SHAPE_SWITCH[r["ref"]]) +tdir = os.path.join(CAT, "templates") +apps = sorted(os.listdir(tdir)) + +DB_MARKERS = ("postgres", "mariadb", "mysql", "postgis", "mongo") +NO_SEED_BY_DESIGN = {"vaultwarden": "closed sign-up (R-624)", "zipline": "closed sign-up (R-624)"} + + +def fixture_state(app): + box = fxb.FIXTURES.get(app) or fxb28.FIXTURES28.get(app) + if app in NO_SEED_BY_DESIGN: + return "no route by design: " + NO_SEED_BY_DESIGN[app] + if box is not None and type(box).__name__ == "NoRoute": + return "no route: " + box.tried.split(";")[0][:70] + if app == "gitea": + return "fixture exists, fails at the web installer (R-624, fixable)" + if box is not None or app in fx1.FIXTURES: + return "fixture exists" + return "fixture needed" + + +def data_tier(app, imgs, fy_text): + engines = [s for s, r in imgs.items() if any(m in r.split(":")[0].lower() for m in DB_MARKERS)] + mandatory = "class: mandatory" in fy_text + if engines or mandatory: + why = [] + if engines: + why.append("DB engine: " + ", ".join(engines)) + if mandatory: + why.append("household files (backup class mandatory)") + return 1, "; ".join(why) + if app in ("bentopdf", "onlyoffice", "homepage", "glance"): + return 3, "little or no household data (stateless or config only)" + return 2, "household data in the app's own volume (SQLite / files)" + + +img_by_app = {} +for r in rows: + img_by_app.setdefault(r["app"], []).append(r) + +ladder_rows, plan_rows = [], [] +count_a_uncond = count_a_cond = count_b = 0 +a_apps, a_cond_apps, b_apps = [], [], [] +for app in apps: + d = os.path.join(tdir, app) + fy_text = open(os.path.join(d, ".felhom.yml"), encoding="utf-8").read() + imgs = ladder.images_in(open(os.path.join(d, "docker-compose.yml"), encoding="utf-8").read()) + entries, _r, errs = ladder.parse(fy_text) + n = len(entries) + proven = sum(1 for e in entries if e.get("verdict") == "proven") + backfilled = sum(1 for e in entries if e.get("backfilled")) + needs = [e["marks"]["needs_person"] for e in entries if (e.get("marks") or {}).get("needs_person")] + fmc = sum(1 for e in entries if (e.get("marks") or {}).get("files_may_change")) + conv = sum(1 for e in entries if e.get("engine_conversion")) + head_eq = (entries[-1]["to"] == imgs) if entries else None + # the step a box AT THE PREVIOUS PIN (= head.from) would be offered tonight, catalog-side + night = "no ladder: never (no_test_record)" + if entries: + pinned = entries[-1]["from"] + idx = max(i for i, e in enumerate(entries) if e["from"] == pinned) + e = entries[idx] + np_ = (e.get("marks") or {}).get("needs_person") + if e.get("verdict") != "proven": + night = "skip: not_proven" + elif np_ and str(np_).strip(): + night = "skip: needs_person" + elif (e.get("marks") or {}).get("files_may_change"): + night = "conditional: files_may_change (needs a fresh whole copy)" + count_a_cond += 1 + a_cond_apps.append(app) + else: + night = "yes" + count_a_uncond += 1 + a_apps.append(app) + if proven: + count_b += 1 + b_apps.append(app) + since = "" + for l in fy_text.splitlines(): + if l.startswith("catalog_since:"): + since = l.split(":", 1)[1].strip().strip('"') + ladder_rows.append((app, n, proven, backfilled, len(needs), fmc, conv, head_eq, night, since)) + + tier, why = data_tier(app, imgs, fy_text) + ir = img_by_app.get(app, []) + wm = sum(1 for r in ir if r.get("behind_within_major")) + am = sum(1 for r in ir if r.get("behind_across_major")) + plan_rows.append((tier, -(1 if n == 0 else 0), -wm, -am, app, why, n, wm, am, fixture_state(app))) + +# ---- per-image table +def yn(v): + return "yes" if v else ("no" if v is False else "?") + +lines = ["| app | service | pinned | newest same major | newest at all | behind in major | behind across major | note |", + "|---|---|---|---|---|---|---|---|"] +stats = {"images": 0, "exact": 0, "floating": 0, "internal": 0, "unmeasured": 0} +apps_in, apps_across, apps_float_only = set(), set(), set() +img_in = img_across = 0 +for r in rows: + stats["images"] += 1 + note = [] + if r["status"] == "internal": + stats["internal"] += 1 + lines.append(f"| {r['app']} | {r['service']} | `{r['tag']}` | — | — | n/a | n/a | Felhom's own image, not upstream |") + continue + if r["status"] != "ok": + stats["unmeasured"] += 1 + lines.append(f"| {r['app']} | {r['service']} | `{r['tag']}` | ? | ? | ? | ? | NOT MEASURED: {r.get('error','')[:60]} |") + continue + kind = "floating (line)" if r["floating"] else "exact" + stats["floating" if r["floating"] else "exact"] += 1 + if r["floating"]: + note.append("floating (line)") + if r.get("moved_since_tested") is False: + note.append("digest = ladder's tested digest") + elif r.get("moved_since_tested"): + note.append("digest MOVED since tested") + elif r.get("current_digest"): + note.append("no ladder digest to compare") + if r.get("shape_note"): + note.append("SHAPE SWITCH: " + r["shape_note"]) + if r.get("retried_after_429"): + note.append("measured on retry after ghcr 429") + wm, am = r.get("behind_within_major"), r.get("behind_across_major") + if wm: + img_in += 1 + apps_in.add(r["app"]) + if am: + img_across += 1 + apps_across.add(r["app"]) + lines.append(f"| {r['app']} | {r['service']} | `{r['tag']}` | `{r.get('newest_major') or '—'}` | `{r.get('newest_all') or '—'}` | {yn(wm)} | {yn(am)} | {'; '.join(note)} |") + +exact_rows = [r for r in rows if r["status"] == "ok" and not r["floating"]] +exact_in = {r["app"] for r in exact_rows if r.get("behind_within_major")} +exact_across = {r["app"] for r in exact_rows if r.get("behind_across_major")} +float_rows = [r for r in rows if r["status"] == "ok" and r["floating"]] +float_in = {r["app"] for r in float_rows if r.get("behind_within_major")} +float_across = {r["app"] for r in float_rows if r.get("behind_across_major")} +behind_any = apps_in | apps_across +summary = { + "unique_pins": len({r["ref"] for r in rows}), "unique_floating_pins": sorted({r["ref"] for r in rows if r.get("floating")}), + "images": stats, "image_rows_behind_within_major": img_in, "image_rows_behind_across_major": img_across, + "apps_behind_within_major_any_image": sorted(apps_in), + "apps_behind_across_major_any_image": sorted(apps_across), + "apps_behind_within_major_exact_pins_only": sorted(exact_in), + "apps_behind_across_major_exact_pins_only": sorted(exact_across), + "apps_behind_within_major_floating_only": sorted(float_in), + "apps_behind_across_major_floating_only": sorted(float_across), + "apps_behind_at_all": sorted(behind_any), + "night_a_unconditional": a_apps, "night_a_conditional": a_cond_apps, "night_b_any_proven": b_apps, +} +json.dump(summary, open(os.path.join(OUT, "05-summary.json"), "w"), indent=1) +open(os.path.join(OUT, "06-image-table.md"), "w").write("\n".join(lines) + "\n") + +ll = ["| app | entries | proven | of which backfilled | needs_person | files_may_change | engine conversion | head = compose | box one step behind, tonight | catalog_since |", + "|---|---|---|---|---|---|---|---|---|---|"] +for (app, n, p, bf, np_, fmc, conv, heq, night, since) in ladder_rows: + ll.append(f"| {app} | {n} | {p} | {bf} | {np_} | {fmc} | {conv} | {'—' if heq is None else ('yes' if heq else 'NO')} | {night} | {since} |") +open(os.path.join(OUT, "07-ladder-table.md"), "w").write("\n".join(ll) + "\n") + +plan_rows.sort() +pl = ["| rank | app | data at risk | ladder entries | images behind in major | across major | fixture |", + "|---|---|---|---|---|---|---|"] +for i, (tier, _nl, _wm, _am, app, why, n, wm, am, fs) in enumerate(plan_rows, 1): + pl.append(f"| {i} | {app} | T{tier}: {why} | {n} | {wm} | {am} | {fs} |") +open(os.path.join(OUT, "08-plan-table.md"), "w").write("\n".join(pl) + "\n") + +print(json.dumps({k: (len(v) if isinstance(v, list) else v) for k, v in summary.items()}, indent=1)) +print("night (a) unconditional", count_a_uncond, a_apps) +print("night (a) conditional", count_a_cond, a_cond_apps) +print("night (b) any proven", count_b) diff --git a/documentation/audits/catalog-currency-2026-09-30/05-summary.json b/documentation/audits/catalog-currency-2026-09-30/05-summary.json new file mode 100644 index 00000000..a4cbb54e --- /dev/null +++ b/documentation/audits/catalog-currency-2026-09-30/05-summary.json @@ -0,0 +1,233 @@ +{ + "unique_pins": 67, + "unique_floating_pins": [ + "ghcr.io/claperco/claper:2.5", + "ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0", + "ghcr.io/thomiceli/opengist:1.15", + "mariadb:11.8", + "mariadb:12.3", + "postgis/postgis:16-3.5-alpine", + "postgres:15-alpine", + "postgres:16-alpine", + "postgres:17-alpine", + "postgres:18-alpine", + "redis:7-alpine", + "wger/server:2.6" + ], + "images": { + "images": 79, + "exact": 53, + "floating": 24, + "internal": 1, + "unmeasured": 1 + }, + "image_rows_behind_within_major": 29, + "image_rows_behind_across_major": 28, + "apps_behind_within_major_any_image": [ + "audiobookshelf", + "bentopdf", + "bookstack", + "calibre-web", + "code-server", + "crafty-controller", + "emby", + "ghost", + "gitea", + "glance", + "grafana", + "home-assistant", + "immich", + "kimai", + "komga", + "n8n", + "navidrome", + "outline", + "plex", + "rallly", + "uptime-kuma", + "vaultwarden", + "wanderer", + "wger", + "zipline" + ], + "apps_behind_across_major_any_image": [ + "adventurelog", + "bookstack", + "claper", + "docmost", + "gitea", + "gokapi", + "gramps-web", + "homepage", + "immich", + "jellyfin", + "kimai", + "nextcloud", + "outline", + "paperless-ngx", + "rallly", + "romm", + "sparkyfitness", + "tandoor", + "zipline" + ], + "apps_behind_within_major_exact_pins_only": [ + "audiobookshelf", + "bentopdf", + "bookstack", + "calibre-web", + "code-server", + "crafty-controller", + "emby", + "ghost", + "gitea", + "glance", + "grafana", + "home-assistant", + "immich", + "kimai", + "komga", + "n8n", + "navidrome", + "outline", + "plex", + "rallly", + "uptime-kuma", + "vaultwarden", + "wanderer", + "zipline" + ], + "apps_behind_across_major_exact_pins_only": [ + "gitea", + "gokapi", + "gramps-web", + "homepage", + "jellyfin", + "nextcloud", + "paperless-ngx", + "sparkyfitness" + ], + "apps_behind_within_major_floating_only": [ + "immich", + "wger" + ], + "apps_behind_across_major_floating_only": [ + "adventurelog", + "bookstack", + "claper", + "docmost", + "immich", + "kimai", + "nextcloud", + "outline", + "paperless-ngx", + "rallly", + "romm", + "sparkyfitness", + "tandoor", + "zipline" + ], + "apps_behind_at_all": [ + "adventurelog", + "audiobookshelf", + "bentopdf", + "bookstack", + "calibre-web", + "claper", + "code-server", + "crafty-controller", + "docmost", + "emby", + "ghost", + "gitea", + "glance", + "gokapi", + "grafana", + "gramps-web", + "home-assistant", + "homepage", + "immich", + "jellyfin", + "kimai", + "komga", + "n8n", + "navidrome", + "nextcloud", + "outline", + "paperless-ngx", + "plex", + "rallly", + "romm", + "sparkyfitness", + "tandoor", + "uptime-kuma", + "vaultwarden", + "wanderer", + "wger", + "zipline" + ], + "night_a_unconditional": [ + "actualbudget", + "adventurelog", + "audiobookshelf", + "bookstack", + "calcom", + "claper", + "docmost", + "emby", + "ghost", + "grafana", + "home-assistant", + "immich", + "kimai", + "komga", + "mealie", + "n8n", + "navidrome", + "opengist", + "paperless-ngx", + "papra", + "privatebin", + "radarr", + "romm", + "sonarr", + "tandoor", + "termix", + "vikunja", + "wishlist" + ], + "night_a_conditional": [ + "nextcloud" + ], + "night_b_any_proven": [ + "actualbudget", + "adventurelog", + "audiobookshelf", + "bookstack", + "calcom", + "claper", + "docmost", + "emby", + "ghost", + "grafana", + "home-assistant", + "immich", + "kimai", + "komga", + "mealie", + "n8n", + "navidrome", + "nextcloud", + "opengist", + "paperless-ngx", + "papra", + "privatebin", + "radarr", + "romm", + "sonarr", + "tandoor", + "termix", + "vikunja", + "wishlist" + ] +} \ No newline at end of file diff --git a/documentation/audits/catalog-currency-2026-09-30/06-image-table.md b/documentation/audits/catalog-currency-2026-09-30/06-image-table.md new file mode 100644 index 00000000..03dd052a --- /dev/null +++ b/documentation/audits/catalog-currency-2026-09-30/06-image-table.md @@ -0,0 +1,81 @@ +| app | service | pinned | newest same major | newest at all | behind in major | behind across major | note | +|---|---|---|---|---|---|---|---| +| actualbudget | actualbudget | `26.9.0` | `26.9.0` | `26.9.0` | no | no | | +| adventurelog | adventurelog | `v0.13.0` | `v0.13.0` | `v0.13.0` | no | no | | +| adventurelog | adventurelog-postgres | `16-3.5-alpine` | `16-3.5-alpine` | `18-3.6-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| adventurelog | adventurelog-frontend | `v0.13.0` | `v0.13.0` | `v0.13.0` | no | no | | +| audiobookshelf | audiobookshelf | `2.36.1` | `2.37.1` | `2.37.1` | yes | no | | +| bentopdf | bentopdf | `v2.8.6` | `v2.8.8` | `v2.8.8` | yes | no | | +| bookstack | bookstack | `26.05.5` | `26.09.1` | `26.09.1` | yes | no | | +| bookstack | bookstack-db | `12.3` | `12.3` | `13.0` | no | yes | floating (line); digest = ladder's tested digest | +| calcom | calcom | `v6.2.0` | `v6.2.0` | `v6.2.0` | no | no | | +| calcom | calcom-postgres | `18-alpine` | `18-alpine` | `18-alpine` | no | no | floating (line); digest = ladder's tested digest | +| calibre-web | calibre-web | `v4.0.6` | `v4.0.8` | `v4.0.8` | yes | no | | +| claper | claper | `2.5` | `2.5` | `3.0` | no | yes | floating (line); digest = ladder's tested digest | +| claper | claper-postgres | `17-alpine` | `17-alpine` | `18-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| code-server | code-server | `4.129.0` | `4.139.1` | `4.139.1` | yes | no | | +| crafty-controller | crafty-controller | `4.10.7` | `4.11.0` | `4.11.0` | yes | no | | +| docmost | docmost | `0.96.0` | `0.96.0` | `0.96.0` | no | no | | +| docmost | docmost-postgres | `18-alpine` | `18-alpine` | `18-alpine` | no | no | floating (line); digest = ladder's tested digest | +| docmost | docmost-redis | `7-alpine` | `7-alpine` | `8-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| emby | emby | `4.11.0.3` | `4.11.0.4` | `4.11.0.4` | yes | no | | +| ghost | ghost | `6.65.0-alpine` | `6.67.0-alpine` | `6.67.0-alpine` | yes | no | | +| gitea | gitea | `1.27.0` | `1.27.3` | `28.0.0` | yes | yes | | +| glance | glance | `v0.8.5` | `v0.8.6` | `v0.8.6` | yes | no | | +| gokapi | gokapi | `v1.9.6` | `v1.9.6` | `v2.2.4` | no | yes | | +| grafana | grafana | `13.2.2` | `13.2.3` | `13.2.3` | yes | no | | +| gramps-web | gramps-web | `v25.6.0` | `v25.6.0` | `26.9.1` | no | yes | SHAPE SWITCH: upstream dropped the `v` prefix in 2026 (26.x.y); calendar versions, so the 25→26 step is a new year, counted as across | +| home-assistant | home-assistant | `2026.9.3` | `2026.9.4` | `2026.9.4` | yes | no | | +| homebox | homebox | `0.26.2` | `0.26.2` | `0.26.2` | no | no | | +| homepage | homepage | `v1.13.2` | `v1.13.2` | `v2.4.0` | no | yes | | +| immich | immich-server | `v3.2.2` | `v3.2.4` | `v3.2.4` | yes | no | measured on retry after ghcr 429 | +| immich | immich-machine-learning | `v3.2.2` | `v3.2.4` | `v3.2.4` | yes | no | measured on retry after ghcr 429 | +| immich | immich-postgres | `16-vectorchord0.4.3-pgvectors0.2.0` | `16-vectorchord0.4.3-pgvectors0.3.0` | `17-vectorchord0.4.3-pgvectors0.3.0` | yes | yes | floating (line); digest = ladder's tested digest | +| immich | immich-redis | `7-alpine` | `7-alpine` | `8-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| jellyfin | jellyfin | `10.11.11` | `10.11.11` | `12.1` | no | yes | SHAPE SWITCH: upstream 12.x publishes two-part tags (`12.1`); 12.0 went through rc1..rc7 | +| kimai | kimai | `apache-2.57.0` | `2.67.0` | `2.67.0` | yes | no | SHAPE SWITCH: upstream stopped publishing `apache-` tags after 2.57.0; plain `2.67.0` exists (whether it is the same apache variant is NOT checked) | +| kimai | kimai-db | `11.8` | `11.8` | `13.0` | no | yes | floating (line); digest = ladder's tested digest | +| komga | komga | `1.27.1` | `1.28.0` | `1.28.0` | yes | no | | +| mealie | mealie | `v3.28.0` | `v3.28.0` | `v3.28.0` | no | no | | +| n8n | n8n | `2.41.2` | `2.42.1` | `2.42.1` | yes | no | | +| navidrome | navidrome | `0.64.1` | `0.64.2` | `0.64.2` | yes | no | | +| nextcloud | nextcloud | `34.0.4-apache` | `34.0.4-apache` | `35.0.1-apache` | no | yes | | +| nextcloud | nextcloud-db | `12.3` | `12.3` | `13.0` | no | yes | floating (line); digest = ladder's tested digest | +| nextcloud | nextcloud-redis | `7-alpine` | `7-alpine` | `8-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| onlyoffice | onlyoffice | `9.4.0` | `9.4.0` | `9.4.0` | no | no | | +| opengist | opengist | `1.15` | `1.15` | `1.15` | no | no | floating (line); digest = ladder's tested digest | +| outline | outline | `1.9.1` | `1.10.1` | `1.10.1` | yes | no | | +| outline | outline-postgres | `16-alpine` | `16-alpine` | `18-alpine` | no | yes | floating (line); no ladder digest to compare | +| outline | outline-redis | `7-alpine` | `7-alpine` | `8-alpine` | no | yes | floating (line); no ladder digest to compare | +| paperless-ngx | paperless-webserver | `2.20.15` | `2.20.15` | `3.2.1` | no | yes | | +| paperless-ngx | paperless-postgres | `18-alpine` | `18-alpine` | `18-alpine` | no | no | floating (line); digest = ladder's tested digest | +| paperless-ngx | paperless-redis | `7-alpine` | `7-alpine` | `8-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| papra | papra | `26.6.2-rootless` | `26.6.2-rootless` | `26.6.2-rootless` | no | no | | +| plant-it | plant-it | `0.10.0` | ? | ? | ? | ? | NOT MEASURED: HTTPError: 401 Client Error: Unauthorized for url: https://r | +| plex | plex | `1.41.4.9463-630c9f557` | `1.43.4.10903-e5521bd8c` | `1.43.4.10903-e5521bd8c` | yes | no | | +| privatebin | privatebin | `2.0.6` | `2.0.6` | `2.0.6` | no | no | | +| radarr | radarr | `6.4.4` | `6.4.4` | `6.4.4` | no | no | | +| rallly | rallly | `4.11.1` | `4.15.3` | `4.15.3` | yes | no | | +| rallly | rallly-postgres | `16-alpine` | `16-alpine` | `18-alpine` | no | yes | floating (line); no ladder digest to compare | +| recipe-importer | recipe-importer | `v0.9.11` | — | — | n/a | n/a | Felhom's own image, not upstream | +| romm | romm | `5.3.1` | `5.3.1` | `5.3.1` | no | no | | +| romm | romm-db | `11.8` | `11.8` | `13.0` | no | yes | floating (line); digest = ladder's tested digest | +| romm | romm-redis | `7-alpine` | `7-alpine` | `8-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| seerr | seerr | `2.7.3` | `2.7.3` | `2.7.3` | no | no | | +| sonarr | sonarr | `4.0.20` | `4.0.20` | `4.0.20` | no | no | | +| sparkyfitness | sparkyfitness-db | `15-alpine` | `15-alpine` | `18-alpine` | no | yes | floating (line); no ladder digest to compare | +| sparkyfitness | sparkyfitness-server | `v0.17.3` | `v0.17.3` | `v1.7.3` | no | yes | | +| sparkyfitness | sparkyfitness-frontend | `v0.17.3` | `v0.17.3` | `v1.7.3` | no | yes | | +| tandoor | tandoor | `2.6.15` | `2.6.15` | `2.6.15` | no | no | | +| tandoor | tandoor-postgres | `17-alpine` | `17-alpine` | `18-alpine` | no | yes | floating (line); digest = ladder's tested digest | +| termix | termix | `2.8.0` | `2.8.0` | `2.8.0` | no | no | | +| uptime-kuma | uptime-kuma | `2.4.0` | `2.5.5` | `2.5.5` | yes | no | | +| vaultwarden | vaultwarden | `1.36.0-alpine` | `1.37.3-alpine` | `1.37.3-alpine` | yes | no | | +| vikunja | vikunja | `2.6.0` | `2.6.0` | `2.6.0` | no | no | | +| wanderer | wanderer | `v0.20.0` | `v0.21.0` | `v0.21.0` | yes | no | | +| wanderer | wanderer-db | `v0.20.0` | `v0.21.0` | `v0.21.0` | yes | no | | +| wanderer | wanderer-search | `v1.36.0` | `v1.54.2` | `v1.54.2` | yes | no | | +| wger | wger | `2.6` | `2.7` | `2.7` | yes | no | floating (line); no ladder digest to compare | +| wishlist | wishlist | `v0.67.1` | `v0.67.1` | `v0.67.1` | no | no | | +| zipline | zipline | `4.6.1` | `4.8.0` | `4.8.0` | yes | no | | +| zipline | zipline-postgres | `16-alpine` | `16-alpine` | `18-alpine` | no | yes | floating (line); no ladder digest to compare | diff --git a/documentation/audits/catalog-currency-2026-09-30/07-ladder-table.md b/documentation/audits/catalog-currency-2026-09-30/07-ladder-table.md new file mode 100644 index 00000000..df7d9beb --- /dev/null +++ b/documentation/audits/catalog-currency-2026-09-30/07-ladder-table.md @@ -0,0 +1,55 @@ +| app | entries | proven | of which backfilled | needs_person | files_may_change | engine conversion | head = compose | box one step behind, tonight | catalog_since | +|---|---|---|---|---|---|---|---|---|---| +| actualbudget | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| adventurelog | 1 | 1 | 0 | 0 | 0 | 0 | yes | yes | 2026-09-27 | +| audiobookshelf | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| bentopdf | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-12 | +| bookstack | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| calcom | 1 | 1 | 0 | 0 | 0 | 1 | yes | yes | 2026-09-28 | +| calibre-web | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-12 | +| claper | 1 | 1 | 0 | 0 | 0 | 1 | yes | yes | 2026-09-28 | +| code-server | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| crafty-controller | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-06-26 | +| docmost | 2 | 2 | 1 | 0 | 0 | 1 | yes | yes | 2026-09-25 | +| emby | 2 | 2 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| ghost | 2 | 2 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| gitea | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| glance | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-09-21 | +| gokapi | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| grafana | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| gramps-web | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| home-assistant | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| homebox | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-19 | +| homepage | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| immich | 2 | 2 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| jellyfin | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| kimai | 1 | 1 | 0 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| komga | 1 | 1 | 0 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| mealie | 2 | 2 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-25 | +| n8n | 3 | 3 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-25 | +| navidrome | 2 | 2 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| nextcloud | 2 | 2 | 1 | 0 | 1 | 0 | yes | conditional: files_may_change (needs a fresh whole copy) | 2026-09-23 | +| onlyoffice | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| opengist | 1 | 1 | 0 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| outline | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| paperless-ngx | 1 | 1 | 0 | 0 | 0 | 1 | yes | yes | 2026-09-27 | +| papra | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| plant-it | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-21 | +| plex | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-02-15 | +| privatebin | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| radarr | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| rallly | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| recipe-importer | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-12 | +| romm | 3 | 3 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| seerr | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| sonarr | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| sparkyfitness | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| tandoor | 2 | 2 | 1 | 0 | 0 | 1 | yes | yes | 2026-09-27 | +| termix | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| uptime-kuma | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-09-21 | +| vaultwarden | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | +| vikunja | 1 | 1 | 1 | 0 | 0 | 0 | yes | yes | 2026-09-22 | +| wanderer | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-21 | +| wger | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-19 | +| wishlist | 1 | 1 | 0 | 0 | 0 | 0 | yes | yes | 2026-09-23 | +| zipline | 0 | 0 | 0 | 0 | 0 | 0 | — | no ladder: never (no_test_record) | 2026-07-18 | diff --git a/documentation/audits/catalog-currency-2026-09-30/08-plan-table.md b/documentation/audits/catalog-currency-2026-09-30/08-plan-table.md new file mode 100644 index 00000000..5b5ad379 --- /dev/null +++ b/documentation/audits/catalog-currency-2026-09-30/08-plan-table.md @@ -0,0 +1,55 @@ +| rank | app | data at risk | ladder entries | images behind in major | across major | fixture | +|---|---|---|---|---|---|---| +| 1 | outline | T1: DB engine: outline-postgres | 0 | 1 | 2 | no route: sign-in requires an external identity provider (OIDC/Slack/Google) | +| 2 | rallly | T1: DB engine: rallly-postgres | 0 | 1 | 1 | no route: sign-in is an e-mail magic link | +| 3 | zipline | T1: DB engine: zipline-postgres | 0 | 1 | 1 | no route by design: closed sign-up (R-624) | +| 4 | calibre-web | T1: household files (backup class mandatory) | 0 | 1 | 0 | fixture needed | +| 5 | sparkyfitness | T1: DB engine: sparkyfitness-db | 0 | 0 | 3 | fixture needed | +| 6 | immich | T1: DB engine: immich-postgres; household files (backup class mandatory) | 2 | 3 | 2 | fixture exists | +| 7 | bookstack | T1: DB engine: bookstack-db | 1 | 1 | 1 | fixture exists | +| 8 | kimai | T1: DB engine: kimai-db | 1 | 1 | 1 | fixture exists | +| 9 | nextcloud | T1: DB engine: nextcloud-db; household files (backup class mandatory) | 2 | 0 | 3 | fixture exists | +| 10 | claper | T1: DB engine: claper-postgres | 1 | 0 | 2 | fixture exists | +| 11 | paperless-ngx | T1: DB engine: paperless-postgres; household files (backup class mandatory) | 1 | 0 | 2 | fixture exists | +| 12 | romm | T1: DB engine: romm-db | 3 | 0 | 2 | fixture exists | +| 13 | adventurelog | T1: DB engine: adventurelog-postgres | 1 | 0 | 1 | fixture exists | +| 14 | docmost | T1: DB engine: docmost-postgres | 2 | 0 | 1 | fixture exists | +| 15 | tandoor | T1: DB engine: tandoor-postgres | 2 | 0 | 1 | fixture exists | +| 16 | calcom | T1: DB engine: calcom-postgres | 1 | 0 | 0 | fixture exists | +| 17 | wanderer | T2: household data in the app's own volume (SQLite / files) | 0 | 3 | 0 | fixture needed | +| 18 | gitea | T2: household data in the app's own volume (SQLite / files) | 0 | 1 | 1 | fixture exists, fails at the web installer (R-624, fixable) | +| 19 | code-server | T2: household data in the app's own volume (SQLite / files) | 0 | 1 | 0 | no route: its front door is a browser IDE behind one password | +| 20 | crafty-controller | T2: household data in the app's own volume (SQLite / files) | 0 | 1 | 0 | fixture needed | +| 21 | plex | T2: household data in the app's own volume (SQLite / files) | 0 | 1 | 0 | no route: the first-run claim needs a token minted at plex.tv by a real Plex acc | +| 22 | uptime-kuma | T2: household data in the app's own volume (SQLite / files) | 0 | 1 | 0 | fixture needed | +| 23 | vaultwarden | T2: household data in the app's own volume (SQLite / files) | 0 | 1 | 0 | no route by design: closed sign-up (R-624) | +| 24 | wger | T2: household data in the app's own volume (SQLite / files) | 0 | 1 | 0 | fixture needed | +| 25 | gokapi | T2: household data in the app's own volume (SQLite / files) | 0 | 0 | 1 | fixture needed | +| 26 | gramps-web | T2: household data in the app's own volume (SQLite / files) | 0 | 0 | 1 | fixture exists | +| 27 | jellyfin | T2: household data in the app's own volume (SQLite / files) | 0 | 0 | 1 | fixture exists | +| 28 | homebox | T2: household data in the app's own volume (SQLite / files) | 0 | 0 | 0 | fixture exists | +| 29 | plant-it | T2: household data in the app's own volume (SQLite / files) | 0 | 0 | 0 | fixture needed | +| 30 | recipe-importer | T2: household data in the app's own volume (SQLite / files) | 0 | 0 | 0 | fixture needed | +| 31 | seerr | T2: household data in the app's own volume (SQLite / files) | 0 | 0 | 0 | fixture needed | +| 32 | audiobookshelf | T2: household data in the app's own volume (SQLite / files) | 1 | 1 | 0 | fixture exists | +| 33 | emby | T2: household data in the app's own volume (SQLite / files) | 2 | 1 | 0 | fixture exists | +| 34 | ghost | T2: household data in the app's own volume (SQLite / files) | 2 | 1 | 0 | fixture exists | +| 35 | grafana | T2: household data in the app's own volume (SQLite / files) | 1 | 1 | 0 | fixture exists | +| 36 | home-assistant | T2: household data in the app's own volume (SQLite / files) | 1 | 1 | 0 | fixture exists | +| 37 | komga | T2: household data in the app's own volume (SQLite / files) | 1 | 1 | 0 | fixture exists | +| 38 | n8n | T2: household data in the app's own volume (SQLite / files) | 3 | 1 | 0 | fixture exists | +| 39 | navidrome | T2: household data in the app's own volume (SQLite / files) | 2 | 1 | 0 | fixture exists | +| 40 | actualbudget | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 41 | mealie | T2: household data in the app's own volume (SQLite / files) | 2 | 0 | 0 | fixture exists | +| 42 | opengist | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 43 | papra | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 44 | privatebin | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 45 | radarr | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 46 | sonarr | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 47 | termix | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 48 | vikunja | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 49 | wishlist | T2: household data in the app's own volume (SQLite / files) | 1 | 0 | 0 | fixture exists | +| 50 | bentopdf | T3: little or no household data (stateless or config only) | 0 | 1 | 0 | fixture needed | +| 51 | glance | T3: little or no household data (stateless or config only) | 0 | 1 | 0 | fixture needed | +| 52 | homepage | T3: little or no household data (stateless or config only) | 0 | 0 | 1 | no route: a dashboard rendered from config files in the template | +| 53 | onlyoffice | T3: little or no household data (stateless or config only) | 0 | 0 | 0 | no route: a stateless document server: it holds no household data of its own, so | diff --git a/documentation/audits/catalog-currency-2026-09-30/09-shape-switch-check.txt b/documentation/audits/catalog-currency-2026-09-30/09-shape-switch-check.txt new file mode 100644 index 00000000..aae2669c --- /dev/null +++ b/documentation/audits/catalog-currency-2026-09-30/09-shape-switch-check.txt @@ -0,0 +1,21 @@ +actualbudget/actual-server:26.9.0: pinned core (26, 9, 0); highest any-shape 26.9.0 -> ok +ghcr.io/seanmorley15/adventurelog-backend:v0.13.0: pinned core (0, 13, 0); highest any-shape v0.13.0 -> ok +ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0: pinned core (0, 13, 0); highest any-shape v0.13.0 -> ok +calcom/cal.com:v6.2.0: pinned core (6, 2, 0); highest any-shape v6.2.0 -> ok +docmost/docmost:0.96.0: pinned core (0, 96, 0); highest any-shape 0.96.0 -> ok +ghcr.io/gramps-project/grampsweb:v25.6.0: pinned core (25, 6, 0); highest any-shape 26.9.1 -> HIGHER-ANY-SHAPE +ghcr.io/sysadminsmedia/homebox:0.26.2: pinned core (0, 26, 2); highest any-shape 0.26.2 -> ok +jellyfin/jellyfin:10.11.11: pinned core (10, 11, 11); highest any-shape 12.1 -> HIGHER-ANY-SHAPE +kimai/kimai2:apache-2.57.0: pinned core (2, 57, 0); highest any-shape 2.67.0 -> HIGHER-ANY-SHAPE +ghcr.io/mealie-recipes/mealie:v3.28.0: pinned core (3, 28, 0); highest any-shape v3.28.0 -> ok +onlyoffice/documentserver:9.4.0: pinned core (9, 4, 0); highest any-shape 9.4.0.1 -> ok +ghcr.io/papra-hq/papra:26.6.2-rootless: pinned core (26, 6, 2); highest any-shape 26.6.2-root -> ok +privatebin/pdo:2.0.6: pinned core (2, 0, 6); highest any-shape 2.0.6 -> ok +lscr.io/linuxserver/radarr:6.4.4: pinned core (6, 4, 4); highest any-shape amd64-6.4.4.10685-ls317 -> ok +rommapp/romm:5.3.1: pinned core (5, 3, 1); highest any-shape 5.3.1 -> ok +fallenbagel/jellyseerr:2.7.3: pinned core (2, 7, 3); highest any-shape 2.7.3 -> ok +lscr.io/linuxserver/sonarr:4.0.20: pinned core (4, 0, 20); highest any-shape amd64-5.14-2.0.0.5344-ls5 -> HIGHER-ANY-SHAPE +ghcr.io/tandoorrecipes/recipes:2.6.15: pinned core (2, 6, 15); highest any-shape dependabot-pip-drf-spectacular-sidecar-2025.10.1 -> HIGHER-ANY-SHAPE +ghcr.io/lukegus/termix:2.8.0: pinned core (2, 8, 0); highest any-shape release-2.8.0 -> ok +vikunja/vikunja:2.6.0: pinned core (2, 6, 0); highest any-shape 2.6.0 -> ok +ghcr.io/cmintey/wishlist:v0.67.1: pinned core (0, 67, 1); highest any-shape v0.67.1 -> ok diff --git a/documentation/audits/catalog-currency-2026-09-30/10-shape-switch-detail.txt b/documentation/audits/catalog-currency-2026-09-30/10-shape-switch-detail.txt new file mode 100644 index 00000000..05d6277e --- /dev/null +++ b/documentation/audits/catalog-currency-2026-09-30/10-shape-switch-detail.txt @@ -0,0 +1,3 @@ +gramps-project/grampsweb 105 ['26.4.3', '26.5.0', '26.5.1', '26.5.2', '26.5.3', '26.6.0', '26.6.1', '26.6.2', '26.7.0', '26.7.1', '26.8.0', '26.8.1', '26.9.0', '26.9.1', 'v25.1.0', 'v25.1.1', 'v25.2.0', 'v25.3.0', 'v25.3.1', 'v25.4.0', 'v25.4.1', 'v25.5.0', 'v25.5.1', 'v25.5.2', 'v25.6.0'] +jellyfin/jellyfin 13706 ['12.0-rc3', '12.0-rc3-amd64.20260722-020441', '12.0-rc3-arm64.20260722-020441', '12.0-rc3.20260722-020441', '12.0-rc4', '12.0-rc4-amd64.20260802-222750', '12.0-rc4-arm64.20260802-222750', '12.0-rc4.20260802-222750', '12.0-rc5', '12.0-rc5-amd64.20260811-003839', '12.0-rc5-arm64.20260811-003839', '12.0-rc5.20260811-003839', '12.0-rc6', '12.0-rc6-amd64.20260826-011825', '12.0-rc6-arm64.20260826-011825', '12.0-rc6.20260826-011825', '12.0-rc7', '12.0-rc7-amd64.20260831-232051', '12.0-rc7-arm64.20260831-232051', '12.0-rc7.20260831-232051', '12.0.20260908-012347', '12.1', '12.1-amd64.20260915-010956', '12.1-arm64.20260915-010956', '12.1.20260915-010956'] +kimai/kimai2 383 ['2.58.0', '2.59.0', '2.60.0', '2.61.0', '2.62.0', '2.63.0', '2.64.0', '2.65.0', '2.66.0', '2.67.0', 'apache-2.57.0'] diff --git a/documentation/audits/pg-last-six-2026-09-30/A1/upstream-notes.md b/documentation/audits/pg-last-six-2026-09-30/A1/upstream-notes.md new file mode 100644 index 00000000..db97e15c --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/A1/upstream-notes.md @@ -0,0 +1,141 @@ +# A1 — upstream PostgreSQL notes for the last six apps (2026-09-30) + +Read-only research. Fetched 2026-09-30 with curl (GitHub raw / API, ghcr, Docker Hub) and WebFetch +(docs sites). Nothing on any Felhom host was touched. Rule applied: Felhom decision 42. + +## Catalog pins (app-catalog-felhom.eu/templates//docker-compose.yml, working tree) + +| app | app image | db image | data mount | +|---|---|---|---| +| outline | outlinewiki/outline:1.9.1 | postgres:16-alpine | /var/lib/postgresql/data | +| rallly | lukevella/rallly:4.11.1 | postgres:16-alpine | /var/lib/postgresql/data | +| zipline | ghcr.io/diced/zipline:4.6.1 | postgres:16-alpine | /var/lib/postgresql/data | +| sparkyfitness | codewithcj/sparkyfitness(_server):v0.17.3 | postgres:15-alpine | /var/lib/postgresql/data, PGDATA=/var/lib/postgresql/data/pgdata | +| adventurelog | ghcr.io/seanmorley15/adventurelog-backend/-frontend:v0.13.0 | postgis/postgis:16-3.5-alpine | /var/lib/postgresql/data | +| immich | ghcr.io/immich-app/immich-server:v3.2.2 | ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0 | /var/lib/postgresql/data | + +## Newest upstream releases (GitHub API /releases, 2026-09-30) + +- outline/outline: v1.10.1 (2026-09-09) +- lukevella/rallly: v4.15.3 (2026-09-29); pinned v4.11.1 published 2026-06-20 +- diced/zipline: v4.8.0 (2026-09-27) +- CodeWithCJ/SparkyFitness: v1.7.3 (2026-09-28); pinned v0.17.3 published 2026-07-06 +- seanmorley15/AdventureLog: v0.13.0 (2026-08-12) = pinned +- immich-app/immich: v3.2.4 (2026-09-28) latest stable; v3.3.0-rc.0 (2026-09-29) prerelease + +## PostgreSQL EOL (https://www.postgresql.org/support/versioning/, fetched 2026-09-30) + +18: 18.6, first 2025-09-25, final November 14, 2030 · 17: 17.11, final November 8, 2029 · +16: 16.15, final November 9, 2028 · 15: 15.19, final November 11, 2027 · 14: 14.24, final November 12, 2026. +PG 19 is in beta (19 Beta 4), not yet in the table. + +## outline + +- https://raw.githubusercontent.com/outline/outline/v1.9.1/docker-compose.yml and .../v1.10.1/docker-compose.yml + — this is the LOCAL-DEV compose (ports on 127.0.0.1, no app service). Both tags: + ` postgres:` / ` image: postgres` (unpinned = latest). +- https://raw.githubusercontent.com/outline/outline/v1.9.1/.github/workflows/ci.yml line 94 and + .../v1.10.1/.github/workflows/ci.yml line 115: ` image: postgres:14.2` (CI test DB). +- Official self-host compose = docs page https://docs.getoutline.com/s/hosting/doc/docker-7pfeLP5a8t + (unversioned, read 2026-09-30): `image: postgres:18`, volume `database-data:/var/lib/postgresql`. +- Requirements https://docs.getoutline.com/s/hosting/doc/requirements-ULdYnwi4wG: "PostgreSQL (v14+)". +- What the docs compose said at v1.9.1: NOT FOUND (docs are not versioned; the Wayback Machine returned + 429 / "Temporarily Offline"). + +## rallly + +- https://raw.githubusercontent.com/lukevella/rallly/v4.11.1/docker-compose.yml and .../v4.15.3/docker-compose.yml + (repo-root compose, builds from source): ` image: postgres:18-alpine`, ` - db-data:/var/lib/postgresql`. + Commit history of that file: `3407ebeb 2026-05-07 ⬆️ Upgrade postgres to 18-alpine` (before v4.11.1). +- Official self-host repo https://raw.githubusercontent.com/lukevella/rallly-selfhosted/main/docker-compose.yml + (not tagged per app version): + ` image: postgres:${POSTGRES_VERSION:-14}-alpine` with comment "(… fresh installs get 18). The defaults below + match the original postgres 14 deployment … They are a compatibility fallback, not a version choice"; and + "postgres images ≥18 moved PGDATA and expect the volume mounted at /var/lib/postgresql instead of /var/lib/postgresql/data." + History: `75c23d09 2026-07-08 Provision Postgres 18 on fresh installs, pin existing volumes to their major`, + `3e8fe380 2026-07-14 Add upgrade-db command and Postgres EOL warning`. +- https://raw.githubusercontent.com/lukevella/rallly-selfhosted/main/README.md: + "`POSTGRES_VERSION` | Bundled Postgres major version — pinned automatically on first start (18 for fresh installs, …)"; + "To move to the current version (18):" … "`./rallly.sh upgrade-db`" "dumps the database …, restores it into a fresh PostgreSQL 18 volume". +- Documented lower bound: not found. + +## zipline + +- https://raw.githubusercontent.com/diced/zipline/v4.6.1/docker-compose.yml and .../v4.8.0/docker-compose.yml: + ` image: postgres:16`, ` - pgdata:/var/lib/postgresql/data`. Dev compose same (`image: postgres:16`) at both. + File history has no postgres bump since `651efbc0 2024-12-28 feat: prisma migrations`. +- https://zipline.diced.sh/docs/get-started/docker: "This guide uses PostgreSQL"; no version sentence. +- https://raw.githubusercontent.com/diced/zipline-docs/trunk/docs/guides/migrate-pg-14-15.md: "PostgreSQL 14 is + still supported until November 12th, 2026." +- Documented upper bound / PG17/18 statement: NOT FOUND (GitHub issue search "postgres 17 OR postgres 18" returned + nothing relevant; #1054 is a collation-version mismatch report, not a major-version one). + +## sparkyfitness + +- https://raw.githubusercontent.com/CodeWithCJ/SparkyFitness/v0.17.3/docker/docker-compose.prod.yml: + ` image: postgres:18.3-alpine`, ` - ${DB_PATH:-./postgresql}:/var/lib/postgresql`. +- https://raw.githubusercontent.com/CodeWithCJ/SparkyFitness/v1.7.3/docker/docker-compose.prod.yml: same two lines. +- Commit `57536c4a 2026-03-20 Postgres 18.3 upgrade` (touches docker-compose.prod.yml + docs/content/1.install/8.postgres-upgrade.md). +- Stale doc at the pinned tag: https://raw.githubusercontent.com/CodeWithCJ/SparkyFitness/v0.17.3/docs/content/1.install/1.docker-compose.md + line 44 `* **Image**: \`postgres:15-alpine\`` (contradicts the compose in the same tag). At v1.7.3 + docs/src/install/docker-compose.md line 51: `- **Image**: \`postgres:18.3-alpine\``. +- https://raw.githubusercontent.com/CodeWithCJ/SparkyFitness/v1.7.3/docs/src/install/postgres-upgrade.md: + "# PostgreSQL Upgrade (15 to 18.3)" … "upgrading your SparkyFitness PostgreSQL database from version 15-alpine to 18.3-alpine" + … method `pg_dumpall -U sparky > ./full_backup.sql`, fresh dir, remount at `/var/lib/postgresql`. +- .../v1.7.3/docs/src/install/external-database.md: "**No extensions required.** As of v0.17.0 release, SparkyFitness no + longer depends on `uuid-ossp`, `pgcrypto`, or `pg_stat_statements`." and "UUID generation uses the built-in + `gen_random_uuid()` (PostgreSQL 13+)"; "PostgreSQL 15+ only: the default public schema permissions changed in PG 15." +- Version gap: pinned v0.17.3 (2026-07-06) vs newest v1.7.3 (2026-09-28) — crosses 0.x -> 1.x. + +## adventurelog + +- https://raw.githubusercontent.com/seanmorley15/AdventureLog/v0.13.0/docker-compose.yml: ` image: postgis/postgis:16-3.5`, + ` - postgres_data:/var/lib/postgresql/data/`. Same in docker/docker-compose.database.yml, .dev.yml, .advanced.yml + at v0.13.0 and in main/docker-compose.yml (2026-09-30). v0.13.0 is the newest release. +- https://raw.githubusercontent.com/seanmorley15/AdventureLog/v0.13.0/documentation/docs/install/docker.md line 29: + "It is recommended to use the `imresamu/postgis:16-3.5-alpine` image" (ARM note). +- backend/server/requirements.txt at v0.13.0: `Django==5.2.13`, `psycopg2-binary==2.9.10`. +- Documented supported PG range: NOT FOUND in AdventureLog docs. +- Docker Hub https://hub.docker.com/v2/repositories/postgis/postgis/tags?page_size=100&name=alpine (count 81, all read): + 16-3.5-alpine (updated 2026-08-31), 16-3.4-alpine; NO 16-3.6-alpine. 17-3.5-alpine and 17-3.6-alpine (2026-08-31). + 18-3.6-alpine (2026-08-31); NO 18-3.5-alpine. 19beta1-3.6-alpine. +- PostGIS https://postgis.net/docs/manual-3.6/postgis_administration.html ("Upgrading spatial databases"): + "By HARD UPGRADE we mean full dump/reload of postgis-enabled databases."; "If you are running PostGIS 3 or above, + then you should use the PostGIS_Extensions_Upgrade function to upgrade to the latest version you have installed." + (in-place/soft path); "If you installed PostGIS originally without a version specified, you can often skip the + reinstallation of postgis extension before restoring since the backup just has `CREATE EXTENSION postgis` and thus + picks up the newest latest version during restore." + +## immich + +- https://raw.githubusercontent.com/immich-app/immich/v3.2.2/docker/docker-compose.yml line 59, identical at v3.2.4 and + v3.3.0-rc.0: ` image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23` + and ` - ${DB_DATA_LOCATION}:/var/lib/postgresql/data`. +- https://raw.githubusercontent.com/immich-app/immich/v3.2.4/docs/docs/administration/postgres-standalone.md (same at v3.2.2): + "Immich is known to work with Postgres versions `>= 14, < 20`." / "The current accepted range for VectorChord is `>= 0.3, < 2.0`." + / "Support for pgvecto.rs has been dropped as of 3.0" / "When installing a new version of VectorChord, you will need to + manually update the extension and reindex … `ALTER EXTENSION vchord UPDATE; REINDEX INDEX face_index; REINDEX INDEX clip_index;`" +- .../docs/docs/install/upgrading.md: "The new DB image includes pgvector and pgvecto.rs in addition to VectorChord, so you + can use this image to restore from existing backups that used either of these extensions. However, backups made after + switching to VectorChord require an image containing VectorChord to restore successfully." / "you can optionally switch to + an image variant that doesn’t have pgvecto.rs installed after you’ve performed the migration and started Immich: + `ghcr.io/immich-app/postgres:14-vectorchord0.4.3`, changing the PostgreSQL version as appropriate." + / "it’s normal for the server logs to be seemingly stuck at `Reindexing clip_index` and `Reindexing face_index`". +- .../docs/docs/administration/backup-and-restore.md: manual backup = `pg_dump --clean --if-exists --dbname=…`; restore = + pipe into psql with `--single-transaction --set ON_ERROR_STOP=on` on a fresh DB; "requires a completely fresh install". + Whether vector indexes are carried or rebuilt by a dump/restore: NOT STATED in the docs. +- Server source v3.2.4: + - server/src/constants.ts: `export const POSTGRES_VERSION_RANGE = '>=14.0.0';`, `export const VECTORCHORD_VERSION_RANGE = '>=0.3 <2';` + - server/src/services/database.service.ts (startup, under the migrations lock): `if (installedVersion && semver.gt(availableVersion, installedVersion)) { await this.updateExtension(extension, availableVersion); }` + … `await this.databaseRepository.reindexVectorsIfNeeded([VectorIndex.Clip, VectorIndex.Face]);` … and + `if (dbName !== extension && installedVersion && !isDepended) { await this.dropExtension(dbName); }` (drops any + installed non-active vector extension, i.e. pgvecto.rs `vectors`, keeping pgvector `vector` because vchord depends on it). + - server/src/repositories/database.repository.ts `updateVectorExtension`: drops clip_index/face_index, `ALTER EXTENSION … UPDATE TO`, + then `reindexVectors` both. `reindexVectorsIfNeeded` rebuilds an index that is missing, not `using vchordrq`, or whose `lists` + no longer matches the row count. +- ghcr tags (anonymous token, https://ghcr.io/v2/immich-app/postgres/tags/list, 174 tags, all of form `-vectorchord…`): + - 16: 16-vectorchord0.4.3, 16-vectorchord0.4.3-pgvectors0.2.0/0.2.1/0.3.0, …-pgvector0.8.1…, 16-vectorchord0.5.3, + 16-vectorchord0.5.3-pgvector0.8.1, 16-vectorchord1.1.1 + - 17: pgvecto.rs only as `-pgvectors0.3.0` (no 0.2.x); 17-vectorchord0.4.3, 17-vectorchord0.5.3, 17-vectorchord1.1.1 + - 18: ONLY 18-vectorchord0.5.3, 18-vectorchord0.5.3-pgvector0.8.1, 18-vectorchord1.1.1 — no pgvecto.rs variant, no vchord 0.4.x + - no PG19 tag. diff --git a/documentation/audits/pg-last-six-2026-09-30/C/C-restore.txt b/documentation/audits/pg-last-six-2026-09-30/C/C-restore.txt new file mode 100644 index 00000000..727f5c13 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/C/C-restore.txt @@ -0,0 +1,18 @@ +13:48:49 # restore 2026-09-30T13:48:49.236246+02:00 +13:49:13 settings backup_window_start before restore: 11:29 +settings backup_window_start after restore: None +controller.yaml vs the saved copy: +IDENTICAL +0 +6: db_dump_schedule: "02:30" +2026/09/30 11:48:53 quiesce.go:185: [INFO] [quiesce] loop started (poll 5m0s, max-quiesce 30m0s) +2026/09/30 11:48:53 scheduler.go:132: [INFO] [scheduler] Daily job db-dump scheduled for 2026-10-01 02:30 CEST +2026/09/30 11:48:53 scheduler.go:132: [INFO] [scheduler] Daily job tier2-backup scheduled for 2026-10-01 03:30 CEST +2026/09/30 11:48:53 scheduler.go:132: [INFO] [scheduler] Daily job offbox-backup scheduled for 2026-10-01 04:15 CEST +2026/09/30 11:48:53 scheduler.go:132: [INFO] [scheduler] Daily job offsite-abandon-sweep scheduled for 2026-10-01 05:10 CEST +2026/09/30 11:48:53 scheduler.go:132: [INFO] [scheduler] Daily job offsite-integrity scheduled for 2026-10-01 06:00 CEST +2026/09/30 11:48:53 scheduler.go:132: [INFO] [scheduler] Daily job offsite-proof scheduled for 2026-10-01 05:30 CEST +2026/09/30 11:48:53 scheduler.go:132: [INFO] [scheduler] Daily job metrics-prune scheduled for 2026-10-01 04:00 CEST +2026/09/30 11:48:53 scheduler.go:132: [INFO] [scheduler] Daily job fill-watch scheduled for 2026-10-01 03:30 CEST +2026/09/30 11:49:08 main.go:2462: [INFO] [bootrecon] boot window: fleet settled after 10s (3 identical samples 5s apart) — sweeping + diff --git a/documentation/audits/pg-last-six-2026-09-30/C/C-run-log.txt b/documentation/audits/pg-last-six-2026-09-30/C/C-run-log.txt new file mode 100644 index 00000000..21570ac2 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/C/C-run-log.txt @@ -0,0 +1,24 @@ +2026/09/30 11:28:26 night_chain.go:108: [INFO] [night-chain] manual run started from 172.18.0.3:59634: [db-dump tier2 offsite update-leg] +2026/09/30 11:28:26 night_chain.go:84: [INFO] [night-chain] manual run of tonight's chain: dump → second drive → off-site → update leg +2026/09/30 11:28:26 night_chain.go:77: [INFO] [night-chain] db-dump: started +2026/09/30 11:30:26 night_chain.go:82: [INFO] [night-chain] db-dump: done in 2m0s +2026/09/30 11:30:26 night_chain.go:77: [INFO] [night-chain] tier2: started +2026/09/30 11:30:34 night_chain.go:82: [INFO] [night-chain] tier2: done in 8s +2026/09/30 11:30:34 night_chain.go:77: [INFO] [night-chain] offsite: started +2026/09/30 11:34:19 night_chain.go:82: [INFO] [night-chain] offsite: done in 3m45s +2026/09/30 11:34:19 night_chain.go:77: [INFO] [night-chain] update-leg: started +2026/09/30 11:34:19 unattended.go:270: [INFO] [update-leg] started (manual-chain): window 02:30, no step starts at or after 16:49 +2026/09/30 11:34:19 unattended.go:336: [INFO] [update-leg] bookstack: step pressed bookstack=lscr.io/linuxserver/bookstack:26.05.5, bookstack-db=mariadb:12.3 → bookstack=lscr.io/linuxserver/bookstack:26.09.1, bookstack-db=mariadb:12.3 +2026/09/30 11:35:11 quiesce.go:255: [INFO] [quiesce] full-system backup due and inside its window, but the automatic update leg is running (it starts no step after 16:29) — deferring to the next poll (`09` decision 20) +2026/09/30 11:35:14 unattended.go:343: [INFO] [update-leg] bookstack: step ended done after 55.1 s +2026/09/30 11:35:14 unattended.go:336: [INFO] [update-leg] kimai: step pressed kimai=kimai/kimai2:apache-2.57.0, kimai-db=mariadb:11.8 → kimai=kimai/kimai2:2.67.0, kimai-db=mariadb:11.8 +2026/09/30 11:36:11 quiesce.go:255: [INFO] [quiesce] full-system backup due and inside its window, but the automatic update leg is running (it starts no step after 16:29) — deferring to the next poll (`09` decision 20) +2026/09/30 11:36:29 unattended.go:343: [INFO] [update-leg] kimai: step ended done after 75.1 s +2026/09/30 11:36:29 unattended.go:248: [INFO] [update-leg] update leg (manual-chain): done=2 undone=0 held=0 failed=0 skipped=0 in 2m10s [skipped: ] +2026/09/30 11:36:29 night_chain.go:82: [INFO] [night-chain] update-leg: done in 2m10s +2026/09/30 11:36:29 night_chain.go:93: [INFO] [night-chain] finished in 8m3s +2026/09/30 11:37:11 quiesce.go:505: [INFO] [quiesce] backup due on 1 tier(s) — quiescing 10 stack(s): [adventurelog bentopdf bookstack calibre-web docmost kimai opengist paperless-ngx privatebin romm] +2026/09/30 11:37:38 quiesce.go:554: [INFO] [quiesce] tier local: backup job backup-9201-1790768258239656621 started — polling +2026/09/30 11:37:48 quiesce.go:623: [INFO] [quiesce] tier local: job backup-9201-1790768258239656621 snapshotted — resuming app early (8B.2) +2026/09/30 11:37:48 quiesce.go:492: [INFO] [quiesce] unquiescing (snapshotted (early resume, last tier)): restarting 10 stack(s) +2026/09/30 11:47:19 quiesce.go:628: [INFO] [quiesce] tier local: backup job backup-9201-1790768258239656621 done diff --git a/documentation/audits/pg-last-six-2026-09-30/C/C-run.txt b/documentation/audits/pg-last-six-2026-09-30/C/C-run.txt new file mode 100644 index 00000000..737af3e1 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/C/C-run.txt @@ -0,0 +1,67 @@ +13:28:26 # run 2026-09-30T13:28:26.437912+02:00 since 2026-09-30T11:28:25Z +13:28:26 night-chain press -> 202 {"data": {"legs": ["db-dump", "tier2", "offsite", "update-leg"]}, "message": "started", "ok": true} + LOG 2026/09/30 11:28:26 night_chain.go:108: [INFO] [night-chain] manual run started from 172.18.0.3:59634: [db-dump tier2 offsite update-leg] + LOG 2026/09/30 11:28:26 night_chain.go:84: [INFO] [night-chain] manual run of tonight's chain: dump → second drive → off-site → update leg + LOG 2026/09/30 11:28:26 night_chain.go:77: [INFO] [night-chain] db-dump: started + LOG 2026/09/30 11:30:26 night_chain.go:82: [INFO] [night-chain] db-dump: done in 2m0s + LOG 2026/09/30 11:30:26 night_chain.go:77: [INFO] [night-chain] tier2: started + LOG 2026/09/30 11:30:34 night_chain.go:82: [INFO] [night-chain] tier2: done in 8s + LOG 2026/09/30 11:30:34 night_chain.go:77: [INFO] [night-chain] offsite: started + LOG 2026/09/30 11:34:19 night_chain.go:82: [INFO] [night-chain] offsite: done in 3m45s + LOG 2026/09/30 11:34:19 night_chain.go:77: [INFO] [night-chain] update-leg: started + LOG 2026/09/30 11:34:19 unattended.go:270: [INFO] [update-leg] started (manual-chain): window 02:30, no step starts at or after 16:49 + LOG 2026/09/30 11:34:19 update.go:536: [INFO] [stacks] update bookstack: accepted — guarded update started + LOG 2026/09/30 11:34:19 unattended.go:336: [INFO] [update-leg] bookstack: step pressed bookstack=lscr.io/linuxserver/bookstack:26.05.5, bookstack-db=mariadb:12.3 → bookstack=lscr.io/linuxserver/bookstack:26.09.1, bookstack-db=mariadb:12.3 + LOG 2026/09/30 11:34:19 update.go:1365: [INFO] [stacks] update bookstack: phase checking + LOG 2026/09/30 11:34:19 update.go:786: [INFO] [stacks] update bookstack: ladder — the last step (2 of 2) — the catalog's current definition + LOG 2026/09/30 11:34:19 update.go:814: [INFO] [stacks] update bookstack: precondition met — Tier 2 (second drive) copy from 2026-09-30T11:28:28Z (6m0s old, limit 24h0m0s) + LOG 2026/09/30 11:34:19 update.go:1365: [INFO] [stacks] update bookstack: phase safety-dump + LOG 2026/09/30 11:34:19 update.go:846: [INFO] [stacks] update bookstack: safety dump done (1 file(s)) [/mnt/sys_drive/felhom-data/backups/primary/bookstack/db-dumps/pre-restore-20260930T113419Z-bookstack-mariadb.sql] + LOG 2026/09/30 11:34:19 undo.go:401: [WARN] [stacks] update bookstack: volume(s) [bookstack_bookstack_config bookstack_bookstack_db_data] carry no compose label (recreated by a restore before v0.268.0 — R-658) — copied by name +13:34:21 leg started — window moved to 11:29 (now 13:34:21 = W+2h05m): POST /backups/window -> 303 /backups?flash=flash.backup.window_updated + LOG 2026/09/30 11:34:20 undo.go:287: [INFO] [stacks] update bookstack: the undo copy will hold 2 named volume(s), 171.3 MiB + LOG 2026/09/30 11:34:20 update.go:1365: [INFO] [stacks] update bookstack: phase pinning + LOG 2026/09/30 11:34:20 pin.go:373: [INFO] [stacks] update bookstack: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/bookstack/docker-compose.yml (bookstack=lscr.io/linuxserver/bookstack:26.09.1, bookstack-db=mariadb:12.3) + LOG 2026/09/30 11:34:20 update.go:1365: [INFO] [stacks] update bookstack: phase pulling + LOG 2026/09/30 11:34:21 backup_handlers.go:65: [INFO] [web] backup window set to 11:29 (legs 11:29/12:29/13:14) + LOG 2026/09/30 11:34:37 update.go:1365: [INFO] [stacks] update bookstack: phase copying + LOG 2026/09/30 11:34:49 update.go:1365: [INFO] [stacks] update bookstack: phase copying + LOG 2026/09/30 11:34:49 undo.go:437: [INFO] [stacks] update bookstack: copied bookstack_bookstack_config → bookstack_bookstack_config.pre-update-20260930T113449Z in 498ms + LOG 2026/09/30 11:34:51 undo.go:437: [INFO] [stacks] update bookstack: copied bookstack_bookstack_db_data → bookstack_bookstack_db_data.pre-update-20260930T113449Z in 2.101s + LOG 2026/09/30 11:34:51 update.go:1365: [INFO] [stacks] update bookstack: phase starting + LOG 2026/09/30 11:34:58 update.go:1365: [INFO] [stacks] update bookstack: phase verifying + LOG 2026/09/30 11:35:11 quiesce.go:255: [INFO] [quiesce] full-system backup due and inside its window, but the automatic update leg is running (it starts no step after 16:29) — deferring to the next poll (`09` decision 20) + LOG 2026/09/30 11:35:13 update.go:997: [INFO] [stacks] update bookstack: healthy after 15s (the app's health check passed) + LOG 2026/09/30 11:35:13 update.go:1033: [INFO] [stacks] update bookstack: DONE in 54s + LOG 2026/09/30 11:35:14 unattended.go:343: [INFO] [update-leg] bookstack: step ended done after 55.1 s + LOG 2026/09/30 11:35:14 update.go:536: [INFO] [stacks] update kimai: accepted — guarded update started + LOG 2026/09/30 11:35:14 unattended.go:336: [INFO] [update-leg] kimai: step pressed kimai=kimai/kimai2:apache-2.57.0, kimai-db=mariadb:11.8 → kimai=kimai/kimai2:2.67.0, kimai-db=mariadb:11.8 + LOG 2026/09/30 11:35:14 update.go:1365: [INFO] [stacks] update kimai: phase checking + LOG 2026/09/30 11:35:14 update.go:786: [INFO] [stacks] update kimai: ladder — the last step (2 of 2) — the catalog's current definition + LOG 2026/09/30 11:35:14 update.go:814: [INFO] [stacks] update kimai: precondition met — Tier 2 (second drive) copy from 2026-09-30T11:28:27Z (7m0s old, limit 24h0m0s) + LOG 2026/09/30 11:35:14 update.go:1365: [INFO] [stacks] update kimai: phase safety-dump + LOG 2026/09/30 11:35:14 update.go:846: [INFO] [stacks] update kimai: safety dump done (1 file(s)) [/mnt/sys_drive/felhom-data/backups/primary/kimai/db-dumps/pre-restore-20260930T113514Z-kimai-mariadb.sql] + LOG 2026/09/30 11:35:15 undo.go:287: [INFO] [stacks] update kimai: the undo copy will hold 2 named volume(s), 216.6 MiB + LOG 2026/09/30 11:35:15 update.go:1365: [INFO] [stacks] update kimai: phase pinning + LOG 2026/09/30 11:35:15 pin.go:373: [INFO] [stacks] update kimai: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/kimai/docker-compose.yml (kimai=kimai/kimai2:2.67.0, kimai-db=mariadb:11.8) + LOG 2026/09/30 11:35:15 update.go:1365: [INFO] [stacks] update kimai: phase pulling + LOG 2026/09/30 11:35:32 update.go:1365: [INFO] [stacks] update kimai: phase copying + LOG 2026/09/30 11:35:46 update.go:1365: [INFO] [stacks] update kimai: phase copying + LOG 2026/09/30 11:35:48 undo.go:437: [INFO] [stacks] update kimai: copied kimai_kimai_db_data → kimai_kimai_db_data.pre-update-20260930T113546Z in 2.464s + LOG 2026/09/30 11:35:49 update.go:1365: [INFO] [stacks] update kimai: phase copying + LOG 2026/09/30 11:35:51 undo.go:437: [INFO] [stacks] update kimai: copied kimai_kimai_var → kimai_kimai_var.pre-update-20260930T113546Z in 2.241s + LOG 2026/09/30 11:35:51 update.go:1365: [INFO] [stacks] update kimai: phase starting + LOG 2026/09/30 11:35:57 update.go:1365: [INFO] [stacks] update kimai: phase verifying + LOG 2026/09/30 11:36:11 quiesce.go:255: [INFO] [quiesce] full-system backup due and inside its window, but the automatic update leg is running (it starts no step after 16:29) — deferring to the next poll (`09` decision 20) + LOG 2026/09/30 11:36:28 update.go:997: [INFO] [stacks] update kimai: healthy after 30s (the app's health check passed) + LOG 2026/09/30 11:36:28 update.go:1033: [INFO] [stacks] update kimai: DONE in 1m14s + LOG 2026/09/30 11:36:29 unattended.go:343: [INFO] [update-leg] kimai: step ended done after 75.1 s + LOG 2026/09/30 11:36:29 unattended.go:248: [INFO] [update-leg] update leg (manual-chain): done=2 undone=0 held=0 failed=0 skipped=0 in 2m10s [skipped: ] + LOG 2026/09/30 11:36:29 night_chain.go:82: [INFO] [night-chain] update-leg: done in 2m10s + LOG 2026/09/30 11:36:29 night_chain.go:93: [INFO] [night-chain] finished in 8m3s + LOG 2026/09/30 11:37:11 quiesce.go:505: [INFO] [quiesce] backup due on 1 tier(s) — quiescing 10 stack(s): [adventurelog bentopdf bookstack calibre-web docmost kimai opengist paperless-ngx privatebin romm] + LOG 2026/09/30 11:37:38 quiesce.go:554: [INFO] [quiesce] tier local: backup job backup-9201-1790768258239656621 started — polling + LOG 2026/09/30 11:37:48 quiesce.go:623: [INFO] [quiesce] tier local: job backup-9201-1790768258239656621 snapshotted — resuming app early (8B.2) + LOG 2026/09/30 11:37:48 quiesce.go:492: [INFO] [quiesce] unquiescing (snapshotted (early resume, last tier)): restarting 10 stack(s) + LOG 2026/09/30 11:47:19 quiesce.go:628: [INFO] [quiesce] tier local: backup job backup-9201-1790768258239656621 done +13:48:25 lines kept: 24 → C/C-run-log.txt diff --git a/documentation/audits/pg-last-six-2026-09-30/C/C-setup.txt b/documentation/audits/pg-last-six-2026-09-30/C/C-setup.txt new file mode 100644 index 00000000..843ed2f8 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/C/C-setup.txt @@ -0,0 +1,6 @@ +13:18:05 # setup 2026-09-30T13:18:05.463373+02:00 +13:18:29 102a103,104 +> quiesce: +> poll_interval: 1m +2026/09/30 11:18:08 quiesce.go:185: [INFO] [quiesce] loop started (poll 1m0s, max-quiesce 30m0s) + diff --git a/documentation/audits/pg-last-six-2026-09-30/C/C1-sync-and-offer.txt b/documentation/audits/pg-last-six-2026-09-30/C/C1-sync-and-offer.txt new file mode 100644 index 00000000..6ac2c768 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/C/C1-sync-and-offer.txt @@ -0,0 +1,9 @@ +# C1/B1 — demo-hp 9201: sync + rescan, then what the page offers — 2026-09-30T11:28:04Z +sync_rescan: 4.5 +bookstack pinned: {'bookstack': 'lscr.io/linuxserver/bookstack:26.05.5', 'bookstack-db': 'mariadb:12.3'} | catalog: {'bookstack': 'lscr.io/linuxserver/bookstack:26.09.1', 'bookstack-db': 'mariadb:12.3'} + page: hozzáférés 0.283.1 Magyar English Kijelentkezés ↗ ← Alkalmazások BookStack Fut Frissítés elérhető — ma Hátralévő frissítési lépések: 1 Megnyitás ↗ Napló Exportálás Beállítások Egyszerű wiki platform + page: zés ↗ ← Alkalmazások BookStack Fut Frissítés elérhető — ma Hátralévő frissítési lépések: 1 Megnyitás ↗ Napló Exportálás Beállítások Egyszerű wiki platform - polcok, könyvek, fejezetek és oldalak ~150M +kimai pinned: {'kimai': 'kimai/kimai2:apache-2.57.0', 'kimai-db': 'mariadb:11.8'} | catalog: {'kimai': 'kimai/kimai2:2.67.0', 'kimai-db': 'mariadb:11.8'} + page: g és hozzáférés 0.283.1 Magyar English Kijelentkezés ↗ ← Alkalmazások Kimai Fut Frissítés elérhető — ma Hátralévő frissítési lépések: 1 Megnyitás ↗ Napló Exportálás Beállítások Időkövetés - projektek, + page: ntkezés ↗ ← Alkalmazások Kimai Fut Frissítés elérhető — ma Hátralévő frissítési lépések: 1 Megnyitás ↗ Napló Exportálás Beállítások Időkövetés - projektek, ügyfelek és munkaidő nyilvántartás ~100M RAM +local dir active 40453376 24196068 14170192 59.81% diff --git a/documentation/audits/pg-last-six-2026-09-30/C/C9-after.txt b/documentation/audits/pg-last-six-2026-09-30/C/C9-after.txt new file mode 100644 index 00000000..5bda3c09 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/C/C9-after.txt @@ -0,0 +1,12 @@ +# C9/B9 — demo-hp 9201 after the chain and the restore — 2026-09-30T11:49:27Z +backups page: s-mentés, helyi másolat, távoli mentés, majd a teljes rendszermentés. Mentési időablak kezdete Mentés Adatbázis-mentés: 02:30 Helyi másolat: 03:30 Távoli mentés: 04:15 Teljes rendszermentés: kb. 04:30–08:30 között ✓ Adatmentés aktív ✓ Távoli rendszermentés külön hardveren (PBS) 2 +bookstack state: running | pinned: {'bookstack': 'lscr.io/linuxserver/bookstack:26.09.1', 'bookstack-db': 'mariadb:12.3'} | catalog: {'bookstack': 'lscr.io/linuxserver/bookstack:26.09.1', 'bookstack-db': 'mariadb:12.3'} + page badge: Naprakész +kimai state: running | pinned: {'kimai': 'kimai/kimai2:2.67.0', 'kimai-db': 'mariadb:11.8'} | catalog: {'kimai': 'kimai/kimai2:2.67.0', 'kimai-db': 'mariadb:11.8'} + page badge: Naprakész +0 +kimai Up 11 minutes (healthy) +kimai-db Up 11 minutes (healthy) +bookstack Up 11 minutes (healthy) +bookstack-db Up 11 minutes (healthy) + diff --git a/documentation/audits/pg-last-six-2026-09-30/C/README.md b/documentation/audits/pg-last-six-2026-09-30/C/README.md new file mode 100644 index 00000000..82c4665d --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/C/README.md @@ -0,0 +1,63 @@ +# Part C — the full-system backup waits for the update leg, seen live by day (R-687 item 4) + +demo-hp guest 9201, controller 0.283.1, agent 0.138.0. 2026-09-30. Tool: `tools/partC.py` (setup / run / restore). + +## Feasibility, measured first (read only) + +| condition | measured | source | +|---|---|---| +| whole-guest tier DUE | local tier: newest archive `vzdump-lxc-9201-2026_09_29-04_42_11` (≈ 31 h), cadence 24 h → **due**. PBS tier: last 2026-09-24T20:06Z, weekly → **not due** (so ep0 is not written) | `pvesm list local/felhom-pbs`, agent journal `backup tier armed … cadence=24h0m0s` | +| why it had not run | the space preflight (R-685) refused it **10 times since 2026-09-27**: „local has 12.1 GiB free; … a new one needs about 12.1 GiB" | agent journal 04:44–06:44 CEST; → R-548 note | +| room now | local 14.2 GiB free ≥ the 12.1 GiB it needs | `pvesm status` | +| the window | no `backup_window_start` in settings.json → controller.yaml `db_dump_schedule: "02:30"`; gate [04:30, 08:30) | settings.json, controller.yaml | +| a leg step pending | none at first (every app at the catalog head); **Part F's bookstack and kimai moves gave two** — the page read „Frissítés elérhető — ma · Hátralévő frissítési lépések: 1" for both | `C1-sync-and-offer.txt` | +| the leg's retry wait | `RetryWait` default 2 min (`unattended.go` SetUpdateLeg) — not needed | source | + +**The order is the whole trick.** The tier was already due, so moving the window before the leg ran would have let the +next 1-minute poll start the backup during the chain's own dump and off-site legs. The window moved only once +`[update-leg] started (manual-chain)` was in the log (2 s later, by the product's own form). + +## What happened (controller log, `C-run-log.txt`; times UTC) + +``` +11:18:08 [quiesce] loop started (poll 1m0s, max-quiesce 30m0s) ← setup: quiesce.poll_interval 1m +11:28:26 [night-chain] manual run of tonight's chain: dump → second drive → off-site → update leg +11:30:26 [night-chain] db-dump: done in 2m0s +11:34:19 [update-leg] started (manual-chain): window 02:30, no step starts at or after 16:49 +11:34:19 [update-leg] bookstack: step pressed … 26.05.5 → 26.09.1 +(11:34:21 POST /backups/window window_start=11:29 → 303 flash.backup.window_updated — now = W+2h05m) +11:35:11 [quiesce] full-system backup due and inside its window, but the automatic update leg is running (it starts no step after 16:29) — deferring to the next poll (`09` decision 20) +11:35:14 [update-leg] bookstack: step ended done after 55.1 s +11:35:14 [update-leg] kimai: step pressed … apache-2.57.0 → 2.67.0 +11:36:11 [quiesce] full-system backup due and inside its window, but the automatic update leg is running … — deferring +11:36:29 [update-leg] kimai: step ended done after 75.1 s +11:36:29 [update-leg] update leg (manual-chain): done=2 undone=0 held=0 failed=0 skipped=0 in 2m10s +11:37:11 [quiesce] backup due on 1 tier(s) — quiescing 10 stack(s) ← the first poll AFTER the leg ended +11:37:38 [quiesce] tier local: backup job backup-9201-1790768258239656621 started — polling +11:37:48 [quiesce] tier local: job … snapshotted — resuming app early (8B.2) +11:47:19 [quiesce] tier local: backup job … done +``` + +Agent (host journal, CEST): `13:37:38 backup: space preflight passed need_bytes=12969135576 avail_bytes=14509867008` · +`13:47:12 backup: completed archive=local:backup/vzdump-lxc-9201-2026_09_30-13_37_38.tar.zst size_bytes=9978959837`. +The old archive was pruned (retention 1); demo-hp has a fresh whole-guest local backup again. + +**Verdict: R-687 item 4 PROVEN LIVE** — two deferrals while the leg ran, the backup started on the first poll after +the leg's end line, and it succeeded. + +**One cosmetic mismatch found (manual chain only):** the deferral says „it starts no step after 16:29" (W+5h of the +moved window) while this manual leg's own deadline was 16:49 (its start + the leg length, `RunUpdateLegNow`). A night +leg has both at W+5h. Filed in R-687. + +## Put back (`C-restore.txt`, `C9-after.txt`) + +- `controller.yaml` restored from `controller.yaml.pre-gate-day` → `diff` IDENTICAL; no `quiesce:` section; restart → + `[quiesce] loop started (poll 5m0s …)`. +- `backup_window_start` (11:29) removed from settings.json with the controller STOPPED (it had never been set) → the page + reads „Adatbázis-mentés: 02:30 · Helyi másolat: 03:30 · Távoli mentés: 04:15 · Teljes rendszermentés: kb. 04:30–08:30". +- Scheduler after restart: `db-dump 2026-10-01 02:30 CEST`, `tier2-backup 03:30`, `offbox-backup 04:15` — as before. +- **Consequence, stated:** the whole-guest local tier ran at 13:37 today, so on 2026-10-01 at 04:30 it is 15 h old and not + due; it becomes due at 13:37 (outside the window) and runs at the next window, 2026-10-02 04:30. One night without a new + local whole-guest archive — the box had had none since 2026-09-29 before today anyway. +- bookstack and kimai: running, healthy, „Naprakész" (the Part B read for demo-hp). +- Saved copies left on the guest for reference: `controller.yaml.pre-gate-day`, `data/settings.json.pre-gate-day`. diff --git a/documentation/audits/pg-last-six-2026-09-30/E/E2-digests-demo-hp.txt b/documentation/audits/pg-last-six-2026-09-30/E/E2-digests-demo-hp.txt new file mode 100644 index 00000000..ae097e3b --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/E/E2-digests-demo-hp.txt @@ -0,0 +1,46 @@ +# E2/E3 — demo-hp guest 9201, read 2026-09-30T10:49:40Z +# per app: GET /api/stacks/ catalog_images + catalog_digests (the ladder's tested digests) vs app.yaml installed_images (what the containers were created from) and whether the RUNNING compose pins name@sha256 +adventurelog | catalog carries tested digests: yes + adventurelog: ghcr.io/seanmorley15/adventurelog-backend:v0.13.0 catalog=0250d9cb0d74 installed=0250d9cb0d74 equal=True running-compose-pins-digest=True + adventurelog-frontend: ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0 catalog=51ee22428b41 installed=51ee22428b41 equal=True running-compose-pins-digest=True + adventurelog-postgres: postgis/postgis:16-3.5-alpine catalog=47e961a569fd installed=47e961a569fd equal=True running-compose-pins-digest=True +bentopdf | catalog carries tested digests: NO (no ladder entry) + bentopdf: ghcr.io/alam00000/bentopdf:v2.8.6 catalog=- installed=eaeea1e44720 equal=False running-compose-pins-digest=False +bookstack | catalog carries tested digests: yes + bookstack: lscr.io/linuxserver/bookstack:26.05.5 catalog=189c79627346 installed=189c79627346 equal=True running-compose-pins-digest=False + bookstack-db: mariadb:12.3 catalog=805c8e104bd5 installed=805c8e104bd5 equal=True running-compose-pins-digest=False +calibre-web | catalog carries tested digests: NO (no ladder entry) + calibre-web: crocodilestick/calibre-web-automated:v4.0.6 catalog=- installed=c31a738b6d5e equal=False running-compose-pins-digest=False +docmost | catalog carries tested digests: yes + docmost: docmost/docmost:0.96.0 catalog=b56947fcfd08 installed=b56947fcfd08 equal=True running-compose-pins-digest=True + docmost-postgres: postgres:18-alpine catalog=77f585114c32 installed=77f585114c32 equal=True running-compose-pins-digest=True + docmost-redis: redis:7-alpine catalog=858f009f9709 installed=858f009f9709 equal=True running-compose-pins-digest=True +kimai | catalog carries tested digests: yes + kimai: kimai/kimai2:apache-2.57.0 catalog=efa66c5eadf9 installed=efa66c5eadf9 equal=True running-compose-pins-digest=False + kimai-db: mariadb:11.8 catalog=79d59758afc9 installed=79d59758afc9 equal=True running-compose-pins-digest=False +opengist | catalog carries tested digests: yes + opengist: ghcr.io/thomiceli/opengist:1.15 catalog=7edc91273ee7 installed=7edc91273ee7 equal=True running-compose-pins-digest=False +paperless-ngx | catalog carries tested digests: yes + paperless-postgres: postgres:18-alpine catalog=77f585114c32 installed=77f585114c32 equal=True running-compose-pins-digest=True + paperless-redis: redis:7-alpine catalog=858f009f9709 installed=858f009f9709 equal=True running-compose-pins-digest=True + paperless-webserver: ghcr.io/paperless-ngx/paperless-ngx:2.20.15 catalog=6c86cad80397 installed=6c86cad80397 equal=True running-compose-pins-digest=True +privatebin | catalog carries tested digests: yes + privatebin: privatebin/pdo:2.0.6 catalog=4c141b2326f8 installed=4c141b2326f8 equal=True running-compose-pins-digest=False +romm | catalog carries tested digests: yes + romm: rommapp/romm:5.3.1 catalog=0d66b4ea152a installed=0d66b4ea152a equal=True running-compose-pins-digest=False + romm-db: mariadb:11.8 catalog=79d59758afc9 installed=79d59758afc9 equal=True running-compose-pins-digest=False + romm-redis: redis:7-alpine catalog=858f009f9709 installed=858f009f9709 equal=True running-compose-pins-digest=False +TOTAL {"apps": 10, "ladder": 8, "equal": 18, "svc": 20, "compose_digest": 9} + +## Reading (2026-09-30, controller main d48da6c) +- R-446 (the badge blind to a moved floating tag): the badge DOES compare digests now — `stacks/updateorder.go:86` `digestBehind` + reads the ladder's tested digest (`catalog_digests`) against `app.yaml installed_images[svc].digest` and reads Behind only + for a newer TESTED digest installed before the test. On demo-hp all 18 services of the 8 ladder apps carry both digests + and all 18 are EQUAL (so their „Naprakész" is true). STILL BLIND: an app with NO ladder entry — here bentopdf and + calibre-web: the catalog carries no digest, so `digestBehind` returns false by construction (updateorder.go:96). +- R-440 (a floating pin makes an update / a restore irreproducible): a FRESH install or a guarded Update renders + `name:tag@sha256` from the ladder (`digest.go` RenderWithLadderDigests) — 9 of 20 services on demo-hp run such a + definition (adventurelog, docmost, paperless-ngx). The other 11 services (bookstack, kimai, opengist, privatebin, romm, + bentopdf, calibre-web) run a TAG-ONLY definition: installed before v0.269.0 and never updated since, and `CarryDigests` + (digest.go:141) keeps only a digest the running definition already has — so they stay tag-only until their next guarded + Update, and a re-pull (a restore) of those takes whatever the tag serves that day. No-ladder apps are always tag-only. diff --git a/documentation/audits/pg-last-six-2026-09-30/E/E4-installer-tag.txt b/documentation/audits/pg-last-six-2026-09-30/E/E4-installer-tag.txt new file mode 100644 index 00000000..00fbb3c0 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/E/E4-installer-tag.txt @@ -0,0 +1,19 @@ +## E4 — the installer 1.29.0 tag, measured 2026-09-30T10:26:24Z +- installer-v* tags and the script version they carry: + installer-v1.23.0 -> e79a20bbedc3 SCRIPT_VERSION="1.23.0" + installer-v1.24.0 -> 688470c94570 SCRIPT_VERSION="1.24.0" + installer-v1.25.0 -> 51871a7ea6a2 SCRIPT_VERSION="1.25.0" + installer-v1.27.0 -> 1d5f2b8bb6d9 SCRIPT_VERSION="1.27.0" + installer-v1.28.0 -> fc737b0fc080 SCRIPT_VERSION="1.28.0" +- main today: SCRIPT_VERSION="1.28.0"; webpage.yaml refs: ref=installer-v1.28.0 +- ISO 1.29.0 build manifest (documentation/tests/iso-release-1.29.0-2026-09-18/*.manifest.txt): + built : 2026-09-18T20:41:45+02:00 + iso-version-tag : v1.29.0 + repo-commit : 8d539f971cf67aae3a69599905ab78b72ca2f889 + output-sha256 : dceacae5da247d76cad065bf6c0d3bbefac8d8a5f8e571db2fd8449a97e94829 +- the recorded commit: 8d539f9 2026-09-18 17:48:13 +0200 STATUS: slice 4 — the bilingual screens, and the installer image that waits for a supervised publish +- the menu-width fix that the published image carries was committed AFTER the build: + 31eeb36 2026-09-18 21:16:57 +0200 ISO 1.29.0 PUBLISHED — bilingual console, proven on both menu entries (R-559) + -menuentry 'Felhom telepítés (szöveges mód) / Install Felhom (text mode)' --class felhom --class os { + +menuentry 'Felhom telepítés (szöveges mód) / text' --class felhom --class os { +- build-felhom-iso.sh:498 records `git rev-parse HEAD` with no dirty-tree check. diff --git a/documentation/audits/pg-last-six-2026-09-30/E/README.md b/documentation/audits/pg-last-six-2026-09-30/E/README.md new file mode 100644 index 00000000..ef2278e7 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/E/README.md @@ -0,0 +1,13 @@ +# Part E — stale rows and small leftovers (2026-09-30) + +| item | outcome | evidence | +|---|---|---| +| E1 R-463 „ten apps left" | rewritten from Part A: 8 of 11 moved, 3 stay with reason → **CLOSED** | `../README.md` | +| E2 R-446 „READY TO BUILD" | measured on demo-hp: the badge compares digests (`digestBehind`); all 18 ladder-app services equal → **NARROWED** to apps with no ladder entry (21 of 53) | `E2-digests-demo-hp.txt` | +| E3 R-440 floating pins | a fresh install / guarded Update pulls `tag@sha256` from the ladder; 11 of 20 demo-hp services still run tag-only definitions (installed before v0.269.0, or no ladder) → **NARROWED** | `E2-digests-demo-hp.txt` | +| E4 installer 1.29.0 tag | **NOT tagged, row R-730 filed instead**: the build record names `8d539f9`, but the published image carries a fix committed 35 min after the build (`31eeb36`) — the build commit cannot be proven. And `installer-v*` is the host-install SCRIPT's line (1.28.0), not the ISO's: an `installer-v1.29.0` tag would block the next script release | `E4-installer-tag.txt` | +| E5 STATUS | Tester-2 line per the operator note; today's outcomes; no decision needs the operator | `STATUS.md` | + +Also found while doing the parts, each now a row or a row note: R-731 (tag-shape switches + two release checks), R-548 note +(demo-hp's local tier refused for space 10 times since 2026-09-27), R-624 correction (outline, rallly, zipline have routes), +R-687 (item 4 proven; the manual-chain deferral text). diff --git a/documentation/audits/pg-last-six-2026-09-30/F/README.md b/documentation/audits/pg-last-six-2026-09-30/F/README.md new file mode 100644 index 00000000..fab988a7 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/README.md @@ -0,0 +1,37 @@ +# Part F — more apps that update themselves (2026-09-30, afternoon) + +Rule: within-major edges for apps that already had fixtures on both venues, at most 8, the normal method (bench LXC 9401 +→ box 9202 through the guarded Update → `upgrade-test.py --write-ladder` → one catalog commit per app, the only image move +in it). Candidates from the currency audit's ranking (`../../catalog-currency-2026-09-30.md` §6). + +| app | step | bench (harness v4, 10-min watch) | box 9202 | memory, anon peak | catalog | +|---|---|---|---|---|---| +| bookstack | 26.05.5 → 26.09.1 | proven, migrations ran, abort starts and serves | done 64.6 s, read back | bookstack 4.8 %; db 43.7 % | `54ca055` | +| kimai | apache-2.57.0 → 2.67.0 | proven, Doctrine migrations ran | done 82.1 s, read back | kimai 6.0 % (cgroup 91.7 % = file cache); db 45.0 % | `d75d1fd` | +| audiobookshelf | 2.36.1 → 2.37.1 | proven | done 24.6 s, read back | 10.5 % | `7425ebd` | +| n8n | 2.41.2 → 2.42.1 | proven, its migrations ran | done 122.1 s, read back | 23.0 % | `9f075a4` | +| navidrome | 0.64.1 → 0.64.2 | proven | done 14.4 s, read back | 6.9 % | `6d91495` | +| grafana | 13.2.2 → 13.2.3 | proven | done 23.6 s, read back (**second walk** — see below) | 47.1 % (cgroup 100 % = file cache) | `2acfbf1` | +| komga | 1.27.1 → 1.28.0 | proven | done 44.2 s, read back | 64.5 % | `403a8f5` | +| immich | server + ML v3.2.2 → v3.2.4 (the database does not move) | first run **inconclusive** (FROM never settled in 420 s — the first-start geodata import with two other runs on 6 cores, R-676); retried alone: see `benchq-q10.txt` | done 112.0 s, album read back | — | see the report | + +No step is `memory_tight`; no limit moved. **kimai's tag:** upstream dropped the `apache-` prefix after 2.57.0; measured on +Docker Hub (`kimai-tag-variant.txt`): `2.67.0`, `2`, `stable` and `apache` are ONE digest, `fpm`/`latest` another — the plain +tag is the Apache image. + +**Instrument faults found and fixed (the product was not at fault), stated:** +- **grafana's first box walk read back 401:** the fixture authenticates with the admin password the deploy generated, kept + in the process's memory; the step ran in a second process, which tried the default. Fixed in `tools/boxmove.py` (the + generated secrets are kept beside the seed, in the 0600 scratch file) and `boxstep.py`/`undocase.py` (read them back). + grafana was removed, reinstalled at 13.2.2 from the drill catalog (a revert commit there), seeded, stepped: read back. + First attempt kept: `../box/grafana/*attempt1*`. +- **n8n's first box seed answered 404** (`Cannot POST /rest/owner/setup`): the app was still starting; a second try 25 s + later seeded. The fixture's ready-wait (`/healthz` through the gate answers 401) is weak — noted, not changed. +- **A typo started the n8n bench run with a different repository** (`docker.n8n.io/n8nio/n8n`); it was killed by PID 21 s + in, its project taken down, its evidence renamed `*-wrongref-*`, and the run restarted with the template's own + repository (`benchq-q8.txt`). +- **immich's box install first stopped at the kept-data question** (decision 36): the scratch drive held an older test's + immich folder. Answered "start fresh" through the product (`kept_data: fresh` — the old folder moved aside, nothing deleted). + +**Part B for these apps:** bookstack and kimai are on demo-hp and were stepped by the chain press of Part C (`../C/`). +None of the others is installed on either demo box. diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/MV-audiobookshelf.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/MV-audiobookshelf.log new file mode 100644 index 00000000..4c85b0b9 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/MV-audiobookshelf.log @@ -0,0 +1,108 @@ +[11:50:20] scratch drive folders cleared before FROM (R-656): none existed +[11:50:20] MV-audiobookshelf: deploying audiobookshelf at FROM {'audiobookshelf': 'ghcr.io/advplyr/audiobookshelf:2.36.1'} +[11:51:50] FROM settled=True in 30.9s :: {"audiobookshelf": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[11:51:50] audiobookshelf: /init http=200 +[11:51:50] audiobookshelf: login as the seeded root http=200 ok=True +[11:51:50] C1 (seed reads back BEFORE): True +[11:51:51] MV-audiobookshelf: swapping to TO {'audiobookshelf': 'ghcr.io/advplyr/audiobookshelf:2.37.1'} +[11:52:14] TO up -d rc=0 +[11:52:45] TO settled=True in 31.0s :: {"audiobookshelf": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[11:52:45] migration lines observed: 2 +[11:52:45] audiobookshelf: login as the seeded root http=200 ok=True +[11:52:45] RESULT (seed reads back AFTER): True +[11:52:45] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:80 +[11:53:01] + 15s audiobookshelf=59M/512M peak=59M kills=0 rs=0 reqs=298 +[11:53:16] + 30s audiobookshelf=60M/512M peak=71M kills=0 rs=0 reqs=596 +[11:53:31] + 45s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=896 +[11:53:46] + 61s audiobookshelf=60M/512M peak=71M kills=0 rs=0 reqs=1194 +[11:54:01] + 76s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=1493 +[11:54:16] + 91s audiobookshelf=63M/512M peak=71M kills=0 rs=0 reqs=1790 +[11:54:31] + 106s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=2089 +[11:54:47] + 121s audiobookshelf=63M/512M peak=71M kills=0 rs=0 reqs=2387 +[11:55:02] + 136s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=2685 +[11:55:17] + 151s audiobookshelf=63M/512M peak=71M kills=0 rs=0 reqs=2985 +[11:55:32] + 167s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=3282 +[11:55:47] + 182s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=3582 +[11:56:02] + 197s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=3878 +[11:56:17] + 212s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=4178 +[11:56:33] + 227s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=4474 +[11:56:48] + 242s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=4774 +[11:57:03] + 257s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=5074 +[11:57:18] + 272s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=5370 +[11:57:33] + 288s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=5670 +[11:57:48] + 303s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=5970 +[11:58:03] + 318s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=6266 +[11:58:19] + 333s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=6566 +[11:58:34] + 348s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=6864 +[11:58:49] + 363s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=7162 +[11:59:04] + 378s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=7462 +[11:59:19] + 394s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=7758 +[11:59:34] + 409s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=8058 +[11:59:49] + 424s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=8358 +[12:00:04] + 439s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=8656 +[12:00:20] + 454s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=8954 +[12:00:35] + 469s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=9254 +[12:00:50] + 484s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=9550 +[12:01:05] + 499s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=9850 +[12:01:20] + 515s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=10146 +[12:01:35] + 530s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=10446 +[12:01:50] + 545s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=10742 +[12:02:05] + 560s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=11042 +[12:02:20] + 575s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=11342 +[12:02:36] + 590s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=11638 +[12:02:51] + 605s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=11938 +[12:02:51] memory watch: killed=False tight=[] requests=11938 codes={'200': 11938} +[12:02:51] MV-audiobookshelf: ABORT — putting the FROM images back +[12:03:23] audiobookshelf: login as the seeded root http=200 ok=True +[12:03:23] ABORT: app came back in 30.8s; data present=True +{ + "harness_version": 4, + "edge": "MV-audiobookshelf", + "app": "audiobookshelf", + "note": "night 2026-09-23 within-a-major move: audiobookshelf=ghcr.io/advplyr/audiobookshelf:2.37.1", + "from": { + "audiobookshelf": "ghcr.io/advplyr/audiobookshelf:2.36.1" + }, + "to": { + "audiobookshelf": "ghcr.io/advplyr/audiobookshelf:2.37.1" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Kaudiobookshelf | [2026-09-30 13:52:16.057] INFO: [MigrationManager] No migrations to run.", + "abort": "starts-and-serves", + "abort_detail": null, + "engine_state_after": null, + "memory": { + "soak_s": 605.5, + "requested_s": 600, + "requests": 11938, + "codes": { + "200": 11938 + }, + "first_kill": null, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "peak": 75034624, + "peak_pct": 0.14, + "anon_peak_sampled": 56569856, + "anon_peak_pct": 0.105, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 31.0, + "measured_at": "2026-09-30T12:03:23Z", + "evidence": "evidence/MV-audiobookshelf", + "scratch_cleared": [], + "files_changed": [], + "total_s": 783.1 +} diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/abort-states.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/abort-states.json new file mode 100644 index 00000000..8d305d40 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/abort-states.json @@ -0,0 +1,8 @@ +{ + "audiobookshelf": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/compose-final.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/compose-final.log new file mode 100644 index 00000000..ae8e4eda --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/compose-final.log @@ -0,0 +1,24 @@ +audiobookshelf | Running in production mode. +audiobookshelf | Options: CONFIG_PATH=/config, METADATA_PATH=/metadata, PORT=80, HOST=undefined, SOURCE=docker, ROUTER_BASE_PATH=/audiobookshelf +audiobookshelf | [2026-09-30 14:02:53.652] INFO: === Starting Server === +audiobookshelf | [2026-09-30 14:02:53.656] INFO: [Server] Init v2.36.1 +audiobookshelf | [2026-09-30 14:02:53.656] INFO: [Server] Node.js Version: v20.20.2 +audiobookshelf | [2026-09-30 14:02:53.657] INFO: [Server] Platform: linux +audiobookshelf | [2026-09-30 14:02:53.657] INFO: [Server] Arch: x64 +audiobookshelf | [2026-09-30 14:02:53.661] INFO: [Database] Initializing db at "/config/absdatabase.sqlite" +audiobookshelf | [2026-09-30 14:02:53.694] INFO: [Database] Loading extension /usr/local/lib/nusqlite3/libnusqlite3.so +audiobookshelf | [2026-09-30 14:02:53.695] INFO: [Database] Successfully loaded extension /usr/local/lib/nusqlite3/libnusqlite3.so +audiobookshelf | [2026-09-30 14:02:53.695] INFO: [Database] Db supports unaccent and unicode foldings +audiobookshelf | [2026-09-30 14:02:53.695] INFO: [Database] Db connection was successful +audiobookshelf | [2026-09-30 14:02:53.727] INFO: [MigrationManager] No migrations to run. +audiobookshelf | [2026-09-30 14:02:53.891] INFO: [Database] Db initialized with models: SequelizeMeta, user, session, apiKey, library, libraryFolder, book, podcast, podcastEpisode, libraryItem, mediaProgress, series, bookSeries, author, bookAuthor, collection, collectionBook, playlist, playlistMediaItem, device, playbackSession, feed, feedEpisode, setting, customMetadataProvider, mediaItemShare +audiobookshelf | [2026-09-30 14:02:53.935] INFO: [Database] Server upgrade detected from 2.37.1 to 2.36.1 +audiobookshelf | [2026-09-30 14:02:53.954] INFO: [Database] running ANALYZE +audiobookshelf | [2026-09-30 14:02:53.966] INFO: [Database] ANALYZE completed +audiobookshelf | [2026-09-30 14:02:53.966] INFO: [Server] Serving from base path "/audiobookshelf" +audiobookshelf | [2026-09-30 14:02:53.968] INFO: [LogManager] Init current daily log filename: 2026-09-30.txt +audiobookshelf | [2026-09-30 14:02:53.978] INFO: [BackupManager] 0 Backups Found +audiobookshelf | [2026-09-30 14:02:53.979] INFO: [BackupManager] Auto Backups are disabled +audiobookshelf | [2026-09-30 14:02:54.006] INFO: Listening on port :80 +audiobookshelf | [2026-09-30 14:03:23.188] ERROR: [LocalAuth] Failed login attempt for username "spikee41cb6" from ip ::ffff:172.18.0.1 (Invalid password) +audiobookshelf | [2026-09-30 14:03:23.226] INFO: [LocalAuth] User "spikee41cb6" logged in from ip ::ffff:172.18.0.1 diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/engine-state.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/engine-state.json new file mode 100644 index 00000000..ec747fa4 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/engine-state.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/files-after.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/files-after.json new file mode 100644 index 00000000..87bff214 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/files-after.json @@ -0,0 +1,4 @@ +{ + "/srv/felhom-gate/hdd/userdata/media/audiobooks": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "/srv/felhom-gate/hdd/userdata/media/podcasts": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/files-before.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/files-before.json new file mode 100644 index 00000000..87bff214 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/files-before.json @@ -0,0 +1,4 @@ +{ + "/srv/felhom-gate/hdd/userdata/media/audiobooks": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "/srv/felhom-gate/hdd/userdata/media/podcasts": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/memory-samples.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/memory-samples.json new file mode 100644 index 00000000..2fc0be0c --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/memory-samples.json @@ -0,0 +1,682 @@ +[ + { + "t": 15.1, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 62103552, + "peak": 62853120, + "anon": 52580352, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 298 + }, + { + "t": 30.3, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 63811584, + "peak": 75034624, + "anon": 54669312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 596 + }, + { + "t": 45.4, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 64229376, + "peak": 75034624, + "anon": 54669312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 896 + }, + { + "t": 60.6, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 63954944, + "peak": 75034624, + "anon": 55058432, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1194 + }, + { + "t": 75.8, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65957888, + "peak": 75034624, + "anon": 56393728, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1493 + }, + { + "t": 90.9, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 66457600, + "peak": 75034624, + "anon": 56467456, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1790 + }, + { + "t": 106.0, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65679360, + "peak": 75034624, + "anon": 56483840, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2089 + }, + { + "t": 121.1, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 66142208, + "peak": 75034624, + "anon": 56496128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2387 + }, + { + "t": 136.3, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65196032, + "peak": 75034624, + "anon": 56528896, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2685 + }, + { + "t": 151.4, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 66228224, + "peak": 75034624, + "anon": 56549376, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2985 + }, + { + "t": 166.6, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65216512, + "peak": 75034624, + "anon": 56553472, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3282 + }, + { + "t": 181.7, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 66011136, + "peak": 75034624, + "anon": 56569856, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3582 + }, + { + "t": 196.8, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 64864256, + "peak": 75034624, + "anon": 55721984, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3878 + }, + { + "t": 211.9, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 64831488, + "peak": 75034624, + "anon": 55734272, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4178 + }, + { + "t": 227.1, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 64598016, + "peak": 75034624, + "anon": 55713792, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4474 + }, + { + "t": 242.2, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 64901120, + "peak": 75034624, + "anon": 55754752, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4774 + }, + { + "t": 257.4, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65163264, + "peak": 75034624, + "anon": 55758848, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5074 + }, + { + "t": 272.5, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65429504, + "peak": 75034624, + "anon": 55824384, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5370 + }, + { + "t": 287.7, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 64450560, + "peak": 75034624, + "anon": 55828480, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5670 + }, + { + "t": 302.9, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 64712704, + "peak": 75034624, + "anon": 55836672, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5970 + }, + { + "t": 318.0, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 64729088, + "peak": 75034624, + "anon": 55836672, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6266 + }, + { + "t": 333.1, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 64978944, + "peak": 75034624, + "anon": 55844864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6566 + }, + { + "t": 348.2, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65179648, + "peak": 75034624, + "anon": 55857152, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6864 + }, + { + "t": 363.4, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65662976, + "peak": 75034624, + "anon": 55857152, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7162 + }, + { + "t": 378.5, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65433600, + "peak": 75034624, + "anon": 55840768, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7462 + }, + { + "t": 393.6, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65056768, + "peak": 75034624, + "anon": 55848960, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7758 + }, + { + "t": 408.7, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 64737280, + "peak": 75034624, + "anon": 55848960, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8058 + }, + { + "t": 423.9, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65236992, + "peak": 75034624, + "anon": 55848960, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8358 + }, + { + "t": 439.0, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65261568, + "peak": 75034624, + "anon": 55857152, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8656 + }, + { + "t": 454.1, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 64786432, + "peak": 75034624, + "anon": 55857152, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8954 + }, + { + "t": 469.2, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 64987136, + "peak": 75034624, + "anon": 55857152, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9254 + }, + { + "t": 484.3, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65519616, + "peak": 75034624, + "anon": 55865344, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9550 + }, + { + "t": 499.4, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 64761856, + "peak": 75034624, + "anon": 55865344, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9850 + }, + { + "t": 514.6, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65019904, + "peak": 75034624, + "anon": 55894016, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10146 + }, + { + "t": 529.7, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65056768, + "peak": 75034624, + "anon": 55910400, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10446 + }, + { + "t": 544.8, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65474560, + "peak": 75034624, + "anon": 56320000, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10742 + }, + { + "t": 559.9, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65589248, + "peak": 75034624, + "anon": 56209408, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11042 + }, + { + "t": 575.0, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65806336, + "peak": 75034624, + "anon": 56209408, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11342 + }, + { + "t": 590.1, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 64831488, + "peak": 75034624, + "anon": 56205312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11638 + }, + { + "t": 605.3, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "current": 65277952, + "peak": 75034624, + "anon": 56184832, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11938 + } +] \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/migration-lines.txt b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/migration-lines.txt new file mode 100644 index 00000000..d81de82a --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/migration-lines.txt @@ -0,0 +1,2 @@ +audiobookshelf | [2026-09-30 13:52:16.057] INFO: [MigrationManager] No migrations to run. +audiobookshelf | [2026-09-30 13:52:16.336] INFO: [Database] Server upgrade detected from 2.36.1 to 2.37.1 \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/run.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/run.log new file mode 100644 index 00000000..c5598e69 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/run.log @@ -0,0 +1,57 @@ +[11:50:20] scratch drive folders cleared before FROM (R-656): none existed +[11:50:20] MV-audiobookshelf: deploying audiobookshelf at FROM {'audiobookshelf': 'ghcr.io/advplyr/audiobookshelf:2.36.1'} +[11:51:50] FROM settled=True in 30.9s :: {"audiobookshelf": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[11:51:50] audiobookshelf: /init http=200 +[11:51:50] audiobookshelf: login as the seeded root http=200 ok=True +[11:51:50] C1 (seed reads back BEFORE): True +[11:51:51] MV-audiobookshelf: swapping to TO {'audiobookshelf': 'ghcr.io/advplyr/audiobookshelf:2.37.1'} +[11:52:14] TO up -d rc=0 +[11:52:45] TO settled=True in 31.0s :: {"audiobookshelf": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[11:52:45] migration lines observed: 2 +[11:52:45] audiobookshelf: login as the seeded root http=200 ok=True +[11:52:45] RESULT (seed reads back AFTER): True +[11:52:45] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:80 +[11:53:01] + 15s audiobookshelf=59M/512M peak=59M kills=0 rs=0 reqs=298 +[11:53:16] + 30s audiobookshelf=60M/512M peak=71M kills=0 rs=0 reqs=596 +[11:53:31] + 45s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=896 +[11:53:46] + 61s audiobookshelf=60M/512M peak=71M kills=0 rs=0 reqs=1194 +[11:54:01] + 76s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=1493 +[11:54:16] + 91s audiobookshelf=63M/512M peak=71M kills=0 rs=0 reqs=1790 +[11:54:31] + 106s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=2089 +[11:54:47] + 121s audiobookshelf=63M/512M peak=71M kills=0 rs=0 reqs=2387 +[11:55:02] + 136s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=2685 +[11:55:17] + 151s audiobookshelf=63M/512M peak=71M kills=0 rs=0 reqs=2985 +[11:55:32] + 167s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=3282 +[11:55:47] + 182s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=3582 +[11:56:02] + 197s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=3878 +[11:56:17] + 212s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=4178 +[11:56:33] + 227s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=4474 +[11:56:48] + 242s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=4774 +[11:57:03] + 257s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=5074 +[11:57:18] + 272s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=5370 +[11:57:33] + 288s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=5670 +[11:57:48] + 303s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=5970 +[11:58:03] + 318s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=6266 +[11:58:19] + 333s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=6566 +[11:58:34] + 348s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=6864 +[11:58:49] + 363s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=7162 +[11:59:04] + 378s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=7462 +[11:59:19] + 394s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=7758 +[11:59:34] + 409s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=8058 +[11:59:49] + 424s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=8358 +[12:00:04] + 439s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=8656 +[12:00:20] + 454s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=8954 +[12:00:35] + 469s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=9254 +[12:00:50] + 484s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=9550 +[12:01:05] + 499s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=9850 +[12:01:20] + 515s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=10146 +[12:01:35] + 530s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=10446 +[12:01:50] + 545s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=10742 +[12:02:05] + 560s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=11042 +[12:02:20] + 575s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=11342 +[12:02:36] + 590s audiobookshelf=61M/512M peak=71M kills=0 rs=0 reqs=11638 +[12:02:51] + 605s audiobookshelf=62M/512M peak=71M kills=0 rs=0 reqs=11938 +[12:02:51] memory watch: killed=False tight=[] requests=11938 codes={'200': 11938} +[12:02:51] MV-audiobookshelf: ABORT — putting the FROM images back +[12:03:23] audiobookshelf: login as the seeded root http=200 ok=True +[12:03:23] ABORT: app came back in 30.8s; data present=True \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/to-full.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/to-full.log new file mode 100644 index 00000000..b80ea4c9 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/to-full.log @@ -0,0 +1,22 @@ +audiobookshelf | Running in production mode. +audiobookshelf | Options: CONFIG_PATH=/config, METADATA_PATH=/metadata, PORT=80, HOST=undefined, SOURCE=docker, ROUTER_BASE_PATH=/audiobookshelf +audiobookshelf | [2026-09-30 13:52:15.638] INFO: === Starting Server === +audiobookshelf | [2026-09-30 13:52:15.641] INFO: [Server] Init v2.37.1 +audiobookshelf | [2026-09-30 13:52:15.641] INFO: [Server] Node.js Version: v24.21.0 +audiobookshelf | [2026-09-30 13:52:15.641] INFO: [Server] Platform: linux +audiobookshelf | [2026-09-30 13:52:15.642] INFO: [Server] Arch: x64 +audiobookshelf | [2026-09-30 13:52:15.644] INFO: [Database] Initializing db at "/config/absdatabase.sqlite" +audiobookshelf | [2026-09-30 13:52:15.675] INFO: [Database] Loading extension /usr/local/lib/nusqlite3/libnusqlite3.so +audiobookshelf | [2026-09-30 13:52:15.676] INFO: [Database] Successfully loaded extension /usr/local/lib/nusqlite3/libnusqlite3.so +audiobookshelf | [2026-09-30 13:52:15.676] INFO: [Database] Db supports unaccent and unicode foldings +audiobookshelf | [2026-09-30 13:52:15.676] INFO: [Database] Db connection was successful +audiobookshelf | [2026-09-30 13:52:16.057] INFO: [MigrationManager] No migrations to run. +audiobookshelf | [2026-09-30 13:52:16.273] INFO: [Database] Db initialized with models: SequelizeMeta, user, session, apiKey, library, libraryFolder, book, podcast, podcastEpisode, libraryItem, mediaProgress, series, bookSeries, author, bookAuthor, collection, collectionBook, playlist, playlistMediaItem, device, playbackSession, feed, feedEpisode, setting, customMetadataProvider, mediaItemShare +audiobookshelf | [2026-09-30 13:52:16.336] INFO: [Database] Server upgrade detected from 2.36.1 to 2.37.1 +audiobookshelf | [2026-09-30 13:52:16.444] INFO: [Database] running ANALYZE +audiobookshelf | [2026-09-30 13:52:16.466] INFO: [Database] ANALYZE completed +audiobookshelf | [2026-09-30 13:52:16.466] INFO: [Server] Serving from base path "/audiobookshelf" +audiobookshelf | [2026-09-30 13:52:16.468] INFO: [LogManager] Init current daily log filename: 2026-09-30.txt +audiobookshelf | [2026-09-30 13:52:16.482] INFO: [BackupManager] 0 Backups Found +audiobookshelf | [2026-09-30 13:52:16.483] INFO: [BackupManager] Auto Backups are disabled +audiobookshelf | [2026-09-30 13:52:16.520] INFO: Listening on port :80 diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/to-states.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/to-states.json new file mode 100644 index 00000000..8d305d40 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/to-states.json @@ -0,0 +1,8 @@ +{ + "audiobookshelf": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/verdict.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/verdict.json new file mode 100644 index 00000000..81044642 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/audiobookshelf/bench/evidence/MV-audiobookshelf/verdict.json @@ -0,0 +1,51 @@ +{ + "harness_version": 4, + "edge": "MV-audiobookshelf", + "app": "audiobookshelf", + "note": "night 2026-09-23 within-a-major move: audiobookshelf=ghcr.io/advplyr/audiobookshelf:2.37.1", + "from": { + "audiobookshelf": "ghcr.io/advplyr/audiobookshelf:2.36.1" + }, + "to": { + "audiobookshelf": "ghcr.io/advplyr/audiobookshelf:2.37.1" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Kaudiobookshelf | [2026-09-30 13:52:16.057] INFO: [MigrationManager] No migrations to run.", + "abort": "starts-and-serves", + "abort_detail": null, + "engine_state_after": null, + "memory": { + "soak_s": 605.5, + "requested_s": 600, + "requests": 11938, + "codes": { + "200": 11938 + }, + "first_kill": null, + "containers": { + "audiobookshelf": { + "limit": 536870912, + "peak": 75034624, + "peak_pct": 0.14, + "anon_peak_sampled": 56569856, + "anon_peak_pct": 0.105, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 31.0, + "measured_at": "2026-09-30T12:03:23Z", + "evidence": "evidence/MV-audiobookshelf", + "scratch_cleared": [], + "files_changed": [], + "total_s": 783.1 +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/MV-bookstack.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/MV-bookstack.log new file mode 100644 index 00000000..47d14d41 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/MV-bookstack.log @@ -0,0 +1,129 @@ +[10:56:10] scratch drive folders cleared before FROM (R-656): none existed +[10:56:10] MV-bookstack: deploying bookstack at FROM {'bookstack': 'lscr.io/linuxserver/bookstack:26.05.5', 'bookstack-db': 'mariadb:12.3'} +[10:57:18] FROM settled=True in 31.0s :: {"bookstack": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "bookstack-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:57:19] bookstack: artisan create-admin rc=0 :: Admin account with email "spike-630cc593@gate.invalid" successfully created! +[10:57:20] bookstack: readback of the seeded account found=True :: This will delete any configure multi-factor authentication methods for user: - ID: 3 - Name: spike-b5edb9 - Email: spike +[10:57:20] C1 (seed reads back BEFORE): True +[10:57:20] MV-bookstack: swapping to TO {'bookstack': 'lscr.io/linuxserver/bookstack:26.09.1', 'bookstack-db': 'mariadb:12.3'} +[10:57:47] TO up -d rc=0 +[10:58:18] TO settled=True in 31.0s :: {"bookstack": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "bookstack-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:58:18] engine state bookstack-db: 12.3.3-MariaDB| This installation of MariaDB is already upgraded to 12.3.3-MariaDB. There is no need to run mariadb-upgrade again. [exit=1] +[10:58:18] migration lines observed: 5 +[10:58:19] bookstack: readback of the seeded account found=True :: This will delete any configure multi-factor authentication methods for user: - ID: 3 - Name: spike-b5edb9 - Email: spike +[10:58:19] RESULT (seed reads back AFTER): True +[10:58:19] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:80 +[10:58:34] + 15s bookstack=61M/512M peak=93M kills=0 rs=0 bookstack-db=143M/256M peak=149M kills=0 rs=0 reqs=272 +[10:58:49] + 30s bookstack=62M/512M peak=93M kills=0 rs=0 bookstack-db=142M/256M peak=149M kills=0 rs=0 reqs=540 +[10:59:05] + 45s bookstack=65M/512M peak=93M kills=0 rs=0 bookstack-db=142M/256M peak=149M kills=0 rs=0 reqs=810 +[10:59:20] + 61s bookstack=67M/512M peak=93M kills=0 rs=0 bookstack-db=141M/256M peak=149M kills=0 rs=0 reqs=1080 +[10:59:35] + 76s bookstack=70M/512M peak=93M kills=0 rs=0 bookstack-db=137M/256M peak=149M kills=0 rs=0 reqs=1351 +[10:59:50] + 91s bookstack=73M/512M peak=93M kills=0 rs=0 bookstack-db=134M/256M peak=149M kills=0 rs=0 reqs=1618 +[11:00:05] + 106s bookstack=74M/512M peak=93M kills=0 rs=0 bookstack-db=133M/256M peak=149M kills=0 rs=0 reqs=1884 +[11:00:20] + 121s bookstack=77M/512M peak=93M kills=0 rs=0 bookstack-db=133M/256M peak=149M kills=0 rs=0 reqs=2152 +[11:00:36] + 136s bookstack=83M/512M peak=93M kills=0 rs=0 bookstack-db=134M/256M peak=149M kills=0 rs=0 reqs=2420 +[11:00:51] + 152s bookstack=83M/512M peak=93M kills=0 rs=0 bookstack-db=133M/256M peak=149M kills=0 rs=0 reqs=2686 +[11:01:06] + 167s bookstack=85M/512M peak=93M kills=0 rs=0 bookstack-db=134M/256M peak=149M kills=0 rs=0 reqs=2955 +[11:01:21] + 182s bookstack=87M/512M peak=93M kills=0 rs=0 bookstack-db=134M/256M peak=149M kills=0 rs=0 reqs=3223 +[11:01:36] + 197s bookstack=90M/512M peak=93M kills=0 rs=0 bookstack-db=134M/256M peak=149M kills=0 rs=0 reqs=3494 +[11:01:51] + 212s bookstack=91M/512M peak=93M kills=0 rs=0 bookstack-db=133M/256M peak=149M kills=0 rs=0 reqs=3760 +[11:02:06] + 227s bookstack=93M/512M peak=94M kills=0 rs=0 bookstack-db=133M/256M peak=149M kills=0 rs=0 reqs=4028 +[11:02:22] + 242s bookstack=96M/512M peak=97M kills=0 rs=0 bookstack-db=133M/256M peak=149M kills=0 rs=0 reqs=4296 +[11:02:37] + 258s bookstack=97M/512M peak=98M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=4565 +[11:02:52] + 273s bookstack=100M/512M peak=101M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=4829 +[11:03:07] + 288s bookstack=103M/512M peak=103M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=5099 +[11:03:22] + 303s bookstack=105M/512M peak=106M kills=0 rs=0 bookstack-db=130M/256M peak=149M kills=0 rs=0 reqs=5364 +[11:03:37] + 318s bookstack=107M/512M peak=108M kills=0 rs=0 bookstack-db=130M/256M peak=149M kills=0 rs=0 reqs=5631 +[11:03:52] + 333s bookstack=109M/512M peak=111M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=5901 +[11:04:08] + 348s bookstack=112M/512M peak=113M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=6166 +[11:04:23] + 364s bookstack=114M/512M peak=115M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=6434 +[11:04:38] + 379s bookstack=119M/512M peak=120M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=6698 +[11:04:53] + 394s bookstack=118M/512M peak=121M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=6965 +[11:05:08] + 409s bookstack=120M/512M peak=121M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=7225 +[11:05:23] + 424s bookstack=122M/512M peak=123M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=7488 +[11:05:38] + 439s bookstack=123M/512M peak=123M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=7753 +[11:05:54] + 454s bookstack=124M/512M peak=126M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=8018 +[11:06:09] + 470s bookstack=126M/512M peak=127M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=8283 +[11:06:24] + 485s bookstack=128M/512M peak=129M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=8547 +[11:06:39] + 500s bookstack=130M/512M peak=130M kills=0 rs=0 bookstack-db=130M/256M peak=149M kills=0 rs=0 reqs=8815 +[11:06:54] + 515s bookstack=131M/512M peak=133M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=9079 +[11:07:09] + 530s bookstack=132M/512M peak=136M kills=0 rs=0 bookstack-db=130M/256M peak=149M kills=0 rs=0 reqs=9344 +[11:07:24] + 545s bookstack=135M/512M peak=136M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=9613 +[11:07:40] + 560s bookstack=136M/512M peak=139M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=9875 +[11:07:55] + 576s bookstack=137M/512M peak=141M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=10135 +[11:08:10] + 591s bookstack=138M/512M peak=142M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=10398 +[11:08:25] + 606s bookstack=141M/512M peak=144M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=10663 +[11:08:25] memory watch: killed=False tight=[] requests=10663 codes={'302': 10663} +[11:08:25] MV-bookstack: ABORT — putting the FROM images back +[11:09:02] bookstack: readback of the seeded account found=True :: This will delete any configure multi-factor authentication methods for user: - ID: 3 - Name: spike-b5edb9 - Email: spike +[11:09:02] ABORT: app came back in 31.0s; data present=True +{ + "harness_version": 4, + "edge": "MV-bookstack", + "app": "bookstack", + "note": "night 2026-09-23 within-a-major move: bookstack=lscr.io/linuxserver/bookstack:26.09.1", + "from": { + "bookstack": "lscr.io/linuxserver/bookstack:26.05.5", + "bookstack-db": "mariadb:12.3" + }, + "to": { + "bookstack": "lscr.io/linuxserver/bookstack:26.09.1", + "bookstack-db": "mariadb:12.3" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Kbookstack | [migrations] started", + "abort": "starts-and-serves", + "abort_detail": null, + "engine_state_after": { + "bookstack-db": { + "image": "mariadb:12.3", + "probe": "datadir version | the engine's own upgrade verdict", + "answer": "12.3.3-MariaDB| This installation of MariaDB is already upgraded to 12.3.3-MariaDB. There is no need to run mariadb-upgrade again. [exit=1]", + "probe_rc": 0 + } + }, + "memory": { + "soak_s": 606.1, + "requested_s": 600, + "requests": 10663, + "codes": { + "302": 10663 + }, + "first_kill": null, + "containers": { + "bookstack": { + "limit": 536870912, + "peak": 151715840, + "peak_pct": 0.283, + "anon_peak_sampled": 25722880, + "anon_peak_pct": 0.048, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + }, + "bookstack-db": { + "limit": 268435456, + "peak": 156491776, + "peak_pct": 0.583, + "anon_peak_sampled": 117424128, + "anon_peak_pct": 0.437, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 31.0, + "measured_at": "2026-09-30T11:09:02Z", + "evidence": "evidence/MV-bookstack", + "scratch_cleared": [], + "files_changed": [], + "total_s": 772.2 +} diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/abort-states.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/abort-states.json new file mode 100644 index 00000000..b910bf46 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/abort-states.json @@ -0,0 +1,14 @@ +{ + "bookstack": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + }, + "bookstack-db": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/compose-final.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/compose-final.log new file mode 100644 index 00000000..62b8cfdd --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/compose-final.log @@ -0,0 +1,119 @@ +bookstack | [migrations] started +bookstack | [migrations] 01-nginx-site-confs-default: skipped +bookstack-db | 2026-09-30 12:56:36+02:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:12.3.3+maria~ubu2404 started. +bookstack-db | 2026-09-30 12:56:36+02:00 [Warn] [Entrypoint]: /sys/fs/cgroup///memory.pressure not writable, functionality unavailable to MariaDB +bookstack | [migrations] 02-default-location: skipped +bookstack-db | 2026-09-30 12:56:36+02:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' +bookstack | [migrations] done +bookstack-db | 2026-09-30 12:56:36+02:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:12.3.3+maria~ubu2404 started. +bookstack-db | 2026-09-30 12:56:37+02:00 [Note] [Entrypoint]: Initializing database files +bookstack-db | 2026-09-30 12:56:37 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup). +bookstack-db | create_uring failed: falling back to libaio +bookstack-db | 2026-09-30 12:56:39+02:00 [Note] [Entrypoint]: Database files initialized +bookstack-db | 2026-09-30 12:56:39+02:00 [Note] [Entrypoint]: Starting temporary server +bookstack-db | 2026-09-30 12:56:39+02:00 [Note] [Entrypoint]: Waiting for server startup +bookstack | ─────────────────────────────────────── +bookstack-db | 2026-09-30 12:56:39 0 [Note] Starting MariaDB 12.3.3-MariaDB-ubu2404 source revision 83e909fc2a0dbc394b4b683fb3fa2d7dcf26cc5e server_uid i/adQyORMBjdCbV+zs20lFGiMUA= as process 93 +bookstack | +bookstack | ██╗ ███████╗██╗ ██████╗ +bookstack | ██║ ██╔════╝██║██╔═══██╗ +bookstack | ██║ ███████╗██║██║ ██║ +bookstack | ██║ ╚════██║██║██║ ██║ +bookstack | ███████╗███████║██║╚██████╔╝ +bookstack | ╚══════╝╚══════╝╚═╝ ╚═════╝ +bookstack | +bookstack | Brought to you by linuxserver.io +bookstack | ─────────────────────────────────────── +bookstack | +bookstack | To support the app dev(s) visit: +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: Compressed tables use zlib 1.3 +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: Number of transaction pools: 1 +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions +bookstack-db | 2026-09-30 12:56:39 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup). +bookstack-db | create_uring failed: falling back to libaio +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: Using Linux native AIO +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: innodb_buffer_pool_size_max=8388608m, innodb_buffer_pool_size=128m +bookstack | Bookstack: https://www.bookstackapp.com/donate/ +bookstack | +bookstack | To support LSIO projects visit: +bookstack | https://www.linuxserver.io/donate/ +bookstack | +bookstack | ─────────────────────────────────────── +bookstack | GID/UID +bookstack | ─────────────────────────────────────── +bookstack | +bookstack | User UID: 1000 +bookstack | User GID: 1000 +bookstack | ─────────────────────────────────────── +bookstack | Linuxserver.io version: v26.05.5-ls284 +bookstack | Build-date: 2026-09-14T14:18:17+00:00 +bookstack | ─────────────────────────────────────── +bookstack | +bookstack | using keys found in /config/keys +bookstack | Waiting for DB to be available +bookstack | +bookstack | INFO Nothing to migrate. +bookstack | +bookstack | [custom-init] No custom files found, skipping... +bookstack | [ls.io-init] done. +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: Completed initialization of buffer pool +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: File system buffers for log disabled (block size=512 bytes) +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: End of log at LSN=45568 +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: Opened 3 undo tablespaces +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: 128 rollback segments in 3 undo tablespaces are active. +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: Setting file './ibtmp1' size to 12.000MiB. Physically writing the file full; Please wait ... +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB. +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: log sequence number 45568; transaction id 14 +bookstack-db | 2026-09-30 12:56:39 0 [Note] Plugin 'FEEDBACK' is disabled. +bookstack-db | 2026-09-30 12:56:39 0 [Note] Plugin 'wsrep-provider' is disabled. +bookstack-db | 2026-09-30 12:56:40 0 [Note] mariadbd: Event Scheduler: Loaded 0 events +bookstack-db | 2026-09-30 12:56:40 0 [Note] Replication not automatically started: --skip-slave-start was specified +bookstack-db | 2026-09-30 12:56:40 0 [Note] mariadbd: ready for connections. +bookstack-db | Version: '12.3.3-MariaDB-ubu2404' socket: '/run/mysqld/mysqld.sock' port: 0 mariadb.org binary distribution +bookstack-db | 2026-09-30 12:56:41+02:00 [Note] [Entrypoint]: Temporary server started. +bookstack-db | 2026-09-30 12:56:42+02:00 [Note] [Entrypoint]: Creating database bookstack +bookstack-db | 2026-09-30 12:56:42+02:00 [Note] [Entrypoint]: Creating user bookstack +bookstack-db | 2026-09-30 12:56:42+02:00 [Note] [Entrypoint]: Giving user bookstack access to schema bookstack +bookstack-db | 2026-09-30 12:56:42+02:00 [Note] [Entrypoint]: Securing system users (equivalent to running mysql_secure_installation) +bookstack-db | +bookstack-db | 2026-09-30 12:56:42+02:00 [Note] [Entrypoint]: Stopping temporary server +bookstack-db | 2026-09-30 12:56:42 0 [Note] mariadbd (initiated by: unknown): Normal shutdown +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: FTS optimize thread exiting. +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Starting shutdown... +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Dumping buffer pool(s) to /var/lib/mysql/ib_buffer_pool +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Buffer pool(s) dump completed at 260930 12:56:42 +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Removed temporary tablespace data file: "./ibtmp1" +bookstack-db | 2026-09-30 12:56:42 0 [Note] Shutdown completed; log sequence number 45568; transaction id 15 +bookstack-db | 2026-09-30 12:56:42 0 [Note] mariadbd: Shutdown complete +bookstack-db | 2026-09-30 12:56:42+02:00 [Note] [Entrypoint]: Temporary server stopped +bookstack-db | +bookstack-db | 2026-09-30 12:56:42+02:00 [Note] [Entrypoint]: MariaDB init process done. Ready for start up. +bookstack-db | +bookstack-db | 2026-09-30 12:56:42 0 [Note] Starting MariaDB 12.3.3-MariaDB-ubu2404 source revision 83e909fc2a0dbc394b4b683fb3fa2d7dcf26cc5e server_uid i/adQyORMBjdCbV+zs20lFGiMUA= as process 1 +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Compressed tables use zlib 1.3 +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Number of transaction pools: 1 +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions +bookstack-db | 2026-09-30 12:56:42 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup). +bookstack-db | create_uring failed: falling back to libaio +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Using Linux native AIO +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: innodb_buffer_pool_size_max=8388608m, innodb_buffer_pool_size=128m +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Completed initialization of buffer pool +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: File system buffers for log disabled (block size=512 bytes) +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: End of log at LSN=45568 +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Opened 3 undo tablespaces +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: 128 rollback segments in 3 undo tablespaces are active. +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Setting file './ibtmp1' size to 12.000MiB. Physically writing the file full; Please wait ... +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB. +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: log sequence number 45568; transaction id 14 +bookstack-db | 2026-09-30 12:56:42 0 [Note] Plugin 'FEEDBACK' is disabled. +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool +bookstack-db | 2026-09-30 12:56:42 0 [Note] Plugin 'wsrep-provider' is disabled. +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Buffer pool(s) load completed at 260930 12:56:42 +bookstack-db | 2026-09-30 12:56:45 0 [Note] Server socket created on IP: '0.0.0.0', port: '3306'. +bookstack-db | 2026-09-30 12:56:45 0 [Note] Server socket created on IP: '::', port: '3306'. +bookstack-db | 2026-09-30 12:56:45 0 [Note] mariadbd: Event Scheduler: Loaded 0 events +bookstack-db | 2026-09-30 12:56:45 0 [Note] mariadbd: ready for connections. +bookstack-db | Version: '12.3.3-MariaDB-ubu2404' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution +bookstack-db | 2026-09-30 12:56:48 5 [Warning] Aborted connection 5 to db: 'unconnected' user: 'unauthenticated' host: '172.27.0.3' (This connection closed normally without authentication) +bookstack-db | 2026-09-30 12:57:48 25 [Warning] Aborted connection 25 to db: 'unconnected' user: 'unauthenticated' host: '172.27.0.3' (This connection closed normally without authentication) +bookstack-db | 2026-09-30 13:08:32 10841 [Warning] Aborted connection 10841 to db: 'unconnected' user: 'unauthenticated' host: '172.27.0.3' (This connection closed normally without authentication) diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/engine-state.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/engine-state.json new file mode 100644 index 00000000..d437ae18 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/engine-state.json @@ -0,0 +1,8 @@ +{ + "bookstack-db": { + "image": "mariadb:12.3", + "probe": "datadir version | the engine's own upgrade verdict", + "answer": "12.3.3-MariaDB| This installation of MariaDB is already upgraded to 12.3.3-MariaDB. There is no need to run mariadb-upgrade again. [exit=1]", + "probe_rc": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/files-after.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/files-after.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/files-after.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/files-before.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/files-before.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/files-before.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/memory-samples.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/memory-samples.json new file mode 100644 index 00000000..22cd8754 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/memory-samples.json @@ -0,0 +1,1122 @@ +[ + { + "t": 15.1, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 64147456, + "peak": 97644544, + "anon": 23519232, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 150122496, + "peak": 156491776, + "anon": 117202944, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 272 + }, + { + "t": 30.3, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 65306624, + "peak": 97644544, + "anon": 23494656, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 149831680, + "peak": 156491776, + "anon": 117202944, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 540 + }, + { + "t": 45.4, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 68915200, + "peak": 97644544, + "anon": 23191552, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 149909504, + "peak": 156491776, + "anon": 117202944, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 810 + }, + { + "t": 60.6, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 70885376, + "peak": 97644544, + "anon": 22966272, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 148213760, + "peak": 156491776, + "anon": 117313536, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1080 + }, + { + "t": 75.7, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 73957376, + "peak": 97644544, + "anon": 22966272, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 144637952, + "peak": 156491776, + "anon": 117325824, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1351 + }, + { + "t": 90.9, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 76939264, + "peak": 97644544, + "anon": 22966272, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 140554240, + "peak": 156491776, + "anon": 117399552, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1618 + }, + { + "t": 106.0, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 78528512, + "peak": 97644544, + "anon": 22978560, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 140066816, + "peak": 156491776, + "anon": 117399552, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1884 + }, + { + "t": 121.2, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 81235968, + "peak": 97644544, + "anon": 22736896, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 140324864, + "peak": 156491776, + "anon": 117403648, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2152 + }, + { + "t": 136.4, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 87650304, + "peak": 97644544, + "anon": 25260032, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 140554240, + "peak": 156491776, + "anon": 117403648, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2420 + }, + { + "t": 151.5, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 87121920, + "peak": 97644544, + "anon": 22683648, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 140009472, + "peak": 156491776, + "anon": 117403648, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2686 + }, + { + "t": 166.6, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 89915392, + "peak": 97644544, + "anon": 22495232, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 140673024, + "peak": 156491776, + "anon": 117403648, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2955 + }, + { + "t": 181.8, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 91762688, + "peak": 97644544, + "anon": 22679552, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 140541952, + "peak": 156491776, + "anon": 117407744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3223 + }, + { + "t": 196.9, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 94670848, + "peak": 97644544, + "anon": 22679552, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 140546048, + "peak": 156491776, + "anon": 117407744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3494 + }, + { + "t": 212.1, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 96047104, + "peak": 97644544, + "anon": 22683648, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 140062720, + "peak": 156491776, + "anon": 117407744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3760 + }, + { + "t": 227.2, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 98193408, + "peak": 98992128, + "anon": 22683648, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 140079104, + "peak": 156491776, + "anon": 117407744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4028 + }, + { + "t": 242.4, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 100749312, + "peak": 101711872, + "anon": 22695936, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 140394496, + "peak": 156491776, + "anon": 117407744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4296 + }, + { + "t": 257.5, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 102756352, + "peak": 103051264, + "anon": 22695936, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 138133504, + "peak": 156491776, + "anon": 117407744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4565 + }, + { + "t": 272.7, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 105062400, + "peak": 106770432, + "anon": 22683648, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137900032, + "peak": 156491776, + "anon": 117407744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4829 + }, + { + "t": 287.8, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 108171264, + "peak": 108240896, + "anon": 22687744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 138403840, + "peak": 156491776, + "anon": 117407744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5099 + }, + { + "t": 302.9, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 110612480, + "peak": 111804416, + "anon": 22691840, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137326592, + "peak": 156491776, + "anon": 117407744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5364 + }, + { + "t": 318.1, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 112943104, + "peak": 113631232, + "anon": 22691840, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137146368, + "peak": 156491776, + "anon": 117407744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5631 + }, + { + "t": 333.2, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 115163136, + "peak": 116547584, + "anon": 22716416, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137900032, + "peak": 156491776, + "anon": 117407744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5901 + }, + { + "t": 348.4, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 117936128, + "peak": 118509568, + "anon": 22704128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137601024, + "peak": 156491776, + "anon": 117407744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6166 + }, + { + "t": 363.5, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 120418304, + "peak": 121204736, + "anon": 22700032, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 138022912, + "peak": 156491776, + "anon": 117411840, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6434 + }, + { + "t": 378.6, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 125255680, + "peak": 126050304, + "anon": 25722880, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137580544, + "peak": 156491776, + "anon": 117411840, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6698 + }, + { + "t": 393.8, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 124678144, + "peak": 127868928, + "anon": 22695936, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 138088448, + "peak": 156491776, + "anon": 117411840, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6965 + }, + { + "t": 408.9, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 125927424, + "peak": 127868928, + "anon": 22687744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137863168, + "peak": 156491776, + "anon": 117411840, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7225 + }, + { + "t": 424.1, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 127942656, + "peak": 129396736, + "anon": 22712320, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137596928, + "peak": 156491776, + "anon": 117420032, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7488 + }, + { + "t": 439.2, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 129417216, + "peak": 129949696, + "anon": 22687744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137617408, + "peak": 156491776, + "anon": 117424128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7753 + }, + { + "t": 454.4, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 130691072, + "peak": 132476928, + "anon": 22687744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137400320, + "peak": 156491776, + "anon": 117424128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8018 + }, + { + "t": 469.5, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 132689920, + "peak": 133169152, + "anon": 22687744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137629696, + "peak": 156491776, + "anon": 117424128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8283 + }, + { + "t": 484.7, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 134684672, + "peak": 136167424, + "anon": 22687744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137650176, + "peak": 156491776, + "anon": 117424128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8547 + }, + { + "t": 499.8, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 136552448, + "peak": 136679424, + "anon": 22687744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137105408, + "peak": 156491776, + "anon": 117424128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8815 + }, + { + "t": 515.0, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 137805824, + "peak": 140414976, + "anon": 22695936, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137564160, + "peak": 156491776, + "anon": 117424128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9079 + }, + { + "t": 530.1, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 138641408, + "peak": 143593472, + "anon": 22601728, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137347072, + "peak": 156491776, + "anon": 117424128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9344 + }, + { + "t": 545.3, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 141856768, + "peak": 143593472, + "anon": 22691840, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137924608, + "peak": 156491776, + "anon": 117424128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9613 + }, + { + "t": 560.4, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 143462400, + "peak": 146300928, + "anon": 22601728, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137396224, + "peak": 156491776, + "anon": 117424128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9875 + }, + { + "t": 575.6, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 144109568, + "peak": 148549632, + "anon": 22679552, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137650176, + "peak": 156491776, + "anon": 117424128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10135 + }, + { + "t": 590.7, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 145551360, + "peak": 149118976, + "anon": 22679552, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137752576, + "peak": 156491776, + "anon": 117424128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10398 + }, + { + "t": 605.8, + "containers": { + "bookstack": { + "limit": 536870912, + "current": 148037632, + "peak": 151715840, + "anon": 22351872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "bookstack-db": { + "limit": 268435456, + "current": 137887744, + "peak": 156491776, + "anon": 117424128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10663 + } +] \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/migration-lines.txt b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/migration-lines.txt new file mode 100644 index 00000000..36acbdd1 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/migration-lines.txt @@ -0,0 +1,5 @@ +bookstack | [migrations] started +bookstack | [migrations] 01-nginx-site-confs-default: skipped +bookstack | [migrations] 02-default-location: skipped +bookstack | [migrations] done +bookstack | INFO Nothing to migrate. \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/run.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/run.log new file mode 100644 index 00000000..0fc975a6 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/run.log @@ -0,0 +1,58 @@ +[10:56:10] scratch drive folders cleared before FROM (R-656): none existed +[10:56:10] MV-bookstack: deploying bookstack at FROM {'bookstack': 'lscr.io/linuxserver/bookstack:26.05.5', 'bookstack-db': 'mariadb:12.3'} +[10:57:18] FROM settled=True in 31.0s :: {"bookstack": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "bookstack-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:57:19] bookstack: artisan create-admin rc=0 :: Admin account with email "spike-630cc593@gate.invalid" successfully created! +[10:57:20] bookstack: readback of the seeded account found=True :: This will delete any configure multi-factor authentication methods for user: - ID: 3 - Name: spike-b5edb9 - Email: spike +[10:57:20] C1 (seed reads back BEFORE): True +[10:57:20] MV-bookstack: swapping to TO {'bookstack': 'lscr.io/linuxserver/bookstack:26.09.1', 'bookstack-db': 'mariadb:12.3'} +[10:57:47] TO up -d rc=0 +[10:58:18] TO settled=True in 31.0s :: {"bookstack": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "bookstack-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:58:18] engine state bookstack-db: 12.3.3-MariaDB| This installation of MariaDB is already upgraded to 12.3.3-MariaDB. There is no need to run mariadb-upgrade again. [exit=1] +[10:58:18] migration lines observed: 5 +[10:58:19] bookstack: readback of the seeded account found=True :: This will delete any configure multi-factor authentication methods for user: - ID: 3 - Name: spike-b5edb9 - Email: spike +[10:58:19] RESULT (seed reads back AFTER): True +[10:58:19] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:80 +[10:58:34] + 15s bookstack=61M/512M peak=93M kills=0 rs=0 bookstack-db=143M/256M peak=149M kills=0 rs=0 reqs=272 +[10:58:49] + 30s bookstack=62M/512M peak=93M kills=0 rs=0 bookstack-db=142M/256M peak=149M kills=0 rs=0 reqs=540 +[10:59:05] + 45s bookstack=65M/512M peak=93M kills=0 rs=0 bookstack-db=142M/256M peak=149M kills=0 rs=0 reqs=810 +[10:59:20] + 61s bookstack=67M/512M peak=93M kills=0 rs=0 bookstack-db=141M/256M peak=149M kills=0 rs=0 reqs=1080 +[10:59:35] + 76s bookstack=70M/512M peak=93M kills=0 rs=0 bookstack-db=137M/256M peak=149M kills=0 rs=0 reqs=1351 +[10:59:50] + 91s bookstack=73M/512M peak=93M kills=0 rs=0 bookstack-db=134M/256M peak=149M kills=0 rs=0 reqs=1618 +[11:00:05] + 106s bookstack=74M/512M peak=93M kills=0 rs=0 bookstack-db=133M/256M peak=149M kills=0 rs=0 reqs=1884 +[11:00:20] + 121s bookstack=77M/512M peak=93M kills=0 rs=0 bookstack-db=133M/256M peak=149M kills=0 rs=0 reqs=2152 +[11:00:36] + 136s bookstack=83M/512M peak=93M kills=0 rs=0 bookstack-db=134M/256M peak=149M kills=0 rs=0 reqs=2420 +[11:00:51] + 152s bookstack=83M/512M peak=93M kills=0 rs=0 bookstack-db=133M/256M peak=149M kills=0 rs=0 reqs=2686 +[11:01:06] + 167s bookstack=85M/512M peak=93M kills=0 rs=0 bookstack-db=134M/256M peak=149M kills=0 rs=0 reqs=2955 +[11:01:21] + 182s bookstack=87M/512M peak=93M kills=0 rs=0 bookstack-db=134M/256M peak=149M kills=0 rs=0 reqs=3223 +[11:01:36] + 197s bookstack=90M/512M peak=93M kills=0 rs=0 bookstack-db=134M/256M peak=149M kills=0 rs=0 reqs=3494 +[11:01:51] + 212s bookstack=91M/512M peak=93M kills=0 rs=0 bookstack-db=133M/256M peak=149M kills=0 rs=0 reqs=3760 +[11:02:06] + 227s bookstack=93M/512M peak=94M kills=0 rs=0 bookstack-db=133M/256M peak=149M kills=0 rs=0 reqs=4028 +[11:02:22] + 242s bookstack=96M/512M peak=97M kills=0 rs=0 bookstack-db=133M/256M peak=149M kills=0 rs=0 reqs=4296 +[11:02:37] + 258s bookstack=97M/512M peak=98M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=4565 +[11:02:52] + 273s bookstack=100M/512M peak=101M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=4829 +[11:03:07] + 288s bookstack=103M/512M peak=103M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=5099 +[11:03:22] + 303s bookstack=105M/512M peak=106M kills=0 rs=0 bookstack-db=130M/256M peak=149M kills=0 rs=0 reqs=5364 +[11:03:37] + 318s bookstack=107M/512M peak=108M kills=0 rs=0 bookstack-db=130M/256M peak=149M kills=0 rs=0 reqs=5631 +[11:03:52] + 333s bookstack=109M/512M peak=111M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=5901 +[11:04:08] + 348s bookstack=112M/512M peak=113M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=6166 +[11:04:23] + 364s bookstack=114M/512M peak=115M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=6434 +[11:04:38] + 379s bookstack=119M/512M peak=120M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=6698 +[11:04:53] + 394s bookstack=118M/512M peak=121M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=6965 +[11:05:08] + 409s bookstack=120M/512M peak=121M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=7225 +[11:05:23] + 424s bookstack=122M/512M peak=123M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=7488 +[11:05:38] + 439s bookstack=123M/512M peak=123M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=7753 +[11:05:54] + 454s bookstack=124M/512M peak=126M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=8018 +[11:06:09] + 470s bookstack=126M/512M peak=127M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=8283 +[11:06:24] + 485s bookstack=128M/512M peak=129M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=8547 +[11:06:39] + 500s bookstack=130M/512M peak=130M kills=0 rs=0 bookstack-db=130M/256M peak=149M kills=0 rs=0 reqs=8815 +[11:06:54] + 515s bookstack=131M/512M peak=133M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=9079 +[11:07:09] + 530s bookstack=132M/512M peak=136M kills=0 rs=0 bookstack-db=130M/256M peak=149M kills=0 rs=0 reqs=9344 +[11:07:24] + 545s bookstack=135M/512M peak=136M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=9613 +[11:07:40] + 560s bookstack=136M/512M peak=139M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=9875 +[11:07:55] + 576s bookstack=137M/512M peak=141M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=10135 +[11:08:10] + 591s bookstack=138M/512M peak=142M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=10398 +[11:08:25] + 606s bookstack=141M/512M peak=144M kills=0 rs=0 bookstack-db=131M/256M peak=149M kills=0 rs=0 reqs=10663 +[11:08:25] memory watch: killed=False tight=[] requests=10663 codes={'302': 10663} +[11:08:25] MV-bookstack: ABORT — putting the FROM images back +[11:09:02] bookstack: readback of the seeded account found=True :: This will delete any configure multi-factor authentication methods for user: - ID: 3 - Name: spike-b5edb9 - Email: spike +[11:09:02] ABORT: app came back in 31.0s; data present=True \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/to-full.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/to-full.log new file mode 100644 index 00000000..05b9aa79 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/to-full.log @@ -0,0 +1,118 @@ +bookstack | [migrations] started +bookstack | [migrations] 01-nginx-site-confs-default: skipped +bookstack | [migrations] 02-default-location: skipped +bookstack | [migrations] done +bookstack | ─────────────────────────────────────── +bookstack | +bookstack | ██╗ ███████╗██╗ ██████╗ +bookstack | ██║ ██╔════╝██║██╔═══██╗ +bookstack | ██║ ███████╗██║██║ ██║ +bookstack | ██║ ╚════██║██║██║ ██║ +bookstack | ███████╗███████║██║╚██████╔╝ +bookstack | ╚══════╝╚══════╝╚═╝ ╚═════╝ +bookstack | +bookstack | Brought to you by linuxserver.io +bookstack | ─────────────────────────────────────── +bookstack | +bookstack | To support the app dev(s) visit: +bookstack | Bookstack: https://www.bookstackapp.com/donate/ +bookstack-db | 2026-09-30 12:56:36+02:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:12.3.3+maria~ubu2404 started. +bookstack-db | 2026-09-30 12:56:36+02:00 [Warn] [Entrypoint]: /sys/fs/cgroup///memory.pressure not writable, functionality unavailable to MariaDB +bookstack-db | 2026-09-30 12:56:36+02:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' +bookstack-db | 2026-09-30 12:56:36+02:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:12.3.3+maria~ubu2404 started. +bookstack-db | 2026-09-30 12:56:37+02:00 [Note] [Entrypoint]: Initializing database files +bookstack-db | 2026-09-30 12:56:37 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup). +bookstack-db | create_uring failed: falling back to libaio +bookstack-db | 2026-09-30 12:56:39+02:00 [Note] [Entrypoint]: Database files initialized +bookstack-db | 2026-09-30 12:56:39+02:00 [Note] [Entrypoint]: Starting temporary server +bookstack-db | 2026-09-30 12:56:39+02:00 [Note] [Entrypoint]: Waiting for server startup +bookstack-db | 2026-09-30 12:56:39 0 [Note] Starting MariaDB 12.3.3-MariaDB-ubu2404 source revision 83e909fc2a0dbc394b4b683fb3fa2d7dcf26cc5e server_uid i/adQyORMBjdCbV+zs20lFGiMUA= as process 93 +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: Compressed tables use zlib 1.3 +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: Number of transaction pools: 1 +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions +bookstack-db | 2026-09-30 12:56:39 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup). +bookstack-db | create_uring failed: falling back to libaio +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: Using Linux native AIO +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: innodb_buffer_pool_size_max=8388608m, innodb_buffer_pool_size=128m +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: Completed initialization of buffer pool +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: File system buffers for log disabled (block size=512 bytes) +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: End of log at LSN=45568 +bookstack | +bookstack | To support LSIO projects visit: +bookstack | https://www.linuxserver.io/donate/ +bookstack | +bookstack | ─────────────────────────────────────── +bookstack | GID/UID +bookstack | ─────────────────────────────────────── +bookstack | +bookstack | User UID: 1000 +bookstack | User GID: 1000 +bookstack | ─────────────────────────────────────── +bookstack | Linuxserver.io version: v26.09.1-ls287 +bookstack | Build-date: 2026-09-30T06:55:02+00:00 +bookstack | ─────────────────────────────────────── +bookstack | +bookstack | using keys found in /config/keys +bookstack | Waiting for DB to be available +bookstack | +bookstack | INFO Nothing to migrate. +bookstack | +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: Opened 3 undo tablespaces +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: 128 rollback segments in 3 undo tablespaces are active. +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: Setting file './ibtmp1' size to 12.000MiB. Physically writing the file full; Please wait ... +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB. +bookstack-db | 2026-09-30 12:56:39 0 [Note] InnoDB: log sequence number 45568; transaction id 14 +bookstack-db | 2026-09-30 12:56:39 0 [Note] Plugin 'FEEDBACK' is disabled. +bookstack-db | 2026-09-30 12:56:39 0 [Note] Plugin 'wsrep-provider' is disabled. +bookstack-db | 2026-09-30 12:56:40 0 [Note] mariadbd: Event Scheduler: Loaded 0 events +bookstack-db | 2026-09-30 12:56:40 0 [Note] Replication not automatically started: --skip-slave-start was specified +bookstack-db | 2026-09-30 12:56:40 0 [Note] mariadbd: ready for connections. +bookstack-db | Version: '12.3.3-MariaDB-ubu2404' socket: '/run/mysqld/mysqld.sock' port: 0 mariadb.org binary distribution +bookstack | [custom-init] No custom files found, skipping... +bookstack | [ls.io-init] done. +bookstack-db | 2026-09-30 12:56:41+02:00 [Note] [Entrypoint]: Temporary server started. +bookstack-db | 2026-09-30 12:56:42+02:00 [Note] [Entrypoint]: Creating database bookstack +bookstack-db | 2026-09-30 12:56:42+02:00 [Note] [Entrypoint]: Creating user bookstack +bookstack-db | 2026-09-30 12:56:42+02:00 [Note] [Entrypoint]: Giving user bookstack access to schema bookstack +bookstack-db | 2026-09-30 12:56:42+02:00 [Note] [Entrypoint]: Securing system users (equivalent to running mysql_secure_installation) +bookstack-db | +bookstack-db | 2026-09-30 12:56:42+02:00 [Note] [Entrypoint]: Stopping temporary server +bookstack-db | 2026-09-30 12:56:42 0 [Note] mariadbd (initiated by: unknown): Normal shutdown +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: FTS optimize thread exiting. +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Starting shutdown... +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Dumping buffer pool(s) to /var/lib/mysql/ib_buffer_pool +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Buffer pool(s) dump completed at 260930 12:56:42 +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Removed temporary tablespace data file: "./ibtmp1" +bookstack-db | 2026-09-30 12:56:42 0 [Note] Shutdown completed; log sequence number 45568; transaction id 15 +bookstack-db | 2026-09-30 12:56:42 0 [Note] mariadbd: Shutdown complete +bookstack-db | 2026-09-30 12:56:42+02:00 [Note] [Entrypoint]: Temporary server stopped +bookstack-db | +bookstack-db | 2026-09-30 12:56:42+02:00 [Note] [Entrypoint]: MariaDB init process done. Ready for start up. +bookstack-db | +bookstack-db | 2026-09-30 12:56:42 0 [Note] Starting MariaDB 12.3.3-MariaDB-ubu2404 source revision 83e909fc2a0dbc394b4b683fb3fa2d7dcf26cc5e server_uid i/adQyORMBjdCbV+zs20lFGiMUA= as process 1 +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Compressed tables use zlib 1.3 +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Number of transaction pools: 1 +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions +bookstack-db | 2026-09-30 12:56:42 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup). +bookstack-db | create_uring failed: falling back to libaio +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Using Linux native AIO +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: innodb_buffer_pool_size_max=8388608m, innodb_buffer_pool_size=128m +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Completed initialization of buffer pool +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: File system buffers for log disabled (block size=512 bytes) +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: End of log at LSN=45568 +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Opened 3 undo tablespaces +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: 128 rollback segments in 3 undo tablespaces are active. +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Setting file './ibtmp1' size to 12.000MiB. Physically writing the file full; Please wait ... +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB. +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: log sequence number 45568; transaction id 14 +bookstack-db | 2026-09-30 12:56:42 0 [Note] Plugin 'FEEDBACK' is disabled. +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool +bookstack-db | 2026-09-30 12:56:42 0 [Note] Plugin 'wsrep-provider' is disabled. +bookstack-db | 2026-09-30 12:56:42 0 [Note] InnoDB: Buffer pool(s) load completed at 260930 12:56:42 +bookstack-db | 2026-09-30 12:56:45 0 [Note] Server socket created on IP: '0.0.0.0', port: '3306'. +bookstack-db | 2026-09-30 12:56:45 0 [Note] Server socket created on IP: '::', port: '3306'. +bookstack-db | 2026-09-30 12:56:45 0 [Note] mariadbd: Event Scheduler: Loaded 0 events +bookstack-db | 2026-09-30 12:56:45 0 [Note] mariadbd: ready for connections. +bookstack-db | Version: '12.3.3-MariaDB-ubu2404' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution +bookstack-db | 2026-09-30 12:56:48 5 [Warning] Aborted connection 5 to db: 'unconnected' user: 'unauthenticated' host: '172.27.0.3' (This connection closed normally without authentication) +bookstack-db | 2026-09-30 12:57:48 25 [Warning] Aborted connection 25 to db: 'unconnected' user: 'unauthenticated' host: '172.27.0.3' (This connection closed normally without authentication) diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/to-states.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/to-states.json new file mode 100644 index 00000000..b910bf46 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/to-states.json @@ -0,0 +1,14 @@ +{ + "bookstack": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + }, + "bookstack-db": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/verdict.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/verdict.json new file mode 100644 index 00000000..977ee789 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/bookstack/bench/evidence/MV-bookstack/verdict.json @@ -0,0 +1,71 @@ +{ + "harness_version": 4, + "edge": "MV-bookstack", + "app": "bookstack", + "note": "night 2026-09-23 within-a-major move: bookstack=lscr.io/linuxserver/bookstack:26.09.1", + "from": { + "bookstack": "lscr.io/linuxserver/bookstack:26.05.5", + "bookstack-db": "mariadb:12.3" + }, + "to": { + "bookstack": "lscr.io/linuxserver/bookstack:26.09.1", + "bookstack-db": "mariadb:12.3" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Kbookstack | [migrations] started", + "abort": "starts-and-serves", + "abort_detail": null, + "engine_state_after": { + "bookstack-db": { + "image": "mariadb:12.3", + "probe": "datadir version | the engine's own upgrade verdict", + "answer": "12.3.3-MariaDB| This installation of MariaDB is already upgraded to 12.3.3-MariaDB. There is no need to run mariadb-upgrade again. [exit=1]", + "probe_rc": 0 + } + }, + "memory": { + "soak_s": 606.1, + "requested_s": 600, + "requests": 10663, + "codes": { + "302": 10663 + }, + "first_kill": null, + "containers": { + "bookstack": { + "limit": 536870912, + "peak": 151715840, + "peak_pct": 0.283, + "anon_peak_sampled": 25722880, + "anon_peak_pct": 0.048, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + }, + "bookstack-db": { + "limit": 268435456, + "peak": 156491776, + "peak_pct": 0.583, + "anon_peak_sampled": 117424128, + "anon_peak_pct": 0.437, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 31.0, + "measured_at": "2026-09-30T11:09:02Z", + "evidence": "evidence/MV-bookstack", + "scratch_cleared": [], + "files_changed": [], + "total_s": 772.2 +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/MV-grafana.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/MV-grafana.log new file mode 100644 index 00000000..abeeba2a --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/MV-grafana.log @@ -0,0 +1,109 @@ +[12:05:12] scratch drive folders cleared before FROM (R-656): none existed +[12:05:12] MV-grafana: deploying grafana at FROM {'grafana': 'grafana/grafana:13.2.2'} +[12:06:08] FROM settled=True in 30.9s :: {"grafana": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[12:06:08] fixture: the BOX walk's own (Grafana), through upgrade_boxport +[12:06:08] grafana: create folder http=200 +[12:06:08] grafana: readback of the seeded folder http=200 ok=True +[12:06:08] C1 (seed reads back BEFORE): True +[12:06:08] MV-grafana: swapping to TO {'grafana': 'grafana/grafana:13.2.3'} +[12:06:37] TO up -d rc=0 +[12:07:08] TO settled=True in 30.8s :: {"grafana": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[12:07:08] migration lines observed: 6 +[12:07:08] grafana: readback of the seeded folder http=200 ok=True +[12:07:08] RESULT (seed reads back AFTER): True +[12:07:08] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.3:3000 +[12:07:24] + 15s grafana=461M/512M peak=512M kills=0 rs=0 reqs=300 +[12:07:39] + 30s grafana=461M/512M peak=512M kills=0 rs=0 reqs=600 +[12:07:54] + 45s grafana=460M/512M peak=512M kills=0 rs=0 reqs=900 +[12:08:09] + 60s grafana=461M/512M peak=512M kills=0 rs=0 reqs=1200 +[12:08:24] + 76s grafana=462M/512M peak=512M kills=0 rs=0 reqs=1500 +[12:08:39] + 91s grafana=471M/512M peak=512M kills=0 rs=0 reqs=1800 +[12:08:54] + 106s grafana=471M/512M peak=512M kills=0 rs=0 reqs=2100 +[12:09:09] + 121s grafana=471M/512M peak=512M kills=0 rs=0 reqs=2400 +[12:09:24] + 136s grafana=470M/512M peak=512M kills=0 rs=0 reqs=2700 +[12:09:40] + 151s grafana=469M/512M peak=512M kills=0 rs=0 reqs=3000 +[12:09:55] + 166s grafana=469M/512M peak=512M kills=0 rs=0 reqs=3300 +[12:10:10] + 181s grafana=469M/512M peak=512M kills=0 rs=0 reqs=3600 +[12:10:25] + 196s grafana=468M/512M peak=512M kills=0 rs=0 reqs=3900 +[12:10:40] + 212s grafana=470M/512M peak=512M kills=0 rs=0 reqs=4200 +[12:10:55] + 227s grafana=465M/512M peak=512M kills=0 rs=0 reqs=4498 +[12:11:10] + 242s grafana=465M/512M peak=512M kills=0 rs=0 reqs=4798 +[12:11:25] + 257s grafana=465M/512M peak=512M kills=0 rs=0 reqs=5098 +[12:11:41] + 272s grafana=464M/512M peak=512M kills=0 rs=0 reqs=5398 +[12:11:56] + 287s grafana=464M/512M peak=512M kills=0 rs=0 reqs=5698 +[12:12:11] + 302s grafana=464M/512M peak=512M kills=0 rs=0 reqs=5998 +[12:12:26] + 318s grafana=463M/512M peak=512M kills=0 rs=0 reqs=6296 +[12:12:41] + 333s grafana=463M/512M peak=512M kills=0 rs=0 reqs=6596 +[12:12:56] + 348s grafana=463M/512M peak=512M kills=0 rs=0 reqs=6896 +[12:13:11] + 363s grafana=464M/512M peak=512M kills=0 rs=0 reqs=7196 +[12:13:26] + 378s grafana=463M/512M peak=512M kills=0 rs=0 reqs=7496 +[12:13:42] + 393s grafana=463M/512M peak=512M kills=0 rs=0 reqs=7796 +[12:13:57] + 408s grafana=463M/512M peak=512M kills=0 rs=0 reqs=8096 +[12:14:12] + 423s grafana=464M/512M peak=512M kills=0 rs=0 reqs=8396 +[12:14:27] + 438s grafana=463M/512M peak=512M kills=0 rs=0 reqs=8696 +[12:14:42] + 454s grafana=464M/512M peak=512M kills=0 rs=0 reqs=8996 +[12:14:57] + 469s grafana=464M/512M peak=512M kills=0 rs=0 reqs=9296 +[12:15:12] + 484s grafana=464M/512M peak=512M kills=0 rs=0 reqs=9596 +[12:15:27] + 499s grafana=464M/512M peak=512M kills=0 rs=0 reqs=9896 +[12:15:43] + 514s grafana=464M/512M peak=512M kills=0 rs=0 reqs=10194 +[12:15:58] + 529s grafana=464M/512M peak=512M kills=0 rs=0 reqs=10494 +[12:16:13] + 544s grafana=464M/512M peak=512M kills=0 rs=0 reqs=10794 +[12:16:28] + 560s grafana=464M/512M peak=512M kills=0 rs=0 reqs=11094 +[12:16:43] + 575s grafana=465M/512M peak=512M kills=0 rs=0 reqs=11392 +[12:16:58] + 590s grafana=464M/512M peak=512M kills=0 rs=0 reqs=11692 +[12:17:13] + 605s grafana=465M/512M peak=512M kills=0 rs=0 reqs=11992 +[12:17:13] memory watch: killed=False tight=[] requests=11992 codes={'302': 11992} +[12:17:13] MV-grafana: ABORT — putting the FROM images back +[12:17:45] grafana: readback of the seeded folder http=200 ok=True +[12:17:45] ABORT: app came back in 30.8s; data present=True +{ + "harness_version": 4, + "edge": "MV-grafana", + "app": "grafana", + "note": "night 2026-09-23 within-a-major move: grafana=grafana/grafana:13.2.3", + "from": { + "grafana": "grafana/grafana:13.2.2" + }, + "to": { + "grafana": "grafana/grafana:13.2.3" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Kgrafana | logger=settings t=2026-09-30T14:06:37.650875555+02:00 level=info msg=\"Unified migration configs enforced\" storage_type=unified target=[all]", + "abort": "starts-and-serves", + "abort_detail": null, + "engine_state_after": null, + "memory": { + "soak_s": 605.1, + "requested_s": 600, + "requests": 11992, + "codes": { + "302": 11992 + }, + "first_kill": null, + "containers": { + "grafana": { + "limit": 536870912, + "peak": 536875008, + "peak_pct": 1.0, + "anon_peak_sampled": 252989440, + "anon_peak_pct": 0.471, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 30.8, + "measured_at": "2026-09-30T12:17:45Z", + "evidence": "evidence/MV-grafana", + "scratch_cleared": [], + "files_changed": [], + "total_s": 753.4 +} diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/abort-states.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/abort-states.json new file mode 100644 index 00000000..2521a220 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/abort-states.json @@ -0,0 +1,8 @@ +{ + "grafana": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/compose-final.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/compose-final.log new file mode 100644 index 00000000..35850caf --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/compose-final.log @@ -0,0 +1,215 @@ +grafana | logger=settings t=2026-09-30T14:17:14.869374041+02:00 level=info msg="Starting Grafana" version=13.2.2 commit=1bea008f7e4e858b6824c9e364d608bd4d10b13a branch=release-13.2.2#patched compiled=2026-09-14T15:01:48+02:00 +grafana | logger=settings t=2026-09-30T14:17:14.870465623+02:00 level=info msg="Unified migration configs enforced" storage_type=unified target=[all] +grafana | logger=settings t=2026-09-30T14:17:14.870487044+02:00 level=info msg="Enforcing mode 5 for resource in unified storage" resource=playlists.playlist.grafana.app +grafana | logger=settings t=2026-09-30T14:17:14.870494438+02:00 level=info msg="Enforcing mode 5 for resource in unified storage" resource=folders.folder.grafana.app +grafana | logger=settings t=2026-09-30T14:17:14.870500679+02:00 level=info msg="Enforcing mode 5 for resource in unified storage" resource=dashboards.dashboard.grafana.app +grafana | logger=settings t=2026-09-30T14:17:14.87050648+02:00 level=info msg="Enforcing mode 5 for resource in unified storage" resource=shorturls.shorturl.grafana.app +grafana | logger=settings t=2026-09-30T14:17:14.870731545+02:00 level=info msg="Config loaded from" file=/usr/share/grafana/conf/defaults.ini +grafana | logger=settings t=2026-09-30T14:17:14.870740693+02:00 level=info msg="Config loaded from" file=/etc/grafana/grafana.ini +grafana | logger=settings t=2026-09-30T14:17:14.870748788+02:00 level=info msg="Config overridden from command line" arg="default.paths.data=/var/lib/grafana" +grafana | logger=settings t=2026-09-30T14:17:14.870754789+02:00 level=info msg="Config overridden from command line" arg="default.paths.logs=/var/log/grafana" +grafana | logger=settings t=2026-09-30T14:17:14.87076037+02:00 level=info msg="Config overridden from command line" arg="default.paths.plugins=/var/lib/grafana/plugins" +grafana | logger=settings t=2026-09-30T14:17:14.87076563+02:00 level=info msg="Config overridden from command line" arg="default.paths.provisioning=/etc/grafana/provisioning" +grafana | logger=settings t=2026-09-30T14:17:14.87077096+02:00 level=info msg="Config overridden from command line" arg="default.log.mode=console" +grafana | logger=settings t=2026-09-30T14:17:14.870776911+02:00 level=info msg="Config overridden from Environment variable" var="GF_PATHS_DATA=/var/lib/grafana" +grafana | logger=settings t=2026-09-30T14:17:14.870783223+02:00 level=info msg="Config overridden from Environment variable" var="GF_PATHS_LOGS=/var/log/grafana" +grafana | logger=settings t=2026-09-30T14:17:14.870788463+02:00 level=info msg="Config overridden from Environment variable" var="GF_PATHS_PLUGINS=/var/lib/grafana/plugins" +grafana | logger=settings t=2026-09-30T14:17:14.870793913+02:00 level=info msg="Config overridden from Environment variable" var="GF_PATHS_PROVISIONING=/etc/grafana/provisioning" +grafana | logger=settings t=2026-09-30T14:17:14.870799674+02:00 level=info msg="Config overridden from Environment variable" var="GF_SERVER_ROOT_URL=https://grafana.gate.invalid" +grafana | logger=settings t=2026-09-30T14:17:14.870805325+02:00 level=info msg="Config overridden from Environment variable" var="GF_SECURITY_ADMIN_PASSWORD=*********" +grafana | logger=settings t=2026-09-30T14:17:14.870810775+02:00 level=info msg="Config overridden from Environment variable" var="GF_PATHS_HOME=/usr/share/grafana" +grafana | logger=settings t=2026-09-30T14:17:14.870817007+02:00 level=info msg="Config overridden from Environment variable" var="GF_PATHS_CONFIG=/etc/grafana/grafana.ini" +grafana | logger=settings t=2026-09-30T14:17:14.870822638+02:00 level=info msg=Target target=[all] +grafana | logger=settings t=2026-09-30T14:17:14.870835522+02:00 level=info msg="Path Home" path=/usr/share/grafana +grafana | logger=settings t=2026-09-30T14:17:14.870840742+02:00 level=info msg="Path Data" path=/var/lib/grafana +grafana | logger=settings t=2026-09-30T14:17:14.870846914+02:00 level=info msg="Path Logs" path=/var/log/grafana +grafana | logger=settings t=2026-09-30T14:17:14.870852244+02:00 level=info msg="Path Plugins" path="[/var/lib/grafana/plugins /usr/share/grafana/data/plugins-bundled]" +grafana | logger=settings t=2026-09-30T14:17:14.870868615+02:00 level=info msg="Path Provisioning" path=/etc/grafana/provisioning +grafana | logger=settings t=2026-09-30T14:17:14.870874115+02:00 level=info msg="App mode production" +grafana | logger=featuremgmt t=2026-09-30T14:17:14.872128635+02:00 level=info msg=FeatureToggles alertRuleRestore=true alertingBulkActionsInUI=true alertingImportYAMLUI=true alertingListViewV2=true alertingMigrationUI=true alertingNavigationV2=true alertingNotificationsStepMode=true alertingQueryAndExpressionsStepMode=true alertingRulePermanentlyDelete=true alertingRuleRecoverDeleted=true alertingRuleVersionHistoryRestore=true alertingUIOptimizeReducer=true alertingUIUseBackendFilters=true alertingUIUseFullyCompatBackendFilters=true alertingUseNewSimplifiedRoutingHashAlgorithm=true annotationPermissionUpdate=true auditLoggingAppPlatform=true awsAsyncQueryCaching=true awsDatasourcesTempCredentials=true azureMonitorEnableUserAuth=true azureMonitorPrometheusExemplars=true azureResourcePickerUpdates=true cloudWatchCrossAccountQuerying=true cloudWatchNewLabelParsing=true cloudWatchRoundUpEndTime=true dashboardNewLayouts=true dashboardUnifiedDrilldownControls=true disableScriptedDashboards=true enableSCIM=true feedbackButton=true grafana.dashboardSettingsRedesign=true grafana.newPreferencesPage=true grafana.queryVarEditorRedesign=true grafana.scenesFlickeringFix=true grafana.unifiedDataSourcePicker=true grafana.viewPanelPane=true grafanaAssistantInProfilesDrilldown=true improvedExternalSessionHandling=true improvedExternalSessionHandlingSAML=true lokiLabelNamesQueryApi=true lokiQuerySplitting=true newClickhouseConfigPageDesign=true newSavedQueriesExperience=true onlyStoreActionSets=true preferences.rerouteLegacyAPIs=true profilesExemplars=true prometheusAzureOverrideAudience=true prometheusTypeMigration=true provisioning.gitConventions=true provisioning.readmes=true provisioning.userAttribution=true provisioningFolderMetadata=true pyroscopeUTF8LabelNames=true queryLibrary=true react19=true rememberUserOrgForSso=true renderAuthJWT=true restrictedPluginApis=true savedQueriesRBAC=true sqlExpressions=true useKubernetesShortURLsAPI=true useSessionStorageForRedirection=true +grafana | logger=sqlstore t=2026-09-30T14:17:14.872219066+02:00 level=info msg="Connecting to DB" dbtype=sqlite3 +grafana | logger=sqlstore t=2026-09-30T14:17:14.872226861+02:00 level=info msg="Using SQLite driver" driver=modernc.org/sqlite +grafana | logger=migrator t=2026-09-30T14:17:14.873135858+02:00 level=info msg="Starting DB migrations" +grafana | logger=migrator t=2026-09-30T14:17:14.885116564+02:00 level=info msg="migrations completed" performed=0 skipped=719 duration=779.804µs +grafana | logger=secrets t=2026-09-30T14:17:14.885539513+02:00 level=info msg="Envelope encryption state" currentprovider=secretKey.v1 +grafana | logger=plugin.angulardetectorsprovider.dynamic t=2026-09-30T14:17:14.954273325+02:00 level=info msg="Restored cache from database" duration=491.328µs +grafana | logger=resource-db t=2026-09-30T14:17:14.954904839+02:00 level=info msg="Using database section" db_type=sqlite3 +grafana | logger=accesscontrol.service t=2026-09-30T14:17:14.95504837+02:00 level=info msg="Starting migration to remove deprecated permissions" migration=removeDeprecatedPermissions +grafana | logger=accesscontrol.service t=2026-09-30T14:17:14.955885251+02:00 level=info msg="Completed migration to remove deprecated permissions" migration=removeDeprecatedPermissions totalRemoved=0 duration=836.671µs +grafana | logger=plugin.store t=2026-09-30T14:17:15.018926719+02:00 level=info msg="Loading plugins..." +grafana | logger=plugins.registration t=2026-09-30T14:17:15.163994513+02:00 level=info msg="Plugin registered" pluginId=elasticsearch +grafana | logger=plugins.registration t=2026-09-30T14:17:15.191699367+02:00 level=info msg="Plugin registered" pluginId=grafana-advisor-app +grafana | logger=plugins.registration t=2026-09-30T14:17:15.248302871+02:00 level=info msg="Plugin registered" pluginId=grafana-exploretraces-app +grafana | logger=plugins.registration t=2026-09-30T14:17:15.303417182+02:00 level=info msg="Plugin registered" pluginId=grafana-lokiexplore-app +grafana | logger=plugins.registration t=2026-09-30T14:17:15.336324996+02:00 level=info msg="Plugin registered" pluginId=grafana-metricsdrilldown-app +grafana | logger=plugins.registration t=2026-09-30T14:17:15.414922835+02:00 level=info msg="Plugin registered" pluginId=grafana-postgresql-datasource +grafana | logger=plugins.registration t=2026-09-30T14:17:15.461167608+02:00 level=info msg="Plugin registered" pluginId=grafana-pyroscope-app +grafana | logger=plugins.registration t=2026-09-30T14:17:15.527599291+02:00 level=info msg="Plugin registered" pluginId=grafana-pyroscope-datasource +grafana | logger=plugins.registration t=2026-09-30T14:17:15.659005895+02:00 level=info msg="Plugin registered" pluginId=influxdb +grafana | logger=plugins.registration t=2026-09-30T14:17:15.719025593+02:00 level=info msg="Plugin registered" pluginId=jaeger +grafana | logger=plugins.registration t=2026-09-30T14:17:15.838596285+02:00 level=info msg="Plugin registered" pluginId=loki +grafana | logger=plugins.registration t=2026-09-30T14:17:15.943533278+02:00 level=info msg="Plugin registered" pluginId=mssql +grafana | logger=plugins.registration t=2026-09-30T14:17:16.042416253+02:00 level=info msg="Plugin registered" pluginId=mysql +grafana | logger=plugins.registration t=2026-09-30T14:17:16.100008645+02:00 level=info msg="Plugin registered" pluginId=opentsdb +grafana | logger=plugins.registration t=2026-09-30T14:17:16.252217091+02:00 level=info msg="Plugin registered" pluginId=prometheus +grafana | logger=plugins.registration t=2026-09-30T14:17:16.341249394+02:00 level=info msg="Plugin registered" pluginId=stackdriver +grafana | logger=plugins.registration t=2026-09-30T14:17:16.521105737+02:00 level=info msg="Plugin registered" pluginId=tempo +grafana | logger=plugins.registration t=2026-09-30T14:17:16.577208956+02:00 level=info msg="Plugin registered" pluginId=zipkin +grafana | logger=plugins.dedupe t=2026-09-30T14:17:16.577947701+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=elasticsearch +grafana | logger=plugins.dedupe t=2026-09-30T14:17:16.578608059+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=grafana-postgresql-datasource +grafana | logger=plugins.dedupe t=2026-09-30T14:17:16.579151085+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=grafana-pyroscope-datasource +grafana | logger=plugins.dedupe t=2026-09-30T14:17:16.579798428+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=influxdb +grafana | logger=plugins.dedupe t=2026-09-30T14:17:16.580377632+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=jaeger +grafana | logger=plugins.dedupe t=2026-09-30T14:17:16.581091311+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=loki +grafana | logger=plugins.dedupe t=2026-09-30T14:17:16.584364535+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=mssql +grafana | logger=plugins.dedupe t=2026-09-30T14:17:16.584963496+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=mysql +grafana | logger=plugins.dedupe t=2026-09-30T14:17:16.585448443+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=opentsdb +grafana | logger=plugins.dedupe t=2026-09-30T14:17:16.590323403+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=prometheus +grafana | logger=plugins.dedupe t=2026-09-30T14:17:16.591278007+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=stackdriver +grafana | logger=plugins.dedupe t=2026-09-30T14:17:16.596904287+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=tempo +grafana | logger=plugins.dedupe t=2026-09-30T14:17:16.5973874+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=zipkin +grafana | logger=plugin.store t=2026-09-30T14:17:16.597401596+02:00 level=info msg="Plugins loaded" count=56 duration=1.57847631s +grafana | logger=secret-migrator t=2026-09-30T14:17:16.597873508+02:00 level=info msg="Starting DB migrations" +grafana | logger=secret-migrator t=2026-09-30T14:17:16.598752619+02:00 level=info msg="migrations completed" performed=0 skipped=35 duration=55.494µs +grafana | logger=resource-db t=2026-09-30T14:17:16.600216976+02:00 level=info msg="Initializing Resource DB" db_type=sqlite3 open_conn=0 in_use_conn=0 idle_conn=0 max_open_conn=0 +grafana | logger=resource-migrator t=2026-09-30T14:17:16.60034077+02:00 level=info msg="Starting DB migrations" +grafana | logger=resource-migrator t=2026-09-30T14:17:16.603965468+02:00 level=info msg="migrations completed" performed=0 skipped=55 duration=157.478µs +grafana | t=2026-09-30T14:17:16.604308185+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:16.604292456+02:00 msg="Using channel notifier" logger=sql-resource-server +grafana | logger=bleve-backend namespace=default group=advisor.grafana.app resource=checktypes reason=init t=2026-09-30T14:17:16.605568918+02:00 level=info msg="Building index using memory" +grafana | logger=bleve-backend namespace=default group=advisor.grafana.app resource=checktypes reason=init t=2026-09-30T14:17:16.608725281+02:00 level=info msg="Finished building index" elapsed=3.102722ms listRV=1790769970674997 +grafana | logger=bleve-backend namespace=default group=advisor.grafana.app resource=checktypes reason=init t=2026-09-30T14:17:16.608784934+02:00 level=info msg="Storing index in cache" key="{Namespace:default Group:advisor.grafana.app Resource:checktypes}" expiration=2026-09-30T14:27:16.60878269+02:00 +grafana | logger=resource-search t=2026-09-30T14:17:16.608967208+02:00 level=info msg="search index initialized" duration_secs=0 total_docs=5 +grafana | logger=storage.unified.migrations t=2026-09-30T14:17:16.612304243+02:00 level=info msg="Running migrations for unified storage" +grafana | logger=storage.unified.migrations t=2026-09-30T14:17:16.612377411+02:00 level=info msg="Migration is disabled in config, skipping" migration=snapshots +grafana | logger=storage.unified.migrations t=2026-09-30T14:17:16.612386148+02:00 level=info msg="Migration is disabled in config, skipping" migration=datasource +grafana | logger=storage.unified.migrations t=2026-09-30T14:17:16.612391448+02:00 level=info msg="Migration is disabled in config, skipping" migration=stars +grafana | logger=storage.unified.migrations t=2026-09-30T14:17:16.612396387+02:00 level=info msg="Migration is disabled in config, skipping" migration=preferences +grafana | logger=storage.unified.migrations t=2026-09-30T14:17:16.612401296+02:00 level=info msg="Migration is disabled in config, skipping" migration=querycacheconfigs +grafana | logger=unifiedstorage-migrator t=2026-09-30T14:17:16.612476739+02:00 level=info msg="Starting DB migrations" +grafana | logger=unifiedstorage-migrator t=2026-09-30T14:17:16.612970422+02:00 level=info msg="migrations completed" performed=0 skipped=4 duration=20.499µs +grafana | logger=storage.unified.migrations t=2026-09-30T14:17:16.613238578+02:00 level=info msg="Unified storage migrations completed successfully" +grafana | logger=live.push_http t=2026-09-30T14:17:16.621347399+02:00 level=info msg="Live Push Gateway initialization" +grafana | logger=ngalert.notifier t=2026-09-30T14:17:16.62310003+02:00 level=info component=alertmanager orgID=1 msg="template definitions loaded" mimir=0 grafana=0 total=0 maxTemplateOutput=10485760 +grafana | logger=ngalert.notifier component=alertmanager orgID=1 t=2026-09-30T14:17:16.624318031+02:00 level=info msg="Applying new configuration to Alertmanager" configHash="{12383335334731491449 16454292769479786371 11535544170606148457 1343157387507078592 10278876130067529486 4613426124549341787 5144611013662998819}" +grafana | logger=ngalert.notifier t=2026-09-30T14:17:16.624342437+02:00 level=info component=alertmanager orgID=1 msg="template definitions loaded" mimir=0 grafana=0 total=0 maxTemplateOutput=10485760 +grafana | logger=ngalert.writer t=2026-09-30T14:17:16.639605785+02:00 level=info msg="Setting up remote write using data sources" timeout=30s default_datasource_uid= +grafana | logger=ngalert.state.manager.persist t=2026-09-30T14:17:16.639704812+02:00 level=info msg="Using sync rule state persister" +grafana | logger=query_data t=2026-09-30T14:17:16.641105399+02:00 level=info msg="Query Service initialization" +grafana | logger=annotation.app t=2026-09-30T14:17:16.680476274+02:00 level=info msg="Annotation cleanup disabled (no retention TTL configured)" +grafana | logger=infra.usagestats.collector t=2026-09-30T14:17:16.683161948+02:00 level=info msg="registering usage stat providers" usageStatsProvidersLen=2 +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:16.75226073+02:00 level=info msg=starting module=*sqlstore.SQLStore +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:16.752358264+02:00 level=info msg=starting module=tracing +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:16.752392168+02:00 level=info msg=starting module=grafana-apiserver +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.045669062+02:00 level=info msg="Adding GroupVersion dashboard.grafana.app v2 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.046743683+02:00 level=info msg="Adding GroupVersion dashboard.grafana.app v2beta1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.04710758+02:00 level=info msg="Adding GroupVersion dashboard.grafana.app v2alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.047656828+02:00 level=info msg="Adding GroupVersion dashboard.grafana.app v0alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.048120093+02:00 level=info msg="Adding GroupVersion dashboard.grafana.app v1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.048487407+02:00 level=info msg="Adding GroupVersion dashboard.grafana.app v1beta1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.049580653+02:00 level=info msg="Adding GroupVersion preferences.grafana.app v1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.049934872+02:00 level=info msg="Adding GroupVersion preferences.grafana.app v1alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.055303555+02:00 level=info msg="Adding GroupVersion provisioning.grafana.app v0alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.057800894+02:00 level=info msg="Adding GroupVersion provisioning.grafana.app v1beta1 to ResourceManager" +grafana | t=2026-09-30T14:17:17.058012904+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.058000731+02:00 msg="Zanzana is not enabled; skipping folder propagation hooks" +grafana | t=2026-09-30T14:17:17.058044133+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.058040486+02:00 msg="Zanzana is not enabled; skipping folder propagation hooks" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.058977747+02:00 level=info msg="Adding GroupVersion folder.grafana.app v1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.059449078+02:00 level=info msg="Adding GroupVersion folder.grafana.app v1beta1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.060194075+02:00 level=info msg="Adding GroupVersion userstorage.grafana.app v0alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.061306407+02:00 level=info msg="Adding GroupVersion collections.grafana.app v1alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.061666177+02:00 level=info msg="Adding GroupVersion features.grafana.app v0alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.062769231+02:00 level=info msg="Adding GroupVersion playlist.grafana.app v1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.063443635+02:00 level=info msg="Adding GroupVersion playlist.grafana.app v0alpha1 to ResourceManager" +grafana | t=2026-09-30T14:17:17.063541009+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.063528245+02:00 msg="Installed APIs for app" app=playlist +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.065427433+02:00 level=info msg="Adding GroupVersion plugins.grafana.app v0alpha1 to ResourceManager" +grafana | t=2026-09-30T14:17:17.065535948+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.065520318+02:00 msg="Installed APIs for app" app=plugins +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.066925974+02:00 level=info msg="Adding GroupVersion example.grafana.app v1alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.067561705+02:00 level=info msg="Adding GroupVersion example.grafana.app v0alpha1 to ResourceManager" +grafana | t=2026-09-30T14:17:17.067728951+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.067715746+02:00 msg="Installed APIs for app" app=example +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.067805616+02:00 level=info msg="Skipping API quotas.grafana.app/v0alpha1 because it has no resources." +grafana | t=2026-09-30T14:17:17.06797184+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.067965027+02:00 msg="Installed APIs for app" app=quotas +grafana | logger=storage.unified.migrations t=2026-09-30T14:17:17.068351107+02:00 level=info msg="Resolved storage mode from migration log" resource=shorturls.shorturl.grafana.app mode=unified +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.069419345+02:00 level=info msg="Adding GroupVersion shorturl.grafana.app v1beta1 to ResourceManager" +grafana | t=2026-09-30T14:17:17.069523141+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.069509155+02:00 msg="Installed APIs for app" app=shorturl +grafana | t=2026-09-30T14:17:17.06979218+02:00 level=warn caller=logger.go:224 time=2026-09-30T14:17:17.06978156+02:00 msg="skipped registering status sub-resource that does not support dual writing" resource=alertrules.rules.alerting.grafana.app version=v0alpha1 storagePath=alertrules/status +grafana | t=2026-09-30T14:17:17.06985082+02:00 level=warn caller=logger.go:224 time=2026-09-30T14:17:17.069842204+02:00 msg="skipped registering status sub-resource that does not support dual writing" resource=recordingrules.rules.alerting.grafana.app version=v0alpha1 storagePath=recordingrules/status +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.072213594+02:00 level=info msg="Adding GroupVersion rules.alerting.grafana.app v0alpha1 to ResourceManager" +grafana | t=2026-09-30T14:17:17.072351765+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.072338881+02:00 msg="Installed APIs for app" app=alerting +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.075702496+02:00 level=info msg="Adding GroupVersion notifications.alerting.grafana.app v1beta1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.078152054+02:00 level=info msg="Adding GroupVersion notifications.alerting.grafana.app v0alpha1 to ResourceManager" +grafana | t=2026-09-30T14:17:17.07843028+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.078415011+02:00 msg="Installed APIs for app" app=alerting-notifications +grafana | logger=grafana-apiserver t=2026-09-30T14:17:17.081698545+02:00 level=info msg="Adding GroupVersion advisor.grafana.app v0alpha1 to ResourceManager" +grafana | t=2026-09-30T14:17:17.082211083+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.08219355+02:00 msg="Installed APIs for app" app=advisor +grafana | t=2026-09-30T14:17:17.781243764+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.781212575+02:00 msg="App initialized" app=playlist +grafana | t=2026-09-30T14:17:17.781353511+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.781338643+02:00 msg="App initialized" app=quotas +grafana | t=2026-09-30T14:17:17.781377657+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.781368479+02:00 msg="App initialized" app=alerting-notifications +grafana | t=2026-09-30T14:17:17.78142201+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.781415618+02:00 msg="App initialized" app=plugins +grafana | t=2026-09-30T14:17:17.78143225+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.781422471+02:00 msg="App initialized" app=shorturl +grafana | t=2026-09-30T14:17:17.781461024+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.781455243+02:00 msg="App initialized" app=example +grafana | t=2026-09-30T14:17:17.781689556+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.781680639+02:00 msg="App initialized" app=advisor +grafana | t=2026-09-30T14:17:17.781777853+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.781740432+02:00 msg="starting job cleanup controller" logger=job-cleanup-controller cleanup_interval=3m0s expiry=1m0s +grafana | t=2026-09-30T14:17:17.781706237+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.781659429+02:00 msg="start concurrent job driver" logger=concurrent-job-driver num_drivers=3 job_timeout=20m0s lease_renewal_interval=20s +grafana | t=2026-09-30T14:17:17.789585504+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.789563863+02:00 msg="App initialized" app=alerting +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.790003684+02:00 level=info msg=starting module=plugins.store +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.790058668+02:00 level=info msg=starting module=plugin.backgroundinstaller +grafana | logger=plugin.backgroundinstaller t=2026-09-30T14:17:17.790075139+02:00 level=info msg="Plugins installed" plugins=[] +grafana | logger=plugin.backgroundinstaller t=2026-09-30T14:17:17.790095638+02:00 level=info msg="Installing plugins" plugins="[{ID:tempo Version: URL:} {ID:mysql Version: URL:} {ID:zipkin Version: URL:} {ID:loki Version: URL:} {ID:influxdb Version: URL:} {ID:jaeger Version: URL:} {ID:grafana-pyroscope-app Version: URL:} {ID:grafana-metricsdrilldown-app Version: URL:} {ID:mssql Version: URL:} {ID:grafana-postgresql-datasource Version: URL:} {ID:grafana-exploretraces-app Version: URL:} {ID:elasticsearch Version: URL:} {ID:stackdriver Version: URL:} {ID:grafana-advisor-app Version: URL:} {ID:prometheus Version: URL:} {ID:grafana-pyroscope-datasource Version: URL:} {ID:grafana-lokiexplore-app Version: URL:} {ID:opentsdb Version: URL:}]" +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.790327947+02:00 level=info msg=starting module=provisioning +grafana | logger=provisioning.alerting t=2026-09-30T14:17:17.791527383+02:00 level=info msg="starting to provision alerting" +grafana | logger=provisioning.alerting t=2026-09-30T14:17:17.791554634+02:00 level=info msg="finished to provision alerting" +grafana | logger=bleve-backend namespace=default group=dashboard.grafana.app resource=dashboards reason=search t=2026-09-30T14:17:17.831829367+02:00 level=info msg="Building index using memory" +grafana | logger=bleve-backend namespace=default group=dashboard.grafana.app resource=dashboards reason=search t=2026-09-30T14:17:17.832851088+02:00 level=info msg="Finished building index" elapsed=834.957µs listRV=1790769947884011 +grafana | logger=bleve-backend namespace=default group=dashboard.grafana.app resource=dashboards reason=search t=2026-09-30T14:17:17.832886485+02:00 level=info msg="Storing index in cache" key="{Namespace:default Group:dashboard.grafana.app Resource:dashboards}" expiration=2026-09-30T14:27:17.832884812+02:00 +grafana | logger=provisioning.dashboard t=2026-09-30T14:17:17.842778064+02:00 level=info msg="starting to provision dashboards" +grafana | logger=provisioning.dashboard t=2026-09-30T14:17:17.842802209+02:00 level=info msg="finished to provision dashboards" +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.850868209+02:00 level=info msg=starting module=*api.HTTPServer +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.850881534+02:00 level=info msg=starting module=*migrations.SecretMigrationProviderImpl +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.850907333+02:00 level=info msg=starting module=*service.DashboardServiceImpl +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.850912272+02:00 level=info msg=starting module=*angulardetectorsprovider.Dynamic +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.850962467+02:00 level=info msg=starting module=*cleanup.CleanUpService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.8512288+02:00 level=info msg=starting module=*loginattemptimpl.Service +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.851264417+02:00 level=info msg=starting module=*pluginexternal.Service +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.851321485+02:00 level=info msg=starting module=*appregistry.Service +grafana | logger=app-registry t=2026-09-30T14:17:17.851351742+02:00 level=info msg="app registry initialized" +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.851294134+02:00 level=info msg=starting module=*ssosettingsimpl.Service +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.851378934+02:00 level=info msg=starting module=*remotecache.RemoteCache +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.851274025+02:00 level=info msg=starting module=*metrics.InternalMetricsService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.851405865+02:00 level=info msg=starting module=*updatemanager.GrafanaService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.851488531+02:00 level=info msg=starting module=*garbagecollectionworker.Worker +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.851540739+02:00 level=info msg=starting module=*metric.Service +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.85176335+02:00 level=info msg=starting module=*dynamic.KeyRetriever +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.851829204+02:00 level=info msg=starting module=*updatemanager.PluginsService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.851936297+02:00 level=info msg=starting module=*supportbundlesimpl.Service +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.852118681+02:00 level=info msg=starting module=*notifications.NotificationService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.852153517+02:00 level=info msg=starting module=*dualwrite.ZanzanaReconciler +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.850875843+02:00 level=info msg=starting module=*authz.EmbeddedZanzanaService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.852178334+02:00 level=info msg=starting module=*statscollector.Service +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.851282772+02:00 level=info msg=starting module=*ngalert.AlertNG +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.851304283+02:00 level=info msg=starting module=*live.GrafanaLive +grafana | logger=ngalert t=2026-09-30T14:17:17.852347213+02:00 level=info msg="Primary node, alert rule evaluation enabled" +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.851310935+02:00 level=info msg=starting module=*store.standardStorageService +grafana | logger=ngalert.state.manager t=2026-09-30T14:17:17.852370677+02:00 level=info msg="Warming state cache for startup" +grafana | logger=grafanaStorageLogger t=2026-09-30T14:17:17.852392849+02:00 level=info msg="Storage starting" +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.850867027+02:00 level=info msg=starting module=*service.UsageStats +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.852699789+02:00 level=info msg=starting module=*authimpl.UserAuthTokenService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.852931768+02:00 level=info msg=starting module=*manager.ServiceAccountsService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.852935504+02:00 level=info msg=starting module=*anonimpl.AnonDeviceService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.852977263+02:00 level=info msg=starting module=*pushhttp.Gateway +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.853009604+02:00 level=info msg=starting module=*manager.SecretsService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.853083675+02:00 level=info msg=starting module=*rendering.RenderingService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.853333987+02:00 level=info msg=starting module=*service.DashboardUpdater +grafana | logger=ngalert.multiorg.alertmanager t=2026-09-30T14:17:17.853418908+02:00 level=info msg="Starting MultiOrg Alertmanager" +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:17:17.853776233+02:00 level=info msg="All modules healthy" +grafana | logger=http.server t=2026-09-30T14:17:17.854966592+02:00 level=info msg="HTTP Server Listen" address=[::]:3000 protocol=http subUrl= socket= +grafana | t=2026-09-30T14:17:17.884067303+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.884031195+02:00 msg="Starting ConnectionController" logger=provisioning-connection-controller +grafana | t=2026-09-30T14:17:17.884127026+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.884116807+02:00 msg="Starting workers" logger=provisioning-connection-controller count=1 +grafana | t=2026-09-30T14:17:17.884153045+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.884147685+02:00 msg="Started workers" logger=provisioning-connection-controller +grafana | logger=ngalert.state.manager t=2026-09-30T14:17:17.927861346+02:00 level=info msg="State cache has been initialized" rules=0 states=0 duration=75.490067ms +grafana | logger=ngalert.scheduler t=2026-09-30T14:17:17.927924545+02:00 level=info msg="Starting scheduler" tickInterval=10s maxAttempts=3 +grafana | logger=ngalert.scheduler t=2026-09-30T14:17:17.927993576+02:00 level=info msg=starting component=ticker first_tick=2026-09-30T14:17:20+02:00 +grafana | logger=plugins.update.checker t=2026-09-30T14:17:17.959399583+02:00 level=info msg="Update check succeeded" duration=107.543608ms +grafana | logger=plugins.update.checker t=2026-09-30T14:17:17.959470878+02:00 level=info msg="flag evaluation succeeded" flag="{Value:false EvaluationDetails:{FlagKey:pluginsAutoUpdate FlagType:bool ResolutionDetail:{Variant:default Reason:STATIC ErrorCode: ErrorMessage: FlagMetadata:map[]}}}" details="{Value:false EvaluationDetails:{FlagKey:pluginsAutoUpdate FlagType:bool ResolutionDetail:{Variant:default Reason:STATIC ErrorCode: ErrorMessage: FlagMetadata:map[]}}}" +grafana | logger=grafana.update.checker t=2026-09-30T14:17:17.981144567+02:00 level=info msg="Update check succeeded" duration=129.719436ms +grafana | t=2026-09-30T14:17:17.982958995+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.982927866+02:00 msg="Starting RepositoryController" logger=provisioning-repository-controller +grafana | t=2026-09-30T14:17:17.982986146+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.982976889+02:00 msg="Starting workers" logger=provisioning-repository-controller count=1 +grafana | t=2026-09-30T14:17:17.983005793+02:00 level=info caller=logger.go:214 time=2026-09-30T14:17:17.983002197+02:00 msg="Started workers" logger=provisioning-repository-controller +grafana | logger=context userId=1 orgId=1 uname=admin t=2026-09-30T14:17:45.591121069+02:00 level=info msg="Request Completed" method=GET path=/api/folders/nope73afe66513 status=404 remote_addr=172.18.0.1 time_ms=26 duration=26.523723ms size=51 referer= handler=/api/folders/:uid/ status_source=server diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/engine-state.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/engine-state.json new file mode 100644 index 00000000..ec747fa4 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/engine-state.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/files-after.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/files-after.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/files-after.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/files-before.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/files-before.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/files-before.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/memory-samples.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/memory-samples.json new file mode 100644 index 00000000..7ad809c5 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/memory-samples.json @@ -0,0 +1,682 @@ +[ + { + "t": 15.1, + "containers": { + "grafana": { + "limit": 536870912, + "current": 483614720, + "peak": 536875008, + "anon": 247193600, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 300 + }, + { + "t": 30.2, + "containers": { + "grafana": { + "limit": 536870912, + "current": 483647488, + "peak": 536875008, + "anon": 247201792, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 600 + }, + { + "t": 45.4, + "containers": { + "grafana": { + "limit": 536870912, + "current": 483147776, + "peak": 536875008, + "anon": 246460416, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 900 + }, + { + "t": 60.5, + "containers": { + "grafana": { + "limit": 536870912, + "current": 484134912, + "peak": 536875008, + "anon": 246865920, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1200 + }, + { + "t": 75.6, + "containers": { + "grafana": { + "limit": 536870912, + "current": 484466688, + "peak": 536875008, + "anon": 247197696, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1500 + }, + { + "t": 90.7, + "containers": { + "grafana": { + "limit": 536870912, + "current": 494428160, + "peak": 536875008, + "anon": 252911616, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1800 + }, + { + "t": 105.8, + "containers": { + "grafana": { + "limit": 536870912, + "current": 494309376, + "peak": 536875008, + "anon": 252977152, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2100 + }, + { + "t": 120.9, + "containers": { + "grafana": { + "limit": 536870912, + "current": 494174208, + "peak": 536875008, + "anon": 252989440, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2400 + }, + { + "t": 136.1, + "containers": { + "grafana": { + "limit": 536870912, + "current": 493826048, + "peak": 536875008, + "anon": 252989440, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2700 + }, + { + "t": 151.2, + "containers": { + "grafana": { + "limit": 536870912, + "current": 492052480, + "peak": 536875008, + "anon": 251170816, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3000 + }, + { + "t": 166.3, + "containers": { + "grafana": { + "limit": 536870912, + "current": 491782144, + "peak": 536875008, + "anon": 250949632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3300 + }, + { + "t": 181.4, + "containers": { + "grafana": { + "limit": 536870912, + "current": 492314624, + "peak": 536875008, + "anon": 250961920, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3600 + }, + { + "t": 196.5, + "containers": { + "grafana": { + "limit": 536870912, + "current": 491765760, + "peak": 536875008, + "anon": 250904576, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3900 + }, + { + "t": 211.6, + "containers": { + "grafana": { + "limit": 536870912, + "current": 493162496, + "peak": 536875008, + "anon": 251916288, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4200 + }, + { + "t": 226.7, + "containers": { + "grafana": { + "limit": 536870912, + "current": 487899136, + "peak": 536875008, + "anon": 246517760, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4498 + }, + { + "t": 241.9, + "containers": { + "grafana": { + "limit": 536870912, + "current": 487915520, + "peak": 536875008, + "anon": 246517760, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4798 + }, + { + "t": 257.0, + "containers": { + "grafana": { + "limit": 536870912, + "current": 487895040, + "peak": 536875008, + "anon": 246521856, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5098 + }, + { + "t": 272.1, + "containers": { + "grafana": { + "limit": 536870912, + "current": 486637568, + "peak": 536875008, + "anon": 245506048, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5398 + }, + { + "t": 287.3, + "containers": { + "grafana": { + "limit": 536870912, + "current": 486879232, + "peak": 536875008, + "anon": 245506048, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5698 + }, + { + "t": 302.4, + "containers": { + "grafana": { + "limit": 536870912, + "current": 487157760, + "peak": 536875008, + "anon": 245510144, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5998 + }, + { + "t": 317.5, + "containers": { + "grafana": { + "limit": 536870912, + "current": 486416384, + "peak": 536875008, + "anon": 245518336, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6296 + }, + { + "t": 332.6, + "containers": { + "grafana": { + "limit": 536870912, + "current": 486072320, + "peak": 536875008, + "anon": 245436416, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6596 + }, + { + "t": 347.7, + "containers": { + "grafana": { + "limit": 536870912, + "current": 486338560, + "peak": 536875008, + "anon": 245436416, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6896 + }, + { + "t": 362.9, + "containers": { + "grafana": { + "limit": 536870912, + "current": 486809600, + "peak": 536875008, + "anon": 245436416, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7196 + }, + { + "t": 378.0, + "containers": { + "grafana": { + "limit": 536870912, + "current": 486342656, + "peak": 536875008, + "anon": 245436416, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7496 + }, + { + "t": 393.2, + "containers": { + "grafana": { + "limit": 536870912, + "current": 485949440, + "peak": 536875008, + "anon": 245280768, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7796 + }, + { + "t": 408.3, + "containers": { + "grafana": { + "limit": 536870912, + "current": 486465536, + "peak": 536875008, + "anon": 245280768, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8096 + }, + { + "t": 423.4, + "containers": { + "grafana": { + "limit": 536870912, + "current": 486969344, + "peak": 536875008, + "anon": 245284864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8396 + }, + { + "t": 438.5, + "containers": { + "grafana": { + "limit": 536870912, + "current": 486227968, + "peak": 536875008, + "anon": 245288960, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8696 + }, + { + "t": 453.6, + "containers": { + "grafana": { + "limit": 536870912, + "current": 487391232, + "peak": 536875008, + "anon": 245936128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8996 + }, + { + "t": 468.8, + "containers": { + "grafana": { + "limit": 536870912, + "current": 486875136, + "peak": 536875008, + "anon": 245936128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9296 + }, + { + "t": 483.9, + "containers": { + "grafana": { + "limit": 536870912, + "current": 487129088, + "peak": 536875008, + "anon": 245936128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9596 + }, + { + "t": 499.0, + "containers": { + "grafana": { + "limit": 536870912, + "current": 487383040, + "peak": 536875008, + "anon": 245940224, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9896 + }, + { + "t": 514.1, + "containers": { + "grafana": { + "limit": 536870912, + "current": 487170048, + "peak": 536875008, + "anon": 245940224, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10194 + }, + { + "t": 529.2, + "containers": { + "grafana": { + "limit": 536870912, + "current": 486883328, + "peak": 536875008, + "anon": 245944320, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10494 + }, + { + "t": 544.3, + "containers": { + "grafana": { + "limit": 536870912, + "current": 487145472, + "peak": 536875008, + "anon": 245952512, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10794 + }, + { + "t": 559.5, + "containers": { + "grafana": { + "limit": 536870912, + "current": 487407616, + "peak": 536875008, + "anon": 245952512, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11094 + }, + { + "t": 574.6, + "containers": { + "grafana": { + "limit": 536870912, + "current": 487751680, + "peak": 536875008, + "anon": 246222848, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11392 + }, + { + "t": 589.7, + "containers": { + "grafana": { + "limit": 536870912, + "current": 487243776, + "peak": 536875008, + "anon": 246226944, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11692 + }, + { + "t": 604.8, + "containers": { + "grafana": { + "limit": 536870912, + "current": 488251392, + "peak": 536875008, + "anon": 246226944, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11992 + } +] \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/migration-lines.txt b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/migration-lines.txt new file mode 100644 index 00000000..ff01a35d --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/migration-lines.txt @@ -0,0 +1,6 @@ +grafana | logger=settings t=2026-09-30T14:06:37.650875555+02:00 level=info msg="Unified migration configs enforced" storage_type=unified target=[all] +grafana | logger=featuremgmt t=2026-09-30T14:06:37.652559026+02:00 level=info msg=FeatureToggles alertRuleRestore=true alertingBulkActionsInUI=true alertingImportYAMLUI=true alertingListViewV2=true alertingMigrationUI=true alertingNavigationV2=true alertingNotificationsStepMode=true alertingQueryAndExpressionsStepMode=true alertingRulePermanentlyDelete=true alertingRuleRecoverDeleted=true alertingRuleVersionHistoryRestore=true alertingUIOptimizeReducer=true alertingUIUseBackendFilters=true alertingUIUseFullyCompatBackendFilters=true alertingUseNewSimplifiedRoutingHashAlgorithm=true annotationPermissionUpdate=true auditLoggingAppPlatform=true awsAsyncQueryCaching=true awsDatasourcesTempCredentials=true azureMonitorEnableUserAuth=true azureMonitorPrometheusExemplars=true azureResourcePickerUpdates=true cloudWatchCrossAccountQuerying=true cloudWatchNewLabelParsing=true cloudWatchRoundUpEndTime=true dashboardNewLayouts=true dashboardUnifiedDrilldownControls=true disableScriptedDashboards=true enableSCIM=true feedbackButton=true grafana.dashboardSettingsRedesign=true grafana.newPreferencesPage=true grafana.queryVarEditorRedesign=true grafana.scenesFlickeringFix=true grafana.unifiedDataSourcePicker=true grafana.viewPanelPane=true grafanaAssistantInProfilesDrilldown=true improvedExternalSessionHandling=true improvedExternalSessionHandlingSAML=true lokiLabelNamesQueryApi=true lokiQuerySplitting=true newClickhouseConfigPageDesign=true newSavedQueriesExperience=true onlyStoreActionSets=true preferences.rerouteLegacyAPIs=true profilesExemplars=true prometheusAzureOverrideAudience=true prometheusTypeMigration=true provisioning.gitConventions=true provisioning.readmes=true provisioning.userAttribution=true provisioningFolderMetadata=true pyroscopeUTF8LabelNames=true queryLibrary=true react19=true rememberUserOrgForSso=true renderAuthJWT=true restrictedPluginApis=true savedQueriesRBAC=true sqlExpressions=true useKubernetesShortURLsAPI=true useSessionStorageForRedirection=true +grafana | logger=migrator t=2026-09-30T14:06:37.65434508+02:00 level=info msg="Starting DB migrations" +grafana | logger=migrator t=2026-09-30T14:06:37.673858959+02:00 level=info msg="migrations completed" performed=0 skipped=719 duration=1.130375ms +grafana | logger=accesscontrol.service t=2026-09-30T14:06:37.752110574+02:00 level=info msg="Starting migration to remove deprecated permissions" migration=removeDeprecatedPermissions +grafana | logger=accesscontrol.service t=2026-09-30T14:06:37.752876561+02:00 level=info msg="Completed migration to remove deprecated permissions" migration=removeDeprecatedPermissions totalRemoved=0 duration=765.827µs \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/run.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/run.log new file mode 100644 index 00000000..f43e66d2 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/run.log @@ -0,0 +1,58 @@ +[12:05:12] scratch drive folders cleared before FROM (R-656): none existed +[12:05:12] MV-grafana: deploying grafana at FROM {'grafana': 'grafana/grafana:13.2.2'} +[12:06:08] FROM settled=True in 30.9s :: {"grafana": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[12:06:08] fixture: the BOX walk's own (Grafana), through upgrade_boxport +[12:06:08] grafana: create folder http=200 +[12:06:08] grafana: readback of the seeded folder http=200 ok=True +[12:06:08] C1 (seed reads back BEFORE): True +[12:06:08] MV-grafana: swapping to TO {'grafana': 'grafana/grafana:13.2.3'} +[12:06:37] TO up -d rc=0 +[12:07:08] TO settled=True in 30.8s :: {"grafana": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[12:07:08] migration lines observed: 6 +[12:07:08] grafana: readback of the seeded folder http=200 ok=True +[12:07:08] RESULT (seed reads back AFTER): True +[12:07:08] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.3:3000 +[12:07:24] + 15s grafana=461M/512M peak=512M kills=0 rs=0 reqs=300 +[12:07:39] + 30s grafana=461M/512M peak=512M kills=0 rs=0 reqs=600 +[12:07:54] + 45s grafana=460M/512M peak=512M kills=0 rs=0 reqs=900 +[12:08:09] + 60s grafana=461M/512M peak=512M kills=0 rs=0 reqs=1200 +[12:08:24] + 76s grafana=462M/512M peak=512M kills=0 rs=0 reqs=1500 +[12:08:39] + 91s grafana=471M/512M peak=512M kills=0 rs=0 reqs=1800 +[12:08:54] + 106s grafana=471M/512M peak=512M kills=0 rs=0 reqs=2100 +[12:09:09] + 121s grafana=471M/512M peak=512M kills=0 rs=0 reqs=2400 +[12:09:24] + 136s grafana=470M/512M peak=512M kills=0 rs=0 reqs=2700 +[12:09:40] + 151s grafana=469M/512M peak=512M kills=0 rs=0 reqs=3000 +[12:09:55] + 166s grafana=469M/512M peak=512M kills=0 rs=0 reqs=3300 +[12:10:10] + 181s grafana=469M/512M peak=512M kills=0 rs=0 reqs=3600 +[12:10:25] + 196s grafana=468M/512M peak=512M kills=0 rs=0 reqs=3900 +[12:10:40] + 212s grafana=470M/512M peak=512M kills=0 rs=0 reqs=4200 +[12:10:55] + 227s grafana=465M/512M peak=512M kills=0 rs=0 reqs=4498 +[12:11:10] + 242s grafana=465M/512M peak=512M kills=0 rs=0 reqs=4798 +[12:11:25] + 257s grafana=465M/512M peak=512M kills=0 rs=0 reqs=5098 +[12:11:41] + 272s grafana=464M/512M peak=512M kills=0 rs=0 reqs=5398 +[12:11:56] + 287s grafana=464M/512M peak=512M kills=0 rs=0 reqs=5698 +[12:12:11] + 302s grafana=464M/512M peak=512M kills=0 rs=0 reqs=5998 +[12:12:26] + 318s grafana=463M/512M peak=512M kills=0 rs=0 reqs=6296 +[12:12:41] + 333s grafana=463M/512M peak=512M kills=0 rs=0 reqs=6596 +[12:12:56] + 348s grafana=463M/512M peak=512M kills=0 rs=0 reqs=6896 +[12:13:11] + 363s grafana=464M/512M peak=512M kills=0 rs=0 reqs=7196 +[12:13:26] + 378s grafana=463M/512M peak=512M kills=0 rs=0 reqs=7496 +[12:13:42] + 393s grafana=463M/512M peak=512M kills=0 rs=0 reqs=7796 +[12:13:57] + 408s grafana=463M/512M peak=512M kills=0 rs=0 reqs=8096 +[12:14:12] + 423s grafana=464M/512M peak=512M kills=0 rs=0 reqs=8396 +[12:14:27] + 438s grafana=463M/512M peak=512M kills=0 rs=0 reqs=8696 +[12:14:42] + 454s grafana=464M/512M peak=512M kills=0 rs=0 reqs=8996 +[12:14:57] + 469s grafana=464M/512M peak=512M kills=0 rs=0 reqs=9296 +[12:15:12] + 484s grafana=464M/512M peak=512M kills=0 rs=0 reqs=9596 +[12:15:27] + 499s grafana=464M/512M peak=512M kills=0 rs=0 reqs=9896 +[12:15:43] + 514s grafana=464M/512M peak=512M kills=0 rs=0 reqs=10194 +[12:15:58] + 529s grafana=464M/512M peak=512M kills=0 rs=0 reqs=10494 +[12:16:13] + 544s grafana=464M/512M peak=512M kills=0 rs=0 reqs=10794 +[12:16:28] + 560s grafana=464M/512M peak=512M kills=0 rs=0 reqs=11094 +[12:16:43] + 575s grafana=465M/512M peak=512M kills=0 rs=0 reqs=11392 +[12:16:58] + 590s grafana=464M/512M peak=512M kills=0 rs=0 reqs=11692 +[12:17:13] + 605s grafana=465M/512M peak=512M kills=0 rs=0 reqs=11992 +[12:17:13] memory watch: killed=False tight=[] requests=11992 codes={'302': 11992} +[12:17:13] MV-grafana: ABORT — putting the FROM images back +[12:17:45] grafana: readback of the seeded folder http=200 ok=True +[12:17:45] ABORT: app came back in 30.8s; data present=True \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/to-full.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/to-full.log new file mode 100644 index 00000000..f942fcc7 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/to-full.log @@ -0,0 +1,214 @@ +grafana | logger=settings t=2026-09-30T14:06:37.649790435+02:00 level=info msg="Starting Grafana" version=13.2.3 commit=90ffed056f0884267356c12a0eeb72a022af53f1 branch=release-13.2.3#patched compiled=2026-09-28T22:55:24+02:00 +grafana | logger=settings t=2026-09-30T14:06:37.650875555+02:00 level=info msg="Unified migration configs enforced" storage_type=unified target=[all] +grafana | logger=settings t=2026-09-30T14:06:37.650919829+02:00 level=info msg="Enforcing mode 5 for resource in unified storage" resource=folders.folder.grafana.app +grafana | logger=settings t=2026-09-30T14:06:37.650924698+02:00 level=info msg="Enforcing mode 5 for resource in unified storage" resource=dashboards.dashboard.grafana.app +grafana | logger=settings t=2026-09-30T14:06:37.650928896+02:00 level=info msg="Enforcing mode 5 for resource in unified storage" resource=shorturls.shorturl.grafana.app +grafana | logger=settings t=2026-09-30T14:06:37.650933084+02:00 level=info msg="Enforcing mode 5 for resource in unified storage" resource=playlists.playlist.grafana.app +grafana | logger=settings t=2026-09-30T14:06:37.651137831+02:00 level=info msg="Config loaded from" file=/usr/share/grafana/conf/defaults.ini +grafana | logger=settings t=2026-09-30T14:06:37.651152158+02:00 level=info msg="Config loaded from" file=/etc/grafana/grafana.ini +grafana | logger=settings t=2026-09-30T14:06:37.651156776+02:00 level=info msg="Config overridden from command line" arg="default.paths.data=/var/lib/grafana" +grafana | logger=settings t=2026-09-30T14:06:37.651160183+02:00 level=info msg="Config overridden from command line" arg="default.paths.logs=/var/log/grafana" +grafana | logger=settings t=2026-09-30T14:06:37.651163509+02:00 level=info msg="Config overridden from command line" arg="default.paths.plugins=/var/lib/grafana/plugins" +grafana | logger=settings t=2026-09-30T14:06:37.651166715+02:00 level=info msg="Config overridden from command line" arg="default.paths.provisioning=/etc/grafana/provisioning" +grafana | logger=settings t=2026-09-30T14:06:37.651170172+02:00 level=info msg="Config overridden from command line" arg="default.log.mode=console" +grafana | logger=settings t=2026-09-30T14:06:37.65117464+02:00 level=info msg="Config overridden from Environment variable" var="GF_PATHS_DATA=/var/lib/grafana" +grafana | logger=settings t=2026-09-30T14:06:37.651186453+02:00 level=info msg="Config overridden from Environment variable" var="GF_PATHS_LOGS=/var/log/grafana" +grafana | logger=settings t=2026-09-30T14:06:37.65119051+02:00 level=info msg="Config overridden from Environment variable" var="GF_PATHS_PLUGINS=/var/lib/grafana/plugins" +grafana | logger=settings t=2026-09-30T14:06:37.651195029+02:00 level=info msg="Config overridden from Environment variable" var="GF_PATHS_PROVISIONING=/etc/grafana/provisioning" +grafana | logger=settings t=2026-09-30T14:06:37.651199006+02:00 level=info msg="Config overridden from Environment variable" var="GF_SERVER_ROOT_URL=https://grafana.gate.invalid" +grafana | logger=settings t=2026-09-30T14:06:37.651202954+02:00 level=info msg="Config overridden from Environment variable" var="GF_SECURITY_ADMIN_PASSWORD=*********" +grafana | logger=settings t=2026-09-30T14:06:37.651206921+02:00 level=info msg="Config overridden from Environment variable" var="GF_PATHS_HOME=/usr/share/grafana" +grafana | logger=settings t=2026-09-30T14:06:37.651211239+02:00 level=info msg="Config overridden from Environment variable" var="GF_PATHS_CONFIG=/etc/grafana/grafana.ini" +grafana | logger=settings t=2026-09-30T14:06:37.651218693+02:00 level=info msg=Target target=[all] +grafana | logger=settings t=2026-09-30T14:06:37.651226278+02:00 level=info msg="Path Home" path=/usr/share/grafana +grafana | logger=settings t=2026-09-30T14:06:37.651230476+02:00 level=info msg="Path Data" path=/var/lib/grafana +grafana | logger=settings t=2026-09-30T14:06:37.651234834+02:00 level=info msg="Path Logs" path=/var/log/grafana +grafana | logger=settings t=2026-09-30T14:06:37.651238972+02:00 level=info msg="Path Plugins" path="[/var/lib/grafana/plugins /usr/share/grafana/data/plugins-bundled]" +grafana | logger=settings t=2026-09-30T14:06:37.651259641+02:00 level=info msg="Path Provisioning" path=/etc/grafana/provisioning +grafana | logger=settings t=2026-09-30T14:06:37.651264119+02:00 level=info msg="App mode production" +grafana | logger=featuremgmt t=2026-09-30T14:06:37.652559026+02:00 level=info msg=FeatureToggles alertRuleRestore=true alertingBulkActionsInUI=true alertingImportYAMLUI=true alertingListViewV2=true alertingMigrationUI=true alertingNavigationV2=true alertingNotificationsStepMode=true alertingQueryAndExpressionsStepMode=true alertingRulePermanentlyDelete=true alertingRuleRecoverDeleted=true alertingRuleVersionHistoryRestore=true alertingUIOptimizeReducer=true alertingUIUseBackendFilters=true alertingUIUseFullyCompatBackendFilters=true alertingUseNewSimplifiedRoutingHashAlgorithm=true annotationPermissionUpdate=true auditLoggingAppPlatform=true awsAsyncQueryCaching=true awsDatasourcesTempCredentials=true azureMonitorEnableUserAuth=true azureMonitorPrometheusExemplars=true azureResourcePickerUpdates=true cloudWatchCrossAccountQuerying=true cloudWatchNewLabelParsing=true cloudWatchRoundUpEndTime=true dashboardNewLayouts=true dashboardUnifiedDrilldownControls=true disableScriptedDashboards=true enableSCIM=true feedbackButton=true grafana.dashboardSettingsRedesign=true grafana.newPreferencesPage=true grafana.queryVarEditorRedesign=true grafana.scenesFlickeringFix=true grafana.unifiedDataSourcePicker=true grafana.viewPanelPane=true grafanaAssistantInProfilesDrilldown=true improvedExternalSessionHandling=true improvedExternalSessionHandlingSAML=true lokiLabelNamesQueryApi=true lokiQuerySplitting=true newClickhouseConfigPageDesign=true newSavedQueriesExperience=true onlyStoreActionSets=true preferences.rerouteLegacyAPIs=true profilesExemplars=true prometheusAzureOverrideAudience=true prometheusTypeMigration=true provisioning.gitConventions=true provisioning.readmes=true provisioning.userAttribution=true provisioningFolderMetadata=true pyroscopeUTF8LabelNames=true queryLibrary=true react19=true rememberUserOrgForSso=true renderAuthJWT=true restrictedPluginApis=true savedQueriesRBAC=true sqlExpressions=true useKubernetesShortURLsAPI=true useSessionStorageForRedirection=true +grafana | logger=sqlstore t=2026-09-30T14:06:37.652657953+02:00 level=info msg="Connecting to DB" dbtype=sqlite3 +grafana | logger=sqlstore t=2026-09-30T14:06:37.652663323+02:00 level=info msg="Using SQLite driver" driver=modernc.org/sqlite +grafana | logger=migrator t=2026-09-30T14:06:37.65434508+02:00 level=info msg="Starting DB migrations" +grafana | logger=migrator t=2026-09-30T14:06:37.673858959+02:00 level=info msg="migrations completed" performed=0 skipped=719 duration=1.130375ms +grafana | logger=secrets t=2026-09-30T14:06:37.67455818+02:00 level=info msg="Envelope encryption state" currentprovider=secretKey.v1 +grafana | logger=plugin.angulardetectorsprovider.dynamic t=2026-09-30T14:06:37.751424748+02:00 level=info msg="Restored cache from database" duration=440.342µs +grafana | logger=resource-db t=2026-09-30T14:06:37.751972012+02:00 level=info msg="Using database section" db_type=sqlite3 +grafana | logger=accesscontrol.service t=2026-09-30T14:06:37.752110574+02:00 level=info msg="Starting migration to remove deprecated permissions" migration=removeDeprecatedPermissions +grafana | logger=accesscontrol.service t=2026-09-30T14:06:37.752876561+02:00 level=info msg="Completed migration to remove deprecated permissions" migration=removeDeprecatedPermissions totalRemoved=0 duration=765.827µs +grafana | logger=plugin.store t=2026-09-30T14:06:37.818578485+02:00 level=info msg="Loading plugins..." +grafana | logger=plugins.registration t=2026-09-30T14:06:37.986212565+02:00 level=info msg="Plugin registered" pluginId=elasticsearch +grafana | logger=plugins.registration t=2026-09-30T14:06:38.013172933+02:00 level=info msg="Plugin registered" pluginId=grafana-advisor-app +grafana | logger=plugins.registration t=2026-09-30T14:06:38.071247947+02:00 level=info msg="Plugin registered" pluginId=grafana-exploretraces-app +grafana | logger=plugins.registration t=2026-09-30T14:06:38.145815021+02:00 level=info msg="Plugin registered" pluginId=grafana-lokiexplore-app +grafana | logger=plugins.registration t=2026-09-30T14:06:38.181961384+02:00 level=info msg="Plugin registered" pluginId=grafana-metricsdrilldown-app +grafana | logger=plugins.registration t=2026-09-30T14:06:38.266105272+02:00 level=info msg="Plugin registered" pluginId=grafana-postgresql-datasource +grafana | logger=plugins.registration t=2026-09-30T14:06:38.31263876+02:00 level=info msg="Plugin registered" pluginId=grafana-pyroscope-app +grafana | logger=plugins.registration t=2026-09-30T14:06:38.406356316+02:00 level=info msg="Plugin registered" pluginId=grafana-pyroscope-datasource +grafana | logger=plugins.registration t=2026-09-30T14:06:38.52064095+02:00 level=info msg="Plugin registered" pluginId=influxdb +grafana | logger=plugins.registration t=2026-09-30T14:06:38.581335443+02:00 level=info msg="Plugin registered" pluginId=jaeger +grafana | logger=plugins.registration t=2026-09-30T14:06:38.698838558+02:00 level=info msg="Plugin registered" pluginId=loki +grafana | logger=plugins.registration t=2026-09-30T14:06:38.794795695+02:00 level=info msg="Plugin registered" pluginId=mssql +grafana | logger=plugins.registration t=2026-09-30T14:06:38.940660756+02:00 level=info msg="Plugin registered" pluginId=mysql +grafana | logger=plugins.registration t=2026-09-30T14:06:39.007723641+02:00 level=info msg="Plugin registered" pluginId=opentsdb +grafana | logger=plugins.registration t=2026-09-30T14:06:39.139872748+02:00 level=info msg="Plugin registered" pluginId=prometheus +grafana | logger=plugins.registration t=2026-09-30T14:06:39.223073093+02:00 level=info msg="Plugin registered" pluginId=stackdriver +grafana | logger=plugins.registration t=2026-09-30T14:06:39.361887462+02:00 level=info msg="Plugin registered" pluginId=tempo +grafana | logger=plugins.registration t=2026-09-30T14:06:39.417019626+02:00 level=info msg="Plugin registered" pluginId=zipkin +grafana | logger=plugins.dedupe t=2026-09-30T14:06:39.417834356+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=elasticsearch +grafana | logger=plugins.dedupe t=2026-09-30T14:06:39.418798267+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=grafana-postgresql-datasource +grafana | logger=plugins.dedupe t=2026-09-30T14:06:39.41955674+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=grafana-pyroscope-datasource +grafana | logger=plugins.dedupe t=2026-09-30T14:06:39.420379765+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=influxdb +grafana | logger=plugins.dedupe t=2026-09-30T14:06:39.421012691+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=jaeger +grafana | logger=plugins.dedupe t=2026-09-30T14:06:39.421716641+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=loki +grafana | logger=plugins.dedupe t=2026-09-30T14:06:39.424638181+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=mssql +grafana | logger=plugins.dedupe t=2026-09-30T14:06:39.425305481+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=mysql +grafana | logger=plugins.dedupe t=2026-09-30T14:06:39.425750312+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=opentsdb +grafana | logger=plugins.dedupe t=2026-09-30T14:06:39.430155104+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=prometheus +grafana | logger=plugins.dedupe t=2026-09-30T14:06:39.43116934+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=stackdriver +grafana | logger=plugins.dedupe t=2026-09-30T14:06:39.438664281+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=tempo +grafana | logger=plugins.dedupe t=2026-09-30T14:06:39.439376236+02:00 level=warn msg="Skipping loading of plugin as it's a duplicate" pluginId=zipkin +grafana | logger=plugin.store t=2026-09-30T14:06:39.439402315+02:00 level=info msg="Plugins loaded" count=56 duration=1.620824772s +grafana | logger=secret-migrator t=2026-09-30T14:06:39.440034841+02:00 level=info msg="Starting DB migrations" +grafana | logger=secret-migrator t=2026-09-30T14:06:39.441271968+02:00 level=info msg="migrations completed" performed=0 skipped=35 duration=86.694µs +grafana | logger=resource-db t=2026-09-30T14:06:39.443388377+02:00 level=info msg="Initializing Resource DB" db_type=sqlite3 open_conn=0 in_use_conn=0 idle_conn=0 max_open_conn=0 +grafana | logger=resource-migrator t=2026-09-30T14:06:39.44358101+02:00 level=info msg="Starting DB migrations" +grafana | logger=resource-migrator t=2026-09-30T14:06:39.448987235+02:00 level=info msg="migrations completed" performed=0 skipped=55 duration=180.582µs +grafana | t=2026-09-30T14:06:39.44954573+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:39.449524269+02:00 msg="Using channel notifier" logger=sql-resource-server +grafana | logger=bleve-backend namespace=default group=advisor.grafana.app resource=checktypes reason=init t=2026-09-30T14:06:39.451353105+02:00 level=info msg="Building index using memory" +grafana | logger=bleve-backend namespace=default group=advisor.grafana.app resource=checktypes reason=init t=2026-09-30T14:06:39.457044007+02:00 level=info msg="Finished building index" elapsed=5.61539ms listRV=1790769970674997 +grafana | logger=bleve-backend namespace=default group=advisor.grafana.app resource=checktypes reason=init t=2026-09-30T14:06:39.457205763+02:00 level=info msg="Storing index in cache" key="{Namespace:default Group:advisor.grafana.app Resource:checktypes}" expiration=2026-09-30T14:16:39.45719897+02:00 +grafana | logger=resource-search t=2026-09-30T14:06:39.457577725+02:00 level=info msg="search index initialized" duration_secs=0 total_docs=5 +grafana | logger=storage.unified.migrations t=2026-09-30T14:06:39.462098867+02:00 level=info msg="Running migrations for unified storage" +grafana | logger=storage.unified.migrations t=2026-09-30T14:06:39.46218483+02:00 level=info msg="Migration is disabled in config, skipping" migration=snapshots +grafana | logger=storage.unified.migrations t=2026-09-30T14:06:39.462193576+02:00 level=info msg="Migration is disabled in config, skipping" migration=datasource +grafana | logger=storage.unified.migrations t=2026-09-30T14:06:39.462197904+02:00 level=info msg="Migration is disabled in config, skipping" migration=stars +grafana | logger=storage.unified.migrations t=2026-09-30T14:06:39.462201922+02:00 level=info msg="Migration is disabled in config, skipping" migration=preferences +grafana | logger=storage.unified.migrations t=2026-09-30T14:06:39.46220633+02:00 level=info msg="Migration is disabled in config, skipping" migration=querycacheconfigs +grafana | logger=unifiedstorage-migrator t=2026-09-30T14:06:39.462219886+02:00 level=info msg="Starting DB migrations" +grafana | logger=unifiedstorage-migrator t=2026-09-30T14:06:39.462637254+02:00 level=info msg="migrations completed" performed=0 skipped=4 duration=23.665µs +grafana | logger=storage.unified.migrations t=2026-09-30T14:06:39.462898127+02:00 level=info msg="Unified storage migrations completed successfully" +grafana | logger=live.push_http t=2026-09-30T14:06:39.470278381+02:00 level=info msg="Live Push Gateway initialization" +grafana | logger=ngalert.notifier t=2026-09-30T14:06:39.472598324+02:00 level=info component=alertmanager orgID=1 msg="template definitions loaded" mimir=0 grafana=0 total=0 maxTemplateOutput=10485760 +grafana | logger=ngalert.notifier component=alertmanager orgID=1 t=2026-09-30T14:06:39.473922907+02:00 level=info msg="Applying new configuration to Alertmanager" configHash="{12383335334731491449 16454292769479786371 11535544170606148457 1343157387507078592 10278876130067529486 4613426124549341787 5144611013662998819}" +grafana | logger=ngalert.notifier t=2026-09-30T14:06:39.473953825+02:00 level=info component=alertmanager orgID=1 msg="template definitions loaded" mimir=0 grafana=0 total=0 maxTemplateOutput=10485760 +grafana | logger=ngalert.writer t=2026-09-30T14:06:39.485210654+02:00 level=info msg="Setting up remote write using data sources" timeout=30s default_datasource_uid= +grafana | logger=ngalert.state.manager.persist t=2026-09-30T14:06:39.485306935+02:00 level=info msg="Using sync rule state persister" +grafana | logger=query_data t=2026-09-30T14:06:39.486618253+02:00 level=info msg="Query Service initialization" +grafana | logger=annotation.app t=2026-09-30T14:06:39.517588066+02:00 level=info msg="Annotation cleanup disabled (no retention TTL configured)" +grafana | logger=infra.usagestats.collector t=2026-09-30T14:06:39.520158042+02:00 level=info msg="registering usage stat providers" usageStatsProvidersLen=2 +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:39.602718588+02:00 level=info msg=starting module=*sqlstore.SQLStore +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:39.602811493+02:00 level=info msg=starting module=tracing +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:39.602849645+02:00 level=info msg=starting module=grafana-apiserver +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.902281678+02:00 level=info msg="Adding GroupVersion dashboard.grafana.app v2 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.903594489+02:00 level=info msg="Adding GroupVersion dashboard.grafana.app v2beta1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.904043918+02:00 level=info msg="Adding GroupVersion dashboard.grafana.app v2alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.904761333+02:00 level=info msg="Adding GroupVersion dashboard.grafana.app v0alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.905254475+02:00 level=info msg="Adding GroupVersion dashboard.grafana.app v1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.905704165+02:00 level=info msg="Adding GroupVersion dashboard.grafana.app v1beta1 to ResourceManager" +grafana | t=2026-09-30T14:06:39.905860049+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:39.90585002+02:00 msg="Zanzana is not enabled; skipping folder propagation hooks" +grafana | t=2026-09-30T14:06:39.905887892+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:39.905884966+02:00 msg="Zanzana is not enabled; skipping folder propagation hooks" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.907006485+02:00 level=info msg="Adding GroupVersion folder.grafana.app v1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.907553008+02:00 level=info msg="Adding GroupVersion folder.grafana.app v1beta1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.908574608+02:00 level=info msg="Adding GroupVersion preferences.grafana.app v1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.908912356+02:00 level=info msg="Adding GroupVersion preferences.grafana.app v1alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.910023656+02:00 level=info msg="Adding GroupVersion collections.grafana.app v1alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.915210095+02:00 level=info msg="Adding GroupVersion provisioning.grafana.app v0alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.917719656+02:00 level=info msg="Adding GroupVersion provisioning.grafana.app v1beta1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.918559693+02:00 level=info msg="Adding GroupVersion userstorage.grafana.app v0alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.918839221+02:00 level=info msg="Adding GroupVersion features.grafana.app v0alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.919924372+02:00 level=info msg="Adding GroupVersion playlist.grafana.app v1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.92045818+02:00 level=info msg="Adding GroupVersion playlist.grafana.app v0alpha1 to ResourceManager" +grafana | t=2026-09-30T14:06:39.920584298+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:39.920572276+02:00 msg="Installed APIs for app" app=playlist +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.922191525+02:00 level=info msg="Adding GroupVersion plugins.grafana.app v0alpha1 to ResourceManager" +grafana | t=2026-09-30T14:06:39.922290011+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:39.922277367+02:00 msg="Installed APIs for app" app=plugins +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.923773274+02:00 level=info msg="Adding GroupVersion example.grafana.app v1alpha1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.924400479+02:00 level=info msg="Adding GroupVersion example.grafana.app v0alpha1 to ResourceManager" +grafana | t=2026-09-30T14:06:39.924545773+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:39.924532268+02:00 msg="Installed APIs for app" app=example +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.92461303+02:00 level=info msg="Skipping API quotas.grafana.app/v0alpha1 because it has no resources." +grafana | t=2026-09-30T14:06:39.924722427+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:39.924716726+02:00 msg="Installed APIs for app" app=quotas +grafana | logger=storage.unified.migrations t=2026-09-30T14:06:39.925108957+02:00 level=info msg="Resolved storage mode from migration log" resource=shorturls.shorturl.grafana.app mode=unified +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.92615335+02:00 level=info msg="Adding GroupVersion shorturl.grafana.app v1beta1 to ResourceManager" +grafana | t=2026-09-30T14:06:39.926247097+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:39.926236628+02:00 msg="Installed APIs for app" app=shorturl +grafana | t=2026-09-30T14:06:39.926416758+02:00 level=warn caller=logger.go:224 time=2026-09-30T14:06:39.926411207+02:00 msg="skipped registering status sub-resource that does not support dual writing" resource=alertrules.rules.alerting.grafana.app version=v0alpha1 storagePath=alertrules/status +grafana | t=2026-09-30T14:06:39.926433039+02:00 level=warn caller=logger.go:224 time=2026-09-30T14:06:39.926429201+02:00 msg="skipped registering status sub-resource that does not support dual writing" resource=recordingrules.rules.alerting.grafana.app version=v0alpha1 storagePath=recordingrules/status +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.928608068+02:00 level=info msg="Adding GroupVersion rules.alerting.grafana.app v0alpha1 to ResourceManager" +grafana | t=2026-09-30T14:06:39.928734527+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:39.928722054+02:00 msg="Installed APIs for app" app=alerting +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.931713075+02:00 level=info msg="Adding GroupVersion notifications.alerting.grafana.app v1beta1 to ResourceManager" +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.933628343+02:00 level=info msg="Adding GroupVersion notifications.alerting.grafana.app v0alpha1 to ResourceManager" +grafana | t=2026-09-30T14:06:39.933798295+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:39.933786572+02:00 msg="Installed APIs for app" app=alerting-notifications +grafana | logger=grafana-apiserver t=2026-09-30T14:06:39.935188511+02:00 level=info msg="Adding GroupVersion advisor.grafana.app v0alpha1 to ResourceManager" +grafana | t=2026-09-30T14:06:39.935341921+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:39.935326111+02:00 msg="Installed APIs for app" app=advisor +grafana | t=2026-09-30T14:06:40.666011915+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.665983622+02:00 msg="App initialized" app=playlist +grafana | t=2026-09-30T14:06:40.666225328+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.666206613+02:00 msg="App initialized" app=quotas +grafana | t=2026-09-30T14:06:40.666240798+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.666233123+02:00 msg="App initialized" app=plugins +grafana | t=2026-09-30T14:06:40.666276124+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.666258762+02:00 msg="App initialized" app=shorturl +grafana | t=2026-09-30T14:06:40.666295832+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.666283438+02:00 msg="App initialized" app=example +grafana | t=2026-09-30T14:06:40.666290962+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.666279561+02:00 msg="App initialized" app=advisor +grafana | t=2026-09-30T14:06:40.666308225+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.666301142+02:00 msg="App initialized" app=alerting-notifications +grafana | t=2026-09-30T14:06:40.668250104+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.668228162+02:00 msg="start concurrent job driver" logger=concurrent-job-driver num_drivers=3 job_timeout=20m0s lease_renewal_interval=20s +grafana | t=2026-09-30T14:06:40.668331448+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.668317581+02:00 msg="starting job cleanup controller" logger=job-cleanup-controller cleanup_interval=3m0s expiry=1m0s +grafana | t=2026-09-30T14:06:40.677003432+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.676985348+02:00 msg="App initialized" app=alerting +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.677036364+02:00 level=info msg=starting module=plugins.store +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.677085207+02:00 level=info msg=starting module=plugin.backgroundinstaller +grafana | logger=plugin.backgroundinstaller t=2026-09-30T14:06:40.677096257+02:00 level=info msg="Plugins installed" plugins=[] +grafana | logger=plugin.backgroundinstaller t=2026-09-30T14:06:40.677123288+02:00 level=info msg="Installing plugins" plugins="[{ID:grafana-metricsdrilldown-app Version: URL:} {ID:opentsdb Version: URL:} {ID:loki Version: URL:} {ID:prometheus Version: URL:} {ID:stackdriver Version: URL:} {ID:influxdb Version: URL:} {ID:grafana-pyroscope-datasource Version: URL:} {ID:grafana-pyroscope-app Version: URL:} {ID:tempo Version: URL:} {ID:grafana-postgresql-datasource Version: URL:} {ID:zipkin Version: URL:} {ID:grafana-advisor-app Version: URL:} {ID:jaeger Version: URL:} {ID:grafana-exploretraces-app Version: URL:} {ID:grafana-lokiexplore-app Version: URL:} {ID:mysql Version: URL:} {ID:elasticsearch Version: URL:} {ID:mssql Version: URL:}]" +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.677316093+02:00 level=info msg=starting module=provisioning +grafana | logger=provisioning.alerting t=2026-09-30T14:06:40.678586032+02:00 level=info msg="starting to provision alerting" +grafana | logger=provisioning.alerting t=2026-09-30T14:06:40.678613775+02:00 level=info msg="finished to provision alerting" +grafana | logger=bleve-backend namespace=default group=dashboard.grafana.app resource=dashboards reason=search t=2026-09-30T14:06:40.720719056+02:00 level=info msg="Building index using memory" +grafana | logger=bleve-backend namespace=default group=dashboard.grafana.app resource=dashboards reason=search t=2026-09-30T14:06:40.721728153+02:00 level=info msg="Finished building index" elapsed=849.014µs listRV=1790769947884011 +grafana | logger=bleve-backend namespace=default group=dashboard.grafana.app resource=dashboards reason=search t=2026-09-30T14:06:40.721765684+02:00 level=info msg="Storing index in cache" key="{Namespace:default Group:dashboard.grafana.app Resource:dashboards}" expiration=2026-09-30T14:16:40.72176386+02:00 +grafana | logger=provisioning.dashboard t=2026-09-30T14:06:40.731749928+02:00 level=info msg="starting to provision dashboards" +grafana | logger=provisioning.dashboard t=2026-09-30T14:06:40.731776618+02:00 level=info msg="finished to provision dashboards" +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740286276+02:00 level=info msg=starting module=*angulardetectorsprovider.Dynamic +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740310191+02:00 level=info msg=starting module=*metric.Service +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740379562+02:00 level=info msg=starting module=*loginattemptimpl.Service +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740415951+02:00 level=info msg=starting module=*store.standardStorageService +grafana | logger=grafanaStorageLogger t=2026-09-30T14:06:40.740431019+02:00 level=info msg="Storage starting" +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740458321+02:00 level=info msg=starting module=*remotecache.RemoteCache +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740527011+02:00 level=info msg=starting module=*authz.EmbeddedZanzanaService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.74055834+02:00 level=info msg=starting module=*metrics.InternalMetricsService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740582015+02:00 level=info msg=starting module=*ngalert.AlertNG +grafana | logger=ngalert t=2026-09-30T14:06:40.740639002+02:00 level=info msg="Primary node, alert rule evaluation enabled" +grafana | logger=ngalert.state.manager t=2026-09-30T14:06:40.740658679+02:00 level=info msg="Warming state cache for startup" +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740698885+02:00 level=info msg=starting module=*service.DashboardServiceImpl +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740742257+02:00 level=info msg=starting module=*garbagecollectionworker.Worker +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.74076466+02:00 level=info msg=starting module=*pluginexternal.Service +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.74079109+02:00 level=info msg=starting module=*api.HTTPServer +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740793865+02:00 level=info msg=starting module=*service.UsageStats +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740800477+02:00 level=info msg=starting module=*rendering.RenderingService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740834792+02:00 level=info msg=starting module=*migrations.SecretMigrationProviderImpl +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740925443+02:00 level=info msg=starting module=*updatemanager.GrafanaService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740933488+02:00 level=info msg=starting module=*appregistry.Service +grafana | logger=app-registry t=2026-09-30T14:06:40.740960429+02:00 level=info msg="app registry initialized" +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740973244+02:00 level=info msg=starting module=*pushhttp.Gateway +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740989494+02:00 level=info msg=starting module=*ssosettingsimpl.Service +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.741025041+02:00 level=info msg=starting module=*updatemanager.PluginsService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.741250127+02:00 level=info msg=starting module=*dynamic.KeyRetriever +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.741301314+02:00 level=info msg=starting module=*service.DashboardUpdater +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.741420399+02:00 level=info msg=starting module=*dualwrite.ZanzanaReconciler +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.741454633+02:00 level=info msg=starting module=*notifications.NotificationService +grafana | logger=ngalert.multiorg.alertmanager t=2026-09-30T14:06:40.741554873+02:00 level=info msg="Starting MultiOrg Alertmanager" +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.741655122+02:00 level=info msg=starting module=*authimpl.UserAuthTokenService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.74177074+02:00 level=info msg=starting module=*cleanup.CleanUpService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.740295583+02:00 level=info msg=starting module=*live.GrafanaLive +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.741919361+02:00 level=info msg=starting module=*manager.SecretsService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.741968975+02:00 level=info msg=starting module=*manager.ServiceAccountsService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.742371205+02:00 level=info msg=starting module=*statscollector.Service +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.742418885+02:00 level=info msg=starting module=*supportbundlesimpl.Service +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.742605237+02:00 level=info msg=starting module=*anonimpl.AnonDeviceService +grafana | logger=backgroundsvcs.managerAdapter t=2026-09-30T14:06:40.742795837+02:00 level=info msg="All modules healthy" +grafana | logger=http.server t=2026-09-30T14:06:40.744802829+02:00 level=info msg="HTTP Server Listen" address=[::]:3000 protocol=http subUrl= socket= +grafana | t=2026-09-30T14:06:40.768485524+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.768452251+02:00 msg="Starting ConnectionController" logger=provisioning-connection-controller +grafana | t=2026-09-30T14:06:40.76854185+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.768534517+02:00 msg="Starting workers" logger=provisioning-connection-controller count=1 +grafana | t=2026-09-30T14:06:40.768560205+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.768555787+02:00 msg="Started workers" logger=provisioning-connection-controller +grafana | logger=ngalert.state.manager t=2026-09-30T14:06:40.817848288+02:00 level=info msg="State cache has been initialized" rules=0 states=0 duration=77.187986ms +grafana | logger=ngalert.scheduler t=2026-09-30T14:06:40.817943879+02:00 level=info msg="Starting scheduler" tickInterval=10s maxAttempts=3 +grafana | logger=ngalert.scheduler t=2026-09-30T14:06:40.818041824+02:00 level=info msg=starting component=ticker first_tick=2026-09-30T14:06:50+02:00 +grafana | logger=plugins.update.checker t=2026-09-30T14:06:40.852177528+02:00 level=info msg="Update check succeeded" duration=111.137719ms +grafana | logger=plugins.update.checker t=2026-09-30T14:06:40.852220209+02:00 level=info msg="flag evaluation succeeded" flag="{Value:false EvaluationDetails:{FlagKey:pluginsAutoUpdate FlagType:bool ResolutionDetail:{Variant:default Reason:STATIC ErrorCode: ErrorMessage: FlagMetadata:map[]}}}" details="{Value:false EvaluationDetails:{FlagKey:pluginsAutoUpdate FlagType:bool ResolutionDetail:{Variant:default Reason:STATIC ErrorCode: ErrorMessage: FlagMetadata:map[]}}}" +grafana | logger=grafana.update.checker t=2026-09-30T14:06:40.860360959+02:00 level=info msg="Update check succeeded" duration=119.412493ms +grafana | t=2026-09-30T14:06:40.867661232+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.867632488+02:00 msg="Starting RepositoryController" logger=provisioning-repository-controller +grafana | t=2026-09-30T14:06:40.867698813+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.867690978+02:00 msg="Starting workers" logger=provisioning-repository-controller count=1 +grafana | t=2026-09-30T14:06:40.867719923+02:00 level=info caller=logger.go:214 time=2026-09-30T14:06:40.867715665+02:00 msg="Started workers" logger=provisioning-repository-controller diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/to-states.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/to-states.json new file mode 100644 index 00000000..2521a220 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/to-states.json @@ -0,0 +1,8 @@ +{ + "grafana": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/verdict.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/verdict.json new file mode 100644 index 00000000..d598082b --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/grafana/bench/evidence/MV-grafana/verdict.json @@ -0,0 +1,51 @@ +{ + "harness_version": 4, + "edge": "MV-grafana", + "app": "grafana", + "note": "night 2026-09-23 within-a-major move: grafana=grafana/grafana:13.2.3", + "from": { + "grafana": "grafana/grafana:13.2.2" + }, + "to": { + "grafana": "grafana/grafana:13.2.3" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Kgrafana | logger=settings t=2026-09-30T14:06:37.650875555+02:00 level=info msg=\"Unified migration configs enforced\" storage_type=unified target=[all]", + "abort": "starts-and-serves", + "abort_detail": null, + "engine_state_after": null, + "memory": { + "soak_s": 605.1, + "requested_s": 600, + "requests": 11992, + "codes": { + "302": 11992 + }, + "first_kill": null, + "containers": { + "grafana": { + "limit": 536870912, + "peak": 536875008, + "peak_pct": 1.0, + "anon_peak_sampled": 252989440, + "anon_peak_pct": 0.471, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 30.8, + "measured_at": "2026-09-30T12:17:45Z", + "evidence": "evidence/MV-grafana", + "scratch_cleared": [], + "files_changed": [], + "total_s": 753.4 +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/immich-retry/bench/MV-immich.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich-retry/bench/MV-immich.log new file mode 100644 index 00000000..19e570f1 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich-retry/bench/MV-immich.log @@ -0,0 +1,40 @@ +[12:30:47] scratch drive folders cleared before FROM (R-656): ['/srv/felhom-gate/hdd/appdata/immich', '/srv/felhom-gate/hdd/userdata/media/photos'] +[12:30:47] MV-immich: deploying immich at FROM {'immich-server': 'ghcr.io/immich-app/immich-server:v3.2.2', 'immich-machine-learning': 'ghcr.io/immich-app/immich-machine-learning:v3.2.2', 'immich-postgres': 'ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0', 'immich-redis': 'redis:7-alpine'} +[12:38:03] FROM settled=False in 424.0s :: {"immich-machine-learning": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "immich-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "immich-redis": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "immich-server": {"status": "running", "health": "starting", "restarts": 0, "exit": 0}} +[12:38:03] FROM never became healthy — inconclusive, not a verdict about the upgrade +{ + "harness_version": 4, + "edge": "MV-immich", + "app": "immich", + "note": "night 2026-09-23 within-a-major move: immich-server=ghcr.io/immich-app/immich-server:v3.2.4, immich-machine-learning=ghcr.io/immich-app/immich-machine-learning:v3.2.4", + "from": { + "immich-server": "ghcr.io/immich-app/immich-server:v3.2.2", + "immich-machine-learning": "ghcr.io/immich-app/immich-machine-learning:v3.2.2", + "immich-postgres": "ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0", + "immich-redis": "redis:7-alpine" + }, + "to": { + "immich-server": "ghcr.io/immich-app/immich-server:v3.2.4", + "immich-machine-learning": "ghcr.io/immich-app/immich-machine-learning:v3.2.4", + "immich-postgres": "ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0", + "immich-redis": "redis:7-alpine" + }, + "verdict": "inconclusive", + "seed_read_before": false, + "seed_read_after": false, + "healthy_after": false, + "migration_observed": null, + "abort": "not-attempted", + "abort_detail": "FROM never settled: {\"immich-machine-learning\": {\"status\": \"running\", \"health\": \"healthy\", \"restarts\": 0, \"exit\": 0}, \"immich-postgres\": {\"status\": \"running\", \"health\": \"healthy\", \"restarts\": 0, \"exit\": 0}, \"immich-redis\": {\"status\": \"running\", \"health\": \"healthy\", \"restarts\": 0, \"exit\": 0}, \"immich-server\": {\"status\": \"running\", \"health\": \"starting\", \"restarts\": 0, \"exit\": 0}}", + "engine_state_after": null, + "memory": null, + "marks": [], + "duration_s": 435.5, + "measured_at": "2026-09-30T12:38:03Z", + "evidence": "evidence/MV-immich", + "scratch_cleared": [ + "/srv/felhom-gate/hdd/appdata/immich", + "/srv/felhom-gate/hdd/userdata/media/photos" + ], + "total_s": 435.5 +} diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/immich-retry/bench/evidence/MV-immich/compose-final.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich-retry/bench/evidence/MV-immich/compose-final.log new file mode 100644 index 00000000..2dd434c4 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich-retry/bench/evidence/MV-immich/compose-final.log @@ -0,0 +1,2836 @@ +apped {/api/system-config, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config/defaults, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config, PUT} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config/storage-template-options, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RoutesResolver] SystemMetadataController {/api/system-metadata}: +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/admin-onboarding, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/admin-onboarding, POST} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/reverse-geocoding-state, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/version-check-state, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RoutesResolver] TagController {/api/tags}: +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, POST} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, PUT} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/assets, PUT} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, PUT} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, PATCH} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, DELETE} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id/assets, PUT} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id/assets, DELETE} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RoutesResolver] TimelineController {/api/timeline}: +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/timeline/buckets, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/timeline/bucket, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RoutesResolver] TrashController {/api/trash}: +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/empty, POST} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/restore, POST} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/restore/assets, POST} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RoutesResolver] UserAdminController {/api/admin/users}: +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users, POST} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, PUT} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, PATCH} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, DELETE} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/calendar-heatmap, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/sessions, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/statistics, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, PUT} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, PATCH} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/restore, POST} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RoutesResolver] UserController {/api/users}: +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/calendar-heatmap, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, PUT} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, PATCH} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, PUT} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, PATCH} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, PUT} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, DELETE} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, PUT} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, DELETE} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/:id, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/profile-image, POST} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/profile-image, DELETE} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/users/:id/profile-image, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RoutesResolver] VideoStreamController {/api/assets}: +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/main.m3u8, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId/:variantIndex/playlist.m3u8, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId/:variantIndex/:filename, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId, DELETE} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RoutesResolver] ViewController {/api/view}: +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/view/folder/unique-paths, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/view/folder, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RoutesResolver] WorkflowController {/api/workflows}: +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows, POST} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/triggers, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id/share, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, PUT} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, PATCH} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, DELETE} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id/logs, GET} route +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:NestApplication] Nest application successfully started +immich-server | [Nest] 30 - 09/30/2026, 2:37:27 PM  LOG [Api:Bootstrap] Immich Server is listening on http://[::1]:2283 [v3.2.2] [production]  +immich-server | [Nest] 30 - 09/30/2026, 2:37:28 PM  LOG [Api:MachineLearningRepository] Machine learning server became healthy (http://immich-machine-learning:3003). +immich-server | [Nest] 8 - 09/30/2026, 2:37:29 PM  LOG [Microservices:MapRepository] 10000 geodata records imported +immich-server | [Nest] 8 - 09/30/2026, 2:37:30 PM  LOG [Microservices:MapRepository] 20000 geodata records imported +immich-server | [Nest] 8 - 09/30/2026, 2:37:30 PM  LOG [Microservices:MapRepository] 30000 geodata records imported +immich-server | [Nest] 8 - 09/30/2026, 2:37:30 PM  LOG [Microservices:MapRepository] 40000 geodata records imported +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 378.21497699999964, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 3025720, +immich-server | 'Chavignon', +immich-server | 'Chavignon', +immich-server | 49.47929, +immich-server | 3.52214, +immich-server | 'FR', +immich-server | '32', +immich-server | '02', +immich-server | '2016-02-18', +immich-server | 'Hauts-de-France', +immich-server | 'Aisne', +immich-server | 3025724, +immich-server | 'Chaveyriat', +immich-server | 'Chaveyriat', +immich-server | 46.19783, +immich-server | 5.06057, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 3025732, +immich-server | 'Chavenay', +immich-server | 'Chavenay,Shavene,Shavne,Шавене,Шавне', +immich-server | 48.85437, +immich-server | 1.99163, +immich-server | 'FR', +immich-server | '11', +immich-server | '78', +immich-server | '2016-02-18', +immich-server | 'Île-de-France', +immich-server | 'Yvelines', +immich-server | 3025734, +immich-server | 'Chavelot', +immich-server | 'Chavelot', +immich-server | 48.23459, +immich-server | 6.43809, +immich-server | 'FR', +immich-server | '44', +immich-server | '88', +immich-server | '2016-02-21', +immich-server | 'Grand Est', +immich-server | 'Vosges', +immich-server | 3025736, +immich-server | 'Chaveignes', +immich-server | 'Chaveignes', +immich-server | 47.0384, +immich-server | 0.34973, +immich-server | 'FR', +immich-server | '24', +immich-server | '37', +immich-server | '2016-02-18', +immich-server | 'Centre-Val de Loire', +immich-server | 'Indre-et-Loire', +immich-server | 3025741, +immich-server | 'Chavanoz', +immich-server | 'Chavanoz,Shavano,Shavanoz,sha wa nuo,Шавано,Шаваноз,沙瓦诺', +immich-server | 45.76846, +immich-server | 5.18808, +immich-server | 'FR', +immich-server | '84', +immich-server | '38', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Isère', +immich-server | 3025745, +immich-server | 'Chavanod', +immich-server | 'Cavannodum,Chavanod,Chavanôd,Shavano,Шавано', +immich-server | 45.89005, +immich-server | 6.03928, +immich-server | 'FR', +immich-server | '84', +immich-server | '74', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Haute-Savoie', +immich-server | 3025746, +immich-server | 'Chavannes-sur-Suran', +immich-server | 'Chavannes,Chavannes-sur-Suran,Chavannes-sur-Surand', +immich-server | 46.26351, +immich-server | 5.42798, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 3025747, +immich-server | 'Chavannes-sur-Reyssouze', +immich-server | 'Chavannes,Chavannes-sur-Reyssouze', +immich-server | 46.43112, +immich-server | 4.99661, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 3025758, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 24.3305390000005, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'SELECT pg_advisory_unlock($1)', +immich-server | params: [ 100 ] +immich-server | } +immich-server | [Nest] 8 - 09/30/2026, 2:37:31 PM  ERROR [Microservices:MetadataService] Unable to initialize reverse geocoding: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) +immich-server | Error: Metadata service init failed +immich-server | at MetadataService.init (/usr/src/app/server/dist/services/metadata.service.js:124:19) +immich-server | at process.processTicksAndRejections (node:internal/process/task_queues:104:5) +immich-server | at async MetadataService.onBootstrap (/usr/src/app/server/dist/services/metadata.service.js:103:9) +immich-server | at async EventRepository.onEvent (/usr/src/app/server/dist/repositories/event.repository.js:91:13) +immich-server | at async MicroservicesModule.onModuleInit (/usr/src/app/server/dist/app.module.js:100:9) +immich-server | at async callModuleInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/hooks/on-module-init.hook.js:51:9) +immich-server | at async NestApplication.callInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application-context.js:245:13) +immich-server | at async NestApplication.init (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:105:9) +immich-server | at async NestApplication.listen (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:177:13) +immich-server | at async bootstrap (/usr/src/app/server/dist/workers/microservices.js:27:5) { +immich-server | [cause]: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | } +immich-server | } +immich-server | microservices worker error: Error: Metadata service init failed, stack: Error: Metadata service init failed +immich-server | at MetadataService.init (/usr/src/app/server/dist/services/metadata.service.js:124:19) +immich-server | at process.processTicksAndRejections (node:internal/process/task_queues:104:5) +immich-server | at async MetadataService.onBootstrap (/usr/src/app/server/dist/services/metadata.service.js:103:9) +immich-server | at async EventRepository.onEvent (/usr/src/app/server/dist/repositories/event.repository.js:91:13) +immich-server | at async MicroservicesModule.onModuleInit (/usr/src/app/server/dist/app.module.js:100:9) +immich-server | at async callModuleInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/hooks/on-module-init.hook.js:51:9) +immich-server | at async NestApplication.callInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application-context.js:245:13) +immich-server | at async NestApplication.init (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:105:9) +immich-server | at async NestApplication.listen (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:177:13) +immich-server | at async bootstrap (/usr/src/app/server/dist/workers/microservices.js:27:5) +immich-server | microservices worker exited with code 1 +immich-server | Killing api process +immich-server | Initializing Immich v3.2.2 +immich-server | Detected CPU Cores: 8 +immich-server | (node:7) ExperimentalWarning: WASI is an experimental feature and might change at any time +immich-server | (Use `node --trace-warnings ...` to show where the warning was created) +immich-server | Starting api worker +immich-server | Starting microservices worker +immich-server | (node:7) ExperimentalWarning: WASI is an experimental feature and might change at any time +immich-server | (Use `node --trace-warnings ...` to show where the warning was created) +immich-server | (node:29) ExperimentalWarning: WASI is an experimental feature and might change at any time +immich-server | (Use `node --trace-warnings ...` to show where the warning was created) +immich-server | [Nest] 7 - 09/30/2026, 2:37:39 PM  LOG [Microservices:WebsocketRepository] Initialized websocket server +immich-server | [Nest] 7 - 09/30/2026, 2:37:39 PM  LOG [Microservices:DatabaseRepository] targetLists=1, current=1 for clip_index of 0 rows +immich-server | [Nest] 7 - 09/30/2026, 2:37:39 PM  LOG [Microservices:DatabaseRepository] targetLists=1, current=1 for face_index of 0 rows +immich-server | [Nest] 7 - 09/30/2026, 2:37:39 PM  LOG [Microservices:DatabaseRepository] Running migrations +immich-server | [Nest] 7 - 09/30/2026, 2:37:40 PM  LOG [Microservices:DatabaseRepository] Finished running migrations +immich-server | [Nest] 7 - 09/30/2026, 2:37:40 PM  LOG [Microservices:DatabaseService] Checking for schema drift +immich-server | [Nest] 7 - 09/30/2026, 2:37:40 PM  WARN [Microservices:DatabaseService] Detected schema drift. For more information, see https://docs.immich.app/errors#schema-drift or run `immich-admin schema-check` +immich-server | [Nest] 7 - 09/30/2026, 2:37:40 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_name" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 2:37:40 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin2_name" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 2:37:40 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin1_name" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 2:37:40 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_alternate_names" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 2:37:40 PM  WARN [Microservices:DatabaseService]  - The constraint "geodata_places"."geodata_places_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 2:37:40 PM  WARN [Microservices:DatabaseService]  - The constraint "naturalearth_countries"."naturalearth_countries_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 2:37:40 PM  LOG [Microservices:StorageService] Verifying system mount folder checks, current state: {"mountChecks":{"thumbs":true,"upload":true,"backups":true,"library":true,"profile":true,"encoded-video":true}} +immich-server | [Nest] 7 - 09/30/2026, 2:37:40 PM  LOG [Microservices:StorageService] Successfully verified system mount folder checks +immich-server | [Nest] 7 - 09/30/2026, 2:37:40 PM  LOG [Microservices:MetadataService] Bootstrapping metadata service +immich-server | [Nest] 7 - 09/30/2026, 2:37:40 PM  LOG [Microservices:MetadataService] Initializing metadata service +immich-server | [Nest] 7 - 09/30/2026, 2:37:40 PM  LOG [Microservices:MapRepository] Initializing metadata repository +immich-server | [Nest] 29 - 09/30/2026, 2:37:40 PM  LOG [Api:WebsocketRepository] Initialized websocket server +immich-server | [Nest] 29 - 09/30/2026, 2:37:40 PM  LOG [Api:DatabaseRepository] targetLists=1, current=1 for clip_index of 0 rows +immich-server | [Nest] 29 - 09/30/2026, 2:37:40 PM  LOG [Api:DatabaseRepository] targetLists=1, current=1 for face_index of 0 rows +immich-server | [Nest] 29 - 09/30/2026, 2:37:40 PM  LOG [Api:DatabaseRepository] Running migrations +immich-server | [Nest] 7 - 09/30/2026, 2:37:40 PM  LOG [Microservices:MapRepository] Starting geodata import +immich-server | [Nest] 29 - 09/30/2026, 2:37:40 PM  LOG [Api:DatabaseRepository] Finished running migrations +immich-server | [Nest] 29 - 09/30/2026, 2:37:40 PM  LOG [Api:DatabaseService] Checking for schema drift +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  WARN [Api:DatabaseService] Detected schema drift. For more information, see https://docs.immich.app/errors#schema-drift or run `immich-admin schema-check` +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_name" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin2_name" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin1_name" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_alternate_names" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  WARN [Api:DatabaseService]  - The constraint "geodata_places"."geodata_places_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  WARN [Api:DatabaseService]  - The constraint "naturalearth_countries"."naturalearth_countries_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:StorageService] Verifying system mount folder checks, current state: {"mountChecks":{"thumbs":true,"upload":true,"backups":true,"library":true,"profile":true,"encoded-video":true}} +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:StorageService] Successfully verified system mount folder checks +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:ServerService] Feature Flags: { +immich-server | "smartSearch": true, +immich-server | "facialRecognition": true, +immich-server | "duplicateDetection": true, +immich-server | "map": true, +immich-server | "reverseGeocoding": true, +immich-server | "importFaces": false, +immich-server | "sidecar": true, +immich-server | "search": true, +immich-server | "trash": true, +immich-server | "oauth": false, +immich-server | "oauthAutoLaunch": false, +immich-server | "ocr": true, +immich-server | "passwordLogin": true, +immich-server | "configFile": false, +immich-server | "email": false, +immich-server | "realtimeTranscoding": false +immich-server | } +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:SystemConfigService] LogLevel=log (set via system config) +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:MachineLearningRepository] Machine learning server became healthy (http://immich-machine-learning:3003). +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:NestFactory] Starting Nest application... +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:InstanceLoader] BullModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:InstanceLoader] ClsModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:InstanceLoader] ClsCommonModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:InstanceLoader] OpenTelemetryModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:InstanceLoader] KyselyModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:InstanceLoader] OpenTelemetryCoreModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:InstanceLoader] DiscoveryModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:InstanceLoader] ClsRootModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:InstanceLoader] ClsPluginsModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:InstanceLoader] ScheduleModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:InstanceLoader] BullModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:InstanceLoader] BullModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:InstanceLoader] ApiModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  WARN [Api:LegacyRouteConverter] Unsupported route path: "/api/*". In previous versions, the symbols ?, *, and + were used to denote optional or repeating path parameters. The latest version of "path-to-regexp" now requires the use of named parameters. For example, instead of using a route like /users/* to capture all routes starting with "/users", you should use /users/*path. For more details, refer to the migration guide. Attempting to auto-convert to "/api/{*path}"... +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] ApiKeyController {/api/api-keys}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id/rotate, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] ActivityController {/api/activities}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/activities, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/activities, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/activities/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/activities/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] AlbumController {/api/albums}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/albums, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/albums, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/map-markers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/users, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/user/:userId, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/user/:userId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] AppController {/api}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/.well-known/immich, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/custom.css, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] AssetController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/jobs, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/copy, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/metadata, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/metadata, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/ocr, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata/:key, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata/:key, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/edits, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/edits, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/edits, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] AssetFilesController {/api/asset-files}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files/:id/download, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] AssetMediaController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/original, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/thumbnail, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/playback, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/bulk-upload-check, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] AuthController {/api/auth}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/admin-sign-up, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/validateToken, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/change-password, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/logout, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/status, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/session/unlock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/session/lock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] AuthAdminController {/api/admin/auth}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/auth/unlink-all, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] ClusterGroupController {/api/cluster-groups}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests/:id/accept, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/requests, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/requests, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/regenerate-people, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/leave, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] ConfigUserController {/api/config}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] ConfigAdminController {/api/admin/config}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] ConfigPublicController {/api/public/config}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/public/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/public/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] DatabaseBackupController {/api/admin/database-backups}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/:filename, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/start-restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/upload, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] DownloadController {/api/download}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/download/info, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/download/archive, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] DuplicateController {/api/duplicates}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates/resolve, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] FaceController {/api/faces}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/faces, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/faces, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/faces/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/faces/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] IntegrityAdminController {/api/admin/integrity}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/summary, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:id/file, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:type/csv, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] JobController {/api/jobs}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs/:name, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] LibraryController {/api/libraries}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/validate, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/scan, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] MaintenanceController {/api/admin/maintenance}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/status, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/detect-install, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] MapController {/api/map}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/map/markers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/map/reverse-geocode, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] MemoryController {/api/memories}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/memories, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/memories, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] NotificationController {/api/notifications}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] NotificationAdminController {/api/admin/notifications}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications/test-email, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications/templates/:name, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] OAuthController {/api/oauth}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/mobile-redirect, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/authorize, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/callback, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/link, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/unlink, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/backchannel-logout, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] PartnerController {/api/partners}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/partners, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/partners, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] PersonController {/api/people}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/people, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/people, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/people, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/people, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/thumbnail, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/reassign, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/people/merge, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/merge, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] PluginController {/api/plugins}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/methods, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/templates, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] QueueController {/api/queues}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/queues, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name/jobs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name/jobs, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] SearchController {/api/search}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/search/metadata, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/search/statistics, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/search/random, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/search/large-assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/search/smart, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/search/explore, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/search/person, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/search/places, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/search/cities, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/search/suggestions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] ServerController {/api/server}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/server/about, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/server/apk-links, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/server/storage, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/server/ping, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version-history, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/server/features, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/server/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/server/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/server/media-types, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version-check, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] SessionController {/api/sessions}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id/lock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] SharedLinkController {/api/shared-links}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] StackController {/api/stacks}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id/assets/:assetId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] SyncController {/api/sync}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/stream, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] SystemConfigController {/api/system-config}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config/storage-template-options, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] SystemMetadataController {/api/system-metadata}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/admin-onboarding, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/admin-onboarding, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/reverse-geocoding-state, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/version-check-state, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] TagController {/api/tags}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] TimelineController {/api/timeline}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/timeline/buckets, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/timeline/bucket, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] TrashController {/api/trash}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/empty, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/restore/assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] UserAdminController {/api/admin/users}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/calendar-heatmap, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/sessions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] UserController {/api/users}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/calendar-heatmap, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/profile-image, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/profile-image, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/users/:id/profile-image, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] VideoStreamController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/main.m3u8, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId/:variantIndex/playlist.m3u8, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId/:variantIndex/:filename, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] ViewController {/api/view}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/view/folder/unique-paths, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/view/folder, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RoutesResolver] WorkflowController {/api/workflows}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/triggers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id/share, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id/logs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:NestApplication] Nest application successfully started +immich-server | [Nest] 29 - 09/30/2026, 2:37:41 PM  LOG [Api:Bootstrap] Immich Server is listening on http://[::1]:2283 [v3.2.2] [production]  +immich-server | [Nest] 7 - 09/30/2026, 2:37:43 PM  LOG [Microservices:MapRepository] 10000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:43 PM  LOG [Microservices:MapRepository] 20000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:43 PM  LOG [Microservices:MapRepository] 30000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:43 PM  LOG [Microservices:MapRepository] 40000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:44 PM  LOG [Microservices:MapRepository] 50000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:44 PM  LOG [Microservices:MapRepository] 60000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:44 PM  LOG [Microservices:MapRepository] 70000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:44 PM  LOG [Microservices:MapRepository] 80000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:44 PM  LOG [Microservices:MapRepository] 90000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:45 PM  LOG [Microservices:MapRepository] 100000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:45 PM  LOG [Microservices:MapRepository] 110000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:46 PM  LOG [Microservices:MapRepository] 120000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:46 PM  LOG [Microservices:MapRepository] 130000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:47 PM  LOG [Microservices:MapRepository] 140000 geodata records imported +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 527.673721000001, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 1681313, +immich-server | 'Sabang', +immich-server | 'Sabang,Trinidad', +immich-server | 12.0746, +immich-server | 124.5414, +immich-server | 'PH', +immich-server | '08', +immich-server | '55', +immich-server | '2017-12-13', +immich-server | 'Eastern Visayas', +immich-server | 'Province of Samar', +immich-server | 1681316, +immich-server | 'Trinidad', +immich-server | '', +immich-server | 10.07955, +immich-server | 124.34324, +immich-server | 'PH', +immich-server | '07', +immich-server | '11', +immich-server | '2017-12-13', +immich-server | 'Central Visayas', +immich-server | 'Bohol', +immich-server | 1681333, +immich-server | 'Trento', +immich-server | 'Trento', +immich-server | 8.04583, +immich-server | 126.06361, +immich-server | 'PH', +immich-server | '13', +immich-server | '03', +immich-server | '2017-12-13', +immich-server | 'Caraga', +immich-server | 'Province of Agusan del Sur', +immich-server | 1681346, +immich-server | 'Trapiche', +immich-server | 'Trapiche,Trapichi', +immich-server | 10.68417, +immich-server | 122.43222, +immich-server | 'PH', +immich-server | '06', +immich-server | '30', +immich-server | '2017-12-13', +immich-server | 'Western Visayas', +immich-server | 'Province of Iloilo', +immich-server | 1681357, +immich-server | 'Tranca', +immich-server | 'Tranca', +immich-server | 14.11815, +immich-server | 121.05741, +immich-server | 'PH', +immich-server | '40', +immich-server | '09', +immich-server | '2017-12-13', +immich-server | 'Calabarzon', +immich-server | 'Province of Batangas', +immich-server | 1681359, +immich-server | 'Tran', +immich-server | 'Tran', +immich-server | 6.72028, +immich-server | 124.055, +immich-server | 'PH', +immich-server | '12', +immich-server | '71', +immich-server | '2017-12-13', +immich-server | 'Soccsksargen', +immich-server | 'Province of Sultan Kudarat', +immich-server | 1681377, +immich-server | 'Totolan', +immich-server | 'Totolan,Tutolan', +immich-server | 9.63286, +immich-server | 123.84702, +immich-server | 'PH', +immich-server | '07', +immich-server | '11', +immich-server | '2017-12-13', +immich-server | 'Central Visayas', +immich-server | 'Bohol', +immich-server | 1681388, +immich-server | 'Tortosa', +immich-server | 'Tortosa,Tortoso', +immich-server | 10.93294, +immich-server | 123.09, +immich-server | 'PH', +immich-server | '06', +immich-server | 'H3', +immich-server | '2017-12-13', +immich-server | 'Western Visayas', +immich-server | 'Province of Negros Occidental', +immich-server | 1681392, +immich-server | 'Torrijos', +immich-server | 'Torrijos', +immich-server | 13.31676, +immich-server | 122.08205, +immich-server | 'PH', +immich-server | '41', +immich-server | '38', +immich-server | '2017-12-13', +immich-server | 'Mimaropa', +immich-server | 'Province of Marinduque', +immich-server | 1681404, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 423.32585500000096, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 2736792, +immich-server | 'Pampilhosa', +immich-server | 'Pampilhosa,Pampilhosa do Bobao,Pampilhosa do Bobão,Pampilhosa do Botao,Pampilhosa do Botão', +immich-server | 40.3358, +immich-server | -8.42738, +immich-server | 'PT', +immich-server | '02', +immich-server | '0111', +immich-server | '2021-12-15', +immich-server | 'Aveiro', +immich-server | 'Mealhada', +immich-server | 2736793, +immich-server | 'Pampilhosa da Serra', +immich-server | 'Pampilhosa,Pampilhosa da Serra,Pampiliosa nta Sera,Παμπιλιόσα ντα Σέρα', +immich-server | 40.0462, +immich-server | -7.95182, +immich-server | 'PT', +immich-server | '07', +immich-server | '0612', +immich-server | '2014-04-06', +immich-server | 'Coimbra', +immich-server | 'Pampilhosa da Serra', +immich-server | 2736799, +immich-server | 'Palmeira', +immich-server | 'Palmeira', +immich-server | 41.5909, +immich-server | -8.42754, +immich-server | 'PT', +immich-server | '04', +immich-server | '0303', +immich-server | '2024-03-29', +immich-server | 'Braga', +immich-server | 'Braga', +immich-server | 2736827, +immich-server | 'Palhaça', +immich-server | 'Palhaca,Palhaça,Palhoca,Palhoça', +immich-server | 40.52633, +immich-server | -8.59985, +immich-server | 'PT', +immich-server | '02', +immich-server | '0114', +immich-server | '2024-04-18', +immich-server | 'Aveiro', +immich-server | 'Oliveira do Bairro', +immich-server | 2736883, +immich-server | 'Paços de Ferreira', +immich-server | 'Pacos de Ferreira,Pasos nte Phereira,Paços de Ferreira,Πάσος ντε Φερέϊρα', +immich-server | 41.27657, +immich-server | -8.37617, +immich-server | 'PT', +immich-server | '17', +immich-server | '1309', +immich-server | '2026-03-01', +immich-server | 'Porto', +immich-server | 'Paços de Ferreira', +immich-server | 2736884, +immich-server | 'Paços de Brandão', +immich-server | 'Pacos de Brandao,Paços de Brandão', +immich-server | 40.97541, +immich-server | -8.5835, +immich-server | 'PT', +immich-server | '02', +immich-server | '0109', +immich-server | '2012-01-17', +immich-server | 'Aveiro', +immich-server | 'Santa Maria da Feira', +immich-server | 2736891, +immich-server | 'Paços', +immich-server | '', +immich-server | 41.16207, +immich-server | -8.67053, +immich-server | 'PT', +immich-server | '17', +immich-server | '1312', +immich-server | '2024-06-26', +immich-server | 'Porto', +immich-server | 'Porto', +immich-server | 2736930, +immich-server | 'Ovar', +immich-server | 'Ovar,Овар', +immich-server | 40.85862, +immich-server | -8.62513, +immich-server | 'PT', +immich-server | '02', +immich-server | '0115', +immich-server | '2026-02-28', +immich-server | 'Aveiro', +immich-server | 'Ovar', +immich-server | 2737033, +immich-server | 'Oliveirinha', +immich-server | 'Oliveirinha', +immich-server | 40.60715, +immich-server | -8.59198, +immich-server | 'PT', +immich-server | '02', +immich-server | '0105', +immich-server | '2018-12-04', +immich-server | 'Aveiro', +immich-server | 'Aveiro', +immich-server | 2737037, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 816.5423740000006, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 3514065, +immich-server | 'Zapotitlán', +immich-server | 'Zapotitlan,Zapotitlan de Mendez,Zapotitlán,Zapotitlán de Méndez,Zopotitlan de Mendez', +immich-server | 20.00209, +immich-server | -97.71385, +immich-server | 'MX', +immich-server | '21', +immich-server | '210', +immich-server | '2020-06-10', +immich-server | 'Puebla', +immich-server | 'Zapotitlán de Méndez', +immich-server | 3514069, +immich-server | 'Zapotitlán', +immich-server | 'Zapotitlan,Zapotitlán', +immich-server | 19.82885, +immich-server | -97.15139, +immich-server | 'MX', +immich-server | '30', +immich-server | '023', +immich-server | '2025-11-15', +immich-server | 'Veracruz', +immich-server | 'Atzalan', +immich-server | 3514074, +immich-server | 'Zapotitla', +immich-server | 'Zapotilla,Zapotitla', +immich-server | 19.23369, +immich-server | -96.94477, +immich-server | 'MX', +immich-server | '30', +immich-server | '188', +immich-server | '2018-11-14', +immich-server | 'Veracruz', +immich-server | 'Totutla', +immich-server | 3514083, +immich-server | 'San Jorge el Zapote', +immich-server | 'San Jorge el Zapote,Zapote', +immich-server | 17.91298, +immich-server | -97.99729, +immich-server | 'MX', +immich-server | '20', +immich-server | '261', +immich-server | '2014-10-01', +immich-server | 'Oaxaca', +immich-server | 'San Miguel Amatitlán', +immich-server | 3514103, +immich-server | 'El Zapotal', +immich-server | 'El Zapotal,Zapotal', +immich-server | 16.74991, +immich-server | -91.44192, +immich-server | 'MX', +immich-server | '05', +immich-server | '059', +immich-server | '2018-11-03', +immich-server | 'Chiapas', +immich-server | 'Ocosingo', +immich-server | 3514109, +immich-server | 'Zapoapan de Cabañas', +immich-server | 'Zapoapan,Zapoapan de Cabanas,Zapoapan de Cabañas', +immich-server | 18.33327, +immich-server | -95.09713, +immich-server | 'MX', +immich-server | '30', +immich-server | '032', +immich-server | '2025-11-15', +immich-server | 'Veracruz', +immich-server | 'Catemaco', +immich-server | 3514110, +immich-server | 'Zapoapan de Amapan', +immich-server | 'Amapan,Zapoapan,Zapoapan de Amapan', +immich-server | 18.23753, +immich-server | -95.18376, +immich-server | 'MX', +immich-server | '30', +immich-server | '073', +immich-server | '2025-11-15', +immich-server | 'Veracruz', +immich-server | 'Hueyapan de Ocampo', +immich-server | 3514113, +immich-server | 'Zapaltecatl', +immich-server | 'Zapaltecatl', +immich-server | 18.57616, +immich-server | -96.92241, +immich-server | 'MX', +immich-server | '30', +immich-server | '201', +immich-server | '2018-11-03', +immich-server | 'Veracruz', +immich-server | 'Zongolica', +immich-server | 3514116, +immich-server | 'Zanjas de Arena', +immich-server | 'Zanja de Arena,Zanjas de Arena', +immich-server | 20.20576, +immich-server | -97.01728, +immich-server | 'MX', +immich-server | '30', +immich-server | '211', +immich-server | '2025-11-15', +immich-server | 'Veracruz', +immich-server | 'San Rafael', +immich-server | 3514133, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 654.7077790000003, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 8861795, +immich-server | 'Lejem', +immich-server | 'Lejem', +immich-server | 21.60944, +immich-server | -98.86639, +immich-server | 'MX', +immich-server | '24', +immich-server | '026', +immich-server | '2014-04-11', +immich-server | 'San Luis Potosí', +immich-server | 'San Antonio', +immich-server | 8861796, +immich-server | 'Estación Acatita', +immich-server | 'Estacion Acatita,Estación Acatita', +immich-server | 25.30639, +immich-server | -108.03444, +immich-server | 'MX', +immich-server | '25', +immich-server | '002', +immich-server | '2014-04-11', +immich-server | 'Sinaloa', +immich-server | 'Angostura', +immich-server | 8861797, +immich-server | 'Río Seco 3ra. Sección (La Playita)', +immich-server | 'Rio Seco 3ra. Seccion (La Playita),Río Seco 3ra. Sección (La Playita)', +immich-server | 18.16389, +immich-server | -93.25889, +immich-server | 'MX', +immich-server | '27', +immich-server | '006', +immich-server | '2014-04-11', +immich-server | 'Tabasco', +immich-server | 'Cunduacán', +immich-server | 8861798, +immich-server | 'Salvador Esquer Apodaca [Unidad Habitacional]', +immich-server | 'Salvador Esquer Apodaca [Unidad Habitacional]', +immich-server | 18.95722, +immich-server | -96.72028, +immich-server | 'MX', +immich-server | '30', +immich-server | '125', +immich-server | '2014-04-11', +immich-server | 'Veracruz', +immich-server | 'Paso del Macho', +immich-server | 8861799, +immich-server | 'San Cristobalito', +immich-server | 'San Cristobalito', +immich-server | 16.9125, +immich-server | -92.81972, +immich-server | 'MX', +immich-server | '05', +immich-server | '049', +immich-server | '2014-04-11', +immich-server | 'Chiapas', +immich-server | 'Larráinzar', +immich-server | 8861800, +immich-server | 'Tinajas 3ra. Sección', +immich-server | 'Tinajas 3ra. Seccion,Tinajas 3ra. Sección', +immich-server | 14.76778, +immich-server | -92.3575, +immich-server | 'MX', +immich-server | '05', +immich-server | '089', +immich-server | '2014-04-11', +immich-server | 'Chiapas', +immich-server | 'Tapachula', +immich-server | 8861801, +immich-server | 'Chinintié', +immich-server | 'Chinintie,Chinintié', +immich-server | 17.24694, +immich-server | -92.49528, +immich-server | 'MX', +immich-server | '05', +immich-server | '096', +immich-server | '2014-04-11', +immich-server | 'Chiapas', +immich-server | 'Tila', +immich-server | 8861802, +immich-server | 'Río Grande el Grijalva', +immich-server | 'Rio Grande el Grijalva,Río Grande el Grijalva', +immich-server | 15.85, +immich-server | -92.01056, +immich-server | 'MX', +immich-server | '05', +immich-server | '099', +immich-server | '2014-04-11', +immich-server | 'Chiapas', +immich-server | 'La Trinitaria', +immich-server | 8861803, +immich-server | 'Villas de Guadalupe', +immich-server | 'Villas de Guadalupe', +immich-server | 20.94944, +immich-server | -101.40417, +immich-server | 'MX', +immich-server | '11', +immich-server | '037', +immich-server | '2014-04-11', +immich-server | 'Guanajuato', +immich-server | 'Silao de la Victoria', +immich-server | 8861804, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 493.893039999999, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 754912, +immich-server | 'Wólka Niedźwiedzka', +immich-server | 'Wolka Niedzwiecka,Wolka Niedzwiedzka,Wólka Niedzwiecka,Wólka Niedźwiedzka', +immich-server | 50.24226, +immich-server | 22.18826, +immich-server | 'PL', +immich-server | '80', +immich-server | '1816', +immich-server | '2010-10-11', +immich-server | 'Subcarpathia', +immich-server | 'Powiat rzeszowski', +immich-server | 754929, +immich-server | 'Wólka Łętowska', +immich-server | '', +immich-server | 50.32333, +immich-server | 22.20715, +immich-server | 'PL', +immich-server | '80', +immich-server | '1808', +immich-server | '2010-10-17', +immich-server | 'Subcarpathia', +immich-server | 'Powiat leżajski', +immich-server | 755032, +immich-server | 'Wólka', +immich-server | '', +immich-server | 51.26476, +immich-server | 22.63844, +immich-server | 'PL', +immich-server | '75', +immich-server | '0609', +immich-server | '2010-10-11', +immich-server | 'Lublin', +immich-server | 'Powiat lubelski', +immich-server | 755090, +immich-server | 'Wola Żarczycka', +immich-server | '', +immich-server | 50.2912, +immich-server | 22.25023, +immich-server | 'PL', +immich-server | '80', +immich-server | '1808', +immich-server | '2010-10-17', +immich-server | 'Subcarpathia', +immich-server | 'Powiat leżajski', +immich-server | 755093, +immich-server | 'Wola Załężna', +immich-server | '', +immich-server | 51.39278, +immich-server | 20.31784, +immich-server | 'PL', +immich-server | '74', +immich-server | '1007', +immich-server | '2010-10-19', +immich-server | 'Łódź Voivodeship', +immich-server | 'Powiat opoczyński', +immich-server | 755098, +immich-server | 'Wola Zabierzowska', +immich-server | '', +immich-server | 50.07257, +immich-server | 20.33217, +immich-server | 'PL', +immich-server | '77', +immich-server | '1219', +immich-server | '2010-10-29', +immich-server | 'Lesser Poland', +immich-server | 'Powiat wielicki', +immich-server | 755118, +immich-server | 'Wola Uhruska', +immich-server | '', +immich-server | 51.32139, +immich-server | 23.62627, +immich-server | 'PL', +immich-server | '75', +immich-server | '0619', +immich-server | '2010-11-04', +immich-server | 'Lublin', +immich-server | 'Powiat włodawski', +immich-server | 755143, +immich-server | 'Wola Sernicka', +immich-server | 'Wola Sernicka,Wola Syrnicka', +immich-server | 51.44978, +immich-server | 22.68351, +immich-server | 'PL', +immich-server | '75', +immich-server | '0608', +immich-server | '2010-10-16', +immich-server | 'Lublin', +immich-server | 'Powiat lubartowski', +immich-server | 755155, +immich-server | 'Wola Rębkowska', +immich-server | 'Rembkowska Wola,Wola Rebkowska,Wola Rębkowska', +immich-server | 51.90181, +immich-server | 21.55818, +immich-server | 'PL', +immich-server | '78', +immich-server | '1403', +immich-server | '2010-09-07', +immich-server | 'Mazovia', +immich-server | 'Powiat garwoliński', +immich-server | 755200, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 17.209795000000668, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'SELECT pg_advisory_unlock($1)', +immich-server | params: [ 100 ] +immich-server | } +immich-server | [Nest] 7 - 09/30/2026, 2:37:47 PM  ERROR [Microservices:MetadataService] Unable to initialize reverse geocoding: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) +immich-server | Error: Metadata service init failed +immich-server | at MetadataService.init (/usr/src/app/server/dist/services/metadata.service.js:124:19) +immich-server | at process.processTicksAndRejections (node:internal/process/task_queues:104:5) +immich-server | at async MetadataService.onBootstrap (/usr/src/app/server/dist/services/metadata.service.js:103:9) +immich-server | at async EventRepository.onEvent (/usr/src/app/server/dist/repositories/event.repository.js:91:13) +immich-server | at async MicroservicesModule.onModuleInit (/usr/src/app/server/dist/app.module.js:100:9) +immich-server | at async callModuleInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/hooks/on-module-init.hook.js:51:9) +immich-server | at async NestApplication.callInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application-context.js:245:13) +immich-server | at async NestApplication.init (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:105:9) +immich-server | at async NestApplication.listen (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:177:13) +immich-server | at async bootstrap (/usr/src/app/server/dist/workers/microservices.js:27:5) { +immich-server | [cause]: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | } +immich-server | } +immich-server | microservices worker error: Error: Metadata service init failed, stack: Error: Metadata service init failed +immich-server | at MetadataService.init (/usr/src/app/server/dist/services/metadata.service.js:124:19) +immich-server | at process.processTicksAndRejections (node:internal/process/task_queues:104:5) +immich-server | at async MetadataService.onBootstrap (/usr/src/app/server/dist/services/metadata.service.js:103:9) +immich-server | at async EventRepository.onEvent (/usr/src/app/server/dist/repositories/event.repository.js:91:13) +immich-server | at async MicroservicesModule.onModuleInit (/usr/src/app/server/dist/app.module.js:100:9) +immich-server | at async callModuleInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/hooks/on-module-init.hook.js:51:9) +immich-server | at async NestApplication.callInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application-context.js:245:13) +immich-server | at async NestApplication.init (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:105:9) +immich-server | at async NestApplication.listen (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:177:13) +immich-server | at async bootstrap (/usr/src/app/server/dist/workers/microservices.js:27:5) +immich-server | microservices worker exited with code 1 +immich-server | Killing api process +immich-server | Initializing Immich v3.2.2 +immich-server | Detected CPU Cores: 8 +immich-server | (node:7) ExperimentalWarning: WASI is an experimental feature and might change at any time +immich-server | (Use `node --trace-warnings ...` to show where the warning was created) +immich-server | Starting api worker +immich-server | Starting microservices worker +immich-server | (node:7) ExperimentalWarning: WASI is an experimental feature and might change at any time +immich-server | (Use `node --trace-warnings ...` to show where the warning was created) +immich-server | (node:29) ExperimentalWarning: WASI is an experimental feature and might change at any time +immich-server | (Use `node --trace-warnings ...` to show where the warning was created) +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  LOG [Microservices:WebsocketRepository] Initialized websocket server +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  LOG [Microservices:DatabaseRepository] targetLists=1, current=1 for clip_index of 0 rows +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  LOG [Microservices:DatabaseRepository] targetLists=1, current=1 for face_index of 0 rows +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  LOG [Microservices:DatabaseRepository] Running migrations +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  LOG [Microservices:DatabaseRepository] Finished running migrations +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  LOG [Microservices:DatabaseService] Checking for schema drift +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  WARN [Microservices:DatabaseService] Detected schema drift. For more information, see https://docs.immich.app/errors#schema-drift or run `immich-admin schema-check` +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_name" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin2_name" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin1_name" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_alternate_names" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  WARN [Microservices:DatabaseService]  - The constraint "geodata_places"."geodata_places_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  LOG [Microservices:StorageService] Verifying system mount folder checks, current state: {"mountChecks":{"thumbs":true,"upload":true,"backups":true,"library":true,"profile":true,"encoded-video":true}} +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  LOG [Microservices:StorageService] Successfully verified system mount folder checks +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  LOG [Microservices:MetadataService] Bootstrapping metadata service +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  LOG [Microservices:MetadataService] Initializing metadata service +immich-server | [Nest] 7 - 09/30/2026, 2:37:55 PM  LOG [Microservices:MapRepository] Initializing metadata repository +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:WebsocketRepository] Initialized websocket server +immich-server | [Nest] 7 - 09/30/2026, 2:37:56 PM  LOG [Microservices:MapRepository] Starting geodata import +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:DatabaseRepository] targetLists=1, current=1 for clip_index of 0 rows +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:DatabaseRepository] targetLists=1, current=1 for face_index of 0 rows +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:DatabaseRepository] Running migrations +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:DatabaseRepository] Finished running migrations +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:DatabaseService] Checking for schema drift +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  WARN [Api:DatabaseService] Detected schema drift. For more information, see https://docs.immich.app/errors#schema-drift or run `immich-admin schema-check` +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_name" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin2_name" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin1_name" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_alternate_names" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  WARN [Api:DatabaseService]  - The constraint "geodata_places"."geodata_places_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:StorageService] Verifying system mount folder checks, current state: {"mountChecks":{"thumbs":true,"upload":true,"backups":true,"library":true,"profile":true,"encoded-video":true}} +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:StorageService] Successfully verified system mount folder checks +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:ServerService] Feature Flags: { +immich-server | "smartSearch": true, +immich-server | "facialRecognition": true, +immich-server | "duplicateDetection": true, +immich-server | "map": true, +immich-server | "reverseGeocoding": true, +immich-server | "importFaces": false, +immich-server | "sidecar": true, +immich-server | "search": true, +immich-server | "trash": true, +immich-server | "oauth": false, +immich-server | "oauthAutoLaunch": false, +immich-server | "ocr": true, +immich-server | "passwordLogin": true, +immich-server | "configFile": false, +immich-server | "email": false, +immich-server | "realtimeTranscoding": false +immich-server | } +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:SystemConfigService] LogLevel=log (set via system config) +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:NestFactory] Starting Nest application... +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:InstanceLoader] BullModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:InstanceLoader] ClsModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:InstanceLoader] ClsCommonModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:InstanceLoader] OpenTelemetryModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:InstanceLoader] KyselyModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:InstanceLoader] OpenTelemetryCoreModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:InstanceLoader] DiscoveryModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:InstanceLoader] ClsRootModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:InstanceLoader] ClsPluginsModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:InstanceLoader] ScheduleModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:InstanceLoader] BullModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:InstanceLoader] BullModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:InstanceLoader] ApiModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  WARN [Api:LegacyRouteConverter] Unsupported route path: "/api/*". In previous versions, the symbols ?, *, and + were used to denote optional or repeating path parameters. The latest version of "path-to-regexp" now requires the use of named parameters. For example, instead of using a route like /users/* to capture all routes starting with "/users", you should use /users/*path. For more details, refer to the migration guide. Attempting to auto-convert to "/api/{*path}"... +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] ApiKeyController {/api/api-keys}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id/rotate, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] ActivityController {/api/activities}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/activities, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/activities, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/activities/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/activities/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] AlbumController {/api/albums}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/albums, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/albums, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/map-markers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/users, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/user/:userId, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/user/:userId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] AppController {/api}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/.well-known/immich, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/custom.css, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] AssetController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/jobs, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/copy, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/metadata, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/metadata, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/ocr, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata/:key, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata/:key, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/edits, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/edits, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/edits, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] AssetFilesController {/api/asset-files}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files/:id/download, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] AssetMediaController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/original, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/thumbnail, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/playback, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/bulk-upload-check, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] AuthController {/api/auth}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/admin-sign-up, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/validateToken, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/change-password, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/logout, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/status, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/session/unlock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/session/lock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] AuthAdminController {/api/admin/auth}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/auth/unlink-all, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] ClusterGroupController {/api/cluster-groups}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests/:id/accept, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/requests, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/requests, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/regenerate-people, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/leave, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] ConfigUserController {/api/config}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] ConfigAdminController {/api/admin/config}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] ConfigPublicController {/api/public/config}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/public/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/public/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] DatabaseBackupController {/api/admin/database-backups}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/:filename, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/start-restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/upload, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] DownloadController {/api/download}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/download/info, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/download/archive, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] DuplicateController {/api/duplicates}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates/resolve, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] FaceController {/api/faces}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/faces, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/faces, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/faces/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/faces/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] IntegrityAdminController {/api/admin/integrity}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/summary, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:id/file, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:type/csv, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] JobController {/api/jobs}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs/:name, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] LibraryController {/api/libraries}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/validate, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/scan, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] MaintenanceController {/api/admin/maintenance}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/status, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/detect-install, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] MapController {/api/map}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/map/markers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/map/reverse-geocode, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] MemoryController {/api/memories}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/memories, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/memories, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] NotificationController {/api/notifications}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] NotificationAdminController {/api/admin/notifications}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications/test-email, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications/templates/:name, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] OAuthController {/api/oauth}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/mobile-redirect, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/authorize, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/callback, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/link, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/unlink, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/backchannel-logout, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] PartnerController {/api/partners}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/partners, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/partners, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] PersonController {/api/people}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/people, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/people, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/people, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/people, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/thumbnail, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/reassign, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/people/merge, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/merge, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] PluginController {/api/plugins}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/methods, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/templates, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] QueueController {/api/queues}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/queues, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name/jobs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name/jobs, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] SearchController {/api/search}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/search/metadata, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/search/statistics, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/search/random, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/search/large-assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/search/smart, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/search/explore, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/search/person, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/search/places, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/search/cities, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/search/suggestions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] ServerController {/api/server}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/server/about, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/server/apk-links, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/server/storage, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/server/ping, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version-history, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/server/features, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/server/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/server/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/server/media-types, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version-check, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] SessionController {/api/sessions}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id/lock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] SharedLinkController {/api/shared-links}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] StackController {/api/stacks}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id/assets/:assetId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] SyncController {/api/sync}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/stream, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] SystemConfigController {/api/system-config}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config/storage-template-options, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] SystemMetadataController {/api/system-metadata}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/admin-onboarding, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/admin-onboarding, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/reverse-geocoding-state, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/version-check-state, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] TagController {/api/tags}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] TimelineController {/api/timeline}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/timeline/buckets, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/timeline/bucket, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] TrashController {/api/trash}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/empty, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/restore/assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] UserAdminController {/api/admin/users}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/calendar-heatmap, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/sessions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] UserController {/api/users}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/calendar-heatmap, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/profile-image, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/profile-image, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/users/:id/profile-image, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] VideoStreamController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/main.m3u8, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId/:variantIndex/playlist.m3u8, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId/:variantIndex/:filename, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] ViewController {/api/view}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/view/folder/unique-paths, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/view/folder, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RoutesResolver] WorkflowController {/api/workflows}: +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows, POST} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/triggers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id/share, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id/logs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:NestApplication] Nest application successfully started +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:Bootstrap] Immich Server is listening on http://[::1]:2283 [v3.2.2] [production]  +immich-server | [Nest] 29 - 09/30/2026, 2:37:56 PM  LOG [Api:MachineLearningRepository] Machine learning server became healthy (http://immich-machine-learning:3003). +immich-server | [Nest] 7 - 09/30/2026, 2:37:58 PM  LOG [Microservices:MapRepository] 10000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:58 PM  LOG [Microservices:MapRepository] 20000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:58 PM  LOG [Microservices:MapRepository] 30000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 2:37:58 PM  LOG [Microservices:MapRepository] 40000 geodata records imported +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 910.2510899999997, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 8508076, +immich-server | 'Desheng', +immich-server | 'Desheng,Desheng Xiang,de sheng,de sheng xiang,德胜,德胜乡', +immich-server | 46.8664, +immich-server | 126.12408, +immich-server | 'CN', +immich-server | '08', +immich-server | '2312', +immich-server | '2021-09-20', +immich-server | 'Heilongjiang', +immich-server | 'Suihua Shi', +immich-server | 8508077, +immich-server | 'Yingchun', +immich-server | 'Yingchun,Yingchun Xiang,ying chun,ying chun xiang,迎春,迎春乡', +immich-server | 47.03728, +immich-server | 125.94673, +immich-server | 'CN', +immich-server | '08', +immich-server | '2312', +immich-server | '2021-09-20', +immich-server | 'Heilongjiang', +immich-server | 'Suihua Shi', +immich-server | 8508078, +immich-server | 'Lianfeng', +immich-server | 'Lianfeng,Lianfeng Xiang,lian feng,lian feng xiang,连丰,连丰乡', +immich-server | 46.89618, +immich-server | 125.87874, +immich-server | 'CN', +immich-server | '08', +immich-server | '2312', +immich-server | '2021-09-20', +immich-server | 'Heilongjiang', +immich-server | 'Suihua Shi', +immich-server | 8508079, +immich-server | 'Jianshe', +immich-server | 'Jianshe,Jianshe Xiang,jian she,jian she xiang,建设,建设乡', +immich-server | 46.75975, +immich-server | 125.8467, +immich-server | 'CN', +immich-server | '08', +immich-server | '2312', +immich-server | '2021-09-20', +immich-server | 'Heilongjiang', +immich-server | 'Suihua Shi', +immich-server | 8508080, +immich-server | 'Laodong', +immich-server | 'Laodong,Laodong Xiang,lao dong,lao dong xiang,劳动,劳动乡', +immich-server | 46.75494, +immich-server | 125.93199, +immich-server | 'CN', +immich-server | '08', +immich-server | '2312', +immich-server | '2021-09-20', +immich-server | 'Heilongjiang', +immich-server | 'Suihua Shi', +immich-server | 8508204, +immich-server | 'Yulin', +immich-server | 'Yulin,Yulin Xiang,yu lin,yu lin xiang,育林,育林乡', +immich-server | 47.12978, +immich-server | 125.63021, +immich-server | 'CN', +immich-server | '08', +immich-server | '2312', +immich-server | '2021-09-20', +immich-server | 'Heilongjiang', +immich-server | 'Suihua Shi', +immich-server | 8508206, +immich-server | 'Yongxing', +immich-server | 'Yongxing,Yongxing Zhen,yong xing,yong xing zhen,永兴,永兴镇', +immich-server | 47.25884, +immich-server | 126.07797, +immich-server | 'CN', +immich-server | '08', +immich-server | '2312', +immich-server | '2021-09-20', +immich-server | 'Heilongjiang', +immich-server | 'Suihua Shi', +immich-server | 8508207, +immich-server | 'Fanrong', +immich-server | 'Fanrong,Fanrong Xiang,fan rong,fan rong xiang,繁荣,繁荣乡', +immich-server | 47.30383, +immich-server | 126.24253, +immich-server | 'CN', +immich-server | '08', +immich-server | '2312', +immich-server | '2021-09-20', +immich-server | 'Heilongjiang', +immich-server | 'Suihua Shi', +immich-server | 8508208, +immich-server | 'Guangrong', +immich-server | 'Guangrong,Guangrong Xiang,guang rong,guang rong xiang,光荣,光荣乡', +immich-server | 47.31741, +immich-server | 126.31878, +immich-server | 'CN', +immich-server | '08', +immich-server | '2302', +immich-server | '2021-09-20', +immich-server | 'Heilongjiang', +immich-server | 'Qiqihar Shi', +immich-server | 8508209, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 378.5003260000012, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 3025720, +immich-server | 'Chavignon', +immich-server | 'Chavignon', +immich-server | 49.47929, +immich-server | 3.52214, +immich-server | 'FR', +immich-server | '32', +immich-server | '02', +immich-server | '2016-02-18', +immich-server | 'Hauts-de-France', +immich-server | 'Aisne', +immich-server | 3025724, +immich-server | 'Chaveyriat', +immich-server | 'Chaveyriat', +immich-server | 46.19783, +immich-server | 5.06057, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 3025732, +immich-server | 'Chavenay', +immich-server | 'Chavenay,Shavene,Shavne,Шавене,Шавне', +immich-server | 48.85437, +immich-server | 1.99163, +immich-server | 'FR', +immich-server | '11', +immich-server | '78', +immich-server | '2016-02-18', +immich-server | 'Île-de-France', +immich-server | 'Yvelines', +immich-server | 3025734, +immich-server | 'Chavelot', +immich-server | 'Chavelot', +immich-server | 48.23459, +immich-server | 6.43809, +immich-server | 'FR', +immich-server | '44', +immich-server | '88', +immich-server | '2016-02-21', +immich-server | 'Grand Est', +immich-server | 'Vosges', +immich-server | 3025736, +immich-server | 'Chaveignes', +immich-server | 'Chaveignes', +immich-server | 47.0384, +immich-server | 0.34973, +immich-server | 'FR', +immich-server | '24', +immich-server | '37', +immich-server | '2016-02-18', +immich-server | 'Centre-Val de Loire', +immich-server | 'Indre-et-Loire', +immich-server | 3025741, +immich-server | 'Chavanoz', +immich-server | 'Chavanoz,Shavano,Shavanoz,sha wa nuo,Шавано,Шаваноз,沙瓦诺', +immich-server | 45.76846, +immich-server | 5.18808, +immich-server | 'FR', +immich-server | '84', +immich-server | '38', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Isère', +immich-server | 3025745, +immich-server | 'Chavanod', +immich-server | 'Cavannodum,Chavanod,Chavanôd,Shavano,Шавано', +immich-server | 45.89005, +immich-server | 6.03928, +immich-server | 'FR', +immich-server | '84', +immich-server | '74', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Haute-Savoie', +immich-server | 3025746, +immich-server | 'Chavannes-sur-Suran', +immich-server | 'Chavannes,Chavannes-sur-Suran,Chavannes-sur-Surand', +immich-server | 46.26351, +immich-server | 5.42798, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 3025747, +immich-server | 'Chavannes-sur-Reyssouze', +immich-server | 'Chavannes,Chavannes-sur-Reyssouze', +immich-server | 46.43112, +immich-server | 4.99661, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 3025758, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 643.230184, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 3121943, +immich-server | 'Fuentecantos', +immich-server | 'Fuentecantos', +immich-server | 41.84929, +immich-server | -2.42846, +immich-server | 'ES', +immich-server | '55', +immich-server | 'SO', +immich-server | '2012-03-04', +immich-server | 'Castille and León', +immich-server | 'Provincia de Soria', +immich-server | 3121945, +immich-server | 'Fuentecambrón', +immich-server | 'Fuehntekambron,Fuentecambron,Fuentecambrón,Fuentekambron,feng te kan fu long,Фуентекамброн,Фуэнтекамброн,丰特坎夫龙', +immich-server | 41.50579, +immich-server | -3.32872, +immich-server | 'ES', +immich-server | '55', +immich-server | 'SO', +immich-server | '2012-03-04', +immich-server | 'Castille and León', +immich-server | 'Provincia de Soria', +immich-server | 3121947, +immich-server | 'Fuentebureba', +immich-server | 'Fuentebureba', +immich-server | 42.634, +immich-server | -3.2351, +immich-server | 'ES', +immich-server | '55', +immich-server | 'BU', +immich-server | '2012-03-04', +immich-server | 'Castille and León', +immich-server | 'Provincia de Burgos', +immich-server | 3121950, +immich-server | 'Fuentearmegil', +immich-server | "Fuehntearmekhil',Fuentearmegil,Fuentearmekhil',feng te ya er mei xi er,Фуентеармехіль,Фуэнтеармехиль,丰特亚尔梅希尔", +immich-server | 41.71496, +immich-server | -3.18362, +immich-server | 'ES', +immich-server | '55', +immich-server | 'SO', +immich-server | '2012-03-04', +immich-server | 'Castille and León', +immich-server | 'Provincia de Soria', +immich-server | 3121956, +immich-server | 'Fuensalida', +immich-server | 'Fuensalida', +immich-server | 40.05288, +immich-server | -4.20718, +immich-server | 'ES', +immich-server | '54', +immich-server | 'TO', +immich-server | '2012-03-04', +immich-server | 'Castille-La Mancha', +immich-server | 'Province of Toledo', +immich-server | 3121957, +immich-server | 'Fuensaldaña', +immich-server | 'Fuensaldana,Fuensaldaña', +immich-server | 41.70617, +immich-server | -4.76547, +immich-server | 'ES', +immich-server | '55', +immich-server | 'VA', +immich-server | '2012-03-04', +immich-server | 'Castille and León', +immich-server | 'Provincia de Valladolid', +immich-server | 3121959, +immich-server | 'Fuenmayor', +immich-server | 'Fuehnmajor,Fuenmajor,Fuenmayor,feng mai ao er,Фуенмайор,Фуэнмайор,Ֆուենմայոր,丰迈奥尔', +immich-server | 42.46729, +immich-server | -2.56153, +immich-server | 'ES', +immich-server | '27', +immich-server | 'LO', +immich-server | '2012-03-04', +immich-server | 'La Rioja', +immich-server | 'Provincia de La Rioja', +immich-server | 3121960, +immich-server | 'Fuenlabrada', +immich-server | 'Fons Laborata,Fuehnlabrada,Fuenlabrada,feng la fu la da,fuenraburada,fwynlabrada,Фуенлабрада,Фуэнлабрада,פואנלברדה,فوينلابرادا,フエンラブラダ,丰拉夫拉达', +immich-server | 40.28419, +immich-server | -3.79415, +immich-server | 'ES', +immich-server | '29', +immich-server | 'M', +immich-server | '2025-07-28', +immich-server | 'Madrid', +immich-server | 'Provincia de Madrid', +immich-server | 3121963, +immich-server | 'Fuenferrada', +immich-server | 'Fuenferrada', +immich-server | 40.86923, +immich-server | -1.01179, +immich-server | 'ES', +immich-server | '52', +immich-server | 'TE', +immich-server | '2012-03-04', +immich-server | 'Aragon', +immich-server | 'Provincia de Teruel', +immich-server | 3121964, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 589.4783399999997, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 2976489, +immich-server | 'Salses-le-Château', +immich-server | "Sal's-le-Shato,Salses,sa er sai lai sha tuo,Сальс-ле-Шато,萨尔塞莱沙托", +immich-server | 42.83333, +immich-server | 2.91667, +immich-server | 'FR', +immich-server | '76', +immich-server | '66', +immich-server | '2016-02-18', +immich-server | 'Occitanie', +immich-server | 'Pyrénées-Orientales', +immich-server | 2976490, +immich-server | 'Salbris', +immich-server | "Sal'bri,Salbris,sa er bu li,Сальбрі,萨尔布里", +immich-server | 47.4242, +immich-server | 2.05124, +immich-server | 'FR', +immich-server | '24', +immich-server | '41', +immich-server | '2016-02-18', +immich-server | 'Centre-Val de Loire', +immich-server | 'Loire-et-Cher', +immich-server | 2976491, +immich-server | 'Salbert', +immich-server | 'Le Salbert,Salbert', +immich-server | 47.66959, +immich-server | 6.81269, +immich-server | 'FR', +immich-server | '27', +immich-server | '90', +immich-server | '2019-01-09', +immich-server | 'Bourgogne', +immich-server | 'Territoire de Belfort', +immich-server | 2976496, +immich-server | 'Salavas', +immich-server | 'Salava,Salavas,Salavàs,sa la wa,Салава,萨拉瓦', +immich-server | 44.39408, +immich-server | 4.37926, +immich-server | 'FR', +immich-server | '84', +immich-server | '07', +immich-server | '2019-04-10', +immich-server | 'Rhône-Alpes', +immich-server | 'Ardèche', +immich-server | 2976497, +immich-server | 'Salaunes', +immich-server | 'Salaunes', +immich-server | 44.93639, +immich-server | -0.83044, +immich-server | 'FR', +immich-server | '75', +immich-server | '33', +immich-server | '2020-01-08', +immich-server | 'New Aquitaine', +immich-server | 'Gironde', +immich-server | 2976507, +immich-server | 'Salaise-sur-Sanne', +immich-server | 'Salaise,Salaise-sur-Sanne', +immich-server | 45.35126, +immich-server | 4.8107, +immich-server | 'FR', +immich-server | '84', +immich-server | '38', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Isère', +immich-server | 2976509, +immich-server | 'Salagnon', +immich-server | 'Salagnon', +immich-server | 45.66863, +immich-server | 5.36325, +immich-server | 'FR', +immich-server | '84', +immich-server | '38', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Isère', +immich-server | 2976511, +immich-server | 'Salagnac', +immich-server | "Salagnac,Salan'jak,Salanhac,sa la ni ya ke,Саланьяк,萨拉尼亚克", +immich-server | 45.31121, +immich-server | 1.19749, +immich-server | 'FR', +immich-server | '75', +immich-server | '24', +immich-server | '2019-11-06', +immich-server | 'New Aquitaine', +immich-server | 'Dordogne', +immich-server | 2976516, +immich-server | 'Saizerais', +immich-server | 'Saizerais,Sezre,sai ze lai,Сезре,赛泽赖', +immich-server | 48.7925, +immich-server | 6.0447, +immich-server | 'FR', +immich-server | '44', +immich-server | '54', +immich-server | '2018-11-06', +immich-server | 'Grand Est', +immich-server | 'Meurthe et Moselle', +immich-server | 2976520, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 869.2731800000001, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 3072483, +immich-server | 'Kunžak', +immich-server | 'Konigseck,Königseck', +immich-server | 49.12119, +immich-server | 15.19028, +immich-server | 'CZ', +immich-server | '79', +immich-server | '0313', +immich-server | '2020-02-08', +immich-server | 'South Bohemian Region', +immich-server | 'Okres Jindřichův Hradec', +immich-server | 3072484, +immich-server | 'Kunvald', +immich-server | 'Kunwald', +immich-server | 50.12927, +immich-server | 16.49996, +immich-server | 'CZ', +immich-server | '86', +immich-server | '0534', +immich-server | '2018-11-14', +immich-server | 'Pardubice Region', +immich-server | 'Okres Ústí nad Orlicí', +immich-server | 3072486, +immich-server | 'Kunštát', +immich-server | 'Kunshhat,Kunshtat,Kunstadt,Kunstata,Kunštāta,kun shen ta te,Кунштат,Кунщат,昆什塔特', +immich-server | 49.50645, +immich-server | 16.51722, +immich-server | 'CZ', +immich-server | '78', +immich-server | '0641', +immich-server | '2026-01-28', +immich-server | 'South Moravian', +immich-server | 'Okres Blansko', +immich-server | 3072493, +immich-server | 'Kunratice u Cvikova', +immich-server | 'Kunnersdorf,Kunratice', +immich-server | 50.76792, +immich-server | 14.67985, +immich-server | 'CZ', +immich-server | '83', +immich-server | '0511', +immich-server | '2025-09-19', +immich-server | 'Liberec Region', +immich-server | 'Okres Česká Lípa', +immich-server | 3072496, +immich-server | 'Kunovice', +immich-server | '', +immich-server | 49.44424, +immich-server | 17.80988, +immich-server | 'CZ', +immich-server | '90', +immich-server | '0723', +immich-server | '2018-09-08', +immich-server | 'Zlín', +immich-server | 'Okres Vsetín', +immich-server | 3072497, +immich-server | 'Kunovice', +immich-server | 'Kunovice,Kunowitz,ku nuo wei cai,Куновице,庫諾維采', +immich-server | 49.04499, +immich-server | 17.47011, +immich-server | 'CZ', +immich-server | '90', +immich-server | '0722', +immich-server | '2022-11-18', +immich-server | 'Zlín', +immich-server | 'Okres Uherské Hradiště', +immich-server | 3072503, +immich-server | 'Kunín', +immich-server | 'Kunewald,Kunvald', +immich-server | 49.63377, +immich-server | 17.98965, +immich-server | 'CZ', +immich-server | '85', +immich-server | '0804', +immich-server | '2020-01-22', +immich-server | 'Moravian-Silesian Region', +immich-server | 'Okres Nový Jičín', +immich-server | 3072506, +immich-server | 'Kunice', +immich-server | 'Kunitz', +immich-server | 49.93655, +immich-server | 14.6715, +immich-server | 'CZ', +immich-server | '88', +immich-server | '0209', +immich-server | '2018-09-08', +immich-server | 'Central Bohemia', +immich-server | 'Okres Praha-východ', +immich-server | 3072527, +immich-server | 'Kunčina', +immich-server | 'Kunzendorf', +immich-server | 49.79455, +immich-server | 16.62763, +immich-server | 'CZ', +immich-server | '86', +immich-server | '0533', +immich-server | '2018-09-08', +immich-server | 'Pardubice Region', +immich-server | 'Okres Svitavy', +immich-server | 3072531, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 769.036462, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 2932343, +immich-server | 'Eichenberg', +immich-server | '', +immich-server | 50.8, +immich-server | 11.53333, +immich-server | 'DE', +immich-server | '15', +immich-server | '00', +immich-server | '2011-04-25', +immich-server | 'Thuringia', +immich-server | null, +immich-server | 2932344, +immich-server | 'Eichenberg', +immich-server | '', +immich-server | 50.55, +immich-server | 10.66667, +immich-server | 'DE', +immich-server | '15', +immich-server | '00', +immich-server | '2011-04-25', +immich-server | 'Thuringia', +immich-server | null, +immich-server | 2932376, +immich-server | 'Eichenbarleben', +immich-server | 'Ajkhenbarleben,Eichenbarleben,Айхенбарлебен,Ајхенбарлебен', +immich-server | 52.16688, +immich-server | 11.40125, +immich-server | 'DE', +immich-server | '14', +immich-server | '00', +immich-server | '2025-03-11', +immich-server | 'Saxony-Anhalt', +immich-server | null, +immich-server | 2932379, +immich-server | 'Eichenbach', +immich-server | '', +immich-server | 50.43333, +immich-server | 6.81667, +immich-server | 'DE', +immich-server | '08', +immich-server | '00', +immich-server | '2016-06-23', +immich-server | 'Rheinland-Pfalz', +immich-server | null, +immich-server | 2932382, +immich-server | 'Eichenau', +immich-server | 'Ajkhenau,Eichenau,ai xie nao,Айхенау,Ајхенау,艾歇瑙', +immich-server | 48.16667, +immich-server | 11.31667, +immich-server | 'DE', +immich-server | '02', +immich-server | '091', +immich-server | '2011-04-25', +immich-server | 'Bavaria', +immich-server | 'Upper Bavaria', +immich-server | 2932390, +immich-server | 'Eichen', +immich-server | '', +immich-server | 50.63333, +immich-server | 7.53333, +immich-server | 'DE', +immich-server | '08', +immich-server | '00', +immich-server | '2011-04-25', +immich-server | 'Rheinland-Pfalz', +immich-server | null, +immich-server | 2932440, +immich-server | 'Eichelhardt', +immich-server | "Ajkhel'khardt,Ajkhelkhardt,ai xie er ha er te,aykhlhart,Айхельхардт,Ајхелхардт,ایخلهارت,艾歇尔哈尔特", +immich-server | 50.71667, +immich-server | 7.7, +immich-server | 'DE', +immich-server | '08', +immich-server | '00', +immich-server | '2011-04-25', +immich-server | 'Rheinland-Pfalz', +immich-server | null, +immich-server | 2932458, +immich-server | 'Eichelberg', +immich-server | 'Eichelberg', +immich-server | 49.11387, +immich-server | 9.40832, +immich-server | 'DE', +immich-server | '01', +immich-server | '081', +immich-server | '2025-01-15', +immich-server | 'Baden-Wurttemberg', +immich-server | 'Regierungsbezirk Stuttgart', +immich-server | 2932715, +immich-server | 'Eich', +immich-server | '', +immich-server | 49.75, +immich-server | 8.39889, +immich-server | 'DE', +immich-server | '08', +immich-server | '00', +immich-server | '2011-04-25', +immich-server | 'Rheinland-Pfalz', +immich-server | null, +immich-server | 2932738, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 20.63166999999885, +immich-server | error: Error: read ECONNRESET +immich-server | at TCP.onStreamRead (node:internal/stream_base_commons:216:20) { +immich-server | errno: -104, +immich-server | code: 'ECONNRESET', +immich-server | syscall: 'read' +immich-server | }, +immich-server | sql: 'SELECT pg_advisory_unlock($1)', +immich-server | params: [ 100 ] +immich-server | } +immich-server | [Nest] 7 - 09/30/2026, 2:38:00 PM  ERROR [Microservices:MetadataService] Unable to initialize reverse geocoding: Error: read ECONNRESET +immich-server | Error: read ECONNRESET +immich-server | at TCP.onStreamRead (node:internal/stream_base_commons:216:20) +immich-server | Error: Metadata service init failed +immich-server | at MetadataService.init (/usr/src/app/server/dist/services/metadata.service.js:124:19) +immich-server | at process.processTicksAndRejections (node:internal/process/task_queues:104:5) +immich-server | at async MetadataService.onBootstrap (/usr/src/app/server/dist/services/metadata.service.js:103:9) +immich-server | at async EventRepository.onEvent (/usr/src/app/server/dist/repositories/event.repository.js:91:13) +immich-server | at async MicroservicesModule.onModuleInit (/usr/src/app/server/dist/app.module.js:100:9) +immich-server | at async callModuleInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/hooks/on-module-init.hook.js:51:9) +immich-server | at async NestApplication.callInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application-context.js:245:13) +immich-server | at async NestApplication.init (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:105:9) +immich-server | at async NestApplication.listen (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:177:13) +immich-server | at async bootstrap (/usr/src/app/server/dist/workers/microservices.js:27:5) { +immich-server | [cause]: Error: read ECONNRESET +immich-server | at TCP.onStreamRead (node:internal/stream_base_commons:216:20) { +immich-server | errno: -104, +immich-server | code: 'ECONNRESET', +immich-server | syscall: 'read' +immich-server | } +immich-server | } +immich-server | microservices worker error: Error: Metadata service init failed, stack: Error: Metadata service init failed +immich-server | at MetadataService.init (/usr/src/app/server/dist/services/metadata.service.js:124:19) +immich-server | at process.processTicksAndRejections (node:internal/process/task_queues:104:5) +immich-server | at async MetadataService.onBootstrap (/usr/src/app/server/dist/services/metadata.service.js:103:9) +immich-server | at async EventRepository.onEvent (/usr/src/app/server/dist/repositories/event.repository.js:91:13) +immich-server | at async MicroservicesModule.onModuleInit (/usr/src/app/server/dist/app.module.js:100:9) +immich-server | at async callModuleInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/hooks/on-module-init.hook.js:51:9) +immich-server | at async NestApplication.callInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application-context.js:245:13) +immich-server | at async NestApplication.init (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:105:9) +immich-server | at async NestApplication.listen (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:177:13) +immich-server | at async bootstrap (/usr/src/app/server/dist/workers/microservices.js:27:5) +immich-server | microservices worker exited with code 1 +immich-server | Killing api process +immich-server | Initializing Immich v3.2.2 +immich-server | Detected CPU Cores: 8 diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/immich-retry/bench/evidence/MV-immich/run.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich-retry/bench/evidence/MV-immich/run.log new file mode 100644 index 00000000..6fc32a44 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich-retry/bench/evidence/MV-immich/run.log @@ -0,0 +1,4 @@ +[12:30:47] scratch drive folders cleared before FROM (R-656): ['/srv/felhom-gate/hdd/appdata/immich', '/srv/felhom-gate/hdd/userdata/media/photos'] +[12:30:47] MV-immich: deploying immich at FROM {'immich-server': 'ghcr.io/immich-app/immich-server:v3.2.2', 'immich-machine-learning': 'ghcr.io/immich-app/immich-machine-learning:v3.2.2', 'immich-postgres': 'ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0', 'immich-redis': 'redis:7-alpine'} +[12:38:03] FROM settled=False in 424.0s :: {"immich-machine-learning": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "immich-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "immich-redis": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "immich-server": {"status": "running", "health": "starting", "restarts": 0, "exit": 0}} +[12:38:03] FROM never became healthy — inconclusive, not a verdict about the upgrade \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/immich-retry/bench/evidence/MV-immich/verdict.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich-retry/bench/evidence/MV-immich/verdict.json new file mode 100644 index 00000000..086cb61b --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich-retry/bench/evidence/MV-immich/verdict.json @@ -0,0 +1,36 @@ +{ + "harness_version": 4, + "edge": "MV-immich", + "app": "immich", + "note": "night 2026-09-23 within-a-major move: immich-server=ghcr.io/immich-app/immich-server:v3.2.4, immich-machine-learning=ghcr.io/immich-app/immich-machine-learning:v3.2.4", + "from": { + "immich-server": "ghcr.io/immich-app/immich-server:v3.2.2", + "immich-machine-learning": "ghcr.io/immich-app/immich-machine-learning:v3.2.2", + "immich-postgres": "ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0", + "immich-redis": "redis:7-alpine" + }, + "to": { + "immich-server": "ghcr.io/immich-app/immich-server:v3.2.4", + "immich-machine-learning": "ghcr.io/immich-app/immich-machine-learning:v3.2.4", + "immich-postgres": "ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0", + "immich-redis": "redis:7-alpine" + }, + "verdict": "inconclusive", + "seed_read_before": false, + "seed_read_after": false, + "healthy_after": false, + "migration_observed": null, + "abort": "not-attempted", + "abort_detail": "FROM never settled: {\"immich-machine-learning\": {\"status\": \"running\", \"health\": \"healthy\", \"restarts\": 0, \"exit\": 0}, \"immich-postgres\": {\"status\": \"running\", \"health\": \"healthy\", \"restarts\": 0, \"exit\": 0}, \"immich-redis\": {\"status\": \"running\", \"health\": \"healthy\", \"restarts\": 0, \"exit\": 0}, \"immich-server\": {\"status\": \"running\", \"health\": \"starting\", \"restarts\": 0, \"exit\": 0}}", + "engine_state_after": null, + "memory": null, + "marks": [], + "duration_s": 435.5, + "measured_at": "2026-09-30T12:38:03Z", + "evidence": "evidence/MV-immich", + "scratch_cleared": [ + "/srv/felhom-gate/hdd/appdata/immich", + "/srv/felhom-gate/hdd/userdata/media/photos" + ], + "total_s": 435.5 +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/immich/bench/MV-immich.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich/bench/MV-immich.log new file mode 100644 index 00000000..5179000b --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich/bench/MV-immich.log @@ -0,0 +1,37 @@ +[11:50:20] scratch drive folders cleared before FROM (R-656): none existed +[11:50:20] MV-immich: deploying immich at FROM {'immich-server': 'ghcr.io/immich-app/immich-server:v3.2.2', 'immich-machine-learning': 'ghcr.io/immich-app/immich-machine-learning:v3.2.2', 'immich-postgres': 'ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0', 'immich-redis': 'redis:7-alpine'} +[11:58:41] FROM settled=False in 422.9s :: {"immich-machine-learning": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "immich-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "immich-redis": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "immich-server": {"status": "running", "health": "starting", "restarts": 0, "exit": 0}} +[11:58:41] FROM never became healthy — inconclusive, not a verdict about the upgrade +{ + "harness_version": 4, + "edge": "MV-immich", + "app": "immich", + "note": "night 2026-09-23 within-a-major move: immich-server=ghcr.io/immich-app/immich-server:v3.2.4, immich-machine-learning=ghcr.io/immich-app/immich-machine-learning:v3.2.4", + "from": { + "immich-server": "ghcr.io/immich-app/immich-server:v3.2.2", + "immich-machine-learning": "ghcr.io/immich-app/immich-machine-learning:v3.2.2", + "immich-postgres": "ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0", + "immich-redis": "redis:7-alpine" + }, + "to": { + "immich-server": "ghcr.io/immich-app/immich-server:v3.2.4", + "immich-machine-learning": "ghcr.io/immich-app/immich-machine-learning:v3.2.4", + "immich-postgres": "ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0", + "immich-redis": "redis:7-alpine" + }, + "verdict": "inconclusive", + "seed_read_before": false, + "seed_read_after": false, + "healthy_after": false, + "migration_observed": null, + "abort": "not-attempted", + "abort_detail": "FROM never settled: {\"immich-machine-learning\": {\"status\": \"running\", \"health\": \"healthy\", \"restarts\": 0, \"exit\": 0}, \"immich-postgres\": {\"status\": \"running\", \"health\": \"healthy\", \"restarts\": 0, \"exit\": 0}, \"immich-redis\": {\"status\": \"running\", \"health\": \"healthy\", \"restarts\": 0, \"exit\": 0}, \"immich-server\": {\"status\": \"running\", \"health\": \"starting\", \"restarts\": 0, \"exit\": 0}}", + "engine_state_after": null, + "memory": null, + "marks": [], + "duration_s": 501.7, + "measured_at": "2026-09-30T11:58:41Z", + "evidence": "evidence/MV-immich", + "scratch_cleared": [], + "total_s": 501.7 +} diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/immich/bench/evidence/MV-immich/compose-final.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich/bench/evidence/MV-immich/compose-final.log new file mode 100644 index 00000000..50c21ad6 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich/bench/evidence/MV-immich/compose-final.log @@ -0,0 +1,2595 @@ +9m Mapped {/api/assets/:id/video/playback, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/bulk-upload-check, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] AuthController {/api/auth}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/admin-sign-up, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/validateToken, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/change-password, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/logout, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/status, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/session/unlock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/session/lock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] AuthAdminController {/api/admin/auth}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/auth/unlink-all, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] ClusterGroupController {/api/cluster-groups}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests/:id/accept, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/requests, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/requests, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/regenerate-people, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/leave, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] ConfigUserController {/api/config}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] ConfigAdminController {/api/admin/config}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] ConfigPublicController {/api/public/config}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/public/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/public/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] DatabaseBackupController {/api/admin/database-backups}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/:filename, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/start-restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/upload, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] DownloadController {/api/download}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/download/info, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/download/archive, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] DuplicateController {/api/duplicates}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates/resolve, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] FaceController {/api/faces}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/faces, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/faces, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/faces/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/faces/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] IntegrityAdminController {/api/admin/integrity}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/summary, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:id/file, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:type/csv, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] JobController {/api/jobs}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs/:name, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] LibraryController {/api/libraries}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/validate, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/scan, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] MaintenanceController {/api/admin/maintenance}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/status, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/detect-install, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] MapController {/api/map}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/map/markers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/map/reverse-geocode, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] MemoryController {/api/memories}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/memories, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/memories, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] NotificationController {/api/notifications}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] NotificationAdminController {/api/admin/notifications}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications/test-email, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications/templates/:name, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] OAuthController {/api/oauth}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/mobile-redirect, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/authorize, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/callback, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/link, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/unlink, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/backchannel-logout, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] PartnerController {/api/partners}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/partners, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/partners, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] PersonController {/api/people}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/people, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/people, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/people, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/people, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/thumbnail, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/reassign, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/people/merge, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/merge, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] PluginController {/api/plugins}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/methods, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/templates, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] QueueController {/api/queues}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/queues, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name/jobs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name/jobs, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] SearchController {/api/search}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/search/metadata, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/search/statistics, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/search/random, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/search/large-assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/search/smart, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/search/explore, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/search/person, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/search/places, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/search/cities, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/search/suggestions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] ServerController {/api/server}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/server/about, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/server/apk-links, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/server/storage, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/server/ping, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version-history, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/server/features, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/server/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/server/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/server/media-types, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version-check, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] SessionController {/api/sessions}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id/lock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] SharedLinkController {/api/shared-links}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] StackController {/api/stacks}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id/assets/:assetId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] SyncController {/api/sync}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/stream, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] SystemConfigController {/api/system-config}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config/storage-template-options, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] SystemMetadataController {/api/system-metadata}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/admin-onboarding, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/admin-onboarding, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/reverse-geocoding-state, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/version-check-state, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] TagController {/api/tags}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] TimelineController {/api/timeline}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/timeline/buckets, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/timeline/bucket, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] TrashController {/api/trash}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/empty, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/restore/assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] UserAdminController {/api/admin/users}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/calendar-heatmap, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/sessions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] UserController {/api/users}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/calendar-heatmap, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/profile-image, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/profile-image, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/users/:id/profile-image, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] VideoStreamController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/main.m3u8, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId/:variantIndex/playlist.m3u8, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId/:variantIndex/:filename, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] ViewController {/api/view}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/view/folder/unique-paths, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/view/folder, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RoutesResolver] WorkflowController {/api/workflows}: +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/triggers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id/share, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id/logs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:NestApplication] Nest application successfully started +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:Bootstrap] Immich Server is listening on http://[::1]:2283 [v3.2.2] [production]  +immich-server | [Nest] 29 - 09/30/2026, 1:57:59 PM  LOG [Api:MachineLearningRepository] Machine learning server became healthy (http://immich-machine-learning:3003). +immich-server | [Nest] 7 - 09/30/2026, 1:58:02 PM  LOG [Microservices:MapRepository] 10000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 1:58:02 PM  LOG [Microservices:MapRepository] 20000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 1:58:02 PM  LOG [Microservices:MapRepository] 30000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 1:58:02 PM  LOG [Microservices:MapRepository] 40000 geodata records imported +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 410.5227240000004, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 3025720, +immich-server | 'Chavignon', +immich-server | 'Chavignon', +immich-server | 49.47929, +immich-server | 3.52214, +immich-server | 'FR', +immich-server | '32', +immich-server | '02', +immich-server | '2016-02-18', +immich-server | 'Hauts-de-France', +immich-server | 'Aisne', +immich-server | 3025724, +immich-server | 'Chaveyriat', +immich-server | 'Chaveyriat', +immich-server | 46.19783, +immich-server | 5.06057, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 3025732, +immich-server | 'Chavenay', +immich-server | 'Chavenay,Shavene,Shavne,Шавене,Шавне', +immich-server | 48.85437, +immich-server | 1.99163, +immich-server | 'FR', +immich-server | '11', +immich-server | '78', +immich-server | '2016-02-18', +immich-server | 'Île-de-France', +immich-server | 'Yvelines', +immich-server | 3025734, +immich-server | 'Chavelot', +immich-server | 'Chavelot', +immich-server | 48.23459, +immich-server | 6.43809, +immich-server | 'FR', +immich-server | '44', +immich-server | '88', +immich-server | '2016-02-21', +immich-server | 'Grand Est', +immich-server | 'Vosges', +immich-server | 3025736, +immich-server | 'Chaveignes', +immich-server | 'Chaveignes', +immich-server | 47.0384, +immich-server | 0.34973, +immich-server | 'FR', +immich-server | '24', +immich-server | '37', +immich-server | '2016-02-18', +immich-server | 'Centre-Val de Loire', +immich-server | 'Indre-et-Loire', +immich-server | 3025741, +immich-server | 'Chavanoz', +immich-server | 'Chavanoz,Shavano,Shavanoz,sha wa nuo,Шавано,Шаваноз,沙瓦诺', +immich-server | 45.76846, +immich-server | 5.18808, +immich-server | 'FR', +immich-server | '84', +immich-server | '38', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Isère', +immich-server | 3025745, +immich-server | 'Chavanod', +immich-server | 'Cavannodum,Chavanod,Chavanôd,Shavano,Шавано', +immich-server | 45.89005, +immich-server | 6.03928, +immich-server | 'FR', +immich-server | '84', +immich-server | '74', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Haute-Savoie', +immich-server | 3025746, +immich-server | 'Chavannes-sur-Suran', +immich-server | 'Chavannes,Chavannes-sur-Suran,Chavannes-sur-Surand', +immich-server | 46.26351, +immich-server | 5.42798, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 3025747, +immich-server | 'Chavannes-sur-Reyssouze', +immich-server | 'Chavannes,Chavannes-sur-Reyssouze', +immich-server | 46.43112, +immich-server | 4.99661, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 3025758, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 655.9438609999997, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 2976489, +immich-server | 'Salses-le-Château', +immich-server | "Sal's-le-Shato,Salses,sa er sai lai sha tuo,Сальс-ле-Шато,萨尔塞莱沙托", +immich-server | 42.83333, +immich-server | 2.91667, +immich-server | 'FR', +immich-server | '76', +immich-server | '66', +immich-server | '2016-02-18', +immich-server | 'Occitanie', +immich-server | 'Pyrénées-Orientales', +immich-server | 2976490, +immich-server | 'Salbris', +immich-server | "Sal'bri,Salbris,sa er bu li,Сальбрі,萨尔布里", +immich-server | 47.4242, +immich-server | 2.05124, +immich-server | 'FR', +immich-server | '24', +immich-server | '41', +immich-server | '2016-02-18', +immich-server | 'Centre-Val de Loire', +immich-server | 'Loire-et-Cher', +immich-server | 2976491, +immich-server | 'Salbert', +immich-server | 'Le Salbert,Salbert', +immich-server | 47.66959, +immich-server | 6.81269, +immich-server | 'FR', +immich-server | '27', +immich-server | '90', +immich-server | '2019-01-09', +immich-server | 'Bourgogne', +immich-server | 'Territoire de Belfort', +immich-server | 2976496, +immich-server | 'Salavas', +immich-server | 'Salava,Salavas,Salavàs,sa la wa,Салава,萨拉瓦', +immich-server | 44.39408, +immich-server | 4.37926, +immich-server | 'FR', +immich-server | '84', +immich-server | '07', +immich-server | '2019-04-10', +immich-server | 'Rhône-Alpes', +immich-server | 'Ardèche', +immich-server | 2976497, +immich-server | 'Salaunes', +immich-server | 'Salaunes', +immich-server | 44.93639, +immich-server | -0.83044, +immich-server | 'FR', +immich-server | '75', +immich-server | '33', +immich-server | '2020-01-08', +immich-server | 'New Aquitaine', +immich-server | 'Gironde', +immich-server | 2976507, +immich-server | 'Salaise-sur-Sanne', +immich-server | 'Salaise,Salaise-sur-Sanne', +immich-server | 45.35126, +immich-server | 4.8107, +immich-server | 'FR', +immich-server | '84', +immich-server | '38', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Isère', +immich-server | 2976509, +immich-server | 'Salagnon', +immich-server | 'Salagnon', +immich-server | 45.66863, +immich-server | 5.36325, +immich-server | 'FR', +immich-server | '84', +immich-server | '38', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Isère', +immich-server | 2976511, +immich-server | 'Salagnac', +immich-server | "Salagnac,Salan'jak,Salanhac,sa la ni ya ke,Саланьяк,萨拉尼亚克", +immich-server | 45.31121, +immich-server | 1.19749, +immich-server | 'FR', +immich-server | '75', +immich-server | '24', +immich-server | '2019-11-06', +immich-server | 'New Aquitaine', +immich-server | 'Dordogne', +immich-server | 2976516, +immich-server | 'Saizerais', +immich-server | 'Saizerais,Sezre,sai ze lai,Сезре,赛泽赖', +immich-server | 48.7925, +immich-server | 6.0447, +immich-server | 'FR', +immich-server | '44', +immich-server | '54', +immich-server | '2018-11-06', +immich-server | 'Grand Est', +immich-server | 'Meurthe et Moselle', +immich-server | 2976520, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 7.17156100000102, +immich-server | error: Error: read ECONNRESET +immich-server | at TCP.onStreamRead (node:internal/stream_base_commons:216:20) { +immich-server | errno: -104, +immich-server | code: 'ECONNRESET', +immich-server | syscall: 'read' +immich-server | }, +immich-server | sql: 'SELECT pg_advisory_unlock($1)', +immich-server | params: [ 100 ] +immich-server | } +immich-server | [Nest] 7 - 09/30/2026, 1:58:03 PM  ERROR [Microservices:MetadataService] Unable to initialize reverse geocoding: Error: read ECONNRESET +immich-server | Error: read ECONNRESET +immich-server | at TCP.onStreamRead (node:internal/stream_base_commons:216:20) +immich-server | Error: Metadata service init failed +immich-server | at MetadataService.init (/usr/src/app/server/dist/services/metadata.service.js:124:19) +immich-server | at process.processTicksAndRejections (node:internal/process/task_queues:104:5) +immich-server | at async MetadataService.onBootstrap (/usr/src/app/server/dist/services/metadata.service.js:103:9) +immich-server | at async EventRepository.onEvent (/usr/src/app/server/dist/repositories/event.repository.js:91:13) +immich-server | at async MicroservicesModule.onModuleInit (/usr/src/app/server/dist/app.module.js:100:9) +immich-server | at async callModuleInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/hooks/on-module-init.hook.js:51:9) +immich-server | at async NestApplication.callInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application-context.js:245:13) +immich-server | at async NestApplication.init (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:105:9) +immich-server | at async NestApplication.listen (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:177:13) +immich-server | at async bootstrap (/usr/src/app/server/dist/workers/microservices.js:27:5) { +immich-server | [cause]: Error: read ECONNRESET +immich-server | at TCP.onStreamRead (node:internal/stream_base_commons:216:20) { +immich-server | errno: -104, +immich-server | code: 'ECONNRESET', +immich-server | syscall: 'read' +immich-server | } +immich-server | } +immich-server | microservices worker error: Error: Metadata service init failed, stack: Error: Metadata service init failed +immich-server | at MetadataService.init (/usr/src/app/server/dist/services/metadata.service.js:124:19) +immich-server | at process.processTicksAndRejections (node:internal/process/task_queues:104:5) +immich-server | at async MetadataService.onBootstrap (/usr/src/app/server/dist/services/metadata.service.js:103:9) +immich-server | at async EventRepository.onEvent (/usr/src/app/server/dist/repositories/event.repository.js:91:13) +immich-server | at async MicroservicesModule.onModuleInit (/usr/src/app/server/dist/app.module.js:100:9) +immich-server | at async callModuleInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/hooks/on-module-init.hook.js:51:9) +immich-server | at async NestApplication.callInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application-context.js:245:13) +immich-server | at async NestApplication.init (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:105:9) +immich-server | at async NestApplication.listen (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:177:13) +immich-server | at async bootstrap (/usr/src/app/server/dist/workers/microservices.js:27:5) +immich-server | microservices worker exited with code 1 +immich-server | Killing api process +immich-server | Initializing Immich v3.2.2 +immich-server | Detected CPU Cores: 8 +immich-server | (node:7) ExperimentalWarning: WASI is an experimental feature and might change at any time +immich-server | (Use `node --trace-warnings ...` to show where the warning was created) +immich-server | Starting api worker +immich-server | Starting microservices worker +immich-server | (node:7) ExperimentalWarning: WASI is an experimental feature and might change at any time +immich-server | (Use `node --trace-warnings ...` to show where the warning was created) +immich-server | (node:29) ExperimentalWarning: WASI is an experimental feature and might change at any time +immich-server | (Use `node --trace-warnings ...` to show where the warning was created) +immich-server | [Nest] 7 - 09/30/2026, 1:58:11 PM  LOG [Microservices:WebsocketRepository] Initialized websocket server +immich-server | [Nest] 7 - 09/30/2026, 1:58:11 PM  LOG [Microservices:DatabaseRepository] targetLists=1, current=1 for clip_index of 0 rows +immich-server | [Nest] 7 - 09/30/2026, 1:58:11 PM  LOG [Microservices:DatabaseRepository] targetLists=1, current=1 for face_index of 0 rows +immich-server | [Nest] 7 - 09/30/2026, 1:58:11 PM  LOG [Microservices:DatabaseRepository] Running migrations +immich-server | [Nest] 7 - 09/30/2026, 1:58:12 PM  LOG [Microservices:DatabaseRepository] Finished running migrations +immich-server | [Nest] 7 - 09/30/2026, 1:58:12 PM  LOG [Microservices:DatabaseService] Checking for schema drift +immich-server | [Nest] 7 - 09/30/2026, 1:58:12 PM  WARN [Microservices:DatabaseService] Detected schema drift. For more information, see https://docs.immich.app/errors#schema-drift or run `immich-admin schema-check` +immich-server | [Nest] 7 - 09/30/2026, 1:58:12 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_name" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:12 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin2_name" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:12 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin1_name" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:12 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_alternate_names" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:12 PM  WARN [Microservices:DatabaseService]  - The constraint "geodata_places"."geodata_places_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:12 PM  WARN [Microservices:DatabaseService]  - The constraint "naturalearth_countries"."naturalearth_countries_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:12 PM  LOG [Microservices:StorageService] Verifying system mount folder checks, current state: {"mountChecks":{"thumbs":true,"upload":true,"backups":true,"library":true,"profile":true,"encoded-video":true}} +immich-server | [Nest] 7 - 09/30/2026, 1:58:12 PM  LOG [Microservices:StorageService] Successfully verified system mount folder checks +immich-server | [Nest] 7 - 09/30/2026, 1:58:12 PM  LOG [Microservices:MetadataService] Bootstrapping metadata service +immich-server | [Nest] 7 - 09/30/2026, 1:58:12 PM  LOG [Microservices:MetadataService] Initializing metadata service +immich-server | [Nest] 7 - 09/30/2026, 1:58:12 PM  LOG [Microservices:MapRepository] Initializing metadata repository +immich-server | [Nest] 29 - 09/30/2026, 1:58:12 PM  LOG [Api:WebsocketRepository] Initialized websocket server +immich-server | [Nest] 29 - 09/30/2026, 1:58:12 PM  LOG [Api:DatabaseRepository] targetLists=1, current=1 for clip_index of 0 rows +immich-server | [Nest] 29 - 09/30/2026, 1:58:12 PM  LOG [Api:DatabaseRepository] targetLists=1, current=1 for face_index of 0 rows +immich-server | [Nest] 29 - 09/30/2026, 1:58:12 PM  LOG [Api:DatabaseRepository] Running migrations +immich-server | [Nest] 7 - 09/30/2026, 1:58:12 PM  LOG [Microservices:MapRepository] Starting geodata import +immich-server | [Nest] 29 - 09/30/2026, 1:58:12 PM  LOG [Api:DatabaseRepository] Finished running migrations +immich-server | [Nest] 29 - 09/30/2026, 1:58:12 PM  LOG [Api:DatabaseService] Checking for schema drift +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  WARN [Api:DatabaseService] Detected schema drift. For more information, see https://docs.immich.app/errors#schema-drift or run `immich-admin schema-check` +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_name" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin2_name" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin1_name" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_alternate_names" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  WARN [Api:DatabaseService]  - The constraint "geodata_places"."geodata_places_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  WARN [Api:DatabaseService]  - The constraint "naturalearth_countries"."naturalearth_countries_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:StorageService] Verifying system mount folder checks, current state: {"mountChecks":{"thumbs":true,"upload":true,"backups":true,"library":true,"profile":true,"encoded-video":true}} +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:StorageService] Successfully verified system mount folder checks +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:ServerService] Feature Flags: { +immich-server | "smartSearch": true, +immich-server | "facialRecognition": true, +immich-server | "duplicateDetection": true, +immich-server | "map": true, +immich-server | "reverseGeocoding": true, +immich-server | "importFaces": false, +immich-server | "sidecar": true, +immich-server | "search": true, +immich-server | "trash": true, +immich-server | "oauth": false, +immich-server | "oauthAutoLaunch": false, +immich-server | "ocr": true, +immich-server | "passwordLogin": true, +immich-server | "configFile": false, +immich-server | "email": false, +immich-server | "realtimeTranscoding": false +immich-server | } +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:SystemConfigService] LogLevel=log (set via system config) +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:NestFactory] Starting Nest application... +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:InstanceLoader] BullModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:InstanceLoader] ClsModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:InstanceLoader] ClsCommonModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:InstanceLoader] OpenTelemetryModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:InstanceLoader] KyselyModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:InstanceLoader] OpenTelemetryCoreModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:InstanceLoader] DiscoveryModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:InstanceLoader] ClsRootModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:InstanceLoader] ClsPluginsModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:InstanceLoader] ScheduleModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:InstanceLoader] BullModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:InstanceLoader] BullModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:InstanceLoader] ApiModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  WARN [Api:LegacyRouteConverter] Unsupported route path: "/api/*". In previous versions, the symbols ?, *, and + were used to denote optional or repeating path parameters. The latest version of "path-to-regexp" now requires the use of named parameters. For example, instead of using a route like /users/* to capture all routes starting with "/users", you should use /users/*path. For more details, refer to the migration guide. Attempting to auto-convert to "/api/{*path}"... +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] ApiKeyController {/api/api-keys}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id/rotate, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] ActivityController {/api/activities}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/activities, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/activities, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/activities/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/activities/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] AlbumController {/api/albums}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/albums, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/albums, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/map-markers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/users, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/user/:userId, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/user/:userId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] AppController {/api}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/.well-known/immich, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/custom.css, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] AssetController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/jobs, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/copy, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/metadata, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/metadata, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/ocr, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata/:key, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata/:key, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/edits, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/edits, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/edits, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] AssetFilesController {/api/asset-files}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files/:id/download, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] AssetMediaController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/original, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/thumbnail, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/playback, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/bulk-upload-check, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] AuthController {/api/auth}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/admin-sign-up, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/validateToken, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/change-password, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/logout, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/status, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/session/unlock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/session/lock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] AuthAdminController {/api/admin/auth}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/auth/unlink-all, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] ClusterGroupController {/api/cluster-groups}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests/:id/accept, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/requests, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/requests, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/regenerate-people, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/leave, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] ConfigUserController {/api/config}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] ConfigAdminController {/api/admin/config}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] ConfigPublicController {/api/public/config}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/public/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/public/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] DatabaseBackupController {/api/admin/database-backups}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/:filename, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/start-restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/upload, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] DownloadController {/api/download}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/download/info, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/download/archive, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] DuplicateController {/api/duplicates}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates/resolve, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] FaceController {/api/faces}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/faces, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/faces, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/faces/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/faces/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] IntegrityAdminController {/api/admin/integrity}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/summary, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:id/file, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:type/csv, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] JobController {/api/jobs}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs/:name, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] LibraryController {/api/libraries}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/validate, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/scan, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] MaintenanceController {/api/admin/maintenance}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/status, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/detect-install, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] MapController {/api/map}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/map/markers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/map/reverse-geocode, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] MemoryController {/api/memories}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/memories, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/memories, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] NotificationController {/api/notifications}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] NotificationAdminController {/api/admin/notifications}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications/test-email, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications/templates/:name, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] OAuthController {/api/oauth}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/mobile-redirect, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/authorize, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/callback, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/link, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/unlink, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/backchannel-logout, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] PartnerController {/api/partners}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/partners, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/partners, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] PersonController {/api/people}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/people, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/people, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/people, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/people, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/thumbnail, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/reassign, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/people/merge, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/merge, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] PluginController {/api/plugins}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/methods, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/templates, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] QueueController {/api/queues}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/queues, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name/jobs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name/jobs, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] SearchController {/api/search}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/search/metadata, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/search/statistics, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/search/random, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/search/large-assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/search/smart, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/search/explore, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/search/person, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/search/places, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/search/cities, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/search/suggestions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] ServerController {/api/server}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/server/about, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/server/apk-links, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/server/storage, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/server/ping, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version-history, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/server/features, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/server/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/server/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/server/media-types, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version-check, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] SessionController {/api/sessions}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id/lock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] SharedLinkController {/api/shared-links}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] StackController {/api/stacks}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id/assets/:assetId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] SyncController {/api/sync}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/stream, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] SystemConfigController {/api/system-config}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config/storage-template-options, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] SystemMetadataController {/api/system-metadata}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/admin-onboarding, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/admin-onboarding, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/reverse-geocoding-state, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/version-check-state, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] TagController {/api/tags}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] TimelineController {/api/timeline}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/timeline/buckets, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/timeline/bucket, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] TrashController {/api/trash}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/empty, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/restore/assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] UserAdminController {/api/admin/users}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/calendar-heatmap, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/sessions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] UserController {/api/users}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/calendar-heatmap, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/profile-image, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/profile-image, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/users/:id/profile-image, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] VideoStreamController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/main.m3u8, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId/:variantIndex/playlist.m3u8, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId/:variantIndex/:filename, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] ViewController {/api/view}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/view/folder/unique-paths, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/view/folder, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RoutesResolver] WorkflowController {/api/workflows}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/triggers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id/share, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id/logs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:NestApplication] Nest application successfully started +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:Bootstrap] Immich Server is listening on http://[::1]:2283 [v3.2.2] [production]  +immich-server | [Nest] 29 - 09/30/2026, 1:58:13 PM  LOG [Api:MachineLearningRepository] Machine learning server became healthy (http://immich-machine-learning:3003). +immich-server | [Nest] 7 - 09/30/2026, 1:58:15 PM  LOG [Microservices:MapRepository] 10000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 1:58:15 PM  LOG [Microservices:MapRepository] 20000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 1:58:15 PM  LOG [Microservices:MapRepository] 30000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 1:58:15 PM  LOG [Microservices:MapRepository] 40000 geodata records imported +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 247.81809299999986, +immich-server | error: Error: read ECONNRESET +immich-server | at TCP.onStreamRead (node:internal/stream_base_commons:216:20) { +immich-server | errno: -104, +immich-server | code: 'ECONNRESET', +immich-server | syscall: 'read' +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 3025720, +immich-server | 'Chavignon', +immich-server | 'Chavignon', +immich-server | 49.47929, +immich-server | 3.52214, +immich-server | 'FR', +immich-server | '32', +immich-server | '02', +immich-server | '2016-02-18', +immich-server | 'Hauts-de-France', +immich-server | 'Aisne', +immich-server | 3025724, +immich-server | 'Chaveyriat', +immich-server | 'Chaveyriat', +immich-server | 46.19783, +immich-server | 5.06057, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 3025732, +immich-server | 'Chavenay', +immich-server | 'Chavenay,Shavene,Shavne,Шавене,Шавне', +immich-server | 48.85437, +immich-server | 1.99163, +immich-server | 'FR', +immich-server | '11', +immich-server | '78', +immich-server | '2016-02-18', +immich-server | 'Île-de-France', +immich-server | 'Yvelines', +immich-server | 3025734, +immich-server | 'Chavelot', +immich-server | 'Chavelot', +immich-server | 48.23459, +immich-server | 6.43809, +immich-server | 'FR', +immich-server | '44', +immich-server | '88', +immich-server | '2016-02-21', +immich-server | 'Grand Est', +immich-server | 'Vosges', +immich-server | 3025736, +immich-server | 'Chaveignes', +immich-server | 'Chaveignes', +immich-server | 47.0384, +immich-server | 0.34973, +immich-server | 'FR', +immich-server | '24', +immich-server | '37', +immich-server | '2016-02-18', +immich-server | 'Centre-Val de Loire', +immich-server | 'Indre-et-Loire', +immich-server | 3025741, +immich-server | 'Chavanoz', +immich-server | 'Chavanoz,Shavano,Shavanoz,sha wa nuo,Шавано,Шаваноз,沙瓦诺', +immich-server | 45.76846, +immich-server | 5.18808, +immich-server | 'FR', +immich-server | '84', +immich-server | '38', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Isère', +immich-server | 3025745, +immich-server | 'Chavanod', +immich-server | 'Cavannodum,Chavanod,Chavanôd,Shavano,Шавано', +immich-server | 45.89005, +immich-server | 6.03928, +immich-server | 'FR', +immich-server | '84', +immich-server | '74', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Haute-Savoie', +immich-server | 3025746, +immich-server | 'Chavannes-sur-Suran', +immich-server | 'Chavannes,Chavannes-sur-Suran,Chavannes-sur-Surand', +immich-server | 46.26351, +immich-server | 5.42798, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 3025747, +immich-server | 'Chavannes-sur-Reyssouze', +immich-server | 'Chavannes,Chavannes-sur-Reyssouze', +immich-server | 46.43112, +immich-server | 4.99661, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 3025758, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 4.998077000000194, +immich-server | error: Error: read ECONNRESET +immich-server | at TCP.onStreamRead (node:internal/stream_base_commons:216:20) { +immich-server | errno: -104, +immich-server | code: 'ECONNRESET', +immich-server | syscall: 'read' +immich-server | }, +immich-server | sql: 'SELECT pg_advisory_unlock($1)', +immich-server | params: [ 100 ] +immich-server | } +immich-server | [Nest] 7 - 09/30/2026, 1:58:16 PM  ERROR [Microservices:MetadataService] Unable to initialize reverse geocoding: Error: read ECONNRESET +immich-server | Error: read ECONNRESET +immich-server | at TCP.onStreamRead (node:internal/stream_base_commons:216:20) +immich-server | Error: Metadata service init failed +immich-server | at MetadataService.init (/usr/src/app/server/dist/services/metadata.service.js:124:19) +immich-server | at process.processTicksAndRejections (node:internal/process/task_queues:104:5) +immich-server | at async MetadataService.onBootstrap (/usr/src/app/server/dist/services/metadata.service.js:103:9) +immich-server | at async EventRepository.onEvent (/usr/src/app/server/dist/repositories/event.repository.js:91:13) +immich-server | at async MicroservicesModule.onModuleInit (/usr/src/app/server/dist/app.module.js:100:9) +immich-server | at async callModuleInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/hooks/on-module-init.hook.js:51:9) +immich-server | at async NestApplication.callInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application-context.js:245:13) +immich-server | at async NestApplication.init (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:105:9) +immich-server | at async NestApplication.listen (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:177:13) +immich-server | at async bootstrap (/usr/src/app/server/dist/workers/microservices.js:27:5) { +immich-server | [cause]: Error: read ECONNRESET +immich-server | at TCP.onStreamRead (node:internal/stream_base_commons:216:20) { +immich-server | errno: -104, +immich-server | code: 'ECONNRESET', +immich-server | syscall: 'read' +immich-server | } +immich-server | } +immich-server | microservices worker error: Error: Metadata service init failed, stack: Error: Metadata service init failed +immich-server | at MetadataService.init (/usr/src/app/server/dist/services/metadata.service.js:124:19) +immich-server | at process.processTicksAndRejections (node:internal/process/task_queues:104:5) +immich-server | at async MetadataService.onBootstrap (/usr/src/app/server/dist/services/metadata.service.js:103:9) +immich-server | at async EventRepository.onEvent (/usr/src/app/server/dist/repositories/event.repository.js:91:13) +immich-server | at async MicroservicesModule.onModuleInit (/usr/src/app/server/dist/app.module.js:100:9) +immich-server | at async callModuleInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/hooks/on-module-init.hook.js:51:9) +immich-server | at async NestApplication.callInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application-context.js:245:13) +immich-server | at async NestApplication.init (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:105:9) +immich-server | at async NestApplication.listen (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:177:13) +immich-server | at async bootstrap (/usr/src/app/server/dist/workers/microservices.js:27:5) +immich-server | microservices worker exited with code 1 +immich-server | Killing api process +immich-server | Initializing Immich v3.2.2 +immich-server | Detected CPU Cores: 8 +immich-server | (node:7) ExperimentalWarning: WASI is an experimental feature and might change at any time +immich-server | (Use `node --trace-warnings ...` to show where the warning was created) +immich-server | Starting api worker +immich-server | Starting microservices worker +immich-server | (node:7) ExperimentalWarning: WASI is an experimental feature and might change at any time +immich-server | (Use `node --trace-warnings ...` to show where the warning was created) +immich-server | (node:29) ExperimentalWarning: WASI is an experimental feature and might change at any time +immich-server | (Use `node --trace-warnings ...` to show where the warning was created) +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  LOG [Microservices:WebsocketRepository] Initialized websocket server +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  LOG [Microservices:DatabaseRepository] targetLists=1, current=1 for clip_index of 0 rows +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  LOG [Microservices:DatabaseRepository] targetLists=1, current=1 for face_index of 0 rows +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  LOG [Microservices:DatabaseRepository] Running migrations +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  LOG [Microservices:DatabaseRepository] Finished running migrations +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  LOG [Microservices:DatabaseService] Checking for schema drift +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  WARN [Microservices:DatabaseService] Detected schema drift. For more information, see https://docs.immich.app/errors#schema-drift or run `immich-admin schema-check` +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_name" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin2_name" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin1_name" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_alternate_names" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  WARN [Microservices:DatabaseService]  - The constraint "geodata_places"."geodata_places_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  WARN [Microservices:DatabaseService]  - The constraint "naturalearth_countries"."naturalearth_countries_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  LOG [Microservices:StorageService] Verifying system mount folder checks, current state: {"mountChecks":{"thumbs":true,"upload":true,"backups":true,"library":true,"profile":true,"encoded-video":true}} +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  LOG [Microservices:StorageService] Successfully verified system mount folder checks +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  LOG [Microservices:MetadataService] Bootstrapping metadata service +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  LOG [Microservices:MetadataService] Initializing metadata service +immich-server | [Nest] 7 - 09/30/2026, 1:58:25 PM  LOG [Microservices:MapRepository] Initializing metadata repository +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:WebsocketRepository] Initialized websocket server +immich-server | [Nest] 7 - 09/30/2026, 1:58:26 PM  LOG [Microservices:MapRepository] Starting geodata import +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:DatabaseRepository] targetLists=1, current=1 for clip_index of 0 rows +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:DatabaseRepository] targetLists=1, current=1 for face_index of 0 rows +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:DatabaseRepository] Running migrations +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:DatabaseRepository] Finished running migrations +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:DatabaseService] Checking for schema drift +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  WARN [Api:DatabaseService] Detected schema drift. For more information, see https://docs.immich.app/errors#schema-drift or run `immich-admin schema-check` +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_name" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin2_name" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin1_name" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_alternate_names" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  WARN [Api:DatabaseService]  - The constraint "geodata_places"."geodata_places_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  WARN [Api:DatabaseService]  - The constraint "naturalearth_countries"."naturalearth_countries_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:StorageService] Verifying system mount folder checks, current state: {"mountChecks":{"thumbs":true,"upload":true,"backups":true,"library":true,"profile":true,"encoded-video":true}} +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:StorageService] Successfully verified system mount folder checks +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:ServerService] Feature Flags: { +immich-server | "smartSearch": true, +immich-server | "facialRecognition": true, +immich-server | "duplicateDetection": true, +immich-server | "map": true, +immich-server | "reverseGeocoding": true, +immich-server | "importFaces": false, +immich-server | "sidecar": true, +immich-server | "search": true, +immich-server | "trash": true, +immich-server | "oauth": false, +immich-server | "oauthAutoLaunch": false, +immich-server | "ocr": true, +immich-server | "passwordLogin": true, +immich-server | "configFile": false, +immich-server | "email": false, +immich-server | "realtimeTranscoding": false +immich-server | } +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:SystemConfigService] LogLevel=log (set via system config) +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:MachineLearningRepository] Machine learning server became healthy (http://immich-machine-learning:3003). +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:NestFactory] Starting Nest application... +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:InstanceLoader] BullModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:InstanceLoader] ClsModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:InstanceLoader] ClsCommonModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:InstanceLoader] OpenTelemetryModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:InstanceLoader] KyselyModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:InstanceLoader] OpenTelemetryCoreModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:InstanceLoader] DiscoveryModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:InstanceLoader] ClsRootModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:InstanceLoader] ClsPluginsModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:InstanceLoader] ScheduleModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:InstanceLoader] BullModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:InstanceLoader] BullModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:InstanceLoader] ApiModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  WARN [Api:LegacyRouteConverter] Unsupported route path: "/api/*". In previous versions, the symbols ?, *, and + were used to denote optional or repeating path parameters. The latest version of "path-to-regexp" now requires the use of named parameters. For example, instead of using a route like /users/* to capture all routes starting with "/users", you should use /users/*path. For more details, refer to the migration guide. Attempting to auto-convert to "/api/{*path}"... +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] ApiKeyController {/api/api-keys}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id/rotate, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] ActivityController {/api/activities}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/activities, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/activities, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/activities/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/activities/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] AlbumController {/api/albums}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/albums, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/albums, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/map-markers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/users, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/user/:userId, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/user/:userId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] AppController {/api}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/.well-known/immich, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/custom.css, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] AssetController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/jobs, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/copy, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/metadata, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/metadata, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/ocr, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata/:key, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata/:key, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/edits, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/edits, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/edits, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] AssetFilesController {/api/asset-files}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files/:id/download, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] AssetMediaController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/original, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/thumbnail, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/playback, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/bulk-upload-check, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] AuthController {/api/auth}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/admin-sign-up, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/validateToken, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/change-password, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/logout, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/status, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/session/unlock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/session/lock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] AuthAdminController {/api/admin/auth}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/auth/unlink-all, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] ClusterGroupController {/api/cluster-groups}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests/:id/accept, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/requests, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/requests, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/regenerate-people, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/leave, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] ConfigUserController {/api/config}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] ConfigAdminController {/api/admin/config}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] ConfigPublicController {/api/public/config}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/public/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/public/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] DatabaseBackupController {/api/admin/database-backups}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/:filename, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/start-restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/upload, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] DownloadController {/api/download}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/download/info, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/download/archive, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] DuplicateController {/api/duplicates}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates/resolve, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] FaceController {/api/faces}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/faces, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/faces, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/faces/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/faces/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] IntegrityAdminController {/api/admin/integrity}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/summary, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:id/file, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:type/csv, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] JobController {/api/jobs}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs/:name, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] LibraryController {/api/libraries}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/validate, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/scan, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] MaintenanceController {/api/admin/maintenance}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/status, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/detect-install, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] MapController {/api/map}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/map/markers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/map/reverse-geocode, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] MemoryController {/api/memories}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/memories, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/memories, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] NotificationController {/api/notifications}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] NotificationAdminController {/api/admin/notifications}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications/test-email, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications/templates/:name, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] OAuthController {/api/oauth}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/mobile-redirect, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/authorize, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/callback, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/link, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/unlink, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/backchannel-logout, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] PartnerController {/api/partners}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/partners, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/partners, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] PersonController {/api/people}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/people, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/people, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/people, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/people, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/thumbnail, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/reassign, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/people/merge, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/merge, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] PluginController {/api/plugins}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/methods, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/templates, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] QueueController {/api/queues}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/queues, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name/jobs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name/jobs, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] SearchController {/api/search}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/search/metadata, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/search/statistics, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/search/random, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/search/large-assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/search/smart, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/search/explore, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/search/person, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/search/places, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/search/cities, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/search/suggestions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] ServerController {/api/server}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/server/about, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/server/apk-links, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/server/storage, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/server/ping, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version-history, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/server/features, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/server/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/server/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/server/media-types, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version-check, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] SessionController {/api/sessions}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id/lock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] SharedLinkController {/api/shared-links}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] StackController {/api/stacks}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id/assets/:assetId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] SyncController {/api/sync}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/stream, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] SystemConfigController {/api/system-config}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config/storage-template-options, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] SystemMetadataController {/api/system-metadata}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/admin-onboarding, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/admin-onboarding, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/reverse-geocoding-state, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/version-check-state, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] TagController {/api/tags}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] TimelineController {/api/timeline}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/timeline/buckets, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/timeline/bucket, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] TrashController {/api/trash}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/empty, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/restore/assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] UserAdminController {/api/admin/users}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/calendar-heatmap, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/sessions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] UserController {/api/users}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/calendar-heatmap, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/profile-image, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/profile-image, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/users/:id/profile-image, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] VideoStreamController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/main.m3u8, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId/:variantIndex/playlist.m3u8, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId/:variantIndex/:filename, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] ViewController {/api/view}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/view/folder/unique-paths, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/view/folder, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RoutesResolver] WorkflowController {/api/workflows}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/triggers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id/share, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id/logs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:26 PM  LOG [Api:NestApplication] Nest application successfully started +immich-server | [Nest] 29 - 09/30/2026, 1:58:27 PM  LOG [Api:Bootstrap] Immich Server is listening on http://[::1]:2283 [v3.2.2] [production]  +immich-server | [Nest] 7 - 09/30/2026, 1:58:28 PM  LOG [Microservices:MapRepository] 10000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 1:58:28 PM  LOG [Microservices:MapRepository] 20000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 1:58:28 PM  LOG [Microservices:MapRepository] 30000 geodata records imported +immich-server | [Nest] 7 - 09/30/2026, 1:58:29 PM  LOG [Microservices:MapRepository] 40000 geodata records imported +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 248.49582200000077, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 3025720, +immich-server | 'Chavignon', +immich-server | 'Chavignon', +immich-server | 49.47929, +immich-server | 3.52214, +immich-server | 'FR', +immich-server | '32', +immich-server | '02', +immich-server | '2016-02-18', +immich-server | 'Hauts-de-France', +immich-server | 'Aisne', +immich-server | 3025724, +immich-server | 'Chaveyriat', +immich-server | 'Chaveyriat', +immich-server | 46.19783, +immich-server | 5.06057, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 3025732, +immich-server | 'Chavenay', +immich-server | 'Chavenay,Shavene,Shavne,Шавене,Шавне', +immich-server | 48.85437, +immich-server | 1.99163, +immich-server | 'FR', +immich-server | '11', +immich-server | '78', +immich-server | '2016-02-18', +immich-server | 'Île-de-France', +immich-server | 'Yvelines', +immich-server | 3025734, +immich-server | 'Chavelot', +immich-server | 'Chavelot', +immich-server | 48.23459, +immich-server | 6.43809, +immich-server | 'FR', +immich-server | '44', +immich-server | '88', +immich-server | '2016-02-21', +immich-server | 'Grand Est', +immich-server | 'Vosges', +immich-server | 3025736, +immich-server | 'Chaveignes', +immich-server | 'Chaveignes', +immich-server | 47.0384, +immich-server | 0.34973, +immich-server | 'FR', +immich-server | '24', +immich-server | '37', +immich-server | '2016-02-18', +immich-server | 'Centre-Val de Loire', +immich-server | 'Indre-et-Loire', +immich-server | 3025741, +immich-server | 'Chavanoz', +immich-server | 'Chavanoz,Shavano,Shavanoz,sha wa nuo,Шавано,Шаваноз,沙瓦诺', +immich-server | 45.76846, +immich-server | 5.18808, +immich-server | 'FR', +immich-server | '84', +immich-server | '38', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Isère', +immich-server | 3025745, +immich-server | 'Chavanod', +immich-server | 'Cavannodum,Chavanod,Chavanôd,Shavano,Шавано', +immich-server | 45.89005, +immich-server | 6.03928, +immich-server | 'FR', +immich-server | '84', +immich-server | '74', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Haute-Savoie', +immich-server | 3025746, +immich-server | 'Chavannes-sur-Suran', +immich-server | 'Chavannes,Chavannes-sur-Suran,Chavannes-sur-Surand', +immich-server | 46.26351, +immich-server | 5.42798, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 3025747, +immich-server | 'Chavannes-sur-Reyssouze', +immich-server | 'Chavannes,Chavannes-sur-Reyssouze', +immich-server | 46.43112, +immich-server | 4.99661, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 3025758, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Postgres notice: { +immich-server | severity_local: 'WARNING', +immich-server | severity: 'WARNING', +immich-server | code: '57P02', +immich-server | message: 'terminating connection because of crash of another server process', +immich-server | detail: 'The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.', +immich-server | hint: 'In a moment you should be able to reconnect to the database and repeat your command.', +immich-server | file: 'postgres.c', +immich-server | line: '2964', +immich-server | routine: 'quickdie' +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 588.0841560000008, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 3121943, +immich-server | 'Fuentecantos', +immich-server | 'Fuentecantos', +immich-server | 41.84929, +immich-server | -2.42846, +immich-server | 'ES', +immich-server | '55', +immich-server | 'SO', +immich-server | '2012-03-04', +immich-server | 'Castille and León', +immich-server | 'Provincia de Soria', +immich-server | 3121945, +immich-server | 'Fuentecambrón', +immich-server | 'Fuehntekambron,Fuentecambron,Fuentecambrón,Fuentekambron,feng te kan fu long,Фуентекамброн,Фуэнтекамброн,丰特坎夫龙', +immich-server | 41.50579, +immich-server | -3.32872, +immich-server | 'ES', +immich-server | '55', +immich-server | 'SO', +immich-server | '2012-03-04', +immich-server | 'Castille and León', +immich-server | 'Provincia de Soria', +immich-server | 3121947, +immich-server | 'Fuentebureba', +immich-server | 'Fuentebureba', +immich-server | 42.634, +immich-server | -3.2351, +immich-server | 'ES', +immich-server | '55', +immich-server | 'BU', +immich-server | '2012-03-04', +immich-server | 'Castille and León', +immich-server | 'Provincia de Burgos', +immich-server | 3121950, +immich-server | 'Fuentearmegil', +immich-server | "Fuehntearmekhil',Fuentearmegil,Fuentearmekhil',feng te ya er mei xi er,Фуентеармехіль,Фуэнтеармехиль,丰特亚尔梅希尔", +immich-server | 41.71496, +immich-server | -3.18362, +immich-server | 'ES', +immich-server | '55', +immich-server | 'SO', +immich-server | '2012-03-04', +immich-server | 'Castille and León', +immich-server | 'Provincia de Soria', +immich-server | 3121956, +immich-server | 'Fuensalida', +immich-server | 'Fuensalida', +immich-server | 40.05288, +immich-server | -4.20718, +immich-server | 'ES', +immich-server | '54', +immich-server | 'TO', +immich-server | '2012-03-04', +immich-server | 'Castille-La Mancha', +immich-server | 'Province of Toledo', +immich-server | 3121957, +immich-server | 'Fuensaldaña', +immich-server | 'Fuensaldana,Fuensaldaña', +immich-server | 41.70617, +immich-server | -4.76547, +immich-server | 'ES', +immich-server | '55', +immich-server | 'VA', +immich-server | '2012-03-04', +immich-server | 'Castille and León', +immich-server | 'Provincia de Valladolid', +immich-server | 3121959, +immich-server | 'Fuenmayor', +immich-server | 'Fuehnmajor,Fuenmajor,Fuenmayor,feng mai ao er,Фуенмайор,Фуэнмайор,Ֆուենմայոր,丰迈奥尔', +immich-server | 42.46729, +immich-server | -2.56153, +immich-server | 'ES', +immich-server | '27', +immich-server | 'LO', +immich-server | '2012-03-04', +immich-server | 'La Rioja', +immich-server | 'Provincia de La Rioja', +immich-server | 3121960, +immich-server | 'Fuenlabrada', +immich-server | 'Fons Laborata,Fuehnlabrada,Fuenlabrada,feng la fu la da,fuenraburada,fwynlabrada,Фуенлабрада,Фуэнлабрада,פואנלברדה,فوينلابرادا,フエンラブラダ,丰拉夫拉达', +immich-server | 40.28419, +immich-server | -3.79415, +immich-server | 'ES', +immich-server | '29', +immich-server | 'M', +immich-server | '2025-07-28', +immich-server | 'Madrid', +immich-server | 'Provincia de Madrid', +immich-server | 3121963, +immich-server | 'Fuenferrada', +immich-server | 'Fuenferrada', +immich-server | 40.86923, +immich-server | -1.01179, +immich-server | 'ES', +immich-server | '52', +immich-server | 'TE', +immich-server | '2012-03-04', +immich-server | 'Aragon', +immich-server | 'Provincia de Teruel', +immich-server | 3121964, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 490.8380469999993, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'insert into "geodata_places" ("id", "name", "alternateNames", "latitude", "longitude", "countryCode", "admin1Code", "admin2Code", "modificationDate", "admin1Name", "admin2Name") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11), ($12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22), ($23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33), ($34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44), ($45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55), ($56, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66), ($67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77), ($78, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88), ($89, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99), ($100, $101, $102, $103, $104, $105, $106, $107, $108, $109, $110), ($111, $112, $113, $114, $115, $116, $117, $118, $119, $120, $121), ($122, $123, $124, $125, $126, $127, $128, $129, $130, $131, $132), ($133, $134, $135, $136, $137, $138, $139, $140, $141, $142, $143), ($144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154), ($155, $156, $157, $158, $159, $160, $161, $162, $163, $164, $165), ($166, $167, $168, $169, $170, $171, $172, $173, $174, $175, $176), ($177, $178, $179, $180, $181, $182, $183, $184, $185, $186, $187), ($188, $189, $190, $191, $192, $193, $194, $195, $196, $197, $198), ($199, $200, $201, $202, $203, $204, $205, $206, $207, $208, $209), ($210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220), ($221, $222, $223, $224, $225, $226, $227, $228, $229, $230, $231), ($232, $233, $234, $235, $236, $237, $238, $239, $240, $241, $242), ($243, $244, $245, $246, $247, $248, $249, $250, $251, $252, $253), ($254, $255, $256, $257, $258, $259, $260, $261, $262, $263, $264), ($265, $266, $267, $268, $269, $270, $271, $272, $273, $274, $275), ($276, $277, $278, $279, $280, $281, $282, $283, $284, $285, $286), ($287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297), ($298, $299, $300, $301, $302, $303, $304, $305, $306, $307, $308), ($309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319), ($320, $321, $322, $323, $324, $325, $326, $327, $328, $329, $330), ($331, $332, $333, $334, $335, $336, $337, $338, $339, $340, $341), ($342, $343, $344, $345, $346, $347, $348, $349, $350, $351, $352), ($353, $354, $355, $356, $357, $358, $359, $360, $361, $362, $363), ($364, $365, $366, $367, $368, $369, $370, $371, $372, $373, $374), ($375, $376, $377, $378, $379, $380, $381, $382, $383, $384, $385), ($386, $387, $388, $389, $390, $391, $392, $393, $394, $395, $396), ($397, $398, $399, $400, $401, $402, $403, $404, $405, $406, $407), ($408, $409, $410, $411, $412, $413, $414, $415, $416, $417, $418), ($419, $420, $421, $422, $423, $424, $425, $426, $427, $428, $429), ($430, $431, $432, $433, $434, $435, $436, $437, $438, $439, $440), ($441, $442, $443, $444, $445, $446, $447, $448, $449, $450, $451), ($452, $453, $454, $455, $456, $457, $458, $459, $460, $461, $462), ($463, $464, $465, $466, $467, $468, $469, $470, $471, $472, $473), ($474, $475, $476, $477, $478, $479, $480, $481, $482, $483, $484), ($485, $486, $487, $488, $489, $490, $491, $492, $493, $494, $495), ($496, $497, $498, $499, $500, $501, $502, $503, $504, $505, $506), ($507, $508, $509, $510, $511, $512, $513, $514, $515, $516, $517), ($518, $519, $520, $521, $522, $523, $524, $525, $526, $527, $528), ($529, $530, $531, $532, $533, $534, $535, $536, $537, $538, $539), ($540, $541, $542, $543, $544, $545, $546, $547, $548, $549, $550), ($551, $552, $553, $554, $555, $556, $557, $558, $559, $560, $561), ($562, $563, $564, $565, $566, $567, $568, $569, $570, $571, $572), ($573, $574, $575, $576, $577, $578, $579, $580, $581, $582, $583), ($584, $585, $586, $587, $588, $589, $590, $591, $592, $593, $594), ($595, $596, $597, $598, $599, $600, $601, $602, $603, $604, $605), ($606, $607, $608, $609, $610, $611, $612, $613, $614, $615, $616), ($617, $618, $619, $620, $621, $622, $623, $624, $625, $626, $627), ($628, $629, $630, $631, $632, $633, $634, $635, $636, $637, $638), ($639, $640, $641, $642, $643, $644, $645, $646, $647, $648, $649), ($650, $651, $652, $653, $654, $655, $656, $657, $658, $659, $660), ($661, $662, $663, $664, $665, $666, $667, $668, $669, $670, $671), ($672, $673, $674, $675, $676, $677, $678, $679, $680, $681, $682), ($683, $684, $685, $686, $687, $688, $689, $690, $691, $692, $693), ($694, $695, $696, $697, $698, $699, $700, $701, $702, $703, $704), ($705, $706, $707, $708, $709, $710, $711, $712, $713, $714, $715), ($716, $717, $718, $719, $720, $721, $722, $723, $724, $725, $726), ($727, $728, $729, $730, $731, $732, $733, $734, $735, $736, $737), ($738, $739, $740, $741, $742, $743, $744, $745, $746, $747, $748), ($749, $750, $751, $752, $753, $754, $755, $756, $757, $758, $759), ($760, $761, $762, $763, $764, $765, $766, $767, $768, $769, $770), ($771, $772, $773, $774, $775, $776, $777, $778, $779, $780, $781), ($782, $783, $784, $785, $786, $787, $788, $789, $790, $791, $792), ($793, $794, $795, $796, $797, $798, $799, $800, $801, $802, $803), ($804, $805, $806, $807, $808, $809, $810, $811, $812, $813, $814), ($815, $816, $817, $818, $819, $820, $821, $822, $823, $824, $825), ($826, $827, $828, $829, $830, $831, $832, $833, $834, $835, $836), ($837, $838, $839, $840, $841, $842, $843, $844, $845, $846, $847), ($848, $849, $850, $851, $852, $853, $854, $855, $856, $857, $858), ($859, $860, $861, $862, $863, $864, $865, $866, $867, $868, $869), ($870, $871, $872, $873, $874, $875, $876, $877, $878, $879, $880), ($881, $882, $883, $884, $885, $886, $887, $888, $889, $890, $891), ($892, $893, $894, $895, $896, $897, $898, $899, $900, $901, $902), ($903, $904, $905, $906, $907, $908, $909, $910, $911, $912, $913), ($914, $915, $916, $917, $918, $919, $920, $921, $922, $923, $924), ($925, $926, $927, $928, $929, $930, $931, $932, $933, $934, $935), ($936, $937, $938, $939, $940, $941, $942, $943, $944, $945, $946), ($947, $948, $949, $950, $951, $952, $953, $954, $955, $956, $957), ($958, $959, $960, $961, $962, $963, $964, $965, $966, $967, $968), ($969, $970, $971, $972, $973, $974, $975, $976, $977, $978, $979), ($980, $981, $982, $983, $984, $985, $986, $987, $988, $989, $990), ($991, $992, $993, $994, $995, $996, $997, $998, $999, $1000, $1001), ($1002, $1003, $1004, $1005, $1006, $1007, $1008, $1009, $1010, $1011, $1012), ($1013, $1014, $1015, $1016, $1017, $1018, $1019, $1020, $1021, $1022, $1023), ($1024, $1025, $1026, $1027, $1028, $1029, $1030, $1031, $1032, $1033, $1034), ($1035, $1036, $1037, $1038, $1039, $1040, $1041, $1042, $1043, $1044, $1045), ($1046, $1047, $1048, $1049, $1050, $1051, $1052, $1053, $1054, $1055, $1056), ($1057, $1058, $1059, $1060, $1061, $1062, $1063, $1064, $1065, $1066, $1067), ($1068, $1069, $1070, $1071, $1072, $1073, $1074, $1075, $1076, $1077, $1078), ($1079, $1080, $1081, $1082, $1083, $1084, $1085, $1086, $1087, $1088, $1089), ($1090, $1091, $1092, $1093, $1094, $1095, $1096, $1097, $1098, $1099, $1100), ($1101, $1102, $1103, $1104, $1105, $1106, $1107, $1108, $1109, $1110, $1111), ($1112, $1113, $1114, $1115, $1116, $1117, $1118, $1119, $1120, $1121, $1122), ($1123, $1124, $1125, $1126, $1127, $1128, $1129, $1130, $1131, $1132, $1133), ($1134, $1135, $1136, $1137, $1138, $1139, $1140, $1141, $1142, $1143, $1144), ($1145, $1146, $1147, $1148, $1149, $1150, $1151, $1152, $1153, $1154, $1155), ($1156, $1157, $1158, $1159, $1160, $1161, $1162, $1163, $1164, $1165, $1166), ($1167, $1168, $1169, $1170, $1171, $1172, $1173, $1174, $1175, $1176, $1177), ($1178, $1179, $1180, $1181, $1182, $1183, $1184, $1185, $1186, $1187, $1188), ($1189, $1190, $1191, $1192, $1193, $1194, $1195, $1196, $1197, $1198, $1199), ($1200, $1201, $1202, $1203, $1204, $1205, $1206, $1207, $1208, $1209, $1210), ($1211, $1212, $1213, $1214, $1215, $1216, $1217, $1218, $1219, $1220, $1221), ($1222, $1223, $1224, $1225, $1226, $1227, $1228, $1229, $1230, $1231, $1232), ($1233, $1234, $1235, $1236, $1237, $1238, $1239, $1240, $1241, $1242, $1243), ($1244, $1245, $1246, $1247, $1248, $1249, $1250, $1251, $1252, $1253, $1254), ($1255, $1256, $1257, $1258, $1259, $1260, $1261, $1262, $1263, $1264, $1265), ($1266, $1267, $1268, $1269, $1270, $1271, $1272, $1273, $1274, $1275, $1276), ($1277, $1278, $1279, $1280, $1281, $1282, $1283, $1284, $1285, $1286, $1287), ($1288, $1289, $1290, $1291, $1292, $1293, $1294, $1295, $1296, $1297, $1298), ($1299, $1300, $1301, $1302, $1303, $1304, $1305, $1306, $1307, $1308, $1309), ($1310, $1311, $1312, $1313, $1314, $1315, $1316, $1317, $1318, $1319, $1320), ($1321, $1322, $1323, $1324, $1325, $1326, $1327, $1328, $1329, $1330, $1331), ($1332, $1333, $1334, $1335, $1336, $1337, $1338, $1339, $1340, $1341, $1342), ($1343, $1344, $1345, $1346, $1347, $1348, $1349, $1350, $1351, $1352, $1353), ($1354, $1355, $1356, $1357, $1358, $1359, $1360, $1361, $1362, $1363, $1364), ($1365, $1366, $1367, $1368, $1369, $1370, $1371, $1372, $1373, $1374, $1375), ($1376, $1377, $1378, $1379, $1380, $1381, $1382, $1383, $1384, $1385, $1386), ($1387, $1388, $1389, $1390, $1391, $1392, $1393, $1394, $1395, $1396, $1397), ($1398, $1399, $1400, $1401, $1402, $1403, $1404, $1405, $1406, $1407, $1408), ($1409, $1410, $1411, $1412, $1413, $1414, $1415, $1416, $1417, $1418, $1419), ($1420, $1421, $1422, $1423, $1424, $1425, $1426, $1427, $1428, $1429, $1430), ($1431, $1432, $1433, $1434, $1435, $1436, $1437, $1438, $1439, $1440, $1441), ($1442, $1443, $1444, $1445, $1446, $1447, $1448, $1449, $1450, $1451, $1452), ($1453, $1454, $1455, $1456, $1457, $1458, $1459, $1460, $1461, $1462, $1463), ($1464, $1465, $1466, $1467, $1468, $1469, $1470, $1471, $1472, $1473, $1474), ($1475, $1476, $1477, $1478, $1479, $1480, $1481, $1482, $1483, $1484, $1485), ($1486, $1487, $1488, $1489, $1490, $1491, $1492, $1493, $1494, $1495, $1496), ($1497, $1498, $1499, $1500, $1501, $1502, $1503, $1504, $1505, $1506, $1507), ($1508, $1509, $1510, $1511, $1512, $1513, $1514, $1515, $1516, $1517, $1518), ($1519, $1520, $1521'... 429077 more characters, +immich-server | params: [ +immich-server | 2996048, +immich-server | 'Marcenais', +immich-server | 'Marcenais,Marcenas', +immich-server | 45.0582, +immich-server | -0.33756, +immich-server | 'FR', +immich-server | '75', +immich-server | '33', +immich-server | '2020-01-08', +immich-server | 'New Aquitaine', +immich-server | 'Gironde', +immich-server | 2996051, +immich-server | 'Marcellus', +immich-server | 'Marcel,Marcell,Marcellus,Markel,marukerrusu,Маркел,マルケッルス', +immich-server | 44.48049, +immich-server | 0.07766, +immich-server | 'FR', +immich-server | '75', +immich-server | '47', +immich-server | '2020-01-08', +immich-server | 'New Aquitaine', +immich-server | 'Lot-et-Garonne', +immich-server | 2996054, +immich-server | 'Marcellaz-Albanais', +immich-server | "Marcellatium Gebennensium,Marcellaz,Marcellaz-Albanais,Marsella-Al'bane,Марселла-Альбане", +immich-server | 45.87546, +immich-server | 5.9988, +immich-server | 'FR', +immich-server | '84', +immich-server | '74', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Haute-Savoie', +immich-server | 2996055, +immich-server | 'Marcellaz', +immich-server | 'Marcellatium Fulciniensium,Marcellaz,Marcellaz-en-Faucigny,Marsella,Марселла', +immich-server | 46.1466, +immich-server | 6.35552, +immich-server | 'FR', +immich-server | '84', +immich-server | '74', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Haute-Savoie', +immich-server | 2996058, +immich-server | 'Marcelcave', +immich-server | 'Marcelcave', +immich-server | 49.8507, +immich-server | 2.57425, +immich-server | 'FR', +immich-server | '32', +immich-server | '80', +immich-server | '2016-02-18', +immich-server | 'Hauts-de-France', +immich-server | 'Somme', +immich-server | 2996063, +immich-server | 'Marçay', +immich-server | 'Marcay,Marçay', +immich-server | 46.46276, +immich-server | 0.22715, +immich-server | 'FR', +immich-server | '75', +immich-server | '86', +immich-server | '2019-09-04', +immich-server | 'New Aquitaine', +immich-server | 'Vienne', +immich-server | 2996067, +immich-server | 'Marcamps', +immich-server | '', +immich-server | 45.04045, +immich-server | -0.49275, +immich-server | 'FR', +immich-server | '75', +immich-server | '33', +immich-server | '2016-02-18', +immich-server | 'New Aquitaine', +immich-server | 'Gironde', +immich-server | 2996074, +immich-server | 'Marboz', +immich-server | 'Marboz', +immich-server | 46.3429, +immich-server | 5.25722, +immich-server | 'FR', +immich-server | '84', +immich-server | '01', +immich-server | '2019-06-05', +immich-server | 'Rhône-Alpes', +immich-server | 'Ain', +immich-server | 2996075, +immich-server | 'Marboué', +immich-server | 'Marboue,Marboué', +immich-server | 48.11377, +immich-server | 1.3321, +immich-server | 'FR', +immich-server | '24', +immich-server | '28', +immich-server | '2016-02-18', +immich-server | 'Centre-Val de Loire', +immich-server | 'Eure-et-Loir', +immich-server | 2996081, +immich-server | ... 54900 more items +immich-server | ] +immich-server | } +immich-server | Query failed : { +immich-server | durationMs: 7.603375999999116, +immich-server | error: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | }, +immich-server | sql: 'SELECT pg_advisory_unlock($1)', +immich-server | params: [ 100 ] +immich-server | } +immich-server | [Nest] 7 - 09/30/2026, 1:58:29 PM  ERROR [Microservices:MetadataService] Unable to initialize reverse geocoding: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) +immich-server | Error: Metadata service init failed +immich-server | at MetadataService.init (/usr/src/app/server/dist/services/metadata.service.js:124:19) +immich-server | at process.processTicksAndRejections (node:internal/process/task_queues:104:5) +immich-server | at async MetadataService.onBootstrap (/usr/src/app/server/dist/services/metadata.service.js:103:9) +immich-server | at async EventRepository.onEvent (/usr/src/app/server/dist/repositories/event.repository.js:91:13) +immich-server | at async MicroservicesModule.onModuleInit (/usr/src/app/server/dist/app.module.js:100:9) +immich-server | at async callModuleInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/hooks/on-module-init.hook.js:51:9) +immich-server | at async NestApplication.callInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application-context.js:245:13) +immich-server | at async NestApplication.init (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:105:9) +immich-server | at async NestApplication.listen (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:177:13) +immich-server | at async bootstrap (/usr/src/app/server/dist/workers/microservices.js:27:5) { +immich-server | [cause]: Error: write CONNECTION_CLOSED immich-postgres:5432 +immich-server | at Socket.closed (file:///usr/src/app/server/node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js:453:57) +immich-server | at Socket.emit (node:events:509:28) +immich-server | at TCP. (node:net:351:12) { +immich-server | code: 'CONNECTION_CLOSED', +immich-server | errno: 'CONNECTION_CLOSED', +immich-server | address: [ 'immich-postgres' ], +immich-server | port: [ 5432 ] +immich-server | } +immich-server | } +immich-server | microservices worker error: Error: Metadata service init failed, stack: Error: Metadata service init failed +immich-server | at MetadataService.init (/usr/src/app/server/dist/services/metadata.service.js:124:19) +immich-server | at process.processTicksAndRejections (node:internal/process/task_queues:104:5) +immich-server | at async MetadataService.onBootstrap (/usr/src/app/server/dist/services/metadata.service.js:103:9) +immich-server | at async EventRepository.onEvent (/usr/src/app/server/dist/repositories/event.repository.js:91:13) +immich-server | at async MicroservicesModule.onModuleInit (/usr/src/app/server/dist/app.module.js:100:9) +immich-server | at async callModuleInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/hooks/on-module-init.hook.js:51:9) +immich-server | at async NestApplication.callInitHook (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application-context.js:245:13) +immich-server | at async NestApplication.init (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:105:9) +immich-server | at async NestApplication.listen (/usr/src/app/server/node_modules/.pnpm/@nestjs+core@11.2.1_@nestjs+common@11.2.1_reflect-metadata@0.2.2_rxjs@7.8.2_supports-co_7276fcaa7f620127746286baf9fc17f8/node_modules/@nestjs/core/nest-application.js:177:13) +immich-server | at async bootstrap (/usr/src/app/server/dist/workers/microservices.js:27:5) +immich-server | microservices worker exited with code 1 +immich-server | Killing api process +immich-server | Initializing Immich v3.2.2 +immich-server | Detected CPU Cores: 8 +immich-server | (node:7) ExperimentalWarning: WASI is an experimental feature and might change at any time +immich-server | (Use `node --trace-warnings ...` to show where the warning was created) +immich-server | Starting api worker +immich-server | Starting microservices worker +immich-server | (node:7) ExperimentalWarning: WASI is an experimental feature and might change at any time +immich-server | (Use `node --trace-warnings ...` to show where the warning was created) +immich-server | (node:29) ExperimentalWarning: WASI is an experimental feature and might change at any time +immich-server | (Use `node --trace-warnings ...` to show where the warning was created) +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  LOG [Microservices:WebsocketRepository] Initialized websocket server +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  LOG [Microservices:DatabaseRepository] targetLists=1, current=1 for clip_index of 0 rows +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  LOG [Microservices:DatabaseRepository] targetLists=1, current=1 for face_index of 0 rows +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  LOG [Microservices:DatabaseRepository] Running migrations +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  LOG [Microservices:DatabaseRepository] Finished running migrations +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  LOG [Microservices:DatabaseService] Checking for schema drift +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  WARN [Microservices:DatabaseService] Detected schema drift. For more information, see https://docs.immich.app/errors#schema-drift or run `immich-admin schema-check` +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_name" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin2_name" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin1_name" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  WARN [Microservices:DatabaseService]  - The index "geodata_places"."idx_geodata_places_alternate_names" is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  WARN [Microservices:DatabaseService]  - The constraint "geodata_places"."geodata_places_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  WARN [Microservices:DatabaseService]  - The constraint "naturalearth_countries"."naturalearth_countries_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  LOG [Microservices:StorageService] Verifying system mount folder checks, current state: {"mountChecks":{"thumbs":true,"upload":true,"backups":true,"library":true,"profile":true,"encoded-video":true}} +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  LOG [Microservices:StorageService] Successfully verified system mount folder checks +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  LOG [Microservices:MetadataService] Bootstrapping metadata service +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  LOG [Microservices:MetadataService] Initializing metadata service +immich-server | [Nest] 7 - 09/30/2026, 1:58:39 PM  LOG [Microservices:MapRepository] Initializing metadata repository +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:WebsocketRepository] Initialized websocket server +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:DatabaseRepository] targetLists=1, current=1 for clip_index of 0 rows +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:DatabaseRepository] targetLists=1, current=1 for face_index of 0 rows +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:DatabaseRepository] Running migrations +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:DatabaseRepository] Finished running migrations +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:DatabaseService] Checking for schema drift +immich-server | [Nest] 7 - 09/30/2026, 1:58:40 PM  LOG [Microservices:MapRepository] Starting geodata import +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  WARN [Api:DatabaseService] Detected schema drift. For more information, see https://docs.immich.app/errors#schema-drift or run `immich-admin schema-check` +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_name" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin2_name" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_admin1_name" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  WARN [Api:DatabaseService]  - The index "geodata_places"."idx_geodata_places_alternate_names" is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  WARN [Api:DatabaseService]  - The constraint "geodata_places"."geodata_places_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  WARN [Api:DatabaseService]  - The constraint "naturalearth_countries"."naturalearth_countries_pkey" (primary-key) is missing and needs to be created +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:StorageService] Verifying system mount folder checks, current state: {"mountChecks":{"thumbs":true,"upload":true,"backups":true,"library":true,"profile":true,"encoded-video":true}} +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:StorageService] Successfully verified system mount folder checks +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:ServerService] Feature Flags: { +immich-server | "smartSearch": true, +immich-server | "facialRecognition": true, +immich-server | "duplicateDetection": true, +immich-server | "map": true, +immich-server | "reverseGeocoding": true, +immich-server | "importFaces": false, +immich-server | "sidecar": true, +immich-server | "search": true, +immich-server | "trash": true, +immich-server | "oauth": false, +immich-server | "oauthAutoLaunch": false, +immich-server | "ocr": true, +immich-server | "passwordLogin": true, +immich-server | "configFile": false, +immich-server | "email": false, +immich-server | "realtimeTranscoding": false +immich-server | } +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:SystemConfigService] LogLevel=log (set via system config) +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:NestFactory] Starting Nest application... +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:InstanceLoader] BullModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:InstanceLoader] ClsModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:InstanceLoader] ClsCommonModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:InstanceLoader] OpenTelemetryModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:InstanceLoader] KyselyModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:InstanceLoader] OpenTelemetryCoreModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:InstanceLoader] DiscoveryModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:InstanceLoader] ClsRootModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:InstanceLoader] ClsPluginsModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:InstanceLoader] ScheduleModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:InstanceLoader] BullModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:InstanceLoader] BullModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:InstanceLoader] ApiModule dependencies initialized +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  WARN [Api:LegacyRouteConverter] Unsupported route path: "/api/*". In previous versions, the symbols ?, *, and + were used to denote optional or repeating path parameters. The latest version of "path-to-regexp" now requires the use of named parameters. For example, instead of using a route like /users/* to capture all routes starting with "/users", you should use /users/*path. For more details, refer to the migration guide. Attempting to auto-convert to "/api/{*path}"... +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] ApiKeyController {/api/api-keys}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id/rotate, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/api-keys/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] ActivityController {/api/activities}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/activities, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/activities, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/activities/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/activities/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] AlbumController {/api/albums}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/albums, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/albums, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/map-markers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/users, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/user/:userId, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/albums/:id/user/:userId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] AppController {/api}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/.well-known/immich, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/custom.css, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] AssetController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/jobs, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/copy, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/metadata, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/metadata, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/ocr, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata/:key, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/metadata/:key, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/edits, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/edits, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/edits, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] AssetFilesController {/api/asset-files}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/asset-files/:id/download, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] AssetMediaController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/original, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/thumbnail, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/playback, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/bulk-upload-check, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] AuthController {/api/auth}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/admin-sign-up, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/validateToken, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/change-password, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/logout, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/status, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/pin-code, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/session/unlock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/auth/session/lock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] AuthAdminController {/api/admin/auth}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/auth/unlink-all, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] ClusterGroupController {/api/cluster-groups}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests/:id/accept, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/requests/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/requests, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/requests, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/regenerate-people, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/cluster-groups/:id/leave, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] ConfigUserController {/api/config}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] ConfigAdminController {/api/admin/config}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/config, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] ConfigPublicController {/api/public/config}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/public/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/public/config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] DatabaseBackupController {/api/admin/database-backups}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/:filename, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/start-restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/database-backups/upload, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] DownloadController {/api/download}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/download/info, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/download/archive, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] DuplicateController {/api/duplicates}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/duplicates/resolve, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] FaceController {/api/faces}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/faces, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/faces, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/faces/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/faces/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] IntegrityAdminController {/api/admin/integrity}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/summary, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:id/file, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/integrity/report/:type/csv, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] JobController {/api/jobs}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/jobs/:name, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] LibraryController {/api/libraries}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/validate, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/libraries/:id/scan, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] MaintenanceController {/api/admin/maintenance}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/status, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/detect-install, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/maintenance, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] MapController {/api/map}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/map/markers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/map/reverse-geocode, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] MemoryController {/api/memories}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/memories, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/memories, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/memories/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] NotificationController {/api/notifications}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/notifications/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] NotificationAdminController {/api/admin/notifications}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications/test-email, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/notifications/templates/:name, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] OAuthController {/api/oauth}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/mobile-redirect, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/authorize, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/callback, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/link, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/unlink, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/oauth/backchannel-logout, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] PartnerController {/api/partners}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/partners, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/partners, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/partners/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] PersonController {/api/people}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/people, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/people, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/people, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/people, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/thumbnail, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/reassign, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/people/merge, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/people/:id/merge, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] PluginController {/api/plugins}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/methods, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/templates, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/plugins/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] QueueController {/api/queues}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/queues, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name/jobs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/queues/:name/jobs, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] SearchController {/api/search}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/search/metadata, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/search/statistics, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/search/random, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/search/large-assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/search/smart, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/search/explore, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/search/person, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/search/places, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/search/cities, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/search/suggestions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] ServerController {/api/server}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/server/about, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/server/apk-links, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/server/storage, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/server/ping, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version-history, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/server/features, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/server/config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/server/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/server/media-types, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/server/license, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/server/version-check, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] SessionController {/api/sessions}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/sessions/:id/lock, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] SharedLinkController {/api/shared-links}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/login, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/shared-links/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] StackController {/api/stacks}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/stacks/:id/assets/:assetId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] SyncController {/api/sync}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/stream, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/sync/ack, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] SystemConfigController {/api/system-config}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config/defaults, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/system-config/storage-template-options, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] SystemMetadataController {/api/system-metadata}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/admin-onboarding, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/admin-onboarding, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/reverse-geocoding-state, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/system-metadata/version-check-state, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] TagController {/api/tags}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/tags, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id/assets, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/tags/:id/assets, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] TimelineController {/api/timeline}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/timeline/buckets, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/timeline/bucket, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] TrashController {/api/trash}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/empty, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/trash/restore/assets, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] UserAdminController {/api/admin/users}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/calendar-heatmap, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/sessions, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/statistics, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/preferences, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/admin/users/:id/restore, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] UserController {/api/users}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/calendar-heatmap, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/preferences, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/license, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/me/onboarding, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/profile-image, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/profile-image, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/users/:id/profile-image, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] VideoStreamController {/api/assets}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/main.m3u8, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId/:variantIndex/playlist.m3u8, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId/:variantIndex/:filename, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/assets/:id/video/stream/:sessionId, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] ViewController {/api/view}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/view/folder/unique-paths, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/view/folder, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RoutesResolver] WorkflowController {/api/workflows}: +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows, POST} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/triggers, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id/share, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, PUT} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, PATCH} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id, DELETE} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:RouterExplorer] Mapped {/api/workflows/:id/logs, GET} route +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:NestApplication] Nest application successfully started +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:Bootstrap] Immich Server is listening on http://[::1]:2283 [v3.2.2] [production]  +immich-server | [Nest] 29 - 09/30/2026, 1:58:40 PM  LOG [Api:MachineLearningRepository] Machine learning server became healthy (http://immich-machine-learning:3003). diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/immich/bench/evidence/MV-immich/run.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich/bench/evidence/MV-immich/run.log new file mode 100644 index 00000000..9ef00b28 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich/bench/evidence/MV-immich/run.log @@ -0,0 +1,4 @@ +[11:50:20] scratch drive folders cleared before FROM (R-656): none existed +[11:50:20] MV-immich: deploying immich at FROM {'immich-server': 'ghcr.io/immich-app/immich-server:v3.2.2', 'immich-machine-learning': 'ghcr.io/immich-app/immich-machine-learning:v3.2.2', 'immich-postgres': 'ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0', 'immich-redis': 'redis:7-alpine'} +[11:58:41] FROM settled=False in 422.9s :: {"immich-machine-learning": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "immich-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "immich-redis": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "immich-server": {"status": "running", "health": "starting", "restarts": 0, "exit": 0}} +[11:58:41] FROM never became healthy — inconclusive, not a verdict about the upgrade \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/immich/bench/evidence/MV-immich/verdict.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich/bench/evidence/MV-immich/verdict.json new file mode 100644 index 00000000..ac721872 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/immich/bench/evidence/MV-immich/verdict.json @@ -0,0 +1,33 @@ +{ + "harness_version": 4, + "edge": "MV-immich", + "app": "immich", + "note": "night 2026-09-23 within-a-major move: immich-server=ghcr.io/immich-app/immich-server:v3.2.4, immich-machine-learning=ghcr.io/immich-app/immich-machine-learning:v3.2.4", + "from": { + "immich-server": "ghcr.io/immich-app/immich-server:v3.2.2", + "immich-machine-learning": "ghcr.io/immich-app/immich-machine-learning:v3.2.2", + "immich-postgres": "ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0", + "immich-redis": "redis:7-alpine" + }, + "to": { + "immich-server": "ghcr.io/immich-app/immich-server:v3.2.4", + "immich-machine-learning": "ghcr.io/immich-app/immich-machine-learning:v3.2.4", + "immich-postgres": "ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0", + "immich-redis": "redis:7-alpine" + }, + "verdict": "inconclusive", + "seed_read_before": false, + "seed_read_after": false, + "healthy_after": false, + "migration_observed": null, + "abort": "not-attempted", + "abort_detail": "FROM never settled: {\"immich-machine-learning\": {\"status\": \"running\", \"health\": \"healthy\", \"restarts\": 0, \"exit\": 0}, \"immich-postgres\": {\"status\": \"running\", \"health\": \"healthy\", \"restarts\": 0, \"exit\": 0}, \"immich-redis\": {\"status\": \"running\", \"health\": \"healthy\", \"restarts\": 0, \"exit\": 0}, \"immich-server\": {\"status\": \"running\", \"health\": \"starting\", \"restarts\": 0, \"exit\": 0}}", + "engine_state_after": null, + "memory": null, + "marks": [], + "duration_s": 501.7, + "measured_at": "2026-09-30T11:58:41Z", + "evidence": "evidence/MV-immich", + "scratch_cleared": [], + "total_s": 501.7 +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/MV-kimai.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/MV-kimai.log new file mode 100644 index 00000000..2842137a --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/MV-kimai.log @@ -0,0 +1,130 @@ +[11:11:45] scratch drive folders cleared before FROM (R-656): none existed +[11:11:45] MV-kimai: deploying kimai at FROM {'kimai': 'kimai/kimai2:apache-2.57.0', 'kimai-db': 'mariadb:11.8'} +[11:13:25] FROM settled=True in 61.8s :: {"kimai": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "kimai-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[11:13:25] fixture: the BOX walk's own (Kimai), through upgrade_boxport +[11:13:26] kimai: seeded user drill6e5c8939 +[11:13:26] kimai: readback found=True (control passed) +[11:13:26] C1 (seed reads back BEFORE): True +[11:13:27] MV-kimai: swapping to TO {'kimai': 'kimai/kimai2:2.67.0', 'kimai-db': 'mariadb:11.8'} +[11:13:52] TO up -d rc=0 +[11:14:23] TO settled=True in 31.1s :: {"kimai": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "kimai-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[11:14:24] engine state kimai-db: 11.8.9-MariaDB| This installation of MariaDB is already upgraded to 11.8.9-MariaDB. There is no need to run mariadb-upgrade again. [exit=1] +[11:14:24] migration lines observed: 3 +[11:14:24] kimai: readback found=True (control passed) +[11:14:24] RESULT (seed reads back AFTER): True +[11:14:24] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:8001 +[11:14:39] + 15s kimai=89M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=292 +[11:14:55] + 30s kimai=91M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=580 +[11:15:10] + 45s kimai=93M/384M peak=352M kills=0 rs=0 kimai-db=145M/256M peak=150M kills=0 rs=0 reqs=868 +[11:15:25] + 61s kimai=95M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=1156 +[11:15:40] + 76s kimai=95M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=1444 +[11:15:55] + 91s kimai=95M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=1732 +[11:16:10] + 106s kimai=95M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=2020 +[11:16:25] + 121s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=2308 +[11:16:41] + 136s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=145M/256M peak=150M kills=0 rs=0 reqs=2596 +[11:16:56] + 151s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=2888 +[11:17:11] + 167s kimai=95M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=3176 +[11:17:26] + 182s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=3464 +[11:17:41] + 197s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=3752 +[11:17:56] + 212s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=4040 +[11:18:11] + 227s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=4328 +[11:18:27] + 242s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=4616 +[11:18:42] + 257s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=4908 +[11:18:57] + 273s kimai=95M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=5196 +[11:19:12] + 288s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=5484 +[11:19:27] + 303s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=5772 +[11:19:42] + 318s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=6060 +[11:19:57] + 333s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=145M/256M peak=150M kills=0 rs=0 reqs=6348 +[11:20:13] + 348s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=6640 +[11:20:28] + 363s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=6928 +[11:20:43] + 379s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=7216 +[11:20:58] + 394s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=7504 +[11:21:13] + 409s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=7792 +[11:21:28] + 424s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=145M/256M peak=150M kills=0 rs=0 reqs=8080 +[11:21:43] + 439s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=8368 +[11:21:59] + 454s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=145M/256M peak=150M kills=0 rs=0 reqs=8656 +[11:22:14] + 469s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=8948 +[11:22:29] + 485s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=9236 +[11:22:44] + 500s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=9524 +[11:22:59] + 515s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=9812 +[11:23:14] + 530s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=145M/256M peak=150M kills=0 rs=0 reqs=10100 +[11:23:29] + 545s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=145M/256M peak=150M kills=0 rs=0 reqs=10388 +[11:23:45] + 560s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=10676 +[11:24:00] + 575s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=10968 +[11:24:15] + 590s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=11256 +[11:24:30] + 606s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=11544 +[11:24:30] memory watch: killed=False tight=[] requests=11544 codes={'302': 11544} +[11:24:30] MV-kimai: ABORT — putting the FROM images back +[11:25:04] kimai: readback found=True (control passed) +[11:25:04] ABORT: app came back in 31.0s; data present=True +{ + "harness_version": 4, + "edge": "MV-kimai", + "app": "kimai", + "note": "night 2026-09-23 within-a-major move: kimai=kimai/kimai2:2.67.0", + "from": { + "kimai": "kimai/kimai2:apache-2.57.0", + "kimai-db": "mariadb:11.8" + }, + "to": { + "kimai": "kimai/kimai2:2.67.0", + "kimai-db": "mariadb:11.8" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Kkimai | [notice] Migrating up to DoctrineMigrations\\Version20260804090000", + "abort": "starts-and-serves", + "abort_detail": null, + "engine_state_after": { + "kimai-db": { + "image": "mariadb:11.8", + "probe": "datadir version | the engine's own upgrade verdict", + "answer": "11.8.9-MariaDB| This installation of MariaDB is already upgraded to 11.8.9-MariaDB. There is no need to run mariadb-upgrade again. [exit=1]", + "probe_rc": 0 + } + }, + "memory": { + "soak_s": 605.9, + "requested_s": 600, + "requests": 11544, + "codes": { + "302": 11544 + }, + "first_kill": null, + "containers": { + "kimai": { + "limit": 402653184, + "peak": 369184768, + "peak_pct": 0.917, + "anon_peak_sampled": 24145920, + "anon_peak_pct": 0.06, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + }, + "kimai-db": { + "limit": 268435456, + "peak": 158269440, + "peak_pct": 0.59, + "anon_peak_sampled": 120901632, + "anon_peak_pct": 0.45, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 31.1, + "measured_at": "2026-09-30T11:25:04Z", + "evidence": "evidence/MV-kimai", + "scratch_cleared": [], + "files_changed": [], + "total_s": 799.4 +} diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/abort-states.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/abort-states.json new file mode 100644 index 00000000..c615e4fb --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/abort-states.json @@ -0,0 +1,14 @@ +{ + "kimai": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + }, + "kimai-db": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/compose-final.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/compose-final.log new file mode 100644 index 00000000..5f1030c2 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/compose-final.log @@ -0,0 +1,205 @@ +kimai-db | 2026-09-30 13:12:13+02:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.8.9+maria~ubu2404 started. +kimai-db | 2026-09-30 13:12:13+02:00 [Warn] [Entrypoint]: /sys/fs/cgroup///memory.pressure not writable, functionality unavailable to MariaDB +kimai-db | 2026-09-30 13:12:13+02:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' +kimai-db | 2026-09-30 13:12:13+02:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.8.9+maria~ubu2404 started. +kimai-db | 2026-09-30 13:12:13+02:00 [Note] [Entrypoint]: Initializing database files +kimai-db | 2026-09-30 13:12:13 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup). +kimai-db | create_uring failed: falling back to libaio +kimai-db | 2026-09-30 13:12:16+02:00 [Note] [Entrypoint]: Database files initialized +kimai-db | 2026-09-30 13:12:16+02:00 [Note] [Entrypoint]: Starting temporary server +kimai-db | 2026-09-30 13:12:16+02:00 [Note] [Entrypoint]: Waiting for server startup +kimai-db | 2026-09-30 13:12:16 0 [Note] Starting MariaDB 11.8.9-MariaDB-ubu2404 source revision bf9193a939f515e95dd8def1a5468088c91cede6 server_uid 2X9lEtAqXJ7OGXTRRlWUqiABEPA= as process 94 +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: Compressed tables use zlib 1.3 +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: Number of transaction pools: 1 +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions +kimai-db | 2026-09-30 13:12:16 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup). +kimai-db | create_uring failed: falling back to libaio +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: Using Linux native AIO +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: innodb_buffer_pool_size_max=8388608m, innodb_buffer_pool_size=128m +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: Completed initialization of buffer pool +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: File system buffers for log disabled (block size=512 bytes) +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: End of log at LSN=45568 +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: Opened 3 undo tablespaces +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: 128 rollback segments in 3 undo tablespaces are active. +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: Setting file './ibtmp1' size to 12.000MiB. Physically writing the file full; Please wait ... +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB. +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: log sequence number 45568; transaction id 14 +kimai-db | 2026-09-30 13:12:16 0 [Note] Plugin 'FEEDBACK' is disabled. +kimai-db | 2026-09-30 13:12:16 0 [Note] Plugin 'wsrep-provider' is disabled. +kimai-db | 2026-09-30 13:12:17 0 [Note] mariadbd: Event Scheduler: Loaded 0 events +kimai-db | 2026-09-30 13:12:17 0 [Note] mariadbd: ready for connections. +kimai-db | Version: '11.8.9-MariaDB-ubu2404' socket: '/run/mysqld/mysqld.sock' port: 0 mariadb.org binary distribution +kimai-db | 2026-09-30 13:12:18+02:00 [Note] [Entrypoint]: Temporary server started. +kimai-db | 2026-09-30 13:12:20+02:00 [Note] [Entrypoint]: Creating database kimai +kimai-db | 2026-09-30 13:12:20+02:00 [Note] [Entrypoint]: Creating user kimai +kimai-db | 2026-09-30 13:12:20+02:00 [Note] [Entrypoint]: Giving user kimai access to schema kimai +kimai-db | 2026-09-30 13:12:20+02:00 [Note] [Entrypoint]: Securing system users (equivalent to running mysql_secure_installation) +kimai-db | +kimai-db | 2026-09-30 13:12:20+02:00 [Note] [Entrypoint]: Stopping temporary server +kimai-db | 2026-09-30 13:12:20 0 [Note] mariadbd (initiated by: unknown): Normal shutdown +kimai-db | 2026-09-30 13:12:20 0 [Note] InnoDB: FTS optimize thread exiting. +kimai-db | 2026-09-30 13:12:20 0 [Note] InnoDB: Starting shutdown... +kimai-db | 2026-09-30 13:12:20 0 [Note] InnoDB: Dumping buffer pool(s) to /var/lib/mysql/ib_buffer_pool +kimai-db | 2026-09-30 13:12:20 0 [Note] InnoDB: Buffer pool(s) dump completed at 260930 13:12:20 +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Removed temporary tablespace data file: "./ibtmp1" +kimai-db | 2026-09-30 13:12:21 0 [Note] Shutdown completed; log sequence number 45568; transaction id 15 +kimai-db | 2026-09-30 13:12:21 0 [Note] mariadbd: Shutdown complete +kimai-db | 2026-09-30 13:12:21+02:00 [Note] [Entrypoint]: Temporary server stopped +kimai-db | +kimai-db | 2026-09-30 13:12:21+02:00 [Note] [Entrypoint]: MariaDB init process done. Ready for start up. +kimai-db | +kimai-db | 2026-09-30 13:12:21 0 [Note] Starting MariaDB 11.8.9-MariaDB-ubu2404 source revision bf9193a939f515e95dd8def1a5468088c91cede6 server_uid 2X9lEtAqXJ7OGXTRRlWUqiABEPA= as process 1 +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Compressed tables use zlib 1.3 +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Number of transaction pools: 1 +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions +kimai-db | 2026-09-30 13:12:21 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup). +kimai-db | create_uring failed: falling back to libaio +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Using Linux native AIO +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: innodb_buffer_pool_size_max=8388608m, innodb_buffer_pool_size=128m +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Completed initialization of buffer pool +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: File system buffers for log disabled (block size=512 bytes) +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: End of log at LSN=45568 +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Opened 3 undo tablespaces +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: 128 rollback segments in 3 undo tablespaces are active. +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Setting file './ibtmp1' size to 12.000MiB. Physically writing the file full; Please wait ... +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB. +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: log sequence number 45568; transaction id 14 +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool +kimai-db | 2026-09-30 13:12:21 0 [Note] Plugin 'FEEDBACK' is disabled. +kimai-db | 2026-09-30 13:12:21 0 [Note] Plugin 'wsrep-provider' is disabled. +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Buffer pool(s) load completed at 260930 13:12:21 +kimai-db | 2026-09-30 13:12:22 0 [Note] Server socket created on IP: '0.0.0.0', port: '3306'. +kimai-db | 2026-09-30 13:12:22 0 [Note] Server socket created on IP: '::', port: '3306'. +kimai-db | 2026-09-30 13:12:22 0 [Note] mariadbd: Event Scheduler: Loaded 0 events +kimai-db | 2026-09-30 13:12:22 0 [Note] mariadbd: ready for connections. +kimai-db | Version: '11.8.9-MariaDB-ubu2404' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution +kimai | ++ cat /opt/kimai/version.txt +kimai | + KIMAI=2.57.0 +kimai | + echo 2.57.0 +kimai | 2.57.0 +kimai | + waitForDB +kimai | ++ awk -F '[/:@]' '{print $4}' +kimai | + DATABASE_USER=kimai +kimai | ++ awk -F '[/:@]' '{print $5}' +kimai | + DATABASE_PASS=QC7pCPNjkwRW9qTKcjQwsAHR +kimai | ++ awk -F '[/:@]' '{print $6}' +kimai | + DATABASE_HOST=kimai-db +kimai | ++ awk -F '[/:@]' '{print $7}' +kimai | + DATABASE_PORT=3306 +kimai | ++ awk -F '[/?]' '{print $4}' +kimai | + DATABASE_BASE=kimai +kimai | + re='^[0-9]+$' +kimai | + [[ 3306 =~ ^[0-9]+$ ]] +kimai | Wait for database connection ... +kimai | + echo 'Wait for database connection ...' +kimai | + php /dbtest.php kimai-db kimai 3306 kimai QC7pCPNjkwRW9qTKcjQwsAHR +kimai | + echo 'Connection established' +kimai | + handleStartup +kimai | + '[' -z 512M ']' +kimai | + sed -i 's/memory_limit.*/memory_limit=512M/g' /usr/local/etc/php/php.ini +kimai | Testing DB:Connection established +kimai | + cp /assets/monolog.yaml /opt/kimai/config/packages/monolog.yaml +kimai | + '[' -z '' ']' +kimai | ++ id -u www-data +kimai | + USER_ID=33 +kimai | + '[' -z '' ']' +kimai | ++ id -g www-data +kimai | + GROUP_ID=33 +kimai | + grep -w 33 /etc/group +kimai | + echo Group already exists +kimai | + id 33 +kimai | Group already exists +kimai | + echo User already exists +kimai | User already exists +kimai | + '[' -e /use_apache ']' +kimai | ++ id -nu 33 +kimai | + export APACHE_RUN_USER=www-data +kimai | + APACHE_RUN_USER=www-data +kimai | ++ id -ng 33 +kimai | + export APACHE_RUN_GROUP=www-data +kimai | + APACHE_RUN_GROUP=www-data +kimai | + export APACHE_PID_FILE=/var/run/apache2/apache2.pid +kimai | + APACHE_PID_FILE=/var/run/apache2/apache2.pid +kimai | + export APACHE_RUN_DIR=/var/run/apache2 +kimai | + APACHE_RUN_DIR=/var/run/apache2 +kimai | + export APACHE_LOCK_DIR=/var/lock/apache2 +kimai | + APACHE_LOCK_DIR=/var/lock/apache2 +kimai | + export APACHE_LOG_DIR=/var/log/apache2 +kimai | + APACHE_LOG_DIR=/var/log/apache2 +kimai | + export LANG=C +kimai | + LANG=C +kimai | + prepareKimai +kimai | + /opt/kimai/bin/console -n kimai:install +kimai | Start installation ... +kimai | Database `kimai` for connection named default already exists. Skipped. +kimai | Creating database ... +kimai | +kimai | [WARNING] You have 5 previously executed migrations in the database that are +kimai | not registered migrations. +kimai | +kimai | >> 2026-09-30 11:13:53 (DoctrineMigrations\Version20260530080724) +kimai | >> 2026-09-30 11:13:53 (DoctrineMigrations\Version20260802144517) +kimai | >> 2026-09-30 11:13:53 (DoctrineMigrations\Version20260802173206) +kimai | >> 2026-09-30 11:13:53 (DoctrineMigrations\Version20260802183206) +kimai | >> 2026-09-30 11:13:53 (DoctrineMigrations\Version20260804090000) +kimai | +kimai | [OK] Already at the latest version ("DoctrineMigrations\Version20260804090000") +kimai | +kimai | Rebuilding cache ... +kimai | +kimai | // Clearing the cache for the prod environment with debug false +kimai | +kimai | [2026-09-30T11:24:33.890453+00:00] deprecation.INFO: User Deprecated: Enabling the controller resolver automapping feature has been deprecated. Symfony Mapped Route Parameters should be used as replacement. (DoctrineExtension.php:934 called by DoctrineExtension.php:543, https://github.com/doctrine/DoctrineBundle/pull/1804, package doctrine/doctrine-bundle) {"exception":"[object] (ErrorException(code: 0): User Deprecated: Enabling the controller resolver automapping feature has been deprecated. Symfony Mapped Route Parameters should be used as replacement. (DoctrineExtension.php:934 called by DoctrineExtension.php:543, https://github.com/doctrine/DoctrineBundle/pull/1804, package doctrine/doctrine-bundle) at /opt/kimai/vendor/doctrine/deprecations/src/Deprecation.php:208)"} {"channel":"deprecation"} +kimai | [OK] Cache for the "prod" environment (debug=false) was successfully cleared. +kimai | +kimai | +kimai | // Warming up the cache for the prod environment with debug false +kimai | +kimai | [OK] Cache for the "prod" environment (debug=false) was successfully warmed. +kimai | +kimai | +kimai | [OK] Successfully installed Kimai version 2.57.0 🎉 +kimai | +kimai | + '[' '!' -z FTpK5idS5jEdsASZ ']' +kimai | + '[' '!' -a admin@example.com ']' +kimai | + /opt/kimai/bin/console kimai:user:create admin admin@example.com ROLE_SUPER_ADMIN FTpK5idS5jEdsASZ +kimai | +kimai | [ERROR] email: This e-mail address is already in use. +kimai | +kimai | [ERROR] username: The username is already used. +kimai | +kimai | + echo 2.57.0 +kimai | + echo 'Kimai is ready' +kimai | + runServer +kimai | Kimai is ready +kimai | + /opt/kimai/bin/console kimai:reload --env=prod +kimai | Validating config file syntax ... +kimai | +kimai | [OK] All 26 YAML files contain valid syntax. +kimai | +kimai | +kimai | +kimai | [OK] All 602 XLIFF files contain valid syntax. +kimai | +kimai | +kimai | Rebuilding your cache, please be patient ... +kimai | +kimai | // Clearing the cache for the prod environment with debug false +kimai | +kimai | [2026-09-30T11:24:45.073628+00:00] deprecation.INFO: User Deprecated: Enabling the controller resolver automapping feature has been deprecated. Symfony Mapped Route Parameters should be used as replacement. (DoctrineExtension.php:934 called by DoctrineExtension.php:543, https://github.com/doctrine/DoctrineBundle/pull/1804, package doctrine/doctrine-bundle) {"exception":"[object] (ErrorException(code: 0): User Deprecated: Enabling the controller resolver automapping feature has been deprecated. Symfony Mapped Route Parameters should be used as replacement. (DoctrineExtension.php:934 called by DoctrineExtension.php:543, https://github.com/doctrine/DoctrineBundle/pull/1804, package doctrine/doctrine-bundle) at /opt/kimai/vendor/doctrine/deprecations/src/Deprecation.php:208)"} {"channel":"deprecation"} +kimai | [OK] Cache for the "prod" environment (debug=false) was successfully cleared. +kimai | +kimai | +kimai | // Warming up the cache for the prod environment with debug false +kimai | +kimai | [OK] Cache for the "prod" environment (debug=false) was successfully warmed. +kimai | +kimai | +kimai | [OK] Kimai config was reloaded +kimai | +kimai | + chown -R 33:33 /opt/kimai/var +kimai | + '[' -e /use_apache ']' +kimai | + exec /usr/sbin/apache2 -D FOREGROUND +kimai | [Wed Sep 30 13:24:53.597808 2026] [mpm_prefork:notice] [pid 1:tid 1] AH00163: Apache/2.4.67 (Debian) configured -- resuming normal operations +kimai | [Wed Sep 30 13:24:53.597852 2026] [core:notice] [pid 1:tid 1] AH00094: Command line: '/usr/sbin/apache2 -D FOREGROUND' +kimai | localhost:8001 127.0.0.1 - - [30/Sep/2026:13:25:03 +0200] "GET / HTTP/1.1" 302 626 "-" "curl/7.88.1" diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/engine-state.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/engine-state.json new file mode 100644 index 00000000..4cf4325b --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/engine-state.json @@ -0,0 +1,8 @@ +{ + "kimai-db": { + "image": "mariadb:11.8", + "probe": "datadir version | the engine's own upgrade verdict", + "answer": "11.8.9-MariaDB| This installation of MariaDB is already upgraded to 11.8.9-MariaDB. There is no need to run mariadb-upgrade again. [exit=1]", + "probe_rc": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/files-after.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/files-after.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/files-after.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/files-before.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/files-before.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/files-before.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/memory-samples.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/memory-samples.json new file mode 100644 index 00000000..c1e49470 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/memory-samples.json @@ -0,0 +1,1122 @@ +[ + { + "t": 15.1, + "containers": { + "kimai": { + "limit": 402653184, + "current": 93745152, + "peak": 369184768, + "anon": 18862080, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153247744, + "peak": 158269440, + "anon": 120786944, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 292 + }, + { + "t": 30.3, + "containers": { + "kimai": { + "limit": 402653184, + "current": 96288768, + "peak": 369184768, + "anon": 20561920, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153554944, + "peak": 158269440, + "anon": 120766464, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 580 + }, + { + "t": 45.4, + "containers": { + "kimai": { + "limit": 402653184, + "current": 97812480, + "peak": 369184768, + "anon": 22368256, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 152850432, + "peak": 158269440, + "anon": 120766464, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 868 + }, + { + "t": 60.6, + "containers": { + "kimai": { + "limit": 402653184, + "current": 100020224, + "peak": 369184768, + "anon": 24113152, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153104384, + "peak": 158269440, + "anon": 120827904, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1156 + }, + { + "t": 75.7, + "containers": { + "kimai": { + "limit": 402653184, + "current": 100007936, + "peak": 369184768, + "anon": 24121344, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153440256, + "peak": 158269440, + "anon": 120827904, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1444 + }, + { + "t": 90.9, + "containers": { + "kimai": { + "limit": 402653184, + "current": 99733504, + "peak": 369184768, + "anon": 24125440, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153169920, + "peak": 158269440, + "anon": 120840192, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1732 + }, + { + "t": 106.0, + "containers": { + "kimai": { + "limit": 402653184, + "current": 99745792, + "peak": 369184768, + "anon": 24125440, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153239552, + "peak": 158269440, + "anon": 120840192, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2020 + }, + { + "t": 121.1, + "containers": { + "kimai": { + "limit": 402653184, + "current": 99233792, + "peak": 369184768, + "anon": 24125440, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153792512, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2308 + }, + { + "t": 136.3, + "containers": { + "kimai": { + "limit": 402653184, + "current": 99258368, + "peak": 369184768, + "anon": 24125440, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153038848, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2596 + }, + { + "t": 151.4, + "containers": { + "kimai": { + "limit": 402653184, + "current": 99442688, + "peak": 369184768, + "anon": 24125440, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153612288, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2888 + }, + { + "t": 166.6, + "containers": { + "kimai": { + "limit": 402653184, + "current": 99745792, + "peak": 369184768, + "anon": 24125440, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153321472, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3176 + }, + { + "t": 181.7, + "containers": { + "kimai": { + "limit": 402653184, + "current": 99475456, + "peak": 369184768, + "anon": 24129536, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153862144, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3464 + }, + { + "t": 196.8, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98705408, + "peak": 369184768, + "anon": 24129536, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153534464, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3752 + }, + { + "t": 212.0, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98955264, + "peak": 369184768, + "anon": 24129536, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153718784, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4040 + }, + { + "t": 227.1, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98701312, + "peak": 369184768, + "anon": 24129536, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153518080, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4328 + }, + { + "t": 242.3, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98697216, + "peak": 369184768, + "anon": 24129536, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153276416, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4616 + }, + { + "t": 257.4, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98697216, + "peak": 369184768, + "anon": 24129536, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153804800, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4908 + }, + { + "t": 272.6, + "containers": { + "kimai": { + "limit": 402653184, + "current": 99971072, + "peak": 369184768, + "anon": 24133632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153554944, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5196 + }, + { + "t": 287.7, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98975744, + "peak": 369184768, + "anon": 24133632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153513984, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5484 + }, + { + "t": 302.8, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98963456, + "peak": 369184768, + "anon": 24133632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153800704, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5772 + }, + { + "t": 318.0, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98930688, + "peak": 369184768, + "anon": 24133632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153268224, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6060 + }, + { + "t": 333.1, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98672640, + "peak": 369184768, + "anon": 24137728, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153014272, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6348 + }, + { + "t": 348.3, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98672640, + "peak": 369184768, + "anon": 24137728, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153780224, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6640 + }, + { + "t": 363.4, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98942976, + "peak": 369184768, + "anon": 24137728, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153567232, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6928 + }, + { + "t": 378.6, + "containers": { + "kimai": { + "limit": 402653184, + "current": 99454976, + "peak": 369184768, + "anon": 24137728, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153800704, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7216 + }, + { + "t": 393.7, + "containers": { + "kimai": { + "limit": 402653184, + "current": 99172352, + "peak": 369184768, + "anon": 24137728, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153796608, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7504 + }, + { + "t": 408.9, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98918400, + "peak": 369184768, + "anon": 24137728, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153280512, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7792 + }, + { + "t": 424.0, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98676736, + "peak": 369184768, + "anon": 24137728, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 152764416, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8080 + }, + { + "t": 439.1, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98676736, + "peak": 369184768, + "anon": 24137728, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153493504, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8368 + }, + { + "t": 454.3, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98709504, + "peak": 369184768, + "anon": 24141824, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153022464, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8656 + }, + { + "t": 469.4, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98951168, + "peak": 369184768, + "anon": 24141824, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153796608, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8948 + }, + { + "t": 484.6, + "containers": { + "kimai": { + "limit": 402653184, + "current": 99479552, + "peak": 369184768, + "anon": 24141824, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153272320, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9236 + }, + { + "t": 499.7, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98988032, + "peak": 369184768, + "anon": 24141824, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153509888, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9524 + }, + { + "t": 514.8, + "containers": { + "kimai": { + "limit": 402653184, + "current": 99209216, + "peak": 369184768, + "anon": 24141824, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153522176, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9812 + }, + { + "t": 530.0, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98975744, + "peak": 369184768, + "anon": 24141824, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153010176, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10100 + }, + { + "t": 545.1, + "containers": { + "kimai": { + "limit": 402653184, + "current": 99209216, + "peak": 369184768, + "anon": 24145920, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 152764416, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10388 + }, + { + "t": 560.2, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98897920, + "peak": 369184768, + "anon": 24145920, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153784320, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10676 + }, + { + "t": 575.4, + "containers": { + "kimai": { + "limit": 402653184, + "current": 98680832, + "peak": 369184768, + "anon": 24145920, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153526272, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10968 + }, + { + "t": 590.5, + "containers": { + "kimai": { + "limit": 402653184, + "current": 99143680, + "peak": 369184768, + "anon": 24145920, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153784320, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11256 + }, + { + "t": 605.7, + "containers": { + "kimai": { + "limit": 402653184, + "current": 99221504, + "peak": 369184768, + "anon": 24145920, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "kimai-db": { + "limit": 268435456, + "current": 153280512, + "peak": 158269440, + "anon": 120901632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11544 + } +] \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/migration-lines.txt b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/migration-lines.txt new file mode 100644 index 00000000..94177f84 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/migration-lines.txt @@ -0,0 +1,3 @@ +kimai | [notice] Migrating up to DoctrineMigrations\Version20260804090000 +kimai | [notice] finished in 537.7ms, used 26M memory, 5 migrations executed, 9 sql queries +kimai | [OK] Successfully migrated to version: DoctrineMigrations\Version20260804090000 \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/run.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/run.log new file mode 100644 index 00000000..2e67431a --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/run.log @@ -0,0 +1,59 @@ +[11:11:45] scratch drive folders cleared before FROM (R-656): none existed +[11:11:45] MV-kimai: deploying kimai at FROM {'kimai': 'kimai/kimai2:apache-2.57.0', 'kimai-db': 'mariadb:11.8'} +[11:13:25] FROM settled=True in 61.8s :: {"kimai": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "kimai-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[11:13:25] fixture: the BOX walk's own (Kimai), through upgrade_boxport +[11:13:26] kimai: seeded user drill6e5c8939 +[11:13:26] kimai: readback found=True (control passed) +[11:13:26] C1 (seed reads back BEFORE): True +[11:13:27] MV-kimai: swapping to TO {'kimai': 'kimai/kimai2:2.67.0', 'kimai-db': 'mariadb:11.8'} +[11:13:52] TO up -d rc=0 +[11:14:23] TO settled=True in 31.1s :: {"kimai": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "kimai-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[11:14:24] engine state kimai-db: 11.8.9-MariaDB| This installation of MariaDB is already upgraded to 11.8.9-MariaDB. There is no need to run mariadb-upgrade again. [exit=1] +[11:14:24] migration lines observed: 3 +[11:14:24] kimai: readback found=True (control passed) +[11:14:24] RESULT (seed reads back AFTER): True +[11:14:24] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:8001 +[11:14:39] + 15s kimai=89M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=292 +[11:14:55] + 30s kimai=91M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=580 +[11:15:10] + 45s kimai=93M/384M peak=352M kills=0 rs=0 kimai-db=145M/256M peak=150M kills=0 rs=0 reqs=868 +[11:15:25] + 61s kimai=95M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=1156 +[11:15:40] + 76s kimai=95M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=1444 +[11:15:55] + 91s kimai=95M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=1732 +[11:16:10] + 106s kimai=95M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=2020 +[11:16:25] + 121s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=2308 +[11:16:41] + 136s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=145M/256M peak=150M kills=0 rs=0 reqs=2596 +[11:16:56] + 151s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=2888 +[11:17:11] + 167s kimai=95M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=3176 +[11:17:26] + 182s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=3464 +[11:17:41] + 197s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=3752 +[11:17:56] + 212s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=4040 +[11:18:11] + 227s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=4328 +[11:18:27] + 242s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=4616 +[11:18:42] + 257s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=4908 +[11:18:57] + 273s kimai=95M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=5196 +[11:19:12] + 288s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=5484 +[11:19:27] + 303s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=5772 +[11:19:42] + 318s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=6060 +[11:19:57] + 333s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=145M/256M peak=150M kills=0 rs=0 reqs=6348 +[11:20:13] + 348s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=6640 +[11:20:28] + 363s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=6928 +[11:20:43] + 379s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=7216 +[11:20:58] + 394s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=7504 +[11:21:13] + 409s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=7792 +[11:21:28] + 424s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=145M/256M peak=150M kills=0 rs=0 reqs=8080 +[11:21:43] + 439s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=8368 +[11:21:59] + 454s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=145M/256M peak=150M kills=0 rs=0 reqs=8656 +[11:22:14] + 469s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=8948 +[11:22:29] + 485s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=9236 +[11:22:44] + 500s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=9524 +[11:22:59] + 515s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=9812 +[11:23:14] + 530s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=145M/256M peak=150M kills=0 rs=0 reqs=10100 +[11:23:29] + 545s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=145M/256M peak=150M kills=0 rs=0 reqs=10388 +[11:23:45] + 560s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=10676 +[11:24:00] + 575s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=10968 +[11:24:15] + 590s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=11256 +[11:24:30] + 606s kimai=94M/384M peak=352M kills=0 rs=0 kimai-db=146M/256M peak=150M kills=0 rs=0 reqs=11544 +[11:24:30] memory watch: killed=False tight=[] requests=11544 codes={'302': 11544} +[11:24:30] MV-kimai: ABORT — putting the FROM images back +[11:25:04] kimai: readback found=True (control passed) +[11:25:04] ABORT: app came back in 31.0s; data present=True \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/to-full.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/to-full.log new file mode 100644 index 00000000..51302a3f --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/to-full.log @@ -0,0 +1,136 @@ +kimai | 2.67.0 +kimai | Wait for database connection ... +kimai | Testing DB:Connection established +kimai | Group already exists +kimai | User already exists +kimai-db | 2026-09-30 13:12:13+02:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.8.9+maria~ubu2404 started. +kimai-db | 2026-09-30 13:12:13+02:00 [Warn] [Entrypoint]: /sys/fs/cgroup///memory.pressure not writable, functionality unavailable to MariaDB +kimai-db | 2026-09-30 13:12:13+02:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' +kimai-db | 2026-09-30 13:12:13+02:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.8.9+maria~ubu2404 started. +kimai-db | 2026-09-30 13:12:13+02:00 [Note] [Entrypoint]: Initializing database files +kimai-db | 2026-09-30 13:12:13 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup). +kimai-db | create_uring failed: falling back to libaio +kimai-db | 2026-09-30 13:12:16+02:00 [Note] [Entrypoint]: Database files initialized +kimai-db | 2026-09-30 13:12:16+02:00 [Note] [Entrypoint]: Starting temporary server +kimai-db | 2026-09-30 13:12:16+02:00 [Note] [Entrypoint]: Waiting for server startup +kimai | APP_SECRET: generated a new unique secret, persisted to var/data volume +kimai | Start installation ... +kimai | Database `kimai` for connection named default already exists. Skipped. +kimai | Creating database ... +kimai | [notice] Migrating up to DoctrineMigrations\Version20260804090000 +kimai | [notice] finished in 537.7ms, used 26M memory, 5 migrations executed, 9 sql queries +kimai | +kimai | [OK] Successfully migrated to version: DoctrineMigrations\Version20260804090000 +kimai | +kimai | +kimai | Rebuilding cache ... +kimai | +kimai | // Clearing the cache for the prod environment with debug false +kimai | +kimai | [2026-09-30T11:13:54.058953+00:00] deprecation.INFO: User Deprecated: Enabling the controller resolver automapping feature has been deprecated. Symfony Mapped Route Parameters should be used as replacement. (DoctrineExtension.php:943 called by DoctrineExtension.php:544, https://github.com/doctrine/DoctrineBundle/pull/1804, package doctrine/doctrine-bundle) {"exception":"[object] (ErrorException(code: 0): User Deprecated: Enabling the controller resolver automapping feature has been deprecated. Symfony Mapped Route Parameters should be used as replacement. (DoctrineExtension.php:943 called by DoctrineExtension.php:544, https://github.com/doctrine/DoctrineBundle/pull/1804, package doctrine/doctrine-bundle) at /opt/kimai/vendor/doctrine/deprecations/src/Deprecation.php:208)"} {"channel":"deprecation"} +kimai | [OK] Cache for the "prod" environment (debug=false) was successfully cleared. +kimai | +kimai | +kimai | // Warming up the cache for the prod environment with debug false +kimai-db | 2026-09-30 13:12:16 0 [Note] Starting MariaDB 11.8.9-MariaDB-ubu2404 source revision bf9193a939f515e95dd8def1a5468088c91cede6 server_uid 2X9lEtAqXJ7OGXTRRlWUqiABEPA= as process 94 +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: Compressed tables use zlib 1.3 +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: Number of transaction pools: 1 +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions +kimai-db | 2026-09-30 13:12:16 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup). +kimai | +kimai | [OK] Cache for the "prod" environment (debug=false) was successfully warmed. +kimai | +kimai-db | create_uring failed: falling back to libaio +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: Using Linux native AIO +kimai | +kimai | [OK] Successfully installed Kimai version 2.67.0 🎉 +kimai | +kimai | +kimai | ! [NOTE] User "admin" already exists, skipping creation. +kimai | +kimai | Kimai is ready +kimai | Validating config file syntax ... +kimai | +kimai | [OK] All 26 YAML files contain valid syntax. +kimai | +kimai | +kimai | +kimai | [OK] All 616 XLIFF files contain valid syntax. +kimai | +kimai | +kimai | Rebuilding your cache, please be patient ... +kimai | +kimai | // Clearing the cache for the prod environment with debug false +kimai | +kimai | [2026-09-30T11:14:07.291020+00:00] deprecation.INFO: User Deprecated: Enabling the controller resolver automapping feature has been deprecated. Symfony Mapped Route Parameters should be used as replacement. (DoctrineExtension.php:943 called by DoctrineExtension.php:544, https://github.com/doctrine/DoctrineBundle/pull/1804, package doctrine/doctrine-bundle) {"exception":"[object] (ErrorException(code: 0): User Deprecated: Enabling the controller resolver automapping feature has been deprecated. Symfony Mapped Route Parameters should be used as replacement. (DoctrineExtension.php:943 called by DoctrineExtension.php:544, https://github.com/doctrine/DoctrineBundle/pull/1804, package doctrine/doctrine-bundle) at /opt/kimai/vendor/doctrine/deprecations/src/Deprecation.php:208)"} {"channel":"deprecation"} +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: innodb_buffer_pool_size_max=8388608m, innodb_buffer_pool_size=128m +kimai | [OK] Cache for the "prod" environment (debug=false) was successfully cleared. +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: Completed initialization of buffer pool +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: File system buffers for log disabled (block size=512 bytes) +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: End of log at LSN=45568 +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: Opened 3 undo tablespaces +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: 128 rollback segments in 3 undo tablespaces are active. +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: Setting file './ibtmp1' size to 12.000MiB. Physically writing the file full; Please wait ... +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB. +kimai-db | 2026-09-30 13:12:16 0 [Note] InnoDB: log sequence number 45568; transaction id 14 +kimai-db | 2026-09-30 13:12:16 0 [Note] Plugin 'FEEDBACK' is disabled. +kimai-db | 2026-09-30 13:12:16 0 [Note] Plugin 'wsrep-provider' is disabled. +kimai-db | 2026-09-30 13:12:17 0 [Note] mariadbd: Event Scheduler: Loaded 0 events +kimai-db | 2026-09-30 13:12:17 0 [Note] mariadbd: ready for connections. +kimai-db | Version: '11.8.9-MariaDB-ubu2404' socket: '/run/mysqld/mysqld.sock' port: 0 mariadb.org binary distribution +kimai-db | 2026-09-30 13:12:18+02:00 [Note] [Entrypoint]: Temporary server started. +kimai-db | 2026-09-30 13:12:20+02:00 [Note] [Entrypoint]: Creating database kimai +kimai-db | 2026-09-30 13:12:20+02:00 [Note] [Entrypoint]: Creating user kimai +kimai-db | 2026-09-30 13:12:20+02:00 [Note] [Entrypoint]: Giving user kimai access to schema kimai +kimai | +kimai | +kimai | // Warming up the cache for the prod environment with debug false +kimai | +kimai | [OK] Cache for the "prod" environment (debug=false) was successfully warmed. +kimai | +kimai | +kimai | [OK] Kimai config was reloaded +kimai | +kimai-db | 2026-09-30 13:12:20+02:00 [Note] [Entrypoint]: Securing system users (equivalent to running mysql_secure_installation) +kimai | [Wed Sep 30 13:14:14.862222 2026] [mpm_prefork:notice] [pid 1:tid 1] AH00163: Apache/2.4.68 (Debian) configured -- resuming normal operations +kimai | [Wed Sep 30 13:14:14.862264 2026] [core:notice] [pid 1:tid 1] AH00094: Command line: '/usr/sbin/apache2 -D FOREGROUND' +kimai | localhost:8001 127.0.0.1 - - [30/Sep/2026:13:14:22 +0200] "GET / HTTP/1.1" 302 626 "-" "curl/7.88.1" +kimai-db | +kimai-db | 2026-09-30 13:12:20+02:00 [Note] [Entrypoint]: Stopping temporary server +kimai-db | 2026-09-30 13:12:20 0 [Note] mariadbd (initiated by: unknown): Normal shutdown +kimai-db | 2026-09-30 13:12:20 0 [Note] InnoDB: FTS optimize thread exiting. +kimai-db | 2026-09-30 13:12:20 0 [Note] InnoDB: Starting shutdown... +kimai-db | 2026-09-30 13:12:20 0 [Note] InnoDB: Dumping buffer pool(s) to /var/lib/mysql/ib_buffer_pool +kimai-db | 2026-09-30 13:12:20 0 [Note] InnoDB: Buffer pool(s) dump completed at 260930 13:12:20 +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Removed temporary tablespace data file: "./ibtmp1" +kimai-db | 2026-09-30 13:12:21 0 [Note] Shutdown completed; log sequence number 45568; transaction id 15 +kimai-db | 2026-09-30 13:12:21 0 [Note] mariadbd: Shutdown complete +kimai-db | 2026-09-30 13:12:21+02:00 [Note] [Entrypoint]: Temporary server stopped +kimai-db | +kimai-db | 2026-09-30 13:12:21+02:00 [Note] [Entrypoint]: MariaDB init process done. Ready for start up. +kimai-db | +kimai-db | 2026-09-30 13:12:21 0 [Note] Starting MariaDB 11.8.9-MariaDB-ubu2404 source revision bf9193a939f515e95dd8def1a5468088c91cede6 server_uid 2X9lEtAqXJ7OGXTRRlWUqiABEPA= as process 1 +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Compressed tables use zlib 1.3 +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Number of transaction pools: 1 +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions +kimai-db | 2026-09-30 13:12:21 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup). +kimai-db | create_uring failed: falling back to libaio +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Using Linux native AIO +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: innodb_buffer_pool_size_max=8388608m, innodb_buffer_pool_size=128m +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Completed initialization of buffer pool +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: File system buffers for log disabled (block size=512 bytes) +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: End of log at LSN=45568 +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Opened 3 undo tablespaces +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: 128 rollback segments in 3 undo tablespaces are active. +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Setting file './ibtmp1' size to 12.000MiB. Physically writing the file full; Please wait ... +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB. +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: log sequence number 45568; transaction id 14 +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool +kimai-db | 2026-09-30 13:12:21 0 [Note] Plugin 'FEEDBACK' is disabled. +kimai-db | 2026-09-30 13:12:21 0 [Note] Plugin 'wsrep-provider' is disabled. +kimai-db | 2026-09-30 13:12:21 0 [Note] InnoDB: Buffer pool(s) load completed at 260930 13:12:21 +kimai-db | 2026-09-30 13:12:22 0 [Note] Server socket created on IP: '0.0.0.0', port: '3306'. +kimai-db | 2026-09-30 13:12:22 0 [Note] Server socket created on IP: '::', port: '3306'. +kimai-db | 2026-09-30 13:12:22 0 [Note] mariadbd: Event Scheduler: Loaded 0 events +kimai-db | 2026-09-30 13:12:22 0 [Note] mariadbd: ready for connections. +kimai-db | Version: '11.8.9-MariaDB-ubu2404' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/to-states.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/to-states.json new file mode 100644 index 00000000..c615e4fb --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/to-states.json @@ -0,0 +1,14 @@ +{ + "kimai": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + }, + "kimai-db": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/verdict.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/verdict.json new file mode 100644 index 00000000..103e807c --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/kimai/bench/evidence/MV-kimai/verdict.json @@ -0,0 +1,71 @@ +{ + "harness_version": 4, + "edge": "MV-kimai", + "app": "kimai", + "note": "night 2026-09-23 within-a-major move: kimai=kimai/kimai2:2.67.0", + "from": { + "kimai": "kimai/kimai2:apache-2.57.0", + "kimai-db": "mariadb:11.8" + }, + "to": { + "kimai": "kimai/kimai2:2.67.0", + "kimai-db": "mariadb:11.8" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Kkimai | [notice] Migrating up to DoctrineMigrations\\Version20260804090000", + "abort": "starts-and-serves", + "abort_detail": null, + "engine_state_after": { + "kimai-db": { + "image": "mariadb:11.8", + "probe": "datadir version | the engine's own upgrade verdict", + "answer": "11.8.9-MariaDB| This installation of MariaDB is already upgraded to 11.8.9-MariaDB. There is no need to run mariadb-upgrade again. [exit=1]", + "probe_rc": 0 + } + }, + "memory": { + "soak_s": 605.9, + "requested_s": 600, + "requests": 11544, + "codes": { + "302": 11544 + }, + "first_kill": null, + "containers": { + "kimai": { + "limit": 402653184, + "peak": 369184768, + "peak_pct": 0.917, + "anon_peak_sampled": 24145920, + "anon_peak_pct": 0.06, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + }, + "kimai-db": { + "limit": 268435456, + "peak": 158269440, + "peak_pct": 0.59, + "anon_peak_sampled": 120901632, + "anon_peak_pct": 0.45, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 31.1, + "measured_at": "2026-09-30T11:25:04Z", + "evidence": "evidence/MV-kimai", + "scratch_cleared": [], + "files_changed": [], + "total_s": 799.4 +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/MV-komga.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/MV-komga.log new file mode 100644 index 00000000..98aa2468 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/MV-komga.log @@ -0,0 +1,109 @@ +[12:17:55] scratch drive folders cleared before FROM (R-656): none existed +[12:17:55] MV-komga: deploying komga at FROM {'komga': 'gotson/komga:1.27.1'} +[12:18:38] FROM settled=True in 30.9s :: {"komga": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[12:18:38] fixture: the BOX walk's own (Komga), through upgrade_boxport +[12:18:39] komga: claimed the server as drille0fad8f6@example.invalid +[12:18:40] komga: readback found=True (http 200, control refused 401) +[12:18:40] C1 (seed reads back BEFORE): True +[12:18:40] MV-komga: swapping to TO {'komga': 'gotson/komga:1.28.0'} +[12:18:52] TO up -d rc=0 +[12:19:23] TO settled=True in 30.8s :: {"komga": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[12:19:23] migration lines observed: 6 +[12:19:24] komga: readback found=True (http 200, control refused 401) +[12:19:24] RESULT (seed reads back AFTER): True +[12:19:24] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:25600 +[12:19:39] + 15s komga=481M/768M peak=481M kills=0 rs=0 reqs=288 +[12:19:54] + 30s komga=487M/768M peak=489M kills=0 rs=0 reqs=584 +[12:20:09] + 45s komga=490M/768M peak=490M kills=0 rs=0 reqs=880 +[12:20:25] + 60s komga=490M/768M peak=492M kills=0 rs=0 reqs=1177 +[12:20:40] + 76s komga=490M/768M peak=492M kills=0 rs=0 reqs=1476 +[12:20:55] + 91s komga=490M/768M peak=492M kills=0 rs=0 reqs=1776 +[12:21:10] + 106s komga=487M/768M peak=492M kills=0 rs=0 reqs=2072 +[12:21:25] + 121s komga=487M/768M peak=492M kills=0 rs=0 reqs=2368 +[12:21:40] + 136s komga=487M/768M peak=492M kills=0 rs=0 reqs=2668 +[12:21:55] + 151s komga=491M/768M peak=493M kills=0 rs=0 reqs=2964 +[12:22:10] + 166s komga=489M/768M peak=496M kills=0 rs=0 reqs=3260 +[12:22:26] + 181s komga=490M/768M peak=496M kills=0 rs=0 reqs=3560 +[12:22:41] + 197s komga=490M/768M peak=496M kills=0 rs=0 reqs=3856 +[12:22:56] + 212s komga=489M/768M peak=496M kills=0 rs=0 reqs=4156 +[12:23:11] + 227s komga=490M/768M peak=496M kills=0 rs=0 reqs=4452 +[12:23:26] + 242s komga=490M/768M peak=496M kills=0 rs=0 reqs=4752 +[12:23:41] + 257s komga=490M/768M peak=496M kills=0 rs=0 reqs=5048 +[12:23:56] + 272s komga=490M/768M peak=496M kills=0 rs=0 reqs=5344 +[12:24:11] + 287s komga=489M/768M peak=496M kills=0 rs=0 reqs=5644 +[12:24:26] + 302s komga=502M/768M peak=518M kills=0 rs=0 reqs=5940 +[12:24:42] + 318s komga=502M/768M peak=518M kills=0 rs=0 reqs=6240 +[12:24:57] + 333s komga=501M/768M peak=518M kills=0 rs=0 reqs=6536 +[12:25:12] + 348s komga=502M/768M peak=518M kills=0 rs=0 reqs=6836 +[12:25:27] + 363s komga=502M/768M peak=518M kills=0 rs=0 reqs=7136 +[12:25:42] + 378s komga=502M/768M peak=518M kills=0 rs=0 reqs=7432 +[12:25:57] + 393s komga=502M/768M peak=518M kills=0 rs=0 reqs=7732 +[12:26:12] + 408s komga=501M/768M peak=518M kills=0 rs=0 reqs=8032 +[12:26:27] + 423s komga=502M/768M peak=518M kills=0 rs=0 reqs=8328 +[12:26:43] + 438s komga=502M/768M peak=518M kills=0 rs=0 reqs=8628 +[12:26:58] + 454s komga=502M/768M peak=518M kills=0 rs=0 reqs=8924 +[12:27:13] + 469s komga=502M/768M peak=518M kills=0 rs=0 reqs=9224 +[12:27:28] + 484s komga=503M/768M peak=518M kills=0 rs=0 reqs=9524 +[12:27:43] + 499s komga=502M/768M peak=518M kills=0 rs=0 reqs=9820 +[12:27:58] + 514s komga=502M/768M peak=518M kills=0 rs=0 reqs=10120 +[12:28:13] + 529s komga=502M/768M peak=518M kills=0 rs=0 reqs=10416 +[12:28:28] + 544s komga=503M/768M peak=518M kills=0 rs=0 reqs=10716 +[12:28:43] + 559s komga=503M/768M peak=518M kills=0 rs=0 reqs=11012 +[12:28:59] + 574s komga=503M/768M peak=518M kills=0 rs=0 reqs=11312 +[12:29:14] + 590s komga=502M/768M peak=518M kills=0 rs=0 reqs=11612 +[12:29:29] + 605s komga=502M/768M peak=518M kills=0 rs=0 reqs=11908 +[12:29:29] memory watch: killed=False tight=[] requests=11908 codes={'200': 11908} +[12:29:29] MV-komga: ABORT — putting the FROM images back +[12:30:04] komga: readback found=True (http 200, control refused 401) +[12:30:04] ABORT: app came back in 30.8s; data present=True +{ + "harness_version": 4, + "edge": "MV-komga", + "app": "komga", + "note": "night 2026-09-23 within-a-major move: komga=gotson/komga:1.28.0", + "from": { + "komga": "gotson/komga:1.27.1" + }, + "to": { + "komga": "gotson/komga:1.28.0" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Kkomga | 2026-09-30T14:18:59.505+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 92 migrations (execution time 00:00.125s)", + "abort": "starts-and-serves", + "abort_detail": null, + "engine_state_after": null, + "memory": { + "soak_s": 604.9, + "requested_s": 600, + "requests": 11908, + "codes": { + "200": 11908 + }, + "first_kill": null, + "containers": { + "komga": { + "limit": 805306368, + "peak": 543981568, + "peak_pct": 0.675, + "anon_peak_sampled": 519663616, + "anon_peak_pct": 0.645, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 30.8, + "measured_at": "2026-09-30T12:30:04Z", + "evidence": "evidence/MV-komga", + "scratch_cleared": [], + "files_changed": [], + "total_s": 728.9 +} diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/abort-states.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/abort-states.json new file mode 100644 index 00000000..77448ad6 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/abort-states.json @@ -0,0 +1,8 @@ +{ + "komga": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/compose-final.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/compose-final.log new file mode 100644 index 00000000..da63b00f --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/compose-final.log @@ -0,0 +1,61 @@ +komga | kotlin-logging: initializing... active logger factory: Slf4jLoggerFactory +komga | Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts +komga | ____ __. +komga | | |/ _|____ _____ _________ +komga | | < / _ \ / \ / ___\__ \ +komga | | | ( <_> ) Y Y \/ /_/ > __ \_ +komga | |____|__ \____/|__|_| /\___ (____ / +komga | \/ \//_____/ \/ +komga | +komga | Version: 1.27.1 +komga | +komga | 2026-09-30T14:29:33.801+02:00 INFO 1 --- [ main] org.gotson.komga.ApplicationKt : Starting ApplicationKt v1.27.1 using Java 23.0.2 with PID 1 (/app/application.jar started by root in /app) +komga | 2026-09-30T14:29:33.804+02:00 INFO 1 --- [ main] org.gotson.komga.ApplicationKt : The following 1 profile is active: "docker" +komga | 2026-09-30T14:29:38.139+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteMainPoolRW - Starting... +komga | 2026-09-30T14:29:38.370+02:00 INFO 1 --- [ main] com.zaxxer.hikari.pool.HikariPool : SqliteMainPoolRW - Added connection org.sqlite.jdbc4.JDBC4Connection@7a600e21 +komga | 2026-09-30T14:29:38.372+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteMainPoolRW - Start completed. +komga | 2026-09-30T14:29:38.591+02:00 INFO 1 --- [ main] org.flywaydb.core.FlywayExecutor : Database: jdbc:sqlite:/config/database.sqlite (SQLite 3.53) +komga | 2026-09-30T14:29:38.709+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 92 migrations (execution time 00:00.086s) +komga | 2026-09-30T14:29:38.718+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema "main": 20260921111319 +komga | 2026-09-30T14:29:38.723+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbMigrate : Schema "main" is up to date. No migration necessary. +komga | 2026-09-30T14:29:39.467+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteMainPoolRO - Starting... +komga | 2026-09-30T14:29:39.470+02:00 INFO 1 --- [ main] com.zaxxer.hikari.pool.HikariPool : SqliteMainPoolRO - Added connection org.sqlite.jdbc4.JDBC4Connection@7cf166db +komga | 2026-09-30T14:29:39.471+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteMainPoolRO - Start completed. +komga | 2026-09-30T14:29:40.071+02:00 INFO 1 --- [ main] o.j.i.D.logVersionSupport : Version : Database version is supported by dialect SQLDialect.SQLITE: 3.53.2 +komga | 2026-09-30T14:29:40.364+02:00 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 25600 (http) +komga | 2026-09-30T14:29:40.386+02:00 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +komga | 2026-09-30T14:29:40.386+02:00 INFO 1 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.55] +komga | 2026-09-30T14:29:40.431+02:00 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +komga | 2026-09-30T14:29:40.432+02:00 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 6527 ms +komga | Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts +komga | 2026-09-30T14:29:41.095+02:00 INFO 1 --- [ main] o.g.k.i.kobo.KepubConverter : Kepub conversion available. kepubify path: /usr/bin/kepubify +komga | 2026-09-30T14:29:41.215+02:00 INFO 1 --- [ main] c.g.g.n.h.i.plugins.HeifLibraryLoader : Loaded libheif v1.21.2 +komga | 2026-09-30T14:29:41.232+02:00 INFO 1 --- [ main] c.g.g.n.j.i.plugins.JxlImageReaderSpi : Loaded libjxl v0.11.1 +komga | 2026-09-30T14:29:41.257+02:00 INFO 1 --- [ main] c.g.g.n.w.i.plugins.WebpImageReaderSpi : Loaded libwebp: decoder v1.5.0, demux v1.5.0 +komga | 2026-09-30T14:29:41.297+02:00 INFO 1 --- [ main] o.g.k.i.image.ImageConverter : Supported read formats: [JPG, JPEG 2000, tiff, bmp, PCX, bigtiff, gif, WBMP, PNG, RAW, JPEG, AVIF, PNM, BigTIFF, tif, TIFF, wbmp, jpeg, jpeg-lossless, jxl, jbig2, jpg, JPEG2000, BMP, pcx, GIF, Jpeg XL, heic, png, raw, BIGTIFF, heif, webp, JPEG-LOSSLESS, JBIG2, pnm, TIF, jpeg2000, WebP, HEIC, jpeg 2000, HEIF, avif] +komga | 2026-09-30T14:29:41.298+02:00 INFO 1 --- [ main] o.g.k.i.image.ImageConverter : Supported read mediaTypes: [image/vnd.wap.wbmp, image/jpeg, image/x-portable-graymap, image/bmp, image/gif, image/x-windows-pcx, image/x-pc-paintbrush, image/x-raw, image/webp, image/heif-sequence, image/x-pcx, image/heic-sequence, image/avif, image/x-portable-bitmap, image/heif, image/heic, image/png, image/x-jb2, image/pcx, image/x-windows-bmp, image/jpeg2000, image/x-bmp, image/jp2, image/x-png, image/x-portable-pixmap, image/tiff, image/x-tiff, image/x-jbig2, image/x-portable-anymap, image/jxl] +komga | 2026-09-30T14:29:41.299+02:00 INFO 1 --- [ main] o.g.k.i.image.ImageConverter : Supported write formats: [JPG, JPEG 2000, tiff, bmp, PCX, bigtiff, gif, WBMP, PNG, RAW, JPEG, AVIF, PNM, BigTIFF, tif, TIFF, wbmp, jpeg, jpg, JPEG2000, BMP, pcx, GIF, heic, png, raw, BIGTIFF, heif, pnm, TIF, jpeg2000, HEIC, jpeg 2000, HEIF, avif] +komga | 2026-09-30T14:29:41.299+02:00 INFO 1 --- [ main] o.g.k.i.image.ImageConverter : Supported write mediaTypes: [image/vnd.wap.wbmp, image/jpeg, image/x-portable-graymap, image/bmp, image/x-windows-pcx, image/gif, image/x-pc-paintbrush, image/x-raw, image/heif-sequence, image/x-pcx, image/heic-sequence, image/avif, image/x-portable-bitmap, image/heif, image/heic, image/png, image/pcx, image/x-windows-bmp, image/jpeg2000, image/x-bmp, image/jp2, image/x-png, image/x-portable-pixmap, image/tiff, image/x-tiff, image/x-portable-anymap] +komga | 2026-09-30T14:29:41.447+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteTasksPoolRW - Starting... +komga | 2026-09-30T14:29:41.450+02:00 INFO 1 --- [ main] com.zaxxer.hikari.pool.HikariPool : SqliteTasksPoolRW - Added connection org.sqlite.jdbc4.JDBC4Connection@45bde54d +komga | 2026-09-30T14:29:41.450+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteTasksPoolRW - Start completed. +komga | 2026-09-30T14:29:41.477+02:00 INFO 1 --- [ main] org.flywaydb.core.FlywayExecutor : Database: jdbc:sqlite:/config/tasks.sqlite (SQLite 3.53) +komga | 2026-09-30T14:29:41.481+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 1 migration (execution time 00:00.002s) +komga | 2026-09-30T14:29:41.483+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema "main": 20231013114850 +komga | 2026-09-30T14:29:41.483+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbMigrate : Schema "main" is up to date. No migration necessary. +komga | 2026-09-30T14:29:41.649+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteTasksPoolRO - Starting... +komga | 2026-09-30T14:29:41.650+02:00 INFO 1 --- [ main] com.zaxxer.hikari.pool.HikariPool : SqliteTasksPoolRO - Added connection org.sqlite.jdbc4.JDBC4Connection@70b037ac +komga | 2026-09-30T14:29:41.651+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteTasksPoolRO - Start completed. +komga | 2026-09-30T14:29:41.972+02:00 WARN 1 --- [ main] org.apache.lucene.store.MMapDirectory : You are running with Java 22 or later. To make full use of MMapDirectory, please update Apache Lucene. +komga | 2026-09-30T14:29:43.359+02:00 INFO 1 --- [ main] o.g.k.i.api.rest.FontsController : Fonts embedded: {OpenDyslexic=[class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Bold-Italic.woff], class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Bold-Italic.woff2], class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Bold.woff], class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Bold.woff2], class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Italic.woff], class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Italic.woff2], class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Regular.woff], class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Regular.woff2]]} +komga | 2026-09-30T14:29:43.360+02:00 INFO 1 --- [ main] o.g.k.i.api.rest.FontsController : Fonts discovered: {} +komga | 2026-09-30T14:29:43.711+02:00 INFO 1 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [public/index.html] +komga | 2026-09-30T14:29:44.306+02:00 INFO 1 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 18 endpoints beneath base path '/actuator' +komga | 2026-09-30T14:29:44.359+02:00 INFO 1 --- [ main] eAuthenticationProviderManagerConfigurer : Global AuthenticationManager configured with AuthenticationProvider bean with name apiKeyAuthenticationProvider +komga | 2026-09-30T14:29:45.194+02:00 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 25600 (http) with context path '/' +komga | 2026-09-30T14:29:45.200+02:00 INFO 1 --- [ main] org.gotson.komga.ApplicationKt : Started ApplicationKt in 12.202 seconds (process running for 12.835) +komga | 2026-09-30T14:29:45.236+02:00 INFO 1 --- [ scheduling-1] .AuthenticationActivityCleanupController : Remove authentication activity older than 2026-08-30T12:29:45.234642634 (UTC) +komga | 2026-09-30T14:29:45.293+02:00 INFO 1 --- [ task-4] o.g.k.i.scheduler.SearchIndexController : Lucene index version: 8 +komga | 2026-09-30T14:30:02.507+02:00 INFO 1 --- [io-25600-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +komga | 2026-09-30T14:30:02.508+02:00 INFO 1 --- [io-25600-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +komga | 2026-09-30T14:30:02.511+02:00 INFO 1 --- [io-25600-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/engine-state.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/engine-state.json new file mode 100644 index 00000000..ec747fa4 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/engine-state.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/files-after.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/files-after.json new file mode 100644 index 00000000..882d7de6 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/files-after.json @@ -0,0 +1,3 @@ +{ + "/srv/felhom-gate/hdd/userdata/media/comics": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/files-before.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/files-before.json new file mode 100644 index 00000000..882d7de6 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/files-before.json @@ -0,0 +1,3 @@ +{ + "/srv/felhom-gate/hdd/userdata/media/comics": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/memory-samples.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/memory-samples.json new file mode 100644 index 00000000..15c2c2a5 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/memory-samples.json @@ -0,0 +1,682 @@ +[ + { + "t": 15.1, + "containers": { + "komga": { + "limit": 805306368, + "current": 504692736, + "peak": 505094144, + "anon": 497016832, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 288 + }, + { + "t": 30.3, + "containers": { + "komga": { + "limit": 805306368, + "current": 511672320, + "peak": 513495040, + "anon": 503947264, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 584 + }, + { + "t": 45.4, + "containers": { + "komga": { + "limit": 805306368, + "current": 514011136, + "peak": 514445312, + "anon": 505987072, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 880 + }, + { + "t": 60.5, + "containers": { + "komga": { + "limit": 805306368, + "current": 514449408, + "peak": 516440064, + "anon": 506503168, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1177 + }, + { + "t": 75.6, + "containers": { + "komga": { + "limit": 805306368, + "current": 514203648, + "peak": 516440064, + "anon": 506712064, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1476 + }, + { + "t": 90.7, + "containers": { + "komga": { + "limit": 805306368, + "current": 514592768, + "peak": 516444160, + "anon": 506826752, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1776 + }, + { + "t": 105.9, + "containers": { + "komga": { + "limit": 805306368, + "current": 510853120, + "peak": 516444160, + "anon": 503279616, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2072 + }, + { + "t": 121.0, + "containers": { + "komga": { + "limit": 805306368, + "current": 510906368, + "peak": 516444160, + "anon": 503320576, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2368 + }, + { + "t": 136.1, + "containers": { + "komga": { + "limit": 805306368, + "current": 511676416, + "peak": 516444160, + "anon": 503345152, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2668 + }, + { + "t": 151.2, + "containers": { + "komga": { + "limit": 805306368, + "current": 515518464, + "peak": 517361664, + "anon": 507768832, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2964 + }, + { + "t": 166.3, + "containers": { + "komga": { + "limit": 805306368, + "current": 513593344, + "peak": 520753152, + "anon": 506355712, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3260 + }, + { + "t": 181.4, + "containers": { + "komga": { + "limit": 805306368, + "current": 513957888, + "peak": 520753152, + "anon": 506445824, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3560 + }, + { + "t": 196.6, + "containers": { + "komga": { + "limit": 805306368, + "current": 514121728, + "peak": 520753152, + "anon": 506482688, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3856 + }, + { + "t": 211.7, + "containers": { + "komga": { + "limit": 805306368, + "current": 513605632, + "peak": 520753152, + "anon": 506609664, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4156 + }, + { + "t": 226.8, + "containers": { + "komga": { + "limit": 805306368, + "current": 514641920, + "peak": 520753152, + "anon": 506638336, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4452 + }, + { + "t": 241.9, + "containers": { + "komga": { + "limit": 805306368, + "current": 514146304, + "peak": 520753152, + "anon": 506654720, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4752 + }, + { + "t": 257.0, + "containers": { + "komga": { + "limit": 805306368, + "current": 514179072, + "peak": 520753152, + "anon": 506654720, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5048 + }, + { + "t": 272.1, + "containers": { + "komga": { + "limit": 805306368, + "current": 514650112, + "peak": 520753152, + "anon": 506695680, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5344 + }, + { + "t": 287.3, + "containers": { + "komga": { + "limit": 805306368, + "current": 513228800, + "peak": 520753152, + "anon": 505446400, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5644 + }, + { + "t": 302.4, + "containers": { + "komga": { + "limit": 805306368, + "current": 526479360, + "peak": 543981568, + "anon": 518955008, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5940 + }, + { + "t": 317.5, + "containers": { + "komga": { + "limit": 805306368, + "current": 526909440, + "peak": 543981568, + "anon": 519041024, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6240 + }, + { + "t": 332.6, + "containers": { + "komga": { + "limit": 805306368, + "current": 526348288, + "peak": 543981568, + "anon": 519131136, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6536 + }, + { + "t": 347.7, + "containers": { + "komga": { + "limit": 805306368, + "current": 526479360, + "peak": 543981568, + "anon": 519233536, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6836 + }, + { + "t": 362.9, + "containers": { + "komga": { + "limit": 805306368, + "current": 527044608, + "peak": 543981568, + "anon": 519278592, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7136 + }, + { + "t": 378.0, + "containers": { + "komga": { + "limit": 805306368, + "current": 526753792, + "peak": 543981568, + "anon": 519282688, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7432 + }, + { + "t": 393.1, + "containers": { + "komga": { + "limit": 805306368, + "current": 526802944, + "peak": 543981568, + "anon": 519303168, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7732 + }, + { + "t": 408.2, + "containers": { + "komga": { + "limit": 805306368, + "current": 526303232, + "peak": 543981568, + "anon": 519303168, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8032 + }, + { + "t": 423.3, + "containers": { + "komga": { + "limit": 805306368, + "current": 526831616, + "peak": 543981568, + "anon": 519311360, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8328 + }, + { + "t": 438.5, + "containers": { + "komga": { + "limit": 805306368, + "current": 527028224, + "peak": 543981568, + "anon": 519581696, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8628 + }, + { + "t": 453.6, + "containers": { + "komga": { + "limit": 805306368, + "current": 526897152, + "peak": 543981568, + "anon": 519585792, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8924 + }, + { + "t": 468.7, + "containers": { + "komga": { + "limit": 805306368, + "current": 526594048, + "peak": 543981568, + "anon": 519585792, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9224 + }, + { + "t": 483.8, + "containers": { + "komga": { + "limit": 805306368, + "current": 527568896, + "peak": 543981568, + "anon": 519585792, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9524 + }, + { + "t": 498.9, + "containers": { + "komga": { + "limit": 805306368, + "current": 527097856, + "peak": 543981568, + "anon": 519585792, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9820 + }, + { + "t": 514.0, + "containers": { + "komga": { + "limit": 805306368, + "current": 526835712, + "peak": 543981568, + "anon": 519622656, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10120 + }, + { + "t": 529.2, + "containers": { + "komga": { + "limit": 805306368, + "current": 526905344, + "peak": 543981568, + "anon": 519622656, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10416 + }, + { + "t": 544.3, + "containers": { + "komga": { + "limit": 805306368, + "current": 527593472, + "peak": 543981568, + "anon": 519655424, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10716 + }, + { + "t": 559.4, + "containers": { + "komga": { + "limit": 805306368, + "current": 527478784, + "peak": 543981568, + "anon": 519655424, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11012 + }, + { + "t": 574.5, + "containers": { + "komga": { + "limit": 805306368, + "current": 527478784, + "peak": 543981568, + "anon": 519659520, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11312 + }, + { + "t": 589.6, + "containers": { + "komga": { + "limit": 805306368, + "current": 526991360, + "peak": 543981568, + "anon": 519663616, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11612 + }, + { + "t": 604.7, + "containers": { + "komga": { + "limit": 805306368, + "current": 526966784, + "peak": 543981568, + "anon": 519663616, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11908 + } +] \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/migration-lines.txt b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/migration-lines.txt new file mode 100644 index 00000000..7568e3e8 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/migration-lines.txt @@ -0,0 +1,6 @@ +komga | 2026-09-30T14:18:59.505+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 92 migrations (execution time 00:00.125s) +komga | 2026-09-30T14:18:59.514+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema "main": 20260921111319 +komga | 2026-09-30T14:18:59.520+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbMigrate : Schema "main" is up to date. No migration necessary. +komga | 2026-09-30T14:19:02.345+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 1 migration (execution time 00:00.002s) +komga | 2026-09-30T14:19:02.346+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema "main": 20231013114850 +komga | 2026-09-30T14:19:02.347+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbMigrate : Schema "main" is up to date. No migration necessary. \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/run.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/run.log new file mode 100644 index 00000000..20f3cb08 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/run.log @@ -0,0 +1,58 @@ +[12:17:55] scratch drive folders cleared before FROM (R-656): none existed +[12:17:55] MV-komga: deploying komga at FROM {'komga': 'gotson/komga:1.27.1'} +[12:18:38] FROM settled=True in 30.9s :: {"komga": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[12:18:38] fixture: the BOX walk's own (Komga), through upgrade_boxport +[12:18:39] komga: claimed the server as drille0fad8f6@example.invalid +[12:18:40] komga: readback found=True (http 200, control refused 401) +[12:18:40] C1 (seed reads back BEFORE): True +[12:18:40] MV-komga: swapping to TO {'komga': 'gotson/komga:1.28.0'} +[12:18:52] TO up -d rc=0 +[12:19:23] TO settled=True in 30.8s :: {"komga": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[12:19:23] migration lines observed: 6 +[12:19:24] komga: readback found=True (http 200, control refused 401) +[12:19:24] RESULT (seed reads back AFTER): True +[12:19:24] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:25600 +[12:19:39] + 15s komga=481M/768M peak=481M kills=0 rs=0 reqs=288 +[12:19:54] + 30s komga=487M/768M peak=489M kills=0 rs=0 reqs=584 +[12:20:09] + 45s komga=490M/768M peak=490M kills=0 rs=0 reqs=880 +[12:20:25] + 60s komga=490M/768M peak=492M kills=0 rs=0 reqs=1177 +[12:20:40] + 76s komga=490M/768M peak=492M kills=0 rs=0 reqs=1476 +[12:20:55] + 91s komga=490M/768M peak=492M kills=0 rs=0 reqs=1776 +[12:21:10] + 106s komga=487M/768M peak=492M kills=0 rs=0 reqs=2072 +[12:21:25] + 121s komga=487M/768M peak=492M kills=0 rs=0 reqs=2368 +[12:21:40] + 136s komga=487M/768M peak=492M kills=0 rs=0 reqs=2668 +[12:21:55] + 151s komga=491M/768M peak=493M kills=0 rs=0 reqs=2964 +[12:22:10] + 166s komga=489M/768M peak=496M kills=0 rs=0 reqs=3260 +[12:22:26] + 181s komga=490M/768M peak=496M kills=0 rs=0 reqs=3560 +[12:22:41] + 197s komga=490M/768M peak=496M kills=0 rs=0 reqs=3856 +[12:22:56] + 212s komga=489M/768M peak=496M kills=0 rs=0 reqs=4156 +[12:23:11] + 227s komga=490M/768M peak=496M kills=0 rs=0 reqs=4452 +[12:23:26] + 242s komga=490M/768M peak=496M kills=0 rs=0 reqs=4752 +[12:23:41] + 257s komga=490M/768M peak=496M kills=0 rs=0 reqs=5048 +[12:23:56] + 272s komga=490M/768M peak=496M kills=0 rs=0 reqs=5344 +[12:24:11] + 287s komga=489M/768M peak=496M kills=0 rs=0 reqs=5644 +[12:24:26] + 302s komga=502M/768M peak=518M kills=0 rs=0 reqs=5940 +[12:24:42] + 318s komga=502M/768M peak=518M kills=0 rs=0 reqs=6240 +[12:24:57] + 333s komga=501M/768M peak=518M kills=0 rs=0 reqs=6536 +[12:25:12] + 348s komga=502M/768M peak=518M kills=0 rs=0 reqs=6836 +[12:25:27] + 363s komga=502M/768M peak=518M kills=0 rs=0 reqs=7136 +[12:25:42] + 378s komga=502M/768M peak=518M kills=0 rs=0 reqs=7432 +[12:25:57] + 393s komga=502M/768M peak=518M kills=0 rs=0 reqs=7732 +[12:26:12] + 408s komga=501M/768M peak=518M kills=0 rs=0 reqs=8032 +[12:26:27] + 423s komga=502M/768M peak=518M kills=0 rs=0 reqs=8328 +[12:26:43] + 438s komga=502M/768M peak=518M kills=0 rs=0 reqs=8628 +[12:26:58] + 454s komga=502M/768M peak=518M kills=0 rs=0 reqs=8924 +[12:27:13] + 469s komga=502M/768M peak=518M kills=0 rs=0 reqs=9224 +[12:27:28] + 484s komga=503M/768M peak=518M kills=0 rs=0 reqs=9524 +[12:27:43] + 499s komga=502M/768M peak=518M kills=0 rs=0 reqs=9820 +[12:27:58] + 514s komga=502M/768M peak=518M kills=0 rs=0 reqs=10120 +[12:28:13] + 529s komga=502M/768M peak=518M kills=0 rs=0 reqs=10416 +[12:28:28] + 544s komga=503M/768M peak=518M kills=0 rs=0 reqs=10716 +[12:28:43] + 559s komga=503M/768M peak=518M kills=0 rs=0 reqs=11012 +[12:28:59] + 574s komga=503M/768M peak=518M kills=0 rs=0 reqs=11312 +[12:29:14] + 590s komga=502M/768M peak=518M kills=0 rs=0 reqs=11612 +[12:29:29] + 605s komga=502M/768M peak=518M kills=0 rs=0 reqs=11908 +[12:29:29] memory watch: killed=False tight=[] requests=11908 codes={'200': 11908} +[12:29:29] MV-komga: ABORT — putting the FROM images back +[12:30:04] komga: readback found=True (http 200, control refused 401) +[12:30:04] ABORT: app came back in 30.8s; data present=True \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/to-full.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/to-full.log new file mode 100644 index 00000000..fcdc4013 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/to-full.log @@ -0,0 +1,61 @@ +komga | kotlin-logging: initializing... active logger factory: Slf4jLoggerFactory +komga | Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts +komga | ____ __. +komga | | |/ _|____ _____ _________ +komga | | < / _ \ / \ / ___\__ \ +komga | | | ( <_> ) Y Y \/ /_/ > __ \_ +komga | |____|__ \____/|__|_| /\___ (____ / +komga | \/ \//_____/ \/ +komga | +komga | Version: 1.28.0 +komga | +komga | 2026-09-30T14:18:54.248+02:00 INFO 1 --- [ main] org.gotson.komga.ApplicationKt : Starting ApplicationKt v1.28.0 using Java 23.0.2 with PID 1 (/app/application.jar started by root in /app) +komga | 2026-09-30T14:18:54.252+02:00 INFO 1 --- [ main] org.gotson.komga.ApplicationKt : The following 1 profile is active: "docker" +komga | 2026-09-30T14:18:58.862+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteMainPoolRW - Starting... +komga | 2026-09-30T14:18:59.135+02:00 INFO 1 --- [ main] com.zaxxer.hikari.pool.HikariPool : SqliteMainPoolRW - Added connection org.sqlite.jdbc4.JDBC4Connection@5e5a2b74 +komga | 2026-09-30T14:18:59.137+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteMainPoolRW - Start completed. +komga | 2026-09-30T14:18:59.338+02:00 INFO 1 --- [ main] org.flywaydb.core.FlywayExecutor : Database: jdbc:sqlite:/config/database.sqlite (SQLite 3.53) +komga | 2026-09-30T14:18:59.505+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 92 migrations (execution time 00:00.125s) +komga | 2026-09-30T14:18:59.514+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema "main": 20260921111319 +komga | 2026-09-30T14:18:59.520+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbMigrate : Schema "main" is up to date. No migration necessary. +komga | 2026-09-30T14:19:00.272+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteMainPoolRO - Starting... +komga | 2026-09-30T14:19:00.275+02:00 INFO 1 --- [ main] com.zaxxer.hikari.pool.HikariPool : SqliteMainPoolRO - Added connection org.sqlite.jdbc4.JDBC4Connection@2ffaa711 +komga | 2026-09-30T14:19:00.276+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteMainPoolRO - Start completed. +komga | 2026-09-30T14:19:00.931+02:00 INFO 1 --- [ main] o.j.i.D.logVersionSupport : Version : Database version is supported by dialect SQLDialect.SQLITE: 3.53.2 +komga | 2026-09-30T14:19:01.253+02:00 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 25600 (http) +komga | 2026-09-30T14:19:01.272+02:00 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +komga | 2026-09-30T14:19:01.273+02:00 INFO 1 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.55] +komga | 2026-09-30T14:19:01.310+02:00 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +komga | 2026-09-30T14:19:01.311+02:00 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 6925 ms +komga | Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts +komga | 2026-09-30T14:19:01.972+02:00 INFO 1 --- [ main] o.g.k.i.kobo.KepubConverter : Kepub conversion available. kepubify path: /usr/bin/kepubify +komga | 2026-09-30T14:19:02.078+02:00 INFO 1 --- [ main] c.g.g.n.h.i.plugins.HeifLibraryLoader : Loaded libheif v1.21.2 +komga | 2026-09-30T14:19:02.118+02:00 INFO 1 --- [ main] c.g.g.n.j.i.plugins.JxlImageReaderSpi : Loaded libjxl v0.11.1 +komga | 2026-09-30T14:19:02.142+02:00 INFO 1 --- [ main] c.g.g.n.w.i.plugins.WebpImageReaderSpi : Loaded libwebp: decoder v1.5.0, demux v1.5.0 +komga | 2026-09-30T14:19:02.165+02:00 INFO 1 --- [ main] o.g.k.i.image.ImageConverter : Supported read formats: [JPG, JPEG 2000, tiff, bigtiff, PCX, bmp, gif, WBMP, PNG, RAW, JPEG, AVIF, PNM, BigTIFF, tif, TIFF, wbmp, jpeg, jxl, jbig2, jpeg-lossless, jpg, JPEG2000, pcx, BMP, GIF, Jpeg XL, heic, png, raw, BIGTIFF, heif, webp, JPEG-LOSSLESS, JBIG2, pnm, TIF, jpeg2000, WebP, HEIC, jpeg 2000, HEIF, avif] +komga | 2026-09-30T14:19:02.166+02:00 INFO 1 --- [ main] o.g.k.i.image.ImageConverter : Supported read mediaTypes: [image/vnd.wap.wbmp, image/jpeg, image/x-portable-graymap, image/bmp, image/gif, image/x-windows-pcx, image/x-pc-paintbrush, image/x-raw, image/webp, image/heif-sequence, image/x-pcx, image/heic-sequence, image/avif, image/x-portable-bitmap, image/heif, image/heic, image/x-jb2, image/png, image/pcx, image/x-windows-bmp, image/jpeg2000, image/x-bmp, image/jp2, image/x-png, image/x-portable-pixmap, image/tiff, image/x-tiff, image/x-jbig2, image/x-portable-anymap, image/jxl] +komga | 2026-09-30T14:19:02.166+02:00 INFO 1 --- [ main] o.g.k.i.image.ImageConverter : Supported write formats: [JPEG 2000, JPG, tiff, bigtiff, PCX, bmp, gif, WBMP, PNG, RAW, JPEG, AVIF, PNM, BigTIFF, tif, TIFF, wbmp, jpeg, jpg, JPEG2000, pcx, BMP, GIF, heic, png, raw, BIGTIFF, heif, pnm, TIF, jpeg2000, HEIC, jpeg 2000, HEIF, avif] +komga | 2026-09-30T14:19:02.167+02:00 INFO 1 --- [ main] o.g.k.i.image.ImageConverter : Supported write mediaTypes: [image/vnd.wap.wbmp, image/jpeg, image/x-portable-graymap, image/bmp, image/gif, image/x-windows-pcx, image/x-pc-paintbrush, image/x-raw, image/heif-sequence, image/x-pcx, image/heic-sequence, image/avif, image/x-portable-bitmap, image/heif, image/heic, image/png, image/pcx, image/x-windows-bmp, image/jpeg2000, image/jp2, image/x-bmp, image/x-png, image/x-portable-pixmap, image/tiff, image/x-tiff, image/x-portable-anymap] +komga | 2026-09-30T14:19:02.323+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteTasksPoolRW - Starting... +komga | 2026-09-30T14:19:02.324+02:00 INFO 1 --- [ main] com.zaxxer.hikari.pool.HikariPool : SqliteTasksPoolRW - Added connection org.sqlite.jdbc4.JDBC4Connection@349504d5 +komga | 2026-09-30T14:19:02.325+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteTasksPoolRW - Start completed. +komga | 2026-09-30T14:19:02.342+02:00 INFO 1 --- [ main] org.flywaydb.core.FlywayExecutor : Database: jdbc:sqlite:/config/tasks.sqlite (SQLite 3.53) +komga | 2026-09-30T14:19:02.345+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 1 migration (execution time 00:00.002s) +komga | 2026-09-30T14:19:02.346+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema "main": 20231013114850 +komga | 2026-09-30T14:19:02.347+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbMigrate : Schema "main" is up to date. No migration necessary. +komga | 2026-09-30T14:19:02.523+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteTasksPoolRO - Starting... +komga | 2026-09-30T14:19:02.525+02:00 INFO 1 --- [ main] com.zaxxer.hikari.pool.HikariPool : SqliteTasksPoolRO - Added connection org.sqlite.jdbc4.JDBC4Connection@421c4c3e +komga | 2026-09-30T14:19:02.525+02:00 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : SqliteTasksPoolRO - Start completed. +komga | 2026-09-30T14:19:02.816+02:00 WARN 1 --- [ main] org.apache.lucene.store.MMapDirectory : You are running with Java 22 or later. To make full use of MMapDirectory, please update Apache Lucene. +komga | 2026-09-30T14:19:04.559+02:00 INFO 1 --- [ main] o.g.k.i.api.rest.FontsController : Fonts embedded: {OpenDyslexic=[class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Bold-Italic.woff], class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Bold-Italic.woff2], class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Bold.woff], class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Bold.woff2], class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Italic.woff], class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Italic.woff2], class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Regular.woff], class path resource [embeddedFonts/OpenDyslexic/OpenDyslexic-Regular.woff2]]} +komga | 2026-09-30T14:19:04.560+02:00 INFO 1 --- [ main] o.g.k.i.api.rest.FontsController : Fonts discovered: {} +komga | 2026-09-30T14:19:04.934+02:00 INFO 1 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [public/index.html] +komga | 2026-09-30T14:19:05.541+02:00 INFO 1 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 18 endpoints beneath base path '/actuator' +komga | 2026-09-30T14:19:05.585+02:00 INFO 1 --- [ main] eAuthenticationProviderManagerConfigurer : Global AuthenticationManager configured with AuthenticationProvider bean with name apiKeyAuthenticationProvider +komga | 2026-09-30T14:19:06.390+02:00 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 25600 (http) with context path '/' +komga | 2026-09-30T14:19:06.395+02:00 INFO 1 --- [ main] org.gotson.komga.ApplicationKt : Started ApplicationKt in 13.215 seconds (process running for 13.828) +komga | 2026-09-30T14:19:06.417+02:00 INFO 1 --- [ scheduling-1] .AuthenticationActivityCleanupController : Remove authentication activity older than 2026-08-30T12:19:06.416060074 (UTC) +komga | 2026-09-30T14:19:06.499+02:00 INFO 1 --- [ task-2] o.g.k.i.scheduler.SearchIndexController : Lucene index version: 8 +komga | 2026-09-30T14:19:22.696+02:00 INFO 1 --- [io-25600-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +komga | 2026-09-30T14:19:22.697+02:00 INFO 1 --- [io-25600-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +komga | 2026-09-30T14:19:22.699+02:00 INFO 1 --- [io-25600-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/to-states.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/to-states.json new file mode 100644 index 00000000..77448ad6 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/to-states.json @@ -0,0 +1,8 @@ +{ + "komga": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/verdict.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/verdict.json new file mode 100644 index 00000000..6c56560d --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/komga/bench/evidence/MV-komga/verdict.json @@ -0,0 +1,51 @@ +{ + "harness_version": 4, + "edge": "MV-komga", + "app": "komga", + "note": "night 2026-09-23 within-a-major move: komga=gotson/komga:1.28.0", + "from": { + "komga": "gotson/komga:1.27.1" + }, + "to": { + "komga": "gotson/komga:1.28.0" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Kkomga | 2026-09-30T14:18:59.505+02:00 INFO 1 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 92 migrations (execution time 00:00.125s)", + "abort": "starts-and-serves", + "abort_detail": null, + "engine_state_after": null, + "memory": { + "soak_s": 604.9, + "requested_s": 600, + "requests": 11908, + "codes": { + "200": 11908 + }, + "first_kill": null, + "containers": { + "komga": { + "limit": 805306368, + "peak": 543981568, + "peak_pct": 0.675, + "anon_peak_sampled": 519663616, + "anon_peak_pct": 0.645, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 30.8, + "measured_at": "2026-09-30T12:30:04Z", + "evidence": "evidence/MV-komga", + "scratch_cleared": [], + "files_changed": [], + "total_s": 728.9 +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/MV-n8n.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/MV-n8n.log new file mode 100644 index 00000000..84691b7c --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/MV-n8n.log @@ -0,0 +1,109 @@ +[11:51:19] scratch drive folders cleared before FROM (R-656): none existed +[11:51:19] MV-n8n: deploying n8n at FROM {'n8n': 'n8nio/n8n:2.41.2'} +[11:52:48] FROM settled=True in 31.1s :: {"n8n": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[11:52:48] fixture: the BOX walk's own (N8n), through upgrade_boxport +[11:52:49] n8n: /rest/owner/setup http=200 +[11:52:49] n8n: login as the seeded owner http=200 ok=True +[11:52:49] C1 (seed reads back BEFORE): True +[11:52:49] MV-n8n: swapping to TO {'n8n': 'n8nio/n8n:2.42.1'} +[11:53:51] TO up -d rc=0 +[11:54:22] TO settled=True in 30.9s :: {"n8n": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[11:54:22] migration lines observed: 6 +[11:54:23] n8n: login as the seeded owner http=200 ok=True +[11:54:23] RESULT (seed reads back AFTER): True +[11:54:23] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.4:5678 +[11:54:38] + 15s n8n=443M/1536M peak=695M kills=0 rs=0 reqs=300 +[11:54:53] + 30s n8n=448M/1536M peak=695M kills=0 rs=0 reqs=596 +[11:55:09] + 45s n8n=453M/1536M peak=695M kills=0 rs=0 reqs=896 +[11:55:24] + 60s n8n=457M/1536M peak=695M kills=0 rs=0 reqs=1196 +[11:55:39] + 76s n8n=467M/1536M peak=695M kills=0 rs=0 reqs=1493 +[11:55:54] + 91s n8n=467M/1536M peak=695M kills=0 rs=0 reqs=1792 +[11:56:09] + 106s n8n=467M/1536M peak=695M kills=0 rs=0 reqs=2092 +[11:56:24] + 121s n8n=468M/1536M peak=695M kills=0 rs=0 reqs=2390 +[11:56:39] + 136s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=2690 +[11:56:55] + 151s n8n=474M/1536M peak=695M kills=0 rs=0 reqs=2988 +[11:57:10] + 166s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=3288 +[11:57:25] + 182s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=3588 +[11:57:40] + 197s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=3886 +[11:57:55] + 212s n8n=469M/1536M peak=695M kills=0 rs=0 reqs=4186 +[11:58:10] + 227s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=4484 +[11:58:25] + 242s n8n=472M/1536M peak=695M kills=0 rs=0 reqs=4784 +[11:58:40] + 257s n8n=474M/1536M peak=695M kills=0 rs=0 reqs=5082 +[11:58:56] + 272s n8n=472M/1536M peak=695M kills=0 rs=0 reqs=5382 +[11:59:11] + 287s n8n=472M/1536M peak=695M kills=0 rs=0 reqs=5680 +[11:59:26] + 302s n8n=472M/1536M peak=695M kills=0 rs=0 reqs=5978 +[11:59:41] + 318s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=6278 +[11:59:56] + 333s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=6576 +[12:00:11] + 348s n8n=472M/1536M peak=695M kills=0 rs=0 reqs=6876 +[12:00:26] + 363s n8n=473M/1536M peak=695M kills=0 rs=0 reqs=7174 +[12:00:41] + 378s n8n=472M/1536M peak=695M kills=0 rs=0 reqs=7474 +[12:00:56] + 393s n8n=472M/1536M peak=695M kills=0 rs=0 reqs=7772 +[12:01:12] + 408s n8n=473M/1536M peak=695M kills=0 rs=0 reqs=8070 +[12:01:27] + 423s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=8370 +[12:01:42] + 439s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=8668 +[12:01:57] + 454s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=8966 +[12:02:12] + 469s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=9266 +[12:02:27] + 484s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=9564 +[12:02:42] + 499s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=9862 +[12:02:57] + 514s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=10162 +[12:03:13] + 529s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=10462 +[12:03:28] + 544s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=10760 +[12:03:43] + 560s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=11058 +[12:03:58] + 575s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=11358 +[12:04:13] + 590s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=11658 +[12:04:28] + 605s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=11956 +[12:04:28] memory watch: killed=False tight=[] requests=11956 codes={'200': 11956} +[12:04:28] MV-n8n: ABORT — putting the FROM images back +[12:05:01] n8n: login as the seeded owner http=200 ok=True +[12:05:01] ABORT: app came back in 30.8s; data present=True +{ + "harness_version": 4, + "edge": "MV-n8n", + "app": "n8n", + "note": "night 2026-09-23 within-a-major move: n8n=n8nio/n8n:2.42.1", + "from": { + "n8n": "n8nio/n8n:2.41.2" + }, + "to": { + "n8n": "n8nio/n8n:2.42.1" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Kn8n | Migrations in progress, please do NOT stop the process.", + "abort": "starts-and-serves", + "abort_detail": null, + "engine_state_after": null, + "memory": { + "soak_s": 605.2, + "requested_s": 600, + "requests": 11956, + "codes": { + "200": 11956 + }, + "first_kill": null, + "containers": { + "n8n": { + "limit": 1610612736, + "peak": 729747456, + "peak_pct": 0.453, + "anon_peak_sampled": 369987584, + "anon_peak_pct": 0.23, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 30.9, + "measured_at": "2026-09-30T12:05:01Z", + "evidence": "evidence/MV-n8n", + "scratch_cleared": [], + "files_changed": [], + "total_s": 821.8 +} diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/abort-states.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/abort-states.json new file mode 100644 index 00000000..967db3cd --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/abort-states.json @@ -0,0 +1,8 @@ +{ + "n8n": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/compose-final.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/compose-final.log new file mode 100644 index 00000000..6595be89 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/compose-final.log @@ -0,0 +1,79 @@ +n8n | Initializing n8n process +n8n | n8n ready on ::, port 5678 +n8n | n8n Task Broker ready on 127.0.0.1, port 5679 +n8n | Failed to start Python task runner in internal mode. because Python 3 is missing from this system. Launching a Python runner in internal mode is intended only for debugging and is not recommended for production. Users are encouraged to deploy in external mode. See: https://docs.n8n.io/hosting/configuration/task-runners/#setting-up-external-mode +n8n | +n8n | There are deprecations related to your n8n setup. Please take the recommended actions to update your configuration: +n8n | - WEBHOOK_URL -> Use N8N_WEBHOOK_URL instead, which sets the base URL for both test and production webhooks. +n8n | - N8N_UNVERIFIED_PACKAGES_ENABLED -> The default for this variable will change to `false` in a future version. Set it to `true` explicitly to keep installing unverified community packages. +n8n | - N8N_RUNNERS_MODE -> Internal task runner mode is deprecated and will be removed in a future version. For isolation and scaling, run the task runner launcher as a separate process, set this variable to `external` and share `N8N_RUNNERS_AUTH_TOKEN` with the launcher. See https://docs.n8n.io/deploy/host-n8n/configure-n8n/set-up-task-runners +n8n | - N8N_RUNNERS_TASK_TIMEOUT -> The default for this variable will be reduced from 300 (5 minutes) to 60 (1 minute) in a future version. Set it explicitly to keep your current task timeout. +n8n | - N8N_COMPRESSION_NODE_MAX_DECOMPRESSED_SIZE_BYTES -> The default for this variable will be reduced from 2 GiB to 256 MiB in a future version. Set it explicitly to keep your current limit. +n8n | - N8N_COMPRESSION_NODE_MAX_ZIP_ENTRIES -> The default for this variable will be reduced from 5000 to 1000 in a future version. Set it explicitly to keep your current limit. +n8n | +n8n | [license SDK] Skipping renewal on init: license cert is not initialized +n8n | [runner:js] (node:20) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. +n8n | (Use `node --trace-warnings ...` to show where the warning was created) +n8n | Instance registered +n8n | Discovered 4 cluster checks +n8n | Registered runner "JS Task Runner" (e-wjW3NB0nBHrsA0zbdpj) +n8n | Recorded version change: 2.42.1 -> 2.41.2 +n8n | Sandbox: enabled=false provider=n8n-sandbox (from env) +n8n | Version: 2.41.2 +n8n | Building workflow dependency index... +n8n | Finished building workflow dependency index. Processed 0 draft workflows, 0 published workflows. +n8n | +n8n | Editor is now accessible via: +n8n | https://auto.gate.invalid +n8n | 2026-09-30T12:04:43.341Z [Rudder] error: Response error code: ECONNREFUSED +n8n | 2026-09-30T12:04:43.557Z [Rudder] error: Response error code: ECONNREFUSED +n8n | 2026-09-30T12:04:44.004Z [Rudder] error: Response error code: ECONNREFUSED +n8n | 2026-09-30T12:04:44.867Z [Rudder] error: Error: ECONNREFUSED +n8n | connect ECONNREFUSED 0.0.0.0:443 +n8n | Error: connect ECONNREFUSED 0.0.0.0:443 +n8n | at AxiosError.from (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:1355:24) +n8n | at RedirectableRequest.handleRequestError (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:4026:25) +n8n | at RedirectableRequest.emit (node:events:526:24) +n8n | at ClientRequest.eventHandlers. (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/follow-redirects@1.16.0_debug@4.4.3_supports-color@8.1.1_/node_modules/follow-redirects/index.js:56:24) +n8n | at ClientRequest.emit (node:events:514:20) +n8n | at emitErrorEvent (node:_http_client:114:11) +n8n | at TLSSocket.socketErrorListener (node:_http_client:768:5) +n8n | at TLSSocket.emit (node:events:526:24) +n8n | at emitErrorNT (node:internal/streams/destroy:170:8) +n8n | at emitErrorCloseNT (node:internal/streams/destroy:129:3) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5427:41) +n8n | at processTicksAndRejections (node:internal/process/task_queues:104:5) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5423:14) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5423:14) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5423:14) +n8n | +n8n | connect ECONNREFUSED 0.0.0.0:443 +n8n | Error: connect ECONNREFUSED 0.0.0.0:443 +n8n | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:2017:16) +n8n | +n8n | 2026-09-30T12:04:53.293Z [Rudder] error: Response error code: ECONNREFUSED +n8n | 2026-09-30T12:04:53.507Z [Rudder] error: Response error code: ECONNREFUSED +n8n | 2026-09-30T12:04:53.982Z [Rudder] error: Response error code: ECONNREFUSED +n8n | 2026-09-30T12:04:54.839Z [Rudder] error: Error: ECONNREFUSED +n8n | connect ECONNREFUSED 0.0.0.0:443 +n8n | Error: connect ECONNREFUSED 0.0.0.0:443 +n8n | at AxiosError.from (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:1355:24) +n8n | at RedirectableRequest.handleRequestError (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:4026:25) +n8n | at RedirectableRequest.emit (node:events:526:24) +n8n | at ClientRequest.eventHandlers. (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/follow-redirects@1.16.0_debug@4.4.3_supports-color@8.1.1_/node_modules/follow-redirects/index.js:56:24) +n8n | at ClientRequest.emit (node:events:514:20) +n8n | at emitErrorEvent (node:_http_client:114:11) +n8n | at TLSSocket.socketErrorListener (node:_http_client:768:5) +n8n | at TLSSocket.emit (node:events:526:24) +n8n | at emitErrorNT (node:internal/streams/destroy:170:8) +n8n | at emitErrorCloseNT (node:internal/streams/destroy:129:3) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5427:41) +n8n | at processTicksAndRejections (node:internal/process/task_queues:104:5) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5423:14) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5423:14) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5423:14) +n8n | +n8n | connect ECONNREFUSED 0.0.0.0:443 +n8n | Error: connect ECONNREFUSED 0.0.0.0:443 +n8n | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:2017:16) +n8n | diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/engine-state.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/engine-state.json new file mode 100644 index 00000000..ec747fa4 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/engine-state.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/files-after.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/files-after.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/files-after.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/files-before.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/files-before.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/files-before.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/memory-samples.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/memory-samples.json new file mode 100644 index 00000000..89a305ea --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/memory-samples.json @@ -0,0 +1,682 @@ +[ + { + "t": 15.1, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 465145856, + "peak": 729747456, + "anon": 338440192, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 300 + }, + { + "t": 30.2, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 470315008, + "peak": 729747456, + "anon": 343912448, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 596 + }, + { + "t": 45.4, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 475824128, + "peak": 729747456, + "anon": 348282880, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 896 + }, + { + "t": 60.5, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 480194560, + "peak": 729747456, + "anon": 352292864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1196 + }, + { + "t": 75.6, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 489811968, + "peak": 729747456, + "anon": 361332736, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1493 + }, + { + "t": 90.8, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 489684992, + "peak": 729747456, + "anon": 361619456, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1792 + }, + { + "t": 105.9, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 489893888, + "peak": 729747456, + "anon": 362029056, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2092 + }, + { + "t": 121.0, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 491249664, + "peak": 729747456, + "anon": 363720704, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2390 + }, + { + "t": 136.2, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 493883392, + "peak": 729747456, + "anon": 365846528, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2690 + }, + { + "t": 151.3, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 497659904, + "peak": 729747456, + "anon": 369922048, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2988 + }, + { + "t": 166.4, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 493793280, + "peak": 729747456, + "anon": 366198784, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3288 + }, + { + "t": 181.6, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 493518848, + "peak": 729747456, + "anon": 366358528, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3588 + }, + { + "t": 196.7, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 493469696, + "peak": 729747456, + "anon": 366260224, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3886 + }, + { + "t": 211.8, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 492683264, + "peak": 729747456, + "anon": 365494272, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4186 + }, + { + "t": 226.9, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 493670400, + "peak": 729747456, + "anon": 365731840, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4484 + }, + { + "t": 242.1, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 495505408, + "peak": 729747456, + "anon": 367980544, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4784 + }, + { + "t": 257.2, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 497831936, + "peak": 729747456, + "anon": 369987584, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5082 + }, + { + "t": 272.3, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 495378432, + "peak": 729747456, + "anon": 367894528, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5382 + }, + { + "t": 287.4, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 495591424, + "peak": 729747456, + "anon": 368037888, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5680 + }, + { + "t": 302.5, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 495321088, + "peak": 729747456, + "anon": 368066560, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5978 + }, + { + "t": 317.6, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 494256128, + "peak": 729747456, + "anon": 367263744, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6278 + }, + { + "t": 332.7, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 494567424, + "peak": 729747456, + "anon": 367362048, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6576 + }, + { + "t": 347.9, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 495312896, + "peak": 729747456, + "anon": 367894528, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6876 + }, + { + "t": 363.0, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 496840704, + "peak": 729747456, + "anon": 369303552, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7174 + }, + { + "t": 378.1, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 495476736, + "peak": 729747456, + "anon": 368271360, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7474 + }, + { + "t": 393.2, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 495837184, + "peak": 729747456, + "anon": 368443392, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7772 + }, + { + "t": 408.3, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 496005120, + "peak": 729747456, + "anon": 368816128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8070 + }, + { + "t": 423.4, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 494006272, + "peak": 729747456, + "anon": 366292992, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8370 + }, + { + "t": 438.6, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 493404160, + "peak": 729747456, + "anon": 366305280, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8668 + }, + { + "t": 453.7, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 493645824, + "peak": 729747456, + "anon": 366501888, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8966 + }, + { + "t": 468.8, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 494370816, + "peak": 729747456, + "anon": 366706688, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9266 + }, + { + "t": 483.9, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 494305280, + "peak": 729747456, + "anon": 366874624, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9564 + }, + { + "t": 499.0, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 493932544, + "peak": 729747456, + "anon": 366952448, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9862 + }, + { + "t": 514.2, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 493338624, + "peak": 729747456, + "anon": 366157824, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10162 + }, + { + "t": 529.3, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 493780992, + "peak": 729747456, + "anon": 366510080, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10462 + }, + { + "t": 544.4, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 494432256, + "peak": 729747456, + "anon": 366723072, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10760 + }, + { + "t": 559.5, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 494505984, + "peak": 729747456, + "anon": 367468544, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11058 + }, + { + "t": 574.6, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 493563904, + "peak": 729747456, + "anon": 366784512, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11358 + }, + { + "t": 589.7, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 494440448, + "peak": 729747456, + "anon": 367104000, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11658 + }, + { + "t": 604.9, + "containers": { + "n8n": { + "limit": 1610612736, + "current": 494301184, + "peak": 729747456, + "anon": 367271936, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11956 + } +] \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/migration-lines.txt b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/migration-lines.txt new file mode 100644 index 00000000..17a1a58b --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/migration-lines.txt @@ -0,0 +1,6 @@ +n8n | Migrations in progress, please do NOT stop the process. +n8n | Starting migration AddAgentThreadOwnership1790014447117 +n8n | Finished migration AddAgentThreadOwnership1790014447117 +n8n | Starting migration PreventDeploymentKeyDeletion1790054384570 +n8n | Finished migration PreventDeploymentKeyDeletion1790054384570 +n8n | Starting migration AddConcurrencyLimitToScheduledJob1790073725529 \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/run.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/run.log new file mode 100644 index 00000000..a9629fea --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/run.log @@ -0,0 +1,58 @@ +[11:51:19] scratch drive folders cleared before FROM (R-656): none existed +[11:51:19] MV-n8n: deploying n8n at FROM {'n8n': 'n8nio/n8n:2.41.2'} +[11:52:48] FROM settled=True in 31.1s :: {"n8n": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[11:52:48] fixture: the BOX walk's own (N8n), through upgrade_boxport +[11:52:49] n8n: /rest/owner/setup http=200 +[11:52:49] n8n: login as the seeded owner http=200 ok=True +[11:52:49] C1 (seed reads back BEFORE): True +[11:52:49] MV-n8n: swapping to TO {'n8n': 'n8nio/n8n:2.42.1'} +[11:53:51] TO up -d rc=0 +[11:54:22] TO settled=True in 30.9s :: {"n8n": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[11:54:22] migration lines observed: 6 +[11:54:23] n8n: login as the seeded owner http=200 ok=True +[11:54:23] RESULT (seed reads back AFTER): True +[11:54:23] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.4:5678 +[11:54:38] + 15s n8n=443M/1536M peak=695M kills=0 rs=0 reqs=300 +[11:54:53] + 30s n8n=448M/1536M peak=695M kills=0 rs=0 reqs=596 +[11:55:09] + 45s n8n=453M/1536M peak=695M kills=0 rs=0 reqs=896 +[11:55:24] + 60s n8n=457M/1536M peak=695M kills=0 rs=0 reqs=1196 +[11:55:39] + 76s n8n=467M/1536M peak=695M kills=0 rs=0 reqs=1493 +[11:55:54] + 91s n8n=467M/1536M peak=695M kills=0 rs=0 reqs=1792 +[11:56:09] + 106s n8n=467M/1536M peak=695M kills=0 rs=0 reqs=2092 +[11:56:24] + 121s n8n=468M/1536M peak=695M kills=0 rs=0 reqs=2390 +[11:56:39] + 136s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=2690 +[11:56:55] + 151s n8n=474M/1536M peak=695M kills=0 rs=0 reqs=2988 +[11:57:10] + 166s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=3288 +[11:57:25] + 182s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=3588 +[11:57:40] + 197s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=3886 +[11:57:55] + 212s n8n=469M/1536M peak=695M kills=0 rs=0 reqs=4186 +[11:58:10] + 227s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=4484 +[11:58:25] + 242s n8n=472M/1536M peak=695M kills=0 rs=0 reqs=4784 +[11:58:40] + 257s n8n=474M/1536M peak=695M kills=0 rs=0 reqs=5082 +[11:58:56] + 272s n8n=472M/1536M peak=695M kills=0 rs=0 reqs=5382 +[11:59:11] + 287s n8n=472M/1536M peak=695M kills=0 rs=0 reqs=5680 +[11:59:26] + 302s n8n=472M/1536M peak=695M kills=0 rs=0 reqs=5978 +[11:59:41] + 318s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=6278 +[11:59:56] + 333s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=6576 +[12:00:11] + 348s n8n=472M/1536M peak=695M kills=0 rs=0 reqs=6876 +[12:00:26] + 363s n8n=473M/1536M peak=695M kills=0 rs=0 reqs=7174 +[12:00:41] + 378s n8n=472M/1536M peak=695M kills=0 rs=0 reqs=7474 +[12:00:56] + 393s n8n=472M/1536M peak=695M kills=0 rs=0 reqs=7772 +[12:01:12] + 408s n8n=473M/1536M peak=695M kills=0 rs=0 reqs=8070 +[12:01:27] + 423s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=8370 +[12:01:42] + 439s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=8668 +[12:01:57] + 454s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=8966 +[12:02:12] + 469s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=9266 +[12:02:27] + 484s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=9564 +[12:02:42] + 499s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=9862 +[12:02:57] + 514s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=10162 +[12:03:13] + 529s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=10462 +[12:03:28] + 544s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=10760 +[12:03:43] + 560s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=11058 +[12:03:58] + 575s n8n=470M/1536M peak=695M kills=0 rs=0 reqs=11358 +[12:04:13] + 590s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=11658 +[12:04:28] + 605s n8n=471M/1536M peak=695M kills=0 rs=0 reqs=11956 +[12:04:28] memory watch: killed=False tight=[] requests=11956 codes={'200': 11956} +[12:04:28] MV-n8n: ABORT — putting the FROM images back +[12:05:01] n8n: login as the seeded owner http=200 ok=True +[12:05:01] ABORT: app came back in 30.8s; data present=True \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/to-full.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/to-full.log new file mode 100644 index 00000000..c08bde99 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/to-full.log @@ -0,0 +1,102 @@ +n8n | Initializing n8n process +n8n | n8n ready on ::, port 5678 +n8n | Migrations in progress, please do NOT stop the process. +n8n | Starting migration AddAgentThreadOwnership1790014447117 +n8n | Finished migration AddAgentThreadOwnership1790014447117 +n8n | Starting migration PreventDeploymentKeyDeletion1790054384570 +n8n | Finished migration PreventDeploymentKeyDeletion1790054384570 +n8n | Starting migration AddConcurrencyLimitToScheduledJob1790073725529 +n8n | Finished migration AddConcurrencyLimitToScheduledJob1790073725529 +n8n | Starting migration CreateWorkflowPublicationRetryStateTable1790162967151 +n8n | Finished migration CreateWorkflowPublicationRetryStateTable1790162967151 +n8n | Starting migration AllowTeamsAgentChatSubscriptions1790231058977 +n8n | Finished migration AllowTeamsAgentChatSubscriptions1790231058977 +n8n | Starting migration CreateAgentMessageQueue1790241069212 +n8n | Finished migration CreateAgentMessageQueue1790241069212 +n8n | Starting migration AddPendingAuthorizationToCredentials1790319787160 +n8n | Finished migration AddPendingAuthorizationToCredentials1790319787160 +n8n | Starting migration CreateInstanceAiThreadTabsTable1790342771626 +n8n | Finished migration CreateInstanceAiThreadTabsTable1790342771626 +n8n | Starting migration AddReportDateToInstanceMonitoringReport1790583238183 +n8n | Finished migration AddReportDateToInstanceMonitoringReport1790583238183 +n8n | Starting migration AddAgentExecutionMessages1790590278292 +n8n | Finished migration AddAgentExecutionMessages1790590278292 +n8n | Starting migration CreateMigrationFindingTables1790598807675 +n8n | Finished migration CreateMigrationFindingTables1790598807675 +n8n | n8n Task Broker ready on 127.0.0.1, port 5679 +n8n | Failed to start Python task runner in internal mode. because Python 3 is missing from this system. Launching a Python runner in internal mode is intended only for debugging and is not recommended for production. Users are encouraged to deploy in external mode. See: https://docs.n8n.io/hosting/configuration/task-runners/#setting-up-external-mode +n8n | +n8n | There are deprecations related to your n8n setup. Please take the recommended actions to update your configuration: +n8n | - WEBHOOK_URL -> Use N8N_WEBHOOK_URL instead, which sets the base URL for both test and production webhooks. +n8n | - N8N_UNVERIFIED_PACKAGES_ENABLED -> The default for this variable will change to `false` in a future version. Set it to `true` explicitly to keep installing unverified community packages. +n8n | - N8N_RUNNERS_MODE -> Internal task runner mode is deprecated and will be removed in a future version. For isolation and scaling, run the task runner launcher as a separate process, set this variable to `external` and share `N8N_RUNNERS_AUTH_TOKEN` with the launcher. See https://docs.n8n.io/deploy/host-n8n/configure-n8n/set-up-task-runners +n8n | - N8N_RUNNERS_TASK_TIMEOUT -> The default for this variable will be reduced from 300 (5 minutes) to 60 (1 minute) in a future version. Set it explicitly to keep your current task timeout. +n8n | - N8N_COMPRESSION_NODE_MAX_DECOMPRESSED_SIZE_BYTES -> The default for this variable will be reduced from 2 GiB to 256 MiB in a future version. Set it explicitly to keep your current limit. +n8n | - N8N_COMPRESSION_NODE_MAX_ZIP_ENTRIES -> The default for this variable will be reduced from 5000 to 1000 in a future version. Set it explicitly to keep your current limit. +n8n | +n8n | [license SDK] Skipping renewal on init: license cert is not initialized +n8n | Instance registered +n8n | Discovered 4 cluster checks +n8n | Recorded version change: 2.41.2 -> 2.42.1 +n8n | [runner:js] (node:19) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. +n8n | (Use `node --trace-warnings ...` to show where the warning was created) +n8n | Sandbox: enabled=false provider=n8n-sandbox (from env) +n8n | Registered runner "JS Task Runner" (TEv8USN6XUT9xuezhBymZ) +n8n | Version: 2.42.1 +n8n | Building workflow dependency index... +n8n | Finished building workflow dependency index. Processed 0 draft workflows, 0 published workflows. +n8n | +n8n | Editor is now accessible via: +n8n | https://auto.gate.invalid +n8n | 2026-09-30T11:54:05.580Z [Rudder] error: Response error code: ECONNREFUSED +n8n | 2026-09-30T11:54:05.793Z [Rudder] error: Response error code: ECONNREFUSED +n8n | 2026-09-30T11:54:06.203Z [Rudder] error: Response error code: ECONNREFUSED +n8n | connect ECONNREFUSED 0.0.0.0:443 +n8n | Error: connect ECONNREFUSED 0.0.0.0:443 +n8n | at AxiosError.from (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:1355:24) +n8n | at RedirectableRequest.handleRequestError (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:4026:25) +n8n | at RedirectableRequest.emit (node:events:526:24) +n8n | at ClientRequest.eventHandlers. (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/follow-redirects@1.16.0_debug@4.4.3_supports-color@8.1.1_/node_modules/follow-redirects/index.js:56:24) +n8n | at ClientRequest.emit (node:events:514:20) +n8n | at emitErrorEvent (node:_http_client:114:11) +n8n | at TLSSocket.socketErrorListener (node:_http_client:768:5) +n8n | at TLSSocket.emit (node:events:526:24) +n8n | at emitErrorNT (node:internal/streams/destroy:170:8) +n8n | at emitErrorCloseNT (node:internal/streams/destroy:129:3) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5427:41) +n8n | at processTicksAndRejections (node:internal/process/task_queues:104:5) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5423:14) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5423:14) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5423:14) +n8n | +n8n | 2026-09-30T11:54:07.043Z [Rudder] error: Error: ECONNREFUSED +n8n | connect ECONNREFUSED 0.0.0.0:443 +n8n | Error: connect ECONNREFUSED 0.0.0.0:443 +n8n | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:2017:16) +n8n | +n8n | 2026-09-30T11:54:15.518Z [Rudder] error: Response error code: ECONNREFUSED +n8n | 2026-09-30T11:54:15.737Z [Rudder] error: Response error code: ECONNREFUSED +n8n | 2026-09-30T11:54:16.165Z [Rudder] error: Response error code: ECONNREFUSED +n8n | 2026-09-30T11:54:17.070Z [Rudder] error: Error: ECONNREFUSED +n8n | connect ECONNREFUSED 0.0.0.0:443 +n8n | Error: connect ECONNREFUSED 0.0.0.0:443 +n8n | at AxiosError.from (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:1355:24) +n8n | at RedirectableRequest.handleRequestError (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:4026:25) +n8n | at RedirectableRequest.emit (node:events:526:24) +n8n | at ClientRequest.eventHandlers. (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/follow-redirects@1.16.0_debug@4.4.3_supports-color@8.1.1_/node_modules/follow-redirects/index.js:56:24) +n8n | at ClientRequest.emit (node:events:514:20) +n8n | at emitErrorEvent (node:_http_client:114:11) +n8n | at TLSSocket.socketErrorListener (node:_http_client:768:5) +n8n | at TLSSocket.emit (node:events:526:24) +n8n | at emitErrorNT (node:internal/streams/destroy:170:8) +n8n | at emitErrorCloseNT (node:internal/streams/destroy:129:3) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5427:41) +n8n | at processTicksAndRejections (node:internal/process/task_queues:104:5) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5423:14) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5423:14) +n8n | at Axios.request (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/axios@1.18.0_patch_hash=149e256a2a7b632497650b32816716ced972ab02a5ab00fbd8a5158a51722c4_437e4fafb503be805d1d0ae72f0b0deb/node_modules/axios/dist/node/axios.cjs:5423:14) +n8n | +n8n | connect ECONNREFUSED 0.0.0.0:443 +n8n | Error: connect ECONNREFUSED 0.0.0.0:443 +n8n | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:2017:16) +n8n | diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/to-states.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/to-states.json new file mode 100644 index 00000000..967db3cd --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/to-states.json @@ -0,0 +1,8 @@ +{ + "n8n": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/verdict.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/verdict.json new file mode 100644 index 00000000..27fcd5f4 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/n8n/bench/evidence/MV-n8n/verdict.json @@ -0,0 +1,51 @@ +{ + "harness_version": 4, + "edge": "MV-n8n", + "app": "n8n", + "note": "night 2026-09-23 within-a-major move: n8n=n8nio/n8n:2.42.1", + "from": { + "n8n": "n8nio/n8n:2.41.2" + }, + "to": { + "n8n": "n8nio/n8n:2.42.1" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Kn8n | Migrations in progress, please do NOT stop the process.", + "abort": "starts-and-serves", + "abort_detail": null, + "engine_state_after": null, + "memory": { + "soak_s": 605.2, + "requested_s": 600, + "requests": 11956, + "codes": { + "200": 11956 + }, + "first_kill": null, + "containers": { + "n8n": { + "limit": 1610612736, + "peak": 729747456, + "peak_pct": 0.453, + "anon_peak_sampled": 369987584, + "anon_peak_pct": 0.23, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 30.9, + "measured_at": "2026-09-30T12:05:01Z", + "evidence": "evidence/MV-n8n", + "scratch_cleared": [], + "files_changed": [], + "total_s": 821.8 +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/MV-navidrome.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/MV-navidrome.log new file mode 100644 index 00000000..1137b43d --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/MV-navidrome.log @@ -0,0 +1,108 @@ +[12:03:32] scratch drive folders cleared before FROM (R-656): none existed +[12:03:32] MV-navidrome: deploying navidrome at FROM {'navidrome': 'deluan/navidrome:0.64.1'} +[12:04:18] FROM settled=True in 31.0s :: {"navidrome": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[12:04:18] navidrome: createAdmin http=200 +[12:04:18] navidrome: login as the seeded user http=200 ok=True +[12:04:18] C1 (seed reads back BEFORE): True +[12:04:18] MV-navidrome: swapping to TO {'navidrome': 'deluan/navidrome:0.64.2'} +[12:04:30] TO up -d rc=0 +[12:05:01] TO settled=True in 30.8s :: {"navidrome": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[12:05:01] migration lines observed: 2 +[12:05:01] navidrome: login as the seeded user http=200 ok=True +[12:05:01] RESULT (seed reads back AFTER): True +[12:05:01] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:4533 +[12:05:17] + 15s navidrome=16M/256M peak=24M kills=0 rs=0 reqs=300 +[12:05:32] + 30s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=601 +[12:05:47] + 45s navidrome=19M/256M peak=24M kills=0 rs=0 reqs=901 +[12:06:02] + 60s navidrome=16M/256M peak=24M kills=0 rs=0 reqs=1201 +[12:06:17] + 76s navidrome=16M/256M peak=24M kills=0 rs=0 reqs=1502 +[12:06:32] + 91s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=1804 +[12:06:47] + 106s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=2104 +[12:07:02] + 121s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=2404 +[12:07:17] + 136s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=2704 +[12:07:33] + 151s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=3004 +[12:07:48] + 166s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=3304 +[12:08:03] + 182s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=3604 +[12:08:18] + 197s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=3904 +[12:08:33] + 212s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=4204 +[12:08:48] + 227s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=4504 +[12:09:03] + 242s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=4804 +[12:09:18] + 257s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=5104 +[12:09:34] + 272s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=5404 +[12:09:49] + 287s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=5704 +[12:10:04] + 302s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=6004 +[12:10:19] + 318s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=6304 +[12:10:34] + 333s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=6604 +[12:10:49] + 348s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=6904 +[12:11:04] + 363s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=7204 +[12:11:19] + 378s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=7504 +[12:11:35] + 393s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=7804 +[12:11:50] + 408s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=8104 +[12:12:05] + 423s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=8404 +[12:12:20] + 438s navidrome=18M/256M peak=24M kills=0 rs=0 reqs=8704 +[12:12:35] + 454s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=9004 +[12:12:50] + 469s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=9304 +[12:13:05] + 484s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=9604 +[12:13:20] + 499s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=9904 +[12:13:35] + 514s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=10204 +[12:13:51] + 529s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=10504 +[12:14:06] + 544s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=10804 +[12:14:21] + 559s navidrome=18M/256M peak=24M kills=0 rs=0 reqs=11104 +[12:14:36] + 574s navidrome=18M/256M peak=24M kills=0 rs=0 reqs=11404 +[12:14:51] + 590s navidrome=18M/256M peak=24M kills=0 rs=0 reqs=11704 +[12:15:06] + 605s navidrome=18M/256M peak=24M kills=0 rs=0 reqs=12004 +[12:15:06] memory watch: killed=False tight=[] requests=12004 codes={'302': 12004} +[12:15:06] MV-navidrome: ABORT — putting the FROM images back +[12:15:38] navidrome: login as the seeded user http=200 ok=True +[12:15:38] ABORT: app came back in 30.8s; data present=True +{ + "harness_version": 4, + "edge": "MV-navidrome", + "app": "navidrome", + "note": "night 2026-09-23 within-a-major move: navidrome=deluan/navidrome:0.64.2", + "from": { + "navidrome": "deluan/navidrome:0.64.1" + }, + "to": { + "navidrome": "deluan/navidrome:0.64.2" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Knavidrome | time=\"2026-09-30T12:04:30Z\" level=info msg=\"Upgrading DB Schema to latest version\"", + "abort": "starts-and-serves", + "abort_detail": null, + "engine_state_after": null, + "memory": { + "soak_s": 605.0, + "requested_s": 600, + "requests": 12004, + "codes": { + "302": 12004 + }, + "first_kill": null, + "containers": { + "navidrome": { + "limit": 268435456, + "peak": 25247744, + "peak_pct": 0.094, + "anon_peak_sampled": 18440192, + "anon_peak_pct": 0.069, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 30.8, + "measured_at": "2026-09-30T12:15:38Z", + "evidence": "evidence/MV-navidrome", + "scratch_cleared": [], + "files_changed": [], + "total_s": 725.7 +} diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/abort-states.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/abort-states.json new file mode 100644 index 00000000..dff23d7f --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/abort-states.json @@ -0,0 +1,8 @@ +{ + "navidrome": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/compose-final.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/compose-final.log new file mode 100644 index 00000000..9032c602 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/compose-final.log @@ -0,0 +1,45 @@ +navidrome | _ _ _ _ +navidrome | | \ | | (_) | | +navidrome | | \| | __ ___ ___ __| |_ __ ___ _ __ ___ ___ +navidrome | | . ` |/ _` \ \ / / |/ _` | '__/ _ \| '_ ` _ \ / _ \ +navidrome | | |\ | (_| |\ V /| | (_| | | | (_) | | | | | | __/ +navidrome | \_| \_/\__,_| \_/ |_|\__,_|_| \___/|_| |_| |_|\___| +navidrome | Version: 0.64.1 (285dc4f3) +navidrome | +navidrome | time="2026-09-30T12:15:07Z" level=info msg="No configuration file found. Loaded configuration only from environment variables" +navidrome | time="2026-09-30T12:15:07Z" level=info msg="goose: no migrations to run. current version: 20260922230428" +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Starting signaler" +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Starting scheduler" +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Starting Insight Collector" +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Periodic backup is DISABLED" +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Scheduling DB analysis check" schedule="@every 30m" +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Periodic scan is DISABLED" +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Starting artwork worker" +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Creating Transcoding cache" maxSize="100 MB" path=/data/cache/transcoding +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Creating Image cache" maxSize="100 MB" path=/data/cache/images +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Finished initializing cache" cache=Image elapsedTime="756.119µs" maxSize=100MB +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Finished initializing cache" cache=Transcoding elapsedTime=1.6ms maxSize=100MB +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Starting plugin manager" +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Starting plugin manager" folder=/data/plugins +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Setting Session Timeout" value=48h +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Login rate limit set" requestLimit=5 windowLength=20s +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Found ffmpeg" path=/usr/bin/ffmpeg +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Mounting Native API routes" path=/api +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Mounting Subsonic API routes" path=/rest +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Mounting Public Endpoints routes" path=/share +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Mounting LastFM Auth routes" path=/api/lastfm +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Mounting ListenBrainz Auth routes" path=/api/listenbrainz +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Mounting Background images routes" path=/backgrounds +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Creating backgrounds cache" maxSize="100 MB" path=/data/cache/backgrounds +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Finished initializing cache" cache=backgrounds elapsedTime="253.9µs" maxSize=100MB +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Mounting WebUI routes" path=/app +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Started watcher for library" libraryID=1 name="Music Library" path=/music +navidrome | time="2026-09-30T12:15:07Z" level=info msg="Watcher started for library" absoluteLibPath=/music libraryID=1 name="Music Library" path=/music +navidrome | time="2026-09-30T12:15:07Z" level=info msg="----> Navidrome server is ready!" address="0.0.0.0:4533" startupTime=64.8ms tlsEnabled=false +navidrome | time="2026-09-30T12:15:09Z" level=info msg="Executing initial scan" +navidrome | time="2026-09-30T12:15:09Z" level=info msg="No configuration file found. Loaded configuration only from environment variables" +navidrome | time="2026-09-30T12:15:09Z" level=info msg="Scanner: Starting scan" fullScan=false numLibraries=1 +navidrome | time="2026-09-30T12:15:09Z" level=info msg="Scanner: Finished scanning all libraries" duration=10.4ms +navidrome | time="2026-09-30T12:15:09Z" level=info msg="Scan completed" +navidrome | time="2026-09-30T12:15:38Z" level=warning msg="Unsuccessful login" request="map[Accept:[*/*] Content-Length:[61] Content-Type:[application/json] User-Agent:[curl/8.14.1]]" requestId=c049e2195df2/ZuS1xbhlTO-000003 username=spike1af370 +navidrome | time="2026-09-30T12:15:38Z" level=warning msg="HTTP: POST http://172.18.0.2:4533/auth/login" elapsedTime="840.829µs" httpStatus=401 remoteAddr="172.18.0.1:50824" requestId=c049e2195df2/ZuS1xbhlTO-000003 responseSize=40 diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/engine-state.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/engine-state.json new file mode 100644 index 00000000..ec747fa4 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/engine-state.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/files-after.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/files-after.json new file mode 100644 index 00000000..9dd7d0ba --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/files-after.json @@ -0,0 +1,3 @@ +{ + "/srv/felhom-gate/hdd/userdata/media/music": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/files-before.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/files-before.json new file mode 100644 index 00000000..9dd7d0ba --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/files-before.json @@ -0,0 +1,3 @@ +{ + "/srv/felhom-gate/hdd/userdata/media/music": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/memory-samples.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/memory-samples.json new file mode 100644 index 00000000..0a8a2c1c --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/memory-samples.json @@ -0,0 +1,682 @@ +[ + { + "t": 15.1, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 17723392, + "peak": 25247744, + "anon": 15630336, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 300 + }, + { + "t": 30.2, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18436096, + "peak": 25247744, + "anon": 16867328, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 601 + }, + { + "t": 45.3, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 20058112, + "peak": 25247744, + "anon": 18440192, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 901 + }, + { + "t": 60.4, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 17092608, + "peak": 25247744, + "anon": 14991360, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1201 + }, + { + "t": 75.6, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 17805312, + "peak": 25247744, + "anon": 15917056, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1502 + }, + { + "t": 90.7, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18317312, + "peak": 25247744, + "anon": 16424960, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1804 + }, + { + "t": 105.8, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18669568, + "peak": 25247744, + "anon": 16785408, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2104 + }, + { + "t": 120.9, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18644992, + "peak": 25247744, + "anon": 16769024, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2404 + }, + { + "t": 136.1, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18509824, + "peak": 25247744, + "anon": 16908288, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2704 + }, + { + "t": 151.2, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18554880, + "peak": 25247744, + "anon": 17207296, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3004 + }, + { + "t": 166.3, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18747392, + "peak": 25247744, + "anon": 16883712, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3304 + }, + { + "t": 181.5, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18472960, + "peak": 25247744, + "anon": 16887808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3604 + }, + { + "t": 196.6, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18251776, + "peak": 25247744, + "anon": 16633856, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3904 + }, + { + "t": 211.7, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18268160, + "peak": 25247744, + "anon": 16666624, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4204 + }, + { + "t": 226.8, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18522112, + "peak": 25247744, + "anon": 16670720, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4504 + }, + { + "t": 242.0, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18026496, + "peak": 25247744, + "anon": 16678912, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4804 + }, + { + "t": 257.1, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18292736, + "peak": 25247744, + "anon": 16691200, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5104 + }, + { + "t": 272.2, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18051072, + "peak": 25247744, + "anon": 16695296, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5404 + }, + { + "t": 287.3, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18825216, + "peak": 25247744, + "anon": 16760832, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5704 + }, + { + "t": 302.4, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18620416, + "peak": 25247744, + "anon": 16752640, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6004 + }, + { + "t": 317.5, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18632704, + "peak": 25247744, + "anon": 16760832, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6304 + }, + { + "t": 332.7, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18395136, + "peak": 25247744, + "anon": 17043456, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6604 + }, + { + "t": 347.8, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18817024, + "peak": 25247744, + "anon": 17199104, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6904 + }, + { + "t": 362.9, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18538496, + "peak": 25247744, + "anon": 16953344, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7204 + }, + { + "t": 378.0, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18829312, + "peak": 25247744, + "anon": 16965632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7504 + }, + { + "t": 393.1, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18587648, + "peak": 25247744, + "anon": 16982016, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7804 + }, + { + "t": 408.3, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18653184, + "peak": 25247744, + "anon": 17018880, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8104 + }, + { + "t": 423.4, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18649088, + "peak": 25247744, + "anon": 17031168, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8404 + }, + { + "t": 438.5, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 19144704, + "peak": 25247744, + "anon": 17285120, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8704 + }, + { + "t": 453.6, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18833408, + "peak": 25247744, + "anon": 16969728, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9004 + }, + { + "t": 468.7, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18845696, + "peak": 25247744, + "anon": 16973824, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9304 + }, + { + "t": 483.8, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18538496, + "peak": 25247744, + "anon": 16973824, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9604 + }, + { + "t": 498.9, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18616320, + "peak": 25247744, + "anon": 17125376, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9904 + }, + { + "t": 514.1, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18317312, + "peak": 25247744, + "anon": 16953344, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10204 + }, + { + "t": 529.2, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18399232, + "peak": 25247744, + "anon": 17051648, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10504 + }, + { + "t": 544.3, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18432000, + "peak": 25247744, + "anon": 17059840, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10804 + }, + { + "t": 559.4, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 19779584, + "peak": 25247744, + "anon": 17145856, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11104 + }, + { + "t": 574.5, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 18903040, + "peak": 25247744, + "anon": 17293312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11404 + }, + { + "t": 589.7, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 19001344, + "peak": 25247744, + "anon": 17293312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11704 + }, + { + "t": 604.8, + "containers": { + "navidrome": { + "limit": 268435456, + "current": 19144704, + "peak": 25247744, + "anon": 17293312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 12004 + } +] \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/migration-lines.txt b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/migration-lines.txt new file mode 100644 index 00000000..9fe4e1ff --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/migration-lines.txt @@ -0,0 +1,2 @@ +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Upgrading DB Schema to latest version" +navidrome | time="2026-09-30T12:04:30Z" level=info msg="goose: successfully migrated database to version: 20260922230428" \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/run.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/run.log new file mode 100644 index 00000000..96f1beb2 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/run.log @@ -0,0 +1,57 @@ +[12:03:32] scratch drive folders cleared before FROM (R-656): none existed +[12:03:32] MV-navidrome: deploying navidrome at FROM {'navidrome': 'deluan/navidrome:0.64.1'} +[12:04:18] FROM settled=True in 31.0s :: {"navidrome": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[12:04:18] navidrome: createAdmin http=200 +[12:04:18] navidrome: login as the seeded user http=200 ok=True +[12:04:18] C1 (seed reads back BEFORE): True +[12:04:18] MV-navidrome: swapping to TO {'navidrome': 'deluan/navidrome:0.64.2'} +[12:04:30] TO up -d rc=0 +[12:05:01] TO settled=True in 30.8s :: {"navidrome": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[12:05:01] migration lines observed: 2 +[12:05:01] navidrome: login as the seeded user http=200 ok=True +[12:05:01] RESULT (seed reads back AFTER): True +[12:05:01] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:4533 +[12:05:17] + 15s navidrome=16M/256M peak=24M kills=0 rs=0 reqs=300 +[12:05:32] + 30s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=601 +[12:05:47] + 45s navidrome=19M/256M peak=24M kills=0 rs=0 reqs=901 +[12:06:02] + 60s navidrome=16M/256M peak=24M kills=0 rs=0 reqs=1201 +[12:06:17] + 76s navidrome=16M/256M peak=24M kills=0 rs=0 reqs=1502 +[12:06:32] + 91s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=1804 +[12:06:47] + 106s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=2104 +[12:07:02] + 121s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=2404 +[12:07:17] + 136s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=2704 +[12:07:33] + 151s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=3004 +[12:07:48] + 166s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=3304 +[12:08:03] + 182s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=3604 +[12:08:18] + 197s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=3904 +[12:08:33] + 212s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=4204 +[12:08:48] + 227s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=4504 +[12:09:03] + 242s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=4804 +[12:09:18] + 257s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=5104 +[12:09:34] + 272s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=5404 +[12:09:49] + 287s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=5704 +[12:10:04] + 302s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=6004 +[12:10:19] + 318s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=6304 +[12:10:34] + 333s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=6604 +[12:10:49] + 348s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=6904 +[12:11:04] + 363s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=7204 +[12:11:19] + 378s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=7504 +[12:11:35] + 393s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=7804 +[12:11:50] + 408s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=8104 +[12:12:05] + 423s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=8404 +[12:12:20] + 438s navidrome=18M/256M peak=24M kills=0 rs=0 reqs=8704 +[12:12:35] + 454s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=9004 +[12:12:50] + 469s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=9304 +[12:13:05] + 484s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=9604 +[12:13:20] + 499s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=9904 +[12:13:35] + 514s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=10204 +[12:13:51] + 529s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=10504 +[12:14:06] + 544s navidrome=17M/256M peak=24M kills=0 rs=0 reqs=10804 +[12:14:21] + 559s navidrome=18M/256M peak=24M kills=0 rs=0 reqs=11104 +[12:14:36] + 574s navidrome=18M/256M peak=24M kills=0 rs=0 reqs=11404 +[12:14:51] + 590s navidrome=18M/256M peak=24M kills=0 rs=0 reqs=11704 +[12:15:06] + 605s navidrome=18M/256M peak=24M kills=0 rs=0 reqs=12004 +[12:15:06] memory watch: killed=False tight=[] requests=12004 codes={'302': 12004} +[12:15:06] MV-navidrome: ABORT — putting the FROM images back +[12:15:38] navidrome: login as the seeded user http=200 ok=True +[12:15:38] ABORT: app came back in 30.8s; data present=True \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/to-full.log b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/to-full.log new file mode 100644 index 00000000..e65a3198 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/to-full.log @@ -0,0 +1,45 @@ +navidrome | _ _ _ _ +navidrome | | \ | | (_) | | +navidrome | | \| | __ ___ ___ __| |_ __ ___ _ __ ___ ___ +navidrome | | . ` |/ _` \ \ / / |/ _` | '__/ _ \| '_ ` _ \ / _ \ +navidrome | | |\ | (_| |\ V /| | (_| | | | (_) | | | | | | __/ +navidrome | \_| \_/\__,_| \_/ |_|\__,_|_| \___/|_| |_| |_|\___| +navidrome | Version: 0.64.2 (10114574) +navidrome | +navidrome | time="2026-09-30T12:04:30Z" level=info msg="No configuration file found. Loaded configuration only from environment variables" +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Upgrading DB Schema to latest version" +navidrome | time="2026-09-30T12:04:30Z" level=info msg="OK 20260922230428_clamp_media_file_int32_tag_numbers.sql (10.99ms)" +navidrome | time="2026-09-30T12:04:30Z" level=info msg="goose: successfully migrated database to version: 20260922230428" +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Starting signaler" +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Periodic scan is DISABLED" +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Periodic backup is DISABLED" +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Starting scheduler" +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Starting Insight Collector" +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Starting artwork worker" +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Creating Image cache" maxSize="100 MB" path=/data/cache/images +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Scheduling DB analysis check" schedule="@every 30m" +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Creating Transcoding cache" maxSize="100 MB" path=/data/cache/transcoding +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Finished initializing cache" cache=Image elapsedTime="237.359µs" maxSize=100MB +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Finished initializing cache" cache=Transcoding elapsedTime="135.726µs" maxSize=100MB +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Starting plugin manager" +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Starting plugin manager" folder=/data/plugins +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Started watcher for library" libraryID=1 name="Music Library" path=/music +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Watcher started for library" absoluteLibPath=/music libraryID=1 name="Music Library" path=/music +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Setting Session Timeout" value=48h +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Login rate limit set" requestLimit=5 windowLength=20s +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Found ffmpeg" path=/usr/bin/ffmpeg +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Mounting Native API routes" path=/api +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Mounting Subsonic API routes" path=/rest +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Mounting Public Endpoints routes" path=/share +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Mounting LastFM Auth routes" path=/api/lastfm +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Mounting ListenBrainz Auth routes" path=/api/listenbrainz +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Creating backgrounds cache" maxSize="100 MB" path=/data/cache/backgrounds +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Mounting Background images routes" path=/backgrounds +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Finished initializing cache" cache=backgrounds elapsedTime=1ms maxSize=100MB +navidrome | time="2026-09-30T12:04:30Z" level=info msg="Mounting WebUI routes" path=/app +navidrome | time="2026-09-30T12:04:30Z" level=info msg="----> Navidrome server is ready!" address="0.0.0.0:4533" startupTime=238.4ms tlsEnabled=false +navidrome | time="2026-09-30T12:04:32Z" level=info msg="Executing initial scan" +navidrome | time="2026-09-30T12:04:32Z" level=info msg="No configuration file found. Loaded configuration only from environment variables" +navidrome | time="2026-09-30T12:04:32Z" level=info msg="Scanner: Starting scan" fullScan=false numLibraries=1 +navidrome | time="2026-09-30T12:04:32Z" level=info msg="Scanner: Finished scanning all libraries" duration=10.5ms +navidrome | time="2026-09-30T12:04:32Z" level=info msg="Scan completed" diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/to-states.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/to-states.json new file mode 100644 index 00000000..dff23d7f --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/to-states.json @@ -0,0 +1,8 @@ +{ + "navidrome": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/verdict.json b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/verdict.json new file mode 100644 index 00000000..129ca2da --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/apps/navidrome/bench/evidence/MV-navidrome/verdict.json @@ -0,0 +1,51 @@ +{ + "harness_version": 4, + "edge": "MV-navidrome", + "app": "navidrome", + "note": "night 2026-09-23 within-a-major move: navidrome=deluan/navidrome:0.64.2", + "from": { + "navidrome": "deluan/navidrome:0.64.1" + }, + "to": { + "navidrome": "deluan/navidrome:0.64.2" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Knavidrome | time=\"2026-09-30T12:04:30Z\" level=info msg=\"Upgrading DB Schema to latest version\"", + "abort": "starts-and-serves", + "abort_detail": null, + "engine_state_after": null, + "memory": { + "soak_s": 605.0, + "requested_s": 600, + "requests": 12004, + "codes": { + "302": 12004 + }, + "first_kill": null, + "containers": { + "navidrome": { + "limit": 268435456, + "peak": 25247744, + "peak_pct": 0.094, + "anon_peak_sampled": 18440192, + "anon_peak_pct": 0.069, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 30.8, + "measured_at": "2026-09-30T12:15:38Z", + "evidence": "evidence/MV-navidrome", + "scratch_cleared": [], + "files_changed": [], + "total_s": 725.7 +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/F/benchq-q10.txt b/documentation/audits/pg-last-six-2026-09-30/F/benchq-q10.txt new file mode 100644 index 00000000..65972040 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/benchq-q10.txt @@ -0,0 +1,3 @@ +14:30:42 START immich ['immich-server=ghcr.io/immich-app/immich-server:v3.2.4', 'immich-machine-learning=ghcr.io/immich-app/immich-machine-learning:v3.2.4'] +14:38:08 DONE immich rc=0 verdict=inconclusive read_before=False read_after=False abort=not-attempted marks=[] peaks={} detail='FROM never settled: {"immich-machine-learning": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "immich-postgres": {"status": "running", "' (446s) +14:38:08 QUEUE q10 FINISHED diff --git a/documentation/audits/pg-last-six-2026-09-30/F/benchq-q4.txt b/documentation/audits/pg-last-six-2026-09-30/F/benchq-q4.txt new file mode 100644 index 00000000..086b8582 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/benchq-q4.txt @@ -0,0 +1,3 @@ +12:56:04 START bookstack ['bookstack=lscr.io/linuxserver/bookstack:26.09.1'] +13:09:10 DONE bookstack rc=0 verdict=proven read_before=True read_after=True abort=starts-and-serves marks=[] peaks={'bookstack': 0.283, 'bookstack-db': 0.583} detail='None' (786s) +13:09:10 QUEUE q4 FINISHED diff --git a/documentation/audits/pg-last-six-2026-09-30/F/benchq-q5.txt b/documentation/audits/pg-last-six-2026-09-30/F/benchq-q5.txt new file mode 100644 index 00000000..dfb37953 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/benchq-q5.txt @@ -0,0 +1,3 @@ +13:11:39 START kimai ['kimai=kimai/kimai2:2.67.0'] +13:25:10 DONE kimai rc=0 verdict=proven read_before=True read_after=True abort=starts-and-serves marks=[] peaks={'kimai': 0.917, 'kimai-db': 0.59} detail='None' (811s) +13:25:10 QUEUE q5 FINISHED diff --git a/documentation/audits/pg-last-six-2026-09-30/F/benchq-q6.txt b/documentation/audits/pg-last-six-2026-09-30/F/benchq-q6.txt new file mode 100644 index 00000000..85d5860b --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/benchq-q6.txt @@ -0,0 +1,4 @@ +13:50:14 START immich ['immich-server=ghcr.io/immich-app/immich-server:v3.2.4', 'immich-machine-learning=ghcr.io/immich-app/immich-machine-learning:v3.2.4'] +13:58:47 DONE immich rc=0 verdict=inconclusive read_before=False read_after=False abort=not-attempted marks=[] peaks={} detail='FROM never settled: {"immich-machine-learning": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "immich-postgres": {"status": "running", "' (513s) +13:58:47 QUEUE q6 FINISHED +14:30:42 immich RETRY alone on a quiet bench (the first run's FROM never settled with two other runs sharing 6 cores — R-676's first-start import) diff --git a/documentation/audits/pg-last-six-2026-09-30/F/benchq-q7.txt b/documentation/audits/pg-last-six-2026-09-30/F/benchq-q7.txt new file mode 100644 index 00000000..3f5a1ea8 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/benchq-q7.txt @@ -0,0 +1,5 @@ +13:50:14 START audiobookshelf ['audiobookshelf=ghcr.io/advplyr/audiobookshelf:2.37.1'] +14:03:27 DONE audiobookshelf rc=0 verdict=proven read_before=True read_after=True abort=starts-and-serves marks=[] peaks={'audiobookshelf': 0.14} detail='None' (793s) +14:03:27 START navidrome ['navidrome=deluan/navidrome:0.64.2'] +14:15:42 DONE navidrome rc=0 verdict=proven read_before=True read_after=True abort=starts-and-serves marks=[] peaks={'navidrome': 0.094} detail='None' (735s) +14:15:42 QUEUE q7 FINISHED diff --git a/documentation/audits/pg-last-six-2026-09-30/F/benchq-q8.txt b/documentation/audits/pg-last-six-2026-09-30/F/benchq-q8.txt new file mode 100644 index 00000000..384380fd --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/benchq-q8.txt @@ -0,0 +1,2 @@ +13:50:14 START n8n ['n8n=docker.n8n.io/n8nio/n8n:2.42.1'] +13:51:13 q8 STOPPED by hand: the n8n move named docker.n8n.io/n8nio/n8n (a DIFFERENT repository than the template's n8nio/n8n) — a typo, killed by PID 21 s in, its project taken down, its evidence folder renamed MV-n8n-wrongref-*; restarted as q9 with n8nio/n8n:2.42.1 diff --git a/documentation/audits/pg-last-six-2026-09-30/F/benchq-q9.txt b/documentation/audits/pg-last-six-2026-09-30/F/benchq-q9.txt new file mode 100644 index 00000000..dbe37360 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/benchq-q9.txt @@ -0,0 +1,7 @@ +13:51:13 START n8n ['n8n=n8nio/n8n:2.42.1'] +14:05:06 DONE n8n rc=0 verdict=proven read_before=True read_after=True abort=starts-and-serves marks=[] peaks={'n8n': 0.453} detail='None' (833s) +14:05:06 START grafana ['grafana=grafana/grafana:13.2.3'] +14:17:50 DONE grafana rc=0 verdict=proven read_before=True read_after=True abort=starts-and-serves marks=[] peaks={'grafana': 1.0} detail='None' (763s) +14:17:50 START komga ['komga=gotson/komga:1.28.0'] +14:30:10 DONE komga rc=0 verdict=proven read_before=True read_after=True abort=starts-and-serves marks=[] peaks={'komga': 0.675} detail='None' (740s) +14:30:10 QUEUE q9 FINISHED diff --git a/documentation/audits/pg-last-six-2026-09-30/F/immich-first-start-oom.txt b/documentation/audits/pg-last-six-2026-09-30/F/immich-first-start-oom.txt new file mode 100644 index 00000000..4715cda8 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/immich-first-start-oom.txt @@ -0,0 +1,9 @@ +immich: 0 postgres backends killed by signal 9; 3 server worker exits +immich-retry: 0 postgres backends killed by signal 9; 3 server worker exits +NOTE: the saved compose logs above do NOT carry the postgres kill lines (0 matches — the 400 kB tail is the server's output). +The kill counts below come from a LIVE read, transcribed here by the session (not re-readable: the bench is torn down). +Read live on the bench during the retry (2026-09-30 14:35 CEST), immich-postgres cgroup memory.events: oom 413, oom_kill 36; +HostConfig.Memory 536870912 (512 MiB); OOMKilled true. Image = the ladder's tested digest (sha256:1a078b23…), PostgreSQL 16.10. +The server's first start (reverse-geocoding import) dropped its DB connection ("terminating connection because of crash of another +server process") and never became healthy in the harness's 420 s. The same template on 9202 (14:31, fresh install, kept data moved +aside) seeded in 35 s and its update ended done; its replaced container read oom_kill 0 — the FIRST container's counter is gone. diff --git a/documentation/audits/pg-last-six-2026-09-30/F/kimai-tag-variant.txt b/documentation/audits/pg-last-six-2026-09-30/F/kimai-tag-variant.txt new file mode 100644 index 00000000..df401525 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/F/kimai-tag-variant.txt @@ -0,0 +1,8 @@ +kimai tag digests read 2026-09-30T11:11:39Z (Docker Hub API): + apache sha256:3084f1e5ecdc10afafc193911039a06cdabda4473f3a48d62edbe460e3c154ee + stable sha256:3084f1e5ecdc10afafc193911039a06cdabda4473f3a48d62edbe460e3c154ee + 2 sha256:3084f1e5ecdc10afafc193911039a06cdabda4473f3a48d62edbe460e3c154ee + 2.67.0 sha256:3084f1e5ecdc10afafc193911039a06cdabda4473f3a48d62edbe460e3c154ee + fpm sha256:2bfddb7fe4a58f128d955c05eecc37247d1033fbba2cfde58df35aa1c5ccf8a1 + latest sha256:2bfddb7fe4a58f128d955c05eecc37247d1033fbba2cfde58df35aa1c5ccf8a1 + apache-2.57.0 sha256:efa66c5eadf948b94d8031e9436feae491d90b2ceaa3d5e45e4d7c1a59dd8c38 diff --git a/documentation/audits/pg-last-six-2026-09-30/P0/README.txt b/documentation/audits/pg-last-six-2026-09-30/P0/README.txt new file mode 100644 index 00000000..5126ff36 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/P0/README.txt @@ -0,0 +1,2 @@ +Wed Sep 30 10:03:06 UTC 2026 +read-only GET /configs and GET /hosts on the hub ClusterIP, Basic auth, 2026-09-30T10:03:06Z diff --git a/documentation/audits/pg-last-six-2026-09-30/P0/configs.txt b/documentation/audits/pg-last-six-2026-09-30/P0/configs.txt new file mode 100644 index 00000000..51f230b9 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/P0/configs.txt @@ -0,0 +1 @@ + Felhom Hub — Customers Felhom Hub Dashboard Customers Apps Hosts Offsite Configuration Customers + Add Customer Customer ID Name Domain Status Version Floor Config Tester-2 Tester 2 sajatfelhom.hu — — v0.283.1 MANAGED demo-felhom Demo Ügyfél demo-felhom.eu OK 0.283.1 v0.283.1 MANAGED demo-hp Demo HP enkisfelhom.hu OK 0.283.1 v0.283.1 MANAGED drill-r50 drill-r50 — BLOCKED 0.213.0 v0.283.1 ● MANAGED tester-1 Tester 1 enkicsifelhom.hu DOWN 0.282.0 v0.283.1 ● MANAGED Felhom Hub 0.126.0 — Customer Management diff --git a/documentation/audits/pg-last-six-2026-09-30/P0/hub-hosts.txt b/documentation/audits/pg-last-six-2026-09-30/P0/hub-hosts.txt new file mode 100644 index 00000000..cec28b51 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/P0/hub-hosts.txt @@ -0,0 +1 @@ + Hosts — Felhom Hub Felhom Hub Dashboard Customers Apps Hosts Offsite Configuration Hosts Host Customer Agent Status Guests CPU Mem Disk Cloudflared Worst Storage demo-felhom-8363b5 Demo Ügyfél 0.138.0 ONLINE 1/2 4% 16% 29% inactive 29% local demo-hp-bb76ea Demo HP 0.138.0 ONLINE 1/2 6% 18% 60% inactive 60% local-lvm drill-r50-0a4f9a drill-r50 0.129.0 floor held DOWN 1/1 20% 20% 10% inactive 10% local Felhom Hub 0.126.0 diff --git a/documentation/audits/pg-last-six-2026-09-30/README.md b/documentation/audits/pg-last-six-2026-09-30/README.md new file mode 100644 index 00000000..e152d813 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/README.md @@ -0,0 +1,56 @@ +# The last six PostgreSQL apps, by day (2026-09-30) + +Brief: the 2026-09-30 day brief (Parts 0, A–F). Architecture read first: `architecture/09-update-architecture.md` +§3 (decisions 16, 35, 37–39, 42–43), §6.4 parts 7 and 10, §6.4.2, §6.5; `07-backup-architecture.md` §6.1. +Baselines (verified live 12:00): controller `d48da6c` v0.283.1 · agent `d766666` v0.138.0 · felhom.eu `2de56ce` · +catalog `6446197`. **No controller, agent or hub release in this session.** + +## Part 0 — Tester-2 (read only, hub `GET /configs` + `GET /hosts`, `P0/`) + +- The customer record `Tester-2` (sajatfelhom.hu) exists, its config is `v0.283.1 MANAGED`. +- **No box has registered:** status and version read `—`, and `/hosts` lists no Tester-2 host. +- So no apps and no `app_update.unattended` value exist yet to read. + +## Part A — the upstream table (A1, read 2026-09-30; raw notes and URLs in `A1/upstream-notes.md`) + +Rule (decision 42): the newer major only when the app's own upstream runs it; else the newest major its stack documents. + +| app | pinned app | pinned engine | upstream engine (pinned tag / newest release) | documented range | outcome | reason | EOL of the major it is on after today | +|---|---|---|---|---|---|---|---| +| outline | 1.9.1 | `postgres:16-alpine` | docs self-host compose: `postgres:18` at `/var/lib/postgresql` (the repo's own compose is dev-only) / v1.10.1 same | PostgreSQL 14+ | **→ 18, moved** | upstream runs 18 | 18: 2030-11-14 | +| rallly | 4.11.1 | `postgres:16-alpine` | `postgres:18-alpine` at `/var/lib/postgresql` (v4.11.1 compose) / v4.15.3 same | 18 for fresh installs (rallly-selfhosted README) | **→ 18, moved** | upstream runs 18 at the pinned tag | 2030-11-14 | +| sparkyfitness | v0.17.3 | `postgres:15-alpine` | `postgres:18.3-alpine` at `/var/lib/postgresql` (v0.17.3 `docker-compose.prod.yml`) / v1.7.3 same | upstream guide "PostgreSQL Upgrade (15 to 18.3)" | **→ 18, moved** | upstream pairs this very tag with 18 | 2030-11-14 | +| zipline | 4.6.1 | `postgres:16-alpine` | `postgres:16` / v4.8.0 `postgres:16` | only "PG 14 supported until 2026-11-12"; nothing on 17/18 | **stay 16** | upstream runs the same major | 16: 2028-11-09 | +| adventurelog | v0.13.0 (= newest) | `postgis/postgis:16-3.5-alpine` | `postgis/postgis:16-3.5` / same | not documented (Django 5.2.13, psycopg2) | **stay 16** | upstream runs the same major | 2028-11-09 | +| immich | v3.2.2 | `…/postgres:16-vectorchord0.4.3-pgvectors0.2.0` | `…/postgres:14-vectorchord0.4.3-pgvectors0.2.0` / v3.2.4, v3.3.0-rc.0 same | `>= 14, < 20` | **stay 16** | upstream runs an OLDER major (14) than ours | 2028-11-09 | + +**A2 (the special images), measured from the registries and upstream source — no build, both stay:** +- **immich:** the only PostgreSQL 18 images carry VectorChord 0.5.3+ and **no pgvecto.rs**; PostgreSQL 17 carries only + pgvecto.rs 0.3.0. So any major move of ours would also swap an extension version → the stop rule would apply. It does + not arise: upstream runs 14, so the rule says stay. Recorded in R-463. +- **adventurelog (PostGIS):** every candidate tag is PostGIS 3.x; a dump/load is PostGIS's own "hard upgrade" (the dump + carries `CREATE EXTENSION postgis`, no `postgis_extensions_upgrade()` needed). Moot: stay 16. + +## Part A — per-app outcome (the part-10 method: bench → 9202 → `--write-ladder` → one commit) + +| app | bench (LXC 9401, harness v4) | box 9202 (controller 0.283.1, the guarded Update) | undo case on 9202 (the load fails: `adminpack`) | memory (anon peak, 10 min) | catalog | +|---|---|---|---|---|---| +| rallly | converted 21.4 s (dump 0.54 s / 92 kB, load 1.05 s), 31 tables equal, poll read back | CONVERTED 16 → 18 in 7.1 s (2 dbs, 31 tables, 138 rows equal), done 32.9 s, poll read back | undone in 57.5 s, back on 16, poll read back | app 61.6 %, db 2.1 % | `25ffd89` | +| outline | converted 26.7 s (dump 0.58 s / 128 kB, load 1.68 s), 42 tables equal, document read back | CONVERTED 16 → 18 in 7.9 s (2 dbs, 42 tables, 312 rows equal), done 41.1 s, document read back | undone in 57.5 s, back on 16, document read back | app 48.9 %, db 5.4 % | `aeb0cd6` | +| sparkyfitness | converted 13.3 s (dump 0.69 s / 378 kB, load 3.99 s), 94 tables equal, weight read back | CONVERTED 15 → 18 in 9.8 s (2 dbs, 94 tables, 261 rows equal), done 58.5 s, weight read back | (after a reinstall at 15) undone in 74.9 s, back on 15, weight read back | server 31.3 %, db 1.8 % | `1666572` | + +No step is `memory_tight`; no limit moved; no per-box cost. Evidence: `bench/apps//bench/`, `box//{prep,move,undo,undo-setup}.txt`, +`box//{box-verdict,undo-verdict}-*.json`. Fixtures: catalog `e6f3ec2`. The engine gate printed ALLOWED for all three on push. + +**Seed routes — all three are the app's own front door; decision 52 was NOT needed and is not recorded:** +sparkyfitness (better-auth sign-up + a check-in), outline (`installation.create`, its self-hosted first-run route, + an API +key + a document), rallly (sign-up, then the six-digit e-mail code READ from its own `verifications` row in place of a mailbox, +verify-email, `polls.make`). Negative control on every read-back. + +## Part B — the demo boxes + +Neither demo box has rallly, outline or sparkyfitness installed (demo-hp 9201: adventurelog, bentopdf, bookstack, +calibre-web, docmost, kimai, opengist, paperless-ngx, privatebin, romm; demo-felhom: opengist). Nothing installed for this. +Part F's moves (bookstack, kimai) ARE on demo-hp: their conversion-free steps ran through the chain press of Part C — see `C/`. + +## Part C, Part D, Part E, Part F — see `C/README.md`, `../catalog-currency-2026-09-30.md`, `E/`, `F/`. diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/B1-bench-create.txt b/documentation/audits/pg-last-six-2026-09-30/bench/B1-bench-create.txt new file mode 100644 index 00000000..b61c09ea --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/B1-bench-create.txt @@ -0,0 +1,27 @@ +## 2026-09-30T10:06:51Z bench create — BEFORE +VMID Status Lock Name +9201 running demo-hp +9202 running demo-hp-scratch +local-lvm lvmthin active 56487936 33943600 22544335 60.09% +nvme-scratch dir active 983379700 77027380 856325708 7.83% + total used free shared buff/cache available +Mem: 29 5 13 0 11 24 +Swap: 7 0 7 +Configuration file 'nodes/demo-hp/lxc/9401.conf' does not exist ++ pveam download local debian-13-standard_13.6-1_amd64.tar.zst ++ tail -1 +download of 'http://download.proxmox.com/images/system/debian-13-standard_13.6-1_amd64.tar.zst' to '/var/lib/vz/template/cache/debian-13-standard_13.6-1_amd64.tar.zst' finished ++ pct create 9401 local:vztmpl/debian-13-standard_13.6-1_amd64.tar.zst --hostname upgrade-harness --cores 6 --memory 10240 --swap 0 --rootfs nvme-scratch:40 --net0 name=eth0,bridge=vmbr0,ip=dhcp --unprivileged 1 --features nesting=1,keyctl=1 --onboot 0 ++ tail -2 +Creating SSH host key 'ssh_host_ecdsa_key' - this may take some time ... +done: SHA256:a/1S11R8XE59oP4Jt2fimrnx1HHQY7Nj2d948B/vf64 root@upgrade-harness ++ pct start 9401 ++ sleep 15 ++ pct exec 9401 -- bash -c 'hostname; ip -4 -o addr show eth0 | awk "{print \$4}"; apt-get update -qq >/dev/null 2>&1; DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker.io docker-compose python3 python3-yaml curl postgresql-client >/dev/null 2>&1; docker --version; docker compose version; python3 --version; docker network create traefik-public >/dev/null && echo traefik-public-net; curl -s -o /dev/null -w net-%{http_code} https://ghcr.io/' +upgrade-harness +192.168.0.115/24 +Docker version 26.1.5+dfsg1, build a72d7cd +Docker Compose version 2.26.1-4 +Python 3.13.5 +traefik-public-net +net-301 \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/B9-bench-destroy.txt b/documentation/audits/pg-last-six-2026-09-30/bench/B9-bench-destroy.txt new file mode 100644 index 00000000..d20bdec5 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/B9-bench-destroy.txt @@ -0,0 +1,13 @@ +## 2026-09-30T12:44:24Z bench destroy +upgrade-harness +purging CT 9401 from related configurations.. +destroyed-9401 +template-removed +VMID Status Lock Name +9201 running demo-hp +9202 running demo-hp-scratch +local-lvm lvmthin active 56487936 34802217 21685718 61.61% +nvme-scratch dir active 983379700 77129948 856223140 7.84% +/tmp/fx.tgz +/tmp/probe.py +host-tmp-cleaned diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/MV-outline.log b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/MV-outline.log new file mode 100644 index 00000000..77968a4d --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/MV-outline.log @@ -0,0 +1,167 @@ +[10:24:54] scratch drive folders cleared before FROM (R-656): none existed +[10:24:54] MV-outline: deploying outline at FROM {'outline': 'outlinewiki/outline:1.9.1', 'outline-postgres': 'postgres:16-alpine', 'outline-redis': 'redis:7-alpine'} +[10:25:37] FROM settled=True in 31.2s :: {"outline": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "outline-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "outline-redis": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:25:37] fixture: the BOX walk's own (Outline), through upgrade_boxport +[10:25:37] outline: installation.create http=302 +[10:25:38] outline: seeded document drilldoc-5ba9517c +[10:25:38] outline: readback of the seeded document http=200 found=True +[10:25:38] C1 (seed reads back BEFORE): True +[10:25:38] MV-outline: PostgreSQL major move {'service': 'outline-postgres', 'engine': 'postgres', 'from': 16, 'to': 18} — converting on the bench before the swap +[10:26:05] CONVERTED outline-postgres PostgreSQL 16 -> 18 in 26.7s (dump 0.58s / 127706 B, load 1.68s, check equal over 42 tables) +[10:26:05] MV-outline: swapping to TO {'outline': 'outlinewiki/outline:1.9.1', 'outline-postgres': 'postgres:18-alpine', 'outline-redis': 'redis:7-alpine'} +[10:26:16] TO up -d rc=0 +[10:26:47] TO settled=True in 31.1s :: {"outline": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "outline-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "outline-redis": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:26:47] engine state outline-postgres: 18 +[10:26:48] migration lines observed: 0 +[10:26:48] outline: readback of the seeded document http=200 found=True +[10:26:48] RESULT (seed reads back AFTER): True +[10:26:48] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.3:3000 +[10:27:03] + 15s outline=373M/768M peak=379M kills=0 rs=0 outline-postgres=138M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=8M kills=0 rs=0 reqs=288 +[10:27:19] + 30s outline=397M/768M peak=407M kills=0 rs=0 outline-postgres=143M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=8M kills=0 rs=0 reqs=580 +[10:27:34] + 46s outline=368M/768M peak=407M kills=0 rs=0 outline-postgres=138M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=8M kills=0 rs=0 reqs=868 +[10:27:49] + 61s outline=366M/768M peak=407M kills=0 rs=0 outline-postgres=138M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=8M kills=0 rs=0 reqs=1161 +[10:28:04] + 76s outline=365M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=8M kills=0 rs=0 reqs=1452 +[10:28:19] + 91s outline=374M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=1744 +[10:28:34] + 106s outline=370M/768M peak=407M kills=0 rs=0 outline-postgres=139M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=2032 +[10:28:50] + 121s outline=371M/768M peak=407M kills=0 rs=0 outline-postgres=144M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=2328 +[10:29:05] + 136s outline=368M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=2617 +[10:29:20] + 152s outline=377M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=2908 +[10:29:35] + 167s outline=364M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=3196 +[10:29:50] + 182s outline=357M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=3492 +[10:30:05] + 197s outline=349M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=3784 +[10:30:21] + 212s outline=361M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=4072 +[10:30:36] + 228s outline=358M/768M peak=407M kills=0 rs=0 outline-postgres=147M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=4360 +[10:30:51] + 243s outline=359M/768M peak=407M kills=0 rs=0 outline-postgres=139M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=4656 +[10:31:06] + 258s outline=349M/768M peak=407M kills=0 rs=0 outline-postgres=142M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=4948 +[10:31:21] + 273s outline=352M/768M peak=407M kills=0 rs=0 outline-postgres=143M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=5236 +[10:31:36] + 288s outline=361M/768M peak=407M kills=0 rs=0 outline-postgres=143M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=5528 +[10:31:52] + 303s outline=352M/768M peak=407M kills=0 rs=0 outline-postgres=145M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=5824 +[10:32:07] + 319s outline=351M/768M peak=407M kills=0 rs=0 outline-postgres=149M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=6116 +[10:32:22] + 334s outline=367M/768M peak=407M kills=0 rs=0 outline-postgres=151M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=6406 +[10:32:37] + 349s outline=363M/768M peak=407M kills=0 rs=0 outline-postgres=152M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=6696 +[10:32:52] + 364s outline=354M/768M peak=407M kills=0 rs=0 outline-postgres=153M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=6992 +[10:33:08] + 379s outline=351M/768M peak=407M kills=0 rs=0 outline-postgres=153M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=7281 +[10:33:23] + 394s outline=369M/768M peak=407M kills=0 rs=0 outline-postgres=154M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=7573 +[10:33:38] + 410s outline=357M/768M peak=407M kills=0 rs=0 outline-postgres=154M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=7865 +[10:33:53] + 425s outline=354M/768M peak=407M kills=0 rs=0 outline-postgres=157M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=8158 +[10:34:08] + 440s outline=358M/768M peak=407M kills=0 rs=0 outline-postgres=151M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=8449 +[10:34:23] + 455s outline=379M/768M peak=407M kills=0 rs=0 outline-postgres=156M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=8741 +[10:34:39] + 470s outline=361M/768M peak=407M kills=0 rs=0 outline-postgres=151M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=9030 +[10:34:54] + 486s outline=361M/768M peak=407M kills=0 rs=0 outline-postgres=153M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=9325 +[10:35:09] + 501s outline=356M/768M peak=407M kills=0 rs=0 outline-postgres=154M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=9617 +[10:35:24] + 516s outline=375M/768M peak=407M kills=0 rs=0 outline-postgres=153M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=9905 +[10:35:39] + 531s outline=370M/768M peak=407M kills=0 rs=0 outline-postgres=155M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=10197 +[10:35:55] + 546s outline=357M/768M peak=407M kills=0 rs=0 outline-postgres=153M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=10493 +[10:36:10] + 562s outline=361M/768M peak=407M kills=0 rs=0 outline-postgres=153M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=10785 +[10:36:25] + 577s outline=365M/768M peak=407M kills=0 rs=0 outline-postgres=153M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=11076 +[10:36:40] + 592s outline=376M/768M peak=407M kills=0 rs=0 outline-postgres=151M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=11367 +[10:36:55] + 607s outline=363M/768M peak=407M kills=0 rs=0 outline-postgres=151M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=11661 +[10:36:56] memory watch: killed=False tight=[] requests=11661 codes={'200': 10128, '429': 1533} +[10:36:56] MV-outline: ABORT — putting the FROM images back +[10:40:04] ABORT: the app did NOT come back (rc=1, 180.6s) +{ + "harness_version": 4, + "edge": "MV-outline", + "app": "outline", + "note": "night 2026-09-23 within-a-major move: outline-postgres=postgres:18-alpine", + "from": { + "outline": "outlinewiki/outline:1.9.1", + "outline-postgres": "postgres:16-alpine", + "outline-redis": "redis:7-alpine" + }, + "to": { + "outline": "outlinewiki/outline:1.9.1", + "outline-postgres": "postgres:18-alpine", + "outline-redis": "redis:7-alpine" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": null, + "abort": "refuses", + "abort_detail": "esql/data\".\n\u001b[2Koutline-postgres | The files belonging to this database system will be owned by user \"postgres\".\n\u001b[2Koutline-postgres | This user must also own the server process.\n\u001b[2Koutline-postgres | \n\u001b[2Koutline-postgres | The database cluster will be initialized with locale \"en_US.utf8\".\n\u001b[2Koutline-postgres | The default database encoding has accordingly been set to \"UTF8\".\n\u001b[2Koutline-postgres | The default text search configuration will be set to \"english\".\n\u001b[2Koutline-postgres | \n\u001b[2Koutline-postgres | Data page checksums are disabled.\n\u001b[2Koutline-postgres | \n\u001b[2Koutline-postgres | initdb: error: directory \"/var/lib/postgresql/data\" exists but is not empty\n\u001b[2Koutline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory \"/var/lib/postgresql/data\" or run initdb with an argument other than \"/var/lib/postgresql/data\".", + "engine_state_after": { + "outline-postgres": { + "image": "postgres:18-alpine", + "probe": "datadir major version", + "answer": "18", + "probe_rc": 0 + } + }, + "memory": { + "soak_s": 607.3, + "requested_s": 600, + "requests": 11661, + "codes": { + "200": 10128, + "429": 1533 + }, + "first_kill": null, + "containers": { + "outline": { + "limit": 805306368, + "peak": 427581440, + "peak_pct": 0.531, + "anon_peak_sampled": 393965568, + "anon_peak_pct": 0.489, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + }, + "outline-postgres": { + "limit": 268435456, + "peak": 175697920, + "peak_pct": 0.655, + "anon_peak_sampled": 14499840, + "anon_peak_pct": 0.054, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + }, + "outline-redis": { + "limit": 134217728, + "peak": 9437184, + "peak_pct": 0.07, + "anon_peak_sampled": 3354624, + "anon_peak_pct": 0.025, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 31.1, + "measured_at": "2026-09-30T10:40:04Z", + "evidence": "evidence/MV-outline", + "scratch_cleared": [], + "engine_conversion": { + "service": "outline-postgres", + "engine": "postgres", + "from": 16, + "to": 18, + "dump_s": 0.58, + "dump_bytes": 127706, + "new_engine_ready_s": 2.2, + "load_s": 1.68, + "dropped": [ + "outline" + ], + "skipped_create_role": [ + "CREATE ROLE outline;" + ], + "result": "converted", + "check_equal": true, + "pg_version": "18", + "tables": 42, + "convert_s": 26.7 + }, + "files_changed": [], + "total_s": 910.2 +} diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/abort-refusal.txt b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/abort-refusal.txt new file mode 100644 index 00000000..cab3424f --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/abort-refusal.txt @@ -0,0 +1,76 @@ +outline-redis | 1:C 30 Sep 2026 12:24:55.235 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. +outline-redis | 1:C 30 Sep 2026 12:24:55.235 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo +outline-redis | 1:C 30 Sep 2026 12:24:55.235 * Redis version=7.4.11, bits=64, commit=00000000, modified=0, pid=1, just started +outline-redis | 1:C 30 Sep 2026 12:24:55.235 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf +outline-redis | 1:M 30 Sep 2026 12:24:55.235 * monotonic clock: POSIX clock_gettime +outline-redis | 1:M 30 Sep 2026 12:24:55.237 * Running mode=standalone, port=6379. +outline-redis | 1:M 30 Sep 2026 12:24:55.237 * Server initialized +outline-redis | 1:M 30 Sep 2026 12:24:55.237 * Ready to accept connections tcp +outline-redis | 1:signal-handler (1790763943) Received SIGTERM scheduling shutdown... +outline-redis | 1:M 30 Sep 2026 12:25:44.088 * User requested shutdown... +outline-redis | 1:M 30 Sep 2026 12:25:44.088 * Saving the final RDB snapshot before exiting. +outline-redis | 1:M 30 Sep 2026 12:25:44.095 * DB saved on disk +outline-redis | 1:M 30 Sep 2026 12:25:44.095 # Redis is now ready to exit, bye bye... +outline-redis | 1:C 30 Sep 2026 12:26:05.688 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. +outline-redis | 1:C 30 Sep 2026 12:26:05.688 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo +outline-redis | 1:C 30 Sep 2026 12:26:05.688 * Redis version=7.4.11, bits=64, commit=00000000, modified=0, pid=1, just started +outline-redis | 1:C 30 Sep 2026 12:26:05.688 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf +outline-redis | 1:M 30 Sep 2026 12:26:05.689 * monotonic clock: POSIX clock_gettime +outline-redis | 1:M 30 Sep 2026 12:26:05.690 * Running mode=standalone, port=6379. +outline-redis | 1:M 30 Sep 2026 12:26:05.691 * Server initialized +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * Loading RDB produced by version 7.4.11 +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * RDB age 21 seconds +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * RDB memory usage when created 1.94 Mb +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * Done loading RDB, keys loaded: 10, keys expired: 4. +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * DB loaded from disk: 0.000 seconds +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * Ready to accept connections tcp +outline-redis | 1:M 30 Sep 2026 12:31:06.082 * 100 changes in 300 seconds. Saving... +outline-redis | 1:M 30 Sep 2026 12:31:06.083 * Background saving started by pid 190 +outline-redis | 190:C 30 Sep 2026 12:31:06.091 * DB saved on disk +outline-redis | 190:C 30 Sep 2026 12:31:06.092 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB +outline-redis | 1:M 30 Sep 2026 12:31:06.184 * Background saving terminated with success +outline-redis | 1:M 30 Sep 2026 12:36:07.067 * 100 changes in 300 seconds. Saving... +outline-redis | 1:M 30 Sep 2026 12:36:07.068 * Background saving started by pid 370 +outline-redis | 370:C 30 Sep 2026 12:36:07.080 * DB saved on disk +outline-redis | 370:C 30 Sep 2026 12:36:07.081 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB +outline-redis | 1:M 30 Sep 2026 12:36:07.169 * Background saving terminated with success +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline-postgres | This user must also own the server process. +outline-postgres | +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline-postgres | This user must also own the server process. +outline-postgres | +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline-postgres | This user must also own the server process. +outline-postgres | +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/abort-states.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/abort-states.json new file mode 100644 index 00000000..7d5091f1 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/abort-states.json @@ -0,0 +1,20 @@ +{ + "outline": { + "status": "created", + "health": null, + "restarts": 0, + "exit": 0 + }, + "outline-postgres": { + "status": "restarting", + "health": "unhealthy", + "restarts": 0, + "exit": 1 + }, + "outline-redis": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/compose-final.log b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/compose-final.log new file mode 100644 index 00000000..f67b78cc --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/compose-final.log @@ -0,0 +1,168 @@ +outline-redis | 1:C 30 Sep 2026 12:24:55.235 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. +outline-redis | 1:C 30 Sep 2026 12:24:55.235 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo +outline-redis | 1:C 30 Sep 2026 12:24:55.235 * Redis version=7.4.11, bits=64, commit=00000000, modified=0, pid=1, just started +outline-redis | 1:C 30 Sep 2026 12:24:55.235 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf +outline-redis | 1:M 30 Sep 2026 12:24:55.235 * monotonic clock: POSIX clock_gettime +outline-redis | 1:M 30 Sep 2026 12:24:55.237 * Running mode=standalone, port=6379. +outline-redis | 1:M 30 Sep 2026 12:24:55.237 * Server initialized +outline-redis | 1:M 30 Sep 2026 12:24:55.237 * Ready to accept connections tcp +outline-redis | 1:signal-handler (1790763943) Received SIGTERM scheduling shutdown... +outline-redis | 1:M 30 Sep 2026 12:25:44.088 * User requested shutdown... +outline-redis | 1:M 30 Sep 2026 12:25:44.088 * Saving the final RDB snapshot before exiting. +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline-redis | 1:M 30 Sep 2026 12:25:44.095 * DB saved on disk +outline-redis | 1:M 30 Sep 2026 12:25:44.095 # Redis is now ready to exit, bye bye... +outline-redis | 1:C 30 Sep 2026 12:26:05.688 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. +outline-redis | 1:C 30 Sep 2026 12:26:05.688 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo +outline-redis | 1:C 30 Sep 2026 12:26:05.688 * Redis version=7.4.11, bits=64, commit=00000000, modified=0, pid=1, just started +outline-redis | 1:C 30 Sep 2026 12:26:05.688 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf +outline-redis | 1:M 30 Sep 2026 12:26:05.689 * monotonic clock: POSIX clock_gettime +outline-redis | 1:M 30 Sep 2026 12:26:05.690 * Running mode=standalone, port=6379. +outline-redis | 1:M 30 Sep 2026 12:26:05.691 * Server initialized +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * Loading RDB produced by version 7.4.11 +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * RDB age 21 seconds +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * RDB memory usage when created 1.94 Mb +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * Done loading RDB, keys loaded: 10, keys expired: 4. +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * DB loaded from disk: 0.000 seconds +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * Ready to accept connections tcp +outline-redis | 1:M 30 Sep 2026 12:31:06.082 * 100 changes in 300 seconds. Saving... +outline-redis | 1:M 30 Sep 2026 12:31:06.083 * Background saving started by pid 190 +outline-redis | 190:C 30 Sep 2026 12:31:06.091 * DB saved on disk +outline-redis | 190:C 30 Sep 2026 12:31:06.092 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB +outline-redis | 1:M 30 Sep 2026 12:31:06.184 * Background saving terminated with success +outline-postgres | This user must also own the server process. +outline-postgres | +outline-redis | 1:M 30 Sep 2026 12:36:07.067 * 100 changes in 300 seconds. Saving... +outline-redis | 1:M 30 Sep 2026 12:36:07.068 * Background saving started by pid 370 +outline-redis | 370:C 30 Sep 2026 12:36:07.080 * DB saved on disk +outline-redis | 370:C 30 Sep 2026 12:36:07.081 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB +outline-redis | 1:M 30 Sep 2026 12:36:07.169 * Background saving terminated with success +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline-postgres | This user must also own the server process. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline-postgres | This user must also own the server process. +outline-postgres | +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline-postgres | This user must also own the server process. +outline-postgres | +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline-postgres | This user must also own the server process. +outline-postgres | +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline-postgres | This user must also own the server process. +outline-postgres | +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline-postgres | This user must also own the server process. +outline-postgres | +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline-postgres | This user must also own the server process. +outline-postgres | +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline-postgres | This user must also own the server process. +outline-postgres | +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline-postgres | This user must also own the server process. +outline-postgres | +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline-postgres | This user must also own the server process. +outline-postgres | +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline-postgres | This user must also own the server process. +outline-postgres | +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are disabled. +outline-postgres | +outline-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +outline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/convert-check-after.txt b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/convert-check-after.txt new file mode 100644 index 00000000..215889af --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/convert-check-after.txt @@ -0,0 +1,49 @@ +db:outline owner=outline enc=UTF8 coll=en_US.utf8 +db:postgres owner=outline enc=UTF8 coll=en_US.utf8 +ext:outline:pg_trgm +ext:outline:plpgsql +ext:outline:unaccent +ext:outline:uuid-ossp +role:outline super=true login=true pw=true +rows:outline:public.SequelizeMeta=295 +rows:outline:public.access_requests=0 +rows:outline:public.apiKeys=1 +rows:outline:public.attachments=0 +rows:outline:public.authentication_providers=0 +rows:outline:public.authentications=0 +rows:outline:public.collections=1 +rows:outline:public.comments=0 +rows:outline:public.document_insights=0 +rows:outline:public.documents=1 +rows:outline:public.emojis=0 +rows:outline:public.events=9 +rows:outline:public.external_groups=0 +rows:outline:public.file_operations=0 +rows:outline:public.group_permissions=0 +rows:outline:public.group_users=0 +rows:outline:public.groups=0 +rows:outline:public.import_tasks=0 +rows:outline:public.imports=0 +rows:outline:public.integrations=0 +rows:outline:public.notifications=0 +rows:outline:public.oauth_authentications=0 +rows:outline:public.oauth_authorization_codes=0 +rows:outline:public.oauth_clients=0 +rows:outline:public.pins=0 +rows:outline:public.reactions=0 +rows:outline:public.relationships=0 +rows:outline:public.revisions=1 +rows:outline:public.search_queries=0 +rows:outline:public.share_subscriptions=0 +rows:outline:public.shares=0 +rows:outline:public.stars=0 +rows:outline:public.subscriptions=1 +rows:outline:public.team_domains=0 +rows:outline:public.teams=1 +rows:outline:public.user_authentications=0 +rows:outline:public.user_passkeys=0 +rows:outline:public.user_permissions=1 +rows:outline:public.users=1 +rows:outline:public.views=0 +rows:outline:public.webhook_deliveries=0 +rows:outline:public.webhook_subscriptions=0 diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/convert-check-before.txt b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/convert-check-before.txt new file mode 100644 index 00000000..215889af --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/convert-check-before.txt @@ -0,0 +1,49 @@ +db:outline owner=outline enc=UTF8 coll=en_US.utf8 +db:postgres owner=outline enc=UTF8 coll=en_US.utf8 +ext:outline:pg_trgm +ext:outline:plpgsql +ext:outline:unaccent +ext:outline:uuid-ossp +role:outline super=true login=true pw=true +rows:outline:public.SequelizeMeta=295 +rows:outline:public.access_requests=0 +rows:outline:public.apiKeys=1 +rows:outline:public.attachments=0 +rows:outline:public.authentication_providers=0 +rows:outline:public.authentications=0 +rows:outline:public.collections=1 +rows:outline:public.comments=0 +rows:outline:public.document_insights=0 +rows:outline:public.documents=1 +rows:outline:public.emojis=0 +rows:outline:public.events=9 +rows:outline:public.external_groups=0 +rows:outline:public.file_operations=0 +rows:outline:public.group_permissions=0 +rows:outline:public.group_users=0 +rows:outline:public.groups=0 +rows:outline:public.import_tasks=0 +rows:outline:public.imports=0 +rows:outline:public.integrations=0 +rows:outline:public.notifications=0 +rows:outline:public.oauth_authentications=0 +rows:outline:public.oauth_authorization_codes=0 +rows:outline:public.oauth_clients=0 +rows:outline:public.pins=0 +rows:outline:public.reactions=0 +rows:outline:public.relationships=0 +rows:outline:public.revisions=1 +rows:outline:public.search_queries=0 +rows:outline:public.share_subscriptions=0 +rows:outline:public.shares=0 +rows:outline:public.stars=0 +rows:outline:public.subscriptions=1 +rows:outline:public.team_domains=0 +rows:outline:public.teams=1 +rows:outline:public.user_authentications=0 +rows:outline:public.user_passkeys=0 +rows:outline:public.user_permissions=1 +rows:outline:public.users=1 +rows:outline:public.views=0 +rows:outline:public.webhook_deliveries=0 +rows:outline:public.webhook_subscriptions=0 diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/convert-load.err b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/convert-load.err new file mode 100644 index 00000000..e69de29b diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/engine-state.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/engine-state.json new file mode 100644 index 00000000..e1e459a5 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/engine-state.json @@ -0,0 +1,8 @@ +{ + "outline-postgres": { + "image": "postgres:18-alpine", + "probe": "datadir major version", + "answer": "18", + "probe_rc": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/files-after.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/files-after.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/files-after.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/files-before.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/files-before.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/files-before.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/memory-samples.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/memory-samples.json new file mode 100644 index 00000000..e19cfd38 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/memory-samples.json @@ -0,0 +1,1562 @@ +[ + { + "t": 15.2, + "containers": { + "outline": { + "limit": 805306368, + "current": 391995392, + "peak": 397692928, + "anon": 370151424, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 145125376, + "peak": 175697920, + "anon": 7352320, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6332416, + "peak": 9420800, + "anon": 3354624, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 288 + }, + { + "t": 30.3, + "containers": { + "outline": { + "limit": 805306368, + "current": 416808960, + "peak": 427581440, + "anon": 393965568, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 150011904, + "peak": 175697920, + "anon": 11149312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6529024, + "peak": 9420800, + "anon": 3301376, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 580 + }, + { + "t": 45.5, + "containers": { + "outline": { + "limit": 805306368, + "current": 386826240, + "peak": 427581440, + "anon": 364945408, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 145141760, + "peak": 175697920, + "anon": 7360512, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6799360, + "peak": 9420800, + "anon": 3305472, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 868 + }, + { + "t": 60.6, + "containers": { + "outline": { + "limit": 805306368, + "current": 384307200, + "peak": 427581440, + "anon": 362520576, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 145166336, + "peak": 175697920, + "anon": 7352320, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6545408, + "peak": 9420800, + "anon": 3309568, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1161 + }, + { + "t": 75.8, + "containers": { + "outline": { + "limit": 805306368, + "current": 383582208, + "peak": 427581440, + "anon": 361779200, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 148205568, + "peak": 175697920, + "anon": 9510912, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6037504, + "peak": 9420800, + "anon": 3313664, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1452 + }, + { + "t": 91.0, + "containers": { + "outline": { + "limit": 805306368, + "current": 392609792, + "peak": 427581440, + "anon": 371064832, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 148357120, + "peak": 175697920, + "anon": 9519104, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6295552, + "peak": 9437184, + "anon": 3313664, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1744 + }, + { + "t": 106.1, + "containers": { + "outline": { + "limit": 805306368, + "current": 388071424, + "peak": 427581440, + "anon": 366563328, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 145932288, + "peak": 175697920, + "anon": 7524352, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6037504, + "peak": 9437184, + "anon": 3305472, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2032 + }, + { + "t": 121.3, + "containers": { + "outline": { + "limit": 805306368, + "current": 389500928, + "peak": 427581440, + "anon": 367738880, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 151887872, + "peak": 175697920, + "anon": 12607488, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6041600, + "peak": 9437184, + "anon": 3317760, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2328 + }, + { + "t": 136.5, + "containers": { + "outline": { + "limit": 805306368, + "current": 386895872, + "peak": 427581440, + "anon": 364793856, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 148135936, + "peak": 175697920, + "anon": 9261056, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6557696, + "peak": 9437184, + "anon": 3317760, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2617 + }, + { + "t": 151.7, + "containers": { + "outline": { + "limit": 805306368, + "current": 395763712, + "peak": 427581440, + "anon": 373129216, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 148623360, + "peak": 175697920, + "anon": 9273344, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 5779456, + "peak": 9437184, + "anon": 3317760, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2908 + }, + { + "t": 166.8, + "containers": { + "outline": { + "limit": 805306368, + "current": 382062592, + "peak": 427581440, + "anon": 360747008, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 148623360, + "peak": 175697920, + "anon": 9269248, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6811648, + "peak": 9437184, + "anon": 3313664, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3196 + }, + { + "t": 182.0, + "containers": { + "outline": { + "limit": 805306368, + "current": 374968320, + "peak": 427581440, + "anon": 353636352, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 148115456, + "peak": 175697920, + "anon": 9261056, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6037504, + "peak": 9437184, + "anon": 3317760, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3492 + }, + { + "t": 197.2, + "containers": { + "outline": { + "limit": 805306368, + "current": 366678016, + "peak": 427581440, + "anon": 345653248, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 148709376, + "peak": 175697920, + "anon": 9269248, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6041600, + "peak": 9437184, + "anon": 3317760, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3784 + }, + { + "t": 212.4, + "containers": { + "outline": { + "limit": 805306368, + "current": 379441152, + "peak": 427581440, + "anon": 358322176, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 148144128, + "peak": 175697920, + "anon": 9273344, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6307840, + "peak": 9437184, + "anon": 3321856, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4072 + }, + { + "t": 227.5, + "containers": { + "outline": { + "limit": 805306368, + "current": 376299520, + "peak": 427581440, + "anon": 355172352, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 154476544, + "peak": 175697920, + "anon": 14499840, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6299648, + "peak": 9437184, + "anon": 3313664, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4360 + }, + { + "t": 242.7, + "containers": { + "outline": { + "limit": 805306368, + "current": 376659968, + "peak": 427581440, + "anon": 355393536, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 146567168, + "peak": 175697920, + "anon": 7360512, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6045696, + "peak": 9437184, + "anon": 3321856, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4656 + }, + { + "t": 257.9, + "containers": { + "outline": { + "limit": 805306368, + "current": 366714880, + "peak": 427581440, + "anon": 345907200, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 148955136, + "peak": 175697920, + "anon": 9326592, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6328320, + "peak": 9437184, + "anon": 3325952, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4948 + }, + { + "t": 273.0, + "containers": { + "outline": { + "limit": 805306368, + "current": 369561600, + "peak": 427581440, + "anon": 348258304, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 150945792, + "peak": 175697920, + "anon": 9326592, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6324224, + "peak": 9437184, + "anon": 3325952, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5236 + }, + { + "t": 288.3, + "containers": { + "outline": { + "limit": 805306368, + "current": 379170816, + "peak": 427581440, + "anon": 358240256, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 150466560, + "peak": 175697920, + "anon": 7434240, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6074368, + "peak": 9437184, + "anon": 3325952, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5528 + }, + { + "t": 303.4, + "containers": { + "outline": { + "limit": 805306368, + "current": 369516544, + "peak": 427581440, + "anon": 348594176, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 153051136, + "peak": 175697920, + "anon": 7446528, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6332416, + "peak": 9437184, + "anon": 3325952, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5824 + }, + { + "t": 318.6, + "containers": { + "outline": { + "limit": 805306368, + "current": 368132096, + "peak": 427581440, + "anon": 346857472, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 156254208, + "peak": 175697920, + "anon": 9347072, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6066176, + "peak": 9437184, + "anon": 3325952, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6116 + }, + { + "t": 333.8, + "containers": { + "outline": { + "limit": 805306368, + "current": 385638400, + "peak": 427581440, + "anon": 363630592, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 158375936, + "peak": 175697920, + "anon": 9351168, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6590464, + "peak": 9437184, + "anon": 3325952, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6406 + }, + { + "t": 349.0, + "containers": { + "outline": { + "limit": 805306368, + "current": 381059072, + "peak": 427581440, + "anon": 359387136, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 160260096, + "peak": 175697920, + "anon": 9404416, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6074368, + "peak": 9437184, + "anon": 3325952, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6696 + }, + { + "t": 364.1, + "containers": { + "outline": { + "limit": 805306368, + "current": 372146176, + "peak": 427581440, + "anon": 350539776, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 160911360, + "peak": 175697920, + "anon": 9392128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6070272, + "peak": 9437184, + "anon": 3325952, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6992 + }, + { + "t": 379.3, + "containers": { + "outline": { + "limit": 805306368, + "current": 368594944, + "peak": 427581440, + "anon": 347222016, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 160985088, + "peak": 175697920, + "anon": 9453568, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6324224, + "peak": 9437184, + "anon": 3317760, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7281 + }, + { + "t": 394.5, + "containers": { + "outline": { + "limit": 805306368, + "current": 387928064, + "peak": 427581440, + "anon": 365846528, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 161902592, + "peak": 175697920, + "anon": 9457664, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6332416, + "peak": 9437184, + "anon": 3330048, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7573 + }, + { + "t": 409.8, + "containers": { + "outline": { + "limit": 805306368, + "current": 374562816, + "peak": 427581440, + "anon": 353148928, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 161533952, + "peak": 175697920, + "anon": 9457664, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6598656, + "peak": 9437184, + "anon": 3330048, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7865 + }, + { + "t": 424.9, + "containers": { + "outline": { + "limit": 805306368, + "current": 371380224, + "peak": 427581440, + "anon": 350007296, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 165269504, + "peak": 175697920, + "anon": 12816384, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6348800, + "peak": 9437184, + "anon": 3330048, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8158 + }, + { + "t": 440.1, + "containers": { + "outline": { + "limit": 805306368, + "current": 376340480, + "peak": 427581440, + "anon": 355315712, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 158633984, + "peak": 175697920, + "anon": 7544832, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6336512, + "peak": 9437184, + "anon": 3330048, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8449 + }, + { + "t": 455.2, + "containers": { + "outline": { + "limit": 805306368, + "current": 397701120, + "peak": 427581440, + "anon": 375185408, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 164352000, + "peak": 175697920, + "anon": 12382208, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6074368, + "peak": 9437184, + "anon": 3334144, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8741 + }, + { + "t": 470.4, + "containers": { + "outline": { + "limit": 805306368, + "current": 379527168, + "peak": 427581440, + "anon": 358502400, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 159277056, + "peak": 175697920, + "anon": 7544832, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6193152, + "peak": 9437184, + "anon": 3330048, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9030 + }, + { + "t": 485.6, + "containers": { + "outline": { + "limit": 805306368, + "current": 379469824, + "peak": 427581440, + "anon": 358400000, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 160985088, + "peak": 175697920, + "anon": 9445376, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 5816320, + "peak": 9437184, + "anon": 3334144, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9325 + }, + { + "t": 500.7, + "containers": { + "outline": { + "limit": 805306368, + "current": 373592064, + "peak": 427581440, + "anon": 352518144, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 161595392, + "peak": 175697920, + "anon": 9494528, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6344704, + "peak": 9437184, + "anon": 3330048, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9617 + }, + { + "t": 515.9, + "containers": { + "outline": { + "limit": 805306368, + "current": 393854976, + "peak": 427581440, + "anon": 372293632, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 161161216, + "peak": 175697920, + "anon": 9445376, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6348800, + "peak": 9437184, + "anon": 3334144, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9905 + }, + { + "t": 531.1, + "containers": { + "outline": { + "limit": 805306368, + "current": 388874240, + "peak": 427581440, + "anon": 367329280, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 163078144, + "peak": 175697920, + "anon": 11345920, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6615040, + "peak": 9437184, + "anon": 3330048, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10197 + }, + { + "t": 546.3, + "containers": { + "outline": { + "limit": 805306368, + "current": 374358016, + "peak": 427581440, + "anon": 353263616, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 161226752, + "peak": 175697920, + "anon": 9457664, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6074368, + "peak": 9437184, + "anon": 3334144, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10493 + }, + { + "t": 561.5, + "containers": { + "outline": { + "limit": 805306368, + "current": 378703872, + "peak": 427581440, + "anon": 356868096, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 161193984, + "peak": 175697920, + "anon": 9457664, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6598656, + "peak": 9437184, + "anon": 3330048, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10785 + }, + { + "t": 576.7, + "containers": { + "outline": { + "limit": 805306368, + "current": 383598592, + "peak": 427581440, + "anon": 362491904, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 161234944, + "peak": 175697920, + "anon": 9457664, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6094848, + "peak": 9437184, + "anon": 3338240, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11076 + }, + { + "t": 591.9, + "containers": { + "outline": { + "limit": 805306368, + "current": 394784768, + "peak": 427581440, + "anon": 373202944, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 159154176, + "peak": 175697920, + "anon": 7544832, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6860800, + "peak": 9437184, + "anon": 3334144, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11367 + }, + { + "t": 607.1, + "containers": { + "outline": { + "limit": 805306368, + "current": 380829696, + "peak": 427581440, + "anon": 359784448, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-postgres": { + "limit": 268435456, + "current": 159268864, + "peak": 175697920, + "anon": 7544832, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "outline-redis": { + "limit": 134217728, + "current": 6086656, + "peak": 9437184, + "anon": 3338240, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11661 + } +] \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/migration-lines.txt b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/migration-lines.txt new file mode 100644 index 00000000..e69de29b diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/run.log b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/run.log new file mode 100644 index 00000000..ba5d3c1f --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/run.log @@ -0,0 +1,61 @@ +[10:24:54] scratch drive folders cleared before FROM (R-656): none existed +[10:24:54] MV-outline: deploying outline at FROM {'outline': 'outlinewiki/outline:1.9.1', 'outline-postgres': 'postgres:16-alpine', 'outline-redis': 'redis:7-alpine'} +[10:25:37] FROM settled=True in 31.2s :: {"outline": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "outline-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "outline-redis": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:25:37] fixture: the BOX walk's own (Outline), through upgrade_boxport +[10:25:37] outline: installation.create http=302 +[10:25:38] outline: seeded document drilldoc-5ba9517c +[10:25:38] outline: readback of the seeded document http=200 found=True +[10:25:38] C1 (seed reads back BEFORE): True +[10:25:38] MV-outline: PostgreSQL major move {'service': 'outline-postgres', 'engine': 'postgres', 'from': 16, 'to': 18} — converting on the bench before the swap +[10:26:05] CONVERTED outline-postgres PostgreSQL 16 -> 18 in 26.7s (dump 0.58s / 127706 B, load 1.68s, check equal over 42 tables) +[10:26:05] MV-outline: swapping to TO {'outline': 'outlinewiki/outline:1.9.1', 'outline-postgres': 'postgres:18-alpine', 'outline-redis': 'redis:7-alpine'} +[10:26:16] TO up -d rc=0 +[10:26:47] TO settled=True in 31.1s :: {"outline": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "outline-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "outline-redis": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:26:47] engine state outline-postgres: 18 +[10:26:48] migration lines observed: 0 +[10:26:48] outline: readback of the seeded document http=200 found=True +[10:26:48] RESULT (seed reads back AFTER): True +[10:26:48] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.3:3000 +[10:27:03] + 15s outline=373M/768M peak=379M kills=0 rs=0 outline-postgres=138M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=8M kills=0 rs=0 reqs=288 +[10:27:19] + 30s outline=397M/768M peak=407M kills=0 rs=0 outline-postgres=143M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=8M kills=0 rs=0 reqs=580 +[10:27:34] + 46s outline=368M/768M peak=407M kills=0 rs=0 outline-postgres=138M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=8M kills=0 rs=0 reqs=868 +[10:27:49] + 61s outline=366M/768M peak=407M kills=0 rs=0 outline-postgres=138M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=8M kills=0 rs=0 reqs=1161 +[10:28:04] + 76s outline=365M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=8M kills=0 rs=0 reqs=1452 +[10:28:19] + 91s outline=374M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=1744 +[10:28:34] + 106s outline=370M/768M peak=407M kills=0 rs=0 outline-postgres=139M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=2032 +[10:28:50] + 121s outline=371M/768M peak=407M kills=0 rs=0 outline-postgres=144M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=2328 +[10:29:05] + 136s outline=368M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=2617 +[10:29:20] + 152s outline=377M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=2908 +[10:29:35] + 167s outline=364M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=3196 +[10:29:50] + 182s outline=357M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=3492 +[10:30:05] + 197s outline=349M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=3784 +[10:30:21] + 212s outline=361M/768M peak=407M kills=0 rs=0 outline-postgres=141M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=4072 +[10:30:36] + 228s outline=358M/768M peak=407M kills=0 rs=0 outline-postgres=147M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=4360 +[10:30:51] + 243s outline=359M/768M peak=407M kills=0 rs=0 outline-postgres=139M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=4656 +[10:31:06] + 258s outline=349M/768M peak=407M kills=0 rs=0 outline-postgres=142M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=4948 +[10:31:21] + 273s outline=352M/768M peak=407M kills=0 rs=0 outline-postgres=143M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=5236 +[10:31:36] + 288s outline=361M/768M peak=407M kills=0 rs=0 outline-postgres=143M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=5528 +[10:31:52] + 303s outline=352M/768M peak=407M kills=0 rs=0 outline-postgres=145M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=5824 +[10:32:07] + 319s outline=351M/768M peak=407M kills=0 rs=0 outline-postgres=149M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=6116 +[10:32:22] + 334s outline=367M/768M peak=407M kills=0 rs=0 outline-postgres=151M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=6406 +[10:32:37] + 349s outline=363M/768M peak=407M kills=0 rs=0 outline-postgres=152M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=6696 +[10:32:52] + 364s outline=354M/768M peak=407M kills=0 rs=0 outline-postgres=153M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=6992 +[10:33:08] + 379s outline=351M/768M peak=407M kills=0 rs=0 outline-postgres=153M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=7281 +[10:33:23] + 394s outline=369M/768M peak=407M kills=0 rs=0 outline-postgres=154M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=7573 +[10:33:38] + 410s outline=357M/768M peak=407M kills=0 rs=0 outline-postgres=154M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=7865 +[10:33:53] + 425s outline=354M/768M peak=407M kills=0 rs=0 outline-postgres=157M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=8158 +[10:34:08] + 440s outline=358M/768M peak=407M kills=0 rs=0 outline-postgres=151M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=8449 +[10:34:23] + 455s outline=379M/768M peak=407M kills=0 rs=0 outline-postgres=156M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=8741 +[10:34:39] + 470s outline=361M/768M peak=407M kills=0 rs=0 outline-postgres=151M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=9030 +[10:34:54] + 486s outline=361M/768M peak=407M kills=0 rs=0 outline-postgres=153M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=9325 +[10:35:09] + 501s outline=356M/768M peak=407M kills=0 rs=0 outline-postgres=154M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=9617 +[10:35:24] + 516s outline=375M/768M peak=407M kills=0 rs=0 outline-postgres=153M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=9905 +[10:35:39] + 531s outline=370M/768M peak=407M kills=0 rs=0 outline-postgres=155M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=10197 +[10:35:55] + 546s outline=357M/768M peak=407M kills=0 rs=0 outline-postgres=153M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=10493 +[10:36:10] + 562s outline=361M/768M peak=407M kills=0 rs=0 outline-postgres=153M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=10785 +[10:36:25] + 577s outline=365M/768M peak=407M kills=0 rs=0 outline-postgres=153M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=11076 +[10:36:40] + 592s outline=376M/768M peak=407M kills=0 rs=0 outline-postgres=151M/256M peak=167M kills=0 rs=0 outline-redis=6M/128M peak=9M kills=0 rs=0 reqs=11367 +[10:36:55] + 607s outline=363M/768M peak=407M kills=0 rs=0 outline-postgres=151M/256M peak=167M kills=0 rs=0 outline-redis=5M/128M peak=9M kills=0 rs=0 reqs=11661 +[10:36:56] memory watch: killed=False tight=[] requests=11661 codes={'200': 10128, '429': 1533} +[10:36:56] MV-outline: ABORT — putting the FROM images back +[10:40:04] ABORT: the app did NOT come back (rc=1, 180.6s) \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/to-full.log b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/to-full.log new file mode 100644 index 00000000..f69c9df7 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/to-full.log @@ -0,0 +1,748 @@ +outline-redis | 1:C 30 Sep 2026 12:24:55.235 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. +outline-redis | 1:C 30 Sep 2026 12:24:55.235 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo +outline-redis | 1:C 30 Sep 2026 12:24:55.235 * Redis version=7.4.11, bits=64, commit=00000000, modified=0, pid=1, just started +outline-redis | 1:C 30 Sep 2026 12:24:55.235 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf +outline-redis | 1:M 30 Sep 2026 12:24:55.235 * monotonic clock: POSIX clock_gettime +outline-redis | 1:M 30 Sep 2026 12:24:55.237 * Running mode=standalone, port=6379. +outline-redis | 1:M 30 Sep 2026 12:24:55.237 * Server initialized +outline-redis | 1:M 30 Sep 2026 12:24:55.237 * Ready to accept connections tcp +outline-redis | 1:signal-handler (1790763943) Received SIGTERM scheduling shutdown... +outline-redis | 1:M 30 Sep 2026 12:25:44.088 * User requested shutdown... +outline-redis | 1:M 30 Sep 2026 12:25:44.088 * Saving the final RDB snapshot before exiting. +outline-redis | 1:M 30 Sep 2026 12:25:44.095 * DB saved on disk +outline-redis | 1:M 30 Sep 2026 12:25:44.095 # Redis is now ready to exit, bye bye... +outline-redis | 1:C 30 Sep 2026 12:26:05.688 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. +outline-redis | 1:C 30 Sep 2026 12:26:05.688 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo +outline-redis | 1:C 30 Sep 2026 12:26:05.688 * Redis version=7.4.11, bits=64, commit=00000000, modified=0, pid=1, just started +outline-redis | 1:C 30 Sep 2026 12:26:05.688 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf +outline-redis | 1:M 30 Sep 2026 12:26:05.689 * monotonic clock: POSIX clock_gettime +outline-redis | 1:M 30 Sep 2026 12:26:05.690 * Running mode=standalone, port=6379. +outline-redis | 1:M 30 Sep 2026 12:26:05.691 * Server initialized +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * Loading RDB produced by version 7.4.11 +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * RDB age 21 seconds +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * RDB memory usage when created 1.94 Mb +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * Done loading RDB, keys loaded: 10, keys expired: 4. +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * DB loaded from disk: 0.000 seconds +outline-redis | 1:M 30 Sep 2026 12:26:05.692 * Ready to accept connections tcp +outline | {"label":"lifecycle","level":"info","message":"Note: Restricting process count to 1 due to use of collaborative service without REDIS_COLLABORATION_URL"} +outline | (node:1) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. +outline | (Use `node --trace-warnings ...` to show where the warning was created) +outline | {"label":"database","level":"info","message":"Running migrations…"} +outline | {"label":"database","level":"info","message":"Migrating 20160619080644-initial.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160619080644-initial.js in 0.091s"} +outline-postgres | The files belonging to this database system will be owned by user "postgres". +outline | {"label":"database","level":"info","message":"Migrating 20160622043741-add-parent-document.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160622043741-add-parent-document.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20160626063409-add-indexes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160626063409-add-indexes.js in 0.065s"} +outline | {"label":"database","level":"info","message":"Migrating 20160626175224-add-revisions.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160626175224-add-revisions.js in 0.031s"} +outline | {"label":"database","level":"info","message":"Migrating 20160711071958-search-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160711071958-search-index.js in 0.022s"} +outline | {"label":"database","level":"info","message":"Migrating 20160726061511-atlas-creator.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160726061511-atlas-creator.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20160812145029-document-atlas-soft-delete.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160812145029-document-atlas-soft-delete.js in 0.018s"} +outline | {"label":"database","level":"info","message":"Migrating 20160814083127-paranoia-indeces.js…"} +outline-postgres | This user must also own the server process. +outline-postgres | +outline-postgres | The database cluster will be initialized with locale "en_US.utf8". +outline-postgres | The default database encoding has accordingly been set to "UTF8". +outline-postgres | The default text search configuration will be set to "english". +outline-postgres | +outline-postgres | Data page checksums are enabled. +outline-postgres | +outline-postgres | fixing permissions on existing directory /var/lib/postgresql/18/docker ... ok +outline-postgres | creating subdirectories ... ok +outline-postgres | selecting dynamic shared memory implementation ... posix +outline | {"label":"database","level":"info","message":"Migrated 20160814083127-paranoia-indeces.js in 0.092s"} +outline | {"label":"database","level":"info","message":"Migrating 20160814095336-add-document-createdById.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160814095336-add-document-createdById.js in 0.014s"} +outline | {"label":"database","level":"info","message":"Migrating 20160814111419-add-document-collaboratorIds.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160814111419-add-document-collaboratorIds.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20160815142720-app-collection-urlId.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160815142720-app-collection-urlId.js in 0.016s"} +outline | {"label":"database","level":"info","message":"Migrating 20160816082738-add-revision-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160816082738-add-revision-index.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20160824061730-add-apikeys.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160824061730-add-apikeys.js in 0.027s"} +outline | {"label":"database","level":"info","message":"Migrating 20160824062457-add-apikey-indeces.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160824062457-add-apikey-indeces.js in 0.026s"} +outline | {"label":"database","level":"info","message":"Migrating 20160911230444-user-optional-slack-id.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160911230444-user-optional-slack-id.js in 0.072s"} +outline | {"label":"database","level":"info","message":"Migrating 20160911232911-user-unique-fields.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160911232911-user-unique-fields.js in 0.105s"} +outline | {"label":"database","level":"info","message":"Migrating 20160911234928-user-password.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20160911234928-user-password.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20170603185012-add-collection-documentStructure-migration.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20170603185012-add-collection-documentStructure-migration.js in 0.02s"} +outline | {"label":"database","level":"info","message":"Migrating 20170604052346-add-views.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20170604052346-add-views.js in 0.038s"} +outline | {"label":"database","level":"info","message":"Migrating 20170604052347-add-stars.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20170604052347-add-stars.js in 0.023s"} +outline | {"label":"database","level":"info","message":"Migrating 20170712055148-non-unique-email.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20170712055148-non-unique-email.js in 0.019s"} +outline | {"label":"database","level":"info","message":"Migrating 20170712072234-uniq-slack-id.js…"} +outline-postgres | selecting default "max_connections" ... 100 +outline | {"label":"database","level":"info","message":"Migrated 20170712072234-uniq-slack-id.js in 0.021s"} +outline | {"label":"database","level":"info","message":"Migrating 20170729215619-emoji.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20170729215619-emoji.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20170827182423-improve-references.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20170827182423-improve-references.js in 0.033s"} +outline | {"label":"database","level":"info","message":"Migrating 20170904202454-allow-null-username.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20170904202454-allow-null-username.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20171010042938-add-event.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20171010042938-add-event.js in 0.026s"} +outline | {"label":"database","level":"info","message":"Migrating 20171016012353-remove-collection-navigationtree.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20171016012353-remove-collection-navigationtree.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20171017055026-remove-document-html.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20171017055026-remove-document-html.js in 0.021s"} +outline | {"label":"database","level":"info","message":"Migrating 20171019071915-user-avatar-url.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20171019071915-user-avatar-url.js in 0.01s"} +outline-postgres | selecting default "shared_buffers" ... 128MB +outline-postgres | selecting default time zone ... Europe/Budapest +outline-postgres | creating configuration files ... ok +outline-postgres | running bootstrap script ... ok +outline-postgres | sh: locale: not found +outline-postgres | 2026-09-30 12:26:00.988 CEST [46] WARNING: no usable system locales were found +outline-postgres | performing post-bootstrap initialization ... ok +outline-postgres | syncing data to disk ... ok +outline-postgres | +outline-postgres | initdb: warning: enabling "trust" authentication for local connections +outline-postgres | initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. +outline-postgres | +outline-postgres | Success. You can now start the database server using: +outline | {"label":"database","level":"info","message":"Migrating 20171023064220-collection-color.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20171023064220-collection-color.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20171218043717-add-authentications.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20171218043717-add-authentications.js in 0.024s"} +outline | {"label":"database","level":"info","message":"Migrating 20171225143838-set-admins.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20171225143838-set-admins.js in 0.008s"} +outline | {"label":"database","level":"info","message":"Migrating 20180115021837-add-drafts.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20180115021837-add-drafts.js in 0.023s"} +outline | {"label":"database","level":"info","message":"Migrating 20180212033504-add-integrations.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20180212033504-add-integrations.js in 0.027s"} +outline | {"label":"database","level":"info","message":"Migrating 20180225203847-document-pinning.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20180225203847-document-pinning.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20180303193036-suspended-users.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20180303193036-suspended-users.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20180324214403-serializer-upgrade.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20180324214403-serializer-upgrade.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20180513041057-add-share-links.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20180513041057-add-share-links.js in 0.022s"} +outline | {"label":"database","level":"info","message":"Migrating 20180528233909-google-auth.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20180528233909-google-auth.js in 0.066s"} +outline | {"label":"database","level":"info","message":"Migrating 20180528233910-rename-serviceid.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20180528233910-rename-serviceid.js in 0.039s"} +outline | {"label":"database","level":"info","message":"Migrating 20180604182823-user-tracking.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20180604182823-user-tracking.js in 0.021s"} +outline | {"label":"database","level":"info","message":"Migrating 20180604191743-revoke-share-links.js…"} +outline-postgres | +outline-postgres | pg_ctl -D /var/lib/postgresql/18/docker -l logfile start +outline-postgres | +outline-postgres | waiting for server to start....2026-09-30 12:26:01.875 CEST [52] LOG: starting PostgreSQL 18.6 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit +outline-postgres | 2026-09-30 12:26:01.932 CEST [52] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" +outline-postgres | 2026-09-30 12:26:01.954 CEST [58] LOG: database system was shut down at 2026-09-30 12:26:01 CEST +outline-postgres | 2026-09-30 12:26:01.964 CEST [52] LOG: database system is ready to accept connections +outline-postgres | done +outline-postgres | server started +outline-postgres | CREATE DATABASE +outline-postgres | +outline-postgres | +outline-postgres | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/* +outline-postgres | +outline-postgres | waiting for server to shut down....2026-09-30 12:26:02.182 CEST [52] LOG: received fast shutdown request +outline-postgres | 2026-09-30 12:26:02.185 CEST [52] LOG: aborting any active transactions +outline | {"label":"database","level":"info","message":"Migrated 20180604191743-revoke-share-links.js in 0.019s"} +outline-postgres | 2026-09-30 12:26:02.188 CEST [52] LOG: background worker "logical replication launcher" (PID 61) exited with exit code 1 +outline-postgres | 2026-09-30 12:26:02.188 CEST [56] LOG: shutting down +outline-postgres | 2026-09-30 12:26:02.191 CEST [56] LOG: checkpoint starting: shutdown immediate +outline-postgres | 2026-09-30 12:26:02.283 CEST [56] LOG: checkpoint complete: wrote 943 buffers (5.8%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.025 s, sync=0.053 s, total=0.095 s; sync files=303, longest=0.015 s, average=0.001 s; distance=4362 kB, estimate=4362 kB; lsn=0/1BA8858, redo lsn=0/1BA8858 +outline-postgres | 2026-09-30 12:26:02.314 CEST [52] LOG: database system is shut down +outline-postgres | done +outline-postgres | server stopped +outline-postgres | +outline-postgres | PostgreSQL init process complete; ready for start up. +outline | {"label":"database","level":"info","message":"Migrating 20180707220121-more-soft-delete.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20180707220121-more-soft-delete.js in 0.014s"} +outline | {"label":"database","level":"info","message":"Migrating 20180707231201-remove-passwords.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20180707231201-remove-passwords.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20180708231200-serviceid-null.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20180708231200-serviceid-null.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20180808061353-cleanup.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20180808061353-cleanup.js in 0.037s"} +outline | {"label":"database","level":"info","message":"Migrating 20180819054252-disable-sharing.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20180819054252-disable-sharing.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20181031015046-add-subdomain-to-team.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20181031015046-add-subdomain-to-team.js in 0.023s"} +outline-postgres | +outline-postgres | 2026-09-30 12:26:02.420 CEST [1] LOG: starting PostgreSQL 18.6 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit +outline-postgres | 2026-09-30 12:26:02.421 CEST [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 +outline-postgres | 2026-09-30 12:26:02.421 CEST [1] LOG: listening on IPv6 address "::", port 5432 +outline-postgres | 2026-09-30 12:26:02.427 CEST [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" +outline-postgres | 2026-09-30 12:26:02.442 CEST [74] LOG: database system was shut down at 2026-09-30 12:26:02 CEST +outline-postgres | 2026-09-30 12:26:02.449 CEST [1] LOG: database system is ready to accept connections +outline-postgres | 2026-09-30 12:26:02.933 CEST [72] LOG: checkpoint starting: immediate force wait +outline-postgres | 2026-09-30 12:26:02.959 CEST [72] LOG: checkpoint complete: wrote 1 buffers (0.0%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.008 s, sync=0.006 s, total=0.027 s; sync files=3, longest=0.003 s, average=0.002 s; distance=1 kB, estimate=1 kB; lsn=0/1BA8D60, redo lsn=0/1BA8D08 +outline | {"label":"database","level":"info","message":"Migrating 20181124000438-add-notifications.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20181124000438-add-notifications.js in 0.046s"} +outline | {"label":"database","level":"info","message":"Migrating 20181215192422-document-embeds.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20181215192422-document-embeds.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20181227001547-collection-permissions.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20181227001547-collection-permissions.js in 0.028s"} +outline | {"label":"database","level":"info","message":"Migrating 20190404035736-add-archive.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20190404035736-add-archive.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20190423051708-add-search-indexes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20190423051708-add-search-indexes.js in 0.034s"} +outline | {"label":"database","level":"info","message":"Migrating 20190606035733-events.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20190606035733-events.js in 0.05s"} +outline | {"label":"database","level":"info","message":"Migrating 20190704070630-welcome-docs.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20190704070630-welcome-docs.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20190706213213-backlinks.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20190706213213-backlinks.js in 0.031s"} +outline | {"label":"database","level":"info","message":"Migrating 20190811231511-maintainers.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20190811231511-maintainers.js in 0.022s"} +outline | {"label":"database","level":"info","message":"Migrating 20191118023010-cascade-delete.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20191118023010-cascade-delete.js in 0.018s"} +outline | {"label":"database","level":"info","message":"Migrating 20191119023010-cascade-backlinks.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20191119023010-cascade-backlinks.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20191119023011-cascade-parent-documents.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20191119023011-cascade-parent-documents.js in 0.016s"} +outline | {"label":"database","level":"info","message":"Migrating 20191119023012-cascade-shares.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20191119023012-cascade-shares.js in 0.021s"} +outline | {"label":"database","level":"info","message":"Migrating 20191119023013-cascade-backlinks2.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20191119023013-cascade-backlinks2.js in 0.017s"} +outline | {"label":"database","level":"info","message":"Migrating 20191121035144-guest-invite.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20191121035144-guest-invite.js in 0.019s"} +outline | {"label":"database","level":"info","message":"Migrating 20191211044318-create-groups.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20191211044318-create-groups.js in 0.041s"} +outline | {"label":"database","level":"info","message":"Migrating 20191211044319-create-group-users.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20191211044319-create-group-users.js in 0.048s"} +outline | {"label":"database","level":"info","message":"Migrating 20191228031525-edit-presence.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20191228031525-edit-presence.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20200104233831-attachments.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20200104233831-attachments.js in 0.038s"} +outline | {"label":"database","level":"info","message":"Migrating 20200122083721-create-collection-groups.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20200122083721-create-collection-groups.js in 0.036s"} +outline | {"label":"database","level":"info","message":"Migrating 20200316040755-document-editor-version.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20200316040755-document-editor-version.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20200328175012-cascade-delete.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20200328175012-cascade-delete.js in 0.017s"} +outline | {"label":"database","level":"info","message":"Migrating 20200330053639-document-version.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20200330053639-document-version.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20200519032353-text-backup.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20200519032353-text-backup.js in 0.012s"} +outline | {"label":"database","level":"info","message":"Migrating 20200522054958-collection-icon.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20200522054958-collection-icon.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20200723055414-add-published-to-shares.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20200723055414-add-published-to-shares.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20200727051157-add-templates.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20200727051157-add-templates.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20200812170227-remove-collection-type.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20200812170227-remove-collection-type.js in 0.012s"} +outline | {"label":"database","level":"info","message":"Migrating 20200915010511-create-search-queries.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20200915010511-create-search-queries.js in 0.033s"} +outline | {"label":"database","level":"info","message":"Migrating 20200926204620-add-missing-indexes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20200926204620-add-missing-indexes.js in 0.04s"} +outline | {"label":"database","level":"info","message":"Migrating 20201028043021-reverse-document-id-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20201028043021-reverse-document-id-index.js in 0.02s"} +outline | {"label":"database","level":"info","message":"Migrating 20201103050534-custom-domains.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20201103050534-custom-domains.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20201106122752-i18n.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20201106122752-i18n.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20201206210619-update-attachment-cols.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20201206210619-update-attachment-cols.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20201211080408-attachment-no-cascade.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20201211080408-attachment-no-cascade.js in 0.012s"} +outline | {"label":"database","level":"info","message":"Migrating 20201230031607-collection-sort.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20201230031607-collection-sort.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20210110143902-collection-rename-creator-id.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210110143902-collection-rename-creator-id.js in 0.026s"} +outline | {"label":"database","level":"info","message":"Migrating 20210208062816-disable-collection-sharing.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210208062816-disable-collection-sharing.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20210218111237-add-collection-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210218111237-add-collection-index.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20210226232041-authentication-providers.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210226232041-authentication-providers.js in 0.077s"} +outline | {"label":"database","level":"info","message":"Migrating 20210310051804-passport.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210310051804-passport.js in 0.016s"} +outline | {"label":"database","level":"info","message":"Migrating 20210314173941-isViewer.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210314173941-isViewer.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20210327005406-read-only-collections.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210327005406-read-only-collections.js in 0.016s"} +outline | {"label":"database","level":"info","message":"Migrating 20210418053152-share-last-viewed.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210418053152-share-last-viewed.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20210426055334-nested-document-sharing.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210426055334-nested-document-sharing.js in 0.012s"} +outline | {"label":"database","level":"info","message":"Migrating 20210430024222-marketing-tracking.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210430024222-marketing-tracking.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20210716064654-introduce-previousTitles.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210716064654-introduce-previousTitles.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20210716071454-search-index-previousTitles.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210716071454-search-index-previousTitles.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20210716162923-events-indexes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210716162923-events-indexes.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20210730042450-remove-unused-indexes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210730042450-remove-unused-indexes.js in 0.031s"} +outline | {"label":"database","level":"info","message":"Migrating 20210730044247-remove-backup-column.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210730044247-remove-backup-column.js in 0.017s"} +outline | {"label":"database","level":"info","message":"Migrating 20210730044248-create-realtime.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210730044248-create-realtime.js in 0.012s"} +outline | {"label":"database","level":"info","message":"Migrating 20210730210120-add-fileOperations.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210730210120-add-fileOperations.js in 0.059s"} +outline | {"label":"database","level":"info","message":"Migrating 20210915051740-collaborative-collections.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210915051740-collaborative-collections.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20210921031555-missing-cascades.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210921031555-missing-cascades.js in 0.043s"} +outline | {"label":"database","level":"info","message":"Migrating 20210923031555-missing-cascades.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20210923031555-missing-cascades.js in 0.033s"} +outline | {"label":"database","level":"info","message":"Migrating 20211003021903-missing-cascades.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20211003021903-missing-cascades.js in 0.018s"} +outline | {"label":"database","level":"info","message":"Migrating 20211015170955-add-defaultUserRole.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20211015170955-add-defaultUserRole.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20211107021900-missing-cascades.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20211107021900-missing-cascades.js in 0.029s"} +outline | {"label":"database","level":"info","message":"Migrating 20211217054419-integration-events.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20211217054419-integration-events.js in 0.012s"} +outline | {"label":"database","level":"info","message":"Migrating 20211218185045-remove-unused-indexes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20211218185045-remove-unused-indexes.js in 0.018s"} +outline | {"label":"database","level":"info","message":"Migrating 20211218193004-documents-full-width.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20211218193004-documents-full-width.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20211221031430-create-pins.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20211221031430-create-pins.js in 0.035s"} +outline | {"label":"database","level":"info","message":"Migrating 20220117012250-add-starred-sorting.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220117012250-add-starred-sorting.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20220127000000-index-fixes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220127000000-index-fixes.js in 0.08s"} +outline | {"label":"database","level":"info","message":"Migrating 20220129092607-add-defaultCollectionId.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220129092607-add-defaultCollectionId.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20220206225006-add-error-to-file-operation.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220206225006-add-error-to-file-operation.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20220305195830-create-comments.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220305195830-create-comments.js in 0.038s"} +outline | {"label":"database","level":"info","message":"Migrating 20220311020825-views-indexes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220311020825-views-indexes.js in 0.031s"} +outline | {"label":"database","level":"info","message":"Migrating 20220319022812-events-indexes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220319022812-events-indexes.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20220319060408-collection-create-permission.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220319060408-collection-create-permission.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20220328215615-add-shareId-to-search-queries.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220328215615-add-shareId-to-search-queries.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20220402032204-starred-collections.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220402032204-starred-collections.js in 0.029s"} +outline | {"label":"database","level":"info","message":"Migrating 20220409222213-user-flags.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220409222213-user-flags.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20220409225935-user-invited-by.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220409225935-user-invited-by.js in 0.012s"} +outline | {"label":"database","level":"info","message":"Migrating 20220413213537-add-inviteRequired-to-teams.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220413213537-add-inviteRequired-to-teams.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20220419052832-create-team-domains.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220419052832-create-team-domains.js in 0.027s"} +outline | {"label":"database","level":"info","message":"Migrating 20220421052253-create-file-operation-format.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220421052253-create-file-operation-format.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20220430043135-collection-sort-backfill.js…"} +outline | Backfilling collection sort… +outline | {"label":"database","level":"info","message":"Migrated 20220430043135-collection-sort-backfill.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20220521164111-create-webhook-subscription.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220521164111-create-webhook-subscription.js in 0.032s"} +outline | {"label":"database","level":"info","message":"Migrating 20220525054603-user-authentication-expires-at.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220525054603-user-authentication-expires-at.js in 0.014s"} +outline | {"label":"database","level":"info","message":"Migrating 20220606031139-create-webhook-delivieries.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220606031139-create-webhook-delivieries.js in 0.038s"} +outline | {"label":"database","level":"info","message":"Migrating 20220702132722-add-webhooks-deleted-at.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220702132722-add-webhooks-deleted-at.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20220719121200-create-subscriptions.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220719121200-create-subscriptions.js in 0.029s"} +outline | {"label":"database","level":"info","message":"Migrating 20220720221531-remove-deprecated-columns.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220720221531-remove-deprecated-columns.js in 0.023s"} +outline | {"label":"database","level":"info","message":"Migrating 20220722184916-remove-event-updatedat.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220722184916-remove-event-updatedat.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20220810185000-scope-provider-id-uniqueness-to-team.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220810185000-scope-provider-id-uniqueness-to-team.js in 0.018s"} +outline | {"label":"database","level":"info","message":"Migrating 20220812115059-scope-user-auth-provider-id-uniqueness-to-user.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220812115059-scope-user-auth-provider-id-uniqueness-to-user.js in 0.02s"} +outline | {"label":"database","level":"info","message":"Migrating 20220816070527-change-column-authentication-id-nullable.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220816070527-change-column-authentication-id-nullable.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20220816175234-user-email-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220816175234-user-email-index.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20220828144837-add-columns-to-notifications-for-tracking.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220828144837-add-columns-to-notifications-for-tracking.js in 0.034s"} +outline | {"label":"database","level":"info","message":"Migrating 20220830215146-add-shares-views.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220830215146-add-shares-views.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20220907132304-user-preferences.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220907132304-user-preferences.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20220907140227-team-preferences.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220907140227-team-preferences.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20220909203454-fix-notification-constraints.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220909203454-fix-notification-constraints.js in 0.054s"} +outline | {"label":"database","level":"info","message":"Migrating 20220922073737-webhook-signing-secret.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220922073737-webhook-signing-secret.js in 0.012s"} +outline | {"label":"database","level":"info","message":"Migrating 20220928030442-fix-avatar-urls.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20220928030442-fix-avatar-urls.js in 0.04s"} +outline | {"label":"database","level":"info","message":"Migrating 20221111171828-fix-user-constraints.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20221111171828-fix-user-constraints.js in 0.012s"} +outline | {"label":"database","level":"info","message":"Migrating 20221112152649-import-document-relationship.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20221112152649-import-document-relationship.js in 0.03s"} +outline | {"label":"database","level":"info","message":"Migrating 20221112162341-attachment-tracking.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20221112162341-attachment-tracking.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20221120151710-attachment-expiry.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20221120151710-attachment-expiry.js in 0.021s"} +outline | {"label":"database","level":"info","message":"Migrating 20221206163421-add-share-url-slug.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20221206163421-add-share-url-slug.js in 0.022s"} +outline | {"label":"database","level":"info","message":"Migrating 20221218013627-fix-webhook-subscription-constraints.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20221218013627-fix-webhook-subscription-constraints.js in 0.019s"} +outline | {"label":"database","level":"info","message":"Migrating 20221219013835-fix-integration-constraints.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20221219013835-fix-integration-constraints.js in 0.025s"} +outline | {"label":"database","level":"info","message":"Migrating 20221230234256-add-stars-cascade.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20221230234256-add-stars-cascade.js in 0.017s"} +outline | {"label":"database","level":"info","message":"Migrating 20230101144349-integration-indexes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230101144349-integration-indexes.js in 0.016s"} +outline | {"label":"database","level":"info","message":"Migrating 20230204191035-update-tsvector-trigger.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230204191035-update-tsvector-trigger.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20230314013103-move-notification-settings.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230314013103-move-notification-settings.js in 0.014s"} +outline | {"label":"database","level":"info","message":"Migrating 20230317144617-remove-user-username.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230317144617-remove-user-username.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20230330181038-remove-column-userId-from-documents.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230330181038-remove-column-userId-from-documents.js in 0.012s"} +outline | {"label":"database","level":"info","message":"Migrating 20230403120315-add-comment-to-notifications.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230403120315-add-comment-to-notifications.js in 0.028s"} +outline | {"label":"database","level":"info","message":"Migrating 20230419124305-add-archivedat-col-to-notifications.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230419124305-add-archivedat-col-to-notifications.js in 0.018s"} +outline | {"label":"database","level":"info","message":"Migrating 20230419132159-add-indexes-to-notifications.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230419132159-add-indexes-to-notifications.js in 0.026s"} +outline | {"label":"database","level":"info","message":"Migrating 20230429005039-collection-admins.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230429005039-collection-admins.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20230430213332-remove-notification-settings.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230430213332-remove-notification-settings.js in 0.018s"} +outline | {"label":"database","level":"info","message":"Migrating 20230621004649-add-include-attachments-file-operation.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230621004649-add-include-attachments-file-operation.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20230720002422-add-insights-control.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230720002422-add-insights-control.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20230723231806-fix-file-operation-constraints.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230723231806-fix-file-operation-constraints.js in 0.025s"} +outline | {"label":"database","level":"info","message":"Migrating 20230815063830-add-emoji-to-revisions.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230815063830-add-emoji-to-revisions.js in 0.012s"} +outline | {"label":"database","level":"info","message":"Migrating 20230815063834-migrate-emoji-in-document-title.js…"} +outline | ⟐ injected env (0) · dotenvx@1.66.0 +outline | Backfill document emoji from title… page 0 +outline | (node:20) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. +outline | (Use `node --trace-warnings ...` to show where the warning was created) +outline | Backfill complete +outline | {"label":"database","level":"info","message":"Migrated 20230815063834-migrate-emoji-in-document-title.js in 3.014s"} +outline | {"label":"database","level":"info","message":"Migrating 20230827234031-migrate-emoji-in-revision-title.js…"} +outline | ⟐ injected env (0) · dotenvx@1.66.0 +outline | Backfill revision emoji from title… page 0 +outline | (node:35) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. +outline | (Use `node --trace-warnings ...` to show where the warning was created) +outline | Backfill complete +outline | {"label":"database","level":"info","message":"Migrated 20230827234031-migrate-emoji-in-revision-title.js in 2.952s"} +outline | {"label":"database","level":"info","message":"Migrating 20230920032853-add-key-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230920032853-add-key-index.js in 0.014s"} +outline | {"label":"database","level":"info","message":"Migrating 20230921071140-rename-collection-groups.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230921071140-rename-collection-groups.js in 0.033s"} +outline | {"label":"database","level":"info","message":"Migrating 20230922105047-rename-collection-users.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20230922105047-rename-collection-users.js in 0.034s"} +outline | {"label":"database","level":"info","message":"Migrating 20231001032754-file-operation-paranoid.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20231001032754-file-operation-paranoid.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20231101021239-share-domain.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20231101021239-share-domain.js in 0.023s"} +outline | {"label":"database","level":"info","message":"Migrating 20231103114720-add-column-index-to-user-permissions.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20231103114720-add-column-index-to-user-permissions.js in 0.016s"} +outline | {"label":"database","level":"info","message":"Migrating 20231111023920-add-source-metadata.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20231111023920-add-source-metadata.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20231118195149-add-content-to-documents.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20231118195149-add-content-to-documents.js in 0.016s"} +outline | {"label":"database","level":"info","message":"Migrating 20231120074257-add-column-id-to-user-permissions.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20231120074257-add-column-id-to-user-permissions.js in 0.037s"} +outline | {"label":"database","level":"info","message":"Migrating 20231120142213-add-column-id-to-group-permissions.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20231120142213-add-column-id-to-group-permissions.js in 0.035s"} +outline | {"label":"database","level":"info","message":"Migrating 20231123022323-add-suspended-at-teams.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20231123022323-add-suspended-at-teams.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20231129011114-cascade-delete.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20231129011114-cascade-delete.js in 0.016s"} +outline | {"label":"database","level":"info","message":"Migrating 20231206041706-search-query-score.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20231206041706-search-query-score.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20231212011038-search-query-answer.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20231212011038-search-query-answer.js in 0.018s"} +outline | {"label":"database","level":"info","message":"Migrating 20231227040129-update-tsvector-trigger.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20231227040129-update-tsvector-trigger.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20240113143315-user-permission-source-id.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240113143315-user-permission-source-id.js in 0.019s"} +outline | {"label":"database","level":"info","message":"Migrating 20240121172253-add-missing-cascades.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240121172253-add-missing-cascades.js in 0.023s"} +outline | {"label":"database","level":"info","message":"Migrating 20240203061519-integration-soft-delete.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240203061519-integration-soft-delete.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20240204171556-add-event-changeset.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240204171556-add-event-changeset.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20240204185157-team-last-active-at.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240204185157-team-last-active-at.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20240216182003-add-summary-to-documents.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240216182003-add-summary-to-documents.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20240229034214-search-query-relationship.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240229034214-search-query-relationship.js in 0.016s"} +outline | {"label":"database","level":"info","message":"Migrating 20240317171826-add-authentication-refresh-token.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240317171826-add-authentication-refresh-token.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20240319230356-fix-user-permissions-createdby-constraint.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240319230356-fix-user-permissions-createdby-constraint.js in 0.014s"} +outline | {"label":"database","level":"info","message":"Migrating 20240327015248-add-user-role.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240327015248-add-user-role.js in 0.014s"} +outline | {"label":"database","level":"info","message":"Migrating 20240327235446-role-non-nullable.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240327235446-role-non-nullable.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20240329012958-remove-old-role-columns.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240329012958-remove-old-role-columns.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20240413010743-add-options-to-file-operation.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240413010743-add-options-to-file-operation.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20240413042634-member-team-create.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240413042634-member-team-create.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20240524234042-add-content-to-collection.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240524234042-add-content-to-collection.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20240617030911-add-apikey-expiry.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240617030911-add-apikey-expiry.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20240617151506-add-icon-to-document.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240617151506-add-icon-to-document.js in 0.018s"} +outline | {"label":"database","level":"info","message":"Migrating 20240618201908-add-lastActiveAt-to-apikey.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240618201908-add-lastActiveAt-to-apikey.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20240625051656-remove-emoji-column.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240625051656-remove-emoji-column.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20240709031512-group-permission-source-id.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240709031512-group-permission-source-id.js in 0.019s"} +outline | {"label":"database","level":"info","message":"Migrating 20240717061527-add-column-archivedAt-collections.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240717061527-add-column-archivedAt-collections.js in 0.019s"} +outline | {"label":"database","level":"info","message":"Migrating 20240806080954-group-users-paranoid.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240806080954-group-users-paranoid.js in 0.007s"} +outline | {"label":"database","level":"info","message":"Migrating 20240809054702-add-column-archivedById-to-collections.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240809054702-add-column-archivedById-to-collections.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20240810080954-group-users-remove-deleted-at.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240810080954-group-users-remove-deleted-at.js in 0.026s"} +outline | {"label":"database","level":"info","message":"Migrating 20240821001616-add-notifications-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240821001616-add-notifications-index.js in 0.019s"} +outline | {"label":"database","level":"info","message":"Migrating 20240821002344-add-user-permission-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240821002344-add-user-permission-index.js in 0.017s"} +outline | {"label":"database","level":"info","message":"Migrating 20240821002502-add-user-authentication-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240821002502-add-user-authentication-index.js in 0.014s"} +outline | {"label":"database","level":"info","message":"Migrating 20240828081032-add-notifications-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240828081032-add-notifications-index.js in 0.018s"} +outline | {"label":"database","level":"info","message":"Migrating 20240912222438-add-unaccent-extension.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240912222438-add-unaccent-extension.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20240929194201-add-hash-to-api-key.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20240929194201-add-hash-to-api-key.js in 0.052s"} +outline | {"label":"database","level":"info","message":"Migrating 20240930113921-hash-api-keys.js…"} +outline | ⟐ injected env (0) · dotenvx@1.66.0 +outline | Backfill apiKey hash… page 0 +outline | (node:49) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. +outline | (Use `node --trace-warnings ...` to show where the warning was created) +outline | Backfill complete +outline | {"label":"database","level":"info","message":"Migrated 20240930113921-hash-api-keys.js in 2.548s"} +outline | {"label":"database","level":"info","message":"Migrating 20241013080608-create-reactions.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20241013080608-create-reactions.js in 0.03s"} +outline | {"label":"database","level":"info","message":"Migrating 20241030235556-event-auth-type.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20241030235556-event-auth-type.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20241105132600-add-allowIndexing-to-shares.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20241105132600-add-allowIndexing-to-shares.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20241105203523-add-user-timezone.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20241105203523-add-user-timezone.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20241127151705-attachment-tracking.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20241127151705-attachment-tracking.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20241219023150-group-external-id.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20241219023150-group-external-id.js in 0.03s"} +outline | {"label":"database","level":"info","message":"Migrating 20241231045203-add-attachments-teamId-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20241231045203-add-attachments-teamId-index.js in 0.012s"} +outline | {"label":"database","level":"info","message":"Migrating 20250125031823-add-api-key-scopes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250125031823-add-api-key-scopes.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20250207120103-add-collectionId-to-subscriptions.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250207120103-add-collectionId-to-subscriptions.js in 0.014s"} +outline | {"label":"database","level":"info","message":"Migrating 20250217012609-document-title-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250217012609-document-title-index.js in 0.032s"} +outline | {"label":"database","level":"info","message":"Migrating 20250217230810-add-team-previous-subdomains.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250217230810-add-team-previous-subdomains.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20250223142558-cascade-team-domain.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250223142558-cascade-team-domain.js in 0.014s"} +outline | {"label":"database","level":"info","message":"Migrating 20250225153529-add-notification-membershipId.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250225153529-add-notification-membershipId.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20250301234423-add-name-to-revisions.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250301234423-add-name-to-revisions.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20250306181804-create-imports.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250306181804-create-imports.js in 0.035s"} +outline | {"label":"database","level":"info","message":"Migrating 20250310043011-create-import-tasks.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250310043011-create-import-tasks.js in 0.028s"} +outline | {"label":"database","level":"info","message":"Migrating 20250314105847-add-apiImportId-to-collections-and-documents.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250314105847-add-apiImportId-to-collections-and-documents.js in 0.023s"} +outline | {"label":"database","level":"info","message":"Migrating 20250327062414-resolve-collection-index-collisions.js…"} +outline | ⟐ injected env (0) · dotenvx@1.66.0 +outline | (node:63) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. +outline | (Use `node --trace-warnings ...` to show where the warning was created) +outline | {"label":"database","level":"info","message":"Migrated 20250327062414-resolve-collection-index-collisions.js in 2.179s"} +outline | {"label":"database","level":"info","message":"Migrating 20250327110739-add-error-to-imports.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250327110739-add-error-to-imports.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20250331231413-add-oauth-server-models.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250331231413-add-oauth-server-models.js in 0.068s"} +outline | {"label":"database","level":"info","message":"Migrating 20250409184249-add-issueSources-to-integrations.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250409184249-add-issueSources-to-integrations.js in 0.017s"} +outline | {"label":"database","level":"info","message":"Migrating 20250429130521-add-collection-commenting.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250429130521-add-collection-commenting.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20250515031645-add-revisions-deleted-at.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250515031645-add-revisions-deleted-at.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20250530235814-add-collaborator-ids-to-revisions.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250530235814-add-collaborator-ids-to-revisions.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20250531002344-add-description-to-teams.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250531002344-add-description-to-teams.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20250531003217-add-show-last-updated-to-shares.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250531003217-add-show-last-updated-to-shares.js in 0.012s"} +outline | {"label":"database","level":"info","message":"Migrating 20250601223331-migrate-backlink-to-relationship.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250601223331-migrate-backlink-to-relationship.js in 0.031s"} +outline | {"label":"database","level":"info","message":"Migrating 20250630100046-add-oauth-to-search-queries-source.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250630100046-add-oauth-to-search-queries-source.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20250630175759-add-collection-id-to-shares.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250630175759-add-collection-id-to-shares.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20250719063818-add-documentId-to-fileOperation.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250719063818-add-documentId-to-fileOperation.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20250810173939-remove-team-name-nullable.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250810173939-remove-team-name-nullable.js in 0.041s"} +outline | {"label":"database","level":"info","message":"Migrating 20250810210844-add-data-to-notifications.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250810210844-add-data-to-notifications.js in 0.014s"} +outline | {"label":"database","level":"info","message":"Migrating 20250826204500-modify-shares-unique-constraint-with-revoked-condition.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250826204500-modify-shares-unique-constraint-with-revoked-condition.js in 0.023s"} +outline | {"label":"database","level":"info","message":"Migrating 20250828094500-update-group-user-role.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250828094500-update-group-user-role.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20250830060500-add-expires-at-to-authentications.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250830060500-add-expires-at-to-authentications.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20250907220205-add-missing-indexes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250907220205-add-missing-indexes.js in 0.034s"} +outline | {"label":"database","level":"info","message":"Migrating 20250913202342-add-source-metadata-to-collections.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250913202342-add-source-metadata-to-collections.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20250917124000-fix-shares-collection-cascade.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20250917124000-fix-shares-collection-cascade.js in 0.02s"} +outline | {"label":"database","level":"info","message":"Migrating 20251001133733-shares-show-toc.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20251001133733-shares-show-toc.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20251013204025-add-group-to-notifications.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20251013204025-add-group-to-notifications.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20251020204139-create-emojis.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20251020204139-create-emojis.js in 0.037s"} +outline | {"label":"database","level":"info","message":"Migrating 20251023031630-add-disable-mentions-to-groups.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20251023031630-add-disable-mentions-to-groups.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20251029200610-add-description-to-groups.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20251029200610-add-description-to-groups.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20251104013803-document-language.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20251104013803-document-language.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20251125012929-add-popularity-score-to-documents.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20251125012929-add-popularity-score-to-documents.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20251125012930-add-popularity-score-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20251125012930-add-popularity-score-index.js in 0.017s"} +outline | {"label":"database","level":"info","message":"Migrating 20251203124235-add-client-type-to-oauth-clients.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20251203124235-add-client-type-to-oauth-clients.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20251212232400-add-authentications-service-teamid-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20251212232400-add-authentications-service-teamid-index.js in 0.015s"} +outline | {"label":"database","level":"info","message":"Migrating 20251212232500-add-integrations-service-type-settings-indexes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20251212232500-add-integrations-service-type-settings-indexes.js in 0.016s"} +outline | {"label":"database","level":"info","message":"Migrating 20251213004745-add-search-queries-source-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20251213004745-add-search-queries-source-index.js in 0.022s"} +outline | {"label":"database","level":"info","message":"Migrating 20251217161051-remove-unused-indexes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20251217161051-remove-unused-indexes.js in 0.035s"} +outline | {"label":"database","level":"info","message":"Migrating 20251217204338-add-integration-performance-indexes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20251217204338-add-integration-performance-indexes.js in 0.037s"} +outline | {"label":"database","level":"info","message":"Migrating 20251218223224-add-grant-id-to-oauth-models.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20251218223224-add-grant-id-to-oauth-models.js in 0.027s"} +outline | {"label":"database","level":"info","message":"Migrating 20260104155138-team-passkeys-enabled.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260104155138-team-passkeys-enabled.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20260104155139-create-user-passkeys.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260104155139-create-user-passkeys.js in 0.033s"} +outline | {"label":"database","level":"info","message":"Migrating 20260107213946-create-access-requests.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260107213946-create-access-requests.js in 0.042s"} +outline | {"label":"database","level":"info","message":"Migrating 20260107220000-add-access-request-to-notifications.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260107220000-add-access-request-to-notifications.js in 0.016s"} +outline | {"label":"database","level":"info","message":"Migrating 20260215215401-update-oauth-clients.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260215215401-update-oauth-clients.js in 0.019s"} +outline | {"label":"database","level":"info","message":"Migrating 20260221131935-add-client-credentials-to-authentications.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260221131935-add-client-credentials-to-authentications.js in 0.011s"} +outline | {"label":"database","level":"info","message":"Migrating 20260222000000-add-settings-to-authentication-providers.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260222000000-add-settings-to-authentication-providers.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20260222000001-create-external-groups.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260222000001-create-external-groups.js in 0.027s"} +outline | {"label":"database","level":"info","message":"Migrating 20260224021319-add-subscription-event-indexes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260224021319-add-subscription-event-indexes.js in 0.029s"} +outline | {"label":"database","level":"info","message":"Migrating 20260314000000-add-team-flags.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260314000000-add-team-flags.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20260319221917-add-collection-template-management.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260319221917-add-collection-template-management.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20260320000000-add-team-guidance-mcp.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260320000000-add-team-guidance-mcp.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20260330000000-create-share-subscriptions.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260330000000-create-share-subscriptions.js in 0.038s"} +outline | {"label":"database","level":"info","message":"Migrating 20260331000000-add-allowSubscriptions-to-shares.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260331000000-add-allowSubscriptions-to-shares.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20260401000000-add-documentId-to-share-subscriptions.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260401000000-add-documentId-to-share-subscriptions.js in 0.02s"} +outline | {"label":"database","level":"info","message":"Migrating 20260411000000-add-title-and-iconUrl-to-shares.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260411000000-add-title-and-iconUrl-to-shares.js in 0.012s"} +outline | {"label":"database","level":"info","message":"Migrating 20260416000000-create-document-insights.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260416000000-create-document-insights.js in 0.033s"} +outline | {"label":"database","level":"info","message":"Migrating 20260419000000-add-period-to-document-insights.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260419000000-add-period-to-document-insights.js in 0.019s"} +outline | {"label":"database","level":"info","message":"Migrating 20260514000000-cascade-resolved-to-reply-comments.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260514000000-cascade-resolved-to-reply-comments.js in 0.008s"} +outline | {"label":"database","level":"info","message":"Migrating 20260515000000-make-imports-integration-nullable.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260515000000-make-imports-integration-nullable.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20260516000000-add-import-task-phase-and-import-scratch.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260516000000-add-import-task-phase-and-import-scratch.js in 0.013s"} +outline | {"label":"database","level":"info","message":"Migrating 20260526092836-add-document-foreign-key-indexes.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260526092836-add-document-foreign-key-indexes.js in 0.038s"} +outline | {"label":"database","level":"info","message":"Migrating 20260603000000-commenting-access-preference.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260603000000-commenting-access-preference.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20260604140753-increase-url-column-lengths.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260604140753-increase-url-column-lengths.js in 0.038s"} +outline | {"label":"database","level":"info","message":"Migrating 20260611000000-drop-team-collaborative-editing.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260611000000-drop-team-collaborative-editing.js in 0.01s"} +outline | {"label":"database","level":"info","message":"Migrating 20260619000000-add-duration-to-search-queries.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260619000000-add-duration-to-search-queries.js in 0.009s"} +outline | {"label":"database","level":"info","message":"Migrating 20260621000000-add-search-queries-user-created-index.js…"} +outline | {"label":"database","level":"info","message":"Migrated 20260621000000-add-search-queries-user-created-index.js in 0.031s"} +outline | {"label":"lifecycle","level":"info","message":"\nIs your team enjoying Outline? Consider supporting future development by sponsoring the project:\n\nhttps://github.com/sponsors/outline\n"} +outline | {"label":"lifecycle","level":"info","message":"Note: Restricting process count to 1 due to use of collaborative service without REDIS_COLLABORATION_URL"} +outline | {"label":"lifecycle","level":"info","message":"Starting collaboration service"} +outline | (node:77) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. +outline | (Use `node --trace-warnings ...` to show where the warning was created) +outline | {"label":"lifecycle","level":"info","message":"Starting websockets service"} +outline | {"label":"lifecycle","level":"info","message":"Starting worker service"} +outline | {"label":"lifecycle","level":"info","message":"Starting web service"} +outline | {"label":"lifecycle","level":"info","message":"Listening on http://localhost:3000 / https://kb.gate.invalid"} +outline | {"attempt":0,"event":{"actorId":null,"authType":null,"changes":{"attributes":{"avatarUrl":"[…]","name":"[…]","subdomain":"[…]"},"previous":{}},"collectionId":null,"createdAt":"2026-09-30T10:25:37.426Z","data":null,"documentId":null,"id":"25b8a61f-ad4c-425a-88ea-3ff0d0287ccc","ip":"172.18.0.1","modelId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","name":"teams.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":null},"label":"worker","level":"info","message":"Processing teams.create"} +outline | {"attempt":0,"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":null,"changes":{"attributes":{"email":"[…]","name":"[…]","role":"[…]","teamId":"[…]"},"previous":{}},"collectionId":null,"createdAt":"2026-09-30T10:25:37.444Z","data":null,"documentId":null,"id":"c01c3eb1-fbc9-4306-b553-6fbc873f473d","ip":"172.18.0.1","modelId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","name":"users.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1"},"label":"worker","level":"info","message":"Processing users.create"} +outline | {"attempt":0,"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":null,"changes":null,"collectionId":null,"createdAt":"2026-09-30T10:25:37.459Z","data":{"name":"Drill","service":"email"},"documentId":null,"id":"54479c9d-caac-431f-ae26-9303e6430568","ip":"172.18.0.1","modelId":null,"name":"users.signin","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1"},"label":"worker","level":"info","message":"Processing users.signin"} +outline | {"event":{"actorId":null,"authType":null,"changes":{"attributes":{"avatarUrl":"[…]","name":"[…]","subdomain":"[…]"},"previous":{}},"collectionId":null,"createdAt":"2026-09-30T10:25:37.426Z","data":null,"documentId":null,"id":"25b8a61f-ad4c-425a-88ea-3ff0d0287ccc","ip":"172.18.0.1","modelId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","name":"teams.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":null},"label":"worker","level":"info","message":"AvatarProcessor running teams.create"} +outline | {"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":null,"changes":{"attributes":{"email":"[…]","name":"[…]","role":"[…]","teamId":"[…]"},"previous":{}},"collectionId":null,"createdAt":"2026-09-30T10:25:37.444Z","data":null,"documentId":null,"id":"c01c3eb1-fbc9-4306-b553-6fbc873f473d","ip":"172.18.0.1","modelId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","name":"users.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1"},"label":"worker","level":"info","message":"AvatarProcessor running users.create"} +outline | {"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":null,"changes":{"attributes":{"email":"[…]","name":"[…]","role":"[…]","teamId":"[…]"},"previous":{}},"collectionId":null,"createdAt":"2026-09-30T10:25:37.444Z","data":null,"documentId":null,"id":"c01c3eb1-fbc9-4306-b553-6fbc873f473d","ip":"172.18.0.1","modelId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","name":"users.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1"},"label":"worker","level":"info","message":"UserCreatedProcessor running users.create"} +outline | {"label":"email","level":"info","message":"Email WelcomeEmail not sent due to missing SMTP_FROM_EMAIL configuration"} +outline | {"attempt":0,"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"app","changes":{"attributes":{"name":"[…]","userId":"[…]"},"previous":{}},"collectionId":null,"createdAt":"2026-09-30T10:25:37.704Z","data":null,"documentId":null,"id":"67d0b89e-8e57-4c6f-a736-b4eca61b54df","ip":"172.18.0.1","modelId":"2e123ebe-49bb-4e4d-ad33-687fc89f2a00","name":"api_keys.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1"},"label":"worker","level":"info","message":"Processing api_keys.create"} +outline | {"attempt":0,"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"createdById":"[…]","name":"[…]","permission":"[…]","sharing":"[…]","sort":"[…]","teamId":"[…]","templateManagement":"[…]","urlId":"[…]"},"previous":{}},"collectionId":"f88c168d-27b8-4f23-a102-8347d2958f31","createdAt":"2026-09-30T10:25:37.819Z","data":null,"documentId":null,"id":"0216a133-455d-45cd-a489-4d7c98516940","ip":"172.18.0.1","modelId":"f88c168d-27b8-4f23-a102-8347d2958f31","name":"collections.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":null},"label":"worker","level":"info","message":"Processing collections.create"} +outline | {"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"createdById":"[…]","name":"[…]","permission":"[…]","sharing":"[…]","sort":"[…]","teamId":"[…]","templateManagement":"[…]","urlId":"[…]"},"previous":{}},"collectionId":"f88c168d-27b8-4f23-a102-8347d2958f31","createdAt":"2026-09-30T10:25:37.819Z","data":null,"documentId":null,"id":"0216a133-455d-45cd-a489-4d7c98516940","ip":"172.18.0.1","modelId":"f88c168d-27b8-4f23-a102-8347d2958f31","name":"collections.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":null},"label":"worker","level":"info","message":"NotificationsProcessor running collections.create"} +outline | {"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"createdById":"[…]","name":"[…]","permission":"[…]","sharing":"[…]","sort":"[…]","teamId":"[…]","templateManagement":"[…]","urlId":"[…]"},"previous":{}},"collectionId":"f88c168d-27b8-4f23-a102-8347d2958f31","createdAt":"2026-09-30T10:25:37.819Z","data":null,"documentId":null,"id":"0216a133-455d-45cd-a489-4d7c98516940","ip":"172.18.0.1","modelId":"f88c168d-27b8-4f23-a102-8347d2958f31","name":"collections.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":null},"label":"worker","level":"info","message":"SearchIndexProcessor running collections.create"} +outline | {"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"createdById":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","name":"Drill","permission":null,"sharing":true,"sort":{"direction":"[…]","field":"[…]"},"teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","templateManagement":"admin","urlId":"BbvlTbhIGm"},"previous":{}},"collectionId":"f88c168d-27b8-4f23-a102-8347d2958f31","createdAt":"2026-09-30T10:25:37.819Z","data":null,"documentId":null,"id":"0216a133-455d-45cd-a489-4d7c98516940","ip":"172.18.0.1","label":"worker","level":"info","message":"CollectionCreatedNotificationsTask running","modelId":"f88c168d-27b8-4f23-a102-8347d2958f31","name":"collections.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":null} +outline | (node:77) DeprecationWarning: Calling client.query() when the client is already executing a query is deprecated and will be removed in pg@9.0. Use async/await or an external async flow control mechanism instead. +outline | {"attempt":0,"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"collectionId":"[…]","createdById":"[…]","lastModifiedById":"[…]","teamId":"[…]","title":"[…]","urlId":"[…]"},"previous":{}},"collectionId":"f88c168d-27b8-4f23-a102-8347d2958f31","createdAt":"2026-09-30T10:25:38.012Z","data":null,"documentId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","id":"5f064794-f57a-4af5-9e03-39ffb44b9aac","ip":"172.18.0.1","modelId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","name":"documents.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":null},"label":"worker","level":"info","message":"Processing documents.create"} +outline | {"attempt":0,"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"publishedAt":"[…]"},"previous":{"publishedAt":"[…]"}},"collectionId":"f88c168d-27b8-4f23-a102-8347d2958f31","createdAt":"2026-09-30T10:25:38.035Z","data":null,"documentId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","id":"319f5232-a765-4810-b69a-902efcc219fb","ip":"172.18.0.1","modelId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","name":"documents.publish","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":null},"label":"worker","level":"info","message":"Processing documents.publish"} +outline | {"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"publishedAt":"[…]"},"previous":{"publishedAt":"[…]"}},"collectionId":"f88c168d-27b8-4f23-a102-8347d2958f31","createdAt":"2026-09-30T10:25:38.035Z","data":null,"documentId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","id":"319f5232-a765-4810-b69a-902efcc219fb","ip":"172.18.0.1","modelId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","name":"documents.publish","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":null},"label":"worker","level":"info","message":"BacklinksProcessor running documents.publish"} +outline | {"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"publishedAt":"[…]"},"previous":{"publishedAt":"[…]"}},"collectionId":"f88c168d-27b8-4f23-a102-8347d2958f31","createdAt":"2026-09-30T10:25:38.035Z","data":null,"documentId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","id":"319f5232-a765-4810-b69a-902efcc219fb","ip":"172.18.0.1","modelId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","name":"documents.publish","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":null},"label":"worker","level":"info","message":"NotificationsProcessor running documents.publish"} +outline | {"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"publishedAt":"[…]"},"previous":{"publishedAt":"[…]"}},"collectionId":"f88c168d-27b8-4f23-a102-8347d2958f31","createdAt":"2026-09-30T10:25:38.035Z","data":null,"documentId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","id":"319f5232-a765-4810-b69a-902efcc219fb","ip":"172.18.0.1","modelId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","name":"documents.publish","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":null},"label":"worker","level":"info","message":"RevisionsProcessor running documents.publish"} +outline | {"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"publishedAt":"[…]"},"previous":{"publishedAt":"[…]"}},"collectionId":"f88c168d-27b8-4f23-a102-8347d2958f31","createdAt":"2026-09-30T10:25:38.035Z","data":null,"documentId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","id":"319f5232-a765-4810-b69a-902efcc219fb","ip":"172.18.0.1","modelId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","name":"documents.publish","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":null},"label":"worker","level":"info","message":"SearchIndexProcessor running documents.publish"} +outline | {"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"publishedAt":"2026-09-30T10:25:38.030Z"},"previous":{"publishedAt":null}},"collectionId":"f88c168d-27b8-4f23-a102-8347d2958f31","createdAt":"2026-09-30T10:25:38.035Z","data":null,"documentId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","id":"319f5232-a765-4810-b69a-902efcc219fb","ip":"172.18.0.1","label":"worker","level":"info","message":"DocumentPublishedNotificationsTask running","modelId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","name":"documents.publish","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":null} +outline | {"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"publishedAt":"2026-09-30T10:25:38.030Z"},"previous":{"publishedAt":null}},"collectionId":"f88c168d-27b8-4f23-a102-8347d2958f31","createdAt":"2026-09-30T10:25:38.035Z","data":null,"documentId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","id":"319f5232-a765-4810-b69a-902efcc219fb","ip":"172.18.0.1","label":"worker","level":"info","message":"DocumentUpdateTextTask running","modelId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","name":"documents.publish","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":null} +outline | {"attempt":0,"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":null,"collectionId":null,"createdAt":"2026-09-30T10:25:38.157Z","data":null,"documentId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","id":"e3f5f3f6-b485-4bc0-b532-9b21d041433c","ip":null,"modelId":"ceb2a299-171d-410d-877e-220f63d11bc6","name":"subscriptions.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1"},"label":"worker","level":"info","message":"Processing subscriptions.create"} +outline | {"attempt":0,"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"createdAt":"[…]","documentId":"[…]","userId":"[…]"},"previous":{}},"collectionId":null,"createdAt":"2026-09-30T10:25:38.169Z","data":null,"documentId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","id":"a541db95-7877-433e-9799-06afc882594d","ip":"172.18.0.1","modelId":"1f8dac68-0597-4831-8e33-a8c3f82e3924","name":"revisions.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1"},"label":"worker","level":"info","message":"Processing revisions.create"} +outline | {"event":{"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"createdAt":"[…]","documentId":"[…]","userId":"[…]"},"previous":{}},"collectionId":null,"createdAt":"2026-09-30T10:25:38.169Z","data":null,"documentId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","id":"a541db95-7877-433e-9799-06afc882594d","ip":"172.18.0.1","modelId":"1f8dac68-0597-4831-8e33-a8c3f82e3924","name":"revisions.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1"},"label":"worker","level":"info","message":"NotificationsProcessor running revisions.create"} +outline | {"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"createdAt":"2026-09-30T10:25:37.993Z","documentId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","userId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1"},"previous":{}},"collectionId":null,"createdAt":"2026-09-30T10:25:38.169Z","data":null,"documentId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","id":"a541db95-7877-433e-9799-06afc882594d","ip":"172.18.0.1","label":"worker","level":"info","message":"RevisionCreatedNotificationsTask running","modelId":"1f8dac68-0597-4831-8e33-a8c3f82e3924","name":"revisions.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1"} +outline | {"actorId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1","authType":"api","changes":{"attributes":{"createdAt":"2026-09-30T10:25:37.993Z","documentId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","userId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1"},"previous":{}},"collectionId":null,"createdAt":"2026-09-30T10:25:38.169Z","data":null,"documentId":"99ea31b0-0d4b-44bf-8aee-e0135c8f894b","id":"a541db95-7877-433e-9799-06afc882594d","ip":"172.18.0.1","label":"worker","level":"info","message":"ShareSubscriptionNotificationsTask running","modelId":"1f8dac68-0597-4831-8e33-a8c3f82e3924","name":"revisions.create","teamId":"0d6be38e-ae10-4e12-92b2-a29deee6137b","userId":"ca0a6050-f1ba-41c3-8bb3-bb10c389aab1"} +outline | {"label":"processor","level":"info","message":"suppressing update notifications as change has insignificant edits"} +outline | {"label":"lifecycle","level":"info","message":"Gracefully quitting"} +outline | {"label":"lifecycle","level":"info","message":"Note: Restricting process count to 1 due to use of collaborative service without REDIS_COLLABORATION_URL"} +outline | (node:1) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. +outline | (Use `node --trace-warnings ...` to show where the warning was created) +outline | {"label":"lifecycle","level":"info","message":"\nIs your team enjoying Outline? Consider supporting future development by sponsoring the project:\n\nhttps://github.com/sponsors/outline\n"} +outline | {"label":"lifecycle","level":"info","message":"Note: Restricting process count to 1 due to use of collaborative service without REDIS_COLLABORATION_URL"} +outline | {"label":"lifecycle","level":"info","message":"Starting collaboration service"} +outline | (node:19) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. +outline | (Use `node --trace-warnings ...` to show where the warning was created) +outline | {"label":"lifecycle","level":"info","message":"Starting websockets service"} +outline | {"label":"lifecycle","level":"info","message":"Starting worker service"} +outline | {"label":"lifecycle","level":"info","message":"Starting web service"} +outline | {"label":"lifecycle","level":"info","message":"Listening on http://localhost:3000 / https://kb.gate.invalid"} diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/to-states.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/to-states.json new file mode 100644 index 00000000..fcfe34e4 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/to-states.json @@ -0,0 +1,20 @@ +{ + "outline": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + }, + "outline-postgres": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + }, + "outline-redis": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/verdict.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/verdict.json new file mode 100644 index 00000000..f2f3848f --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/verdict.json @@ -0,0 +1,106 @@ +{ + "harness_version": 4, + "edge": "MV-outline", + "app": "outline", + "note": "night 2026-09-23 within-a-major move: outline-postgres=postgres:18-alpine", + "from": { + "outline": "outlinewiki/outline:1.9.1", + "outline-postgres": "postgres:16-alpine", + "outline-redis": "redis:7-alpine" + }, + "to": { + "outline": "outlinewiki/outline:1.9.1", + "outline-postgres": "postgres:18-alpine", + "outline-redis": "redis:7-alpine" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": null, + "abort": "refuses", + "abort_detail": "esql/data\".\n\u001b[2Koutline-postgres | The files belonging to this database system will be owned by user \"postgres\".\n\u001b[2Koutline-postgres | This user must also own the server process.\n\u001b[2Koutline-postgres | \n\u001b[2Koutline-postgres | The database cluster will be initialized with locale \"en_US.utf8\".\n\u001b[2Koutline-postgres | The default database encoding has accordingly been set to \"UTF8\".\n\u001b[2Koutline-postgres | The default text search configuration will be set to \"english\".\n\u001b[2Koutline-postgres | \n\u001b[2Koutline-postgres | Data page checksums are disabled.\n\u001b[2Koutline-postgres | \n\u001b[2Koutline-postgres | initdb: error: directory \"/var/lib/postgresql/data\" exists but is not empty\n\u001b[2Koutline-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory \"/var/lib/postgresql/data\" or run initdb with an argument other than \"/var/lib/postgresql/data\".", + "engine_state_after": { + "outline-postgres": { + "image": "postgres:18-alpine", + "probe": "datadir major version", + "answer": "18", + "probe_rc": 0 + } + }, + "memory": { + "soak_s": 607.3, + "requested_s": 600, + "requests": 11661, + "codes": { + "200": 10128, + "429": 1533 + }, + "first_kill": null, + "containers": { + "outline": { + "limit": 805306368, + "peak": 427581440, + "peak_pct": 0.531, + "anon_peak_sampled": 393965568, + "anon_peak_pct": 0.489, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + }, + "outline-postgres": { + "limit": 268435456, + "peak": 175697920, + "peak_pct": 0.655, + "anon_peak_sampled": 14499840, + "anon_peak_pct": 0.054, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + }, + "outline-redis": { + "limit": 134217728, + "peak": 9437184, + "peak_pct": 0.07, + "anon_peak_sampled": 3354624, + "anon_peak_pct": 0.025, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 31.1, + "measured_at": "2026-09-30T10:40:04Z", + "evidence": "evidence/MV-outline", + "scratch_cleared": [], + "engine_conversion": { + "service": "outline-postgres", + "engine": "postgres", + "from": 16, + "to": 18, + "dump_s": 0.58, + "dump_bytes": 127706, + "new_engine_ready_s": 2.2, + "load_s": 1.68, + "dropped": [ + "outline" + ], + "skipped_create_role": [ + "CREATE ROLE outline;" + ], + "result": "converted", + "check_equal": true, + "pg_version": "18", + "tables": 42, + "convert_s": 26.7 + }, + "files_changed": [], + "total_s": 910.2 +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/MV-rallly.log b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/MV-rallly.log new file mode 100644 index 00000000..e4638b17 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/MV-rallly.log @@ -0,0 +1,154 @@ +[10:24:54] scratch drive folders cleared before FROM (R-656): none existed +[10:24:54] MV-rallly: deploying rallly at FROM {'rallly': 'lukevella/rallly:4.11.1', 'rallly-postgres': 'postgres:16-alpine'} +[10:25:42] FROM settled=True in 36.2s :: {"rallly": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "rallly-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:25:42] fixture: the BOX walk's own (Rallly), through upgrade_boxport +[10:25:42] rallly: sign-up http=200 +[10:25:43] rallly: verify-email with the code http=200 +[10:25:43] rallly: seeded poll drillpoll-6e524ded (dOdvcB2pEhWW) +[10:25:43] rallly: readback of the seeded poll http=200 found=True +[10:25:43] C1 (seed reads back BEFORE): True +[10:25:43] MV-rallly: PostgreSQL major move {'service': 'rallly-postgres', 'engine': 'postgres', 'from': 16, 'to': 18} — converting on the bench before the swap +[10:26:05] CONVERTED rallly-postgres PostgreSQL 16 -> 18 in 21.4s (dump 0.54s / 92067 B, load 1.05s, check equal over 31 tables) +[10:26:05] MV-rallly: swapping to TO {'rallly': 'lukevella/rallly:4.11.1', 'rallly-postgres': 'postgres:18-alpine'} +[10:26:11] TO up -d rc=0 +[10:26:47] TO settled=True in 36.2s :: {"rallly": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "rallly-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:26:47] engine state rallly-postgres: 18 +[10:26:47] migration lines observed: 4 +[10:26:48] rallly: readback of the seeded poll http=200 found=True +[10:26:48] RESULT (seed reads back AFTER): True +[10:26:48] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:3000 +[10:27:03] + 15s rallly=492M/768M peak=526M kills=0 rs=0 rallly-postgres=113M/256M peak=138M kills=0 rs=0 reqs=243 +[10:27:19] + 30s rallly=493M/768M peak=526M kills=0 rs=0 rallly-postgres=113M/256M peak=138M kills=0 rs=0 reqs=494 +[10:27:34] + 45s rallly=496M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=741 +[10:27:49] + 60s rallly=496M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=992 +[10:28:04] + 76s rallly=492M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=1243 +[10:28:19] + 91s rallly=494M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=1492 +[10:28:34] + 106s rallly=497M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=1740 +[10:28:49] + 121s rallly=498M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=1987 +[10:29:05] + 136s rallly=490M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=2237 +[10:29:20] + 151s rallly=495M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=2485 +[10:29:35] + 167s rallly=490M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=2733 +[10:29:50] + 182s rallly=496M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=2976 +[10:30:05] + 197s rallly=497M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=3223 +[10:30:20] + 212s rallly=499M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=3474 +[10:30:36] + 227s rallly=502M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=3721 +[10:30:51] + 242s rallly=502M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=3970 +[10:31:06] + 258s rallly=497M/768M peak=526M kills=0 rs=0 rallly-postgres=115M/256M peak=138M kills=0 rs=0 reqs=4220 +[10:31:21] + 273s rallly=490M/768M peak=526M kills=0 rs=0 rallly-postgres=117M/256M peak=138M kills=0 rs=0 reqs=4469 +[10:31:36] + 288s rallly=497M/768M peak=526M kills=0 rs=0 rallly-postgres=119M/256M peak=138M kills=0 rs=0 reqs=4721 +[10:31:51] + 303s rallly=496M/768M peak=526M kills=0 rs=0 rallly-postgres=120M/256M peak=138M kills=0 rs=0 reqs=4973 +[10:32:06] + 318s rallly=498M/768M peak=526M kills=0 rs=0 rallly-postgres=122M/256M peak=138M kills=0 rs=0 reqs=5221 +[10:32:22] + 333s rallly=496M/768M peak=526M kills=0 rs=0 rallly-postgres=124M/256M peak=138M kills=0 rs=0 reqs=5469 +[10:32:37] + 348s rallly=499M/768M peak=526M kills=0 rs=0 rallly-postgres=126M/256M peak=138M kills=0 rs=0 reqs=5722 +[10:32:52] + 364s rallly=494M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=5974 +[10:33:07] + 379s rallly=504M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=6223 +[10:33:22] + 394s rallly=502M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=6476 +[10:33:37] + 409s rallly=500M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=6729 +[10:33:53] + 424s rallly=495M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=6978 +[10:34:08] + 439s rallly=491M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=7230 +[10:34:23] + 454s rallly=492M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=7483 +[10:34:38] + 470s rallly=493M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=7729 +[10:34:53] + 485s rallly=493M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=7978 +[10:35:08] + 500s rallly=498M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=8230 +[10:35:23] + 515s rallly=493M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=8481 +[10:35:39] + 530s rallly=494M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=8726 +[10:35:54] + 545s rallly=496M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=8975 +[10:36:09] + 560s rallly=493M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=9223 +[10:36:24] + 576s rallly=498M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=9473 +[10:36:39] + 591s rallly=498M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=9727 +[10:36:54] + 606s rallly=497M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=9976 +[10:36:55] memory watch: killed=False tight=[] requests=9977 codes={'200': 9977} +[10:36:55] MV-rallly: ABORT — putting the FROM images back +[10:40:06] ABORT: the app did NOT come back (rc=1, 180.1s) +{ + "harness_version": 4, + "edge": "MV-rallly", + "app": "rallly", + "note": "night 2026-09-23 within-a-major move: rallly-postgres=postgres:18-alpine", + "from": { + "rallly": "lukevella/rallly:4.11.1", + "rallly-postgres": "postgres:16-alpine" + }, + "to": { + "rallly": "lukevella/rallly:4.11.1", + "rallly-postgres": "postgres:18-alpine" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Krallly | Prisma schema loaded from prisma.", + "abort": "refuses", + "abort_detail": "/lib/postgresql/data\".\n\u001b[2Krallly-postgres | The files belonging to this database system will be owned by user \"postgres\".\n\u001b[2Krallly-postgres | This user must also own the server process.\n\u001b[2Krallly-postgres | \n\u001b[2Krallly-postgres | The database cluster will be initialized with locale \"en_US.utf8\".\n\u001b[2Krallly-postgres | The default database encoding has accordingly been set to \"UTF8\".\n\u001b[2Krallly-postgres | The default text search configuration will be set to \"english\".\n\u001b[2Krallly-postgres | \n\u001b[2Krallly-postgres | Data page checksums are disabled.\n\u001b[2Krallly-postgres | \n\u001b[2Krallly-postgres | initdb: error: directory \"/var/lib/postgresql/data\" exists but is not empty\n\u001b[2Krallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory \"/var/lib/postgresql/data\" or run initdb with an argument other than \"/var/lib/postgresql/data\".", + "engine_state_after": { + "rallly-postgres": { + "image": "postgres:18-alpine", + "probe": "datadir major version", + "answer": "18", + "probe_rc": 0 + } + }, + "memory": { + "soak_s": 606.3, + "requested_s": 600, + "requests": 9977, + "codes": { + "200": 9977 + }, + "first_kill": null, + "containers": { + "rallly": { + "limit": 805306368, + "peak": 551976960, + "peak_pct": 0.685, + "anon_peak_sampled": 496226304, + "anon_peak_pct": 0.616, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + }, + "rallly-postgres": { + "limit": 268435456, + "peak": 145522688, + "peak_pct": 0.542, + "anon_peak_sampled": 5623808, + "anon_peak_pct": 0.021, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 36.2, + "measured_at": "2026-09-30T10:40:06Z", + "evidence": "evidence/MV-rallly", + "scratch_cleared": [], + "engine_conversion": { + "service": "rallly-postgres", + "engine": "postgres", + "from": 16, + "to": 18, + "dump_s": 0.54, + "dump_bytes": 92067, + "new_engine_ready_s": 2.2, + "load_s": 1.05, + "dropped": [ + "rallly" + ], + "skipped_create_role": [ + "CREATE ROLE rallly;" + ], + "result": "converted", + "check_equal": true, + "pg_version": "18", + "tables": 31, + "convert_s": 21.4 + }, + "files_changed": [], + "total_s": 912.3 +} diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/abort-refusal.txt b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/abort-refusal.txt new file mode 100644 index 00000000..0fd52131 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/abort-refusal.txt @@ -0,0 +1,40 @@ +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/abort-states.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/abort-states.json new file mode 100644 index 00000000..a4ba795b --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/abort-states.json @@ -0,0 +1,14 @@ +{ + "rallly": { + "status": "created", + "health": null, + "restarts": 0, + "exit": 0 + }, + "rallly-postgres": { + "status": "restarting", + "health": "unhealthy", + "restarts": 0, + "exit": 1 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/compose-final.log b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/compose-final.log new file mode 100644 index 00000000..492a76ce --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/compose-final.log @@ -0,0 +1,132 @@ +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are disabled. +rallly-postgres | +rallly-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty +rallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/convert-check-after.txt b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/convert-check-after.txt new file mode 100644 index 00000000..dad3a60d --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/convert-check-after.txt @@ -0,0 +1,37 @@ +db:postgres owner=rallly enc=UTF8 coll=en_US.utf8 +db:rallly owner=rallly enc=UTF8 coll=en_US.utf8 +ext:rallly:citext +ext:rallly:pgcrypto +ext:rallly:plpgsql +role:rallly super=true login=true pw=true +rows:rallly:public._prisma_migrations=129 +rows:rallly:public.accounts=1 +rows:rallly:public.calendar_connections=0 +rows:rallly:public.comments=0 +rows:rallly:public.credentials=0 +rows:rallly:public.event_types=0 +rows:rallly:public.instance_licenses=0 +rows:rallly:public.instance_settings=1 +rows:rallly:public.license_validations=0 +rows:rallly:public.licenses=0 +rows:rallly:public.options=1 +rows:rallly:public.participants=0 +rows:rallly:public.payment_methods=0 +rows:rallly:public.polls=1 +rows:rallly:public.provider_calendars=0 +rows:rallly:public.registered_instances=0 +rows:rallly:public.rescheduled_event_dates=0 +rows:rallly:public.scheduled_event_invites=0 +rows:rallly:public.scheduled_events=0 +rows:rallly:public.sessions=2 +rows:rallly:public.sheet_slots=0 +rows:rallly:public.sheets=0 +rows:rallly:public.space_api_keys=0 +rows:rallly:public.space_member_invites=0 +rows:rallly:public.space_members=1 +rows:rallly:public.spaces=1 +rows:rallly:public.subscriptions=0 +rows:rallly:public.user_notification_preferences=0 +rows:rallly:public.users=1 +rows:rallly:public.verifications=0 +rows:rallly:public.votes=0 diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/convert-check-before.txt b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/convert-check-before.txt new file mode 100644 index 00000000..dad3a60d --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/convert-check-before.txt @@ -0,0 +1,37 @@ +db:postgres owner=rallly enc=UTF8 coll=en_US.utf8 +db:rallly owner=rallly enc=UTF8 coll=en_US.utf8 +ext:rallly:citext +ext:rallly:pgcrypto +ext:rallly:plpgsql +role:rallly super=true login=true pw=true +rows:rallly:public._prisma_migrations=129 +rows:rallly:public.accounts=1 +rows:rallly:public.calendar_connections=0 +rows:rallly:public.comments=0 +rows:rallly:public.credentials=0 +rows:rallly:public.event_types=0 +rows:rallly:public.instance_licenses=0 +rows:rallly:public.instance_settings=1 +rows:rallly:public.license_validations=0 +rows:rallly:public.licenses=0 +rows:rallly:public.options=1 +rows:rallly:public.participants=0 +rows:rallly:public.payment_methods=0 +rows:rallly:public.polls=1 +rows:rallly:public.provider_calendars=0 +rows:rallly:public.registered_instances=0 +rows:rallly:public.rescheduled_event_dates=0 +rows:rallly:public.scheduled_event_invites=0 +rows:rallly:public.scheduled_events=0 +rows:rallly:public.sessions=2 +rows:rallly:public.sheet_slots=0 +rows:rallly:public.sheets=0 +rows:rallly:public.space_api_keys=0 +rows:rallly:public.space_member_invites=0 +rows:rallly:public.space_members=1 +rows:rallly:public.spaces=1 +rows:rallly:public.subscriptions=0 +rows:rallly:public.user_notification_preferences=0 +rows:rallly:public.users=1 +rows:rallly:public.verifications=0 +rows:rallly:public.votes=0 diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/convert-load.err b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/convert-load.err new file mode 100644 index 00000000..e69de29b diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/engine-state.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/engine-state.json new file mode 100644 index 00000000..3fa9cf62 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/engine-state.json @@ -0,0 +1,8 @@ +{ + "rallly-postgres": { + "image": "postgres:18-alpine", + "probe": "datadir major version", + "answer": "18", + "probe_rc": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/files-after.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/files-after.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/files-after.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/files-before.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/files-before.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/files-before.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/memory-samples.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/memory-samples.json new file mode 100644 index 00000000..8a75a391 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/memory-samples.json @@ -0,0 +1,1122 @@ +[ + { + "t": 15.1, + "containers": { + "rallly": { + "limit": 805306368, + "current": 516038656, + "peak": 551976960, + "anon": 484024320, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 119341056, + "peak": 145522688, + "anon": 5447680, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 243 + }, + { + "t": 30.3, + "containers": { + "rallly": { + "limit": 805306368, + "current": 517345280, + "peak": 551976960, + "anon": 485355520, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 119382016, + "peak": 145522688, + "anon": 5447680, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 494 + }, + { + "t": 45.4, + "containers": { + "rallly": { + "limit": 805306368, + "current": 521097216, + "peak": 551976960, + "anon": 488894464, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 119816192, + "peak": 145522688, + "anon": 5455872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 741 + }, + { + "t": 60.5, + "containers": { + "rallly": { + "limit": 805306368, + "current": 520765440, + "peak": 551976960, + "anon": 488529920, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 119689216, + "peak": 145522688, + "anon": 5455872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 992 + }, + { + "t": 75.7, + "containers": { + "rallly": { + "limit": 805306368, + "current": 515964928, + "peak": 551976960, + "anon": 484057088, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 119943168, + "peak": 145522688, + "anon": 5455872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1243 + }, + { + "t": 90.8, + "containers": { + "rallly": { + "limit": 805306368, + "current": 518066176, + "peak": 551976960, + "anon": 486117376, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 119971840, + "peak": 145522688, + "anon": 5455872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1492 + }, + { + "t": 105.9, + "containers": { + "rallly": { + "limit": 805306368, + "current": 521826304, + "peak": 551976960, + "anon": 490049536, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 120057856, + "peak": 145522688, + "anon": 5455872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1740 + }, + { + "t": 121.1, + "containers": { + "rallly": { + "limit": 805306368, + "current": 522444800, + "peak": 551976960, + "anon": 490151936, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 120086528, + "peak": 145522688, + "anon": 5455872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1987 + }, + { + "t": 136.2, + "containers": { + "rallly": { + "limit": 805306368, + "current": 514228224, + "peak": 551976960, + "anon": 482340864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 120287232, + "peak": 145522688, + "anon": 5455872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2237 + }, + { + "t": 151.4, + "containers": { + "rallly": { + "limit": 805306368, + "current": 519897088, + "peak": 551976960, + "anon": 487768064, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 120287232, + "peak": 145522688, + "anon": 5455872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2485 + }, + { + "t": 166.6, + "containers": { + "rallly": { + "limit": 805306368, + "current": 514260992, + "peak": 551976960, + "anon": 482361344, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 120287232, + "peak": 145522688, + "anon": 5455872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2733 + }, + { + "t": 181.8, + "containers": { + "rallly": { + "limit": 805306368, + "current": 520392704, + "peak": 551976960, + "anon": 488124416, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 120455168, + "peak": 145522688, + "anon": 5455872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2976 + }, + { + "t": 196.9, + "containers": { + "rallly": { + "limit": 805306368, + "current": 521854976, + "peak": 551976960, + "anon": 489807872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 120455168, + "peak": 145522688, + "anon": 5455872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3223 + }, + { + "t": 212.0, + "containers": { + "rallly": { + "limit": 805306368, + "current": 524189696, + "peak": 551976960, + "anon": 491732992, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 120455168, + "peak": 145522688, + "anon": 5455872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3474 + }, + { + "t": 227.2, + "containers": { + "rallly": { + "limit": 805306368, + "current": 527032320, + "peak": 551976960, + "anon": 495104000, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 120455168, + "peak": 145522688, + "anon": 5455872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3721 + }, + { + "t": 242.4, + "containers": { + "rallly": { + "limit": 805306368, + "current": 527151104, + "peak": 551976960, + "anon": 494903296, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 120455168, + "peak": 145522688, + "anon": 5455872, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3970 + }, + { + "t": 257.5, + "containers": { + "rallly": { + "limit": 805306368, + "current": 521269248, + "peak": 551976960, + "anon": 489222144, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 120741888, + "peak": 145522688, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4220 + }, + { + "t": 272.7, + "containers": { + "rallly": { + "limit": 805306368, + "current": 514297856, + "peak": 551976960, + "anon": 482689024, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 123293696, + "peak": 145522688, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4469 + }, + { + "t": 287.9, + "containers": { + "rallly": { + "limit": 805306368, + "current": 521854976, + "peak": 551976960, + "anon": 489881600, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 124907520, + "peak": 145522688, + "anon": 5521408, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4721 + }, + { + "t": 303.0, + "containers": { + "rallly": { + "limit": 805306368, + "current": 520605696, + "peak": 551976960, + "anon": 488931328, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 126803968, + "peak": 145522688, + "anon": 5537792, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4973 + }, + { + "t": 318.1, + "containers": { + "rallly": { + "limit": 805306368, + "current": 522883072, + "peak": 551976960, + "anon": 490647552, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 128159744, + "peak": 145522688, + "anon": 5537792, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5221 + }, + { + "t": 333.3, + "containers": { + "rallly": { + "limit": 805306368, + "current": 520790016, + "peak": 551976960, + "anon": 489164800, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 130265088, + "peak": 145522688, + "anon": 5550080, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5469 + }, + { + "t": 348.4, + "containers": { + "rallly": { + "limit": 805306368, + "current": 524259328, + "peak": 551976960, + "anon": 492158976, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 132481024, + "peak": 145522688, + "anon": 5558272, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5722 + }, + { + "t": 363.5, + "containers": { + "rallly": { + "limit": 805306368, + "current": 518828032, + "peak": 551976960, + "anon": 486588416, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 134049792, + "peak": 145522688, + "anon": 5595136, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5974 + }, + { + "t": 378.7, + "containers": { + "rallly": { + "limit": 805306368, + "current": 528850944, + "peak": 551976960, + "anon": 496226304, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6223 + }, + { + "t": 393.9, + "containers": { + "rallly": { + "limit": 805306368, + "current": 527372288, + "peak": 551976960, + "anon": 494895104, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6476 + }, + { + "t": 409.1, + "containers": { + "rallly": { + "limit": 805306368, + "current": 524386304, + "peak": 551976960, + "anon": 491819008, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6729 + }, + { + "t": 424.2, + "containers": { + "rallly": { + "limit": 805306368, + "current": 519663616, + "peak": 551976960, + "anon": 487673856, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6978 + }, + { + "t": 439.4, + "containers": { + "rallly": { + "limit": 805306368, + "current": 515256320, + "peak": 551976960, + "anon": 482680832, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7230 + }, + { + "t": 454.5, + "containers": { + "rallly": { + "limit": 805306368, + "current": 516456448, + "peak": 551976960, + "anon": 485101568, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7483 + }, + { + "t": 469.6, + "containers": { + "rallly": { + "limit": 805306368, + "current": 516952064, + "peak": 551976960, + "anon": 485015552, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7729 + }, + { + "t": 484.8, + "containers": { + "rallly": { + "limit": 805306368, + "current": 517263360, + "peak": 551976960, + "anon": 484749312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7978 + }, + { + "t": 499.9, + "containers": { + "rallly": { + "limit": 805306368, + "current": 522772480, + "peak": 551976960, + "anon": 490524672, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8230 + }, + { + "t": 515.1, + "containers": { + "rallly": { + "limit": 805306368, + "current": 517279744, + "peak": 551976960, + "anon": 485011456, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8481 + }, + { + "t": 530.2, + "containers": { + "rallly": { + "limit": 805306368, + "current": 518303744, + "peak": 551976960, + "anon": 486924288, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8726 + }, + { + "t": 545.3, + "containers": { + "rallly": { + "limit": 805306368, + "current": 520667136, + "peak": 551976960, + "anon": 488857600, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8975 + }, + { + "t": 560.5, + "containers": { + "rallly": { + "limit": 805306368, + "current": 517574656, + "peak": 551976960, + "anon": 485441536, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9223 + }, + { + "t": 575.6, + "containers": { + "rallly": { + "limit": 805306368, + "current": 522297344, + "peak": 551976960, + "anon": 489771008, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9473 + }, + { + "t": 590.8, + "containers": { + "rallly": { + "limit": 805306368, + "current": 522317824, + "peak": 551976960, + "anon": 489795584, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9727 + }, + { + "t": 605.9, + "containers": { + "rallly": { + "limit": 805306368, + "current": 522092544, + "peak": 551976960, + "anon": 490160128, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "rallly-postgres": { + "limit": 268435456, + "current": 133877760, + "peak": 145522688, + "anon": 5623808, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9976 + } +] \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/migration-lines.txt b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/migration-lines.txt new file mode 100644 index 00000000..ac74958d --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/migration-lines.txt @@ -0,0 +1,4 @@ +rallly | Prisma schema loaded from prisma. +rallly | Datasource "db": PostgreSQL database "rallly", schema "public" at "rallly-postgres:5432" +rallly | 129 migrations found in prisma/migrations +rallly | No pending migrations to apply. \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/run.log b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/run.log new file mode 100644 index 00000000..3e6f5fa4 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/run.log @@ -0,0 +1,62 @@ +[10:24:54] scratch drive folders cleared before FROM (R-656): none existed +[10:24:54] MV-rallly: deploying rallly at FROM {'rallly': 'lukevella/rallly:4.11.1', 'rallly-postgres': 'postgres:16-alpine'} +[10:25:42] FROM settled=True in 36.2s :: {"rallly": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "rallly-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:25:42] fixture: the BOX walk's own (Rallly), through upgrade_boxport +[10:25:42] rallly: sign-up http=200 +[10:25:43] rallly: verify-email with the code http=200 +[10:25:43] rallly: seeded poll drillpoll-6e524ded (dOdvcB2pEhWW) +[10:25:43] rallly: readback of the seeded poll http=200 found=True +[10:25:43] C1 (seed reads back BEFORE): True +[10:25:43] MV-rallly: PostgreSQL major move {'service': 'rallly-postgres', 'engine': 'postgres', 'from': 16, 'to': 18} — converting on the bench before the swap +[10:26:05] CONVERTED rallly-postgres PostgreSQL 16 -> 18 in 21.4s (dump 0.54s / 92067 B, load 1.05s, check equal over 31 tables) +[10:26:05] MV-rallly: swapping to TO {'rallly': 'lukevella/rallly:4.11.1', 'rallly-postgres': 'postgres:18-alpine'} +[10:26:11] TO up -d rc=0 +[10:26:47] TO settled=True in 36.2s :: {"rallly": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "rallly-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:26:47] engine state rallly-postgres: 18 +[10:26:47] migration lines observed: 4 +[10:26:48] rallly: readback of the seeded poll http=200 found=True +[10:26:48] RESULT (seed reads back AFTER): True +[10:26:48] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:3000 +[10:27:03] + 15s rallly=492M/768M peak=526M kills=0 rs=0 rallly-postgres=113M/256M peak=138M kills=0 rs=0 reqs=243 +[10:27:19] + 30s rallly=493M/768M peak=526M kills=0 rs=0 rallly-postgres=113M/256M peak=138M kills=0 rs=0 reqs=494 +[10:27:34] + 45s rallly=496M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=741 +[10:27:49] + 60s rallly=496M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=992 +[10:28:04] + 76s rallly=492M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=1243 +[10:28:19] + 91s rallly=494M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=1492 +[10:28:34] + 106s rallly=497M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=1740 +[10:28:49] + 121s rallly=498M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=1987 +[10:29:05] + 136s rallly=490M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=2237 +[10:29:20] + 151s rallly=495M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=2485 +[10:29:35] + 167s rallly=490M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=2733 +[10:29:50] + 182s rallly=496M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=2976 +[10:30:05] + 197s rallly=497M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=3223 +[10:30:20] + 212s rallly=499M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=3474 +[10:30:36] + 227s rallly=502M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=3721 +[10:30:51] + 242s rallly=502M/768M peak=526M kills=0 rs=0 rallly-postgres=114M/256M peak=138M kills=0 rs=0 reqs=3970 +[10:31:06] + 258s rallly=497M/768M peak=526M kills=0 rs=0 rallly-postgres=115M/256M peak=138M kills=0 rs=0 reqs=4220 +[10:31:21] + 273s rallly=490M/768M peak=526M kills=0 rs=0 rallly-postgres=117M/256M peak=138M kills=0 rs=0 reqs=4469 +[10:31:36] + 288s rallly=497M/768M peak=526M kills=0 rs=0 rallly-postgres=119M/256M peak=138M kills=0 rs=0 reqs=4721 +[10:31:51] + 303s rallly=496M/768M peak=526M kills=0 rs=0 rallly-postgres=120M/256M peak=138M kills=0 rs=0 reqs=4973 +[10:32:06] + 318s rallly=498M/768M peak=526M kills=0 rs=0 rallly-postgres=122M/256M peak=138M kills=0 rs=0 reqs=5221 +[10:32:22] + 333s rallly=496M/768M peak=526M kills=0 rs=0 rallly-postgres=124M/256M peak=138M kills=0 rs=0 reqs=5469 +[10:32:37] + 348s rallly=499M/768M peak=526M kills=0 rs=0 rallly-postgres=126M/256M peak=138M kills=0 rs=0 reqs=5722 +[10:32:52] + 364s rallly=494M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=5974 +[10:33:07] + 379s rallly=504M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=6223 +[10:33:22] + 394s rallly=502M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=6476 +[10:33:37] + 409s rallly=500M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=6729 +[10:33:53] + 424s rallly=495M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=6978 +[10:34:08] + 439s rallly=491M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=7230 +[10:34:23] + 454s rallly=492M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=7483 +[10:34:38] + 470s rallly=493M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=7729 +[10:34:53] + 485s rallly=493M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=7978 +[10:35:08] + 500s rallly=498M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=8230 +[10:35:23] + 515s rallly=493M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=8481 +[10:35:39] + 530s rallly=494M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=8726 +[10:35:54] + 545s rallly=496M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=8975 +[10:36:09] + 560s rallly=493M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=9223 +[10:36:24] + 576s rallly=498M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=9473 +[10:36:39] + 591s rallly=498M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=9727 +[10:36:54] + 606s rallly=497M/768M peak=526M kills=0 rs=0 rallly-postgres=127M/256M peak=138M kills=0 rs=0 reqs=9976 +[10:36:55] memory watch: killed=False tight=[] requests=9977 codes={'200': 9977} +[10:36:55] MV-rallly: ABORT — putting the FROM images back +[10:40:06] ABORT: the app did NOT come back (rc=1, 180.1s) \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/to-full.log b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/to-full.log new file mode 100644 index 00000000..01cfb611 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/to-full.log @@ -0,0 +1,492 @@ +rallly | No .env file found, continuing without it +rallly | Loaded Prisma config from prisma.config.ts. +rallly | +rallly | Prisma schema loaded from prisma. +rallly | Datasource "db": PostgreSQL database "rallly", schema "public" at "rallly-postgres:5432" +rallly | +rallly | 129 migrations found in prisma/migrations +rallly | +rallly | Applying migration `20220315143815_init` +rallly | Applying migration `20220322193753_add_comments` +rallly | Applying migration `20220329102907_add_links` +rallly | Applying migration `20220330085423_add_notifications_column` +rallly | Applying migration `20220408120721_legacy_column` +rallly | Applying migration `20220412112814_cascade_delete` +rallly | Applying migration `20220412115407_cascade_delete_participants` +rallly | Applying migration `20220412115744_cascade_delete_votes` +rallly | Applying migration `20220414101318_remove_duplicate_emails` +rallly | Applying migration `20220506105524_sessions_update` +rallly | Applying migration `20220511113020_add_if_need_be` +rallly | Applying migration `20220511180705_naming_convention_update` +rallly | Applying migration `20220512093441_add_no_votes` +rallly | Applying migration `20220519075453_add_delete_column` +rallly | Applying migration `20220520115326_add_touch_column` +rallly | Applying migration `20220522153812_change_referential_integrity` +rallly | Applying migration `20220522165453_add_deleted_at_column` +rallly | Applying migration `20220623175037_remove_links_model` +rallly | Applying migration `20220624111614_rename_poll_id` +rallly | Applying migration `20220627191901_remove_user_relation` +rallly | Applying migration `20221026220835_add_indexes` +rallly | Applying migration `20230117103853_update_indexes` +rallly | Applying migration `20230118192253_bring_back_comment_index` +rallly | Applying migration `20230118200546_add_unqiue_participant` +rallly | Applying migration `20230303142641_add_participant_email` +rallly | Applying migration `20230318113511_remove_unecessary_unique_indexes` +rallly | Applying migration `20230322143831_watchers` +rallly | Applying migration `20230327105647_remove_author_name` +rallly | Applying migration `20230329173551_options_refactor` +rallly | Applying migration `20230614141138_v3` +rallly | Applying migration `20230615111329_events` +rallly | Applying migration `20230615163229_remove_selected_option_id` +rallly | Applying migration `20230704153346_user_payments` +rallly | Applying migration `20230721163042_hide_participants` +rallly | Applying migration `20230725112615_add_poll_config` +rallly | Applying migration `20230823084154_stripe_subscriptions` +rallly | Applying migration `20230915170216_add_required_email` +rallly | Applying migration `20231016093654_next_auth` +rallly | Applying migration `20231027074632_nextauth_ci_identifiers` +rallly | Applying migration `20231117153753_add_nextauth_provider_accounts` +rallly | Applying migration `20231118134458_add_account_user_index` +rallly | Applying migration `20231122061137_map_account_table_names` +rallly | Applying migration `20231205043530_poll_status` +rallly | Applying migration `20231205080854_fix_finalized_poll_status` +rallly | Applying migration `20240127064213_add_image_field` +rallly | Applying migration `20240221084400_unset_invalid_timezones` +rallly | Applying migration `20240224011353_remove_legacy_user_preferences` +rallly | Applying migration `20240224033808_option_start_time` +rallly | Applying migration `20240309043111_remove_poll_vote_index` +rallly | Applying migration `20240309051319_add_option_vote_index` +rallly | Applying migration `20240315104329_index_votes_by_poll` +rallly | Applying migration `20240317095541_remove_legacy_start_column` +rallly | Applying migration `20240704085250_soft_delete_participants` +rallly | Applying migration `20240901171230_participant_locale` +rallly | Applying migration `20241224103150_guest_id_column` +rallly | Applying migration `20241228093234_update_relational_model` +rallly | Applying migration `20250217082042_add_subscription_fields` +rallly | Applying migration `20250217103625_make_subscription_fields_required` +rallly | Applying migration `20250221104854_add_cancel_at_period_end` +rallly | Applying migration `20250221111248_add_subscription_interval_enum` +rallly | Applying migration `20250222172325_add_payment_method_table` +rallly | Applying migration `20250223160003_set_subscription_status_enum` +rallly | Applying migration `20250226173250_remove_paddle_subscriptions` +rallly | Applying migration `20250227110115_make_subscription_user_required` +rallly | Applying migration `20250302163530_add_user_ban_fields` +rallly | Applying migration `20250327193922_track_poll_views` +rallly | Applying migration `20250402100733_remove_closed_column` +rallly | Applying migration `20250415153024_scheduled_events` +rallly | Applying migration `20250415155219_migrate_events` +rallly | Applying migration `20250421170921_migrate_invites` +rallly | Applying migration `20250522093338_add_user_role` +rallly | Applying migration `20250522165415_licensing_schema` +rallly | Applying migration `20250523161200_remove_invitee_constraints` +rallly | Applying migration `20250526175615_remove_stripe_customer_id` +rallly | Applying migration `20250602144531_add_instance_settings` +rallly | Applying migration `20250602181052_add_instance_settings_constraints` +rallly | Applying migration `20250614062854_remove_deprecated_event_model` +rallly | Applying migration `20250614062855_create_spaces_model` +rallly | Applying migration `20250614110551_create_spaces` +rallly | Applying migration `20250614115818_migrate_events_to_spaces` +rallly | Applying migration `20250615114214_update_indexes` +rallly | Applying migration `20250616140319_create_space_members` +rallly | Applying migration `20250616140359_space_members_migration` +rallly | Applying migration `20250710102819_add_active_space_to_user` +rallly | Applying migration `20250711140850_add_time_zone_column` +rallly | Applying migration `20250715153525_update_space_member_indexes` +rallly | Applying migration `20250722083454_remove_owner_role` +rallly | Applying migration `20250723192600_add_space_member_invite` +rallly | Applying migration `20250724140012_add_subscription_columns` +rallly | Applying migration `20250729143210_add_space_member_last_selected_at` +rallly | Applying migration `20250729144904_drop_user_active_space_id` +rallly | Applying migration `20250730115902_subscription_item_id_non_nullable` +rallly | Applying migration `20250731100421_update_subscription_interval_enum` +rallly | Applying migration `20250804130713_add_space_image_column` +rallly | Applying migration `20250804152225_allow_user_multiple_subscriptions` +rallly | Applying migration `20250901121851_add_ics_columns` +rallly | Applying migration `20251007051830_add_integration_models` +rallly | Applying migration `20251014054941_better_auth` +rallly | Applying migration `20251021132911_add_better_auth_admin_fields` +rallly | Applying migration `20251021160519_add_last_login_method` +rallly | Applying migration `20251027170830_anonymous_user` +rallly | Applying migration `20251107120000_allow_multiple_space_subscriptions` +rallly | Applying migration `20251107131500_add_space_tier` +rallly | Applying migration `20251110113931_non_nullable_space_id_susbcription` +rallly | Applying migration `20251202151504_better_auth_joins` +rallly | Applying migration `20251216111415_consolidate_microsoft_provider` +rallly | Applying migration `20251222101400_add_api_keys` +rallly | Applying migration `20251229171820_add_white_label_addon` +rallly | Applying migration `20260107154216_add_space_api_keys` +rallly | Applying migration `20260107155716_remove_user_api_keys` +rallly | Applying migration `20260117124004_update_poll_status_enum` +rallly | Applying migration `20260304114245_notification_prefs` +rallly | Applying migration `20260309174403_add_poll_muted_drop_watchers` +rallly | Applying migration `20260313103853_remove_touched_at` +rallly | Applying migration `20260403112726_add_space_primary_color_and_show_branding` +rallly | Applying migration `20260423144927_add_instance_id` +rallly | Applying migration `20260423172330_add_registered_instance` +rallly | Applying migration `20260509200506_add_poll_kind` +rallly | Applying migration `20260514141310_add_event_type` +rallly | Applying migration `20260514165732_migrate_hash_indexes_to_btree_small_tables` +rallly | Applying migration `20260518184939_add_sheet_and_extend_scheduled_event` +rallly | Applying migration `20260519111112_invitee_email_citext` +rallly | Applying migration `20260519160226_add_hide_attendees_to_scheduled_event` +rallly | Applying migration `20260525130443_structured_location_and_conferencing` +rallly | Applying migration `20260615095634_add_user_last_seen_at` +rallly | Applying migration `20260616094409_drop_verification_tokens_table` +rallly | Applying migration `20260616131914_unique_scheduled_event_invite_email` +rallly | Applying migration `20260619111500_drop_poll_views` +rallly | Applying migration `20260619150228_fix_all_day_option_timezone_shift` +rallly | +rallly | The following migration(s) have been applied: +rallly | +rallly | migrations/ +rallly | └─ 20220315143815_init/ +rallly | └─ migration.sql +rallly | └─ 20220322193753_add_comments/ +rallly | └─ migration.sql +rallly | └─ 20220329102907_add_links/ +rallly | └─ migration.sql +rallly | └─ 20220330085423_add_notifications_column/ +rallly | └─ migration.sql +rallly | └─ 20220408120721_legacy_column/ +rallly | └─ migration.sql +rallly | └─ 20220412112814_cascade_delete/ +rallly | └─ migration.sql +rallly | └─ 20220412115407_cascade_delete_participants/ +rallly | └─ migration.sql +rallly | └─ 20220412115744_cascade_delete_votes/ +rallly | └─ migration.sql +rallly | └─ 20220414101318_remove_duplicate_emails/ +rallly | └─ migration.sql +rallly | └─ 20220506105524_sessions_update/ +rallly | └─ migration.sql +rallly | └─ 20220511113020_add_if_need_be/ +rallly | └─ migration.sql +rallly | └─ 20220511180705_naming_convention_update/ +rallly | └─ migration.sql +rallly | └─ 20220512093441_add_no_votes/ +rallly | └─ migration.sql +rallly | └─ 20220519075453_add_delete_column/ +rallly | └─ migration.sql +rallly | └─ 20220520115326_add_touch_column/ +rallly | └─ migration.sql +rallly | └─ 20220522153812_change_referential_integrity/ +rallly | └─ migration.sql +rallly | └─ 20220522165453_add_deleted_at_column/ +rallly | └─ migration.sql +rallly | └─ 20220623175037_remove_links_model/ +rallly | └─ migration.sql +rallly | └─ 20220624111614_rename_poll_id/ +rallly | └─ migration.sql +rallly | └─ 20220627191901_remove_user_relation/ +rallly | └─ migration.sql +rallly | └─ 20221026220835_add_indexes/ +rallly | └─ migration.sql +rallly | └─ 20230117103853_update_indexes/ +rallly | └─ migration.sql +rallly | └─ 20230118192253_bring_back_comment_index/ +rallly | └─ migration.sql +rallly | └─ 20230118200546_add_unqiue_participant/ +rallly | └─ migration.sql +rallly | └─ 20230303142641_add_participant_email/ +rallly | └─ migration.sql +rallly | └─ 20230318113511_remove_unecessary_unique_indexes/ +rallly | └─ migration.sql +rallly | └─ 20230322143831_watchers/ +rallly | └─ migration.sql +rallly | └─ 20230327105647_remove_author_name/ +rallly | └─ migration.sql +rallly | └─ 20230329173551_options_refactor/ +rallly | └─ migration.sql +rallly | └─ 20230614141138_v3/ +rallly | └─ migration.sql +rallly | └─ 20230615111329_events/ +rallly | └─ migration.sql +rallly | └─ 20230615163229_remove_selected_option_id/ +rallly | └─ migration.sql +rallly | └─ 20230704153346_user_payments/ +rallly | └─ migration.sql +rallly | └─ 20230721163042_hide_participants/ +rallly | └─ migration.sql +rallly | └─ 20230725112615_add_poll_config/ +rallly | └─ migration.sql +rallly | └─ 20230823084154_stripe_subscriptions/ +rallly | └─ migration.sql +rallly | └─ 20230915170216_add_required_email/ +rallly | └─ migration.sql +rallly | └─ 20231016093654_next_auth/ +rallly | └─ migration.sql +rallly-postgres | The files belonging to this database system will be owned by user "postgres". +rallly | └─ 20231027074632_nextauth_ci_identifiers/ +rallly | └─ migration.sql +rallly | └─ 20231117153753_add_nextauth_provider_accounts/ +rallly | └─ migration.sql +rallly | └─ 20231118134458_add_account_user_index/ +rallly | └─ migration.sql +rallly | └─ 20231122061137_map_account_table_names/ +rallly | └─ migration.sql +rallly | └─ 20231205043530_poll_status/ +rallly | └─ migration.sql +rallly | └─ 20231205080854_fix_finalized_poll_status/ +rallly | └─ migration.sql +rallly | └─ 20240127064213_add_image_field/ +rallly | └─ migration.sql +rallly | └─ 20240221084400_unset_invalid_timezones/ +rallly | └─ migration.sql +rallly | └─ 20240224011353_remove_legacy_user_preferences/ +rallly | └─ migration.sql +rallly | └─ 20240224033808_option_start_time/ +rallly | └─ migration.sql +rallly-postgres | This user must also own the server process. +rallly-postgres | +rallly-postgres | The database cluster will be initialized with locale "en_US.utf8". +rallly-postgres | The default database encoding has accordingly been set to "UTF8". +rallly-postgres | The default text search configuration will be set to "english". +rallly-postgres | +rallly-postgres | Data page checksums are enabled. +rallly-postgres | +rallly-postgres | fixing permissions on existing directory /var/lib/postgresql/18/docker ... ok +rallly-postgres | creating subdirectories ... ok +rallly-postgres | selecting dynamic shared memory implementation ... posix +rallly-postgres | selecting default "max_connections" ... 100 +rallly-postgres | selecting default "shared_buffers" ... 128MB +rallly-postgres | selecting default time zone ... Europe/Budapest +rallly-postgres | creating configuration files ... ok +rallly-postgres | running bootstrap script ... ok +rallly-postgres | sh: locale: not found +rallly-postgres | 2026-09-30 12:26:01.286 CEST [46] WARNING: no usable system locales were found +rallly-postgres | performing post-bootstrap initialization ... ok +rallly-postgres | syncing data to disk ... ok +rallly | └─ 20240309043111_remove_poll_vote_index/ +rallly-postgres | +rallly-postgres | +rallly-postgres | initdb: warning: enabling "trust" authentication for local connections +rallly-postgres | initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. +rallly-postgres | Success. You can now start the database server using: +rallly-postgres | +rallly-postgres | pg_ctl -D /var/lib/postgresql/18/docker -l logfile start +rallly-postgres | +rallly-postgres | waiting for server to start....2026-09-30 12:26:02.119 CEST [52] LOG: starting PostgreSQL 18.6 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit +rallly-postgres | 2026-09-30 12:26:02.123 CEST [52] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" +rallly | └─ migration.sql +rallly | └─ 20240309051319_add_option_vote_index/ +rallly | └─ migration.sql +rallly | └─ 20240315104329_index_votes_by_poll/ +rallly | └─ migration.sql +rallly | └─ 20240317095541_remove_legacy_start_column/ +rallly | └─ migration.sql +rallly | └─ 20240704085250_soft_delete_participants/ +rallly | └─ migration.sql +rallly-postgres | 2026-09-30 12:26:02.138 CEST [58] LOG: database system was shut down at 2026-09-30 12:26:01 CEST +rallly-postgres | 2026-09-30 12:26:02.145 CEST [52] LOG: database system is ready to accept connections +rallly | └─ 20240901171230_participant_locale/ +rallly | └─ migration.sql +rallly | └─ 20241224103150_guest_id_column/ +rallly | └─ migration.sql +rallly | └─ 20241228093234_update_relational_model/ +rallly | └─ migration.sql +rallly | └─ 20250217082042_add_subscription_fields/ +rallly | └─ migration.sql +rallly | └─ 20250217103625_make_subscription_fields_required/ +rallly | └─ migration.sql +rallly | └─ 20250221104854_add_cancel_at_period_end/ +rallly | └─ migration.sql +rallly-postgres | done +rallly-postgres | server started +rallly-postgres | CREATE DATABASE +rallly-postgres | +rallly-postgres | +rallly-postgres | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/* +rallly-postgres | +rallly-postgres | waiting for server to shut down....2026-09-30 12:26:02.325 CEST [52] LOG: received fast shutdown request +rallly-postgres | 2026-09-30 12:26:02.328 CEST [52] LOG: aborting any active transactions +rallly-postgres | 2026-09-30 12:26:02.331 CEST [52] LOG: background worker "logical replication launcher" (PID 61) exited with exit code 1 +rallly-postgres | 2026-09-30 12:26:02.332 CEST [56] LOG: shutting down +rallly-postgres | 2026-09-30 12:26:02.334 CEST [56] LOG: checkpoint starting: shutdown immediate +rallly-postgres | 2026-09-30 12:26:02.420 CEST [56] LOG: checkpoint complete: wrote 943 buffers (5.8%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.024 s, sync=0.051 s, total=0.089 s; sync files=303, longest=0.016 s, average=0.001 s; distance=4362 kB, estimate=4362 kB; lsn=0/1BA8858, redo lsn=0/1BA8858 +rallly-postgres | 2026-09-30 12:26:02.454 CEST [52] LOG: database system is shut down +rallly-postgres | done +rallly-postgres | server stopped +rallly-postgres | +rallly-postgres | PostgreSQL init process complete; ready for start up. +rallly-postgres | +rallly-postgres | 2026-09-30 12:26:02.564 CEST [1] LOG: starting PostgreSQL 18.6 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit +rallly-postgres | 2026-09-30 12:26:02.564 CEST [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 +rallly-postgres | 2026-09-30 12:26:02.564 CEST [1] LOG: listening on IPv6 address "::", port 5432 +rallly-postgres | 2026-09-30 12:26:02.570 CEST [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" +rallly-postgres | 2026-09-30 12:26:02.580 CEST [74] LOG: database system was shut down at 2026-09-30 12:26:02 CEST +rallly-postgres | 2026-09-30 12:26:02.592 CEST [1] LOG: database system is ready to accept connections +rallly | └─ 20250221111248_add_subscription_interval_enum/ +rallly | └─ migration.sql +rallly | └─ 20250222172325_add_payment_method_table/ +rallly | └─ migration.sql +rallly | └─ 20250223160003_set_subscription_status_enum/ +rallly | └─ migration.sql +rallly | └─ 20250226173250_remove_paddle_subscriptions/ +rallly | └─ migration.sql +rallly | └─ 20250227110115_make_subscription_user_required/ +rallly | └─ migration.sql +rallly | └─ 20250302163530_add_user_ban_fields/ +rallly | └─ migration.sql +rallly | └─ 20250327193922_track_poll_views/ +rallly | └─ migration.sql +rallly | └─ 20250402100733_remove_closed_column/ +rallly | └─ migration.sql +rallly | └─ 20250415153024_scheduled_events/ +rallly | └─ migration.sql +rallly | └─ 20250415155219_migrate_events/ +rallly | └─ migration.sql +rallly | └─ 20250421170921_migrate_invites/ +rallly | └─ migration.sql +rallly | └─ 20250522093338_add_user_role/ +rallly | └─ migration.sql +rallly | └─ 20250522165415_licensing_schema/ +rallly | └─ migration.sql +rallly | └─ 20250523161200_remove_invitee_constraints/ +rallly | └─ migration.sql +rallly | └─ 20250526175615_remove_stripe_customer_id/ +rallly | └─ migration.sql +rallly | └─ 20250602144531_add_instance_settings/ +rallly-postgres | 2026-09-30 12:26:03.254 CEST [72] LOG: checkpoint starting: immediate force wait +rallly | └─ migration.sql +rallly | └─ 20250602181052_add_instance_settings_constraints/ +rallly-postgres | 2026-09-30 12:26:03.297 CEST [72] LOG: checkpoint complete: wrote 1 buffers (0.0%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.008 s, sync=0.006 s, total=0.043 s; sync files=3, longest=0.003 s, average=0.002 s; distance=1 kB, estimate=1 kB; lsn=0/1BA8D60, redo lsn=0/1BA8D08 +rallly | └─ migration.sql +rallly | └─ 20250614062854_remove_deprecated_event_model/ +rallly | └─ migration.sql +rallly | └─ 20250614062855_create_spaces_model/ +rallly | └─ migration.sql +rallly | └─ 20250614110551_create_spaces/ +rallly | └─ migration.sql +rallly | └─ 20250614115818_migrate_events_to_spaces/ +rallly | └─ migration.sql +rallly | └─ 20250615114214_update_indexes/ +rallly | └─ migration.sql +rallly | └─ 20250616140319_create_space_members/ +rallly | └─ migration.sql +rallly | └─ 20250616140359_space_members_migration/ +rallly | └─ migration.sql +rallly | └─ 20250710102819_add_active_space_to_user/ +rallly | └─ migration.sql +rallly | └─ 20250711140850_add_time_zone_column/ +rallly | └─ migration.sql +rallly | └─ 20250715153525_update_space_member_indexes/ +rallly | └─ migration.sql +rallly | └─ 20250722083454_remove_owner_role/ +rallly | └─ migration.sql +rallly | └─ 20250723192600_add_space_member_invite/ +rallly | └─ migration.sql +rallly | └─ 20250724140012_add_subscription_columns/ +rallly | └─ migration.sql +rallly | └─ 20250729143210_add_space_member_last_selected_at/ +rallly | └─ migration.sql +rallly | └─ 20250729144904_drop_user_active_space_id/ +rallly | └─ migration.sql +rallly | └─ 20250730115902_subscription_item_id_non_nullable/ +rallly | └─ migration.sql +rallly | └─ 20250731100421_update_subscription_interval_enum/ +rallly | └─ migration.sql +rallly | └─ 20250804130713_add_space_image_column/ +rallly | └─ migration.sql +rallly | └─ 20250804152225_allow_user_multiple_subscriptions/ +rallly | └─ migration.sql +rallly | └─ 20250901121851_add_ics_columns/ +rallly | └─ migration.sql +rallly | └─ 20251007051830_add_integration_models/ +rallly | └─ migration.sql +rallly | └─ 20251014054941_better_auth/ +rallly | └─ migration.sql +rallly | └─ 20251021132911_add_better_auth_admin_fields/ +rallly | └─ migration.sql +rallly | └─ 20251021160519_add_last_login_method/ +rallly | └─ migration.sql +rallly | └─ 20251027170830_anonymous_user/ +rallly | └─ migration.sql +rallly | └─ 20251107120000_allow_multiple_space_subscriptions/ +rallly | └─ migration.sql +rallly | └─ 20251107131500_add_space_tier/ +rallly | └─ migration.sql +rallly | └─ 20251110113931_non_nullable_space_id_susbcription/ +rallly | └─ migration.sql +rallly | └─ 20251202151504_better_auth_joins/ +rallly | └─ migration.sql +rallly | └─ 20251216111415_consolidate_microsoft_provider/ +rallly | └─ migration.sql +rallly | └─ 20251222101400_add_api_keys/ +rallly | └─ migration.sql +rallly | └─ 20251229171820_add_white_label_addon/ +rallly | └─ migration.sql +rallly | └─ 20260107154216_add_space_api_keys/ +rallly | └─ migration.sql +rallly | └─ 20260107155716_remove_user_api_keys/ +rallly | └─ migration.sql +rallly | └─ 20260117124004_update_poll_status_enum/ +rallly | └─ migration.sql +rallly | └─ 20260304114245_notification_prefs/ +rallly | └─ migration.sql +rallly | └─ 20260309174403_add_poll_muted_drop_watchers/ +rallly | └─ migration.sql +rallly | └─ 20260313103853_remove_touched_at/ +rallly | └─ migration.sql +rallly | └─ 20260403112726_add_space_primary_color_and_show_branding/ +rallly | └─ migration.sql +rallly | └─ 20260423144927_add_instance_id/ +rallly | └─ migration.sql +rallly | └─ 20260423172330_add_registered_instance/ +rallly | └─ migration.sql +rallly | └─ 20260509200506_add_poll_kind/ +rallly | └─ migration.sql +rallly | └─ 20260514141310_add_event_type/ +rallly | └─ migration.sql +rallly | └─ 20260514165732_migrate_hash_indexes_to_btree_small_tables/ +rallly | └─ migration.sql +rallly | └─ 20260518184939_add_sheet_and_extend_scheduled_event/ +rallly | └─ migration.sql +rallly | └─ 20260519111112_invitee_email_citext/ +rallly | └─ migration.sql +rallly | └─ 20260519160226_add_hide_attendees_to_scheduled_event/ +rallly | └─ migration.sql +rallly | └─ 20260525130443_structured_location_and_conferencing/ +rallly | └─ migration.sql +rallly | └─ 20260615095634_add_user_last_seen_at/ +rallly | └─ migration.sql +rallly | └─ 20260616094409_drop_verification_tokens_table/ +rallly | └─ migration.sql +rallly | └─ 20260616131914_unique_scheduled_event_invite_email/ +rallly | └─ migration.sql +rallly | └─ 20260619111500_drop_poll_views/ +rallly | └─ migration.sql +rallly | └─ 20260619150228_fix_all_day_option_timezone_shift/ +rallly | └─ migration.sql +rallly | +rallly | All migrations have been successfully applied. +rallly | npm notice +rallly | npm notice New major version of npm available! 11.13.0 -> 12.1.0 +rallly | npm notice Changelog: https://github.com/npm/cli/releases/tag/v12.1.0 +rallly | npm notice To update run: npm install -g npm@12.1.0 +rallly | npm notice +rallly | ▲ Next.js 16.2.6 +rallly | - Local: http://localhost:3000 +rallly | - Network: http://0.0.0.0:3000 +rallly | ✓ Ready in 0ms +rallly | {"level":50,"time":1790763942927,"pid":58,"hostname":"be14cfa25043","name":"emails","error":{"errno":-111,"code":"ESOCKET","syscall":"connect","address":"127.0.0.1","port":587,"command":"CONN"},"recipient":"drill354631@gate.invalid","subject":"Please verify your email address","msg":"Failed to send email: Please verify your email address"} +rallly | {"level":50,"time":1790763943364,"pid":58,"hostname":"be14cfa25043","name":"emails","error":{"errno":-111,"code":"ESOCKET","syscall":"connect","address":"127.0.0.1","port":587,"command":"CONN"},"recipient":"drill354631@gate.invalid","subject":"Let's find a date for drillpoll-6e524ded!","msg":"Failed to send email: Let's find a date for drillpoll-6e524ded!"} +rallly | {"level":40,"time":1790763943464,"pid":58,"hostname":"be14cfa25043","timestamp":"2026-09-30T10:25:43.457Z","service":"trpc","method":"GET","path":"/api/trpc/polls.get","ip":"127.0.0.1","statusCode":404,"errorCode":"NOT_FOUND","errorMessage":"Poll not found","errorType":"TRPCError","durationMs":7} +rallly | No .env file found, continuing without it +rallly | Loaded Prisma config from prisma.config.ts. +rallly | +rallly | Prisma schema loaded from prisma. +rallly | Datasource "db": PostgreSQL database "rallly", schema "public" at "rallly-postgres:5432" +rallly | +rallly | 129 migrations found in prisma/migrations +rallly | +rallly | +rallly | No pending migrations to apply. +rallly | npm notice +rallly | npm notice New major version of npm available! 11.13.0 -> 12.1.0 +rallly | npm notice Changelog: https://github.com/npm/cli/releases/tag/v12.1.0 +rallly | npm notice To update run: npm install -g npm@12.1.0 +rallly | npm notice +rallly | ▲ Next.js 16.2.6 +rallly | - Local: http://localhost:3000 +rallly | - Network: http://0.0.0.0:3000 +rallly | ✓ Ready in 0ms diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/to-states.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/to-states.json new file mode 100644 index 00000000..3fec1edc --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/to-states.json @@ -0,0 +1,14 @@ +{ + "rallly": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + }, + "rallly-postgres": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/verdict.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/verdict.json new file mode 100644 index 00000000..3a392284 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/rallly/bench/evidence/MV-rallly/verdict.json @@ -0,0 +1,92 @@ +{ + "harness_version": 4, + "edge": "MV-rallly", + "app": "rallly", + "note": "night 2026-09-23 within-a-major move: rallly-postgres=postgres:18-alpine", + "from": { + "rallly": "lukevella/rallly:4.11.1", + "rallly-postgres": "postgres:16-alpine" + }, + "to": { + "rallly": "lukevella/rallly:4.11.1", + "rallly-postgres": "postgres:18-alpine" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Krallly | Prisma schema loaded from prisma.", + "abort": "refuses", + "abort_detail": "/lib/postgresql/data\".\n\u001b[2Krallly-postgres | The files belonging to this database system will be owned by user \"postgres\".\n\u001b[2Krallly-postgres | This user must also own the server process.\n\u001b[2Krallly-postgres | \n\u001b[2Krallly-postgres | The database cluster will be initialized with locale \"en_US.utf8\".\n\u001b[2Krallly-postgres | The default database encoding has accordingly been set to \"UTF8\".\n\u001b[2Krallly-postgres | The default text search configuration will be set to \"english\".\n\u001b[2Krallly-postgres | \n\u001b[2Krallly-postgres | Data page checksums are disabled.\n\u001b[2Krallly-postgres | \n\u001b[2Krallly-postgres | initdb: error: directory \"/var/lib/postgresql/data\" exists but is not empty\n\u001b[2Krallly-postgres | initdb: hint: If you want to create a new database system, either remove or empty the directory \"/var/lib/postgresql/data\" or run initdb with an argument other than \"/var/lib/postgresql/data\".", + "engine_state_after": { + "rallly-postgres": { + "image": "postgres:18-alpine", + "probe": "datadir major version", + "answer": "18", + "probe_rc": 0 + } + }, + "memory": { + "soak_s": 606.3, + "requested_s": 600, + "requests": 9977, + "codes": { + "200": 9977 + }, + "first_kill": null, + "containers": { + "rallly": { + "limit": 805306368, + "peak": 551976960, + "peak_pct": 0.685, + "anon_peak_sampled": 496226304, + "anon_peak_pct": 0.616, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + }, + "rallly-postgres": { + "limit": 268435456, + "peak": 145522688, + "peak_pct": 0.542, + "anon_peak_sampled": 5623808, + "anon_peak_pct": 0.021, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 36.2, + "measured_at": "2026-09-30T10:40:06Z", + "evidence": "evidence/MV-rallly", + "scratch_cleared": [], + "engine_conversion": { + "service": "rallly-postgres", + "engine": "postgres", + "from": 16, + "to": 18, + "dump_s": 0.54, + "dump_bytes": 92067, + "new_engine_ready_s": 2.2, + "load_s": 1.05, + "dropped": [ + "rallly" + ], + "skipped_create_role": [ + "CREATE ROLE rallly;" + ], + "result": "converted", + "check_equal": true, + "pg_version": "18", + "tables": 31, + "convert_s": 21.4 + }, + "files_changed": [], + "total_s": 912.3 +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/MV-sparkyfitness.log b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/MV-sparkyfitness.log new file mode 100644 index 00000000..c83025c2 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/MV-sparkyfitness.log @@ -0,0 +1,168 @@ +[10:24:54] scratch drive folders cleared before FROM (R-656): none existed +[10:24:54] MV-sparkyfitness: deploying sparkyfitness at FROM {'sparkyfitness-db': 'postgres:15-alpine', 'sparkyfitness-server': 'codewithcj/sparkyfitness_server:v0.17.3', 'sparkyfitness-frontend': 'codewithcj/sparkyfitness:v0.17.3'} +[10:26:08] FROM settled=True in 31.1s :: {"sparkyfitness": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-server": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:26:08] fixture: the BOX walk's own (Sparkyfitness), through upgrade_boxport +[10:26:08] sparkyfitness: sign-up http=200 +[10:26:08] sparkyfitness: check-in http=200 +[10:26:08] sparkyfitness: seeded user drilld17b38 with a weight of 73.36 on 2026-09-01 +[10:26:09] sparkyfitness: readback of the seeded weight http=200 equal=True +[10:26:09] C1 (seed reads back BEFORE): True +[10:26:09] MV-sparkyfitness: PostgreSQL major move {'service': 'sparkyfitness-db', 'engine': 'postgres', 'from': 15, 'to': 18} — converting on the bench before the swap +[10:26:22] CONVERTED sparkyfitness-db PostgreSQL 15 -> 18 in 13.3s (dump 0.69s / 377827 B, load 3.99s, check equal over 94 tables) +[10:26:22] MV-sparkyfitness: swapping to TO {'sparkyfitness-db': 'postgres:18-alpine', 'sparkyfitness-server': 'codewithcj/sparkyfitness_server:v0.17.3', 'sparkyfitness-frontend': 'codewithcj/sparkyfitness:v0.17.3'} +[10:26:56] TO up -d rc=0 +[10:27:28] TO settled=True in 31.2s :: {"sparkyfitness": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-server": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:27:28] engine state sparkyfitness-db: 18 +[10:27:28] migration lines observed: 6 +[10:27:28] sparkyfitness: readback of the seeded weight http=200 equal=True +[10:27:28] RESULT (seed reads back AFTER): True +[10:27:29] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.4:80 +[10:27:44] + 15s sparkyfitness=7M/256M peak=8M kills=0 rs=0 sparkyfitness-db=134M/512M peak=141M kills=0 rs=0 sparkyfitness-server=347M/1024M peak=358M kills=0 rs=0 reqs=304 +[10:27:59] + 30s sparkyfitness=6M/256M peak=9M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=347M/1024M peak=359M kills=0 rs=0 reqs=604 +[10:28:14] + 46s sparkyfitness=6M/256M peak=9M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=314M/1024M peak=359M kills=0 rs=0 reqs=904 +[10:28:30] + 61s sparkyfitness=7M/256M peak=9M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=264M/1024M peak=359M kills=0 rs=0 reqs=1208 +[10:28:45] + 76s sparkyfitness=6M/256M peak=9M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=264M/1024M peak=359M kills=0 rs=0 reqs=1508 +[10:29:00] + 91s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=264M/1024M peak=359M kills=0 rs=0 reqs=1809 +[10:29:15] + 106s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=264M/1024M peak=359M kills=0 rs=0 reqs=2112 +[10:29:30] + 121s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=264M/1024M peak=359M kills=0 rs=0 reqs=2412 +[10:29:45] + 136s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=264M/1024M peak=359M kills=0 rs=0 reqs=2712 +[10:30:01] + 152s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=3016 +[10:30:16] + 167s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=3316 +[10:30:31] + 182s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=3618 +[10:30:46] + 197s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=3920 +[10:31:01] + 212s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=4222 +[10:31:16] + 228s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=4524 +[10:31:32] + 243s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=132M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=4824 +[10:31:47] + 258s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=134M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=5126 +[10:32:02] + 273s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=135M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=5428 +[10:32:17] + 288s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=136M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=5728 +[10:32:32] + 304s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=137M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=6032 +[10:32:48] + 319s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=139M/512M peak=142M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=6332 +[10:33:03] + 334s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=141M/512M peak=142M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=6634 +[10:33:18] + 349s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=141M/512M peak=144M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=6936 +[10:33:33] + 364s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=145M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=7238 +[10:33:48] + 379s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=145M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=7540 +[10:34:03] + 394s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=145M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=7840 +[10:34:19] + 410s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=145M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=8140 +[10:34:34] + 425s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=146M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=8444 +[10:34:49] + 440s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=146M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=8744 +[10:35:04] + 455s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=146M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=9046 +[10:35:19] + 470s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=9348 +[10:35:34] + 486s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=9650 +[10:35:50] + 501s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=9950 +[10:36:05] + 516s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=10252 +[10:36:20] + 531s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=10554 +[10:36:35] + 546s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=10856 +[10:36:50] + 561s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=11157 +[10:37:05] + 577s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=11458 +[10:37:21] + 592s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=11760 +[10:37:36] + 607s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=12062 +[10:37:36] memory watch: killed=False tight=[] requests=12062 codes={'200': 12062} +[10:37:36] MV-sparkyfitness: ABORT — putting the FROM images back +[10:38:51] sparkyfitness: the seeded user could not sign in (http 401) +[10:38:51] ABORT: app came back in 31.2s; data present=False +{ + "harness_version": 4, + "edge": "MV-sparkyfitness", + "app": "sparkyfitness", + "note": "night 2026-09-23 within-a-major move: sparkyfitness-db=postgres:18-alpine", + "from": { + "sparkyfitness-db": "postgres:15-alpine", + "sparkyfitness-server": "codewithcj/sparkyfitness_server:v0.17.3", + "sparkyfitness-frontend": "codewithcj/sparkyfitness:v0.17.3" + }, + "to": { + "sparkyfitness-db": "postgres:18-alpine", + "sparkyfitness-server": "codewithcj/sparkyfitness_server:v0.17.3", + "sparkyfitness-frontend": "codewithcj/sparkyfitness:v0.17.3" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Ksparkyfitness-server | [2026-09-30T10:26:35.050Z] [INFO] Ensured schema_migrations table exists.", + "abort": "starts-data-gone", + "abort_detail": "the app started but the seeded data was gone", + "engine_state_after": { + "sparkyfitness-db": { + "image": "postgres:18-alpine", + "probe": "datadir major version", + "answer": "18", + "probe_rc": 0 + } + }, + "memory": { + "soak_s": 607.3, + "requested_s": 600, + "requests": 12062, + "codes": { + "200": 12062 + }, + "first_kill": null, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "peak": 10674176, + "peak_pct": 0.04, + "anon_peak_sampled": 5517312, + "anon_peak_pct": 0.021, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "peak": 154456064, + "peak_pct": 0.288, + "anon_peak_sampled": 9879552, + "anon_peak_pct": 0.018, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "peak": 376676352, + "peak_pct": 0.351, + "anon_peak_sampled": 336465920, + "anon_peak_pct": 0.313, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 31.2, + "measured_at": "2026-09-30T10:38:51Z", + "evidence": "evidence/MV-sparkyfitness", + "scratch_cleared": [], + "engine_conversion": { + "service": "sparkyfitness-db", + "engine": "postgres", + "from": 15, + "to": 18, + "dump_s": 0.69, + "dump_bytes": 377827, + "new_engine_ready_s": 2.2, + "load_s": 3.99, + "dropped": [ + "sparkyfitness_db" + ], + "skipped_create_role": [ + "CREATE ROLE sparky;" + ], + "result": "converted", + "check_equal": true, + "pg_version": "18", + "tables": 94, + "convert_s": 13.3 + }, + "files_changed": [], + "total_s": 836.4 +} diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/abort-states.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/abort-states.json new file mode 100644 index 00000000..1f30e9d3 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/abort-states.json @@ -0,0 +1,20 @@ +{ + "sparkyfitness": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + }, + "sparkyfitness-db": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + }, + "sparkyfitness-server": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/compose-final.log b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/compose-final.log new file mode 100644 index 00000000..dfa06be0 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/compose-final.log @@ -0,0 +1,495 @@ +sparkyfitness-server | [dotenv@17.3.1] injecting env (0) from ../.env -- tip: ⚙️ suppress all logs with { quiet: true } +sparkyfitness-db | The files belonging to this database system will be owned by user "postgres". +sparkyfitness-db | This user must also own the server process. +sparkyfitness-db | +sparkyfitness-db | The database cluster will be initialized with locale "en_US.utf8". +sparkyfitness-db | The default database encoding has accordingly been set to "UTF8". +sparkyfitness-db | The default text search configuration will be set to "english". +sparkyfitness-db | +sparkyfitness-db | Data page checksums are disabled. +sparkyfitness | Starting SparkyFitness Frontend as root with environment variables: +sparkyfitness-db | +sparkyfitness | SPARKY_FITNESS_SERVER_HOST=sparkyfitness-server +sparkyfitness-server | [Secrets] Checking for secret files to load... +sparkyfitness-server | [Secrets] No secrets loaded from files. +sparkyfitness-server | [2026-09-30T10:37:49.570Z] [INFO] Environment variable pre-flight checks passed successfully. +sparkyfitness-server | Starting server... +sparkyfitness-server | [2026-09-30T10:37:57.865Z] [INFO] [withingsService] Withings data source configured to: withings +sparkyfitness-server | [2026-09-30T10:37:57.868Z] [INFO] [fitbitService] Fitbit data source configured to: fitbit +sparkyfitness-server | [2026-09-30T10:37:57.869Z] [INFO] [googleHealthService] Google Health data source: googlehealth +sparkyfitness-server | [2026-09-30T10:37:57.871Z] [INFO] [polarService] Polar data source configured to: polar +sparkyfitness-server | [2026-09-30T10:37:57.871Z] [INFO] [stravaService] Strava data source configured to: strava +sparkyfitness-server | [2026-09-30T10:37:57.872Z] [INFO] [hevyService] Hevy data source configured to: hevy +sparkyfitness-server | [2026-09-30T10:37:58.574Z] [INFO] UserProfileRoutes UPLOADS_DIR: /app/SparkyFitnessServer/uploads/avatars +sparkyfitness-server | DEBUG: SPARKY_FITNESS_FRONTEND_URL is: https://sparky.gate.invalid +sparkyfitness-server | [SECURITY] Private network CORS is ENABLED. Ensure this is only on self-hosted/private networks. +sparkyfitness-server | SparkyFitnessServer UPLOADS_BASE_DIR: /app/SparkyFitnessServer/uploads +sparkyfitness-server | [2026-09-30T10:37:58.696Z] [INFO] Ensured temporary upload directory exists: /app/SparkyFitnessServer/temp_uploads/ +sparkyfitness-server | [2026-09-30T10:37:58.718Z] [INFO] Creating role: "sparkyapp" +sparkyfitness-server | [2026-09-30T10:37:58.729Z] [INFO] Successfully created role: "sparkyapp" +sparkyfitness-server | [2026-09-30T10:37:58.749Z] [INFO] Ensured schema_migrations table exists. +sparkyfitness-server | [2026-09-30T10:37:58.750Z] [INFO] Applied migrations: [] +sparkyfitness-db | fixing permissions on existing directory /var/lib/postgresql/data/pgdata ... ok +sparkyfitness-server | [2026-09-30T10:37:58.752Z] [INFO] Applying migration: 20250703170640_InitialDB.sql +sparkyfitness-db | creating subdirectories ... ok +sparkyfitness-server | [2026-09-30T10:37:58.950Z] [INFO] Successfully applied migration: 20250703170640_InitialDB.sql +sparkyfitness-db | selecting dynamic shared memory implementation ... posix +sparkyfitness-server | [2026-09-30T10:37:58.950Z] [INFO] Applying migration: 20250710062500_create_goal_presets_table.sql +sparkyfitness-db | selecting default max_connections ... 100 +sparkyfitness | SPARKY_FITNESS_SERVER_PORT=3010 +sparkyfitness-db | selecting default shared_buffers ... 128MB +sparkyfitness-server | [2026-09-30T10:37:58.990Z] [INFO] Successfully applied migration: 20250710062500_create_goal_presets_table.sql +sparkyfitness | NGINX_RATE_LIMIT=5r/s +sparkyfitness-server | [2026-09-30T10:37:58.990Z] [INFO] Applying migration: 20250711173824_meal_features.sql +sparkyfitness | NGINX_LISTEN_PORT=80 +sparkyfitness | NGINX_ACCESS_LOG=/var/log/nginx/access.log +sparkyfitness | NGINX_ERROR_LOG=/var/log/nginx/error.log +sparkyfitness | NGINX_DUMP_CONFIG=false +sparkyfitness | SPARKY_FITNESS_FRONTEND_URL=https://sparky.gate.invalid +sparkyfitness | Generating nginx configuration from template... +sparkyfitness | Testing nginx configuration substitution... +sparkyfitness | Validating nginx configuration syntax... +sparkyfitness | nginx: the configuration file /etc/nginx/nginx.conf syntax is ok +sparkyfitness-db | selecting default time zone ... Europe/Budapest +sparkyfitness-db | creating configuration files ... ok +sparkyfitness-db | running bootstrap script ... ok +sparkyfitness | nginx: configuration file /etc/nginx/nginx.conf test is successful +sparkyfitness | Configuration validated successfully. Starting nginx... +sparkyfitness | Backend will be proxied to: sparkyfitness-server:3010 +sparkyfitness | 2026/09/30 12:38:19 [notice] 1#1: using the "epoll" event method +sparkyfitness | 2026/09/30 12:38:19 [notice] 1#1: nginx/1.29.3 +sparkyfitness | 2026/09/30 12:38:19 [notice] 1#1: built by gcc 14.2.0 (Alpine 14.2.0) +sparkyfitness | 2026/09/30 12:38:19 [notice] 1#1: OS: Linux 7.0.2-6-pve +sparkyfitness | 2026/09/30 12:38:19 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 524288:524288 +sparkyfitness | 2026/09/30 12:38:19 [notice] 1#1: start worker processes +sparkyfitness | 2026/09/30 12:38:19 [notice] 1#1: start worker process 12 +sparkyfitness | 2026/09/30 12:38:19 [notice] 1#1: start worker process 13 +sparkyfitness | 2026/09/30 12:38:19 [notice] 1#1: start worker process 14 +sparkyfitness | 2026/09/30 12:38:19 [notice] 1#1: start worker process 15 +sparkyfitness | 2026/09/30 12:38:19 [notice] 1#1: start worker process 16 +sparkyfitness-db | sh: locale: not found +sparkyfitness-db | 2026-09-30 12:37:38.415 CEST [37] WARNING: no usable system locales were found +sparkyfitness-db | performing post-bootstrap initialization ... ok +sparkyfitness-db | initdb: warning: enabling "trust" authentication for local connections +sparkyfitness | 2026/09/30 12:38:19 [notice] 1#1: start worker process 17 +sparkyfitness | 127.0.0.1 - - [30/Sep/2026:12:38:49 +0200] "GET / HTTP/1.1" 200 2666 "-" "Wget" +sparkyfitness | 172.18.0.1 - - [30/Sep/2026:12:38:50 +0200] "GET / HTTP/1.1" 200 2666 "-" "curl/8.14.1" +sparkyfitness | 172.18.0.1 - - [30/Sep/2026:12:38:50 +0200] "POST /api/auth/sign-in/email HTTP/1.1" 401 85 "-" "curl/8.14.1" +sparkyfitness | 172.18.0.1 - - [30/Sep/2026:12:38:51 +0200] "POST /api/auth/sign-in/email HTTP/1.1" 401 85 "-" "curl/8.14.1" +sparkyfitness-server | [2026-09-30T10:37:59.078Z] [INFO] Successfully applied migration: 20250711173824_meal_features.sql +sparkyfitness-server | [2026-09-30T10:37:59.078Z] [INFO] Applying migration: 20250712163617_refactor_data_providers_and_add_exercise_source_id.sql +sparkyfitness-server | [2026-09-30T10:37:59.086Z] [INFO] Successfully applied migration: 20250712163617_refactor_data_providers_and_add_exercise_source_id.sql +sparkyfitness-db | initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. +sparkyfitness-db | syncing data to disk ... ok +sparkyfitness-db | +sparkyfitness-db | +sparkyfitness-db | Success. You can now start the database server using: +sparkyfitness-db | +sparkyfitness-db | pg_ctl -D /var/lib/postgresql/data/pgdata -l logfile start +sparkyfitness-db | +sparkyfitness-db | waiting for server to start....2026-09-30 12:37:39.184 CEST [43] LOG: starting PostgreSQL 15.19 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit +sparkyfitness-db | 2026-09-30 12:37:39.187 CEST [43] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" +sparkyfitness-db | 2026-09-30 12:37:39.202 CEST [46] LOG: database system was shut down at 2026-09-30 12:37:38 CEST +sparkyfitness-server | [2026-09-30T10:37:59.086Z] [INFO] Applying migration: 20250713125323_create_oidc_settings_and_update_users_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.111Z] [INFO] Successfully applied migration: 20250713125323_create_oidc_settings_and_update_users_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.111Z] [INFO] Applying migration: 20250713135900_add_role_to_users_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.117Z] [INFO] Successfully applied migration: 20250713135900_add_role_to_users_table.sql +sparkyfitness-db | 2026-09-30 12:37:39.211 CEST [43] LOG: database system is ready to accept connections +sparkyfitness-db | done +sparkyfitness-db | server started +sparkyfitness-db | CREATE DATABASE +sparkyfitness-db | +sparkyfitness-db | +sparkyfitness-db | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/* +sparkyfitness-db | +sparkyfitness-server | [2026-09-30T10:37:59.117Z] [INFO] Applying migration: 20250713142300_add_oidc_config_fields.sql +sparkyfitness-server | [2026-09-30T10:37:59.124Z] [INFO] Successfully applied migration: 20250713142300_add_oidc_config_fields.sql +sparkyfitness-server | [2026-09-30T10:37:59.124Z] [INFO] Applying migration: 20250714000000_create_session_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.142Z] [INFO] Successfully applied migration: 20250714000000_create_session_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.142Z] [INFO] Applying migration: 20250714175824_add_api_key_tag_to_ai_service_settings.sql +sparkyfitness-db | waiting for server to shut down...2026-09-30 12:37:39.361 CEST [43] LOG: received fast shutdown request +sparkyfitness-db | .2026-09-30 12:37:39.364 CEST [43] LOG: aborting any active transactions +sparkyfitness-db | 2026-09-30 12:37:39.368 CEST [43] LOG: background worker "logical replication launcher" (PID 49) exited with exit code 1 +sparkyfitness-db | 2026-09-30 12:37:39.368 CEST [44] LOG: shutting down +sparkyfitness-db | 2026-09-30 12:37:39.370 CEST [44] LOG: checkpoint starting: shutdown immediate +sparkyfitness-db | 2026-09-30 12:37:39.452 CEST [44] LOG: checkpoint complete: wrote 922 buffers (5.6%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.024 s, sync=0.047 s, total=0.085 s; sync files=301, longest=0.017 s, average=0.001 s; distance=4249 kB, estimate=4249 kB +sparkyfitness-db | 2026-09-30 12:37:39.469 CEST [43] LOG: database system is shut down +sparkyfitness-db | done +sparkyfitness-db | server stopped +sparkyfitness-db | +sparkyfitness-db | PostgreSQL init process complete; ready for start up. +sparkyfitness-db | +sparkyfitness-db | 2026-09-30 12:37:39.593 CEST [1] LOG: starting PostgreSQL 15.19 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit +sparkyfitness-db | 2026-09-30 12:37:39.594 CEST [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 +sparkyfitness-db | 2026-09-30 12:37:39.594 CEST [1] LOG: listening on IPv6 address "::", port 5432 +sparkyfitness-db | 2026-09-30 12:37:39.599 CEST [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" +sparkyfitness-db | 2026-09-30 12:37:39.607 CEST [59] LOG: database system was shut down at 2026-09-30 12:37:39 CEST +sparkyfitness-db | 2026-09-30 12:37:39.616 CEST [1] LOG: database system is ready to accept connections +sparkyfitness-server | [2026-09-30T10:37:59.147Z] [INFO] Successfully applied migration: 20250714175824_add_api_key_tag_to_ai_service_settings.sql +sparkyfitness-server | [2026-09-30T10:37:59.147Z] [INFO] Applying migration: 20250717190700_add_cascading_deletes.sql +sparkyfitness-server | [2026-09-30T10:37:59.179Z] [INFO] Successfully applied migration: 20250717190700_add_cascading_deletes.sql +sparkyfitness-server | [2026-09-30T10:37:59.179Z] [INFO] Applying migration: 20250717233929_add_is_quick_food_to_foods.sql +sparkyfitness-server | [2026-09-30T10:37:59.184Z] [INFO] Successfully applied migration: 20250717233929_add_is_quick_food_to_foods.sql +sparkyfitness-server | [2026-09-30T10:37:59.184Z] [INFO] Applying migration: 20250718190226_add_food_display_limit_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:37:59.189Z] [INFO] Successfully applied migration: 20250718190226_add_food_display_limit_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:37:59.189Z] [INFO] Applying migration: 20250719131500_add_meal_percentages.sql +sparkyfitness-server | [2026-09-30T10:37:59.198Z] [INFO] Successfully applied migration: 20250719131500_add_meal_percentages.sql +sparkyfitness-server | [2026-09-30T10:37:59.198Z] [INFO] Applying migration: 20250719215400_add_login_management_to_oidc_settings.sql +sparkyfitness-server | [2026-09-30T10:37:59.203Z] [INFO] Successfully applied migration: 20250719215400_add_login_management_to_oidc_settings.sql +sparkyfitness-server | [2026-09-30T10:37:59.203Z] [INFO] Applying migration: 20250720010000_create_user_nutrient_display_preferences.sql +sparkyfitness-server | [2026-09-30T10:37:59.223Z] [INFO] Successfully applied migration: 20250720010000_create_user_nutrient_display_preferences.sql +sparkyfitness-server | [2026-09-30T10:37:59.223Z] [INFO] Applying migration: 20250720201800_rename_food_display_limit_to_item_display_limit.sql +sparkyfitness-server | [2026-09-30T10:37:59.228Z] [INFO] Successfully applied migration: 20250720201800_rename_food_display_limit_to_item_display_limit.sql +sparkyfitness-server | [2026-09-30T10:37:59.228Z] [INFO] Applying migration: 20250720220000_add_water_tracking_features.sql +sparkyfitness-server | [2026-09-30T10:37:59.243Z] [INFO] Successfully applied migration: 20250720220000_add_water_tracking_features.sql +sparkyfitness-server | [2026-09-30T10:37:59.243Z] [INFO] Applying migration: 20250720233836_alter_water_goal_ml_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:37:59.269Z] [INFO] Successfully applied migration: 20250720233836_alter_water_goal_ml_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:37:59.269Z] [INFO] Applying migration: 20250721000000_add_servings_per_container_to_water_containers.sql +sparkyfitness-server | [2026-09-30T10:37:59.273Z] [INFO] Successfully applied migration: 20250721000000_add_servings_per_container_to_water_containers.sql +sparkyfitness-server | [2026-09-30T10:37:59.273Z] [INFO] Applying migration: 20250721000000_alter_water_container_volume_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:37:59.284Z] [INFO] Successfully applied migration: 20250721000000_alter_water_container_volume_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:37:59.284Z] [INFO] Applying migration: 20250721014900_alter_water_ml_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:37:59.290Z] [INFO] Successfully applied migration: 20250721014900_alter_water_ml_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:37:59.290Z] [INFO] Applying migration: 20250819062400_add_mealie_provider_type.sql +sparkyfitness-server | [2026-09-30T10:37:59.294Z] [INFO] Successfully applied migration: 20250819062400_add_mealie_provider_type.sql +sparkyfitness-server | [2026-09-30T10:37:59.294Z] [INFO] Applying migration: 20250819083500_add_base_url_to_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:37:59.298Z] [INFO] Successfully applied migration: 20250819083500_add_base_url_to_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:37:59.299Z] [INFO] Applying migration: 202508201215_add_garmin_integration_schema.sql +sparkyfitness-server | [2026-09-30T10:37:59.304Z] [INFO] Successfully applied migration: 202508201215_add_garmin_integration_schema.sql +sparkyfitness-server | [2026-09-30T10:37:59.304Z] [INFO] Applying migration: 20250821090000_update_external_data_providers_provider_type_check.sql +sparkyfitness-server | [2026-09-30T10:37:59.309Z] [INFO] Successfully applied migration: 20250821090000_update_external_data_providers_provider_type_check.sql +sparkyfitness-server | [2026-09-30T10:37:59.309Z] [INFO] Applying migration: 20250821091500_add_garth_token_dump_to_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:37:59.313Z] [INFO] Successfully applied migration: 20250821091500_add_garth_token_dump_to_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:37:59.313Z] [INFO] Applying migration: 20250821102000_remove_redundant_token_fields_from_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:37:59.323Z] [INFO] Successfully applied migration: 20250821102000_remove_redundant_token_fields_from_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:37:59.323Z] [INFO] Applying migration: 20250831063900_create_mood_entries_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.341Z] [INFO] Successfully applied migration: 20250831063900_create_mood_entries_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.341Z] [INFO] Applying migration: 20250927180257_alter_exercises_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.355Z] [INFO] Successfully applied migration: 20250927180257_alter_exercises_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.355Z] [INFO] Applying migration: 20250927212000_add_free_exercise_db_to_provider_type_check.sql +sparkyfitness-server | [2026-09-30T10:37:59.360Z] [INFO] Successfully applied migration: 20250927212000_add_free_exercise_db_to_provider_type_check.sql +sparkyfitness-server | [2026-09-30T10:37:59.360Z] [INFO] Applying migration: 20250930002100_add_sets_reps_weight_to_exercise_entries.sql +sparkyfitness-server | [2026-09-30T10:37:59.364Z] [INFO] Successfully applied migration: 20250930002100_add_sets_reps_weight_to_exercise_entries.sql +sparkyfitness-server | [2026-09-30T10:37:59.364Z] [INFO] Applying migration: 20251001232600_add_gender_to_users_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.369Z] [INFO] Successfully applied migration: 20251001232600_add_gender_to_users_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.369Z] [INFO] Applying migration: 20251002182306_create_backup_settings_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.391Z] [INFO] Successfully applied migration: 20251002182306_create_backup_settings_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.392Z] [INFO] Applying migration: 20251002224500_add_password_reset_to_users_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.396Z] [INFO] Successfully applied migration: 20251002224500_add_password_reset_to_users_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.396Z] [INFO] Applying migration: 20251006021609_add_glycemic_index_to_foods_and_food_variants.sql +sparkyfitness-server | [2026-09-30T10:37:59.401Z] [INFO] Successfully applied migration: 20251006021609_add_glycemic_index_to_foods_and_food_variants.sql +sparkyfitness-server | [2026-09-30T10:37:59.401Z] [INFO] Applying migration: 20251006220500_create_admin_activity_logs_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.420Z] [INFO] Successfully applied migration: 20251006220500_create_admin_activity_logs_table.sql +sparkyfitness-server | [2026-09-30T10:37:59.420Z] [INFO] Applying migration: 20251008224256_add_workout_features.sql +sparkyfitness-server | [2026-09-30T10:37:59.491Z] [INFO] Successfully applied migration: 20251008224256_add_workout_features.sql +sparkyfitness-server | [2026-09-30T10:37:59.491Z] [INFO] Applying migration: 20251012225400_add_primary_keys_to_workout_tables.sql +sparkyfitness-server | [2026-09-30T10:37:59.500Z] [INFO] Successfully applied migration: 20251012225400_add_primary_keys_to_workout_tables.sql +sparkyfitness-server | [2026-09-30T10:37:59.500Z] [INFO] Applying migration: 20251012225500_add_multiple_sets_to_presets.sql +sparkyfitness-server | [2026-09-30T10:37:59.526Z] [INFO] Successfully applied migration: 20251012225500_add_multiple_sets_to_presets.sql +sparkyfitness-server | [2026-09-30T10:37:59.526Z] [INFO] Applying migration: 20251012225900_add_multiple_sets_to_plans.sql +sparkyfitness-server | [2026-09-30T10:37:59.551Z] [INFO] Successfully applied migration: 20251012225900_add_multiple_sets_to_plans.sql +sparkyfitness-server | [2026-09-30T10:37:59.551Z] [INFO] Applying migration: 20251012230000_add_multiple_sets_to_exercise_entries.sql +sparkyfitness-server | [2026-09-30T10:37:59.576Z] [INFO] Successfully applied migration: 20251012230000_add_multiple_sets_to_exercise_entries.sql +sparkyfitness-server | [2026-09-30T10:37:59.577Z] [INFO] Applying migration: 20251015223200_convert_weights_to_kg_and_set_default.sql +sparkyfitness-server | [2026-09-30T10:37:59.584Z] [INFO] Successfully applied migration: 20251015223200_convert_weights_to_kg_and_set_default.sql +sparkyfitness-server | [2026-09-30T10:37:59.584Z] [INFO] Applying migration: 202510170132_add_text_measurements.sql +sparkyfitness-server | [2026-09-30T10:37:59.607Z] [INFO] Successfully applied migration: 202510170132_add_text_measurements.sql +sparkyfitness-server | [2026-09-30T10:37:59.607Z] [INFO] Applying migration: 20251017200900_add_multiple_oidc_providers.sql +sparkyfitness-server | [2026-09-30T10:37:59.659Z] [INFO] Successfully applied migration: 20251017200900_add_multiple_oidc_providers.sql +sparkyfitness-server | [2026-09-30T10:37:59.659Z] [INFO] Applying migration: 20251017204200_create_global_settings.sql +sparkyfitness-server | [2026-09-30T10:37:59.669Z] [INFO] Successfully applied migration: 20251017204200_create_global_settings.sql +sparkyfitness-server | [2026-09-30T10:37:59.669Z] [INFO] Applying migration: 20251018001151_add_bmr_and_bodyfat_preferences.sql +sparkyfitness-server | [2026-09-30T10:37:59.676Z] [INFO] Successfully applied migration: 20251018001151_add_bmr_and_bodyfat_preferences.sql +sparkyfitness-server | [2026-09-30T10:37:59.676Z] [INFO] Applying migration: 20251018223700_add_signing_alg_to_oidc_providers.sql +sparkyfitness-server | [2026-09-30T10:37:59.682Z] [INFO] Successfully applied migration: 20251018223700_add_signing_alg_to_oidc_providers.sql +sparkyfitness-server | [2026-09-30T10:37:59.682Z] [INFO] Applying migration: 20251019013200_merged_schema_and_data.sql +sparkyfitness-server | [2026-09-30T10:37:59.734Z] [INFO] Successfully applied migration: 20251019013200_merged_schema_and_data.sql +sparkyfitness-server | [2026-09-30T10:37:59.734Z] [INFO] Applying migration: 20251019013300_merged_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:37:59.775Z] [INFO] Successfully applied migration: 20251019013300_merged_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:37:59.776Z] [INFO] Applying migration: 20251019154515_update_rls_policies_for_shared_items.sql +sparkyfitness-server | [2026-09-30T10:37:59.784Z] [INFO] Successfully applied migration: 20251019154515_update_rls_policies_for_shared_items.sql +sparkyfitness-server | [2026-09-30T10:37:59.784Z] [INFO] Applying migration: 20251019203500_fix_rls_permissions_for_public_foods.sql +sparkyfitness-server | [2026-09-30T10:37:59.790Z] [INFO] Successfully applied migration: 20251019203500_fix_rls_permissions_for_public_foods.sql +sparkyfitness-server | [2026-09-30T10:37:59.790Z] [INFO] Applying migration: 20251019204000_correct_variant_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.795Z] [INFO] Successfully applied migration: 20251019204000_correct_variant_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.795Z] [INFO] Applying migration: 20251019212500_update_measurement_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:37:59.804Z] [INFO] Successfully applied migration: 20251019212500_update_measurement_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:37:59.804Z] [INFO] Applying migration: 20251019222100_add_audit_columns_to_measurements.sql +sparkyfitness-server | [2026-09-30T10:37:59.837Z] [INFO] Successfully applied migration: 20251019222100_add_audit_columns_to_measurements.sql +sparkyfitness-server | [2026-09-30T10:37:59.837Z] [INFO] Applying migration: 20251020001000_fix_family_access_insert_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.841Z] [INFO] Successfully applied migration: 20251020001000_fix_family_access_insert_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.841Z] [INFO] Applying migration: 20251020022000_set_default_shared_with_public.sql +sparkyfitness-server | [2026-09-30T10:37:59.846Z] [INFO] Successfully applied migration: 20251020022000_set_default_shared_with_public.sql +sparkyfitness-server | [2026-09-30T10:37:59.846Z] [INFO] Applying migration: 20251020022200_update_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:37:59.852Z] [INFO] Successfully applied migration: 20251020022200_update_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:37:59.852Z] [INFO] Applying migration: 20251020022500_fix_food_select_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.857Z] [INFO] Successfully applied migration: 20251020022500_fix_food_select_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.857Z] [INFO] Applying migration: 20251020030000_simplify_food_select_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.861Z] [INFO] Successfully applied migration: 20251020030000_simplify_food_select_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.861Z] [INFO] Applying migration: 20251020031000_update_food_select_policy_with_sharing.sql +sparkyfitness-server | [2026-09-30T10:37:59.866Z] [INFO] Successfully applied migration: 20251020031000_update_food_select_policy_with_sharing.sql +sparkyfitness-server | [2026-09-30T10:37:59.867Z] [INFO] Applying migration: 20251020032200_add_all_owner_centric_policies.sql +sparkyfitness-server | [2026-09-30T10:37:59.890Z] [INFO] Successfully applied migration: 20251020032200_add_all_owner_centric_policies.sql +sparkyfitness-server | [2026-09-30T10:37:59.890Z] [INFO] Applying migration: 20251020033400_add_food_variants_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.897Z] [INFO] Successfully applied migration: 20251020033400_add_food_variants_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.897Z] [INFO] Applying migration: 20251020033700_fix_food_variants_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.905Z] [INFO] Successfully applied migration: 20251020033700_fix_food_variants_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.905Z] [INFO] Applying migration: 20251020230839_fix_family_access_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:37:59.914Z] [INFO] Successfully applied migration: 20251020230839_fix_family_access_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:37:59.914Z] [INFO] Applying migration: 20251021025423_restrict_family_access_select_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.921Z] [INFO] Successfully applied migration: 20251021025423_restrict_family_access_select_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.921Z] [INFO] Applying migration: 20251021034700_add_public_sharing_to_external_providers.sql +sparkyfitness-server | [2026-09-30T10:37:59.926Z] [INFO] Successfully applied migration: 20251021034700_add_public_sharing_to_external_providers.sql +sparkyfitness-server | [2026-09-30T10:37:59.926Z] [INFO] Applying migration: 20251022201000_fix_exercise_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.931Z] [INFO] Successfully applied migration: 20251022201000_fix_exercise_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.931Z] [INFO] Applying migration: 20251022203000_snapshot_exercise_details_in_entries.sql +sparkyfitness-server | [2026-09-30T10:37:59.941Z] [INFO] Successfully applied migration: 20251022203000_snapshot_exercise_details_in_entries.sql +sparkyfitness-server | [2026-09-30T10:37:59.941Z] [INFO] Applying migration: 20251023120500_update_external_providers_select_policy_for_public.sql +sparkyfitness-server | [2026-09-30T10:37:59.951Z] [INFO] Successfully applied migration: 20251023120500_update_external_providers_select_policy_for_public.sql +sparkyfitness-server | [2026-09-30T10:37:59.952Z] [INFO] Applying migration: 20251023221000_update_meals_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.959Z] [INFO] Successfully applied migration: 20251023221000_update_meals_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.959Z] [INFO] Applying migration: 20251023221500_update_meal_plan_template_assignments_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.970Z] [INFO] Successfully applied migration: 20251023221500_update_meal_plan_template_assignments_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:37:59.970Z] [INFO] Applying migration: 20251023221501_add_meal_id_to_food_entries.sql +sparkyfitness-server | [2026-09-30T10:37:59.987Z] [INFO] Successfully applied migration: 20251023221501_add_meal_id_to_food_entries.sql +sparkyfitness-server | [2026-09-30T10:37:59.987Z] [INFO] Applying migration: 20251024230330_add_withings_fields_to_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:37:59.996Z] [INFO] Successfully applied migration: 20251024230330_add_withings_fields_to_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:37:59.996Z] [INFO] Applying migration: 20251025210900_add_source_to_custom_measurements.sql +sparkyfitness-server | [2026-09-30T10:38:00.006Z] [INFO] Successfully applied migration: 20251025210900_add_source_to_custom_measurements.sql +sparkyfitness-server | [2026-09-30T10:38:00.006Z] [INFO] Applying migration: 20251026125900_add_distance_and_hr_to_exercise_entries_activity_details.sql +sparkyfitness-server | [2026-09-30T10:38:00.031Z] [INFO] Successfully applied migration: 20251026125900_add_distance_and_hr_to_exercise_entries_activity_details.sql +sparkyfitness-server | [2026-09-30T10:38:00.032Z] [INFO] Applying migration: 202510310132_add_language_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:38:00.040Z] [INFO] Successfully applied migration: 202510310132_add_language_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:38:00.040Z] [INFO] Applying migration: 20251101151100_create_sleep_entries_table.sql +sparkyfitness-server | [2026-09-30T10:38:00.084Z] [INFO] Successfully applied migration: 20251101151100_create_sleep_entries_table.sql +sparkyfitness-server | [2026-09-30T10:38:00.084Z] [INFO] Applying migration: 20251103000000_add_onboarding_schema.sql +sparkyfitness-server | [2026-09-30T10:38:00.125Z] [INFO] Successfully applied migration: 20251103000000_add_onboarding_schema.sql +sparkyfitness-server | [2026-09-30T10:38:00.125Z] [INFO] Applying migration: 20251112000000_add_display_name_to_custom_categories.sql +sparkyfitness-server | [2026-09-30T10:38:00.131Z] [INFO] Successfully applied migration: 20251112000000_add_display_name_to_custom_categories.sql +sparkyfitness-server | [2026-09-30T10:38:00.131Z] [INFO] Applying migration: 20251114205134_create_exercise_preset_entries_table.sql +sparkyfitness-server | [2026-09-30T10:38:00.170Z] [INFO] Successfully applied migration: 20251114205134_create_exercise_preset_entries_table.sql +sparkyfitness-server | [2026-09-30T10:38:00.170Z] [INFO] Applying migration: 20251115003147_add_source_to_exercise_preset_entries.sql +sparkyfitness-server | [2026-09-30T10:38:00.176Z] [INFO] Successfully applied migration: 20251115003147_add_source_to_exercise_preset_entries.sql +sparkyfitness-server | [2026-09-30T10:38:00.176Z] [INFO] Applying migration: 20251115003301_add_exercise_preset_entry_id_to_activity_details.sql +sparkyfitness-server | [2026-09-30T10:38:00.183Z] [INFO] Successfully applied migration: 20251115003301_add_exercise_preset_entry_id_to_activity_details.sql +sparkyfitness-server | [2026-09-30T10:38:00.183Z] [INFO] Applying migration: 20251115004027_alter_exercise_entry_id_nullable_in_activity_details.sql +sparkyfitness-server | [2026-09-30T10:38:00.188Z] [INFO] Successfully applied migration: 20251115004027_alter_exercise_entry_id_nullable_in_activity_details.sql +sparkyfitness-server | [2026-09-30T10:38:00.188Z] [INFO] Applying migration: 20251120011100_add_mfa_magic_link_columns.sql +sparkyfitness-server | [2026-09-30T10:38:00.204Z] [INFO] Successfully applied migration: 20251120011100_add_mfa_magic_link_columns.sql +sparkyfitness-server | [2026-09-30T10:38:00.204Z] [INFO] Applying migration: 20251121011500_add_email_mfa_columns_to_users.sql +sparkyfitness-server | [2026-09-30T10:38:00.210Z] [INFO] Successfully applied migration: 20251121011500_add_email_mfa_columns_to_users.sql +sparkyfitness-server | [2026-09-30T10:38:00.210Z] [INFO] Applying migration: 202511220110_add_default_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:38:00.224Z] [INFO] Successfully applied migration: 202511220110_add_default_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:38:00.224Z] [INFO] Applying migration: 202511232110_delete_raw_stress_data_categories.sql +sparkyfitness-server | [2026-09-30T10:38:00.229Z] [INFO] Successfully applied migration: 202511232110_delete_raw_stress_data_categories.sql +sparkyfitness-server | [2026-09-30T10:38:00.229Z] [INFO] Applying migration: 202511270109_add_calorie_goal_adjustment_mode_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:38:00.235Z] [INFO] Successfully applied migration: 202511270109_add_calorie_goal_adjustment_mode_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:38:00.235Z] [INFO] Applying migration: 20251127194107_create_food_entry_meals_and_link_food_entries.sql +sparkyfitness-server | [2026-09-30T10:38:00.274Z] [INFO] Successfully applied migration: 20251127194107_create_food_entry_meals_and_link_food_entries.sql +sparkyfitness-server | [2026-09-30T10:38:00.274Z] [INFO] Applying migration: 20251127194108_migrate_aggregated_food_entries_to_food_entry_meals.sql +sparkyfitness-server | [2026-09-30T10:38:00.283Z] [INFO] Successfully applied migration: 20251127194108_migrate_aggregated_food_entries_to_food_entry_meals.sql +sparkyfitness-server | [2026-09-30T10:38:00.283Z] [INFO] Applying migration: 20251128030115_add_tandoor_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:00.289Z] [INFO] Successfully applied migration: 20251128030115_add_tandoor_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:00.290Z] [INFO] Applying migration: 20251205000000_add_energy_unit_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:38:00.296Z] [INFO] Successfully applied migration: 20251205000000_add_energy_unit_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:38:00.296Z] [INFO] Applying migration: 20251206000000_add_nutrient_calculation_algorithms.sql +sparkyfitness-server | [2026-09-30T10:38:00.306Z] [INFO] Successfully applied migration: 20251206000000_add_nutrient_calculation_algorithms.sql +sparkyfitness-server | [2026-09-30T10:38:00.307Z] [INFO] Applying migration: 20251206000001_add_serving_size_to_meals.sql +sparkyfitness-server | [2026-09-30T10:38:00.316Z] [INFO] Successfully applied migration: 20251206000001_add_serving_size_to_meals.sql +sparkyfitness-server | [2026-09-30T10:38:00.316Z] [INFO] Applying migration: 20251207000001_add_default_meal_quantity.sql +sparkyfitness-server | [2026-09-30T10:38:00.321Z] [INFO] Successfully applied migration: 20251207000001_add_default_meal_quantity.sql +sparkyfitness-server | [2026-09-30T10:38:00.321Z] [INFO] Applying migration: 20251215005329_add_usda_to_provider_type_check.sql +sparkyfitness-server | [2026-09-30T10:38:00.327Z] [INFO] Successfully applied migration: 20251215005329_add_usda_to_provider_type_check.sql +sparkyfitness-server | [2026-09-30T10:38:00.328Z] [INFO] Applying migration: 20251221000000_create_fasting_logs.sql +sparkyfitness-server | [2026-09-30T10:38:00.346Z] [INFO] Successfully applied migration: 20251221000000_create_fasting_logs.sql +sparkyfitness-server | [2026-09-30T10:38:00.346Z] [INFO] Applying migration: 20251221010000_drop_mood_weight_from_fasting_logs.sql +sparkyfitness-server | [2026-09-30T10:38:00.355Z] [INFO] Successfully applied migration: 20251221010000_drop_mood_weight_from_fasting_logs.sql +sparkyfitness-server | [2026-09-30T10:38:00.355Z] [INFO] Applying migration: 20251226150700_add_mobile_health_data_features.sql +sparkyfitness-server | [2026-09-30T10:38:00.364Z] [INFO] Successfully applied migration: 20251226150700_add_mobile_health_data_features.sql +sparkyfitness-server | [2026-09-30T10:38:00.364Z] [INFO] Applying migration: 20251228000000_add_custom_nutrients_tables.sql +sparkyfitness-server | [2026-09-30T10:38:00.394Z] [INFO] Successfully applied migration: 20251228000000_add_custom_nutrients_tables.sql +sparkyfitness-server | [2026-09-30T10:38:00.394Z] [INFO] Applying migration: 20252317234000_add_is_quick_exercise_to_exercises.sql +sparkyfitness-server | [2026-09-30T10:38:00.405Z] [INFO] Successfully applied migration: 20252317234000_add_is_quick_exercise_to_exercises.sql +sparkyfitness-server | [2026-09-30T10:38:00.405Z] [INFO] Applying migration: 20260105000000_add_auto_scale_open_food_facts_imports.sql +sparkyfitness-server | [2026-09-30T10:38:00.411Z] [INFO] Successfully applied migration: 20260105000000_add_auto_scale_open_food_facts_imports.sql +sparkyfitness-server | [2026-09-30T10:38:00.411Z] [INFO] Applying migration: 20260108010449_add_cascading_delete_to_check_in_measurements.sql +sparkyfitness-server | [2026-09-30T10:38:00.422Z] [INFO] Successfully applied migration: 20260108010449_add_cascading_delete_to_check_in_measurements.sql +sparkyfitness-server | [2026-09-30T10:38:00.423Z] [INFO] Applying migration: 20260108011953_add_cascading_delete_to_food_entries.sql +sparkyfitness-server | [2026-09-30T10:38:00.433Z] [INFO] Successfully applied migration: 20260108011953_add_cascading_delete_to_food_entries.sql +sparkyfitness-server | [2026-09-30T10:38:00.433Z] [INFO] Applying migration: 20260108012051_add_comprehensive_cascading_deletes.sql +sparkyfitness-server | [2026-09-30T10:38:00.505Z] [INFO] Successfully applied migration: 20260108012051_add_comprehensive_cascading_deletes.sql +sparkyfitness-server | [2026-09-30T10:38:00.505Z] [INFO] Applying migration: 20260108223108_alter_water_goal_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:38:00.527Z] [INFO] Successfully applied migration: 20260108223108_alter_water_goal_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:38:00.528Z] [INFO] Applying migration: 20260111180656_custom_meal_feature.sql +sparkyfitness-server | [2026-09-30T10:38:00.587Z] [INFO] Successfully applied migration: 20260111180656_custom_meal_feature.sql +sparkyfitness-server | [2026-09-30T10:38:00.587Z] [INFO] Applying migration: 20260122201500_refactor_provider_type_to_lookup_table.sql +sparkyfitness-server | [2026-09-30T10:38:00.602Z] [INFO] Successfully applied migration: 20260122201500_refactor_provider_type_to_lookup_table.sql +sparkyfitness-server | [2026-09-30T10:38:00.602Z] [INFO] Applying migration: 20260123115500_add_privacy_flag_to_provider_types.sql +sparkyfitness-server | [2026-09-30T10:38:00.607Z] [INFO] Successfully applied migration: 20260123115500_add_privacy_flag_to_provider_types.sql +sparkyfitness-server | [2026-09-30T10:38:00.607Z] [INFO] Applying migration: 20260125000000_better_auth_migration.sql +sparkyfitness-server | [2026-09-30T10:38:00.909Z] [INFO] Successfully applied migration: 20260125000000_better_auth_migration.sql +sparkyfitness-server | [2026-09-30T10:38:00.909Z] [INFO] Applying migration: 20260127040000_family_access_audit_fix.sql +sparkyfitness-server | [2026-09-30T10:38:00.963Z] [INFO] Successfully applied migration: 20260127040000_family_access_audit_fix.sql +sparkyfitness-server | [2026-09-30T10:38:00.963Z] [INFO] Applying migration: 202601280001_add_show_hide_to_meals.sql +sparkyfitness-server | [2026-09-30T10:38:00.983Z] [INFO] Successfully applied migration: 202601280001_add_show_hide_to_meals.sql +sparkyfitness-server | [2026-09-30T10:38:00.983Z] [INFO] Applying migration: 20260201121400_add_api_key_table.sql +sparkyfitness-server | [2026-09-30T10:38:01.015Z] [INFO] Successfully applied migration: 20260201121400_add_api_key_table.sql +sparkyfitness-server | [2026-09-30T10:38:01.016Z] [INFO] Applying migration: 20260201184000_add_missing_api_key_columns.sql +sparkyfitness-server | [2026-09-30T10:38:01.026Z] [INFO] Successfully applied migration: 20260201184000_add_missing_api_key_columns.sql +sparkyfitness-server | [2026-09-30T10:38:01.026Z] [INFO] Applying migration: 20260202023713_add_oidc_config_to_sso_provider.sql +sparkyfitness-server | [2026-09-30T10:38:01.030Z] [INFO] Successfully applied migration: 20260202023713_add_oidc_config_to_sso_provider.sql +sparkyfitness-server | [2026-09-30T10:38:01.030Z] [INFO] Applying migration: 20260205200200_add_exercise_sorting.sql +sparkyfitness-server | [2026-09-30T10:38:01.050Z] [INFO] Successfully applied migration: 20260205200200_add_exercise_sorting.sql +sparkyfitness-server | [2026-09-30T10:38:01.050Z] [INFO] Applying migration: 20260206132000_ensure_first_user_is_admin.sql +sparkyfitness-server | [2026-09-30T10:38:01.055Z] [INFO] Successfully applied migration: 20260206132000_ensure_first_user_is_admin.sql +sparkyfitness-server | [2026-09-30T10:38:01.055Z] [INFO] Applying migration: 20260206215500_add_mfa_totp_enabled_column.sql +sparkyfitness-server | [2026-09-30T10:38:01.074Z] [INFO] Successfully applied migration: 20260206215500_add_mfa_totp_enabled_column.sql +sparkyfitness-server | [2026-09-30T10:38:01.074Z] [INFO] Applying migration: 20260207110000_mfa_triggers.sql +sparkyfitness-server | [2026-09-30T10:38:01.080Z] [INFO] Successfully applied migration: 20260207110000_mfa_triggers.sql +sparkyfitness-server | [2026-09-30T10:38:01.080Z] [INFO] Applying migration: 20260208120000_fix_api_key_rate_limit_defaults.sql +sparkyfitness-server | [2026-09-30T10:38:01.085Z] [INFO] Successfully applied migration: 20260208120000_fix_api_key_rate_limit_defaults.sql +sparkyfitness-server | [2026-09-30T10:38:01.085Z] [INFO] Applying migration: 20260208194543_fix_user_meal_visibilities_fkey.sql +sparkyfitness-server | [2026-09-30T10:38:01.092Z] [INFO] Successfully applied migration: 20260208194543_fix_user_meal_visibilities_fkey.sql +sparkyfitness-server | [2026-09-30T10:38:01.092Z] [INFO] Applying migration: 20260208_fix_user_creation_trigger.sql +sparkyfitness-server | [2026-09-30T10:38:01.097Z] [INFO] Successfully applied migration: 20260208_fix_user_creation_trigger.sql +sparkyfitness-server | [2026-09-30T10:38:01.097Z] [INFO] Applying migration: 20260214223000_add_polar_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:01.102Z] [INFO] Successfully applied migration: 20260214223000_add_polar_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:01.102Z] [INFO] Applying migration: 20260215144500_add_hevy_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:01.108Z] [INFO] Successfully applied migration: 20260215144500_add_hevy_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:01.108Z] [INFO] Applying migration: 20260216012235_add_global_ai_settings.sql +sparkyfitness-server | [2026-09-30T10:38:01.123Z] [INFO] Successfully applied migration: 20260216012235_add_global_ai_settings.sql +sparkyfitness-server | [2026-09-30T10:38:01.123Z] [INFO] Applying migration: 20260216020134_add_allow_user_ai_config.sql +sparkyfitness-server | [2026-09-30T10:38:01.128Z] [INFO] Successfully applied migration: 20260216020134_add_allow_user_ai_config.sql +sparkyfitness-server | [2026-09-30T10:38:01.128Z] [INFO] Applying migration: 20260216030000_rename_is_global_to_is_public.sql +sparkyfitness-server | [2026-09-30T10:38:01.146Z] [INFO] Successfully applied migration: 20260216030000_rename_is_global_to_is_public.sql +sparkyfitness-server | [2026-09-30T10:38:01.146Z] [INFO] Applying migration: 20260216140000_add_custom_nutrients_to_goals_and_presets.sql +sparkyfitness-server | [2026-09-30T10:38:01.153Z] [INFO] Successfully applied migration: 20260216140000_add_custom_nutrients_to_goals_and_presets.sql +sparkyfitness-server | [2026-09-30T10:38:01.153Z] [INFO] Applying migration: 20260216195500_prune_empty_custom_nutrients.sql +sparkyfitness-server | [2026-09-30T10:38:01.159Z] [INFO] Successfully applied migration: 20260216195500_prune_empty_custom_nutrients.sql +sparkyfitness-server | [2026-09-30T10:38:01.159Z] [INFO] Applying migration: 20260221210000_oidc_config_jsonb.sql +sparkyfitness-server | [2026-09-30T10:38:01.184Z] [INFO] Successfully applied migration: 20260221210000_oidc_config_jsonb.sql +sparkyfitness-server | [2026-09-30T10:38:01.185Z] [INFO] Applying migration: 20260222100000_add_strava_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:01.188Z] [INFO] Successfully applied migration: 20260222100000_add_strava_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:01.188Z] [INFO] Applying migration: 20260224000000_add_sleep_science.sql +sparkyfitness-server | [2026-09-30T10:38:01.256Z] [INFO] Successfully applied migration: 20260224000000_add_sleep_science.sql +sparkyfitness-server | [2026-09-30T10:38:01.256Z] [INFO] Applying migration: 20260224120000_add_show_in_quick_log_to_meal_visibilities.sql +sparkyfitness-server | [2026-09-30T10:38:01.262Z] [INFO] Successfully applied migration: 20260224120000_add_show_in_quick_log_to_meal_visibilities.sql +sparkyfitness-server | [2026-09-30T10:38:01.262Z] [INFO] Applying migration: 20260226000000_add_exercise_calorie_preferences.sql +sparkyfitness-server | [2026-09-30T10:38:01.270Z] [INFO] Successfully applied migration: 20260226000000_add_exercise_calorie_preferences.sql +sparkyfitness-server | [2026-09-30T10:38:01.270Z] [INFO] Applying migration: 20260228120000_fix_sleep_entry_date_to_wake_up_date.sql +sparkyfitness-server | [2026-09-30T10:38:01.273Z] [INFO] Successfully applied migration: 20260228120000_fix_sleep_entry_date_to_wake_up_date.sql +sparkyfitness-server | [2026-09-30T10:38:01.273Z] [INFO] Applying migration: 20260302000000_add_default_barcode_provider_id.sql +sparkyfitness-server | [2026-09-30T10:38:01.286Z] [INFO] Successfully applied migration: 20260302000000_add_default_barcode_provider_id.sql +sparkyfitness-server | [2026-09-30T10:38:01.286Z] [INFO] Applying migration: 20260302120000_normalize_barcodes.sql +sparkyfitness-server | [2026-09-30T10:38:01.289Z] [INFO] Successfully applied migration: 20260302120000_normalize_barcodes.sql +sparkyfitness-server | [2026-09-30T10:38:01.289Z] [INFO] Applying migration: 20260313100000_add_source_to_water_intake.sql +sparkyfitness-server | [2026-09-30T10:38:01.313Z] [INFO] Successfully applied migration: 20260313100000_add_source_to_water_intake.sql +sparkyfitness-server | [2026-09-30T10:38:01.314Z] [INFO] Applying migration: 20260314175000_add_image_to_user_table.sql +sparkyfitness-server | [2026-09-30T10:38:01.318Z] [INFO] Successfully applied migration: 20260314175000_add_image_to_user_table.sql +sparkyfitness-server | [2026-09-30T10:38:01.318Z] [INFO] Applying migration: 20260315192200_fix_oidc_config_keys.sql +sparkyfitness-server | [2026-09-30T10:38:01.321Z] [INFO] Successfully applied migration: 20260315192200_fix_oidc_config_keys.sql +sparkyfitness-server | [2026-09-30T10:38:01.322Z] [INFO] Applying migration: 20260315200000_better_auth_1_5_upgrade.sql +sparkyfitness-server | [2026-09-30T10:38:01.326Z] [INFO] Successfully applied migration: 20260315200000_better_auth_1_5_upgrade.sql +sparkyfitness-server | [2026-09-30T10:38:01.326Z] [INFO] Applying migration: 20260321000000_add_auto_scale_online_imports.sql +sparkyfitness-server | [2026-09-30T10:38:01.332Z] [INFO] Successfully applied migration: 20260321000000_add_auto_scale_online_imports.sql +sparkyfitness-server | [2026-09-30T10:38:01.332Z] [INFO] Applying migration: 20260322130000_mfa_better_auth_optimization.sql +sparkyfitness-server | [2026-09-30T10:38:01.339Z] [INFO] Successfully applied migration: 20260322130000_mfa_better_auth_optimization.sql +sparkyfitness-server | [2026-09-30T10:38:01.339Z] [INFO] Applying migration: 20260322141500_mfa_triggers_sync_fix.sql +sparkyfitness-server | [2026-09-30T10:38:01.345Z] [INFO] Successfully applied migration: 20260322141500_mfa_triggers_sync_fix.sql +sparkyfitness-server | [2026-09-30T10:38:01.345Z] [INFO] Applying migration: 20260322154230_add_first_day_of_week_to_preferences.sql +sparkyfitness-server | [2026-09-30T10:38:01.350Z] [INFO] Successfully applied migration: 20260322154230_add_first_day_of_week_to_preferences.sql +sparkyfitness-server | [2026-09-30T10:38:01.350Z] [INFO] Applying migration: 20260323122741_add_steps_column.sql +sparkyfitness-server | [2026-09-30T10:38:01.355Z] [INFO] Successfully applied migration: 20260323122741_add_steps_column.sql +sparkyfitness-server | [2026-09-30T10:38:01.355Z] [INFO] Applying migration: 20260328120000_add_timezone_check_constraint.sql +sparkyfitness-server | [2026-09-30T10:38:01.361Z] [INFO] Successfully applied migration: 20260328120000_add_timezone_check_constraint.sql +sparkyfitness-server | [2026-09-30T10:38:01.361Z] [INFO] Applying migration: 20260406120000_add_barcode_fallback_open_food_facts.sql +sparkyfitness-server | [2026-09-30T10:38:01.366Z] [INFO] Successfully applied migration: 20260406120000_add_barcode_fallback_open_food_facts.sql +sparkyfitness-server | [2026-09-30T10:38:01.366Z] [INFO] Applying migration: 20260420230132_scope_exercises_source_unique_to_user.sql +sparkyfitness-server | [2026-09-30T10:38:01.376Z] [INFO] Successfully applied migration: 20260420230132_scope_exercises_source_unique_to_user.sql +sparkyfitness-server | [2026-09-30T10:38:01.376Z] [INFO] Applying migration: 20260423120000_sleep_entry_stages_unique_natural_key.sql +sparkyfitness-server | [2026-09-30T10:38:01.387Z] [INFO] Successfully applied migration: 20260423120000_sleep_entry_stages_unique_natural_key.sql +sparkyfitness-server | [2026-09-30T10:38:01.387Z] [INFO] Applying migration: 20260426120000_provider_sort_order.sql +sparkyfitness-server | [2026-09-30T10:38:01.393Z] [INFO] Successfully applied migration: 20260426120000_provider_sort_order.sql +sparkyfitness-server | [2026-09-30T10:38:01.393Z] [INFO] Applying migration: 20260426120001_custom_meal_percentages.sql +sparkyfitness-server | [2026-09-30T10:38:01.400Z] [INFO] Successfully applied migration: 20260426120001_custom_meal_percentages.sql +sparkyfitness-server | [2026-09-30T10:38:01.400Z] [INFO] Applying migration: 20260509120000_add_water_intake_entries.sql +sparkyfitness-server | [2026-09-30T10:38:01.419Z] [INFO] Successfully applied migration: 20260509120000_add_water_intake_entries.sql +sparkyfitness-server | [2026-09-30T10:38:01.419Z] [INFO] Applying migration: 20260515120000_add_show_net_carbs_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:38:01.424Z] [INFO] Successfully applied migration: 20260515120000_add_show_net_carbs_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:38:01.424Z] [INFO] Applying migration: 20260515174155_serving_size_model.sql +sparkyfitness-server | [2026-09-30T10:38:01.431Z] [INFO] Successfully applied migration: 20260515174155_serving_size_model.sql +sparkyfitness-server | [2026-09-30T10:38:01.431Z] [INFO] Applying migration: 20260523120000_ai_assisted_conversions.sql +sparkyfitness-server | [2026-09-30T10:38:01.439Z] [INFO] Successfully applied migration: 20260523120000_ai_assisted_conversions.sql +sparkyfitness-server | [2026-09-30T10:38:01.439Z] [INFO] Applying migration: 20260527120000_add_allergen_tracking.sql +sparkyfitness-server | [2026-09-30T10:38:01.464Z] [INFO] Successfully applied migration: 20260527120000_add_allergen_tracking.sql +sparkyfitness-server | [2026-09-30T10:38:01.464Z] [INFO] Applying migration: 20260529140000_add_multimodal_support_to_chat_history.sql +sparkyfitness-server | [2026-09-30T10:38:01.468Z] [INFO] Successfully applied migration: 20260529140000_add_multimodal_support_to_chat_history.sql +sparkyfitness-server | [2026-09-30T10:38:01.468Z] [INFO] Applying migration: 20260531120000_add_nutrition_snapshot_to_meal_foods.sql +sparkyfitness-server | [2026-09-30T10:38:01.478Z] [INFO] Successfully applied migration: 20260531120000_add_nutrition_snapshot_to_meal_foods.sql +sparkyfitness-server | [2026-09-30T10:38:01.478Z] [INFO] Applying migration: 20260531120000_add_source_to_food_entries.sql +sparkyfitness-server | [2026-09-30T10:38:01.488Z] [INFO] Successfully applied migration: 20260531120000_add_source_to_food_entries.sql +sparkyfitness-server | [2026-09-30T10:38:01.488Z] [INFO] Applying migration: 20260604120000_add_checkin_mood_unique_indexes.sql +sparkyfitness-server | [2026-09-30T10:38:01.498Z] [INFO] Successfully applied migration: 20260604120000_add_checkin_mood_unique_indexes.sql +sparkyfitness-server | [2026-09-30T10:38:01.499Z] [INFO] Applying migration: 20260604120600_add_user_last_login_at.sql +sparkyfitness-server | [2026-09-30T10:38:01.504Z] [INFO] Successfully applied migration: 20260604120600_add_user_last_login_at.sql +sparkyfitness-server | [2026-09-30T10:38:01.504Z] [INFO] Applying migration: 20260606132000_add_yazio_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:01.508Z] [INFO] Successfully applied migration: 20260606132000_add_yazio_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:01.509Z] [INFO] Applying migration: 20260606164200_add_norish_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:01.512Z] [INFO] Successfully applied migration: 20260606164200_add_norish_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:01.512Z] [INFO] Applying migration: 20260607000000_add_googlehealth_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:01.516Z] [INFO] Successfully applied migration: 20260607000000_add_googlehealth_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:01.516Z] [INFO] Applying migration: 20260607114000_add_swissfood_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:01.521Z] [INFO] Successfully applied migration: 20260607114000_add_swissfood_provider_type.sql +sparkyfitness-server | [2026-09-30T10:38:01.522Z] [INFO] Applying migration: 20260610120000_add_garmin_nutrition_index.sql +sparkyfitness-server | [2026-09-30T10:38:01.533Z] [INFO] Successfully applied migration: 20260610120000_add_garmin_nutrition_index.sql +sparkyfitness-server | [2026-09-30T10:38:01.533Z] [INFO] Applying migration: 20260612120000_add_use_external_bmr_preference.sql +sparkyfitness-server | [2026-09-30T10:38:01.538Z] [INFO] Successfully applied migration: 20260612120000_add_use_external_bmr_preference.sql +sparkyfitness-server | [2026-09-30T10:38:01.538Z] [INFO] Applying migration: 20260612153000_add_goal_mode_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:38:01.544Z] [INFO] Successfully applied migration: 20260612153000_add_goal_mode_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:38:01.545Z] [INFO] Applying migration: 20260614000000_add_checkin_photos.sql +sparkyfitness-server | [2026-09-30T10:38:01.571Z] [INFO] Successfully applied migration: 20260614000000_add_checkin_photos.sql +sparkyfitness-server | [2026-09-30T10:38:01.571Z] [INFO] Applying migration: 20260618000000_remove_superuser_extensions.sql +sparkyfitness-server | [2026-09-30T10:38:01.587Z] [INFO] Successfully applied migration: 20260618000000_remove_superuser_extensions.sql +sparkyfitness-server | [2026-09-30T10:38:01.587Z] [INFO] Applying migration: 20260620143300_public_sharing_and_dynamic_provider_types.sql +sparkyfitness-server | [2026-09-30T10:38:01.613Z] [INFO] Successfully applied migration: 20260620143300_public_sharing_and_dynamic_provider_types.sql +sparkyfitness-server | [2026-09-30T10:38:01.613Z] [INFO] Applying migration: 20260621000000_create_user_dashboard_layouts.sql +sparkyfitness-server | [2026-09-30T10:38:01.631Z] [INFO] Successfully applied migration: 20260621000000_create_user_dashboard_layouts.sql +sparkyfitness-server | [2026-09-30T10:38:01.631Z] [INFO] Applying migration: 20260622120000_add_water_estimated_to_exercise_entries.sql +sparkyfitness-server | [2026-09-30T10:38:01.638Z] [INFO] Successfully applied migration: 20260622120000_add_water_estimated_to_exercise_entries.sql +sparkyfitness-server | [2026-09-30T10:38:01.638Z] [INFO] Applying migration: 20260623000000_add_measurement_decimal_places.sql +sparkyfitness-server | [2026-09-30T10:38:01.643Z] [INFO] Successfully applied migration: 20260623000000_add_measurement_decimal_places.sql +sparkyfitness-server | [2026-09-30T10:38:01.643Z] [INFO] Applying migration: 20260624000000_add_medication_glp1_schema.sql +sparkyfitness-server | [2026-09-30T10:38:01.901Z] [INFO] Successfully applied migration: 20260624000000_add_medication_glp1_schema.sql +sparkyfitness-server | [2026-09-30T10:38:01.901Z] [INFO] Applying migration: 20260625000000_add_chat_tool_profile_to_ai_service_settings.sql +sparkyfitness-server | [2026-09-30T10:38:01.906Z] [INFO] Successfully applied migration: 20260625000000_add_chat_tool_profile_to_ai_service_settings.sql +sparkyfitness-server | [2026-09-30T10:38:01.906Z] [INFO] Applying migration: 20260628000000_convert_exercise_durations_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:38:01.958Z] [INFO] Successfully applied migration: 20260628000000_convert_exercise_durations_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:38:01.958Z] [INFO] Applying migration: 20260628120000_add_vision_ai_service_pointers.sql +sparkyfitness-server | [2026-09-30T10:38:01.965Z] [INFO] Successfully applied migration: 20260628120000_add_vision_ai_service_pointers.sql +sparkyfitness-server | [2026-09-30T10:38:01.966Z] [INFO] Applying migration: 20260630000000_add_custom_nutrient_aliases.sql +sparkyfitness-server | [2026-09-30T10:38:01.970Z] [INFO] Successfully applied migration: 20260630000000_add_custom_nutrient_aliases.sql +sparkyfitness-server | [2026-09-30T10:38:01.970Z] [INFO] Applying migration: 20260630000000_add_onboarding_skipped.sql +sparkyfitness-server | [2026-09-30T10:38:01.978Z] [INFO] Successfully applied migration: 20260630000000_add_onboarding_skipped.sql +sparkyfitness-server | [2026-09-30T10:38:01.978Z] [INFO] Applying migration: 20260701000000_add_child_meal_to_meal_foods.sql +sparkyfitness-server | [2026-09-30T10:38:01.994Z] [INFO] Successfully applied migration: 20260701000000_add_child_meal_to_meal_foods.sql +sparkyfitness-server | [2026-09-30T10:38:01.994Z] [INFO] Applying migration: 20260702180000_add_cycle_tracking_schema.sql +sparkyfitness-server | [2026-09-30T10:38:02.272Z] [INFO] Successfully applied migration: 20260702180000_add_cycle_tracking_schema.sql +sparkyfitness-server | [2026-09-30T10:38:02.272Z] [INFO] Applying migration: 20260705000000_fix_googlehealth_sleep_date_anchor.sql +sparkyfitness-server | [2026-09-30T10:38:02.277Z] [INFO] Successfully applied migration: 20260705000000_fix_googlehealth_sleep_date_anchor.sql +sparkyfitness-server | [2026-09-30T10:38:02.289Z] [INFO] Ensuring permissions for role: "sparkyapp" +sparkyfitness-server | [2026-09-30T10:38:02.325Z] [INFO] Successfully ensured permissions for role: "sparkyapp" +sparkyfitness-server | [2026-09-30T10:38:02.326Z] [INFO] Permissions granted to application user. +sparkyfitness-server | [2026-09-30T10:38:02.327Z] [INFO] Applying all RLS policies from rls_policies.sql... +sparkyfitness-server | [2026-09-30T10:38:02.469Z] [INFO] Successfully applied all RLS policies. +sparkyfitness-server | [AUTH] Starting Better Auth mounting phase... +sparkyfitness-server | [AUTH] Better Auth handler successfully mounted. +sparkyfitness-server | [AUTH] Synced trusted SSO providers for auto-linking: [] +sparkyfitness-server | DEBUG: Server started and listening on port 3010 +sparkyfitness-server | [2026-09-30T10:38:02.535Z] [INFO] SparkyFitnessServer listening on port 3010 +sparkyfitness-server | View API documentation at: /api/api-docs/swagger +sparkyfitness-server | [2026-09-30T10:38:02.536Z] [INFO] No backup settings found, creating default entry. +sparkyfitness-server | [2026-09-30T10:38:02.540Z] [INFO] [CRON] Scheduled backups disabled — skipping schedule +sparkyfitness-server | [2026-09-30T10:38:18.808Z] [INFO] Incoming request: GET /api/health (Path: /api/health) +sparkyfitness-server | [2026-09-30T10:38:48.935Z] [INFO] Incoming request: GET /api/health (Path: /api/health) +sparkyfitness-server | 2026-09-30T10:38:50.917Z ERROR [Better Auth]: User not found { email: 'drilld17b38@gate.invalid' } +sparkyfitness-server | 2026-09-30T10:38:51.041Z ERROR [Better Auth]: User not found { email: 'drilld17b38@gate.invalid' } diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/convert-check-after.txt b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/convert-check-after.txt new file mode 100644 index 00000000..4de87768 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/convert-check-after.txt @@ -0,0 +1,99 @@ +db:postgres owner=sparky enc=UTF8 coll=en_US.utf8 +db:sparkyfitness_db owner=sparky enc=UTF8 coll=en_US.utf8 +ext:sparkyfitness_db:plpgsql +role:sparky super=true login=true pw=true +role:sparkyapp super=false login=true pw=true +rows:sparkyfitness_db:auth.users=0 +rows:sparkyfitness_db:public.account=1 +rows:sparkyfitness_db:public.admin_activity_logs=0 +rows:sparkyfitness_db:public.ai_service_settings=0 +rows:sparkyfitness_db:public.api_key=0 +rows:sparkyfitness_db:public.backup_settings=1 +rows:sparkyfitness_db:public.check_in_measurements=1 +rows:sparkyfitness_db:public.check_in_photos=0 +rows:sparkyfitness_db:public.custom_categories=0 +rows:sparkyfitness_db:public.custom_measurements=0 +rows:sparkyfitness_db:public.cycle_daily_entries=0 +rows:sparkyfitness_db:public.cycle_settings=0 +rows:sparkyfitness_db:public.cycle_test_entries=0 +rows:sparkyfitness_db:public.cycles=0 +rows:sparkyfitness_db:public.daily_sleep_need=0 +rows:sparkyfitness_db:public.day_classification_cache=0 +rows:sparkyfitness_db:public.exercise_entries=0 +rows:sparkyfitness_db:public.exercise_entry_activity_details=0 +rows:sparkyfitness_db:public.exercise_entry_sets=0 +rows:sparkyfitness_db:public.exercise_preset_entries=0 +rows:sparkyfitness_db:public.exercises=0 +rows:sparkyfitness_db:public.external_data_providers=4 +rows:sparkyfitness_db:public.external_provider_types=19 +rows:sparkyfitness_db:public.family_access=0 +rows:sparkyfitness_db:public.fasting_logs=0 +rows:sparkyfitness_db:public.food_entries=0 +rows:sparkyfitness_db:public.food_entry_meals=0 +rows:sparkyfitness_db:public.food_variants=0 +rows:sparkyfitness_db:public.foods=0 +rows:sparkyfitness_db:public.global_settings=1 +rows:sparkyfitness_db:public.goal_presets=0 +rows:sparkyfitness_db:public.health_appointments=0 +rows:sparkyfitness_db:public.injection_entries=0 +rows:sparkyfitness_db:public.meal_foods=0 +rows:sparkyfitness_db:public.meal_plan_template_assignments=0 +rows:sparkyfitness_db:public.meal_plan_templates=0 +rows:sparkyfitness_db:public.meal_plans=0 +rows:sparkyfitness_db:public.meal_types=4 +rows:sparkyfitness_db:public.meals=0 +rows:sparkyfitness_db:public.medication_entries=0 +rows:sparkyfitness_db:public.medication_pens=0 +rows:sparkyfitness_db:public.medication_route_types=7 +rows:sparkyfitness_db:public.medication_schedule_types=8 +rows:sparkyfitness_db:public.medication_schedules=0 +rows:sparkyfitness_db:public.medication_titration_steps=0 +rows:sparkyfitness_db:public.medication_types=11 +rows:sparkyfitness_db:public.medications=0 +rows:sparkyfitness_db:public.mood_entries=0 +rows:sparkyfitness_db:public.oidc_providers=0 +rows:sparkyfitness_db:public.onboarding_data=0 +rows:sparkyfitness_db:public.onboarding_status=1 +rows:sparkyfitness_db:public.passkey=0 +rows:sparkyfitness_db:public.pregnancies=0 +rows:sparkyfitness_db:public.pregnancy_checklist_state=0 +rows:sparkyfitness_db:public.pregnancy_contractions=0 +rows:sparkyfitness_db:public.pregnancy_kick_sessions=0 +rows:sparkyfitness_db:public.pregnancy_photos=0 +rows:sparkyfitness_db:public.profiles=1 +rows:sparkyfitness_db:public.session=3 +rows:sparkyfitness_db:public.sleep_entries=0 +rows:sparkyfitness_db:public.sleep_entry_stages=0 +rows:sparkyfitness_db:public.sleep_need_calculations=0 +rows:sparkyfitness_db:public.sparky_chat_history=0 +rows:sparkyfitness_db:public.sso_provider=0 +rows:sparkyfitness_db:public.symptom_entries=0 +rows:sparkyfitness_db:public.two_factor=0 +rows:sparkyfitness_db:public.user=1 +rows:sparkyfitness_db:public.user_allergen_preferences=0 +rows:sparkyfitness_db:public.user_custom_moods=0 +rows:sparkyfitness_db:public.user_custom_nutrients=0 +rows:sparkyfitness_db:public.user_custom_symptom_locations=0 +rows:sparkyfitness_db:public.user_custom_symptoms=0 +rows:sparkyfitness_db:public.user_cycle_display_preferences=0 +rows:sparkyfitness_db:public.user_dashboard_layouts=0 +rows:sparkyfitness_db:public.user_goals=1 +rows:sparkyfitness_db:public.user_ignored_updates=0 +rows:sparkyfitness_db:public.user_meal_visibilities=0 +rows:sparkyfitness_db:public.user_medication_display_preferences=0 +rows:sparkyfitness_db:public.user_mood_display_preferences=0 +rows:sparkyfitness_db:public.user_nutrient_display_preferences=12 +rows:sparkyfitness_db:public.user_oidc_links=0 +rows:sparkyfitness_db:public.user_preferences=1 +rows:sparkyfitness_db:public.user_water_containers=0 +rows:sparkyfitness_db:public.verification=0 +rows:sparkyfitness_db:public.water_intake=0 +rows:sparkyfitness_db:public.water_intake_entries=0 +rows:sparkyfitness_db:public.weekly_goal_plans=0 +rows:sparkyfitness_db:public.workout_plan_assignment_sets=0 +rows:sparkyfitness_db:public.workout_plan_template_assignments=0 +rows:sparkyfitness_db:public.workout_plan_templates=0 +rows:sparkyfitness_db:public.workout_preset_exercise_sets=0 +rows:sparkyfitness_db:public.workout_preset_exercises=0 +rows:sparkyfitness_db:public.workout_presets=0 +rows:sparkyfitness_db:system.schema_migrations=184 diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/convert-check-before.txt b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/convert-check-before.txt new file mode 100644 index 00000000..4de87768 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/convert-check-before.txt @@ -0,0 +1,99 @@ +db:postgres owner=sparky enc=UTF8 coll=en_US.utf8 +db:sparkyfitness_db owner=sparky enc=UTF8 coll=en_US.utf8 +ext:sparkyfitness_db:plpgsql +role:sparky super=true login=true pw=true +role:sparkyapp super=false login=true pw=true +rows:sparkyfitness_db:auth.users=0 +rows:sparkyfitness_db:public.account=1 +rows:sparkyfitness_db:public.admin_activity_logs=0 +rows:sparkyfitness_db:public.ai_service_settings=0 +rows:sparkyfitness_db:public.api_key=0 +rows:sparkyfitness_db:public.backup_settings=1 +rows:sparkyfitness_db:public.check_in_measurements=1 +rows:sparkyfitness_db:public.check_in_photos=0 +rows:sparkyfitness_db:public.custom_categories=0 +rows:sparkyfitness_db:public.custom_measurements=0 +rows:sparkyfitness_db:public.cycle_daily_entries=0 +rows:sparkyfitness_db:public.cycle_settings=0 +rows:sparkyfitness_db:public.cycle_test_entries=0 +rows:sparkyfitness_db:public.cycles=0 +rows:sparkyfitness_db:public.daily_sleep_need=0 +rows:sparkyfitness_db:public.day_classification_cache=0 +rows:sparkyfitness_db:public.exercise_entries=0 +rows:sparkyfitness_db:public.exercise_entry_activity_details=0 +rows:sparkyfitness_db:public.exercise_entry_sets=0 +rows:sparkyfitness_db:public.exercise_preset_entries=0 +rows:sparkyfitness_db:public.exercises=0 +rows:sparkyfitness_db:public.external_data_providers=4 +rows:sparkyfitness_db:public.external_provider_types=19 +rows:sparkyfitness_db:public.family_access=0 +rows:sparkyfitness_db:public.fasting_logs=0 +rows:sparkyfitness_db:public.food_entries=0 +rows:sparkyfitness_db:public.food_entry_meals=0 +rows:sparkyfitness_db:public.food_variants=0 +rows:sparkyfitness_db:public.foods=0 +rows:sparkyfitness_db:public.global_settings=1 +rows:sparkyfitness_db:public.goal_presets=0 +rows:sparkyfitness_db:public.health_appointments=0 +rows:sparkyfitness_db:public.injection_entries=0 +rows:sparkyfitness_db:public.meal_foods=0 +rows:sparkyfitness_db:public.meal_plan_template_assignments=0 +rows:sparkyfitness_db:public.meal_plan_templates=0 +rows:sparkyfitness_db:public.meal_plans=0 +rows:sparkyfitness_db:public.meal_types=4 +rows:sparkyfitness_db:public.meals=0 +rows:sparkyfitness_db:public.medication_entries=0 +rows:sparkyfitness_db:public.medication_pens=0 +rows:sparkyfitness_db:public.medication_route_types=7 +rows:sparkyfitness_db:public.medication_schedule_types=8 +rows:sparkyfitness_db:public.medication_schedules=0 +rows:sparkyfitness_db:public.medication_titration_steps=0 +rows:sparkyfitness_db:public.medication_types=11 +rows:sparkyfitness_db:public.medications=0 +rows:sparkyfitness_db:public.mood_entries=0 +rows:sparkyfitness_db:public.oidc_providers=0 +rows:sparkyfitness_db:public.onboarding_data=0 +rows:sparkyfitness_db:public.onboarding_status=1 +rows:sparkyfitness_db:public.passkey=0 +rows:sparkyfitness_db:public.pregnancies=0 +rows:sparkyfitness_db:public.pregnancy_checklist_state=0 +rows:sparkyfitness_db:public.pregnancy_contractions=0 +rows:sparkyfitness_db:public.pregnancy_kick_sessions=0 +rows:sparkyfitness_db:public.pregnancy_photos=0 +rows:sparkyfitness_db:public.profiles=1 +rows:sparkyfitness_db:public.session=3 +rows:sparkyfitness_db:public.sleep_entries=0 +rows:sparkyfitness_db:public.sleep_entry_stages=0 +rows:sparkyfitness_db:public.sleep_need_calculations=0 +rows:sparkyfitness_db:public.sparky_chat_history=0 +rows:sparkyfitness_db:public.sso_provider=0 +rows:sparkyfitness_db:public.symptom_entries=0 +rows:sparkyfitness_db:public.two_factor=0 +rows:sparkyfitness_db:public.user=1 +rows:sparkyfitness_db:public.user_allergen_preferences=0 +rows:sparkyfitness_db:public.user_custom_moods=0 +rows:sparkyfitness_db:public.user_custom_nutrients=0 +rows:sparkyfitness_db:public.user_custom_symptom_locations=0 +rows:sparkyfitness_db:public.user_custom_symptoms=0 +rows:sparkyfitness_db:public.user_cycle_display_preferences=0 +rows:sparkyfitness_db:public.user_dashboard_layouts=0 +rows:sparkyfitness_db:public.user_goals=1 +rows:sparkyfitness_db:public.user_ignored_updates=0 +rows:sparkyfitness_db:public.user_meal_visibilities=0 +rows:sparkyfitness_db:public.user_medication_display_preferences=0 +rows:sparkyfitness_db:public.user_mood_display_preferences=0 +rows:sparkyfitness_db:public.user_nutrient_display_preferences=12 +rows:sparkyfitness_db:public.user_oidc_links=0 +rows:sparkyfitness_db:public.user_preferences=1 +rows:sparkyfitness_db:public.user_water_containers=0 +rows:sparkyfitness_db:public.verification=0 +rows:sparkyfitness_db:public.water_intake=0 +rows:sparkyfitness_db:public.water_intake_entries=0 +rows:sparkyfitness_db:public.weekly_goal_plans=0 +rows:sparkyfitness_db:public.workout_plan_assignment_sets=0 +rows:sparkyfitness_db:public.workout_plan_template_assignments=0 +rows:sparkyfitness_db:public.workout_plan_templates=0 +rows:sparkyfitness_db:public.workout_preset_exercise_sets=0 +rows:sparkyfitness_db:public.workout_preset_exercises=0 +rows:sparkyfitness_db:public.workout_presets=0 +rows:sparkyfitness_db:system.schema_migrations=184 diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/convert-load.err b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/convert-load.err new file mode 100644 index 00000000..e69de29b diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/engine-state.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/engine-state.json new file mode 100644 index 00000000..4821dd33 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/engine-state.json @@ -0,0 +1,8 @@ +{ + "sparkyfitness-db": { + "image": "postgres:18-alpine", + "probe": "datadir major version", + "answer": "18", + "probe_rc": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/files-after.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/files-after.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/files-after.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/files-before.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/files-before.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/files-before.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/memory-samples.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/memory-samples.json new file mode 100644 index 00000000..0c845af8 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/memory-samples.json @@ -0,0 +1,1562 @@ +[ + { + "t": 15.2, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7393280, + "peak": 8609792, + "anon": 5492736, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 141221888, + "peak": 148619264, + "anon": 9879552, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 364720128, + "peak": 376066048, + "anon": 336457728, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 304 + }, + { + "t": 30.3, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 6897664, + "peak": 9510912, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 136458240, + "peak": 148619264, + "anon": 5435392, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 364724224, + "peak": 376676352, + "anon": 336465920, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 604 + }, + { + "t": 45.5, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7159808, + "peak": 9510912, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 136658944, + "peak": 148619264, + "anon": 5435392, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 330117120, + "peak": 376676352, + "anon": 302948352, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 904 + }, + { + "t": 60.7, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7630848, + "peak": 9510912, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 136904704, + "peak": 148619264, + "anon": 5435392, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 277057536, + "peak": 376676352, + "anon": 251617280, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1208 + }, + { + "t": 75.9, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7147520, + "peak": 9510912, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 136962048, + "peak": 148619264, + "anon": 5435392, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 277053440, + "peak": 376676352, + "anon": 251617280, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1508 + }, + { + "t": 91.0, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7405568, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 136962048, + "peak": 148619264, + "anon": 5435392, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 277102592, + "peak": 376676352, + "anon": 251662336, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 1809 + }, + { + "t": 106.2, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7659520, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 136990720, + "peak": 148619264, + "anon": 5435392, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 277098496, + "peak": 376676352, + "anon": 251662336, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2112 + }, + { + "t": 121.3, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7671808, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 137191424, + "peak": 148619264, + "anon": 5435392, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 277102592, + "peak": 376676352, + "anon": 251662336, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2412 + }, + { + "t": 136.5, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7421952, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 137191424, + "peak": 148619264, + "anon": 5435392, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 277098496, + "peak": 376676352, + "anon": 251662336, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 2712 + }, + { + "t": 151.7, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 8163328, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 137359360, + "peak": 148619264, + "anon": 5435392, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 274051072, + "peak": 376676352, + "anon": 248696832, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3016 + }, + { + "t": 166.9, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7168000, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 137359360, + "peak": 148619264, + "anon": 5435392, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273039360, + "peak": 376676352, + "anon": 247685120, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3316 + }, + { + "t": 182.1, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7118848, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 137359360, + "peak": 148619264, + "anon": 5435392, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273145856, + "peak": 376676352, + "anon": 247803904, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3618 + }, + { + "t": 197.3, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7380992, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 137359360, + "peak": 148619264, + "anon": 5435392, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273145856, + "peak": 376676352, + "anon": 247803904, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 3920 + }, + { + "t": 212.4, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7651328, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 137359360, + "peak": 148619264, + "anon": 5435392, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273207296, + "peak": 376676352, + "anon": 247861248, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4222 + }, + { + "t": 227.6, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7667712, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 137359360, + "peak": 148619264, + "anon": 5435392, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273203200, + "peak": 376676352, + "anon": 247861248, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4524 + }, + { + "t": 242.8, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7155712, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 138682368, + "peak": 148619264, + "anon": 5513216, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273256448, + "peak": 376676352, + "anon": 247910400, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 4824 + }, + { + "t": 257.9, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7159808, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 140730368, + "peak": 148619264, + "anon": 5513216, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273252352, + "peak": 376676352, + "anon": 247910400, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5126 + }, + { + "t": 273.1, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7659520, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 141774848, + "peak": 148619264, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273297408, + "peak": 376676352, + "anon": 247951360, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5428 + }, + { + "t": 288.3, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7163904, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 143233024, + "peak": 148619264, + "anon": 5533696, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273293312, + "peak": 376676352, + "anon": 247951360, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 5728 + }, + { + "t": 303.5, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 6897664, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 144326656, + "peak": 148619264, + "anon": 5533696, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273334272, + "peak": 376676352, + "anon": 247992320, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6032 + }, + { + "t": 318.7, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7127040, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 145764352, + "peak": 149684224, + "anon": 5537792, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273334272, + "peak": 376676352, + "anon": 247992320, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6332 + }, + { + "t": 333.8, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7147520, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 148099072, + "peak": 149778432, + "anon": 5554176, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273379328, + "peak": 376676352, + "anon": 248037376, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6634 + }, + { + "t": 349.0, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7417856, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 148873216, + "peak": 151961600, + "anon": 5566464, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273379328, + "peak": 376676352, + "anon": 248037376, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 6936 + }, + { + "t": 364.2, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 6893568, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149463040, + "peak": 152576000, + "anon": 5607424, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273420288, + "peak": 376676352, + "anon": 248078336, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7238 + }, + { + "t": 379.3, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7417856, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149733376, + "peak": 152641536, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273420288, + "peak": 376676352, + "anon": 248078336, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7540 + }, + { + "t": 394.5, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7163904, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149520384, + "peak": 152641536, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273461248, + "peak": 376676352, + "anon": 248119296, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 7840 + }, + { + "t": 409.6, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7155712, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149516288, + "peak": 152887296, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273461248, + "peak": 376676352, + "anon": 248119296, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8140 + }, + { + "t": 424.8, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7159808, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149516288, + "peak": 153235456, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273506304, + "peak": 376676352, + "anon": 248160256, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8444 + }, + { + "t": 440.0, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 6922240, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149520384, + "peak": 153235456, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273502208, + "peak": 376676352, + "anon": 248160256, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 8744 + }, + { + "t": 455.2, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7405568, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149516288, + "peak": 153235456, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273543168, + "peak": 376676352, + "anon": 248197120, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9046 + }, + { + "t": 470.3, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 8196096, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149516288, + "peak": 154456064, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273539072, + "peak": 376676352, + "anon": 248197120, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9348 + }, + { + "t": 485.5, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7413760, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149516288, + "peak": 154456064, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273666048, + "peak": 376676352, + "anon": 248291328, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9650 + }, + { + "t": 500.7, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7667712, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149520384, + "peak": 154456064, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273666048, + "peak": 376676352, + "anon": 248291328, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 9950 + }, + { + "t": 515.9, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7413760, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149516288, + "peak": 154456064, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273702912, + "peak": 376676352, + "anon": 248328192, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10252 + }, + { + "t": 531.1, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7401472, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149516288, + "peak": 154456064, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273702912, + "peak": 376676352, + "anon": 248328192, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10554 + }, + { + "t": 546.2, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 6901760, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149516288, + "peak": 154456064, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273743872, + "peak": 376676352, + "anon": 248369152, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 10856 + }, + { + "t": 561.4, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7176192, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149516288, + "peak": 154456064, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273743872, + "peak": 376676352, + "anon": 248369152, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11157 + }, + { + "t": 576.6, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7159808, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149504000, + "peak": 154456064, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273784832, + "peak": 376676352, + "anon": 248410112, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11458 + }, + { + "t": 591.7, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7217152, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149504000, + "peak": 154456064, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273784832, + "peak": 376676352, + "anon": 248410112, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 11760 + }, + { + "t": 606.9, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "current": 7426048, + "peak": 10674176, + "anon": 5517312, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "current": 149504000, + "peak": 154456064, + "anon": 5668864, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "current": 273829888, + "peak": 376676352, + "anon": 248455168, + "oom_kill": 0, + "restarts": 0, + "oomkilled_flag": false, + "status": "running", + "cgroup": true + } + }, + "requests": 12062 + } +] \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/migration-lines.txt b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/migration-lines.txt new file mode 100644 index 00000000..915cd394 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/migration-lines.txt @@ -0,0 +1,6 @@ +sparkyfitness-server | [2026-09-30T10:26:35.050Z] [INFO] Ensured schema_migrations table exists. +sparkyfitness-server | [2026-09-30T10:26:35.056Z] [INFO] Applied migrations: [ +sparkyfitness-server | '202508201215_add_garmin_integration_schema.sql', +sparkyfitness-server | '20251019013200_merged_schema_and_data.sql', +sparkyfitness-server | '20251103000000_add_onboarding_schema.sql', +sparkyfitness-server | '20251127194108_migrate_aggregated_food_entries_to_food_entry_meals.sql', \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/run.log b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/run.log new file mode 100644 index 00000000..00a42574 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/run.log @@ -0,0 +1,63 @@ +[10:24:54] scratch drive folders cleared before FROM (R-656): none existed +[10:24:54] MV-sparkyfitness: deploying sparkyfitness at FROM {'sparkyfitness-db': 'postgres:15-alpine', 'sparkyfitness-server': 'codewithcj/sparkyfitness_server:v0.17.3', 'sparkyfitness-frontend': 'codewithcj/sparkyfitness:v0.17.3'} +[10:26:08] FROM settled=True in 31.1s :: {"sparkyfitness": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-server": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:26:08] fixture: the BOX walk's own (Sparkyfitness), through upgrade_boxport +[10:26:08] sparkyfitness: sign-up http=200 +[10:26:08] sparkyfitness: check-in http=200 +[10:26:08] sparkyfitness: seeded user drilld17b38 with a weight of 73.36 on 2026-09-01 +[10:26:09] sparkyfitness: readback of the seeded weight http=200 equal=True +[10:26:09] C1 (seed reads back BEFORE): True +[10:26:09] MV-sparkyfitness: PostgreSQL major move {'service': 'sparkyfitness-db', 'engine': 'postgres', 'from': 15, 'to': 18} — converting on the bench before the swap +[10:26:22] CONVERTED sparkyfitness-db PostgreSQL 15 -> 18 in 13.3s (dump 0.69s / 377827 B, load 3.99s, check equal over 94 tables) +[10:26:22] MV-sparkyfitness: swapping to TO {'sparkyfitness-db': 'postgres:18-alpine', 'sparkyfitness-server': 'codewithcj/sparkyfitness_server:v0.17.3', 'sparkyfitness-frontend': 'codewithcj/sparkyfitness:v0.17.3'} +[10:26:56] TO up -d rc=0 +[10:27:28] TO settled=True in 31.2s :: {"sparkyfitness": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-server": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}} +[10:27:28] engine state sparkyfitness-db: 18 +[10:27:28] migration lines observed: 6 +[10:27:28] sparkyfitness: readback of the seeded weight http=200 equal=True +[10:27:28] RESULT (seed reads back AFTER): True +[10:27:29] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.4:80 +[10:27:44] + 15s sparkyfitness=7M/256M peak=8M kills=0 rs=0 sparkyfitness-db=134M/512M peak=141M kills=0 rs=0 sparkyfitness-server=347M/1024M peak=358M kills=0 rs=0 reqs=304 +[10:27:59] + 30s sparkyfitness=6M/256M peak=9M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=347M/1024M peak=359M kills=0 rs=0 reqs=604 +[10:28:14] + 46s sparkyfitness=6M/256M peak=9M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=314M/1024M peak=359M kills=0 rs=0 reqs=904 +[10:28:30] + 61s sparkyfitness=7M/256M peak=9M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=264M/1024M peak=359M kills=0 rs=0 reqs=1208 +[10:28:45] + 76s sparkyfitness=6M/256M peak=9M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=264M/1024M peak=359M kills=0 rs=0 reqs=1508 +[10:29:00] + 91s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=264M/1024M peak=359M kills=0 rs=0 reqs=1809 +[10:29:15] + 106s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=264M/1024M peak=359M kills=0 rs=0 reqs=2112 +[10:29:30] + 121s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=264M/1024M peak=359M kills=0 rs=0 reqs=2412 +[10:29:45] + 136s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=264M/1024M peak=359M kills=0 rs=0 reqs=2712 +[10:30:01] + 152s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=3016 +[10:30:16] + 167s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=3316 +[10:30:31] + 182s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=3618 +[10:30:46] + 197s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=3920 +[10:31:01] + 212s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=4222 +[10:31:16] + 228s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=130M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=4524 +[10:31:32] + 243s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=132M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=4824 +[10:31:47] + 258s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=134M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=5126 +[10:32:02] + 273s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=135M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=5428 +[10:32:17] + 288s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=136M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=5728 +[10:32:32] + 304s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=137M/512M peak=141M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=6032 +[10:32:48] + 319s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=139M/512M peak=142M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=6332 +[10:33:03] + 334s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=141M/512M peak=142M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=6634 +[10:33:18] + 349s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=141M/512M peak=144M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=6936 +[10:33:33] + 364s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=145M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=7238 +[10:33:48] + 379s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=145M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=7540 +[10:34:03] + 394s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=145M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=7840 +[10:34:19] + 410s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=145M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=8140 +[10:34:34] + 425s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=146M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=8444 +[10:34:49] + 440s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=146M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=8744 +[10:35:04] + 455s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=146M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=9046 +[10:35:19] + 470s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=9348 +[10:35:34] + 486s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=9650 +[10:35:50] + 501s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=260M/1024M peak=359M kills=0 rs=0 reqs=9950 +[10:36:05] + 516s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=10252 +[10:36:20] + 531s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=10554 +[10:36:35] + 546s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=10856 +[10:36:50] + 561s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=11157 +[10:37:05] + 577s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=11458 +[10:37:21] + 592s sparkyfitness=6M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=11760 +[10:37:36] + 607s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=142M/512M peak=147M kills=0 rs=0 sparkyfitness-server=261M/1024M peak=359M kills=0 rs=0 reqs=12062 +[10:37:36] memory watch: killed=False tight=[] requests=12062 codes={'200': 12062} +[10:37:36] MV-sparkyfitness: ABORT — putting the FROM images back +[10:38:51] sparkyfitness: the seeded user could not sign in (http 401) +[10:38:51] ABORT: app came back in 31.2s; data present=False \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/to-full.log b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/to-full.log new file mode 100644 index 00000000..4677231e --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/to-full.log @@ -0,0 +1,715 @@ +sparkyfitness-db | The files belonging to this database system will be owned by user "postgres". +sparkyfitness-db | This user must also own the server process. +sparkyfitness-db | +sparkyfitness-db | The database cluster will be initialized with locale "en_US.utf8". +sparkyfitness-db | The default database encoding has accordingly been set to "UTF8". +sparkyfitness-db | The default text search configuration will be set to "english". +sparkyfitness-db | +sparkyfitness-db | Data page checksums are enabled. +sparkyfitness-db | +sparkyfitness-db | fixing permissions on existing directory /var/lib/postgresql/data/pgdata ... ok +sparkyfitness-db | creating subdirectories ... ok +sparkyfitness-db | selecting dynamic shared memory implementation ... posix +sparkyfitness-db | selecting default "max_connections" ... 100 +sparkyfitness-db | selecting default "shared_buffers" ... 128MB +sparkyfitness-db | selecting default time zone ... Europe/Budapest +sparkyfitness-db | creating configuration files ... ok +sparkyfitness-db | running bootstrap script ... ok +sparkyfitness-db | sh: locale: not found +sparkyfitness-db | 2026-09-30 12:26:15.897 CEST [43] WARNING: no usable system locales were found +sparkyfitness-db | performing post-bootstrap initialization ... ok +sparkyfitness-db | syncing data to disk ... ok +sparkyfitness-db | +sparkyfitness-db | +sparkyfitness-db | Success. You can now start the database server using: +sparkyfitness-db | +sparkyfitness-db | pg_ctl -D /var/lib/postgresql/data/pgdata -l logfile start +sparkyfitness-db | +sparkyfitness-db | initdb: warning: enabling "trust" authentication for local connections +sparkyfitness-db | initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. +sparkyfitness-db | waiting for server to start....2026-09-30 12:26:16.801 CEST [49] LOG: starting PostgreSQL 18.6 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit +sparkyfitness-db | 2026-09-30 12:26:16.804 CEST [49] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" +sparkyfitness-db | 2026-09-30 12:26:16.820 CEST [55] LOG: database system was shut down at 2026-09-30 12:26:16 CEST +sparkyfitness-db | 2026-09-30 12:26:16.828 CEST [49] LOG: database system is ready to accept connections +sparkyfitness-db | done +sparkyfitness-db | server started +sparkyfitness-db | CREATE DATABASE +sparkyfitness-db | +sparkyfitness-db | +sparkyfitness-db | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/* +sparkyfitness-db | +sparkyfitness-db | waiting for server to shut down....2026-09-30 12:26:17.000 CEST [49] LOG: received fast shutdown request +sparkyfitness-db | 2026-09-30 12:26:17.004 CEST [49] LOG: aborting any active transactions +sparkyfitness-db | 2026-09-30 12:26:17.010 CEST [49] LOG: background worker "logical replication launcher" (PID 58) exited with exit code 1 +sparkyfitness-db | 2026-09-30 12:26:17.010 CEST [53] LOG: shutting down +sparkyfitness-db | 2026-09-30 12:26:17.013 CEST [53] LOG: checkpoint starting: shutdown immediate +sparkyfitness-db | 2026-09-30 12:26:17.101 CEST [53] LOG: checkpoint complete: wrote 943 buffers (5.8%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.028 s, sync=0.046 s, total=0.092 s; sync files=303, longest=0.017 s, average=0.001 s; distance=4362 kB, estimate=4362 kB; lsn=0/1BA8868, redo lsn=0/1BA8868 +sparkyfitness-db | 2026-09-30 12:26:17.129 CEST [49] LOG: database system is shut down +sparkyfitness-db | done +sparkyfitness-db | server stopped +sparkyfitness-db | +sparkyfitness-db | PostgreSQL init process complete; ready for start up. +sparkyfitness-db | +sparkyfitness-db | 2026-09-30 12:26:17.241 CEST [1] LOG: starting PostgreSQL 18.6 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit +sparkyfitness-db | 2026-09-30 12:26:17.241 CEST [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 +sparkyfitness-db | 2026-09-30 12:26:17.241 CEST [1] LOG: listening on IPv6 address "::", port 5432 +sparkyfitness-db | 2026-09-30 12:26:17.249 CEST [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" +sparkyfitness-db | 2026-09-30 12:26:17.260 CEST [71] LOG: database system was shut down at 2026-09-30 12:26:17 CEST +sparkyfitness-db | 2026-09-30 12:26:17.268 CEST [1] LOG: database system is ready to accept connections +sparkyfitness-db | 2026-09-30 12:26:17.848 CEST [69] LOG: checkpoint starting: immediate force wait +sparkyfitness-db | 2026-09-30 12:26:17.873 CEST [69] LOG: checkpoint complete: wrote 1 buffers (0.0%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.008 s, sync=0.006 s, total=0.026 s; sync files=3, longest=0.003 s, average=0.002 s; distance=1 kB, estimate=1 kB; lsn=0/1BA8D70, redo lsn=0/1BA8D18 +sparkyfitness-server | [dotenv@17.3.1] injecting env (0) from ../.env -- tip: ⚡️ secrets for agents: https://dotenvx.com/as2 +sparkyfitness-server | [Secrets] Checking for secret files to load... +sparkyfitness-server | [Secrets] No secrets loaded from files. +sparkyfitness-server | [2026-09-30T10:25:07.346Z] [INFO] Environment variable pre-flight checks passed successfully. +sparkyfitness-server | Starting server... +sparkyfitness-server | [2026-09-30T10:25:17.546Z] [INFO] [withingsService] Withings data source configured to: withings +sparkyfitness-server | [2026-09-30T10:25:17.548Z] [INFO] [fitbitService] Fitbit data source configured to: fitbit +sparkyfitness-server | [2026-09-30T10:25:17.549Z] [INFO] [googleHealthService] Google Health data source: googlehealth +sparkyfitness-server | [2026-09-30T10:25:17.551Z] [INFO] [polarService] Polar data source configured to: polar +sparkyfitness | Starting SparkyFitness Frontend as root with environment variables: +sparkyfitness | SPARKY_FITNESS_SERVER_HOST=sparkyfitness-server +sparkyfitness | SPARKY_FITNESS_SERVER_PORT=3010 +sparkyfitness | NGINX_RATE_LIMIT=5r/s +sparkyfitness | NGINX_LISTEN_PORT=80 +sparkyfitness | NGINX_ACCESS_LOG=/var/log/nginx/access.log +sparkyfitness | NGINX_ERROR_LOG=/var/log/nginx/error.log +sparkyfitness | NGINX_DUMP_CONFIG=false +sparkyfitness | SPARKY_FITNESS_FRONTEND_URL=https://sparky.gate.invalid +sparkyfitness | Generating nginx configuration from template... +sparkyfitness | Testing nginx configuration substitution... +sparkyfitness | Validating nginx configuration syntax... +sparkyfitness | nginx: the configuration file /etc/nginx/nginx.conf syntax is ok +sparkyfitness | nginx: configuration file /etc/nginx/nginx.conf test is successful +sparkyfitness | Configuration validated successfully. Starting nginx... +sparkyfitness | Backend will be proxied to: sparkyfitness-server:3010 +sparkyfitness | 2026/09/30 12:25:37 [notice] 1#1: using the "epoll" event method +sparkyfitness | 2026/09/30 12:25:37 [notice] 1#1: nginx/1.29.3 +sparkyfitness | 2026/09/30 12:25:37 [notice] 1#1: built by gcc 14.2.0 (Alpine 14.2.0) +sparkyfitness | 2026/09/30 12:25:37 [notice] 1#1: OS: Linux 7.0.2-6-pve +sparkyfitness | 2026/09/30 12:25:37 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 524288:524288 +sparkyfitness | 2026/09/30 12:25:37 [notice] 1#1: start worker processes +sparkyfitness | 2026/09/30 12:25:37 [notice] 1#1: start worker process 13 +sparkyfitness | 2026/09/30 12:25:37 [notice] 1#1: start worker process 14 +sparkyfitness | 2026/09/30 12:25:37 [notice] 1#1: start worker process 15 +sparkyfitness | 2026/09/30 12:25:37 [notice] 1#1: start worker process 16 +sparkyfitness | 2026/09/30 12:25:37 [notice] 1#1: start worker process 17 +sparkyfitness-server | [2026-09-30T10:25:17.551Z] [INFO] [stravaService] Strava data source configured to: strava +sparkyfitness-server | [2026-09-30T10:25:17.552Z] [INFO] [hevyService] Hevy data source configured to: hevy +sparkyfitness-server | [2026-09-30T10:25:18.393Z] [INFO] UserProfileRoutes UPLOADS_DIR: /app/SparkyFitnessServer/uploads/avatars +sparkyfitness-server | DEBUG: SPARKY_FITNESS_FRONTEND_URL is: https://sparky.gate.invalid +sparkyfitness | 2026/09/30 12:25:37 [notice] 1#1: start worker process 18 +sparkyfitness | 127.0.0.1 - - [30/Sep/2026:12:26:07 +0200] "GET / HTTP/1.1" 200 2666 "-" "Wget" +sparkyfitness | 172.18.0.1 - - [30/Sep/2026:12:26:08 +0200] "GET /api/health HTTP/1.1" 200 15 "-" "curl/8.14.1" +sparkyfitness | 172.18.0.1 - - [30/Sep/2026:12:26:08 +0200] "POST /api/auth/sign-up/email HTTP/1.1" 200 393 "-" "curl/8.14.1" +sparkyfitness | 172.18.0.1 - - [30/Sep/2026:12:26:08 +0200] "POST /api/auth/sign-in/email HTTP/1.1" 200 432 "-" "curl/8.14.1" +sparkyfitness | 172.18.0.1 - - [30/Sep/2026:12:26:08 +0200] "POST /api/measurements/check-in HTTP/1.1" 200 426 "-" "curl/8.14.1" +sparkyfitness | 172.18.0.1 - - [30/Sep/2026:12:26:08 +0200] "GET / HTTP/1.1" 200 2666 "-" "curl/8.14.1" +sparkyfitness | 172.18.0.1 - - [30/Sep/2026:12:26:08 +0200] "POST /api/auth/sign-in/email HTTP/1.1" 401 85 "-" "curl/8.14.1" +sparkyfitness | 172.18.0.1 - - [30/Sep/2026:12:26:09 +0200] "POST /api/auth/sign-in/email HTTP/1.1" 200 432 "-" "curl/8.14.1" +sparkyfitness | 172.18.0.1 - - [30/Sep/2026:12:26:09 +0200] "GET /api/measurements/check-in/1999-01-01 HTTP/1.1" 200 2 "-" "curl/8.14.1" +sparkyfitness | 172.18.0.1 - - [30/Sep/2026:12:26:09 +0200] "GET /api/measurements/check-in/2026-09-01 HTTP/1.1" 200 426 "-" "curl/8.14.1" +sparkyfitness | 2026/09/30 12:26:09 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down +sparkyfitness | 2026/09/30 12:26:09 [notice] 13#13: gracefully shutting down +sparkyfitness | 2026/09/30 12:26:09 [notice] 14#14: gracefully shutting down +sparkyfitness | 2026/09/30 12:26:09 [notice] 15#15: gracefully shutting down +sparkyfitness-server | [SECURITY] Private network CORS is ENABLED. Ensure this is only on self-hosted/private networks. +sparkyfitness-server | SparkyFitnessServer UPLOADS_BASE_DIR: /app/SparkyFitnessServer/uploads +sparkyfitness-server | [2026-09-30T10:25:18.547Z] [INFO] Ensured temporary upload directory exists: /app/SparkyFitnessServer/temp_uploads/ +sparkyfitness | 2026/09/30 12:26:09 [notice] 16#16: gracefully shutting down +sparkyfitness | 2026/09/30 12:26:09 [notice] 13#13: exiting +sparkyfitness | 2026/09/30 12:26:09 [notice] 17#17: gracefully shutting down +sparkyfitness | 2026/09/30 12:26:09 [notice] 14#14: exiting +sparkyfitness | 2026/09/30 12:26:09 [notice] 16#16: exiting +sparkyfitness | 2026/09/30 12:26:09 [notice] 15#15: exiting +sparkyfitness | 2026/09/30 12:26:09 [notice] 17#17: exiting +sparkyfitness | 2026/09/30 12:26:09 [notice] 18#18: gracefully shutting down +sparkyfitness | 2026/09/30 12:26:09 [notice] 17#17: exit +sparkyfitness-server | [2026-09-30T10:25:18.577Z] [INFO] Creating role: "sparkyapp" +sparkyfitness | 2026/09/30 12:26:09 [notice] 14#14: exit +sparkyfitness | 2026/09/30 12:26:09 [notice] 13#13: exit +sparkyfitness | 2026/09/30 12:26:09 [notice] 18#18: exiting +sparkyfitness | 2026/09/30 12:26:09 [notice] 16#16: exit +sparkyfitness | 2026/09/30 12:26:09 [notice] 15#15: exit +sparkyfitness-server | [2026-09-30T10:25:18.590Z] [INFO] Successfully created role: "sparkyapp" +sparkyfitness | 2026/09/30 12:26:09 [notice] 18#18: exit +sparkyfitness | 2026/09/30 12:26:09 [notice] 1#1: signal 17 (SIGCHLD) received from 15 +sparkyfitness | 2026/09/30 12:26:09 [notice] 1#1: worker process 13 exited with code 0 +sparkyfitness | 2026/09/30 12:26:09 [notice] 1#1: worker process 15 exited with code 0 +sparkyfitness | 2026/09/30 12:26:09 [notice] 1#1: worker process 16 exited with code 0 +sparkyfitness | 2026/09/30 12:26:09 [notice] 1#1: signal 29 (SIGIO) received +sparkyfitness | 2026/09/30 12:26:09 [notice] 1#1: signal 17 (SIGCHLD) received from 14 +sparkyfitness | 2026/09/30 12:26:09 [notice] 1#1: worker process 14 exited with code 0 +sparkyfitness | 2026/09/30 12:26:09 [notice] 1#1: worker process 17 exited with code 0 +sparkyfitness | 2026/09/30 12:26:09 [notice] 1#1: signal 29 (SIGIO) received +sparkyfitness | 2026/09/30 12:26:09 [notice] 1#1: signal 17 (SIGCHLD) received from 17 +sparkyfitness | 2026/09/30 12:26:09 [notice] 1#1: signal 17 (SIGCHLD) received from 18 +sparkyfitness | 2026/09/30 12:26:09 [notice] 1#1: worker process 18 exited with code 0 +sparkyfitness | 2026/09/30 12:26:09 [notice] 1#1: exit +sparkyfitness | Starting SparkyFitness Frontend as root with environment variables: +sparkyfitness | SPARKY_FITNESS_SERVER_HOST=sparkyfitness-server +sparkyfitness-server | [2026-09-30T10:25:18.618Z] [INFO] Ensured schema_migrations table exists. +sparkyfitness-server | [2026-09-30T10:25:18.620Z] [INFO] Applied migrations: [] +sparkyfitness-server | [2026-09-30T10:25:18.624Z] [INFO] Applying migration: 20250703170640_InitialDB.sql +sparkyfitness-server | [2026-09-30T10:25:18.856Z] [INFO] Successfully applied migration: 20250703170640_InitialDB.sql +sparkyfitness-server | [2026-09-30T10:25:18.856Z] [INFO] Applying migration: 20250710062500_create_goal_presets_table.sql +sparkyfitness-server | [2026-09-30T10:25:18.899Z] [INFO] Successfully applied migration: 20250710062500_create_goal_presets_table.sql +sparkyfitness-server | [2026-09-30T10:25:18.899Z] [INFO] Applying migration: 20250711173824_meal_features.sql +sparkyfitness-server | [2026-09-30T10:25:18.993Z] [INFO] Successfully applied migration: 20250711173824_meal_features.sql +sparkyfitness-server | [2026-09-30T10:25:18.993Z] [INFO] Applying migration: 20250712163617_refactor_data_providers_and_add_exercise_source_id.sql +sparkyfitness-server | [2026-09-30T10:25:19.001Z] [INFO] Successfully applied migration: 20250712163617_refactor_data_providers_and_add_exercise_source_id.sql +sparkyfitness-server | [2026-09-30T10:25:19.002Z] [INFO] Applying migration: 20250713125323_create_oidc_settings_and_update_users_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.025Z] [INFO] Successfully applied migration: 20250713125323_create_oidc_settings_and_update_users_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.025Z] [INFO] Applying migration: 20250713135900_add_role_to_users_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.031Z] [INFO] Successfully applied migration: 20250713135900_add_role_to_users_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.031Z] [INFO] Applying migration: 20250713142300_add_oidc_config_fields.sql +sparkyfitness-server | [2026-09-30T10:25:19.039Z] [INFO] Successfully applied migration: 20250713142300_add_oidc_config_fields.sql +sparkyfitness | SPARKY_FITNESS_SERVER_PORT=3010 +sparkyfitness | NGINX_RATE_LIMIT=5r/s +sparkyfitness | NGINX_LISTEN_PORT=80 +sparkyfitness | NGINX_ACCESS_LOG=/var/log/nginx/access.log +sparkyfitness | NGINX_ERROR_LOG=/var/log/nginx/error.log +sparkyfitness | NGINX_DUMP_CONFIG=false +sparkyfitness | SPARKY_FITNESS_FRONTEND_URL=https://sparky.gate.invalid +sparkyfitness | Generating nginx configuration from template... +sparkyfitness | Testing nginx configuration substitution... +sparkyfitness-server | [2026-09-30T10:25:19.039Z] [INFO] Applying migration: 20250714000000_create_session_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.063Z] [INFO] Successfully applied migration: 20250714000000_create_session_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.063Z] [INFO] Applying migration: 20250714175824_add_api_key_tag_to_ai_service_settings.sql +sparkyfitness-server | [2026-09-30T10:25:19.068Z] [INFO] Successfully applied migration: 20250714175824_add_api_key_tag_to_ai_service_settings.sql +sparkyfitness-server | [2026-09-30T10:25:19.068Z] [INFO] Applying migration: 20250717190700_add_cascading_deletes.sql +sparkyfitness-server | [2026-09-30T10:25:19.106Z] [INFO] Successfully applied migration: 20250717190700_add_cascading_deletes.sql +sparkyfitness-server | [2026-09-30T10:25:19.106Z] [INFO] Applying migration: 20250717233929_add_is_quick_food_to_foods.sql +sparkyfitness-server | [2026-09-30T10:25:19.112Z] [INFO] Successfully applied migration: 20250717233929_add_is_quick_food_to_foods.sql +sparkyfitness-server | [2026-09-30T10:25:19.112Z] [INFO] Applying migration: 20250718190226_add_food_display_limit_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:19.118Z] [INFO] Successfully applied migration: 20250718190226_add_food_display_limit_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:19.118Z] [INFO] Applying migration: 20250719131500_add_meal_percentages.sql +sparkyfitness-server | [2026-09-30T10:25:19.129Z] [INFO] Successfully applied migration: 20250719131500_add_meal_percentages.sql +sparkyfitness-server | [2026-09-30T10:25:19.129Z] [INFO] Applying migration: 20250719215400_add_login_management_to_oidc_settings.sql +sparkyfitness-server | [2026-09-30T10:25:19.135Z] [INFO] Successfully applied migration: 20250719215400_add_login_management_to_oidc_settings.sql +sparkyfitness-server | [2026-09-30T10:25:19.135Z] [INFO] Applying migration: 20250720010000_create_user_nutrient_display_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:19.162Z] [INFO] Successfully applied migration: 20250720010000_create_user_nutrient_display_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:19.162Z] [INFO] Applying migration: 20250720201800_rename_food_display_limit_to_item_display_limit.sql +sparkyfitness-server | [2026-09-30T10:25:19.167Z] [INFO] Successfully applied migration: 20250720201800_rename_food_display_limit_to_item_display_limit.sql +sparkyfitness-server | [2026-09-30T10:25:19.167Z] [INFO] Applying migration: 20250720220000_add_water_tracking_features.sql +sparkyfitness-server | [2026-09-30T10:25:19.185Z] [INFO] Successfully applied migration: 20250720220000_add_water_tracking_features.sql +sparkyfitness-server | [2026-09-30T10:25:19.185Z] [INFO] Applying migration: 20250720233836_alter_water_goal_ml_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:25:19.215Z] [INFO] Successfully applied migration: 20250720233836_alter_water_goal_ml_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:25:19.215Z] [INFO] Applying migration: 20250721000000_add_servings_per_container_to_water_containers.sql +sparkyfitness-server | [2026-09-30T10:25:19.221Z] [INFO] Successfully applied migration: 20250721000000_add_servings_per_container_to_water_containers.sql +sparkyfitness-server | [2026-09-30T10:25:19.221Z] [INFO] Applying migration: 20250721000000_alter_water_container_volume_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:25:19.233Z] [INFO] Successfully applied migration: 20250721000000_alter_water_container_volume_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:25:19.233Z] [INFO] Applying migration: 20250721014900_alter_water_ml_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:25:19.240Z] [INFO] Successfully applied migration: 20250721014900_alter_water_ml_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:25:19.240Z] [INFO] Applying migration: 20250819062400_add_mealie_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:19.246Z] [INFO] Successfully applied migration: 20250819062400_add_mealie_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:19.246Z] [INFO] Applying migration: 20250819083500_add_base_url_to_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:25:19.251Z] [INFO] Successfully applied migration: 20250819083500_add_base_url_to_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:25:19.251Z] [INFO] Applying migration: 202508201215_add_garmin_integration_schema.sql +sparkyfitness-server | [2026-09-30T10:25:19.258Z] [INFO] Successfully applied migration: 202508201215_add_garmin_integration_schema.sql +sparkyfitness-server | [2026-09-30T10:25:19.258Z] [INFO] Applying migration: 20250821090000_update_external_data_providers_provider_type_check.sql +sparkyfitness-server | [2026-09-30T10:25:19.263Z] [INFO] Successfully applied migration: 20250821090000_update_external_data_providers_provider_type_check.sql +sparkyfitness | Validating nginx configuration syntax... +sparkyfitness | nginx: the configuration file /etc/nginx/nginx.conf syntax is ok +sparkyfitness | nginx: configuration file /etc/nginx/nginx.conf test is successful +sparkyfitness | Configuration validated successfully. Starting nginx... +sparkyfitness | Backend will be proxied to: sparkyfitness-server:3010 +sparkyfitness | 2026/09/30 12:26:56 [notice] 1#1: using the "epoll" event method +sparkyfitness-server | [2026-09-30T10:25:19.264Z] [INFO] Applying migration: 20250821091500_add_garth_token_dump_to_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:25:19.269Z] [INFO] Successfully applied migration: 20250821091500_add_garth_token_dump_to_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:25:19.269Z] [INFO] Applying migration: 20250821102000_remove_redundant_token_fields_from_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:25:19.276Z] [INFO] Successfully applied migration: 20250821102000_remove_redundant_token_fields_from_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:25:19.276Z] [INFO] Applying migration: 20250831063900_create_mood_entries_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.303Z] [INFO] Successfully applied migration: 20250831063900_create_mood_entries_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.303Z] [INFO] Applying migration: 20250927180257_alter_exercises_table.sql +sparkyfitness | 2026/09/30 12:26:56 [notice] 1#1: nginx/1.29.3 +sparkyfitness | 2026/09/30 12:26:56 [notice] 1#1: built by gcc 14.2.0 (Alpine 14.2.0) +sparkyfitness | 2026/09/30 12:26:56 [notice] 1#1: OS: Linux 7.0.2-6-pve +sparkyfitness | 2026/09/30 12:26:56 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 524288:524288 +sparkyfitness | 2026/09/30 12:26:56 [notice] 1#1: start worker processes +sparkyfitness | 2026/09/30 12:26:56 [notice] 1#1: start worker process 12 +sparkyfitness | 2026/09/30 12:26:56 [notice] 1#1: start worker process 13 +sparkyfitness | 2026/09/30 12:26:56 [notice] 1#1: start worker process 14 +sparkyfitness | 2026/09/30 12:26:56 [notice] 1#1: start worker process 15 +sparkyfitness | 2026/09/30 12:26:56 [notice] 1#1: start worker process 16 +sparkyfitness | 2026/09/30 12:26:56 [notice] 1#1: start worker process 17 +sparkyfitness | 127.0.0.1 - - [30/Sep/2026:12:27:26 +0200] "GET / HTTP/1.1" 200 2666 "-" "Wget" +sparkyfitness-server | [2026-09-30T10:25:19.319Z] [INFO] Successfully applied migration: 20250927180257_alter_exercises_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.319Z] [INFO] Applying migration: 20250927212000_add_free_exercise_db_to_provider_type_check.sql +sparkyfitness-server | [2026-09-30T10:25:19.324Z] [INFO] Successfully applied migration: 20250927212000_add_free_exercise_db_to_provider_type_check.sql +sparkyfitness-server | [2026-09-30T10:25:19.324Z] [INFO] Applying migration: 20250930002100_add_sets_reps_weight_to_exercise_entries.sql +sparkyfitness-server | [2026-09-30T10:25:19.329Z] [INFO] Successfully applied migration: 20250930002100_add_sets_reps_weight_to_exercise_entries.sql +sparkyfitness-server | [2026-09-30T10:25:19.330Z] [INFO] Applying migration: 20251001232600_add_gender_to_users_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.334Z] [INFO] Successfully applied migration: 20251001232600_add_gender_to_users_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.334Z] [INFO] Applying migration: 20251002182306_create_backup_settings_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.360Z] [INFO] Successfully applied migration: 20251002182306_create_backup_settings_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.360Z] [INFO] Applying migration: 20251002224500_add_password_reset_to_users_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.371Z] [INFO] Successfully applied migration: 20251002224500_add_password_reset_to_users_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.371Z] [INFO] Applying migration: 20251006021609_add_glycemic_index_to_foods_and_food_variants.sql +sparkyfitness-server | [2026-09-30T10:25:19.380Z] [INFO] Successfully applied migration: 20251006021609_add_glycemic_index_to_foods_and_food_variants.sql +sparkyfitness-server | [2026-09-30T10:25:19.380Z] [INFO] Applying migration: 20251006220500_create_admin_activity_logs_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.399Z] [INFO] Successfully applied migration: 20251006220500_create_admin_activity_logs_table.sql +sparkyfitness-server | [2026-09-30T10:25:19.399Z] [INFO] Applying migration: 20251008224256_add_workout_features.sql +sparkyfitness-server | [2026-09-30T10:25:19.464Z] [INFO] Successfully applied migration: 20251008224256_add_workout_features.sql +sparkyfitness-server | [2026-09-30T10:25:19.464Z] [INFO] Applying migration: 20251012225400_add_primary_keys_to_workout_tables.sql +sparkyfitness-server | [2026-09-30T10:25:19.473Z] [INFO] Successfully applied migration: 20251012225400_add_primary_keys_to_workout_tables.sql +sparkyfitness-server | [2026-09-30T10:25:19.473Z] [INFO] Applying migration: 20251012225500_add_multiple_sets_to_presets.sql +sparkyfitness-server | [2026-09-30T10:25:19.496Z] [INFO] Successfully applied migration: 20251012225500_add_multiple_sets_to_presets.sql +sparkyfitness-server | [2026-09-30T10:25:19.496Z] [INFO] Applying migration: 20251012225900_add_multiple_sets_to_plans.sql +sparkyfitness-server | [2026-09-30T10:25:19.522Z] [INFO] Successfully applied migration: 20251012225900_add_multiple_sets_to_plans.sql +sparkyfitness-server | [2026-09-30T10:25:19.523Z] [INFO] Applying migration: 20251012230000_add_multiple_sets_to_exercise_entries.sql +sparkyfitness-server | [2026-09-30T10:25:19.549Z] [INFO] Successfully applied migration: 20251012230000_add_multiple_sets_to_exercise_entries.sql +sparkyfitness-server | [2026-09-30T10:25:19.549Z] [INFO] Applying migration: 20251015223200_convert_weights_to_kg_and_set_default.sql +sparkyfitness-server | [2026-09-30T10:25:19.555Z] [INFO] Successfully applied migration: 20251015223200_convert_weights_to_kg_and_set_default.sql +sparkyfitness-server | [2026-09-30T10:25:19.556Z] [INFO] Applying migration: 202510170132_add_text_measurements.sql +sparkyfitness-server | [2026-09-30T10:25:19.581Z] [INFO] Successfully applied migration: 202510170132_add_text_measurements.sql +sparkyfitness-server | [2026-09-30T10:25:19.581Z] [INFO] Applying migration: 20251017200900_add_multiple_oidc_providers.sql +sparkyfitness-server | [2026-09-30T10:25:19.638Z] [INFO] Successfully applied migration: 20251017200900_add_multiple_oidc_providers.sql +sparkyfitness-server | [2026-09-30T10:25:19.638Z] [INFO] Applying migration: 20251017204200_create_global_settings.sql +sparkyfitness-server | [2026-09-30T10:25:19.650Z] [INFO] Successfully applied migration: 20251017204200_create_global_settings.sql +sparkyfitness-server | [2026-09-30T10:25:19.650Z] [INFO] Applying migration: 20251018001151_add_bmr_and_bodyfat_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:19.661Z] [INFO] Successfully applied migration: 20251018001151_add_bmr_and_bodyfat_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:19.661Z] [INFO] Applying migration: 20251018223700_add_signing_alg_to_oidc_providers.sql +sparkyfitness-server | [2026-09-30T10:25:19.667Z] [INFO] Successfully applied migration: 20251018223700_add_signing_alg_to_oidc_providers.sql +sparkyfitness-server | [2026-09-30T10:25:19.667Z] [INFO] Applying migration: 20251019013200_merged_schema_and_data.sql +sparkyfitness-server | [2026-09-30T10:25:19.721Z] [INFO] Successfully applied migration: 20251019013200_merged_schema_and_data.sql +sparkyfitness-server | [2026-09-30T10:25:19.721Z] [INFO] Applying migration: 20251019013300_merged_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:25:19.770Z] [INFO] Successfully applied migration: 20251019013300_merged_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:25:19.770Z] [INFO] Applying migration: 20251019154515_update_rls_policies_for_shared_items.sql +sparkyfitness-server | [2026-09-30T10:25:19.779Z] [INFO] Successfully applied migration: 20251019154515_update_rls_policies_for_shared_items.sql +sparkyfitness-server | [2026-09-30T10:25:19.779Z] [INFO] Applying migration: 20251019203500_fix_rls_permissions_for_public_foods.sql +sparkyfitness-server | [2026-09-30T10:25:19.785Z] [INFO] Successfully applied migration: 20251019203500_fix_rls_permissions_for_public_foods.sql +sparkyfitness-server | [2026-09-30T10:25:19.785Z] [INFO] Applying migration: 20251019204000_correct_variant_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.795Z] [INFO] Successfully applied migration: 20251019204000_correct_variant_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.795Z] [INFO] Applying migration: 20251019212500_update_measurement_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:25:19.807Z] [INFO] Successfully applied migration: 20251019212500_update_measurement_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:25:19.807Z] [INFO] Applying migration: 20251019222100_add_audit_columns_to_measurements.sql +sparkyfitness-server | [2026-09-30T10:25:19.845Z] [INFO] Successfully applied migration: 20251019222100_add_audit_columns_to_measurements.sql +sparkyfitness-server | [2026-09-30T10:25:19.845Z] [INFO] Applying migration: 20251020001000_fix_family_access_insert_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.851Z] [INFO] Successfully applied migration: 20251020001000_fix_family_access_insert_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.851Z] [INFO] Applying migration: 20251020022000_set_default_shared_with_public.sql +sparkyfitness-server | [2026-09-30T10:25:19.857Z] [INFO] Successfully applied migration: 20251020022000_set_default_shared_with_public.sql +sparkyfitness-server | [2026-09-30T10:25:19.857Z] [INFO] Applying migration: 20251020022200_update_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:25:19.863Z] [INFO] Successfully applied migration: 20251020022200_update_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:25:19.863Z] [INFO] Applying migration: 20251020022500_fix_food_select_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.869Z] [INFO] Successfully applied migration: 20251020022500_fix_food_select_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.869Z] [INFO] Applying migration: 20251020030000_simplify_food_select_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.877Z] [INFO] Successfully applied migration: 20251020030000_simplify_food_select_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.878Z] [INFO] Applying migration: 20251020031000_update_food_select_policy_with_sharing.sql +sparkyfitness-server | [2026-09-30T10:25:19.883Z] [INFO] Successfully applied migration: 20251020031000_update_food_select_policy_with_sharing.sql +sparkyfitness-server | [2026-09-30T10:25:19.883Z] [INFO] Applying migration: 20251020032200_add_all_owner_centric_policies.sql +sparkyfitness-server | [2026-09-30T10:25:19.906Z] [INFO] Successfully applied migration: 20251020032200_add_all_owner_centric_policies.sql +sparkyfitness-server | [2026-09-30T10:25:19.906Z] [INFO] Applying migration: 20251020033400_add_food_variants_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.913Z] [INFO] Successfully applied migration: 20251020033400_add_food_variants_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.914Z] [INFO] Applying migration: 20251020033700_fix_food_variants_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.921Z] [INFO] Successfully applied migration: 20251020033700_fix_food_variants_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.921Z] [INFO] Applying migration: 20251020230839_fix_family_access_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:25:19.931Z] [INFO] Successfully applied migration: 20251020230839_fix_family_access_rls_policies.sql +sparkyfitness-server | [2026-09-30T10:25:19.931Z] [INFO] Applying migration: 20251021025423_restrict_family_access_select_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.939Z] [INFO] Successfully applied migration: 20251021025423_restrict_family_access_select_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.939Z] [INFO] Applying migration: 20251021034700_add_public_sharing_to_external_providers.sql +sparkyfitness-server | [2026-09-30T10:25:19.945Z] [INFO] Successfully applied migration: 20251021034700_add_public_sharing_to_external_providers.sql +sparkyfitness-server | [2026-09-30T10:25:19.945Z] [INFO] Applying migration: 20251022201000_fix_exercise_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.951Z] [INFO] Successfully applied migration: 20251022201000_fix_exercise_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.951Z] [INFO] Applying migration: 20251022203000_snapshot_exercise_details_in_entries.sql +sparkyfitness-server | [2026-09-30T10:25:19.962Z] [INFO] Successfully applied migration: 20251022203000_snapshot_exercise_details_in_entries.sql +sparkyfitness-server | [2026-09-30T10:25:19.962Z] [INFO] Applying migration: 20251023120500_update_external_providers_select_policy_for_public.sql +sparkyfitness-server | [2026-09-30T10:25:19.969Z] [INFO] Successfully applied migration: 20251023120500_update_external_providers_select_policy_for_public.sql +sparkyfitness-server | [2026-09-30T10:25:19.969Z] [INFO] Applying migration: 20251023221000_update_meals_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.976Z] [INFO] Successfully applied migration: 20251023221000_update_meals_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.976Z] [INFO] Applying migration: 20251023221500_update_meal_plan_template_assignments_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.986Z] [INFO] Successfully applied migration: 20251023221500_update_meal_plan_template_assignments_rls_policy.sql +sparkyfitness-server | [2026-09-30T10:25:19.986Z] [INFO] Applying migration: 20251023221501_add_meal_id_to_food_entries.sql +sparkyfitness-server | [2026-09-30T10:25:20.005Z] [INFO] Successfully applied migration: 20251023221501_add_meal_id_to_food_entries.sql +sparkyfitness-server | [2026-09-30T10:25:20.005Z] [INFO] Applying migration: 20251024230330_add_withings_fields_to_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:25:20.016Z] [INFO] Successfully applied migration: 20251024230330_add_withings_fields_to_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:25:20.017Z] [INFO] Applying migration: 20251025210900_add_source_to_custom_measurements.sql +sparkyfitness-server | [2026-09-30T10:25:20.033Z] [INFO] Successfully applied migration: 20251025210900_add_source_to_custom_measurements.sql +sparkyfitness-server | [2026-09-30T10:25:20.033Z] [INFO] Applying migration: 20251026125900_add_distance_and_hr_to_exercise_entries_activity_details.sql +sparkyfitness-server | [2026-09-30T10:25:20.065Z] [INFO] Successfully applied migration: 20251026125900_add_distance_and_hr_to_exercise_entries_activity_details.sql +sparkyfitness-server | [2026-09-30T10:25:20.065Z] [INFO] Applying migration: 202510310132_add_language_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:20.070Z] [INFO] Successfully applied migration: 202510310132_add_language_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:20.070Z] [INFO] Applying migration: 20251101151100_create_sleep_entries_table.sql +sparkyfitness-server | [2026-09-30T10:25:20.126Z] [INFO] Successfully applied migration: 20251101151100_create_sleep_entries_table.sql +sparkyfitness-server | [2026-09-30T10:25:20.126Z] [INFO] Applying migration: 20251103000000_add_onboarding_schema.sql +sparkyfitness-server | [2026-09-30T10:25:20.165Z] [INFO] Successfully applied migration: 20251103000000_add_onboarding_schema.sql +sparkyfitness-server | [2026-09-30T10:25:20.165Z] [INFO] Applying migration: 20251112000000_add_display_name_to_custom_categories.sql +sparkyfitness-server | [2026-09-30T10:25:20.171Z] [INFO] Successfully applied migration: 20251112000000_add_display_name_to_custom_categories.sql +sparkyfitness-server | [2026-09-30T10:25:20.171Z] [INFO] Applying migration: 20251114205134_create_exercise_preset_entries_table.sql +sparkyfitness-server | [2026-09-30T10:25:20.215Z] [INFO] Successfully applied migration: 20251114205134_create_exercise_preset_entries_table.sql +sparkyfitness-server | [2026-09-30T10:25:20.215Z] [INFO] Applying migration: 20251115003147_add_source_to_exercise_preset_entries.sql +sparkyfitness-server | [2026-09-30T10:25:20.220Z] [INFO] Successfully applied migration: 20251115003147_add_source_to_exercise_preset_entries.sql +sparkyfitness-server | [2026-09-30T10:25:20.220Z] [INFO] Applying migration: 20251115003301_add_exercise_preset_entry_id_to_activity_details.sql +sparkyfitness-server | [2026-09-30T10:25:20.227Z] [INFO] Successfully applied migration: 20251115003301_add_exercise_preset_entry_id_to_activity_details.sql +sparkyfitness-server | [2026-09-30T10:25:20.227Z] [INFO] Applying migration: 20251115004027_alter_exercise_entry_id_nullable_in_activity_details.sql +sparkyfitness-server | [2026-09-30T10:25:20.232Z] [INFO] Successfully applied migration: 20251115004027_alter_exercise_entry_id_nullable_in_activity_details.sql +sparkyfitness-server | [2026-09-30T10:25:20.232Z] [INFO] Applying migration: 20251120011100_add_mfa_magic_link_columns.sql +sparkyfitness-server | [2026-09-30T10:25:20.250Z] [INFO] Successfully applied migration: 20251120011100_add_mfa_magic_link_columns.sql +sparkyfitness-server | [2026-09-30T10:25:20.250Z] [INFO] Applying migration: 20251121011500_add_email_mfa_columns_to_users.sql +sparkyfitness-server | [2026-09-30T10:25:20.255Z] [INFO] Successfully applied migration: 20251121011500_add_email_mfa_columns_to_users.sql +sparkyfitness-server | [2026-09-30T10:25:20.256Z] [INFO] Applying migration: 202511220110_add_default_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:25:20.267Z] [INFO] Successfully applied migration: 202511220110_add_default_external_data_providers.sql +sparkyfitness-server | [2026-09-30T10:25:20.267Z] [INFO] Applying migration: 202511232110_delete_raw_stress_data_categories.sql +sparkyfitness-server | [2026-09-30T10:25:20.271Z] [INFO] Successfully applied migration: 202511232110_delete_raw_stress_data_categories.sql +sparkyfitness-server | [2026-09-30T10:25:20.272Z] [INFO] Applying migration: 202511270109_add_calorie_goal_adjustment_mode_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:20.277Z] [INFO] Successfully applied migration: 202511270109_add_calorie_goal_adjustment_mode_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:20.277Z] [INFO] Applying migration: 20251127194107_create_food_entry_meals_and_link_food_entries.sql +sparkyfitness-server | [2026-09-30T10:25:20.318Z] [INFO] Successfully applied migration: 20251127194107_create_food_entry_meals_and_link_food_entries.sql +sparkyfitness-server | [2026-09-30T10:25:20.318Z] [INFO] Applying migration: 20251127194108_migrate_aggregated_food_entries_to_food_entry_meals.sql +sparkyfitness-server | [2026-09-30T10:25:20.329Z] [INFO] Successfully applied migration: 20251127194108_migrate_aggregated_food_entries_to_food_entry_meals.sql +sparkyfitness-server | [2026-09-30T10:25:20.329Z] [INFO] Applying migration: 20251128030115_add_tandoor_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:20.335Z] [INFO] Successfully applied migration: 20251128030115_add_tandoor_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:20.335Z] [INFO] Applying migration: 20251205000000_add_energy_unit_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:20.341Z] [INFO] Successfully applied migration: 20251205000000_add_energy_unit_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:20.341Z] [INFO] Applying migration: 20251206000000_add_nutrient_calculation_algorithms.sql +sparkyfitness-server | [2026-09-30T10:25:20.349Z] [INFO] Successfully applied migration: 20251206000000_add_nutrient_calculation_algorithms.sql +sparkyfitness-server | [2026-09-30T10:25:20.350Z] [INFO] Applying migration: 20251206000001_add_serving_size_to_meals.sql +sparkyfitness-server | [2026-09-30T10:25:20.357Z] [INFO] Successfully applied migration: 20251206000001_add_serving_size_to_meals.sql +sparkyfitness-server | [2026-09-30T10:25:20.357Z] [INFO] Applying migration: 20251207000001_add_default_meal_quantity.sql +sparkyfitness-server | [2026-09-30T10:25:20.361Z] [INFO] Successfully applied migration: 20251207000001_add_default_meal_quantity.sql +sparkyfitness-server | [2026-09-30T10:25:20.361Z] [INFO] Applying migration: 20251215005329_add_usda_to_provider_type_check.sql +sparkyfitness-server | [2026-09-30T10:25:20.366Z] [INFO] Successfully applied migration: 20251215005329_add_usda_to_provider_type_check.sql +sparkyfitness-server | [2026-09-30T10:25:20.366Z] [INFO] Applying migration: 20251221000000_create_fasting_logs.sql +sparkyfitness-server | [2026-09-30T10:25:20.384Z] [INFO] Successfully applied migration: 20251221000000_create_fasting_logs.sql +sparkyfitness-server | [2026-09-30T10:25:20.384Z] [INFO] Applying migration: 20251221010000_drop_mood_weight_from_fasting_logs.sql +sparkyfitness-server | [2026-09-30T10:25:20.391Z] [INFO] Successfully applied migration: 20251221010000_drop_mood_weight_from_fasting_logs.sql +sparkyfitness-server | [2026-09-30T10:25:20.391Z] [INFO] Applying migration: 20251226150700_add_mobile_health_data_features.sql +sparkyfitness-server | [2026-09-30T10:25:20.403Z] [INFO] Successfully applied migration: 20251226150700_add_mobile_health_data_features.sql +sparkyfitness-server | [2026-09-30T10:25:20.403Z] [INFO] Applying migration: 20251228000000_add_custom_nutrients_tables.sql +sparkyfitness-server | [2026-09-30T10:25:20.427Z] [INFO] Successfully applied migration: 20251228000000_add_custom_nutrients_tables.sql +sparkyfitness-server | [2026-09-30T10:25:20.427Z] [INFO] Applying migration: 20252317234000_add_is_quick_exercise_to_exercises.sql +sparkyfitness-server | [2026-09-30T10:25:20.437Z] [INFO] Successfully applied migration: 20252317234000_add_is_quick_exercise_to_exercises.sql +sparkyfitness-server | [2026-09-30T10:25:20.437Z] [INFO] Applying migration: 20260105000000_add_auto_scale_open_food_facts_imports.sql +sparkyfitness-server | [2026-09-30T10:25:20.442Z] [INFO] Successfully applied migration: 20260105000000_add_auto_scale_open_food_facts_imports.sql +sparkyfitness-server | [2026-09-30T10:25:20.442Z] [INFO] Applying migration: 20260108010449_add_cascading_delete_to_check_in_measurements.sql +sparkyfitness-server | [2026-09-30T10:25:20.452Z] [INFO] Successfully applied migration: 20260108010449_add_cascading_delete_to_check_in_measurements.sql +sparkyfitness-server | [2026-09-30T10:25:20.452Z] [INFO] Applying migration: 20260108011953_add_cascading_delete_to_food_entries.sql +sparkyfitness-server | [2026-09-30T10:25:20.463Z] [INFO] Successfully applied migration: 20260108011953_add_cascading_delete_to_food_entries.sql +sparkyfitness-server | [2026-09-30T10:25:20.463Z] [INFO] Applying migration: 20260108012051_add_comprehensive_cascading_deletes.sql +sparkyfitness-server | [2026-09-30T10:25:20.517Z] [INFO] Successfully applied migration: 20260108012051_add_comprehensive_cascading_deletes.sql +sparkyfitness-server | [2026-09-30T10:25:20.517Z] [INFO] Applying migration: 20260108223108_alter_water_goal_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:25:20.542Z] [INFO] Successfully applied migration: 20260108223108_alter_water_goal_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:25:20.542Z] [INFO] Applying migration: 20260111180656_custom_meal_feature.sql +sparkyfitness-server | [2026-09-30T10:25:20.616Z] [INFO] Successfully applied migration: 20260111180656_custom_meal_feature.sql +sparkyfitness-server | [2026-09-30T10:25:20.616Z] [INFO] Applying migration: 20260122201500_refactor_provider_type_to_lookup_table.sql +sparkyfitness-server | [2026-09-30T10:25:20.639Z] [INFO] Successfully applied migration: 20260122201500_refactor_provider_type_to_lookup_table.sql +sparkyfitness-server | [2026-09-30T10:25:20.639Z] [INFO] Applying migration: 20260123115500_add_privacy_flag_to_provider_types.sql +sparkyfitness-server | [2026-09-30T10:25:20.645Z] [INFO] Successfully applied migration: 20260123115500_add_privacy_flag_to_provider_types.sql +sparkyfitness-server | [2026-09-30T10:25:20.645Z] [INFO] Applying migration: 20260125000000_better_auth_migration.sql +sparkyfitness-server | [2026-09-30T10:25:21.006Z] [INFO] Successfully applied migration: 20260125000000_better_auth_migration.sql +sparkyfitness-server | [2026-09-30T10:25:21.006Z] [INFO] Applying migration: 20260127040000_family_access_audit_fix.sql +sparkyfitness-server | [2026-09-30T10:25:21.049Z] [INFO] Successfully applied migration: 20260127040000_family_access_audit_fix.sql +sparkyfitness-server | [2026-09-30T10:25:21.049Z] [INFO] Applying migration: 202601280001_add_show_hide_to_meals.sql +sparkyfitness-server | [2026-09-30T10:25:21.067Z] [INFO] Successfully applied migration: 202601280001_add_show_hide_to_meals.sql +sparkyfitness-server | [2026-09-30T10:25:21.067Z] [INFO] Applying migration: 20260201121400_add_api_key_table.sql +sparkyfitness-server | [2026-09-30T10:25:21.100Z] [INFO] Successfully applied migration: 20260201121400_add_api_key_table.sql +sparkyfitness-server | [2026-09-30T10:25:21.100Z] [INFO] Applying migration: 20260201184000_add_missing_api_key_columns.sql +sparkyfitness-server | [2026-09-30T10:25:21.112Z] [INFO] Successfully applied migration: 20260201184000_add_missing_api_key_columns.sql +sparkyfitness-server | [2026-09-30T10:25:21.112Z] [INFO] Applying migration: 20260202023713_add_oidc_config_to_sso_provider.sql +sparkyfitness-server | [2026-09-30T10:25:21.117Z] [INFO] Successfully applied migration: 20260202023713_add_oidc_config_to_sso_provider.sql +sparkyfitness-server | [2026-09-30T10:25:21.117Z] [INFO] Applying migration: 20260205200200_add_exercise_sorting.sql +sparkyfitness-server | [2026-09-30T10:25:21.140Z] [INFO] Successfully applied migration: 20260205200200_add_exercise_sorting.sql +sparkyfitness-server | [2026-09-30T10:25:21.141Z] [INFO] Applying migration: 20260206132000_ensure_first_user_is_admin.sql +sparkyfitness-server | [2026-09-30T10:25:21.145Z] [INFO] Successfully applied migration: 20260206132000_ensure_first_user_is_admin.sql +sparkyfitness-server | [2026-09-30T10:25:21.146Z] [INFO] Applying migration: 20260206215500_add_mfa_totp_enabled_column.sql +sparkyfitness-server | [2026-09-30T10:25:21.167Z] [INFO] Successfully applied migration: 20260206215500_add_mfa_totp_enabled_column.sql +sparkyfitness-server | [2026-09-30T10:25:21.167Z] [INFO] Applying migration: 20260207110000_mfa_triggers.sql +sparkyfitness-server | [2026-09-30T10:25:21.175Z] [INFO] Successfully applied migration: 20260207110000_mfa_triggers.sql +sparkyfitness-server | [2026-09-30T10:25:21.176Z] [INFO] Applying migration: 20260208120000_fix_api_key_rate_limit_defaults.sql +sparkyfitness-server | [2026-09-30T10:25:21.183Z] [INFO] Successfully applied migration: 20260208120000_fix_api_key_rate_limit_defaults.sql +sparkyfitness-server | [2026-09-30T10:25:21.183Z] [INFO] Applying migration: 20260208194543_fix_user_meal_visibilities_fkey.sql +sparkyfitness-server | [2026-09-30T10:25:21.192Z] [INFO] Successfully applied migration: 20260208194543_fix_user_meal_visibilities_fkey.sql +sparkyfitness-server | [2026-09-30T10:25:21.192Z] [INFO] Applying migration: 20260208_fix_user_creation_trigger.sql +sparkyfitness-server | [2026-09-30T10:25:21.198Z] [INFO] Successfully applied migration: 20260208_fix_user_creation_trigger.sql +sparkyfitness-server | [2026-09-30T10:25:21.198Z] [INFO] Applying migration: 20260214223000_add_polar_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:21.209Z] [INFO] Successfully applied migration: 20260214223000_add_polar_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:21.209Z] [INFO] Applying migration: 20260215144500_add_hevy_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:21.219Z] [INFO] Successfully applied migration: 20260215144500_add_hevy_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:21.219Z] [INFO] Applying migration: 20260216012235_add_global_ai_settings.sql +sparkyfitness-server | [2026-09-30T10:25:21.240Z] [INFO] Successfully applied migration: 20260216012235_add_global_ai_settings.sql +sparkyfitness-server | [2026-09-30T10:25:21.240Z] [INFO] Applying migration: 20260216020134_add_allow_user_ai_config.sql +sparkyfitness-server | [2026-09-30T10:25:21.246Z] [INFO] Successfully applied migration: 20260216020134_add_allow_user_ai_config.sql +sparkyfitness-server | [2026-09-30T10:25:21.246Z] [INFO] Applying migration: 20260216030000_rename_is_global_to_is_public.sql +sparkyfitness-server | [2026-09-30T10:25:21.268Z] [INFO] Successfully applied migration: 20260216030000_rename_is_global_to_is_public.sql +sparkyfitness-server | [2026-09-30T10:25:21.268Z] [INFO] Applying migration: 20260216140000_add_custom_nutrients_to_goals_and_presets.sql +sparkyfitness-server | [2026-09-30T10:25:21.275Z] [INFO] Successfully applied migration: 20260216140000_add_custom_nutrients_to_goals_and_presets.sql +sparkyfitness-server | [2026-09-30T10:25:21.275Z] [INFO] Applying migration: 20260216195500_prune_empty_custom_nutrients.sql +sparkyfitness-server | [2026-09-30T10:25:21.281Z] [INFO] Successfully applied migration: 20260216195500_prune_empty_custom_nutrients.sql +sparkyfitness-server | [2026-09-30T10:25:21.281Z] [INFO] Applying migration: 20260221210000_oidc_config_jsonb.sql +sparkyfitness-server | [2026-09-30T10:25:21.310Z] [INFO] Successfully applied migration: 20260221210000_oidc_config_jsonb.sql +sparkyfitness-server | [2026-09-30T10:25:21.310Z] [INFO] Applying migration: 20260222100000_add_strava_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:21.315Z] [INFO] Successfully applied migration: 20260222100000_add_strava_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:21.315Z] [INFO] Applying migration: 20260224000000_add_sleep_science.sql +sparkyfitness-server | [2026-09-30T10:25:21.379Z] [INFO] Successfully applied migration: 20260224000000_add_sleep_science.sql +sparkyfitness-server | [2026-09-30T10:25:21.379Z] [INFO] Applying migration: 20260224120000_add_show_in_quick_log_to_meal_visibilities.sql +sparkyfitness-server | [2026-09-30T10:25:21.385Z] [INFO] Successfully applied migration: 20260224120000_add_show_in_quick_log_to_meal_visibilities.sql +sparkyfitness-server | [2026-09-30T10:25:21.385Z] [INFO] Applying migration: 20260226000000_add_exercise_calorie_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:21.393Z] [INFO] Successfully applied migration: 20260226000000_add_exercise_calorie_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:21.393Z] [INFO] Applying migration: 20260228120000_fix_sleep_entry_date_to_wake_up_date.sql +sparkyfitness-server | [2026-09-30T10:25:21.400Z] [INFO] Successfully applied migration: 20260228120000_fix_sleep_entry_date_to_wake_up_date.sql +sparkyfitness-server | [2026-09-30T10:25:21.400Z] [INFO] Applying migration: 20260302000000_add_default_barcode_provider_id.sql +sparkyfitness-server | [2026-09-30T10:25:21.414Z] [INFO] Successfully applied migration: 20260302000000_add_default_barcode_provider_id.sql +sparkyfitness-server | [2026-09-30T10:25:21.414Z] [INFO] Applying migration: 20260302120000_normalize_barcodes.sql +sparkyfitness-server | [2026-09-30T10:25:21.417Z] [INFO] Successfully applied migration: 20260302120000_normalize_barcodes.sql +sparkyfitness-server | [2026-09-30T10:25:21.418Z] [INFO] Applying migration: 20260313100000_add_source_to_water_intake.sql +sparkyfitness-server | [2026-09-30T10:25:21.444Z] [INFO] Successfully applied migration: 20260313100000_add_source_to_water_intake.sql +sparkyfitness-server | [2026-09-30T10:25:21.444Z] [INFO] Applying migration: 20260314175000_add_image_to_user_table.sql +sparkyfitness-server | [2026-09-30T10:25:21.448Z] [INFO] Successfully applied migration: 20260314175000_add_image_to_user_table.sql +sparkyfitness-server | [2026-09-30T10:25:21.448Z] [INFO] Applying migration: 20260315192200_fix_oidc_config_keys.sql +sparkyfitness-server | [2026-09-30T10:25:21.452Z] [INFO] Successfully applied migration: 20260315192200_fix_oidc_config_keys.sql +sparkyfitness-server | [2026-09-30T10:25:21.452Z] [INFO] Applying migration: 20260315200000_better_auth_1_5_upgrade.sql +sparkyfitness-server | [2026-09-30T10:25:21.457Z] [INFO] Successfully applied migration: 20260315200000_better_auth_1_5_upgrade.sql +sparkyfitness-server | [2026-09-30T10:25:21.457Z] [INFO] Applying migration: 20260321000000_add_auto_scale_online_imports.sql +sparkyfitness-server | [2026-09-30T10:25:21.463Z] [INFO] Successfully applied migration: 20260321000000_add_auto_scale_online_imports.sql +sparkyfitness-server | [2026-09-30T10:25:21.463Z] [INFO] Applying migration: 20260322130000_mfa_better_auth_optimization.sql +sparkyfitness-server | [2026-09-30T10:25:21.470Z] [INFO] Successfully applied migration: 20260322130000_mfa_better_auth_optimization.sql +sparkyfitness-server | [2026-09-30T10:25:21.470Z] [INFO] Applying migration: 20260322141500_mfa_triggers_sync_fix.sql +sparkyfitness-server | [2026-09-30T10:25:21.476Z] [INFO] Successfully applied migration: 20260322141500_mfa_triggers_sync_fix.sql +sparkyfitness-server | [2026-09-30T10:25:21.476Z] [INFO] Applying migration: 20260322154230_add_first_day_of_week_to_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:21.481Z] [INFO] Successfully applied migration: 20260322154230_add_first_day_of_week_to_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:21.481Z] [INFO] Applying migration: 20260323122741_add_steps_column.sql +sparkyfitness-server | [2026-09-30T10:25:21.486Z] [INFO] Successfully applied migration: 20260323122741_add_steps_column.sql +sparkyfitness-server | [2026-09-30T10:25:21.486Z] [INFO] Applying migration: 20260328120000_add_timezone_check_constraint.sql +sparkyfitness-server | [2026-09-30T10:25:21.495Z] [INFO] Successfully applied migration: 20260328120000_add_timezone_check_constraint.sql +sparkyfitness-server | [2026-09-30T10:25:21.495Z] [INFO] Applying migration: 20260406120000_add_barcode_fallback_open_food_facts.sql +sparkyfitness-server | [2026-09-30T10:25:21.500Z] [INFO] Successfully applied migration: 20260406120000_add_barcode_fallback_open_food_facts.sql +sparkyfitness-server | [2026-09-30T10:25:21.500Z] [INFO] Applying migration: 20260420230132_scope_exercises_source_unique_to_user.sql +sparkyfitness-server | [2026-09-30T10:25:21.510Z] [INFO] Successfully applied migration: 20260420230132_scope_exercises_source_unique_to_user.sql +sparkyfitness-server | [2026-09-30T10:25:21.510Z] [INFO] Applying migration: 20260423120000_sleep_entry_stages_unique_natural_key.sql +sparkyfitness-server | [2026-09-30T10:25:21.520Z] [INFO] Successfully applied migration: 20260423120000_sleep_entry_stages_unique_natural_key.sql +sparkyfitness-server | [2026-09-30T10:25:21.520Z] [INFO] Applying migration: 20260426120000_provider_sort_order.sql +sparkyfitness-server | [2026-09-30T10:25:21.526Z] [INFO] Successfully applied migration: 20260426120000_provider_sort_order.sql +sparkyfitness-server | [2026-09-30T10:25:21.526Z] [INFO] Applying migration: 20260426120001_custom_meal_percentages.sql +sparkyfitness-server | [2026-09-30T10:25:21.534Z] [INFO] Successfully applied migration: 20260426120001_custom_meal_percentages.sql +sparkyfitness-server | [2026-09-30T10:25:21.534Z] [INFO] Applying migration: 20260509120000_add_water_intake_entries.sql +sparkyfitness-server | [2026-09-30T10:25:21.555Z] [INFO] Successfully applied migration: 20260509120000_add_water_intake_entries.sql +sparkyfitness-server | [2026-09-30T10:25:21.555Z] [INFO] Applying migration: 20260515120000_add_show_net_carbs_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:21.564Z] [INFO] Successfully applied migration: 20260515120000_add_show_net_carbs_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:21.565Z] [INFO] Applying migration: 20260515174155_serving_size_model.sql +sparkyfitness-server | [2026-09-30T10:25:21.572Z] [INFO] Successfully applied migration: 20260515174155_serving_size_model.sql +sparkyfitness-server | [2026-09-30T10:25:21.573Z] [INFO] Applying migration: 20260523120000_ai_assisted_conversions.sql +sparkyfitness-server | [2026-09-30T10:25:21.583Z] [INFO] Successfully applied migration: 20260523120000_ai_assisted_conversions.sql +sparkyfitness-server | [2026-09-30T10:25:21.583Z] [INFO] Applying migration: 20260527120000_add_allergen_tracking.sql +sparkyfitness-server | [2026-09-30T10:25:21.607Z] [INFO] Successfully applied migration: 20260527120000_add_allergen_tracking.sql +sparkyfitness-server | [2026-09-30T10:25:21.607Z] [INFO] Applying migration: 20260529140000_add_multimodal_support_to_chat_history.sql +sparkyfitness-server | [2026-09-30T10:25:21.612Z] [INFO] Successfully applied migration: 20260529140000_add_multimodal_support_to_chat_history.sql +sparkyfitness-server | [2026-09-30T10:25:21.612Z] [INFO] Applying migration: 20260531120000_add_nutrition_snapshot_to_meal_foods.sql +sparkyfitness-server | [2026-09-30T10:25:21.624Z] [INFO] Successfully applied migration: 20260531120000_add_nutrition_snapshot_to_meal_foods.sql +sparkyfitness-server | [2026-09-30T10:25:21.624Z] [INFO] Applying migration: 20260531120000_add_source_to_food_entries.sql +sparkyfitness-server | [2026-09-30T10:25:21.637Z] [INFO] Successfully applied migration: 20260531120000_add_source_to_food_entries.sql +sparkyfitness-server | [2026-09-30T10:25:21.637Z] [INFO] Applying migration: 20260604120000_add_checkin_mood_unique_indexes.sql +sparkyfitness-server | [2026-09-30T10:25:21.654Z] [INFO] Successfully applied migration: 20260604120000_add_checkin_mood_unique_indexes.sql +sparkyfitness-server | [2026-09-30T10:25:21.655Z] [INFO] Applying migration: 20260604120600_add_user_last_login_at.sql +sparkyfitness-server | [2026-09-30T10:25:21.662Z] [INFO] Successfully applied migration: 20260604120600_add_user_last_login_at.sql +sparkyfitness-server | [2026-09-30T10:25:21.662Z] [INFO] Applying migration: 20260606132000_add_yazio_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:21.666Z] [INFO] Successfully applied migration: 20260606132000_add_yazio_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:21.666Z] [INFO] Applying migration: 20260606164200_add_norish_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:21.671Z] [INFO] Successfully applied migration: 20260606164200_add_norish_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:21.671Z] [INFO] Applying migration: 20260607000000_add_googlehealth_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:21.677Z] [INFO] Successfully applied migration: 20260607000000_add_googlehealth_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:21.677Z] [INFO] Applying migration: 20260607114000_add_swissfood_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:21.683Z] [INFO] Successfully applied migration: 20260607114000_add_swissfood_provider_type.sql +sparkyfitness-server | [2026-09-30T10:25:21.683Z] [INFO] Applying migration: 20260610120000_add_garmin_nutrition_index.sql +sparkyfitness-server | [2026-09-30T10:25:21.692Z] [INFO] Successfully applied migration: 20260610120000_add_garmin_nutrition_index.sql +sparkyfitness-server | [2026-09-30T10:25:21.692Z] [INFO] Applying migration: 20260612120000_add_use_external_bmr_preference.sql +sparkyfitness-server | [2026-09-30T10:25:21.699Z] [INFO] Successfully applied migration: 20260612120000_add_use_external_bmr_preference.sql +sparkyfitness-server | [2026-09-30T10:25:21.699Z] [INFO] Applying migration: 20260612153000_add_goal_mode_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:21.707Z] [INFO] Successfully applied migration: 20260612153000_add_goal_mode_to_user_preferences.sql +sparkyfitness-server | [2026-09-30T10:25:21.707Z] [INFO] Applying migration: 20260614000000_add_checkin_photos.sql +sparkyfitness-server | [2026-09-30T10:25:21.742Z] [INFO] Successfully applied migration: 20260614000000_add_checkin_photos.sql +sparkyfitness-server | [2026-09-30T10:25:21.742Z] [INFO] Applying migration: 20260618000000_remove_superuser_extensions.sql +sparkyfitness-server | [2026-09-30T10:25:21.760Z] [INFO] Successfully applied migration: 20260618000000_remove_superuser_extensions.sql +sparkyfitness-server | [2026-09-30T10:25:21.760Z] [INFO] Applying migration: 20260620143300_public_sharing_and_dynamic_provider_types.sql +sparkyfitness-server | [2026-09-30T10:25:21.789Z] [INFO] Successfully applied migration: 20260620143300_public_sharing_and_dynamic_provider_types.sql +sparkyfitness-server | [2026-09-30T10:25:21.789Z] [INFO] Applying migration: 20260621000000_create_user_dashboard_layouts.sql +sparkyfitness-server | [2026-09-30T10:25:21.812Z] [INFO] Successfully applied migration: 20260621000000_create_user_dashboard_layouts.sql +sparkyfitness-server | [2026-09-30T10:25:21.812Z] [INFO] Applying migration: 20260622120000_add_water_estimated_to_exercise_entries.sql +sparkyfitness-server | [2026-09-30T10:25:21.820Z] [INFO] Successfully applied migration: 20260622120000_add_water_estimated_to_exercise_entries.sql +sparkyfitness-server | [2026-09-30T10:25:21.820Z] [INFO] Applying migration: 20260623000000_add_measurement_decimal_places.sql +sparkyfitness-server | [2026-09-30T10:25:21.826Z] [INFO] Successfully applied migration: 20260623000000_add_measurement_decimal_places.sql +sparkyfitness-server | [2026-09-30T10:25:21.826Z] [INFO] Applying migration: 20260624000000_add_medication_glp1_schema.sql +sparkyfitness-server | [2026-09-30T10:25:22.112Z] [INFO] Successfully applied migration: 20260624000000_add_medication_glp1_schema.sql +sparkyfitness-server | [2026-09-30T10:25:22.112Z] [INFO] Applying migration: 20260625000000_add_chat_tool_profile_to_ai_service_settings.sql +sparkyfitness-server | [2026-09-30T10:25:22.117Z] [INFO] Successfully applied migration: 20260625000000_add_chat_tool_profile_to_ai_service_settings.sql +sparkyfitness-server | [2026-09-30T10:25:22.118Z] [INFO] Applying migration: 20260628000000_convert_exercise_durations_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:25:22.175Z] [INFO] Successfully applied migration: 20260628000000_convert_exercise_durations_to_numeric.sql +sparkyfitness-server | [2026-09-30T10:25:22.175Z] [INFO] Applying migration: 20260628120000_add_vision_ai_service_pointers.sql +sparkyfitness-server | [2026-09-30T10:25:22.183Z] [INFO] Successfully applied migration: 20260628120000_add_vision_ai_service_pointers.sql +sparkyfitness-server | [2026-09-30T10:25:22.183Z] [INFO] Applying migration: 20260630000000_add_custom_nutrient_aliases.sql +sparkyfitness-server | [2026-09-30T10:25:22.188Z] [INFO] Successfully applied migration: 20260630000000_add_custom_nutrient_aliases.sql +sparkyfitness-server | [2026-09-30T10:25:22.188Z] [INFO] Applying migration: 20260630000000_add_onboarding_skipped.sql +sparkyfitness-server | [2026-09-30T10:25:22.193Z] [INFO] Successfully applied migration: 20260630000000_add_onboarding_skipped.sql +sparkyfitness-server | [2026-09-30T10:25:22.193Z] [INFO] Applying migration: 20260701000000_add_child_meal_to_meal_foods.sql +sparkyfitness-server | [2026-09-30T10:25:22.209Z] [INFO] Successfully applied migration: 20260701000000_add_child_meal_to_meal_foods.sql +sparkyfitness-server | [2026-09-30T10:25:22.210Z] [INFO] Applying migration: 20260702180000_add_cycle_tracking_schema.sql +sparkyfitness-server | [2026-09-30T10:25:22.535Z] [INFO] Successfully applied migration: 20260702180000_add_cycle_tracking_schema.sql +sparkyfitness-server | [2026-09-30T10:25:22.535Z] [INFO] Applying migration: 20260705000000_fix_googlehealth_sleep_date_anchor.sql +sparkyfitness-server | [2026-09-30T10:25:22.541Z] [INFO] Successfully applied migration: 20260705000000_fix_googlehealth_sleep_date_anchor.sql +sparkyfitness-server | [2026-09-30T10:25:22.559Z] [INFO] Ensuring permissions for role: "sparkyapp" +sparkyfitness-server | [2026-09-30T10:25:22.615Z] [INFO] Successfully ensured permissions for role: "sparkyapp" +sparkyfitness-server | [2026-09-30T10:25:22.616Z] [INFO] Permissions granted to application user. +sparkyfitness-server | [2026-09-30T10:25:22.617Z] [INFO] Applying all RLS policies from rls_policies.sql... +sparkyfitness-server | [2026-09-30T10:25:22.762Z] [INFO] Successfully applied all RLS policies. +sparkyfitness-server | [AUTH] Starting Better Auth mounting phase... +sparkyfitness-server | [AUTH] Better Auth handler successfully mounted. +sparkyfitness-server | [AUTH] Synced trusted SSO providers for auto-linking: [] +sparkyfitness-server | DEBUG: Server started and listening on port 3010 +sparkyfitness-server | [2026-09-30T10:25:22.821Z] [INFO] SparkyFitnessServer listening on port 3010 +sparkyfitness-server | View API documentation at: /api/api-docs/swagger +sparkyfitness-server | [2026-09-30T10:25:22.823Z] [INFO] No backup settings found, creating default entry. +sparkyfitness-server | [2026-09-30T10:25:22.827Z] [INFO] [CRON] Scheduled backups disabled — skipping schedule +sparkyfitness-server | [2026-09-30T10:25:36.313Z] [INFO] Incoming request: GET /api/health (Path: /api/health) +sparkyfitness-server | [2026-09-30T10:26:06.439Z] [INFO] Incoming request: GET /api/health (Path: /api/health) +sparkyfitness-server | [2026-09-30T10:26:08.202Z] [INFO] Incoming request: GET /api/health (Path: /api/health) +sparkyfitness-server | [2026-09-30T10:26:08.429Z] [INFO] [AUTH] Hook: User created, initializing Sparky data for 5d8caf65-1f5e-4186-ac04-02f096ab614f +sparkyfitness-server | [2026-09-30T10:26:08.482Z] [INFO] [AUTH] Hook: Initialization complete for 5d8caf65-1f5e-4186-ac04-02f096ab614f +sparkyfitness-server | [2026-09-30T10:26:08.482Z] [INFO] [AUTH] Hook: Session created for user 5d8caf65-1f5e-4186-ac04-02f096ab614f. Updating last login and checking group sync. +sparkyfitness-server | [2026-09-30T10:26:08.640Z] [INFO] [AUTH] Hook: Session created for user 5d8caf65-1f5e-4186-ac04-02f096ab614f. Updating last login and checking group sync. +sparkyfitness-server | [2026-09-30T10:26:08.681Z] [INFO] Incoming request: POST /api/measurements/check-in (Path: /api/measurements/check-in) +sparkyfitness-server | Incoming measurements: { weight: 73.36 } +sparkyfitness-server | 2026-09-30T10:26:08.871Z ERROR [Better Auth]: Invalid password +sparkyfitness-server | [2026-09-30T10:26:09.016Z] [INFO] [AUTH] Hook: Session created for user 5d8caf65-1f5e-4186-ac04-02f096ab614f. Updating last login and checking group sync. +sparkyfitness-server | [2026-09-30T10:26:09.055Z] [INFO] Incoming request: GET /api/measurements/check-in/1999-01-01 (Path: /api/measurements/check-in/1999-01-01) +sparkyfitness-server | [2026-09-30T10:26:09.114Z] [INFO] Incoming request: GET /api/measurements/check-in/2026-09-01 (Path: /api/measurements/check-in/2026-09-01) +sparkyfitness-server | [2026-09-30T10:26:09.698Z] [INFO] SIGTERM received, shutting down gracefully... +sparkyfitness-server | [2026-09-30T10:26:09.698Z] [INFO] HTTP server closed, draining database pools... +sparkyfitness-server | [2026-09-30T10:26:09.698Z] [INFO] Ending existing owner database connection pool... +sparkyfitness-server | [2026-09-30T10:26:09.699Z] [INFO] Existing owner database connection pool ended. +sparkyfitness-server | [2026-09-30T10:26:09.699Z] [INFO] Ending existing app database connection pool... +sparkyfitness-server | [2026-09-30T10:26:09.699Z] [INFO] Existing app database connection pool ended. +sparkyfitness-server | [2026-09-30T10:26:09.699Z] [INFO] Database pools closed. Exiting. +sparkyfitness-server | [dotenv@17.3.1] injecting env (0) from ../.env -- tip: ⚙️ suppress all logs with { quiet: true } +sparkyfitness-server | [Secrets] Checking for secret files to load... +sparkyfitness-server | [Secrets] No secrets loaded from files. +sparkyfitness-server | [2026-09-30T10:26:26.892Z] [INFO] Environment variable pre-flight checks passed successfully. +sparkyfitness-server | Starting server... +sparkyfitness-server | [2026-09-30T10:26:34.223Z] [INFO] [withingsService] Withings data source configured to: withings +sparkyfitness-server | [2026-09-30T10:26:34.225Z] [INFO] [fitbitService] Fitbit data source configured to: fitbit +sparkyfitness-server | [2026-09-30T10:26:34.226Z] [INFO] [googleHealthService] Google Health data source: googlehealth +sparkyfitness-server | [2026-09-30T10:26:34.227Z] [INFO] [polarService] Polar data source configured to: polar +sparkyfitness-server | [2026-09-30T10:26:34.227Z] [INFO] [stravaService] Strava data source configured to: strava +sparkyfitness-server | [2026-09-30T10:26:34.228Z] [INFO] [hevyService] Hevy data source configured to: hevy +sparkyfitness-server | [2026-09-30T10:26:34.879Z] [INFO] UserProfileRoutes UPLOADS_DIR: /app/SparkyFitnessServer/uploads/avatars +sparkyfitness-server | DEBUG: SPARKY_FITNESS_FRONTEND_URL is: https://sparky.gate.invalid +sparkyfitness-server | [SECURITY] Private network CORS is ENABLED. Ensure this is only on self-hosted/private networks. +sparkyfitness-server | SparkyFitnessServer UPLOADS_BASE_DIR: /app/SparkyFitnessServer/uploads +sparkyfitness-server | [2026-09-30T10:26:35.003Z] [INFO] Ensured temporary upload directory exists: /app/SparkyFitnessServer/temp_uploads/ +sparkyfitness-server | [2026-09-30T10:26:35.047Z] [INFO] Role "sparkyapp" already exists. +sparkyfitness-server | [2026-09-30T10:26:35.050Z] [INFO] Ensured schema_migrations table exists. +sparkyfitness-server | [2026-09-30T10:26:35.056Z] [INFO] Applied migrations: [ +sparkyfitness-server | '20250703170640_InitialDB.sql', +sparkyfitness-server | '20250710062500_create_goal_presets_table.sql', +sparkyfitness-server | '20250711173824_meal_features.sql', +sparkyfitness-server | '20250712163617_refactor_data_providers_and_add_exercise_source_id.sql', +sparkyfitness-server | '20250713125323_create_oidc_settings_and_update_users_table.sql', +sparkyfitness-server | '20250713135900_add_role_to_users_table.sql', +sparkyfitness-server | '20250713142300_add_oidc_config_fields.sql', +sparkyfitness-server | '20250714000000_create_session_table.sql', +sparkyfitness-server | '20250714175824_add_api_key_tag_to_ai_service_settings.sql', +sparkyfitness-server | '20250717190700_add_cascading_deletes.sql', +sparkyfitness-server | '20250717233929_add_is_quick_food_to_foods.sql', +sparkyfitness-server | '20250718190226_add_food_display_limit_to_user_preferences.sql', +sparkyfitness-server | '20250719131500_add_meal_percentages.sql', +sparkyfitness-server | '20250719215400_add_login_management_to_oidc_settings.sql', +sparkyfitness-server | '20250720010000_create_user_nutrient_display_preferences.sql', +sparkyfitness-server | '20250720201800_rename_food_display_limit_to_item_display_limit.sql', +sparkyfitness-server | '20250720220000_add_water_tracking_features.sql', +sparkyfitness-server | '20250720233836_alter_water_goal_ml_to_numeric.sql', +sparkyfitness-server | '20250721000000_add_servings_per_container_to_water_containers.sql', +sparkyfitness-server | '20250721000000_alter_water_container_volume_to_numeric.sql', +sparkyfitness-server | '20250721014900_alter_water_ml_to_numeric.sql', +sparkyfitness-server | '20250819062400_add_mealie_provider_type.sql', +sparkyfitness-server | '20250819083500_add_base_url_to_external_data_providers.sql', +sparkyfitness-server | '202508201215_add_garmin_integration_schema.sql', +sparkyfitness-server | '20250821090000_update_external_data_providers_provider_type_check.sql', +sparkyfitness-server | '20250821091500_add_garth_token_dump_to_external_data_providers.sql', +sparkyfitness-server | '20250821102000_remove_redundant_token_fields_from_external_data_providers.sql', +sparkyfitness-server | '20250831063900_create_mood_entries_table.sql', +sparkyfitness-server | '20250927180257_alter_exercises_table.sql', +sparkyfitness-server | '20250927212000_add_free_exercise_db_to_provider_type_check.sql', +sparkyfitness-server | '20250930002100_add_sets_reps_weight_to_exercise_entries.sql', +sparkyfitness-server | '20251001232600_add_gender_to_users_table.sql', +sparkyfitness-server | '20251002182306_create_backup_settings_table.sql', +sparkyfitness-server | '20251002224500_add_password_reset_to_users_table.sql', +sparkyfitness-server | '20251006021609_add_glycemic_index_to_foods_and_food_variants.sql', +sparkyfitness-server | '20251006220500_create_admin_activity_logs_table.sql', +sparkyfitness-server | '20251008224256_add_workout_features.sql', +sparkyfitness-server | '20251012225400_add_primary_keys_to_workout_tables.sql', +sparkyfitness-server | '20251012225500_add_multiple_sets_to_presets.sql', +sparkyfitness-server | '20251012225900_add_multiple_sets_to_plans.sql', +sparkyfitness-server | '20251012230000_add_multiple_sets_to_exercise_entries.sql', +sparkyfitness-server | '20251015223200_convert_weights_to_kg_and_set_default.sql', +sparkyfitness-server | '202510170132_add_text_measurements.sql', +sparkyfitness-server | '20251017200900_add_multiple_oidc_providers.sql', +sparkyfitness-server | '20251017204200_create_global_settings.sql', +sparkyfitness-server | '20251018001151_add_bmr_and_bodyfat_preferences.sql', +sparkyfitness-server | '20251018223700_add_signing_alg_to_oidc_providers.sql', +sparkyfitness-server | '20251019013200_merged_schema_and_data.sql', +sparkyfitness-server | '20251019013300_merged_rls_policies.sql', +sparkyfitness-server | '20251019154515_update_rls_policies_for_shared_items.sql', +sparkyfitness-server | '20251019203500_fix_rls_permissions_for_public_foods.sql', +sparkyfitness-server | '20251019204000_correct_variant_rls_policy.sql', +sparkyfitness-server | '20251019212500_update_measurement_rls_policies.sql', +sparkyfitness-server | '20251019222100_add_audit_columns_to_measurements.sql', +sparkyfitness-server | '20251020001000_fix_family_access_insert_policy.sql', +sparkyfitness-server | '20251020022000_set_default_shared_with_public.sql', +sparkyfitness-server | '20251020022200_update_rls_policies.sql', +sparkyfitness-server | '20251020022500_fix_food_select_policy.sql', +sparkyfitness-server | '20251020030000_simplify_food_select_policy.sql', +sparkyfitness-server | '20251020031000_update_food_select_policy_with_sharing.sql', +sparkyfitness-server | '20251020032200_add_all_owner_centric_policies.sql', +sparkyfitness-server | '20251020033400_add_food_variants_rls_policy.sql', +sparkyfitness-server | '20251020033700_fix_food_variants_rls_policy.sql', +sparkyfitness-server | '20251020230839_fix_family_access_rls_policies.sql', +sparkyfitness-server | '20251021025423_restrict_family_access_select_policy.sql', +sparkyfitness-server | '20251021034700_add_public_sharing_to_external_providers.sql', +sparkyfitness-server | '20251022201000_fix_exercise_rls_policy.sql', +sparkyfitness-server | '20251022203000_snapshot_exercise_details_in_entries.sql', +sparkyfitness-server | '20251023120500_update_external_providers_select_policy_for_public.sql', +sparkyfitness-server | '20251023221000_update_meals_rls_policy.sql', +sparkyfitness-server | '20251023221500_update_meal_plan_template_assignments_rls_policy.sql', +sparkyfitness-server | '20251023221501_add_meal_id_to_food_entries.sql', +sparkyfitness-server | '20251024230330_add_withings_fields_to_external_data_providers.sql', +sparkyfitness-server | '20251025210900_add_source_to_custom_measurements.sql', +sparkyfitness-server | '20251026125900_add_distance_and_hr_to_exercise_entries_activity_details.sql', +sparkyfitness-server | '202510310132_add_language_to_user_preferences.sql', +sparkyfitness-server | '20251101151100_create_sleep_entries_table.sql', +sparkyfitness-server | '20251103000000_add_onboarding_schema.sql', +sparkyfitness-server | '20251112000000_add_display_name_to_custom_categories.sql', +sparkyfitness-server | '20251114205134_create_exercise_preset_entries_table.sql', +sparkyfitness-server | '20251115003147_add_source_to_exercise_preset_entries.sql', +sparkyfitness-server | '20251115003301_add_exercise_preset_entry_id_to_activity_details.sql', +sparkyfitness-server | '20251115004027_alter_exercise_entry_id_nullable_in_activity_details.sql', +sparkyfitness-server | '20251120011100_add_mfa_magic_link_columns.sql', +sparkyfitness-server | '20251121011500_add_email_mfa_columns_to_users.sql', +sparkyfitness-server | '202511220110_add_default_external_data_providers.sql', +sparkyfitness-server | '202511232110_delete_raw_stress_data_categories.sql', +sparkyfitness-server | '202511270109_add_calorie_goal_adjustment_mode_to_user_preferences.sql', +sparkyfitness-server | '20251127194107_create_food_entry_meals_and_link_food_entries.sql', +sparkyfitness-server | '20251127194108_migrate_aggregated_food_entries_to_food_entry_meals.sql', +sparkyfitness-server | '20251128030115_add_tandoor_provider_type.sql', +sparkyfitness-server | '20251205000000_add_energy_unit_to_user_preferences.sql', +sparkyfitness-server | '20251206000000_add_nutrient_calculation_algorithms.sql', +sparkyfitness-server | '20251206000001_add_serving_size_to_meals.sql', +sparkyfitness-server | '20251207000001_add_default_meal_quantity.sql', +sparkyfitness-server | '20251215005329_add_usda_to_provider_type_check.sql', +sparkyfitness-server | '20251221000000_create_fasting_logs.sql', +sparkyfitness-server | '20251221010000_drop_mood_weight_from_fasting_logs.sql', +sparkyfitness-server | '20251226150700_add_mobile_health_data_features.sql', +sparkyfitness-server | '20251228000000_add_custom_nutrients_tables.sql', +sparkyfitness-server | ... 84 more items +sparkyfitness-server | ] +sparkyfitness-server | [2026-09-30T10:26:35.084Z] [INFO] Ensuring permissions for role: "sparkyapp" +sparkyfitness-server | [2026-09-30T10:26:35.127Z] [INFO] Successfully ensured permissions for role: "sparkyapp" +sparkyfitness-server | [2026-09-30T10:26:35.128Z] [INFO] Permissions granted to application user. +sparkyfitness-server | [2026-09-30T10:26:35.129Z] [INFO] Applying all RLS policies from rls_policies.sql... +sparkyfitness-server | [2026-09-30T10:26:35.298Z] [INFO] Successfully applied all RLS policies. +sparkyfitness-server | [AUTH] Starting Better Auth mounting phase... +sparkyfitness-server | [AUTH] Better Auth handler successfully mounted. +sparkyfitness-server | [AUTH] Synced trusted SSO providers for auto-linking: [] +sparkyfitness-server | DEBUG: Server started and listening on port 3010 +sparkyfitness-server | [2026-09-30T10:26:35.384Z] [INFO] SparkyFitnessServer listening on port 3010 +sparkyfitness-server | View API documentation at: /api/api-docs/swagger +sparkyfitness-server | [2026-09-30T10:26:35.388Z] [INFO] [CRON] Scheduled backups disabled — skipping schedule +sparkyfitness-server | [2026-09-30T10:26:56.139Z] [INFO] Incoming request: GET /api/health (Path: /api/health) +sparkyfitness-server | [2026-09-30T10:27:26.288Z] [INFO] Incoming request: GET /api/health (Path: /api/health) diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/to-states.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/to-states.json new file mode 100644 index 00000000..1f30e9d3 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/to-states.json @@ -0,0 +1,20 @@ +{ + "sparkyfitness": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + }, + "sparkyfitness-db": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + }, + "sparkyfitness-server": { + "status": "running", + "health": "healthy", + "restarts": 0, + "exit": 0 + } +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/verdict.json b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/verdict.json new file mode 100644 index 00000000..a10eea64 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/apps/sparkyfitness/bench/evidence/MV-sparkyfitness/verdict.json @@ -0,0 +1,105 @@ +{ + "harness_version": 4, + "edge": "MV-sparkyfitness", + "app": "sparkyfitness", + "note": "night 2026-09-23 within-a-major move: sparkyfitness-db=postgres:18-alpine", + "from": { + "sparkyfitness-db": "postgres:15-alpine", + "sparkyfitness-server": "codewithcj/sparkyfitness_server:v0.17.3", + "sparkyfitness-frontend": "codewithcj/sparkyfitness:v0.17.3" + }, + "to": { + "sparkyfitness-db": "postgres:18-alpine", + "sparkyfitness-server": "codewithcj/sparkyfitness_server:v0.17.3", + "sparkyfitness-frontend": "codewithcj/sparkyfitness:v0.17.3" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "migration_observed": "\u001b[2Ksparkyfitness-server | [2026-09-30T10:26:35.050Z] [INFO] Ensured schema_migrations table exists.", + "abort": "starts-data-gone", + "abort_detail": "the app started but the seeded data was gone", + "engine_state_after": { + "sparkyfitness-db": { + "image": "postgres:18-alpine", + "probe": "datadir major version", + "answer": "18", + "probe_rc": 0 + } + }, + "memory": { + "soak_s": 607.3, + "requested_s": 600, + "requests": 12062, + "codes": { + "200": 12062 + }, + "first_kill": null, + "containers": { + "sparkyfitness": { + "limit": 268435456, + "peak": 10674176, + "peak_pct": 0.04, + "anon_peak_sampled": 5517312, + "anon_peak_pct": 0.021, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + }, + "sparkyfitness-db": { + "limit": 536870912, + "peak": 154456064, + "peak_pct": 0.288, + "anon_peak_sampled": 9879552, + "anon_peak_pct": 0.018, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + }, + "sparkyfitness-server": { + "limit": 1073741824, + "peak": 376676352, + "peak_pct": 0.351, + "anon_peak_sampled": 336465920, + "anon_peak_pct": 0.313, + "oom_kills": 0, + "restarts": 0, + "oomkilled_flag": false, + "measured": true + } + }, + "unmeasured": [], + "load": "reached" + }, + "marks": [], + "duration_s": 31.2, + "measured_at": "2026-09-30T10:38:51Z", + "evidence": "evidence/MV-sparkyfitness", + "scratch_cleared": [], + "engine_conversion": { + "service": "sparkyfitness-db", + "engine": "postgres", + "from": 15, + "to": 18, + "dump_s": 0.69, + "dump_bytes": 377827, + "new_engine_ready_s": 2.2, + "load_s": 3.99, + "dropped": [ + "sparkyfitness_db" + ], + "skipped_create_role": [ + "CREATE ROLE sparky;" + ], + "result": "converted", + "check_equal": true, + "pg_version": "18", + "tables": 94, + "convert_s": 13.3 + }, + "files_changed": [], + "total_s": 836.4 +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/benchq-q1.txt b/documentation/audits/pg-last-six-2026-09-30/bench/benchq-q1.txt new file mode 100644 index 00000000..2268e741 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/benchq-q1.txt @@ -0,0 +1,3 @@ +12:24:49 START sparkyfitness ['sparkyfitness-db=postgres:18-alpine'] +12:38:56 DONE sparkyfitness rc=0 verdict=proven read_before=True read_after=True abort=starts-data-gone marks=[] peaks={'sparkyfitness': 0.04, 'sparkyfitness-db': 0.288, 'sparkyfitness-server': 0.351} detail='the app started but the seeded data was gone' (847s) +12:38:56 QUEUE q1 FINISHED diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/benchq-q2.txt b/documentation/audits/pg-last-six-2026-09-30/bench/benchq-q2.txt new file mode 100644 index 00000000..f627d384 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/benchq-q2.txt @@ -0,0 +1,3 @@ +12:24:49 START rallly ['rallly-postgres=postgres:18-alpine'] +12:40:11 DONE rallly rc=0 verdict=proven read_before=True read_after=True abort=refuses marks=[] peaks={'rallly': 0.685, 'rallly-postgres': 0.542} detail='/lib/postgresql/data".\n\x1b[2Krallly-postgres | The files belonging to this database system will be owned by user "postgres".\n\x1b[2Krallly-postgres | This user mus' (922s) +12:40:11 QUEUE q2 FINISHED diff --git a/documentation/audits/pg-last-six-2026-09-30/bench/benchq-q3.txt b/documentation/audits/pg-last-six-2026-09-30/bench/benchq-q3.txt new file mode 100644 index 00000000..3c191dce --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/bench/benchq-q3.txt @@ -0,0 +1,3 @@ +12:24:49 START outline ['outline-postgres=postgres:18-alpine'] +12:40:09 DONE outline rc=0 verdict=proven read_before=True read_after=True abort=refuses marks=[] peaks={'outline': 0.531, 'outline-postgres': 0.655, 'outline-redis': 0.07} detail='esql/data".\n\x1b[2Koutline-postgres | The files belonging to this database system will be owned by user "postgres".\n\x1b[2Koutline-postgres | This user must also ow' (920s) +12:40:09 QUEUE q3 FINISHED diff --git a/documentation/audits/pg-last-six-2026-09-30/box/C1-repoint-drill.txt b/documentation/audits/pg-last-six-2026-09-30/box/C1-repoint-drill.txt new file mode 100644 index 00000000..f2c89786 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/C1-repoint-drill.txt @@ -0,0 +1,10 @@ +git: + branch: main + repo_url: https://gitea.dooplex.hu/admin/app-catalog-drill.git + sync_interval: 15m + token: + username: "admin" +hub: +update: + health_timeout: 90s + diff --git a/documentation/audits/pg-last-six-2026-09-30/box/T1-remove-finished.txt b/documentation/audits/pg-last-six-2026-09-30/box/T1-remove-finished.txt new file mode 100644 index 00000000..0ffcac99 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/T1-remove-finished.txt @@ -0,0 +1,24 @@ +13:51:54 == remove rallly +13:52:05 [X] stop -> 200 {'ok': True, 'message': 'Stack rallly stop completed'} +13:52:38 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'rallly', 'volumes_removed': ['rallly_rallly_postgres_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': ' +13:52:46 [X] after remove: deployed=False leftovers='/opt/docker/stacks/rallly' +13:52:46 == remove outline +13:52:52 [X] stop -> 200 {'ok': True, 'message': 'Stack outline stop completed'} +13:53:24 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'outline', 'volumes_removed': ['outline_outline_data', 'outline_outline_postgres_data', 'outline_outline_redis_data'], 'hdd_pat +13:53:33 [X] after remove: deployed=False leftovers='/opt/docker/stacks/outline' +13:53:33 == remove sparkyfitness +13:53:35 [X] stop -> 200 {'ok': True, 'message': 'Stack sparkyfitness stop completed'} +13:54:07 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'sparkyfitness', 'volumes_removed': ['sparkyfitness_sparkyfitness_backup', 'sparkyfitness_sparkyfitness_db_data', 'sparkyfitnes +13:54:15 [X] after remove: deployed=False leftovers='/opt/docker/stacks/sparkyfitness' +13:54:15 == remove bookstack +13:54:20 [X] stop -> 200 {'ok': True, 'message': 'Stack bookstack stop completed'} +13:54:52 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'bookstack', 'volumes_removed': ['bookstack_bookstack_config', 'bookstack_bookstack_db_data'], 'hdd_paths_removed': [], 'hdd_pa +13:55:00 [X] after remove: deployed=False leftovers='/opt/docker/stacks/bookstack' +13:55:00 == remove kimai +13:55:02 [X] stop -> 200 {'ok': True, 'message': 'Stack kimai stop completed'} +13:55:34 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'kimai', 'volumes_removed': ['kimai_kimai_db_data', 'kimai_kimai_var'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hd +13:55:43 [X] after remove: deployed=False leftovers='/opt/docker/stacks/kimai' +volumes left: none + total used free shared buff/cache available +Mem: 25898 755 23423 36 1755 25142 + diff --git a/documentation/audits/pg-last-six-2026-09-30/box/T2-teardown-9202.txt b/documentation/audits/pg-last-six-2026-09-30/box/T2-teardown-9202.txt new file mode 100644 index 00000000..9e703fe2 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/T2-teardown-9202.txt @@ -0,0 +1,34 @@ +14:39:05 == remove audiobookshelf +14:39:06 [X] stop -> 200 {'ok': True, 'message': 'Stack audiobookshelf stop completed'} +14:39:11 [X] remove (with drive data) -> 409 {'ok': False, 'error': 'A(z) /mnt/felhom-drives/scratch_hdd/userdata/audiobookshelf tárhely jelenleg nem elérhető — az alkalmazás nem távolítható el, amíg a meg +14:39:11 [X] refused because the drive path cannot be resolved (R-442, fail-closed and right) — removing the app and KEEPING the drive data instead +14:39:38 [X] remove (keeping drive data) -> 200 {'ok': True, 'data': {'removed': 'audiobookshelf', 'volumes_removed': ['audiobookshelf_audiobookshelf_config', 'audiobookshelf_audiobookshelf_metadata'], 'hdd_p +14:39:46 [X] after remove: deployed=False leftovers='/opt/docker/stacks/audiobookshelf' +14:39:46 == remove navidrome +14:39:46 [X] stop -> 200 {'ok': True, 'message': 'Stack navidrome stop completed'} +14:39:51 [X] remove (with drive data) -> 409 {'ok': False, 'error': 'A(z) /mnt/felhom-drives/scratch_hdd/userdata/navidrome tárhely jelenleg nem elérhető — az alkalmazás nem távolítható el, amíg a meghajtó +14:39:51 [X] refused because the drive path cannot be resolved (R-442, fail-closed and right) — removing the app and KEEPING the drive data instead +14:40:18 [X] remove (keeping drive data) -> 200 {'ok': True, 'data': {'removed': 'navidrome', 'volumes_removed': ['navidrome_navidrome_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'backup_paths +14:40:27 [X] after remove: deployed=False leftovers='/opt/docker/stacks/navidrome' +14:40:27 == remove n8n +14:40:27 [X] stop -> 200 {'ok': True, 'message': 'Stack n8n stop completed'} +14:40:59 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'n8n', 'volumes_removed': ['n8n_n8n_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalmazás nem +14:41:08 [X] after remove: deployed=False leftovers='/opt/docker/stacks/n8n' +14:41:08 == remove grafana +14:41:08 [X] stop -> 200 {'ok': True, 'message': 'Stack grafana stop completed'} +14:41:40 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'grafana', 'volumes_removed': ['grafana_grafana_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alk +14:41:48 [X] after remove: deployed=False leftovers='/opt/docker/stacks/grafana' +14:41:48 == remove komga +14:41:51 [X] stop -> 200 {'ok': True, 'message': 'Stack komga stop completed'} +14:41:56 [X] remove (with drive data) -> 409 {'ok': False, 'error': 'A(z) /mnt/felhom-drives/scratch_hdd/userdata/komga tárhely jelenleg nem elérhető — az alkalmazás nem távolítható el, amíg a meghajtó vis +14:41:56 [X] refused because the drive path cannot be resolved (R-442, fail-closed and right) — removing the app and KEEPING the drive data instead +14:42:23 [X] remove (keeping drive data) -> 200 {'ok': True, 'data': {'removed': 'komga', 'volumes_removed': ['komga_komga_config'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'backup_paths_removed': +14:42:31 [X] after remove: deployed=False leftovers='/opt/docker/stacks/komga' +14:42:31 == remove immich +14:42:32 [X] stop -> 200 {'ok': True, 'message': 'Stack immich stop completed'} +14:42:37 [X] remove (with drive data) -> 409 {'ok': False, 'error': 'A(z) /mnt/felhom-drives/scratch_hdd/userdata/immich tárhely jelenleg nem elérhető — az alkalmazás nem távolítható el, amíg a meghajtó vi +14:42:37 [X] refused because the drive path cannot be resolved (R-442, fail-closed and right) — removing the app and KEEPING the drive data instead +14:43:04 [X] remove (keeping drive data) -> 200 {'ok': True, 'data': {'removed': 'immich', 'volumes_removed': ['immich_immich_ml_cache', 'immich_immich_postgres_data', 'immich_immich_redis_data'], 'hdd_paths_ +14:43:12 [X] after remove: deployed=False leftovers='/opt/docker/stacks/immich' +volumes left: none +containers: felhom-controller filebrowser paperless-postgres paperless-redis paperless-webserver traefik diff --git a/documentation/audits/pg-last-six-2026-09-30/box/T3-repoint-live.txt b/documentation/audits/pg-last-six-2026-09-30/box/T3-repoint-live.txt new file mode 100644 index 00000000..e7f043c6 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/T3-repoint-live.txt @@ -0,0 +1,9 @@ +git: + branch: main + repo_url: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git + sync_interval: 15m + token: + username: "" +hub: +0 + diff --git a/documentation/audits/pg-last-six-2026-09-30/box/T4-drill-reset.txt b/documentation/audits/pg-last-six-2026-09-30/box/T4-drill-reset.txt new file mode 100644 index 00000000..61593549 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/T4-drill-reset.txt @@ -0,0 +1,21 @@ +# drill reset 2026-09-30T12:44:05Z +drill before: 28721cd ; live main: 403a8f5 +28721cd DRILL immich: {'immich-server': 'ghcr.io/immich-app/immich-server:v3.2.4', 'immich-machine-learning': 'ghcr.io/immich-app/immich-machine-learning:v3.2.4'} (box proof) +ad13c97 Reapply "DRILL grafana: {'grafana': 'grafana/grafana:13.2.3'} (box proof)" +31b9346 Revert "DRILL grafana: {'grafana': 'grafana/grafana:13.2.3'} (box proof)" +50db1ed DRILL komga: {'komga': 'gotson/komga:1.28.0'} (box proof) +4ccdae7 DRILL grafana: {'grafana': 'grafana/grafana:13.2.3'} (box proof) +37cb7ef DRILL navidrome: {'navidrome': 'deluan/navidrome:0.64.2'} (box proof) +84921d9 DRILL n8n: {'n8n': 'n8nio/n8n:2.42.1'} (box proof) +ae240b4 DRILL audiobookshelf: {'audiobookshelf': 'ghcr.io/advplyr/audiobookshelf:2.37.1'} (box proof) +4b564b1 DRILL kimai: {'kimai': 'kimai/kimai2:2.67.0'} (box proof) +d856374 DRILL bookstack: {'bookstack': 'lscr.io/linuxserver/bookstack:26.09.1'} (box proof) +56837ac Reapply "DRILL sparkyfitness: sparkyfitness-db postgres:15-alpine -> postgres:18-alpine with the engine_conversion mark (box proof)" +5f6fa27 Revert "DRILL sparkyfitness: sparkyfitness-db postgres:15-alpine -> postgres:18-alpine with the engine_conversion mark (box proof)" +3d7f388 DRILL outline: outline-postgres postgres:16-alpine -> postgres:18-alpine with the engine_conversion mark (box proof) +6093edc DRILL rallly: rallly-postgres postgres:16-alpine -> postgres:18-alpine with the engine_conversion mark (box proof) +16ce915 DRILL sparkyfitness: sparkyfitness-db postgres:15-alpine -> postgres:18-alpine with the engine_conversion mark (box proof) +drill after: 403a8f5 (= live 403a8f5) +image-line diff drill vs live: +IDENTICAL +live catalog commits today touch no DRILL commit: 0 DRILL commits in live diff --git a/documentation/audits/pg-last-six-2026-09-30/box/audiobookshelf/box-verdict-audiobookshelf.json b/documentation/audits/pg-last-six-2026-09-30/box/audiobookshelf/box-verdict-audiobookshelf.json new file mode 100644 index 00000000..2ac640a9 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/audiobookshelf/box-verdict-audiobookshelf.json @@ -0,0 +1,18 @@ +{ + "app": "audiobookshelf", + "venue": "box 9202 (drill catalog, controller 0.283.1), the product's guarded Update", + "from": { + "audiobookshelf": "ghcr.io/advplyr/audiobookshelf:2.36.1" + }, + "to": { + "audiobookshelf": "ghcr.io/advplyr/audiobookshelf:2.37.1" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "duration_s": 24.6, + "final_phase": "done", + "measured_at": "2026-09-30T12:08:26Z", + "evidence": "felhom.eu/documentation/audits/pg-last-six-2026-09-30/box/audiobookshelf/step.txt" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/box/audiobookshelf/prep.txt b/documentation/audits/pg-last-six-2026-09-30/box/audiobookshelf/prep.txt new file mode 100644 index 00000000..205aacb6 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/audiobookshelf/prep.txt @@ -0,0 +1,4 @@ +deploy/reuse audiobookshelf: True + audiobookshelf: /init http=200 + audiobookshelf: login as the seeded root http=200 ok=True +C1 seed reads back BEFORE: True diff --git a/documentation/audits/pg-last-six-2026-09-30/box/audiobookshelf/step.txt b/documentation/audits/pg-last-six-2026-09-30/box/audiobookshelf/step.txt new file mode 100644 index 00000000..59a260ed --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/audiobookshelf/step.txt @@ -0,0 +1,32 @@ +before: pinned={'audiobookshelf': 'ghcr.io/advplyr/audiobookshelf:2.36.1'} +drill: ae240b4 DRILL audiobookshelf: {'audiobookshelf': 'ghcr.io/advplyr/audiobookshelf:2.37.1'} (box proof) + phase +0.0s backing-up | err=None + phase +2.1s safety-dump | err=None + phase +3.1s pulling | err=None + phase +16.4s copying | err=None + phase +19.5s verifying | err=None + phase +24.6s done | err=None + audiobookshelf: login as the seeded root http=200 ok=True +2026/09/30 12:08:28 update.go:536: [INFO] [stacks] update audiobookshelf: accepted — guarded update started +2026/09/30 12:08:28 update.go:1365: [INFO] [stacks] update audiobookshelf: phase checking +2026/09/30 12:08:28 update.go:786: [INFO] [stacks] update audiobookshelf: ladder — the last step (2 of 2) — the catalog's current definition +2026/09/30 12:08:28 update.go:816: [INFO] [stacks] update audiobookshelf: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T12:03:38Z) (found: none) — backing up first +2026/09/30 12:08:28 update.go:1365: [INFO] [stacks] update audiobookshelf: phase backing-up +2026/09/30 12:08:29 update.go:831: [INFO] [stacks] update audiobookshelf: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-30T12:08:28Z +2026/09/30 12:08:29 update.go:1365: [INFO] [stacks] update audiobookshelf: phase safety-dump +2026/09/30 12:08:29 update.go:846: [INFO] [stacks] update audiobookshelf: safety dump done (0 file(s)) [] +2026/09/30 12:08:30 undo.go:287: [INFO] [stacks] update audiobookshelf: the undo copy will hold 2 named volume(s), 0.5 MiB +2026/09/30 12:08:30 update.go:1365: [INFO] [stacks] update audiobookshelf: phase pinning +2026/09/30 12:08:30 pin.go:373: [INFO] [stacks] update audiobookshelf: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/audiobookshelf/docker-compose.yml (audiobookshelf=ghcr.io/advplyr/audiobookshelf:2.37.1) +2026/09/30 12:08:30 update.go:1365: [INFO] [stacks] update audiobookshelf: phase pulling +2026/09/30 12:08:44 update.go:1365: [INFO] [stacks] update audiobookshelf: phase copying +2026/09/30 12:08:45 update.go:1365: [INFO] [stacks] update audiobookshelf: phase copying +2026/09/30 12:08:46 undo.go:437: [INFO] [stacks] update audiobookshelf: copied audiobookshelf_audiobookshelf_config → audiobookshelf_audiobookshelf_config.pre-update-20260930T120845Z in 508ms +2026/09/30 12:08:46 update.go:1365: [INFO] [stacks] update audiobookshelf: phase copying +2026/09/30 12:08:46 undo.go:437: [INFO] [stacks] update audiobookshelf: copied audiobookshelf_audiobookshelf_metadata → audiobookshelf_audiobookshelf_metadata.pre-update-20260930T120845Z in 453ms +2026/09/30 12:08:46 update.go:1365: [INFO] [stacks] update audiobookshelf: phase starting +2026/09/30 12:08:46 update.go:1365: [INFO] [stacks] update audiobookshelf: phase verifying +2026/09/30 12:08:52 update.go:997: [INFO] [stacks] update audiobookshelf: healthy after 5s (the app's health check passed) +2026/09/30 12:08:52 update.go:1033: [INFO] [stacks] update audiobookshelf: DONE in 24s + +RESULT final_phase=done after={'audiobookshelf': 'ghcr.io/advplyr/audiobookshelf:2.37.1'} seed_after=True verdict=proven (24.6 s) diff --git a/documentation/audits/pg-last-six-2026-09-30/box/bookstack/box-verdict-bookstack.json b/documentation/audits/pg-last-six-2026-09-30/box/bookstack/box-verdict-bookstack.json new file mode 100644 index 00000000..d5112d8d --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/bookstack/box-verdict-bookstack.json @@ -0,0 +1,20 @@ +{ + "app": "bookstack", + "venue": "box 9202 (drill catalog, controller 0.283.1), the product's guarded Update", + "from": { + "bookstack": "lscr.io/linuxserver/bookstack:26.05.5", + "bookstack-db": "mariadb:12.3" + }, + "to": { + "bookstack": "lscr.io/linuxserver/bookstack:26.09.1", + "bookstack-db": "mariadb:12.3" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "duration_s": 64.6, + "final_phase": "done", + "measured_at": "2026-09-30T11:09:31Z", + "evidence": "felhom.eu/documentation/audits/pg-last-six-2026-09-30/box/bookstack/step.txt" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/box/bookstack/prep.txt b/documentation/audits/pg-last-six-2026-09-30/box/bookstack/prep.txt new file mode 100644 index 00000000..5e988728 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/bookstack/prep.txt @@ -0,0 +1,4 @@ +deploy/reuse bookstack: True + bookstack: artisan create-admin :: Admin account with email "drill-ae1b4996@gate.invalid" successfully created! + bookstack: readback of the seeded account found=True :: This will delete any configure multi-factor authentication methods for user: - ID: 3 - Name: drill-188bad - Email: drill-ae1b4996@gate.inval +C1 seed reads back BEFORE: True diff --git a/documentation/audits/pg-last-six-2026-09-30/box/bookstack/step.txt b/documentation/audits/pg-last-six-2026-09-30/box/bookstack/step.txt new file mode 100644 index 00000000..c513a643 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/bookstack/step.txt @@ -0,0 +1,33 @@ +before: pinned={'bookstack': 'lscr.io/linuxserver/bookstack:26.05.5', 'bookstack-db': 'mariadb:12.3'} +drill: d856374 DRILL bookstack: {'bookstack': 'lscr.io/linuxserver/bookstack:26.09.1'} (box proof) + phase +0.0s backing-up | err=None + phase +13.3s safety-dump | err=None + phase +14.4s pulling | err=None + phase +35.9s copying | err=None + phase +43.1s starting | err=None + phase +49.2s verifying | err=None + phase +64.6s done | err=None + bookstack: readback of the seeded account found=True :: This will delete any configure multi-factor authentication methods for user: - ID: 3 - Name: drill-188bad - Email: drill-ae1b4996@gate.inval +2026/09/30 11:09:32 update.go:536: [INFO] [stacks] update bookstack: accepted — guarded update started +2026/09/30 11:09:32 update.go:1365: [INFO] [stacks] update bookstack: phase checking +2026/09/30 11:09:32 update.go:786: [INFO] [stacks] update bookstack: ladder — the last step (2 of 2) — the catalog's current definition +2026/09/30 11:09:32 update.go:816: [INFO] [stacks] update bookstack: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T11:01:49Z) (found: none) — backing up first +2026/09/30 11:09:32 update.go:1365: [INFO] [stacks] update bookstack: phase backing-up +2026/09/30 11:09:45 update.go:831: [INFO] [stacks] update bookstack: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-30T11:09:33Z +2026/09/30 11:09:45 update.go:1365: [INFO] [stacks] update bookstack: phase safety-dump +2026/09/30 11:09:46 update.go:846: [INFO] [stacks] update bookstack: safety dump done (1 file(s)) [/mnt/sys_drive/felhom-data/backups/primary/bookstack/db-dumps/pre-restore-20260930T110945Z-bookstack-mariadb.sql] +2026/09/30 11:09:46 undo.go:287: [INFO] [stacks] update bookstack: the undo copy will hold 2 named volume(s), 165.4 MiB +2026/09/30 11:09:46 update.go:1365: [INFO] [stacks] update bookstack: phase pinning +2026/09/30 11:09:46 pin.go:373: [INFO] [stacks] update bookstack: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/bookstack/docker-compose.yml (bookstack=lscr.io/linuxserver/bookstack:26.09.1, bookstack-db=mariadb:12.3) +2026/09/30 11:09:46 update.go:1365: [INFO] [stacks] update bookstack: phase pulling +2026/09/30 11:10:08 update.go:1365: [INFO] [stacks] update bookstack: phase copying +2026/09/30 11:10:13 update.go:1365: [INFO] [stacks] update bookstack: phase copying +2026/09/30 11:10:13 undo.go:437: [INFO] [stacks] update bookstack: copied bookstack_bookstack_config → bookstack_bookstack_config.pre-update-20260930T111013Z in 711ms +2026/09/30 11:10:13 update.go:1365: [INFO] [stacks] update bookstack: phase copying +2026/09/30 11:10:14 undo.go:437: [INFO] [stacks] update bookstack: copied bookstack_bookstack_db_data → bookstack_bookstack_db_data.pre-update-20260930T111013Z in 1.009s +2026/09/30 11:10:14 update.go:1365: [INFO] [stacks] update bookstack: phase starting +2026/09/30 11:10:21 update.go:1365: [INFO] [stacks] update bookstack: phase verifying +2026/09/30 11:10:36 update.go:997: [INFO] [stacks] update bookstack: healthy after 15s (the app's health check passed) +2026/09/30 11:10:36 update.go:1033: [INFO] [stacks] update bookstack: DONE in 1m4s + +RESULT final_phase=done after={'bookstack': 'lscr.io/linuxserver/bookstack:26.09.1', 'bookstack-db': 'mariadb:12.3'} seed_after=True verdict=proven (64.6 s) diff --git a/documentation/audits/pg-last-six-2026-09-30/box/grafana/box-verdict-grafana-attempt1.json b/documentation/audits/pg-last-six-2026-09-30/box/grafana/box-verdict-grafana-attempt1.json new file mode 100644 index 00000000..353c72d2 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/grafana/box-verdict-grafana-attempt1.json @@ -0,0 +1,18 @@ +{ + "app": "grafana", + "venue": "box 9202 (drill catalog, controller 0.283.1), the product's guarded Update", + "from": { + "grafana": "grafana/grafana:13.2.2" + }, + "to": { + "grafana": "grafana/grafana:13.2.3" + }, + "verdict": "failed", + "seed_read_before": true, + "seed_read_after": false, + "healthy_after": true, + "duration_s": 40.1, + "final_phase": "done", + "measured_at": "2026-09-30T12:12:15Z", + "evidence": "felhom.eu/documentation/audits/pg-last-six-2026-09-30/box/grafana/step.txt" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/box/grafana/box-verdict-grafana.json b/documentation/audits/pg-last-six-2026-09-30/box/grafana/box-verdict-grafana.json new file mode 100644 index 00000000..bb1831ba --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/grafana/box-verdict-grafana.json @@ -0,0 +1,18 @@ +{ + "app": "grafana", + "venue": "box 9202 (drill catalog, controller 0.283.1), the product's guarded Update", + "from": { + "grafana": "grafana/grafana:13.2.2" + }, + "to": { + "grafana": "grafana/grafana:13.2.3" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "duration_s": 23.6, + "final_phase": "done", + "measured_at": "2026-09-30T12:25:39Z", + "evidence": "felhom.eu/documentation/audits/pg-last-six-2026-09-30/box/grafana/step.txt" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/box/grafana/prep-attempt1.txt b/documentation/audits/pg-last-six-2026-09-30/box/grafana/prep-attempt1.txt new file mode 100644 index 00000000..184f1dd9 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/grafana/prep-attempt1.txt @@ -0,0 +1,4 @@ +deploy/reuse grafana: True + grafana: create folder http=200 + grafana: readback of the seeded folder http=200 ok=True +C1 seed reads back BEFORE: True diff --git a/documentation/audits/pg-last-six-2026-09-30/box/grafana/prep.txt b/documentation/audits/pg-last-six-2026-09-30/box/grafana/prep.txt new file mode 100644 index 00000000..184f1dd9 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/grafana/prep.txt @@ -0,0 +1,4 @@ +deploy/reuse grafana: True + grafana: create folder http=200 + grafana: readback of the seeded folder http=200 ok=True +C1 seed reads back BEFORE: True diff --git a/documentation/audits/pg-last-six-2026-09-30/box/grafana/redo.txt b/documentation/audits/pg-last-six-2026-09-30/box/grafana/redo.txt new file mode 100644 index 00000000..9556ca99 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/grafana/redo.txt @@ -0,0 +1,14 @@ +14:23:11 [X] stop -> 200 {'ok': True, 'message': 'Stack grafana stop completed'} +14:23:43 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'grafana', 'volumes_removed': ['grafana_grafana_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alk +14:23:51 [X] after remove: deployed=False leftovers='/opt/docker/stacks/grafana' +drill step 4ccdae7 +31b9346 Revert "DRILL grafana: {'grafana': 'grafana/grafana:13.2.3'} (box proof)" +14:25:11 [sync] the badge NEVER caught up to grafana/grafana:13.2.2 in 78.9s — catalog_images = None +sync None +14:25:31 deploy/reuse grafana: True +14:25:32 grafana: create folder http=200 +14:25:32 grafana: readback of the seeded folder http=200 ok=True +14:25:32 C1 seed reads back BEFORE: True +ad13c97 Reapply "DRILL grafana: {'grafana': 'grafana/grafana:13.2.3'} (box proof)" +14:26:14 grafana: readback of the seeded folder http=200 ok=True +14:26:18 RESULT final_phase=done after={'grafana': 'grafana/grafana:13.2.3'} seed_after=True verdict=proven (23.6 s) diff --git a/documentation/audits/pg-last-six-2026-09-30/box/grafana/step-attempt1-instrument-401.txt b/documentation/audits/pg-last-six-2026-09-30/box/grafana/step-attempt1-instrument-401.txt new file mode 100644 index 00000000..4d0233cf --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/grafana/step-attempt1-instrument-401.txt @@ -0,0 +1,29 @@ +before: pinned={'grafana': 'grafana/grafana:13.2.2'} +drill: 4ccdae7 DRILL grafana: {'grafana': 'grafana/grafana:13.2.3'} (box proof) + phase +0.0s backing-up | err=None + phase +6.2s pulling | err=None + phase +24.6s copying | err=None + phase +33.8s verifying | err=None + phase +40.1s done | err=None + grafana: readback of the seeded folder http=401 ok=False +2026/09/30 12:12:16 update.go:536: [INFO] [stacks] update grafana: accepted — guarded update started +2026/09/30 12:12:16 update.go:1365: [INFO] [stacks] update grafana: phase checking +2026/09/30 12:12:16 update.go:786: [INFO] [stacks] update grafana: ladder — the last step (2 of 2) — the catalog's current definition +2026/09/30 12:12:16 update.go:816: [INFO] [stacks] update grafana: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T12:06:29Z) (found: none) — backing up first +2026/09/30 12:12:16 update.go:1365: [INFO] [stacks] update grafana: phase backing-up +2026/09/30 12:12:22 update.go:831: [INFO] [stacks] update grafana: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-30T12:12:18Z +2026/09/30 12:12:22 update.go:1365: [INFO] [stacks] update grafana: phase safety-dump +2026/09/30 12:12:22 update.go:846: [INFO] [stacks] update grafana: safety dump done (0 file(s)) [] +2026/09/30 12:12:22 undo.go:287: [INFO] [stacks] update grafana: the undo copy will hold 1 named volume(s), 504.7 MiB +2026/09/30 12:12:22 update.go:1365: [INFO] [stacks] update grafana: phase pinning +2026/09/30 12:12:22 pin.go:373: [INFO] [stacks] update grafana: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/grafana/docker-compose.yml (grafana=grafana/grafana:13.2.3) +2026/09/30 12:12:22 update.go:1365: [INFO] [stacks] update grafana: phase pulling +2026/09/30 12:12:41 update.go:1365: [INFO] [stacks] update grafana: phase copying +2026/09/30 12:12:46 update.go:1365: [INFO] [stacks] update grafana: phase copying +2026/09/30 12:12:49 undo.go:437: [INFO] [stacks] update grafana: copied grafana_grafana_data → grafana_grafana_data.pre-update-20260930T121246Z in 3.523s +2026/09/30 12:12:49 update.go:1365: [INFO] [stacks] update grafana: phase starting +2026/09/30 12:12:50 update.go:1365: [INFO] [stacks] update grafana: phase verifying +2026/09/30 12:12:55 update.go:997: [INFO] [stacks] update grafana: healthy after 5s (the app's health check passed) +2026/09/30 12:12:55 update.go:1033: [INFO] [stacks] update grafana: DONE in 39s + +RESULT final_phase=done after={'grafana': 'grafana/grafana:13.2.3'} seed_after=False verdict=failed (40.1 s) diff --git a/documentation/audits/pg-last-six-2026-09-30/box/grafana/step.txt b/documentation/audits/pg-last-six-2026-09-30/box/grafana/step.txt new file mode 100644 index 00000000..e7387264 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/grafana/step.txt @@ -0,0 +1,29 @@ +before: pinned={'grafana': 'grafana/grafana:13.2.2'} + phase +0.0s backing-up | err=None + phase +13.4s safety-dump | err=None + phase +14.4s pulling | err=None + phase +15.4s copying | err=None + phase +18.5s verifying | err=None + phase +23.6s done | err=None + grafana: readback of the seeded folder http=200 ok=True +2026/09/30 12:25:41 update.go:536: [INFO] [stacks] update grafana: accepted — guarded update started +2026/09/30 12:25:41 update.go:1365: [INFO] [stacks] update grafana: phase checking +2026/09/30 12:25:41 update.go:786: [INFO] [stacks] update grafana: ladder — the last step (2 of 2) — the catalog's current definition +2026/09/30 12:25:41 update.go:816: [INFO] [stacks] update grafana: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T12:25:11Z) (found: none) — backing up first +2026/09/30 12:25:41 update.go:1365: [INFO] [stacks] update grafana: phase backing-up +2026/09/30 12:25:54 update.go:831: [INFO] [stacks] update grafana: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-30T12:25:52Z +2026/09/30 12:25:54 update.go:1365: [INFO] [stacks] update grafana: phase safety-dump +2026/09/30 12:25:54 update.go:846: [INFO] [stacks] update grafana: safety dump done (0 file(s)) [] +2026/09/30 12:25:54 undo.go:287: [INFO] [stacks] update grafana: the undo copy will hold 1 named volume(s), 397.0 MiB +2026/09/30 12:25:54 update.go:1365: [INFO] [stacks] update grafana: phase pinning +2026/09/30 12:25:54 pin.go:373: [INFO] [stacks] update grafana: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/grafana/docker-compose.yml (grafana=grafana/grafana:13.2.3) +2026/09/30 12:25:54 update.go:1365: [INFO] [stacks] update grafana: phase pulling +2026/09/30 12:25:56 update.go:1365: [INFO] [stacks] update grafana: phase copying +2026/09/30 12:25:57 update.go:1365: [INFO] [stacks] update grafana: phase copying +2026/09/30 12:25:58 undo.go:437: [INFO] [stacks] update grafana: copied grafana_grafana_data → grafana_grafana_data.pre-update-20260930T122557Z in 1.505s +2026/09/30 12:25:58 update.go:1365: [INFO] [stacks] update grafana: phase starting +2026/09/30 12:25:59 update.go:1365: [INFO] [stacks] update grafana: phase verifying +2026/09/30 12:26:04 update.go:997: [INFO] [stacks] update grafana: healthy after 5s (the app's health check passed) +2026/09/30 12:26:04 update.go:1033: [INFO] [stacks] update grafana: DONE in 23s + +RESULT final_phase=done after={'grafana': 'grafana/grafana:13.2.3'} seed_after=True verdict=proven (23.6 s) diff --git a/documentation/audits/pg-last-six-2026-09-30/box/immich/box-verdict-immich.json b/documentation/audits/pg-last-six-2026-09-30/box/immich/box-verdict-immich.json new file mode 100644 index 00000000..b8ea6501 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/immich/box-verdict-immich.json @@ -0,0 +1,24 @@ +{ + "app": "immich", + "venue": "box 9202 (drill catalog, controller 0.283.1), the product's guarded Update", + "from": { + "immich-machine-learning": "ghcr.io/immich-app/immich-machine-learning:v3.2.2", + "immich-postgres": "ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0", + "immich-redis": "redis:7-alpine", + "immich-server": "ghcr.io/immich-app/immich-server:v3.2.2" + }, + "to": { + "immich-machine-learning": "ghcr.io/immich-app/immich-machine-learning:v3.2.4", + "immich-postgres": "ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0", + "immich-redis": "redis:7-alpine", + "immich-server": "ghcr.io/immich-app/immich-server:v3.2.4" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "duration_s": 112.0, + "final_phase": "done", + "measured_at": "2026-09-30T12:32:24Z", + "evidence": "felhom.eu/documentation/audits/pg-last-six-2026-09-30/box/immich/step.txt" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/box/immich/prep-attempt1-kept-data.txt b/documentation/audits/pg-last-six-2026-09-30/box/immich/prep-attempt1-kept-data.txt new file mode 100644 index 00000000..b9818d7f --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/immich/prep-attempt1-kept-data.txt @@ -0,0 +1 @@ +deploy/reuse immich: False diff --git a/documentation/audits/pg-last-six-2026-09-30/box/immich/prep.txt b/documentation/audits/pg-last-six-2026-09-30/box/immich/prep.txt new file mode 100644 index 00000000..0d607f64 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/immich/prep.txt @@ -0,0 +1,4 @@ +deploy/reuse immich: True + immich: seeded album drillalbum7859d7f2 + immich: readback found=True (http 200, control passed) +C1 seed reads back BEFORE: True diff --git a/documentation/audits/pg-last-six-2026-09-30/box/immich/step.txt b/documentation/audits/pg-last-six-2026-09-30/box/immich/step.txt new file mode 100644 index 00000000..565def4f --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/immich/step.txt @@ -0,0 +1,35 @@ +before: pinned={'immich-machine-learning': 'ghcr.io/immich-app/immich-machine-learning:v3.2.2', 'immich-postgres': 'ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0', 'immich-redis': 'redis:7-alpine', 'immich-server': 'ghcr.io/immich-app/immich-server:v3.2.2'} +drill: 28721cd DRILL immich: {'immich-server': 'ghcr.io/immich-app/immich-server:v3.2.4', 'immich-machine-learning': 'ghcr.io/immich-app/immich-machine-learning:v3.2.4'} (box proof) + phase +0.0s backing-up | err=None + phase +17.5s safety-dump | err=None + phase +21.6s pulling | err=None + phase +74.0s copying | err=None + phase +79.1s starting | err=None + phase +90.4s verifying | err=None + phase +112.0s done | err=None + immich: readback found=True (http 200, control passed) +2026/09/30 12:32:25 update.go:536: [INFO] [stacks] update immich: accepted — guarded update started +2026/09/30 12:32:25 update.go:1365: [INFO] [stacks] update immich: phase checking +2026/09/30 12:32:25 update.go:786: [INFO] [stacks] update immich: ladder — the last step (3 of 3) — the catalog's current definition +2026/09/30 12:32:25 update.go:816: [INFO] [stacks] update immich: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T12:30:53Z) (found: none) — backing up first +2026/09/30 12:32:25 update.go:1365: [INFO] [stacks] update immich: phase backing-up +2026/09/30 12:32:42 update.go:831: [INFO] [stacks] update immich: precondition met after the backup — Tier 1 (own recovery unit) copy from 2026-09-30T12:32:26Z +2026/09/30 12:32:42 update.go:1365: [INFO] [stacks] update immich: phase safety-dump +2026/09/30 12:32:44 update.go:846: [INFO] [stacks] update immich: safety dump done (1 file(s)) [/mnt/felhom-drives/scratch_hdd/userdata/immich/backups/primary/immich/db-dumps/pre-restore-20260930T123242Z-immich-postgres.sql] +2026/09/30 12:32:46 undo.go:287: [INFO] [stacks] update immich: the undo copy will hold 3 named volume(s), 308.3 MiB +2026/09/30 12:32:46 update.go:1365: [INFO] [stacks] update immich: phase pinning +2026/09/30 12:32:46 pin.go:373: [INFO] [stacks] update immich: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/immich/docker-compose.yml (immich-machine-learning=ghcr.io/immich-app/immich-machine-learning:v3.2.4, immich-postgres=ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0, immich-redis=redis:7-alpine, immich-server=ghcr.io/immich-app/immich-server:v3.2 +2026/09/30 12:32:46 update.go:1365: [INFO] [stacks] update immich: phase pulling +2026/09/30 12:33:39 update.go:1365: [INFO] [stacks] update immich: phase copying +2026/09/30 12:33:41 update.go:1365: [INFO] [stacks] update immich: phase copying +2026/09/30 12:33:41 undo.go:437: [INFO] [stacks] update immich: copied immich_immich_ml_cache → immich_immich_ml_cache.pre-update-20260930T123341Z in 624ms +2026/09/30 12:33:41 update.go:1365: [INFO] [stacks] update immich: phase copying +2026/09/30 12:33:43 undo.go:437: [INFO] [stacks] update immich: copied immich_immich_postgres_data → immich_immich_postgres_data.pre-update-20260930T123341Z in 1.974s +2026/09/30 12:33:43 update.go:1365: [INFO] [stacks] update immich: phase copying +2026/09/30 12:33:44 undo.go:437: [INFO] [stacks] update immich: copied immich_immich_redis_data → immich_immich_redis_data.pre-update-20260930T123341Z in 574ms +2026/09/30 12:33:44 update.go:1365: [INFO] [stacks] update immich: phase starting +2026/09/30 12:33:55 update.go:1365: [INFO] [stacks] update immich: phase verifying +2026/09/30 12:34:16 update.go:997: [INFO] [stacks] update immich: healthy after 20s (the app's health check passed) +2026/09/30 12:34:17 update.go:1033: [INFO] [stacks] update immich: DONE in 1m51s + +RESULT final_phase=done after={'immich-machine-learning': 'ghcr.io/immich-app/immich-machine-learning:v3.2.4', 'immich-postgres': 'ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0', 'immich-redis': 'redis:7-alpine', 'immich-server': 'ghcr.io/immich-app/immich-server:v3.2.4'} seed_after=True verdict=proven (112.0 s) diff --git a/documentation/audits/pg-last-six-2026-09-30/box/kimai/box-verdict-kimai.json b/documentation/audits/pg-last-six-2026-09-30/box/kimai/box-verdict-kimai.json new file mode 100644 index 00000000..8f6bfaa0 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/kimai/box-verdict-kimai.json @@ -0,0 +1,20 @@ +{ + "app": "kimai", + "venue": "box 9202 (drill catalog, controller 0.283.1), the product's guarded Update", + "from": { + "kimai": "kimai/kimai2:apache-2.57.0", + "kimai-db": "mariadb:11.8" + }, + "to": { + "kimai": "kimai/kimai2:2.67.0", + "kimai-db": "mariadb:11.8" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "duration_s": 82.1, + "final_phase": "done", + "measured_at": "2026-09-30T11:25:39Z", + "evidence": "felhom.eu/documentation/audits/pg-last-six-2026-09-30/box/kimai/step.txt" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/box/kimai/prep.txt b/documentation/audits/pg-last-six-2026-09-30/box/kimai/prep.txt new file mode 100644 index 00000000..bcc0f4ba --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/kimai/prep.txt @@ -0,0 +1,4 @@ +deploy/reuse kimai: True + kimai: seeded user drill4817490d + kimai: readback found=True (control passed) +C1 seed reads back BEFORE: True diff --git a/documentation/audits/pg-last-six-2026-09-30/box/kimai/step.txt b/documentation/audits/pg-last-six-2026-09-30/box/kimai/step.txt new file mode 100644 index 00000000..c5a7596e --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/kimai/step.txt @@ -0,0 +1,33 @@ +before: pinned={'kimai': 'kimai/kimai2:apache-2.57.0', 'kimai-db': 'mariadb:11.8'} +drill: 4b564b1 DRILL kimai: {'kimai': 'kimai/kimai2:2.67.0'} (box proof) + phase +0.0s backing-up | err=None + phase +11.3s safety-dump | err=None + phase +13.4s pulling | err=None + phase +31.8s copying | err=None + phase +45.1s starting | err=None + phase +51.3s verifying | err=None + phase +82.1s done | err=None + kimai: readback found=True (control passed) +2026/09/30 11:25:41 update.go:536: [INFO] [stacks] update kimai: accepted — guarded update started +2026/09/30 11:25:41 update.go:1365: [INFO] [stacks] update kimai: phase checking +2026/09/30 11:25:41 update.go:786: [INFO] [stacks] update kimai: ladder — the last step (2 of 2) — the catalog's current definition +2026/09/30 11:25:41 update.go:816: [INFO] [stacks] update kimai: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T11:11:57Z) (found: none) — backing up first +2026/09/30 11:25:41 update.go:1365: [INFO] [stacks] update kimai: phase backing-up +2026/09/30 11:25:52 update.go:831: [INFO] [stacks] update kimai: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-30T11:25:41Z +2026/09/30 11:25:52 update.go:1365: [INFO] [stacks] update kimai: phase safety-dump +2026/09/30 11:25:52 update.go:846: [INFO] [stacks] update kimai: safety dump done (1 file(s)) [/mnt/sys_drive/felhom-data/backups/primary/kimai/db-dumps/pre-restore-20260930T112552Z-kimai-mariadb.sql] +2026/09/30 11:25:53 undo.go:287: [INFO] [stacks] update kimai: the undo copy will hold 2 named volume(s), 212.8 MiB +2026/09/30 11:25:53 update.go:1365: [INFO] [stacks] update kimai: phase pinning +2026/09/30 11:25:53 pin.go:373: [INFO] [stacks] update kimai: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/kimai/docker-compose.yml (kimai=kimai/kimai2:2.67.0, kimai-db=mariadb:11.8) +2026/09/30 11:25:53 update.go:1365: [INFO] [stacks] update kimai: phase pulling +2026/09/30 11:26:12 update.go:1365: [INFO] [stacks] update kimai: phase copying +2026/09/30 11:26:22 update.go:1365: [INFO] [stacks] update kimai: phase copying +2026/09/30 11:26:24 undo.go:437: [INFO] [stacks] update kimai: copied kimai_kimai_db_data → kimai_kimai_db_data.pre-update-20260930T112622Z in 1.398s +2026/09/30 11:26:24 update.go:1365: [INFO] [stacks] update kimai: phase copying +2026/09/30 11:26:25 undo.go:437: [INFO] [stacks] update kimai: copied kimai_kimai_var → kimai_kimai_var.pre-update-20260930T112622Z in 1.301s +2026/09/30 11:26:25 update.go:1365: [INFO] [stacks] update kimai: phase starting +2026/09/30 11:26:31 update.go:1365: [INFO] [stacks] update kimai: phase verifying +2026/09/30 11:27:02 update.go:997: [INFO] [stacks] update kimai: healthy after 30s (the app's health check passed) +2026/09/30 11:27:02 update.go:1033: [INFO] [stacks] update kimai: DONE in 1m22s + +RESULT final_phase=done after={'kimai': 'kimai/kimai2:2.67.0', 'kimai-db': 'mariadb:11.8'} seed_after=True verdict=proven (82.1 s) diff --git a/documentation/audits/pg-last-six-2026-09-30/box/komga/box-verdict-komga.json b/documentation/audits/pg-last-six-2026-09-30/box/komga/box-verdict-komga.json new file mode 100644 index 00000000..e2aa3a0a --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/komga/box-verdict-komga.json @@ -0,0 +1,18 @@ +{ + "app": "komga", + "venue": "box 9202 (drill catalog, controller 0.283.1), the product's guarded Update", + "from": { + "komga": "gotson/komga:1.27.1" + }, + "to": { + "komga": "gotson/komga:1.28.0" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "duration_s": 44.2, + "final_phase": "done", + "measured_at": "2026-09-30T12:13:18Z", + "evidence": "felhom.eu/documentation/audits/pg-last-six-2026-09-30/box/komga/step.txt" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/box/komga/prep.txt b/documentation/audits/pg-last-six-2026-09-30/box/komga/prep.txt new file mode 100644 index 00000000..354e3dbd --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/komga/prep.txt @@ -0,0 +1,4 @@ +deploy/reuse komga: True + komga: claimed the server as drill1fa1c6f2@example.invalid + komga: readback found=True (http 200, control refused 401) +C1 seed reads back BEFORE: True diff --git a/documentation/audits/pg-last-six-2026-09-30/box/komga/step.txt b/documentation/audits/pg-last-six-2026-09-30/box/komga/step.txt new file mode 100644 index 00000000..03ef619d --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/komga/step.txt @@ -0,0 +1,31 @@ +before: pinned={'komga': 'gotson/komga:1.27.1'} +drill: 50db1ed DRILL komga: {'komga': 'gotson/komga:1.28.0'} (box proof) + phase +0.0s backing-up | err=None + phase +4.1s safety-dump | err=None + phase +5.1s pulling | err=None + phase +13.4s copying | err=None + phase +22.6s starting | err=None + phase +23.6s verifying | err=None + phase +44.1s done | err=None + komga: readback found=True (http 200, control refused 401) +2026/09/30 12:13:19 update.go:536: [INFO] [stacks] update komga: accepted — guarded update started +2026/09/30 12:13:19 update.go:1365: [INFO] [stacks] update komga: phase checking +2026/09/30 12:13:19 update.go:786: [INFO] [stacks] update komga: ladder — the last step (2 of 2) — the catalog's current definition +2026/09/30 12:13:19 update.go:816: [INFO] [stacks] update komga: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T12:07:13Z) (found: none) — backing up first +2026/09/30 12:13:19 update.go:1365: [INFO] [stacks] update komga: phase backing-up +2026/09/30 12:13:22 update.go:831: [INFO] [stacks] update komga: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-30T12:13:22Z +2026/09/30 12:13:22 update.go:1365: [INFO] [stacks] update komga: phase safety-dump +2026/09/30 12:13:22 update.go:846: [INFO] [stacks] update komga: safety dump done (0 file(s)) [] +2026/09/30 12:13:23 undo.go:287: [INFO] [stacks] update komga: the undo copy will hold 1 named volume(s), 0.6 MiB +2026/09/30 12:13:23 update.go:1365: [INFO] [stacks] update komga: phase pinning +2026/09/30 12:13:23 pin.go:373: [INFO] [stacks] update komga: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/komga/docker-compose.yml (komga=gotson/komga:1.28.0) +2026/09/30 12:13:23 update.go:1365: [INFO] [stacks] update komga: phase pulling +2026/09/30 12:13:31 update.go:1365: [INFO] [stacks] update komga: phase copying +2026/09/30 12:13:41 update.go:1365: [INFO] [stacks] update komga: phase copying +2026/09/30 12:13:41 undo.go:437: [INFO] [stacks] update komga: copied komga_komga_config → komga_komga_config.pre-update-20260930T121341Z in 445ms +2026/09/30 12:13:41 update.go:1365: [INFO] [stacks] update komga: phase starting +2026/09/30 12:13:41 update.go:1365: [INFO] [stacks] update komga: phase verifying +2026/09/30 12:14:02 update.go:997: [INFO] [stacks] update komga: healthy after 20s (the app's health check passed) +2026/09/30 12:14:02 update.go:1033: [INFO] [stacks] update komga: DONE in 43s + +RESULT final_phase=done after={'komga': 'gotson/komga:1.28.0'} seed_after=True verdict=proven (44.2 s) diff --git a/documentation/audits/pg-last-six-2026-09-30/box/n8n/box-verdict-n8n.json b/documentation/audits/pg-last-six-2026-09-30/box/n8n/box-verdict-n8n.json new file mode 100644 index 00000000..89cb8663 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/n8n/box-verdict-n8n.json @@ -0,0 +1,18 @@ +{ + "app": "n8n", + "venue": "box 9202 (drill catalog, controller 0.283.1), the product's guarded Update", + "from": { + "n8n": "n8nio/n8n:2.41.2" + }, + "to": { + "n8n": "n8nio/n8n:2.42.1" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "duration_s": 122.1, + "final_phase": "done", + "measured_at": "2026-09-30T12:09:14Z", + "evidence": "felhom.eu/documentation/audits/pg-last-six-2026-09-30/box/n8n/step.txt" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/box/n8n/prep.txt b/documentation/audits/pg-last-six-2026-09-30/box/n8n/prep.txt new file mode 100644 index 00000000..1b30b41d --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/n8n/prep.txt @@ -0,0 +1,17 @@ +deploy/reuse n8n: True + n8n: /rest/owner/setup http=404 + n8n: refused + + + +Error + + +
Cannot POST /rest/owner/setup
+ + + +deploy/reuse n8n: True + n8n: /rest/owner/setup http=200 + n8n: login as the seeded owner http=200 ok=True +C1 seed reads back BEFORE: True diff --git a/documentation/audits/pg-last-six-2026-09-30/box/n8n/step.txt b/documentation/audits/pg-last-six-2026-09-30/box/n8n/step.txt new file mode 100644 index 00000000..f4d08484 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/n8n/step.txt @@ -0,0 +1,30 @@ +before: pinned={'n8n': 'n8nio/n8n:2.41.2'} +drill: 84921d9 DRILL n8n: {'n8n': 'n8nio/n8n:2.42.1'} (box proof) + phase +0.0s backing-up | err=None + phase +2.1s safety-dump | err=None + phase +3.1s pulling | err=None + phase +109.7s copying | err=None + phase +111.8s verifying | err=None + phase +122.0s done | err=None + n8n: login as the seeded owner http=200 ok=True +2026/09/30 12:09:15 update.go:536: [INFO] [stacks] update n8n: accepted — guarded update started +2026/09/30 12:09:15 update.go:1365: [INFO] [stacks] update n8n: phase checking +2026/09/30 12:09:15 update.go:786: [INFO] [stacks] update n8n: ladder — the last step (4 of 4) — the catalog's current definition +2026/09/30 12:09:15 update.go:816: [INFO] [stacks] update n8n: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T12:04:32Z) (found: none) — backing up first +2026/09/30 12:09:15 update.go:1365: [INFO] [stacks] update n8n: phase backing-up +2026/09/30 12:09:17 update.go:831: [INFO] [stacks] update n8n: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-30T12:09:16Z +2026/09/30 12:09:17 update.go:1365: [INFO] [stacks] update n8n: phase safety-dump +2026/09/30 12:09:17 update.go:846: [INFO] [stacks] update n8n: safety dump done (0 file(s)) [] +2026/09/30 12:09:17 undo.go:287: [INFO] [stacks] update n8n: the undo copy will hold 1 named volume(s), 5.4 MiB +2026/09/30 12:09:17 update.go:1365: [INFO] [stacks] update n8n: phase pinning +2026/09/30 12:09:17 pin.go:373: [INFO] [stacks] update n8n: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/n8n/docker-compose.yml (n8n=n8nio/n8n:2.42.1) +2026/09/30 12:09:17 update.go:1365: [INFO] [stacks] update n8n: phase pulling +2026/09/30 12:11:04 update.go:1365: [INFO] [stacks] update n8n: phase copying +2026/09/30 12:11:05 update.go:1365: [INFO] [stacks] update n8n: phase copying +2026/09/30 12:11:06 undo.go:437: [INFO] [stacks] update n8n: copied n8n_n8n_data → n8n_n8n_data.pre-update-20260930T121105Z in 486ms +2026/09/30 12:11:06 update.go:1365: [INFO] [stacks] update n8n: phase starting +2026/09/30 12:11:06 update.go:1365: [INFO] [stacks] update n8n: phase verifying +2026/09/30 12:11:16 update.go:997: [INFO] [stacks] update n8n: healthy after 10s (the app's health check passed) +2026/09/30 12:11:17 update.go:1033: [INFO] [stacks] update n8n: DONE in 2m2s + +RESULT final_phase=done after={'n8n': 'n8nio/n8n:2.42.1'} seed_after=True verdict=proven (122.1 s) diff --git a/documentation/audits/pg-last-six-2026-09-30/box/navidrome/box-verdict-navidrome.json b/documentation/audits/pg-last-six-2026-09-30/box/navidrome/box-verdict-navidrome.json new file mode 100644 index 00000000..608ae15a --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/navidrome/box-verdict-navidrome.json @@ -0,0 +1,18 @@ +{ + "app": "navidrome", + "venue": "box 9202 (drill catalog, controller 0.283.1), the product's guarded Update", + "from": { + "navidrome": "deluan/navidrome:0.64.1" + }, + "to": { + "navidrome": "deluan/navidrome:0.64.2" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "duration_s": 14.4, + "final_phase": "done", + "measured_at": "2026-09-30T12:11:38Z", + "evidence": "felhom.eu/documentation/audits/pg-last-six-2026-09-30/box/navidrome/step.txt" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/box/navidrome/prep.txt b/documentation/audits/pg-last-six-2026-09-30/box/navidrome/prep.txt new file mode 100644 index 00000000..348a44a0 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/navidrome/prep.txt @@ -0,0 +1,4 @@ +deploy/reuse navidrome: True + navidrome: createAdmin http=200 + navidrome: login as the seeded user http=200 ok=True +C1 seed reads back BEFORE: True diff --git a/documentation/audits/pg-last-six-2026-09-30/box/navidrome/step.txt b/documentation/audits/pg-last-six-2026-09-30/box/navidrome/step.txt new file mode 100644 index 00000000..c0612ca7 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/navidrome/step.txt @@ -0,0 +1,29 @@ +before: pinned={'navidrome': 'deluan/navidrome:0.64.1'} +drill: 37cb7ef DRILL navidrome: {'navidrome': 'deluan/navidrome:0.64.2'} (box proof) + phase +0.0s backing-up | err=None + phase +2.1s pulling | err=None + phase +7.2s copying | err=None + phase +8.2s verifying | err=None + phase +14.4s done | err=None + navidrome: login as the seeded user http=200 ok=True +2026/09/30 12:11:40 update.go:536: [INFO] [stacks] update navidrome: accepted — guarded update started +2026/09/30 12:11:40 update.go:1365: [INFO] [stacks] update navidrome: phase checking +2026/09/30 12:11:40 update.go:786: [INFO] [stacks] update navidrome: ladder — the last step (3 of 3) — the catalog's current definition +2026/09/30 12:11:40 update.go:816: [INFO] [stacks] update navidrome: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T12:04:02Z) (found: none) — backing up first +2026/09/30 12:11:40 update.go:1365: [INFO] [stacks] update navidrome: phase backing-up +2026/09/30 12:11:41 update.go:831: [INFO] [stacks] update navidrome: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-30T12:11:40Z +2026/09/30 12:11:41 update.go:1365: [INFO] [stacks] update navidrome: phase safety-dump +2026/09/30 12:11:41 update.go:846: [INFO] [stacks] update navidrome: safety dump done (0 file(s)) [] +2026/09/30 12:11:42 undo.go:287: [INFO] [stacks] update navidrome: the undo copy will hold 1 named volume(s), 0.7 MiB +2026/09/30 12:11:42 update.go:1365: [INFO] [stacks] update navidrome: phase pinning +2026/09/30 12:11:42 pin.go:373: [INFO] [stacks] update navidrome: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/navidrome/docker-compose.yml (navidrome=deluan/navidrome:0.64.2) +2026/09/30 12:11:42 update.go:1365: [INFO] [stacks] update navidrome: phase pulling +2026/09/30 12:11:46 update.go:1365: [INFO] [stacks] update navidrome: phase copying +2026/09/30 12:11:47 update.go:1365: [INFO] [stacks] update navidrome: phase copying +2026/09/30 12:11:47 undo.go:437: [INFO] [stacks] update navidrome: copied navidrome_navidrome_data → navidrome_navidrome_data.pre-update-20260930T121147Z in 474ms +2026/09/30 12:11:47 update.go:1365: [INFO] [stacks] update navidrome: phase starting +2026/09/30 12:11:48 update.go:1365: [INFO] [stacks] update navidrome: phase verifying +2026/09/30 12:11:53 update.go:997: [INFO] [stacks] update navidrome: healthy after 5s (the app's health check passed) +2026/09/30 12:11:53 update.go:1033: [INFO] [stacks] update navidrome: DONE in 14s + +RESULT final_phase=done after={'navidrome': 'deluan/navidrome:0.64.2'} seed_after=True verdict=proven (14.4 s) diff --git a/documentation/audits/pg-last-six-2026-09-30/box/outline/box-verdict-outline.json b/documentation/audits/pg-last-six-2026-09-30/box/outline/box-verdict-outline.json new file mode 100644 index 00000000..e7be1bfb --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/outline/box-verdict-outline.json @@ -0,0 +1,29 @@ +{ + "app": "outline", + "venue": "box 9202 (drill catalog, controller 0.283.1), the product's guarded Update", + "from": { + "outline": "outlinewiki/outline:1.9.1", + "outline-postgres": "postgres:16-alpine", + "outline-redis": "redis:7-alpine" + }, + "to": { + "outline": "outlinewiki/outline:1.9.1", + "outline-postgres": "postgres:18-alpine", + "outline-redis": "redis:7-alpine" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "engine_conversion": { + "service": "outline-postgres", + "engine": "postgres", + "from": 16, + "to": 18, + "result": "converted", + "controller_line": "update outline: CONVERTED 16 \u2192 18 in 7.925s \u2014 the check is equal (2 database(s), 42 table(s), 312 row(s)), PG_VERSION 18" + }, + "duration_s": 41.1, + "measured_at": "2026-09-30T10:51:45Z", + "evidence": "felhom.eu/documentation/audits/pg-last-six-2026-09-30/box/outline/move.txt" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/box/outline/drill.txt b/documentation/audits/pg-last-six-2026-09-30/box/outline/drill.txt new file mode 100644 index 00000000..39a6526c --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/outline/drill.txt @@ -0,0 +1 @@ +3d7f388 DRILL outline: outline-postgres postgres:16-alpine -> postgres:18-alpine with the engine_conversion mark (box proof) diff --git a/documentation/audits/pg-last-six-2026-09-30/box/outline/move.txt b/documentation/audits/pg-last-six-2026-09-30/box/outline/move.txt new file mode 100644 index 00000000..e92ae272 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/outline/move.txt @@ -0,0 +1,43 @@ +before: pinned={'outline': 'outlinewiki/outline:1.9.1', 'outline-postgres': 'postgres:16-alpine', 'outline-redis': 'redis:7-alpine'} PG_VERSION=16 +drill: SKIPPED — the drill commit was made by an earlier attempt + phase +0.0s safety-dump | err=None + phase +3.1s pulling | err=None + phase +4.1s copying | err=None + phase +11.3s converting | err=None + phase +19.5s starting | err=None + phase +24.7s verifying | err=None + phase +41.1s done | err=None + outline: readback of the seeded document http=200 found=True +2026/09/30 10:51:46 update.go:536: [INFO] [stacks] update outline: accepted — guarded update started +2026/09/30 10:51:46 update.go:1365: [INFO] [stacks] update outline: phase checking +2026/09/30 10:51:46 update.go:786: [INFO] [stacks] update outline: ladder — the last step (1 of 1) — the catalog's current definition +2026/09/30 10:51:46 update.go:800: [INFO] [stacks] update outline: this step CONVERTS outline-postgres PostgreSQL 16 → 18 (the ladder entry's mark); database volume outline_outline_postgres_data +2026/09/30 10:51:46 update.go:814: [INFO] [stacks] update outline: precondition met — Tier 2 (second drive) copy from 2026-09-30T10:50:18Z (1m0s old, limit 24h0m0s) +2026/09/30 10:51:46 update.go:1365: [INFO] [stacks] update outline: phase safety-dump +2026/09/30 10:51:46 update.go:846: [INFO] [stacks] update outline: safety dump done (1 file(s)) [/mnt/sys_drive/felhom-data/backups/primary/outline/db-dumps/pre-restore-20260930T105146Z-outline-postgres.sql] +2026/09/30 10:51:48 undo.go:287: [INFO] [stacks] update outline: the undo copy will hold 3 named volume(s), 65.3 MiB +2026/09/30 10:51:48 pgconvert.go:340: [INFO] [stacks] update outline: conversion space — database volume outline_outline_postgres_data is 65 MB; the dump needs up to 82 MB + the 2 GB floor; 27.7 GB free beside the stack dir +2026/09/30 10:51:48 update.go:1365: [INFO] [stacks] update outline: phase pinning +2026/09/30 10:51:48 pin.go:373: [INFO] [stacks] update outline: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/outline/docker-compose.yml (outline=outlinewiki/outline:1.9.1, outline-postgres=postgres:18-alpine, outline-redis=redis:7-alpine) +2026/09/30 10:51:48 update.go:1365: [INFO] [stacks] update outline: phase pulling +2026/09/30 10:51:49 update.go:1365: [INFO] [stacks] update outline: phase copying +2026/09/30 10:51:55 update.go:1365: [INFO] [stacks] update outline: phase copying +2026/09/30 10:51:55 undo.go:437: [INFO] [stacks] update outline: copied outline_outline_data → outline_outline_data.pre-update-20260930T105155Z in 494ms +2026/09/30 10:51:55 update.go:1365: [INFO] [stacks] update outline: phase copying +2026/09/30 10:51:56 undo.go:437: [INFO] [stacks] update outline: copied outline_outline_postgres_data → outline_outline_postgres_data.pre-update-20260930T105155Z in 724ms +2026/09/30 10:51:56 update.go:1365: [INFO] [stacks] update outline: phase copying +2026/09/30 10:51:56 undo.go:437: [INFO] [stacks] update outline: copied outline_outline_redis_data → outline_outline_redis_data.pre-update-20260930T105155Z in 443ms +2026/09/30 10:51:56 update.go:1365: [INFO] [stacks] update outline: phase converting +2026/09/30 10:51:56 pgconvert.go:423: [INFO] [stacks] update outline: CONVERTING outline-postgres PostgreSQL 16 → 18 (volume outline_outline_postgres_data, kept copy outline_outline_postgres_data.pre-update-20260930T105155Z) +2026/09/30 10:51:58 pgconvert.go:468: [INFO] [stacks] update outline: pg_dumpall from 16 done in 522ms — 124 kB, completion line present; before: 2 database(s), 42 table(s), 312 row(s) +2026/09/30 10:51:59 update.go:1365: [INFO] [stacks] update outline: phase converting +2026/09/30 10:51:59 pgconvert.go:484: [INFO] [stacks] update outline: database volume outline_outline_postgres_data emptied (its copy outline_outline_postgres_data.pre-update-20260930T105155Z holds the old datadir, marker checked twice) +2026/09/30 10:52:04 pgconvert.go:513: [INFO] [stacks] update outline: loaded into 18 in 1.674s (dropped the entrypoint's empty database(s) [outline]; skipped CREATE ROLE for [outline]) +2026/09/30 10:52:04 pgconvert.go:529: [INFO] [stacks] update outline: CONVERTED 16 → 18 in 7.925s — the check is equal (2 database(s), 42 table(s), 312 row(s)), PG_VERSION 18 +2026/09/30 10:52:04 update.go:1365: [INFO] [stacks] update outline: phase starting +2026/09/30 10:52:10 update.go:1365: [INFO] [stacks] update outline: phase verifying +2026/09/30 10:52:26 update.go:997: [INFO] [stacks] update outline: healthy after 15s (the app's health check passed) +2026/09/30 10:52:26 update.go:1015: [INFO] [stacks] update outline: KEEPING the pre-conversion datadir copy outline_outline_postgres_data.pre-update-20260930T105155Z (PostgreSQL 16) until a backup of the converted app is proven +2026/09/30 10:52:26 update.go:1033: [INFO] [stacks] update outline: DONE in 40s + +RESULT final_phase=done PG_VERSION=18 seed_after=True verdict=proven diff --git a/documentation/audits/pg-last-six-2026-09-30/box/outline/prep.txt b/documentation/audits/pg-last-six-2026-09-30/box/outline/prep.txt new file mode 100644 index 00000000..d08eddbe --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/outline/prep.txt @@ -0,0 +1,5 @@ +deploy/reuse outline: True + outline: installation.create http=302 + outline: seeded document drilldoc-0c13e51d + outline: readback of the seeded document http=200 found=True +C1 seed reads back BEFORE: True diff --git a/documentation/audits/pg-last-six-2026-09-30/box/outline/undo-verdict.json b/documentation/audits/pg-last-six-2026-09-30/box/outline/undo-verdict.json new file mode 100644 index 00000000..6f3f6f98 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/outline/undo-verdict.json @@ -0,0 +1,22 @@ +{ + "app": "outline", + "case": "the load into 18 fails (adminpack, an object 18 lacks)", + "venue": "box 9202, the product's guarded Update", + "final_phase": "undone", + "duration_s": 57.5, + "pg_version_after": "16", + "pinned_before": { + "outline": "outlinewiki/outline:1.9.1", + "outline-postgres": "postgres:16-alpine", + "outline-redis": "redis:7-alpine" + }, + "pinned_after": { + "outline": "outlinewiki/outline:1.9.1", + "outline-postgres": "postgres:16-alpine", + "outline-redis": "redis:7-alpine" + }, + "seed_read_after": true, + "undone_line": "update outline: UNDONE in 25s \u2014 the previous version is running on the data from before the update (the app's health check passed)", + "ok": true, + "measured_at": "2026-09-30T10:50:16Z" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/box/outline/undo.txt b/documentation/audits/pg-last-six-2026-09-30/box/outline/undo.txt new file mode 100644 index 00000000..f56b1391 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/outline/undo.txt @@ -0,0 +1,55 @@ +# undo case (the load fails) — 2026-09-30T12:50:03+0200 +before: PG_VERSION=16 pinned={'outline': 'outlinewiki/outline:1.9.1', 'outline-postgres': 'postgres:16-alpine', 'outline-redis': 'redis:7-alpine'} + outline: readback of the seeded document http=200 found=True +before: seed reads back through the front door = True +setup: CREATE EXTENSION adminpack -> CREATE EXTENSION +setup: extensions now: adminpack pg_trgm plpgsql unaccent uuid-ossp +control: 18 has no adminpack: 0 + phase +0.0s backing-up | err=None + phase +15.4s safety-dump | err=None + phase +17.5s pulling | err=None + phase +18.5s copying | err=None + phase +25.7s converting | err=None + phase +31.8s undoing | err=None + phase +57.5s undone | err=None +result: {"accepted": true, "http": "202", "duration_s": 57.5, "final_phase": "undone", "update_error": null, "hold_reason": null, "state": "running"} + outline: readback of the seeded document http=200 found=True +after: PG_VERSION=16 pinned={'outline': 'outlinewiki/outline:1.9.1', 'outline-postgres': 'postgres:16-alpine', 'outline-redis': 'redis:7-alpine'} state=running +after: seed reads back through the front door = True +controller lines: +2026/09/30 10:50:18 update.go:536: [INFO] [stacks] update outline: accepted — guarded update started +2026/09/30 10:50:18 update.go:1365: [INFO] [stacks] update outline: phase checking +2026/09/30 10:50:18 update.go:786: [INFO] [stacks] update outline: ladder — the last step (1 of 1) — the catalog's current definition +2026/09/30 10:50:18 update.go:800: [INFO] [stacks] update outline: this step CONVERTS outline-postgres PostgreSQL 16 → 18 (the ladder entry's mark); database volume outline_outline_postgres_data +2026/09/30 10:50:18 update.go:816: [INFO] [stacks] update outline: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T10:42:23Z) (found: none) — backing up first +2026/09/30 10:50:18 update.go:1365: [INFO] [stacks] update outline: phase backing-up +2026/09/30 10:50:32 update.go:831: [INFO] [stacks] update outline: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-30T10:50:18Z +2026/09/30 10:50:32 update.go:1365: [INFO] [stacks] update outline: phase safety-dump +2026/09/30 10:50:33 update.go:846: [INFO] [stacks] update outline: safety dump done (1 file(s)) [/mnt/sys_drive/felhom-data/backups/primary/outline/db-dumps/pre-restore-20260930T105033Z-outline-postgres.sql] +2026/09/30 10:50:34 undo.go:287: [INFO] [stacks] update outline: the undo copy will hold 3 named volume(s), 65.1 MiB +2026/09/30 10:50:35 pgconvert.go:340: [INFO] [stacks] update outline: conversion space — database volume outline_outline_postgres_data is 65 MB; the dump needs up to 81 MB + the 2 GB floor; 27.7 GB free beside the stack dir +2026/09/30 10:50:35 update.go:1365: [INFO] [stacks] update outline: phase pinning +2026/09/30 10:50:35 pin.go:373: [INFO] [stacks] update outline: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/outline/docker-compose.yml (outline=outlinewiki/outline:1.9.1, outline-postgres=postgres:18-alpine, outline-redis=redis:7-alpine) +2026/09/30 10:50:35 update.go:1365: [INFO] [stacks] update outline: phase pulling +2026/09/30 10:50:36 update.go:1365: [INFO] [stacks] update outline: phase copying +2026/09/30 10:50:42 update.go:1365: [INFO] [stacks] update outline: phase copying +2026/09/30 10:50:42 undo.go:437: [INFO] [stacks] update outline: copied outline_outline_data → outline_outline_data.pre-update-20260930T105042Z in 523ms +2026/09/30 10:50:42 update.go:1365: [INFO] [stacks] update outline: phase copying +2026/09/30 10:50:43 undo.go:437: [INFO] [stacks] update outline: copied outline_outline_postgres_data → outline_outline_postgres_data.pre-update-20260930T105042Z in 732ms +2026/09/30 10:50:43 update.go:1365: [INFO] [stacks] update outline: phase copying +2026/09/30 10:50:43 undo.go:437: [INFO] [stacks] update outline: copied outline_outline_redis_data → outline_outline_redis_data.pre-update-20260930T105042Z in 425ms +2026/09/30 10:50:43 update.go:1365: [INFO] [stacks] update outline: phase converting +2026/09/30 10:50:43 pgconvert.go:423: [INFO] [stacks] update outline: CONVERTING outline-postgres PostgreSQL 16 → 18 (volume outline_outline_postgres_data, kept copy outline_outline_postgres_data.pre-update-20260930T105042Z) +2026/09/30 10:50:45 pgconvert.go:468: [INFO] [stacks] update outline: pg_dumpall from 16 done in 608ms — 125 kB, completion line present; before: 2 database(s), 42 table(s), 312 row(s) +2026/09/30 10:50:45 update.go:1365: [INFO] [stacks] update outline: phase converting +2026/09/30 10:50:46 pgconvert.go:484: [INFO] [stacks] update outline: database volume outline_outline_postgres_data emptied (its copy outline_outline_postgres_data.pre-update-20260930T105042Z holds the old datadir, marker checked twice) +2026/09/30 10:50:49 update.go:1066: [ERROR] [stacks] update outline FAILED after the new version was started: conversion failed: loading the dump into 18: exit status 3 (psql: ERROR: extension "adminpack" is not available) +2026/09/30 10:50:49 update.go:1058: [INFO] [stacks] update outline: kept 8049 bytes of the app's own log at /opt/docker/stacks/outline/hold-logs/20260930T105049Z/compose-logs.txt before stopping it (R-621) +2026/09/30 10:50:49 update.go:1365: [INFO] [stacks] update outline: phase undoing +2026/09/30 10:50:49 undo.go:515: [WARN] [stacks] update outline: UNDO — putting back the previous version and its 3 volume copy(ies) (reason: conversion failed: loading the dump into 18: exit status 3 (psql: ERROR: extension "adminpack" is not available)) +2026/09/30 10:51:14 unattended.go:511: [INFO] [stacks] update outline: step outline=outlinewiki/outline:1.9.1, outline-postgres=postgres:18-alpine, outline-redis=redis:7-alpine recorded as undone — the automatic leg will not press it again until the catalog's ladder changes (ladder c1eaa565b2a5d069) +2026/09/30 10:51:14 undo.go:640: [INFO] [stacks] update outline: event app_update_undone +2026/09/30 10:51:14 undo.go:568: [INFO] [stacks] update outline: UNDONE in 25s — the previous version is running on the data from before the update (the app's health check passed) + +cleanup: DROP EXTENSION adminpack -> DROP EXTENSION +RESULT undo case ok=True final_phase=undone PG_VERSION=16 seed_after=True diff --git a/documentation/audits/pg-last-six-2026-09-30/box/rallly/box-verdict-rallly.json b/documentation/audits/pg-last-six-2026-09-30/box/rallly/box-verdict-rallly.json new file mode 100644 index 00000000..aae6041b --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/rallly/box-verdict-rallly.json @@ -0,0 +1,27 @@ +{ + "app": "rallly", + "venue": "box 9202 (drill catalog, controller 0.283.1), the product's guarded Update", + "from": { + "rallly": "lukevella/rallly:4.11.1", + "rallly-postgres": "postgres:16-alpine" + }, + "to": { + "rallly": "lukevella/rallly:4.11.1", + "rallly-postgres": "postgres:18-alpine" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "engine_conversion": { + "service": "rallly-postgres", + "engine": "postgres", + "from": 16, + "to": 18, + "result": "converted", + "controller_line": "update rallly: CONVERTED 16 \u2192 18 in 7.061s \u2014 the check is equal (2 database(s), 31 table(s), 138 row(s)), PG_VERSION 18" + }, + "duration_s": 32.9, + "measured_at": "2026-09-30T10:49:06Z", + "evidence": "felhom.eu/documentation/audits/pg-last-six-2026-09-30/box/rallly/move.txt" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/box/rallly/drill.txt b/documentation/audits/pg-last-six-2026-09-30/box/rallly/drill.txt new file mode 100644 index 00000000..cea5f2d7 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/rallly/drill.txt @@ -0,0 +1 @@ +6093edc DRILL rallly: rallly-postgres postgres:16-alpine -> postgres:18-alpine with the engine_conversion mark (box proof) diff --git a/documentation/audits/pg-last-six-2026-09-30/box/rallly/move.txt b/documentation/audits/pg-last-six-2026-09-30/box/rallly/move.txt new file mode 100644 index 00000000..710f7ab5 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/rallly/move.txt @@ -0,0 +1,39 @@ +before: pinned={'rallly': 'lukevella/rallly:4.11.1', 'rallly-postgres': 'postgres:16-alpine'} PG_VERSION=16 +drill: SKIPPED — the drill commit was made by an earlier attempt + phase +0.0s safety-dump | err=None + phase +2.1s pulling | err=None + phase +3.1s copying | err=None + phase +14.4s converting | err=None + phase +21.6s starting | err=None + phase +22.6s verifying | err=None + phase +32.8s done | err=None + rallly: readback of the seeded poll http=200 found=True +2026/09/30 10:49:08 update.go:536: [INFO] [stacks] update rallly: accepted — guarded update started +2026/09/30 10:49:08 update.go:1365: [INFO] [stacks] update rallly: phase checking +2026/09/30 10:49:08 update.go:786: [INFO] [stacks] update rallly: ladder — the last step (1 of 1) — the catalog's current definition +2026/09/30 10:49:08 update.go:800: [INFO] [stacks] update rallly: this step CONVERTS rallly-postgres PostgreSQL 16 → 18 (the ladder entry's mark); database volume rallly_rallly_postgres_data +2026/09/30 10:49:08 update.go:814: [INFO] [stacks] update rallly: precondition met — Tier 2 (second drive) copy from 2026-09-30T10:47:40Z (1m0s old, limit 24h0m0s) +2026/09/30 10:49:08 update.go:1365: [INFO] [stacks] update rallly: phase safety-dump +2026/09/30 10:49:08 update.go:846: [INFO] [stacks] update rallly: safety dump done (1 file(s)) [/mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/pre-restore-20260930T104908Z-rallly-postgres.sql] +2026/09/30 10:49:09 undo.go:287: [INFO] [stacks] update rallly: the undo copy will hold 1 named volume(s), 64.3 MiB +2026/09/30 10:49:09 pgconvert.go:340: [INFO] [stacks] update rallly: conversion space — database volume rallly_rallly_postgres_data is 64 MB; the dump needs up to 80 MB + the 2 GB floor; 27.7 GB free beside the stack dir +2026/09/30 10:49:09 update.go:1365: [INFO] [stacks] update rallly: phase pinning +2026/09/30 10:49:09 pin.go:373: [INFO] [stacks] update rallly: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/rallly/docker-compose.yml (rallly=lukevella/rallly:4.11.1, rallly-postgres=postgres:18-alpine) +2026/09/30 10:49:09 update.go:1365: [INFO] [stacks] update rallly: phase pulling +2026/09/30 10:49:10 update.go:1365: [INFO] [stacks] update rallly: phase copying +2026/09/30 10:49:21 update.go:1365: [INFO] [stacks] update rallly: phase copying +2026/09/30 10:49:21 undo.go:437: [INFO] [stacks] update rallly: copied rallly_rallly_postgres_data → rallly_rallly_postgres_data.pre-update-20260930T104921Z in 730ms +2026/09/30 10:49:21 update.go:1365: [INFO] [stacks] update rallly: phase converting +2026/09/30 10:49:21 pgconvert.go:423: [INFO] [stacks] update rallly: CONVERTING rallly-postgres PostgreSQL 16 → 18 (volume rallly_rallly_postgres_data, kept copy rallly_rallly_postgres_data.pre-update-20260930T104921Z) +2026/09/30 10:49:23 pgconvert.go:468: [INFO] [stacks] update rallly: pg_dumpall from 16 done in 482ms — 89 kB, completion line present; before: 2 database(s), 31 table(s), 138 row(s) +2026/09/30 10:49:23 update.go:1365: [INFO] [stacks] update rallly: phase converting +2026/09/30 10:49:24 pgconvert.go:484: [INFO] [stacks] update rallly: database volume rallly_rallly_postgres_data emptied (its copy rallly_rallly_postgres_data.pre-update-20260930T104921Z holds the old datadir, marker checked twice) +2026/09/30 10:49:28 pgconvert.go:513: [INFO] [stacks] update rallly: loaded into 18 in 1.061s (dropped the entrypoint's empty database(s) [rallly]; skipped CREATE ROLE for [rallly]) +2026/09/30 10:49:29 pgconvert.go:529: [INFO] [stacks] update rallly: CONVERTED 16 → 18 in 7.061s — the check is equal (2 database(s), 31 table(s), 138 row(s)), PG_VERSION 18 +2026/09/30 10:49:29 update.go:1365: [INFO] [stacks] update rallly: phase starting +2026/09/30 10:49:30 update.go:1365: [INFO] [stacks] update rallly: phase verifying +2026/09/30 10:49:40 update.go:997: [INFO] [stacks] update rallly: healthy after 10s (the app's health check passed) +2026/09/30 10:49:40 update.go:1015: [INFO] [stacks] update rallly: KEEPING the pre-conversion datadir copy rallly_rallly_postgres_data.pre-update-20260930T104921Z (PostgreSQL 16) until a backup of the converted app is proven +2026/09/30 10:49:40 update.go:1033: [INFO] [stacks] update rallly: DONE in 33s + +RESULT final_phase=done PG_VERSION=18 seed_after=True verdict=proven diff --git a/documentation/audits/pg-last-six-2026-09-30/box/rallly/prep.txt b/documentation/audits/pg-last-six-2026-09-30/box/rallly/prep.txt new file mode 100644 index 00000000..943d0aed --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/rallly/prep.txt @@ -0,0 +1,6 @@ +deploy/reuse rallly: True + rallly: sign-up http=200 + rallly: verify-email with the code http=200 + rallly: seeded poll drillpoll-525975bd (QSlpMgOCiyIf) + rallly: readback of the seeded poll http=200 found=True +C1 seed reads back BEFORE: True diff --git a/documentation/audits/pg-last-six-2026-09-30/box/rallly/undo-verdict.json b/documentation/audits/pg-last-six-2026-09-30/box/rallly/undo-verdict.json new file mode 100644 index 00000000..23fa21b8 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/rallly/undo-verdict.json @@ -0,0 +1,20 @@ +{ + "app": "rallly", + "case": "the load into 18 fails (adminpack, an object 18 lacks)", + "venue": "box 9202, the product's guarded Update", + "final_phase": "undone", + "duration_s": 57.5, + "pg_version_after": "16", + "pinned_before": { + "rallly": "lukevella/rallly:4.11.1", + "rallly-postgres": "postgres:16-alpine" + }, + "pinned_after": { + "rallly": "lukevella/rallly:4.11.1", + "rallly-postgres": "postgres:16-alpine" + }, + "seed_read_after": true, + "undone_line": "update rallly: UNDONE in 18s \u2014 the previous version is running on the data from before the update (the app's health check passed)", + "ok": true, + "measured_at": "2026-09-30T10:47:38Z" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/box/rallly/undo.txt b/documentation/audits/pg-last-six-2026-09-30/box/rallly/undo.txt new file mode 100644 index 00000000..ac6e2f2e --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/rallly/undo.txt @@ -0,0 +1,51 @@ +# undo case (the load fails) — 2026-09-30T12:47:25+0200 +before: PG_VERSION=16 pinned={'rallly': 'lukevella/rallly:4.11.1', 'rallly-postgres': 'postgres:16-alpine'} + rallly: readback of the seeded poll http=200 found=True +before: seed reads back through the front door = True +setup: CREATE EXTENSION adminpack -> CREATE EXTENSION +setup: extensions now: adminpack citext pgcrypto plpgsql +control: 18 has no adminpack: 0 + phase +0.0s backing-up | err=None + phase +18.5s safety-dump | err=None + phase +20.5s pulling | err=None + phase +21.6s copying | err=None + phase +32.8s converting | err=None + phase +39.0s undoing | err=None + phase +57.5s undone | err=None +result: {"accepted": true, "http": "202", "duration_s": 57.5, "final_phase": "undone", "update_error": null, "hold_reason": null, "state": "running"} + rallly: readback of the seeded poll http=200 found=True +after: PG_VERSION=16 pinned={'rallly': 'lukevella/rallly:4.11.1', 'rallly-postgres': 'postgres:16-alpine'} state=running +after: seed reads back through the front door = True +controller lines: +2026/09/30 10:47:39 update.go:536: [INFO] [stacks] update rallly: accepted — guarded update started +2026/09/30 10:47:39 update.go:1365: [INFO] [stacks] update rallly: phase checking +2026/09/30 10:47:39 update.go:786: [INFO] [stacks] update rallly: ladder — the last step (1 of 1) — the catalog's current definition +2026/09/30 10:47:39 update.go:800: [INFO] [stacks] update rallly: this step CONVERTS rallly-postgres PostgreSQL 16 → 18 (the ladder entry's mark); database volume rallly_rallly_postgres_data +2026/09/30 10:47:39 update.go:816: [INFO] [stacks] update rallly: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T10:41:37Z) (found: none) — backing up first +2026/09/30 10:47:39 update.go:1365: [INFO] [stacks] update rallly: phase backing-up +2026/09/30 10:47:58 update.go:831: [INFO] [stacks] update rallly: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-30T10:47:40Z +2026/09/30 10:47:58 update.go:1365: [INFO] [stacks] update rallly: phase safety-dump +2026/09/30 10:47:58 update.go:846: [INFO] [stacks] update rallly: safety dump done (1 file(s)) [/mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/pre-restore-20260930T104758Z-rallly-postgres.sql] +2026/09/30 10:47:59 undo.go:287: [INFO] [stacks] update rallly: the undo copy will hold 1 named volume(s), 64.1 MiB +2026/09/30 10:47:59 pgconvert.go:340: [INFO] [stacks] update rallly: conversion space — database volume rallly_rallly_postgres_data is 64 MB; the dump needs up to 80 MB + the 2 GB floor; 27.7 GB free beside the stack dir +2026/09/30 10:47:59 update.go:1365: [INFO] [stacks] update rallly: phase pinning +2026/09/30 10:47:59 pin.go:373: [INFO] [stacks] update rallly: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/rallly/docker-compose.yml (rallly=lukevella/rallly:4.11.1, rallly-postgres=postgres:18-alpine) +2026/09/30 10:47:59 update.go:1365: [INFO] [stacks] update rallly: phase pulling +2026/09/30 10:48:00 update.go:1365: [INFO] [stacks] update rallly: phase copying +2026/09/30 10:48:11 update.go:1365: [INFO] [stacks] update rallly: phase copying +2026/09/30 10:48:12 undo.go:437: [INFO] [stacks] update rallly: copied rallly_rallly_postgres_data → rallly_rallly_postgres_data.pre-update-20260930T104811Z in 772ms +2026/09/30 10:48:12 update.go:1365: [INFO] [stacks] update rallly: phase converting +2026/09/30 10:48:12 pgconvert.go:423: [INFO] [stacks] update rallly: CONVERTING rallly-postgres PostgreSQL 16 → 18 (volume rallly_rallly_postgres_data, kept copy rallly_rallly_postgres_data.pre-update-20260930T104811Z) +2026/09/30 10:48:13 pgconvert.go:468: [INFO] [stacks] update rallly: pg_dumpall from 16 done in 509ms — 90 kB, completion line present; before: 2 database(s), 31 table(s), 138 row(s) +2026/09/30 10:48:14 update.go:1365: [INFO] [stacks] update rallly: phase converting +2026/09/30 10:48:14 pgconvert.go:484: [INFO] [stacks] update rallly: database volume rallly_rallly_postgres_data emptied (its copy rallly_rallly_postgres_data.pre-update-20260930T104811Z holds the old datadir, marker checked twice) +2026/09/30 10:48:18 update.go:1066: [ERROR] [stacks] update rallly FAILED after the new version was started: conversion failed: loading the dump into 18: exit status 3 (psql: ERROR: extension "adminpack" is not available) +2026/09/30 10:48:18 update.go:1058: [INFO] [stacks] update rallly: kept 6057 bytes of the app's own log at /opt/docker/stacks/rallly/hold-logs/20260930T104818Z/compose-logs.txt before stopping it (R-621) +2026/09/30 10:48:18 update.go:1365: [INFO] [stacks] update rallly: phase undoing +2026/09/30 10:48:18 undo.go:515: [WARN] [stacks] update rallly: UNDO — putting back the previous version and its 1 volume copy(ies) (reason: conversion failed: loading the dump into 18: exit status 3 (psql: ERROR: extension "adminpack" is not available)) +2026/09/30 10:48:36 unattended.go:511: [INFO] [stacks] update rallly: step rallly=lukevella/rallly:4.11.1, rallly-postgres=postgres:18-alpine recorded as undone — the automatic leg will not press it again until the catalog's ladder changes (ladder 556df1b26b7fa6c0) +2026/09/30 10:48:36 undo.go:640: [INFO] [stacks] update rallly: event app_update_undone +2026/09/30 10:48:36 undo.go:568: [INFO] [stacks] update rallly: UNDONE in 18s — the previous version is running on the data from before the update (the app's health check passed) + +cleanup: DROP EXTENSION adminpack -> DROP EXTENSION +RESULT undo case ok=True final_phase=undone PG_VERSION=16 seed_after=True diff --git a/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/box-verdict-sparkyfitness.json b/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/box-verdict-sparkyfitness.json new file mode 100644 index 00000000..b3472be2 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/box-verdict-sparkyfitness.json @@ -0,0 +1,29 @@ +{ + "app": "sparkyfitness", + "venue": "box 9202 (drill catalog, controller 0.283.1), the product's guarded Update", + "from": { + "sparkyfitness-db": "postgres:15-alpine", + "sparkyfitness-frontend": "codewithcj/sparkyfitness:v0.17.3", + "sparkyfitness-server": "codewithcj/sparkyfitness_server:v0.17.3" + }, + "to": { + "sparkyfitness-db": "postgres:18-alpine", + "sparkyfitness-frontend": "codewithcj/sparkyfitness:v0.17.3", + "sparkyfitness-server": "codewithcj/sparkyfitness_server:v0.17.3" + }, + "verdict": "proven", + "seed_read_before": true, + "seed_read_after": true, + "healthy_after": true, + "engine_conversion": { + "service": "sparkyfitness-db", + "engine": "postgres", + "from": 15, + "to": 18, + "result": "converted", + "controller_line": "update sparkyfitness: CONVERTED 15 \u2192 18 in 9.793s \u2014 the check is equal (2 database(s), 94 table(s), 261 row(s)), PG_VERSION 18" + }, + "duration_s": 58.5, + "measured_at": "2026-09-30T10:45:20Z", + "evidence": "felhom.eu/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/move.txt" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/move.txt b/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/move.txt new file mode 100644 index 00000000..1d7c1a0b --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/move.txt @@ -0,0 +1,46 @@ +before: pinned={'sparkyfitness-db': 'postgres:15-alpine', 'sparkyfitness-frontend': 'codewithcj/sparkyfitness:v0.17.3', 'sparkyfitness-server': 'codewithcj/sparkyfitness_server:v0.17.3'} PG_VERSION=15 +drill: 16ce915 DRILL sparkyfitness: sparkyfitness-db postgres:15-alpine -> postgres:18-alpine with the engine_conversion mark (box proof) + phase +0.0s backing-up | err=None + phase +25.6s safety-dump | err=None + phase +27.7s pulling | err=None + phase +29.7s copying | err=None + phase +31.8s converting | err=None + phase +42.0s starting | err=None + phase +53.3s verifying | err=None + phase +58.4s done | err=None + sparkyfitness: readback of the seeded weight http=200 equal=True +2026/09/30 10:45:21 update.go:536: [INFO] [stacks] update sparkyfitness: accepted — guarded update started +2026/09/30 10:45:21 update.go:1365: [INFO] [stacks] update sparkyfitness: phase checking +2026/09/30 10:45:21 update.go:786: [INFO] [stacks] update sparkyfitness: ladder — the last step (1 of 1) — the catalog's current definition +2026/09/30 10:45:21 update.go:800: [INFO] [stacks] update sparkyfitness: this step CONVERTS sparkyfitness-db PostgreSQL 15 → 18 (the ladder entry's mark); database volume sparkyfitness_sparkyfitness_db_data +2026/09/30 10:45:21 update.go:816: [INFO] [stacks] update sparkyfitness: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T10:29:30Z) (found: none) — backing up first +2026/09/30 10:45:21 update.go:1365: [INFO] [stacks] update sparkyfitness: phase backing-up +2026/09/30 10:45:46 update.go:831: [INFO] [stacks] update sparkyfitness: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-30T10:45:22Z +2026/09/30 10:45:46 update.go:1365: [INFO] [stacks] update sparkyfitness: phase safety-dump +2026/09/30 10:45:47 update.go:846: [INFO] [stacks] update sparkyfitness: safety dump done (1 file(s)) [/mnt/sys_drive/felhom-data/backups/primary/sparkyfitness/db-dumps/pre-restore-20260930T104546Z-sparkyfitness-postgres.sql] +2026/09/30 10:45:48 undo.go:287: [INFO] [stacks] update sparkyfitness: the undo copy will hold 3 named volume(s), 67.7 MiB +2026/09/30 10:45:49 pgconvert.go:340: [INFO] [stacks] update sparkyfitness: conversion space — database volume sparkyfitness_sparkyfitness_db_data is 68 MB; the dump needs up to 85 MB + the 2 GB floor; 27.7 GB free beside the stack dir +2026/09/30 10:45:49 update.go:1365: [INFO] [stacks] update sparkyfitness: phase pinning +2026/09/30 10:45:49 pin.go:373: [INFO] [stacks] update sparkyfitness: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/sparkyfitness/docker-compose.yml (sparkyfitness-db=postgres:18-alpine, sparkyfitness-frontend=codewithcj/sparkyfitness:v0.17.3, sparkyfitness-server=codewithcj/sparkyfitness_server:v0.17.3) +2026/09/30 10:45:49 update.go:1365: [INFO] [stacks] update sparkyfitness: phase pulling +2026/09/30 10:45:50 update.go:1365: [INFO] [stacks] update sparkyfitness: phase copying +2026/09/30 10:45:51 update.go:1365: [INFO] [stacks] update sparkyfitness: phase copying +2026/09/30 10:45:51 undo.go:437: [INFO] [stacks] update sparkyfitness: copied sparkyfitness_sparkyfitness_backup → sparkyfitness_sparkyfitness_backup.pre-update-20260930T104551Z in 527ms +2026/09/30 10:45:51 update.go:1365: [INFO] [stacks] update sparkyfitness: phase copying +2026/09/30 10:45:52 undo.go:437: [INFO] [stacks] update sparkyfitness: copied sparkyfitness_sparkyfitness_db_data → sparkyfitness_sparkyfitness_db_data.pre-update-20260930T104551Z in 943ms +2026/09/30 10:45:52 update.go:1365: [INFO] [stacks] update sparkyfitness: phase copying +2026/09/30 10:45:53 undo.go:437: [INFO] [stacks] update sparkyfitness: copied sparkyfitness_sparkyfitness_uploads → sparkyfitness_sparkyfitness_uploads.pre-update-20260930T104551Z in 455ms +2026/09/30 10:45:53 update.go:1365: [INFO] [stacks] update sparkyfitness: phase converting +2026/09/30 10:45:53 pgconvert.go:423: [INFO] [stacks] update sparkyfitness: CONVERTING sparkyfitness-db PostgreSQL 15 → 18 (volume sparkyfitness_sparkyfitness_db_data, kept copy sparkyfitness_sparkyfitness_db_data.pre-update-20260930T104551Z) +2026/09/30 10:45:54 pgconvert.go:468: [INFO] [stacks] update sparkyfitness: pg_dumpall from 15 done in 661ms — 369 kB, completion line present; before: 2 database(s), 94 table(s), 261 row(s) +2026/09/30 10:45:55 update.go:1365: [INFO] [stacks] update sparkyfitness: phase converting +2026/09/30 10:45:55 pgconvert.go:484: [INFO] [stacks] update sparkyfitness: database volume sparkyfitness_sparkyfitness_db_data emptied (its copy sparkyfitness_sparkyfitness_db_data.pre-update-20260930T104551Z holds the old datadir, marker checked twice) +2026/09/30 10:46:02 pgconvert.go:513: [INFO] [stacks] update sparkyfitness: loaded into 18 in 3.406s (dropped the entrypoint's empty database(s) [sparkyfitness_db]; skipped CREATE ROLE for [sparky]) +2026/09/30 10:46:02 pgconvert.go:529: [INFO] [stacks] update sparkyfitness: CONVERTED 15 → 18 in 9.793s — the check is equal (2 database(s), 94 table(s), 261 row(s)), PG_VERSION 18 +2026/09/30 10:46:02 update.go:1365: [INFO] [stacks] update sparkyfitness: phase starting +2026/09/30 10:46:14 update.go:1365: [INFO] [stacks] update sparkyfitness: phase verifying +2026/09/30 10:46:19 update.go:997: [INFO] [stacks] update sparkyfitness: healthy after 5s (the app's health check passed) +2026/09/30 10:46:19 update.go:1015: [INFO] [stacks] update sparkyfitness: KEEPING the pre-conversion datadir copy sparkyfitness_sparkyfitness_db_data.pre-update-20260930T104551Z (PostgreSQL 15) until a backup of the converted app is proven +2026/09/30 10:46:19 update.go:1033: [INFO] [stacks] update sparkyfitness: DONE in 58s + +RESULT final_phase=done PG_VERSION=18 seed_after=True verdict=proven diff --git a/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/prep.txt b/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/prep.txt new file mode 100644 index 00000000..04ccedc4 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/prep.txt @@ -0,0 +1,14 @@ +deploy/reuse sparkyfitness: True +deploy/reuse sparkyfitness: True + sparkyfitness: sign-up http=200 + sparkyfitness: check-in http=200 + sparkyfitness: seeded user drilla99d8d with a weight of 81.26 on 2026-09-01 + sparkyfitness: the seeded user could not sign in (http 429) +C1 seed reads back BEFORE: False +12:44:19 C1 re-run after the 429 fix: sparkyfitness readback of the seeded weight equal=True +deploy/reuse sparkyfitness: True + sparkyfitness: sign-up http=200 + sparkyfitness: check-in http=200 + sparkyfitness: seeded user drill589ab8 with a weight of 57.27 on 2026-09-01 + sparkyfitness: readback of the seeded weight http=200 equal=True +C1 seed reads back BEFORE: True diff --git a/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/undo-setup.txt b/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/undo-setup.txt new file mode 100644 index 00000000..78bb7239 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/undo-setup.txt @@ -0,0 +1,38 @@ +# 2026-09-30T10:53:05Z sparkyfitness undo-case setup +12:53:06 [X] stop -> 200 {'ok': True, 'message': 'Stack sparkyfitness stop completed'} +12:53:38 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'sparkyfitness', 'volumes_removed': ['sparkyfitness_sparkyfitness_backup', 'sparkyfitness_sparkyfitness_db_data', 'sparkyfitnes +12:53:46 [X] after remove: deployed=False leftovers='/opt/docker/stacks/sparkyfitness' +volumes left: none +drill step commit: 16ce915 +remote: . Processing 1 references +remote: Processed 1 references in total +5f6fa27 Revert "DRILL sparkyfitness: sparkyfitness-db postgres:15-alpine -> postgres:18-alpine with the engine_conversion mark (box proof)" +12:55:09 [sync] the badge NEVER caught up to postgres:15-alpine in 78.8s — catalog_images = None +sync_rescan None +12:55:40 [1] NOTE: the controller's own state is 'unhealthy', not 'running' — recorded, not treated as a failure; the fixture's front-door wait is the real gate +12:55:40 deploy/reuse sparkyfitness: True +12:55:40 gate: sparky is gated — passed as the household (cookie set) +12:55:40 sparkyfitness: sign-up http=200 +12:55:41 sparkyfitness: check-in http=200 +12:55:41 sparkyfitness: seeded user drill589ab8 with a weight of 57.27 on 2026-09-01 +12:55:41 sparkyfitness: readback of the seeded weight http=200 equal=True +12:55:41 C1 seed reads back BEFORE: True +remote: . Processing 1 references +remote: Processed 1 references in total +56837ac Reapply "DRILL sparkyfitness: sparkyfitness-db postgres:15-alpine -> postgres:18-alpine with the engine_conversion mark (box proof)" +sync_rescan 4.5 +12:55:50 before: PG_VERSION=15 pinned={'sparkyfitness-db': 'postgres:15-alpine', 'sparkyfitness-frontend': 'codewithcj/sparkyfitness:v0.17.3', 'sparkyfitness-server': 'codewithcj/sparkyfitness_server: +12:56:06 before: seed reads back through the front door = True +12:56:09 setup: CREATE EXTENSION adminpack -> CREATE EXTENSION +12:56:12 setup: extensions now: adminpack plpgsql +12:56:13 control: 18 has no adminpack: 0 +12:57:32 phase +0.0s backing-up | err=None +12:57:32 phase +25.7s safety-dump | err=None +12:57:32 phase +28.7s pulling | err=None +12:57:32 phase +29.8s copying | err=None +12:57:32 phase +32.8s converting | err=None +12:57:32 phase +43.1s undoing | err=None +12:57:32 phase +74.9s undone | err=None +12:57:45 after: PG_VERSION=15 pinned={'sparkyfitness-db': 'postgres:15-alpine', 'sparkyfitness-frontend': 'codewithcj/sparkyfitness:v0.17.3', 'sparkyfitness-server': 'codewithcj/sparkyfitness_server:v +12:57:45 after: seed reads back through the front door = True +12:57:52 RESULT undo case ok=True final_phase=undone PG_VERSION=15 seed_after=True diff --git a/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/undo-verdict.json b/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/undo-verdict.json new file mode 100644 index 00000000..87312353 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/undo-verdict.json @@ -0,0 +1,22 @@ +{ + "app": "sparkyfitness", + "case": "the load into 18 fails (adminpack, an object 18 lacks)", + "venue": "box 9202, the product's guarded Update", + "final_phase": "undone", + "duration_s": 74.9, + "pg_version_after": "15", + "pinned_before": { + "sparkyfitness-db": "postgres:15-alpine", + "sparkyfitness-frontend": "codewithcj/sparkyfitness:v0.17.3", + "sparkyfitness-server": "codewithcj/sparkyfitness_server:v0.17.3" + }, + "pinned_after": { + "sparkyfitness-db": "postgres:15-alpine", + "sparkyfitness-frontend": "codewithcj/sparkyfitness:v0.17.3", + "sparkyfitness-server": "codewithcj/sparkyfitness_server:v0.17.3" + }, + "seed_read_after": true, + "undone_line": "update sparkyfitness: UNDONE in 31s \u2014 the previous version is running on the data from before the update (the app's health check passed)", + "ok": true, + "measured_at": "2026-09-30T10:56:16Z" +} \ No newline at end of file diff --git a/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/undo.txt b/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/undo.txt new file mode 100644 index 00000000..3ce92999 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/box/sparkyfitness/undo.txt @@ -0,0 +1,55 @@ +# undo case (the load fails) — 2026-09-30T12:55:47+0200 +before: PG_VERSION=15 pinned={'sparkyfitness-db': 'postgres:15-alpine', 'sparkyfitness-frontend': 'codewithcj/sparkyfitness:v0.17.3', 'sparkyfitness-server': 'codewithcj/sparkyfitness_server:v0.17.3'} + sparkyfitness: readback of the seeded weight http=200 equal=True +before: seed reads back through the front door = True +setup: CREATE EXTENSION adminpack -> CREATE EXTENSION +setup: extensions now: adminpack plpgsql +control: 18 has no adminpack: 0 + phase +0.0s backing-up | err=None + phase +25.7s safety-dump | err=None + phase +28.7s pulling | err=None + phase +29.8s copying | err=None + phase +32.8s converting | err=None + phase +43.1s undoing | err=None + phase +74.9s undone | err=None +result: {"accepted": true, "http": "202", "duration_s": 74.9, "final_phase": "undone", "update_error": null, "hold_reason": null, "state": "running"} + sparkyfitness: readback of the seeded weight http=200 equal=True +after: PG_VERSION=15 pinned={'sparkyfitness-db': 'postgres:15-alpine', 'sparkyfitness-frontend': 'codewithcj/sparkyfitness:v0.17.3', 'sparkyfitness-server': 'codewithcj/sparkyfitness_server:v0.17.3'} state=running +after: seed reads back through the front door = True +controller lines: +2026/09/30 10:56:17 update.go:536: [INFO] [stacks] update sparkyfitness: accepted — guarded update started +2026/09/30 10:56:17 update.go:1365: [INFO] [stacks] update sparkyfitness: phase checking +2026/09/30 10:56:17 update.go:786: [INFO] [stacks] update sparkyfitness: ladder — the last step (1 of 1) — the catalog's current definition +2026/09/30 10:56:17 update.go:800: [INFO] [stacks] update sparkyfitness: this step CONVERTS sparkyfitness-db PostgreSQL 15 → 18 (the ladder entry's mark); database volume sparkyfitness_sparkyfitness_db_data +2026/09/30 10:56:17 update.go:816: [INFO] [stacks] update sparkyfitness: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T10:55:10Z) (found: none) — backing up first +2026/09/30 10:56:17 update.go:1365: [INFO] [stacks] update sparkyfitness: phase backing-up +2026/09/30 10:56:42 update.go:831: [INFO] [stacks] update sparkyfitness: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-30T10:56:18Z +2026/09/30 10:56:42 update.go:1365: [INFO] [stacks] update sparkyfitness: phase safety-dump +2026/09/30 10:56:43 update.go:846: [INFO] [stacks] update sparkyfitness: safety dump done (1 file(s)) [/mnt/sys_drive/felhom-data/backups/primary/sparkyfitness/db-dumps/pre-restore-20260930T105643Z-sparkyfitness-postgres.sql] +2026/09/30 10:56:44 undo.go:287: [INFO] [stacks] update sparkyfitness: the undo copy will hold 3 named volume(s), 67.5 MiB +2026/09/30 10:56:45 pgconvert.go:340: [INFO] [stacks] update sparkyfitness: conversion space — database volume sparkyfitness_sparkyfitness_db_data is 67 MB; the dump needs up to 84 MB + the 2 GB floor; 27.7 GB free beside the stack dir +2026/09/30 10:56:45 update.go:1365: [INFO] [stacks] update sparkyfitness: phase pinning +2026/09/30 10:56:45 pin.go:373: [INFO] [stacks] update sparkyfitness: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/sparkyfitness/docker-compose.yml (sparkyfitness-db=postgres:18-alpine, sparkyfitness-frontend=codewithcj/sparkyfitness:v0.17.3, sparkyfitness-server=codewithcj/sparkyfitness_server:v0.17.3) +2026/09/30 10:56:45 update.go:1365: [INFO] [stacks] update sparkyfitness: phase pulling +2026/09/30 10:56:46 update.go:1365: [INFO] [stacks] update sparkyfitness: phase copying +2026/09/30 10:56:47 update.go:1365: [INFO] [stacks] update sparkyfitness: phase copying +2026/09/30 10:56:48 undo.go:437: [INFO] [stacks] update sparkyfitness: copied sparkyfitness_sparkyfitness_backup → sparkyfitness_sparkyfitness_backup.pre-update-20260930T105647Z in 529ms +2026/09/30 10:56:48 update.go:1365: [INFO] [stacks] update sparkyfitness: phase copying +2026/09/30 10:56:49 undo.go:437: [INFO] [stacks] update sparkyfitness: copied sparkyfitness_sparkyfitness_db_data → sparkyfitness_sparkyfitness_db_data.pre-update-20260930T105647Z in 871ms +2026/09/30 10:56:49 update.go:1365: [INFO] [stacks] update sparkyfitness: phase copying +2026/09/30 10:56:49 undo.go:437: [INFO] [stacks] update sparkyfitness: copied sparkyfitness_sparkyfitness_uploads → sparkyfitness_sparkyfitness_uploads.pre-update-20260930T105647Z in 423ms +2026/09/30 10:56:49 update.go:1365: [INFO] [stacks] update sparkyfitness: phase converting +2026/09/30 10:56:49 pgconvert.go:423: [INFO] [stacks] update sparkyfitness: CONVERTING sparkyfitness-db PostgreSQL 15 → 18 (volume sparkyfitness_sparkyfitness_db_data, kept copy sparkyfitness_sparkyfitness_db_data.pre-update-20260930T105647Z) +2026/09/30 10:56:53 pgconvert.go:468: [INFO] [stacks] update sparkyfitness: pg_dumpall from 15 done in 669ms — 369 kB, completion line present; before: 2 database(s), 94 table(s), 262 row(s) +2026/09/30 10:56:53 update.go:1365: [INFO] [stacks] update sparkyfitness: phase converting +2026/09/30 10:56:54 pgconvert.go:484: [INFO] [stacks] update sparkyfitness: database volume sparkyfitness_sparkyfitness_db_data emptied (its copy sparkyfitness_sparkyfitness_db_data.pre-update-20260930T105647Z holds the old datadir, marker checked twice) +2026/09/30 10:56:59 update.go:1066: [ERROR] [stacks] update sparkyfitness FAILED after the new version was started: conversion failed: loading the dump into 18: exit status 3 (psql: ERROR: extension "adminpack" is not available) +2026/09/30 10:56:59 update.go:1058: [INFO] [stacks] update sparkyfitness: kept 22695 bytes of the app's own log at /opt/docker/stacks/sparkyfitness/hold-logs/20260930T105659Z/compose-logs.txt before stopping it (R-621) +2026/09/30 10:56:59 update.go:1365: [INFO] [stacks] update sparkyfitness: phase undoing +2026/09/30 10:56:59 undo.go:515: [WARN] [stacks] update sparkyfitness: UNDO — putting back the previous version and its 3 volume copy(ies) (reason: conversion failed: loading the dump into 18: exit status 3 (psql: ERROR: extension "adminpack" is not available)) +2026/09/30 10:57:31 unattended.go:511: [INFO] [stacks] update sparkyfitness: step sparkyfitness-db=postgres:18-alpine, sparkyfitness-frontend=codewithcj/sparkyfitness:v0.17.3, sparkyfitness-server=codewithcj/sparkyfitness_server:v0.17.3 recorded as undone — the automatic leg will not press it again until the catalog's ladder changes (ladder e1a1c63b3baeb597) +2026/09/30 10:57:31 undo.go:640: [INFO] [stacks] update sparkyfitness: event app_update_undone +2026/09/30 10:57:31 undo.go:568: [INFO] [stacks] update sparkyfitness: UNDONE in 31s — the previous version is running on the data from before the update (the app's health check passed) + +cleanup: DROP EXTENSION adminpack -> DROP EXTENSION +RESULT undo case ok=True final_phase=undone PG_VERSION=15 seed_after=True diff --git a/documentation/audits/pg-last-six-2026-09-30/tools/benchq.py b/documentation/audits/pg-last-six-2026-09-30/tools/benchq.py new file mode 100644 index 00000000..ccfceb7a --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/tools/benchq.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +"""benchq.py [,] [ ...] + +Runs `upgrade-test.py --move` on bench LXC 9401 for each app IN ORDER, then copies that edge's +evidence OFF the bench into apps//bench/ before starting the next (R-320: the evidence leaves +the machine at the end of the phase that made it). One line per finished edge in benchq-.txt. +""" +import json, os, subprocess, sys, time +HERE = os.path.dirname(os.path.abspath(__file__)) +BENCH = "/tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/cf537324-9792-42e8-88e0-1a0b2ea3d378/scratchpad/bench.sh" +q = sys.argv[1] +args = sys.argv[2:] +out = open(os.path.join(HERE, "..", os.environ.get("BQ", "bench"), f"benchq-{q}.txt"), "a", buffering=1) +for i in range(0, len(args), 2): + app, moves = args[i], args[i + 1].split(",") + label = app + if "@" in app: # romm@engine: a second edge of one app gets its own folder + app, tag = app.split("@", 1) + label = f"{app}-{tag}" + t0 = time.time() + out.write(f"{time.strftime('%H:%M:%S')} START {app} {moves}\n") + pre = f"cd /opt/upg && [ -d evidence/MV-{app} ] && mv evidence/MV-{app} evidence/MV-{app}-$(date +%s); " + subprocess.run([BENCH], input=pre, capture_output=True, text=True, timeout=120) + cmd = (f"cd /opt/upg && timeout 2400 python3 upgrade-test.py --soak 600 --move {app} {' '.join(moves)} " + f"> /opt/upg/MV-{app}.log 2>&1; echo rc=$?") + r = subprocess.run([BENCH], input=cmd, capture_output=True, text=True, timeout=2700) + dest = os.path.join(HERE, "..", os.environ.get("BQ", "bench"), "apps", label, "bench") + os.makedirs(dest, exist_ok=True) + pull = (f"cd /opt/upg && tar czf /tmp/ev-{app}.tgz MV-{app}.log evidence/MV-{app} 2>/dev/null; " + f"base64 -w0 /tmp/ev-{app}.tgz") + r2 = subprocess.run([BENCH], input=pull, capture_output=True, text=True, timeout=600) + import base64, io, tarfile + try: + tarfile.open(fileobj=io.BytesIO(base64.b64decode(r2.stdout.strip()))).extractall(dest) + except Exception as e: + out.write(f" evidence pull FAILED for {app}: {e}\n") + v = {} + try: + v = json.load(open(os.path.join(dest, "evidence", f"MV-{app}", "verdict.json"))) + except Exception: + pass + mem = v.get("memory") or {} + peaks = {n: c.get("peak_pct") for n, c in (mem.get("containers") or {}).items()} + out.write(f"{time.strftime('%H:%M:%S')} DONE {app} {r.stdout.strip()} verdict={v.get('verdict')} " + f"read_before={v.get('seed_read_before')} read_after={v.get('seed_read_after')} " + f"abort={v.get('abort')} marks={v.get('marks')} peaks={peaks} " + f"detail={str(v.get('abort_detail'))[:160]!r} ({round(time.time()-t0)}s)\n") +out.write(f"{time.strftime('%H:%M:%S')} QUEUE {q} FINISHED\n") diff --git a/documentation/audits/pg-last-six-2026-09-30/tools/boxmove.py b/documentation/audits/pg-last-six-2026-09-30/tools/boxmove.py new file mode 100644 index 00000000..fde09a4b --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/tools/boxmove.py @@ -0,0 +1,58 @@ +"""boxmove.py [ ] — Part B's BOX venue on 9202 (drill catalog): + prep: deploy (reuse if installed), seed through the app's own route, read it back (C1) + move: drill commit with the mark → sync → the guarded Update → engine state + seed read back → box verdict JSON +Evidence: B/apps//box/.""" +import json, os, sys, time, subprocess +import walk as w +sys.path.insert(0, '/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts') +import upgrade_fixtures_box as fixtures, upgrade_fixtures_box28 as _f28 +FX = dict(_f28.FIXTURES28); FX.update(fixtures.FIXTURES) # the box set wins, as upgrade_boxport.get() decides +phase, app, sub = sys.argv[1:4] +EVD = f"{w.EV}/box/{app}"; os.makedirs(EVD, exist_ok=True) +TOK = w.SC + "/seed-tokens-box.json" +log = open(f"{EVD}/{phase}.txt", "a", buffering=1) +def say(*a): + w.say(*a); log.write(" ".join(map(str, a)) + "\n") +w.login() +toks = json.load(open(TOK)) if os.path.exists(TOK) else {} +if phase == "prep": + say(f"deploy/reuse {app}: {w.deploy(app, sub)}") + toks[app] = FX[app].seed(w, sub, say) + if isinstance(toks[app], dict) and w.GENERATED.get(app): + # the deploy secrets THIS run generated (grafana's admin password): kept beside the seed, in the 0600 scratch + # file only, so a LATER process (boxstep/undocase) can read the app back. Found 2026-09-30: grafana's box step + # read back with the default password and got 401 — the instrument, not the product. + toks[app]["__generated"] = w.GENERATED[app] + json.dump(toks, open(TOK, "w"), default=str); os.chmod(TOK, 0o600) + say(f"C1 seed reads back BEFORE: {FX[app].verify(w, sub, toks[app], say)}") +else: + svc, frm, to, fmj, tmj = sys.argv[4:9] + st = w.stack(app); before = (st.get("app_config") or {}).get("pinned_images") + pg = lambda: w.guest(f"docker exec {svc} sh -c 'cat $PGDATA/PG_VERSION' 2>&1").strip() + say(f"before: pinned={before} PG_VERSION={pg()}") + if os.environ.get("SKIPDRILL"): + say("drill: SKIPPED — the drill commit was made by an earlier attempt") + else: + r = subprocess.run([sys.executable, os.path.join(os.path.dirname(__file__), "drillmove.py"), app, svc, frm, to, fmj, tmj], capture_output=True, text=True) + say("drill:", r.stdout.strip().splitlines()[0] if r.stdout else r.stderr[-300:]) + w.sync_rescan(app, to) + since = w.guest("date -u +%Y-%m-%dT%H:%M:%SZ").strip() + res = w.press_update(app, poll=1, cap_s=1800) + for p in res.get("phases", []): + log.write(f" phase +{p['t']}s {p['phase']} | err={p['error']}\n") + time.sleep(10) + after_pg = pg(); read = FX[app].verify(w, sub, toks[app], say) + conv = w.guest(f"docker logs --since {since} felhom-controller 2>&1 | grep -E 'update {app}|CONVERT' | grep -v DEBUG | cut -c1-400") + log.write(conv + "\n") + line = next((l for l in conv.splitlines() if "CONVERTED" in l), "") + st = w.stack(app) + verdict = {"app": app, "venue": "box 9202 (drill catalog, controller 0.283.1), the product's guarded Update", + "from": before, "to": (st.get("app_config") or {}).get("pinned_images"), + "verdict": "proven" if (res.get("final_phase") == "done" and read and after_pg == str(tmj)) else "failed", + "seed_read_before": True, "seed_read_after": read, "healthy_after": st.get("state") == "running", + "engine_conversion": {"service": svc, "engine": "postgres", "from": int(fmj), "to": int(tmj), + "result": "converted" if line else "not-seen", "controller_line": line.split("] ", 2)[-1] if line else ""}, + "duration_s": res.get("duration_s"), "measured_at": since, + "evidence": f"felhom.eu/documentation/audits/pg-last-six-2026-09-30/box/{app}/move.txt"} + json.dump(verdict, open(f"{EVD}/box-verdict-{app}.json", "w"), indent=2) + say(f"RESULT final_phase={res.get('final_phase')} PG_VERSION={after_pg} seed_after={read} verdict={verdict['verdict']}") diff --git a/documentation/audits/pg-last-six-2026-09-30/tools/boxstep.py b/documentation/audits/pg-last-six-2026-09-30/tools/boxstep.py new file mode 100644 index 00000000..c9397b33 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/tools/boxstep.py @@ -0,0 +1,76 @@ +"""boxstep.py = [...] — a WITHIN-A-MAJOR step's BOX venue on 9202 (drill catalog), Part F. + + prep is boxmove.py's (deploy, seed through the app's own route, C1); this presses the step: + a DRILL-only commit moves the named services and adds a ladder entry (no conversion mark), sync, rescan, + the product's guarded Update, the seed read back → box verdict JSON beside boxmove's. +The live catalog's entry is written later ONLY by `upgrade-test.py --write-ladder` from both verdicts. +Evidence: box//step.txt + box//box-verdict-.json.""" +import json, os, re, subprocess, sys, time +import walk as w +sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts") +import upgrade_fixtures_box as fixtures, upgrade_fixtures_box28 as _f28 +FX = dict(_f28.FIXTURES28); FX.update(fixtures.FIXTURES) # the box set wins, as upgrade_boxport.get() decides + +app, sub = sys.argv[1:3] +moves = dict(a.split("=", 1) for a in sys.argv[3:]) +EVD = f"{w.EV}/box/{app}"; os.makedirs(EVD, exist_ok=True) +TOK = w.SC + "/seed-tokens-box.json" +log = open(f"{EVD}/step.txt", "a", buffering=1) + + +def say(*a): + w.say(*a); log.write(" ".join(map(str, a)) + "\n") + + +D = "/mnt/5_hdd/felhom.eu/drill/app-catalog-drill" +w.login() +toks = json.load(open(TOK)) +if isinstance(toks.get(app), dict) and toks[app].get("__generated"): + w.GENERATED[app] = toks[app]["__generated"] +st = w.stack(app); before = (st.get("app_config") or {}).get("pinned_images") +say(f"before: pinned={before}") +if not os.environ.get("SKIPDRILL"): + subprocess.run(["git", "-C", D, "pull", "-q", "--rebase", "origin", "main"], check=True) + comp = f"{D}/templates/{app}/docker-compose.yml"; fy = f"{D}/templates/{app}/.felhom.yml" + s = open(comp).read(); pins, cur = {}, None + for line in s.splitlines(): + m = re.match(r"^ ([a-z0-9-]+):\s*$", line) + if m: cur = m.group(1) + m = re.match(r"^\s+image:\s*(\S+)", line) + if m and cur: pins[cur] = m.group(1) + out, cur = [], None + for line in s.splitlines(): + m = re.match(r"^ ([a-z0-9-]+):\s*$", line) + if m: cur = m.group(1) + mi = re.match(r"^(\s+image:\s*)(\S+)\s*$", line) + if mi and cur in moves: + line = mi.group(1) + moves[cur] + out.append(line) + open(comp, "w").write("\n".join(out) + "\n") + top = dict(pins); top.update(moves) + entry = {"from": pins, "to": top, "verdict": "proven", "tested_at": "DRILL", "harness_version": 4, + "evidence": "DRILL (box proof in progress)", "marks": {"files_may_change": False, "needs_person": None, "memory_tight": False}} + f = open(fy).read() + f = f.rstrip("\n") + "\n - " + json.dumps(entry) + "\n" if "update_ladder:" in f else f.rstrip("\n") + "\nupdate_ladder:\n - " + json.dumps(entry) + "\n" + open(fy, "w").write(f) + subprocess.run(["git", "-C", D, "commit", "-q", "-am", f"DRILL {app}: {moves} (box proof)"], check=True) + subprocess.run(["git", "-C", D, "push", "-q", "origin", "main"], check=True, capture_output=True) + say("drill:", subprocess.run(["git", "-C", D, "log", "--oneline", "-1"], capture_output=True, text=True).stdout.strip()) +w.sync_rescan(app, next(iter(moves.values()))) +since = w.guest("date -u +%Y-%m-%dT%H:%M:%SZ").strip() +res = w.press_update(app, poll=1, cap_s=1800) +for p in res.get("phases", []): + log.write(f" phase +{p['t']}s {p['phase']} | err={p['error']}\n") +time.sleep(10) +read = FX[app].verify(w, sub, toks[app], say) +lines = w.guest(f"docker logs --since {since} felhom-controller 2>&1 | grep -E 'update {app}' | grep -v DEBUG | cut -c1-400") +log.write(lines + "\n") +st = w.stack(app); after = (st.get("app_config") or {}).get("pinned_images") +verdict = {"app": app, "venue": "box 9202 (drill catalog, controller 0.283.1), the product's guarded Update", + "from": before, "to": after, + "verdict": "proven" if (res.get("final_phase") == "done" and read and all(after.get(k) == v for k, v in moves.items())) else "failed", + "seed_read_before": True, "seed_read_after": read, "healthy_after": st.get("state") == "running", + "duration_s": res.get("duration_s"), "final_phase": res.get("final_phase"), "measured_at": since, + "evidence": f"felhom.eu/documentation/audits/pg-last-six-2026-09-30/box/{app}/step.txt"} +json.dump(verdict, open(f"{EVD}/box-verdict-{app}.json", "w"), indent=2) +say(f"RESULT final_phase={res.get('final_phase')} after={after} seed_after={read} verdict={verdict['verdict']} ({res.get('duration_s')} s)") diff --git a/documentation/audits/pg-last-six-2026-09-30/tools/drillmove.py b/documentation/audits/pg-last-six-2026-09-30/tools/drillmove.py new file mode 100644 index 00000000..5442226a --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/tools/drillmove.py @@ -0,0 +1,43 @@ +"""drillmove.py +DRILL-ONLY commit: move one PostgreSQL service in the drill catalog and add the ladder entry that carries the +engine_conversion mark, so the box (9202) can prove the conversion through its own guarded Update. The live +catalog's entry is written later ONLY by `upgrade-test.py --write-ladder` from both verdicts.""" +import json, re, subprocess, sys +D = "/mnt/5_hdd/felhom.eu/drill/app-catalog-drill" +app, svc, frm, to, fmj, tmj = sys.argv[1:7] +subprocess.run(["git", "-C", D, "pull", "-q", "--rebase", "origin", "main"], check=True) +comp = f"{D}/templates/{app}/docker-compose.yml" +fy = f"{D}/templates/{app}/.felhom.yml" +s = open(comp).read() +assert f"image: {frm}" in s, "from ref not in compose" +pins = {} +cur = None +for line in s.splitlines(): + m = re.match(r"^ ([a-z0-9-]+):\s*$", line) + if m: cur = m.group(1) + m = re.match(r"^\s+image:\s*(\S+)", line) + if m and cur: pins[cur] = m.group(1) +s = s.replace(f"image: {frm}", f"image: {to}") +# the mount follows the major PER SERVICE, exactly as the catalog writer and the bench do (upgrade-test.py +# pg_mounts_for) — the old regex needed "postgres" in the VOLUME name and missed sparkyfitness_db_data. +import importlib.util +_spec = importlib.util.spec_from_file_location("ut", "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts/upgrade-test.py") +_ut = importlib.util.module_from_spec(_spec); _spec.loader.exec_module(_ut) +s = _ut.pg_mounts_for(s) +open(comp, "w").write(s) +top = dict(pins); top[svc] = to +entry = {"from": pins, "to": top, "verdict": "proven", "tested_at": "DRILL", "harness_version": 4, + "evidence": "DRILL (box proof in progress)", "marks": {"files_may_change": False, "needs_person": None, "memory_tight": False}, + "engine_conversion": {"service": svc, "engine": "postgres", "from": int(fmj), "to": int(tmj)}} +f = open(fy).read() +line = " - " + json.dumps(entry) + "\n" +if "update_ladder:" in f: + f = f.replace("update_ladder:\n", "update_ladder:\n", 1) + f = f.rstrip("\n") + "\n" + line if f.rstrip("\n").endswith("}") else f + line +else: + f = f.rstrip("\n") + "\nupdate_ladder:\n" + line +open(fy, "w").write(f) +subprocess.run(["git", "-C", D, "commit", "-q", "-am", f"DRILL {app}: {svc} {frm} -> {to} with the engine_conversion mark (box proof)"], check=True) +subprocess.run(["git", "-C", D, "push", "-q", "origin", "main"], check=True, capture_output=True) +print(subprocess.run(["git", "-C", D, "log", "--oneline", "-1"], capture_output=True, text=True).stdout.strip()) +print(subprocess.run(["git", "-C", D, "show", "--stat", "HEAD"], capture_output=True, text=True).stdout[-300:]) diff --git a/documentation/audits/pg-last-six-2026-09-30/tools/partC.py b/documentation/audits/pg-last-six-2026-09-30/tools/partC.py new file mode 100644 index 00000000..12e395f0 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/tools/partC.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python3 +"""partC.py setup|run|restore — R-687 item 4 by day on demo-hp guest 9201: the full-system backup WAITS for the +automatic update leg (`09` decision 20), seen live. + +The gate's wait is on the SCHEDULED path only (quiesce.go runOnce), so it needs, at one poll: the whole-guest tier +DUE (local tier: last success 2026-09-29 04:42, cadence 24 h → due), "now" inside [W+2h, W+6h) and the leg active +(stacks.UpdateLegState — a MANUAL chain's leg sets the same flag, unattended.go runUpdateLeg/setLegFlags). +The ORDER matters: the tier is already due, so the window may move ONLY once the leg is running — otherwise the next +poll starts the backup during the chain's own dump/off-site legs. So: + setup — controller.yaml saved as controller.yaml.pre-gate-day; `quiesce: poll_interval: 1m` added; restart. + run — press the night chain (POST /api/debug/backup/night-chain); the moment `[update-leg] started (manual-chain)` + is in the log, POST /backups/window so that now = W+2h05m (the product's own form); then watch for the + deferral line, the leg's end line, the whole-guest backup starting AFTER it, and its result. + restore — the saved controller.yaml back; `backup_window_start` removed from settings.json with the controller + STOPPED (it was never set: the box ran on controller.yaml's db_dump_schedule 02:30); start; read back. +Evidence: C/ (every step appends). Never prints a secret. +""" +import json, os, re, subprocess, sys, time +from datetime import datetime, timedelta +from zoneinfo import ZoneInfo +os.environ["GUEST"] = "9201" +import walk as w + +EVD = f"{w.EV}/C"; os.makedirs(EVD, exist_ok=True) +VOL = "/var/lib/docker/volumes/felhom-controller-data/_data" +BUD = ZoneInfo("Europe/Budapest") +log = open(f"{EVD}/C-{sys.argv[1]}.txt", "a", buffering=1) + + +def say(*a): + w.say(*a); log.write(f"{datetime.now().strftime('%H:%M:%S')} " + " ".join(map(str, a)) + "\n") + + +def logs_since(since, pat): + return w.guest(f"docker logs --since {since} felhom-controller 2>&1 | grep -E '{pat}' | grep -v DEBUG | cut -c1-330") + + +def form_post(path, body): + sess = open(f"{w.SC}/sess{os.getpid()}.txt").read().strip() + csrf = open(f"{w.SC}/csrf{os.getpid()}.txt").read().strip() + r = w.sh(["curl", "-sk", "-o", "/dev/null", "-D", "-", "-H", w.HOSTHDR, "-H", f"Cookie: {sess}", "-H", f"X-CSRF-Token: {csrf}", + "-H", "Content-Type: application/x-www-form-urlencoded", "--data", body, f"{w.BASE}{path}"]) + st = re.search(r"^HTTP/\S+ (\d+)", r.stdout or "", re.M) + loc = re.search(r"(?im)^location:\s*(\S+)", r.stdout or "") + return (st.group(1) if st else "?"), (loc.group(1) if loc else "") + + +act = sys.argv[1] +if act == "setup": + say("# setup", datetime.now(BUD).isoformat()) + say(w.guest(f"""set -e +test -f {VOL}/controller.yaml.pre-gate-day || cp -p {VOL}/controller.yaml {VOL}/controller.yaml.pre-gate-day +grep -q '^quiesce:' {VOL}/controller.yaml && echo 'quiesce section EXISTS — refusing to edit' && exit 1 +printf 'quiesce:\\n poll_interval: 1m\\n' >> {VOL}/controller.yaml +diff {VOL}/controller.yaml.pre-gate-day {VOL}/controller.yaml || true +cp -p {VOL}/data/settings.json {VOL}/data/settings.json.pre-gate-day +docker restart felhom-controller >/dev/null; sleep 20 +docker logs --since 1m felhom-controller 2>&1 | grep -E 'quiesce\\] loop started|update-leg|backup window' | cut -c1-200""")) +elif act == "run": + w.login() + t0 = w.guest("date -u +%Y-%m-%dT%H:%M:%SZ").strip() + say("# run", datetime.now(BUD).isoformat(), "since", t0) + c, d = w.ctl("POST", "/api/debug/backup/night-chain") + say("night-chain press ->", c, json.dumps(d)[:300]) + if c not in ("200", "202"): + sys.exit("the chain was refused — waited out, never worked around; rerun later") + moved = False + deadline = time.time() + 3600 + seen = set() + while time.time() < deadline: + out = logs_since(t0, r"night-chain|update-leg|\[quiesce\]|update (bookstack|kimai)|whole-guest|backup window") + for line in out.splitlines(): + if line not in seen: + seen.add(line); log.write(" LOG " + line + "\n") + if not moved and "[update-leg] started" in out: + now = datetime.now(BUD) + W = (now - timedelta(hours=2, minutes=5)).strftime("%H:%M") + code, loc = form_post("/backups/window", f"window_start={W}") + moved = True + say(f"leg started — window moved to {W} (now {now.strftime('%H:%M:%S')} = W+2h05m): POST /backups/window -> {code} {loc}") + # quiesce.go:554/562/628/631/536 — the job's own start/done/failed lines, then the unquiesce (quiesce.go:492) + if re.search(r"\[quiesce\] tier \S+: backup job \S+ (done|failed)|\[quiesce\] start backup on tier", out): + time.sleep(60) + break + time.sleep(3) + out = logs_since(t0, r"night-chain|update-leg|\[quiesce\]|whole-guest") + open(f"{EVD}/C-run-log.txt", "w").write(out) + say("lines kept:", len(out.splitlines()), "→ C/C-run-log.txt") +elif act == "restore": + say("# restore", datetime.now(BUD).isoformat()) + say(w.guest(f"""set -e +cp -p {VOL}/controller.yaml.pre-gate-day {VOL}/controller.yaml +docker stop felhom-controller >/dev/null +python3 - <<'PY' +import json +p = "{VOL}/data/settings.json" +d = json.load(open(p)) +print("settings backup_window_start before restore:", d.get("backup_window_start")) +d.pop("backup_window_start", None) +json.dump(d, open(p, "w"), indent=2) +print("settings backup_window_start after restore:", d.get("backup_window_start")) +PY +docker start felhom-controller >/dev/null; sleep 20 +echo "controller.yaml vs the saved copy:"; diff {VOL}/controller.yaml {VOL}/controller.yaml.pre-gate-day && echo IDENTICAL +grep -c '^quiesce:' {VOL}/controller.yaml || true +grep -n 'db_dump_schedule' {VOL}/controller.yaml +docker logs --since 1m felhom-controller 2>&1 | grep -E 'quiesce\\] loop started|scheduled|window' | cut -c1-220""")) diff --git a/documentation/audits/pg-last-six-2026-09-30/tools/repoint.py b/documentation/audits/pg-last-six-2026-09-30/tools/repoint.py new file mode 100644 index 00000000..fccafd59 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/tools/repoint.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +"""Point guest 9202 at the drill catalog (and a 90 s health timeout), or restore the saved config. + +`09` §6.5: `git.repo_url` alone is INERT (R-615) — the cache dir must go too. The saved copy is +`controller.yaml.pre-pg0930` (NOT the older `.pre-28`, which a restore must never pick up). +""" +import re, sys, io +sys.path.insert(0, '.') +import walk as w + +VOL = "/var/lib/docker/volumes/felhom-controller-data/_data" +DRILL_REPO = "https://gitea.dooplex.hu/admin/app-catalog-drill.git" + + +def creds(): + for l in io.open("/home/kisfenyo/.git-credentials").read().strip().split("\n"): + m = re.match(r'https://(admin):([^@]+)@gitea\.dooplex\.hu', l) + if m: + return m.group(1), m.group(2) + raise SystemExit("no admin credential") + + +def to_drill(): + u, t = creds() + print(w.guest(f""" +set -e +test -f {VOL}/controller.yaml.pre-pg0930 || cp -p {VOL}/controller.yaml {VOL}/controller.yaml.pre-pg0930 +python3 - <<'PY' +import re +p = "{VOL}/controller.yaml" +s = open(p).read() +s = re.sub(r'(^\\s+repo_url: ).*$', r'\\g<1>{DRILL_REPO}', s, count=1, flags=re.M) +s = re.sub(r'(^git:(?:\\n\\s+.*)*?\\n\\s+token: ).*$', r'\\g<1>"{t}"', s, count=1, flags=re.M) +s = re.sub(r'(^git:(?:\\n\\s+.*)*?\\n\\s+username: ).*$', r'\\g<1>"{u}"', s, count=1, flags=re.M) +if not re.search(r'^update:', s, re.M): + s += "update:\\n health_timeout: 90s\\n" +open(p, "w").write(s) +PY +rm -rf {VOL}/catalog-cache {VOL}/data/catalog-cache +docker restart felhom-controller >/dev/null +sleep 15 +grep -A6 '^git:' {VOL}/controller.yaml | sed 's/token:.*/token: /' +grep -A2 '^update:' {VOL}/controller.yaml +""")) + + +def restore(): + print(w.guest(f""" +set -e +cp -p {VOL}/controller.yaml.pre-pg0930 {VOL}/controller.yaml +rm -rf {VOL}/catalog-cache {VOL}/data/catalog-cache +docker restart felhom-controller >/dev/null +sleep 15 +grep -A6 '^git:' {VOL}/controller.yaml | sed 's/token:.*/token: /' +grep -c '^update:' {VOL}/controller.yaml || true +""")) + + +if __name__ == "__main__": + to_drill() if sys.argv[1] == "drill" else restore() diff --git a/documentation/audits/pg-last-six-2026-09-30/tools/sparky_undo.sh b/documentation/audits/pg-last-six-2026-09-30/tools/sparky_undo.sh new file mode 100755 index 00000000..361d8e11 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/tools/sparky_undo.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# sparkyfitness's undo case on 9202. Its happy path ran FIRST (box/sparkyfitness/move.txt), so the app is on 18; +# the undo case needs it on 15 again. Through the product only: remove (stop + remove with data), the DRILL +# catalog put back at 15 (a revert commit in the drill repo — never the live catalog), a fresh install at 15, +# seed + C1, the drill step put back, then undocase.py. Evidence: box/sparkyfitness/undo-*.txt. +set -u +cd "$(dirname "$0")" +D=/mnt/5_hdd/felhom.eu/drill/app-catalog-drill +L=../box/sparkyfitness/undo-setup.txt +exec > >(tee -a "$L") 2>&1 +echo "# $(date -u +%FT%TZ) sparkyfitness undo-case setup" +python3 - <<'PY' +import sys; sys.path.insert(0, '.') +import walk as w +w.login() +w.remove("sparkyfitness") +print("volumes left:", w.guest("docker volume ls -q | grep -i sparky || echo none").strip()) +PY +git -C $D pull -q --rebase origin main +STEP=$(git -C $D log --format=%h -1 --grep='DRILL sparkyfitness: sparkyfitness-db postgres:15-alpine -> postgres:18-alpine') +echo "drill step commit: $STEP" +git -C $D revert --no-edit "$STEP" >/dev/null && git -C $D push -q origin main && git -C $D log --oneline -1 +python3 -c " +import sys; sys.path.insert(0,'.'); import walk as w; w.login(); print('sync_rescan', w.sync_rescan('sparkyfitness','postgres:15-alpine'))" +timeout 1500 python3 boxmove.py prep sparkyfitness sparky 2>&1 | tail -8 +REV=$(git -C $D log --format=%h -1) +git -C $D revert --no-edit "$REV" >/dev/null && git -C $D push -q origin main && git -C $D log --oneline -1 +python3 -c " +import sys; sys.path.insert(0,'.'); import walk as w; w.login(); print('sync_rescan', w.sync_rescan('sparkyfitness','postgres:18-alpine'))" +timeout 1500 python3 undocase.py sparkyfitness sparky sparkyfitness-db sparky sparkyfitness_db 2>&1 | grep -E 'RESULT|before:|after:|setup|control|phase \+' | cut -c1-200 diff --git a/documentation/audits/pg-last-six-2026-09-30/tools/undocase.py b/documentation/audits/pg-last-six-2026-09-30/tools/undocase.py new file mode 100644 index 00000000..79cf0b9c --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/tools/undocase.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +"""undocase.py — the brief's ONE undo case per app on 9202 (scratch guest). + +The load failing is the case (the docmost method, `audits/night-2026-09-26/D/Da-*`): an object the OLD major +has and 18 does not — the `adminpack` extension (removed in PostgreSQL 17) — is created in the app's own +database, the guarded Update is pressed (the drill catalog's step carries the conversion mark), the load +into 18 must fail, and the BOX must undo it by itself: old pin, old datadir, `undone`, the seed read back. +The extension is dropped again afterwards, so the real move that follows converts clean data. + +Evidence: box//undo.txt + box//undo-verdict.json. Never prints a secret. +""" +import json, os, sys, time +import walk as w +sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts") +import upgrade_fixtures_box as fixtures, upgrade_fixtures_box28 as _f28 +FX = dict(_f28.FIXTURES28); FX.update(fixtures.FIXTURES) # the box set wins, as upgrade_boxport.get() decides + +app, sub, svc, user, db = sys.argv[1:6] +EVD = f"{w.EV}/box/{app}"; os.makedirs(EVD, exist_ok=True) +log = open(f"{EVD}/undo.txt", "a", buffering=1) + + +def say(*a): + w.say(*a); log.write(" ".join(map(str, a)) + "\n") + + +w.login() +toks = json.load(open(w.SC + "/seed-tokens-box.json")) +if isinstance(toks.get(app), dict) and toks[app].get("__generated"): + w.GENERATED[app] = toks[app]["__generated"] +psql = lambda sql: w.guest(f"docker exec {svc} psql -U {user} -d {db} -Atc \"{sql}\" 2>&1").strip() +pg = lambda: w.guest(f"docker exec {svc} sh -c 'cat $PGDATA/PG_VERSION' 2>&1").strip() +say(f"# undo case (the load fails) — {time.strftime('%Y-%m-%dT%H:%M:%S%z')}") +st = w.stack(app); before = (st.get("app_config") or {}).get("pinned_images") +say(f"before: PG_VERSION={pg()} pinned={before}") +say("before: seed reads back through the front door =", FX[app].verify(w, sub, toks[app], say)) +say("setup: CREATE EXTENSION adminpack ->", psql("CREATE EXTENSION IF NOT EXISTS adminpack")) +say("setup: extensions now:", psql("select string_agg(extname, ' ' order by extname) from pg_extension")) +ctrl = w.sh(["ssh", "demo-hp", "pct exec 9202 -- docker run --rm postgres:18-alpine sh -c 'ls /usr/local/share/postgresql/extension/ | grep -c ^adminpack || true'"]).stdout.strip() +say(f"control: 18 has no adminpack: {ctrl}") +since = w.guest("date -u +%Y-%m-%dT%H:%M:%SZ").strip() +res = w.press_update(app, poll=1, cap_s=1800) +for p in res.get("phases", []): + say(f" phase +{p['t']}s {p['phase']} | err={p['error']}") +say("result:", json.dumps({k: res.get(k) for k in ("accepted", "http", "duration_s", "final_phase", "update_error", "hold_reason", "state")})) +time.sleep(10) +st = w.stack(app); after = (st.get("app_config") or {}).get("pinned_images") +after_pg = pg() +read = FX[app].verify(w, sub, toks[app], say) +say(f"after: PG_VERSION={after_pg} pinned={after} state={st.get('state')}") +say("after: seed reads back through the front door =", read) +conv = w.guest(f"docker logs --since {since} felhom-controller 2>&1 | grep -E 'update {app}|CONVERT|UNDO' | grep -v DEBUG | cut -c1-400") +log.write("controller lines:\n" + conv + "\n") +say("cleanup: DROP EXTENSION adminpack ->", psql("DROP EXTENSION IF EXISTS adminpack")) +verdict = {"app": app, "case": "the load into 18 fails (adminpack, an object 18 lacks)", "venue": "box 9202, the product's guarded Update", + "final_phase": res.get("final_phase"), "duration_s": res.get("duration_s"), + "pg_version_after": after_pg, "pinned_before": before, "pinned_after": after, "seed_read_after": read, + "undone_line": next((l.split("] ", 2)[-1] for l in conv.splitlines() if "UNDONE" in l), ""), + "ok": res.get("final_phase") == "undone" and read is True and after == before, + "measured_at": since} +json.dump(verdict, open(f"{EVD}/undo-verdict.json", "w"), indent=2) +say(f"RESULT undo case ok={verdict['ok']} final_phase={res.get('final_phase')} PG_VERSION={after_pg} seed_after={read}") diff --git a/documentation/audits/pg-last-six-2026-09-30/tools/walk.py b/documentation/audits/pg-last-six-2026-09-30/tools/walk.py new file mode 100644 index 00000000..dccce034 --- /dev/null +++ b/documentation/audits/pg-last-six-2026-09-30/tools/walk.py @@ -0,0 +1,560 @@ +#!/usr/bin/env python3 +"""walk.py — ONE app's full update walk on guest 9202, through the product's own endpoints. + +EVIDENCE, NOT PRODUCT. It presses exactly the buttons a person presses: + POST /api/stacks//deploy · POST /api/sync · POST /api/stacks/rescan + POST /api/stacks//update · POST /api/stacks//remove +and reads GET /api/stacks/. No controller code exists for it. + +The walk, per `09` §6.4 and the update-night brief §4: + 1 deploy from the DRILL catalog at the LIVE pin + 2 seed through the app's OWN front door (R-156: never a volume, never SQL) + 3 read the seed back <- control C1; a fixture that cannot prove itself proves nothing + 4 „Mentés most" + 5 commit the real one-step bump to the DRILL repo, sync, rescan, read the badge in BOTH languages + 6 press the guarded Update, record every phase with timestamps + 7 read the seed back through the front door + 8 the four version observables side by side + 9 write the verdict record in `09`'s JSON shape + +`inconclusive` is a first-class verdict and is NEVER collapsed into `failed`. +""" +import argparse, json, os, re, subprocess, sys, time +from datetime import datetime, timezone + +SC = os.environ.get('SC', '/tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/cf537324-9792-42e8-88e0-1a0b2ea3d378/scratchpad') +EV = os.environ.get('EV', '/mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/audits/pg-last-six-2026-09-30') +DRILL = "/mnt/5_hdd/felhom.eu/drill/app-catalog-drill" +# GUEST=9201 selects demo-hp's hub-enabled guest (the mail proof); default 9202, the scratch guest. +GUEST = os.environ.get("GUEST", "9202") +BASE = os.environ.get("BASE") or {"9202": "https://192.168.0.114", "9201": "https://192.168.0.155"}[GUEST] +DOMAIN = os.environ.get("DOMAIN", "enkisfelhom.hu") +HOSTHDR = f"Host: felhom.{DOMAIN}" +HP = "demo-hp" + +LOG = [] + + +def say(*a): + line = " ".join(str(x) for x in a) + ts = datetime.now().strftime("%H:%M:%S") + print(f"{ts} {line}", flush=True) + LOG.append(f"{ts} {line}") + + +def sh(args, timeout=300, inp=None): + try: + return subprocess.run(args, capture_output=True, text=True, timeout=timeout, input=inp) + except (subprocess.TimeoutExpired, OSError) as e: + return subprocess.CompletedProcess(args, 124, "", f"{e}") + + +def guest(script, timeout=600): + """Run a bash script inside guest 9202. Piped as a file — never as an argument (quoting).""" + # ONE TEMP FILE PER CALL (night 2026-09-23): the shared /tmp/w.sh swapped scripts under + # two concurrent walks (memory: guest-helper-shares-one-tmp-file). + import secrets as _s + t = f"/tmp/w{GUEST}-{os.getpid()}-{_s.token_hex(4)}.sh" + r = sh(["ssh", "-o", "ConnectTimeout=20", "-o", "StrictHostKeyChecking=accept-new", HP, + f"export LC_ALL=C; cat > {t}; pct push {GUEST} {t} {t} >/dev/null 2>&1; " + f"pct exec {GUEST} -- bash {t}; pct exec {GUEST} -- rm -f {t}; rm -f {t}"], + timeout=timeout, inp=script) + return r.stdout or "" + + +def login(): + pw = open(f"{SC}/.ctlpw").read().strip() + sh(["curl", "-sk", "-D", f"{SC}/hdr{os.getpid()}.txt", "-o", "/dev/null", "-H", HOSTHDR, + "-X", "POST", "--data-urlencode", f"password={pw}", f"{BASE}/login"]) + h = open(f"{SC}/hdr{os.getpid()}.txt").read() + m = re.search(r"felhom_session=[A-Za-z0-9._-]+", h, re.I) + if not m: + sys.exit("login failed: no session cookie") + open(f"{SC}/sess{os.getpid()}.txt", "w").write(m.group(0)) + r = sh(["curl", "-sk", "-L", "-H", HOSTHDR, "-H", f"Cookie: {m.group(0)}", f"{BASE}/"]) + c = re.search(r' the felhom_gate cookie the household's browser would hold (setup gate, v0.280.0) + + +def _loc(out): + m = re.search(r"(?im)^location:\s*(\S+)", out or "") + return m.group(1) if m else "" + + +def gate_cookie(sub): + """Pass the setup gate (`09` decision 46) the way the HOUSEHOLD does: the app host redirects to the + dashboard's /__gate/start, which (with the dashboard session) redirects back to the app host's + /__felhom_gate/cb, which sets `felhom_gate`. Never printed.""" + import urllib.parse + sess = open(f"{SC}/sess{os.getpid()}.txt").read().strip() + r = sh(["curl", "-sk", "-D", "-", "-o", "/dev/null", "-H", "Accept: text/html", "-H", f"Host: {sub}.{DOMAIN}", f"{BASE}/"]) + loc = _loc(r.stdout) + if "/__gate/start" not in loc: + GATE[sub] = "" + return "" # not gated (open, or no gate for this app) + u = urllib.parse.urlsplit(loc) + r = sh(["curl", "-sk", "-D", "-", "-o", "/dev/null", "-H", "Accept: text/html", "-H", f"Host: {u.hostname}", "-H", f"Cookie: {sess}", + f"{BASE}{u.path}?{u.query}"]) + loc = _loc(r.stdout) + u = urllib.parse.urlsplit(loc) + if "/__felhom_gate/cb" not in u.path: + say(f" gate: the dashboard did not hand back a callback for {sub} ({loc[:80]})") + return "" + r = sh(["curl", "-sk", "-D", "-", "-o", "/dev/null", "-H", "Accept: text/html", "-H", f"Host: {u.hostname}", f"{BASE}{u.path}?{u.query}"]) + m = re.search(r"(?im)^set-cookie:\s*(felhom_gate=[^;\r\n]+)", r.stdout or "") + GATE[sub] = m.group(1) if m else "" + say(f" gate: {sub} is gated — passed as the household (cookie {'set' if GATE[sub] else 'NOT set'})") + return GATE[sub] + + +def app_curl(sub, path, *extra, method=None, data=None, timeout=45, _retry=True): + """A call to the APP's own front door on 9202 — the household's route, not ours. Carries the setup + gate's cookie when the app is gated, merged into a fixture's own Cookie header (never a second one).""" + raw = list(extra) + gc = GATE[sub] if sub in GATE else gate_cookie(sub) + ext = list(raw) + if gc: + merged = False + for i, a in enumerate(ext): + if isinstance(a, str) and a.lower().startswith("cookie:") and i > 0 and ext[i - 1] == "-H": + ext[i] = a + "; " + gc + merged = True + if not merged: + ext = ["-H", f"Cookie: {gc}"] + ext + args = ["curl", "-sSk", "--max-time", str(timeout), "-H", f"Host: {sub}.{DOMAIN}", + "-w", "\n%{http_code} %{redirect_url}"] + if method: + args += ["-X", method] + if data is not None: + args += ["--data-binary", "@-"] + args += ext + [f"{BASE}{path}"] + r = sh(args, timeout=timeout + 30, inp=data) + body, _, tail = (r.stdout or "").rpartition("\n") + code, _, redir = tail.strip().partition(" ") + if _retry and "/__gate/start" in redir: + GATE.pop(sub, None) # the gate cookie expired or was never taken — log in as the household again + return app_curl(sub, path, *raw, method=method, data=data, timeout=timeout, _retry=False) + return r.returncode, code.strip(), body + + +def stack(name): + _, d = ctl("GET", f"/api/stacks/{name}") + return (d.get("data") or {}) if isinstance(d, dict) else {} + + +def wait_app(sub, path="/", want=("200", "302", "303", "401", "403"), tries=60, delay=5): + """Settling says the container runs; this says the APP answers. Not the same thing.""" + last = None + for _ in range(tries): + rc, code, _ = app_curl(sub, path, timeout=15) + last = (rc, code) + if rc == 0 and code in want: + return True + time.sleep(delay) + say(f" app never answered on {sub}{path} (last rc={last[0]} code={last[1]})") + return False + + +# ------------------------------------------------------------------ the walk + + +DRIVE = "/mnt/felhom-drives/scratch_hdd/userdata" + +# What THIS run generated for a deploy, per app. Deploy secrets are ENCRYPTED AT REST in +# `app.yaml` (`ENC:…`), which is right and which means a fixture cannot read an app's admin +# password back off the box — the household sees it once. So the value the harness itself +# generated is kept here for the life of the run, and nowhere else. +GENERATED = {} + + +def deploy_values(name, sub): + """Fill EVERY required deploy field the way the wizard would, by asking the box what this app + asks for — `GET /api/stacks//deploy-fields` — instead of assuming DOMAIN+SUBDOMAIN. + + Measured 2026-09-21: three apps in one batch refused at the deploy with a correct 400 because + a required field was absent — `HDD_PATH` (navidrome, audiobookshelf) and an admin password + (grafana). The refusals happen BEFORE anything is created (`deploy.go:324`), which is the only + reason this was safe to discover by running it (live-probes rule). + + A `path` field must name a directory that ALREADY EXISTS (`deploy.go:330`), so one is made on + the scratch drive first — the same act the drive browser performs for a household. + """ + code, d = ctl("GET", f"/api/stacks/{name}/deploy-fields") + fields = (((d.get("data") or {}).get("metadata") or {}).get("deploy_fields")) or [] + values = {"DOMAIN": DOMAIN, "SUBDOMAIN": sub} + made = [] + for f in fields: + ev, ty = f.get("env_var"), f.get("type") + if ev in values: + continue + # `type: password` is MANDATORY whatever `required` says — `deploy.go:305-312` refuses + # when the caller sends none, deliberately ("the user needs to know their password"), + # while `.felhom.yml` declares `required: false` and the API serves that verbatim. A + # caller that trusts the contract gets a 400. Measured tonight on grafana; filed. + if not f.get("required") and ty != "password": + continue # the controller generates the optional secrets itself + if ty == "path": + p = f"{DRIVE}/{name}" + values[ev] = p + made.append(p) + elif ty in ("secret", "password"): + import secrets as _s + values[ev] = "Drill-" + _s.token_hex(12) + GENERATED.setdefault(name, {})[ev] = values[ev] + elif f.get("default"): + values[ev] = f["default"] + else: + values[ev] = f"drill-{name}" + if made: + guest("mkdir -p " + " ".join(made) + "; ls -ld " + " ".join(made)) + say(f" [1] made the drive paths this app requires: {made}") + extra = [k for k in values if k not in ("DOMAIN", "SUBDOMAIN")] + if extra: + say(f" [1] required fields filled beyond DOMAIN/SUBDOMAIN: {extra}") + return values + + +def deploy(name, sub, extra_values=None): + st = stack(name) + if st.get("deployed"): + say(f" [1] {name} already deployed — reusing") + return True + values = deploy_values(name, sub) + if extra_values: + values.update(extra_values) + body = {"values": values} + if os.environ.get("KEPT"): # decision 36: the household's answer when the drive holds old data ("fresh" moves it aside, deletes nothing) + body["kept_data"] = os.environ["KEPT"] + code, d = ctl("POST", f"/api/stacks/{name}/deploy", body) + say(f" [1] deploy -> {code} {str(d)[:120]}") + if code != "202": + return False + # WAIT FOR `deployed`, NOT FOR `running`. Measured 2026-09-21 on tandoor: docker reported the + # container `healthy` while the controller's own state read `unhealthy` — a gate on `running` + # alone therefore times out on an app that is up. The state is RECORDED rather than required; + # the real gate is the fixture's own `wait_app`, which asks whether the APP answers. + seen = None + for _ in range(90): + time.sleep(5) + st = stack(name) + seen = st.get("state") + # `deployed` alone is NOT enough and `state` alone is NOT right. Measured 2026-09-21: + # tandoor reads `unhealthy` while serving (R-618), so gating on "running" hangs; and romm + # read `deployed=True, state=degraded, pinned_images=None` twenty seconds in, i.e. the + # deploy had not finished writing app.yaml. The PIN is the deploy's own completion mark + # (`runComposeDeploy` writes it), so that is what to wait for. + pins = (st.get("app_config") or {}).get("pinned_images") + if st.get("deployed") and pins and seen in ("running", "unhealthy", "degraded"): + say(f" [1] deployed, controller state={seen}, " + f"pinned={(st.get('app_config') or {}).get('pinned_images')}") + if seen != "running": + say(f" [1] NOTE: the controller's own state is {seen!r}, not 'running' — recorded, " + f"not treated as a failure; the fixture's front-door wait is the real gate") + return True + say(f" [1] never became deployed (last controller state={seen!r})") + return False + + +def backup_now(name): + """R-648 (2026-09-23): NO whole-box „Mentés most" from a drill, ever. + + `POST /api/backup/run` is the only backup endpoint and it is WHOLE-BOX: on 9201 it stopped and + restarted 9 of 10 standing apps twice, and on 9202 it broke a deploy in flight (R-634). The product + has NO per-app backup endpoint (router.go: /backup/run, /backup/tier2 only); the per-app backup + exists only inside the guarded update, whose `backing-up` phase calls RunAppBackupNow for the one + app. So this presses nothing: the update takes the throwaway app's own backup, and says so in its + phase list. A seed written "after the backup" is therefore written before the update's own backup + — the undo's last-second copy is still the one that must bring it back.""" + say(f" [4] backup press SKIPPED for {name} (R-648: whole-box only; the update's backing-up phase backs up {name} alone)") + return None + +def drill_bump(app, frm, to, service_hint=None): + """Serialised across concurrent walks: one git working tree, one lock.""" + import fcntl + with open(f"{SC}/drill.lock", "w") as lk: + fcntl.flock(lk, fcntl.LOCK_EX) + sh(["git", "-C", DRILL, "pull", "-q", "--rebase", "origin", "main"], timeout=120) + return _drill_bump(app, frm, to, service_hint) + + +def _drill_bump(app, frm, to, service_hint=None): + """Commit the edge to the DRILL repo. catalog_since set by hand (the drill repo has no gates). + + `frm`/`to` may be comma-separated lists of the SAME length: an app whose own version lives in + two images (adventurelog's backend and frontend) moves both in one edge, while its engine + sidecar stays where it is — `09` §3b Q3's rule is per SERVICE, and an app-half edge must move + every service that carries the app's own version and no others. + """ + comp = f"{DRILL}/templates/{app}/docker-compose.yml" + fy = f"{DRILL}/templates/{app}/.felhom.yml" + s = open(comp).read() + froms = [x.strip() for x in frm.split(",") if x.strip()] + tos = [x.strip() for x in to.split(",") if x.strip()] + if len(froms) != len(tos): + say(f" [5] from/to lists differ in length: {froms} vs {tos}") + return None + for f1, t1 in zip(froms, tos): + if f"image: {f1}" not in s: + say(f" [5] FROM ref not found in compose: {f1}") + return None + s = s.replace(f"image: {f1}", f"image: {t1}") + open(comp, "w").write(s) + f = open(fy).read() + today = datetime.now().strftime("%Y-%m-%d") + f = re.sub(r'^catalog_since:.*$', f'catalog_since: "{today}"', f, count=1, flags=re.M) + open(fy, "w").write(f) + sh(["git", "-C", DRILL, "add", "-A"]) + sh(["git", "-C", DRILL, "commit", "-q", "-m", f"DRILL {app}: {frm} -> {to}"]) + r = sh(["git", "-C", DRILL, "push", "-q", "origin", "main"], timeout=120) + h = sh(["git", "-C", DRILL, "rev-parse", "--short=12", "HEAD"]).stdout.strip() + say(f" [5] drill commit {h}: {app} {frm} -> {to} (push rc={r.returncode})") + return h + + +def sync_rescan(expect_app=None, expect_ref=None, tries=12, delay=5): + """Sync, rescan, and — when told what to expect — WAIT FOR THE BADGE TO CATCH UP. + + R-607: `POST /api/sync` answers "nincs valtozas" while the catalog HAS moved, and + `catalog_images` stays stale until a separate rescan. Tonight showed the rescan alone is not + enough either: mealie's badge read "Naprakesz" seconds after its bump was pushed, and the + Update that followed moved nothing and still reported "Frissitve". So when the caller knows + which reference should appear, this polls for it and SAYS HOW LONG IT TOOK — which is the + NUMBER R-607 asks for and has never had. + """ + t0 = time.time() + ctl("POST", "/api/sync") + time.sleep(2) + ctl("POST", "/api/stacks/rescan") + time.sleep(2) + if not expect_app or not expect_ref: + return None + for i in range(tries): + cat = stack(expect_app).get("catalog_images") or {} + if expect_ref in cat.values(): + waited = round(time.time() - t0, 1) + if i: + say(f" [sync] the badge needed {waited}s and {i+1} sync+rescan rounds to catch up " + f"to {expect_ref} — R-607's window, measured") + return waited + time.sleep(delay) + ctl("POST", "/api/sync") + time.sleep(1) + ctl("POST", "/api/stacks/rescan") + say(f" [sync] the badge NEVER caught up to {expect_ref} in {round(time.time()-t0,1)}s — " + f"catalog_images = {stack(expect_app).get('catalog_images')}") + return None + + +def badges(name): + out = {} + for lang, suffix in (("hu", ""), ("en", "?lang=en")): + h = page(f"/apps/{name}{suffix}") + m = re.findall(r']*title="([^"]*)"[^>]*>([^<]*)<', h) + out[lang] = [{"title": a.strip(), "text": b.strip()} for a, b in m][:3] + return out + + +def press_update(name, poll=1.0, cap_s=1800): + code, d = ctl("POST", f"/api/stacks/{name}/update") + say(f" [6] Update -> {code} {str(d)[:220]}") + if code not in ("202", "200"): + return {"accepted": False, "http": code, "refusal": d, "phases": [], "duration_s": 0} + phases, seen, t0 = [], None, time.time() + while time.time() - t0 < cap_s: + st = stack(name) + ph = st.get("update_phase") + if ph != seen: + seen = ph + rec = {"t": round(time.time() - t0, 1), "phase": ph, + "label": st.get("update_phase_label"), "updating": st.get("updating"), + "error": st.get("update_error"), "hold": st.get("hold_reason")} + phases.append(rec) + say(f" +{rec['t']:>6.1f}s phase={ph} label={rec['label']} " + f"err={rec['error']} hold={rec['hold']}") + if not st.get("updating") and ph in ("done", "failed", "undone", None) and time.time() - t0 > 3: + break + time.sleep(poll) + st = stack(name) + return {"accepted": True, "http": code, "phases": phases, + "duration_s": round(time.time() - t0, 1), + "final_phase": st.get("update_phase"), "update_error": st.get("update_error"), + "hold_reason": st.get("hold_reason"), "state": st.get("state")} + + +def observables(name): + st = stack(name) + ac = st.get("app_config") or {} + live = guest(f""" +grep -E '^\\s+image:' /opt/docker/stacks/{name}/docker-compose.yml 2>/dev/null | sed 's/^ *//' +echo '---inspect---' +for c in $(docker ps -a --filter label=com.docker.compose.project={name} --format '{{{{.Names}}}}'); do + echo -n "$c "; docker inspect "$c" --format '{{{{.Config.Image}}}} running={{{{.State.Running}}}} restarts={{{{.RestartCount}}}}' +done +""") + a, _, b = live.partition("---inspect---") + return { + "pinned_images": ac.get("pinned_images"), + "installed_images": {k: (v.get("ref") if isinstance(v, dict) else v) + for k, v in (ac.get("installed_images") or {}).items()}, + "catalog_images": st.get("catalog_images"), + "live_compose_image_lines": [x for x in a.strip().splitlines() if x.strip()], + "docker_inspect": [x for x in b.strip().splitlines() if x.strip()], + } + + +def app_logs(name, lines=400): + """The app's own container log, DECODED. The endpoint answers a JSON envelope whose `logs` is + one string with escaped newlines — a scan over the envelope sees a single enormous line and + finds nothing, which reads exactly like "the app printed no migration line" and is not. R-96 + rule 3 in a new place: an absent line is not evidence when the instrument cannot see lines.""" + code, d = ctl("GET", f"/api/stacks/{name}/logs?lines={lines}") + if isinstance(d, dict): + data = d.get("data") + if isinstance(data, dict) and isinstance(data.get("logs"), str): + return data["logs"] + if isinstance(d.get("_raw"), str): + return d["_raw"] + return str(d) + + +def write_verdict(rec, appdir): + os.makedirs(appdir, exist_ok=True) + p = os.path.join(appdir, "verdict.json") + json.dump(rec, open(p, "w"), indent=2, ensure_ascii=False) + say(f" [9] verdict {rec['verdict']} -> {p}") + + +def remove(name): + """Remove through the PRODUCT, never `docker rm` (live-probes rule). The remove endpoint + refuses a running stack — `409 still running` — so the stop is part of the act, not a tidy-up.""" + c1, d1 = ctl("POST", f"/api/stacks/{name}/stop") + say(f" [X] stop -> {c1} {str(d1)[:100]}") + for _ in range(24): + time.sleep(5) + if stack(name).get("state") != "running": + break + code, d = ctl("POST", f"/api/stacks/{name}/remove", + {"remove_hdd_data": True, "remove_backups": True}) + say(f" [X] remove (with drive data) -> {code} {str(d)[:160]}") + if code == "409": + # R-442's fail-closed guard: when the storage subsystem cannot RESOLVE the app's drive + # path, the removal is REFUSED and the app is kept rather than half-deleted. On guest 9202 + # `/api/disks` answers `agent not configured`, so every app deployed with an HDD_PATH hits + # this. The household's other choice — remove the app, KEEP the data — is accepted, and the + # harness takes it, then tidies its own directory by name at teardown. + say(" [X] refused because the drive path cannot be resolved (R-442, fail-closed and right)" + " — removing the app and KEEPING the drive data instead") + code, d = ctl("POST", f"/api/stacks/{name}/remove", + {"remove_hdd_data": False, "remove_backups": True}) + say(f" [X] remove (keeping drive data) -> {code} {str(d)[:160]}") + time.sleep(5) + st = stack(name) + left = guest(f"ls -d /opt/docker/stacks/{name} 2>/dev/null; " + f"docker ps -a --filter label=com.docker.compose.project={name} --format '{{{{.Names}}}}'") + say(f" [X] after remove: deployed={st.get('deployed')} leftovers={left.strip()!r}") + return code + + +def app_env(name, key): + """Read one deploy value the CUSTOMER was given (e.g. the generated admin password) from the + app's own `app.yaml`. This is not seeding — it is how the household logs in; the controller + shows them the same value. Data still goes in through the app's own front door.""" + out = guest(f"grep -E '^\\s*{key}:' /opt/docker/stacks/{name}/app.yaml 2>/dev/null | head -1") + if ":" in out: + return out.split(":", 1)[1].strip().strip('"').strip("'") + return "" + + +def snapshots(name): + """The restorable copies the backups page offers for this app.""" + code, d = ctl("GET", f"/api/backup/snapshots?stack={name}") + data = d.get("data") if isinstance(d, dict) else None + if isinstance(data, dict): + for k in ("snapshots", "items", "restore_points"): + if isinstance(data.get(k), list): + return data[k] + return data if isinstance(data, list) else [] + + +def restore(name, snapshot_id=None, wait_s=1200): + """The household's own way out: the „Visszaállítás a mentésből" button on the backups page. + + A FORM post, not an API call — `POST /backup/restore` with `_csrf`, `stack_name`, + `snapshot_id` — because that is the button the sentence tells them to press. + """ + snaps = snapshots(name) + if snapshot_id is None: + if not snaps: + say(f" [R] no restorable copy offered for {name}") + return {"ok": False, "why": "no snapshot offered", "snapshots": snaps} + first = snaps[0] + snapshot_id = first.get("id") or first.get("snapshot_id") or first.get("short_id") + say(f" [R] restoring {name} from snapshot {snapshot_id!r} (of {len(snaps)} offered)") + sess = open(f"{SC}/sess{os.getpid()}.txt").read().strip() + csrf = open(f"{SC}/csrf{os.getpid()}.txt").read().strip() + r = sh(["curl", "-sk", "-D", "-", "-o", "/dev/null", "-H", HOSTHDR, "-H", f"Cookie: {sess}", + "-X", "POST", + "--data-urlencode", f"_csrf={csrf}", + "--data-urlencode", f"stack_name={name}", + "--data-urlencode", f"snapshot_id={snapshot_id}", + f"{BASE}/backup/restore"], timeout=180) + head = (r.stdout or "").split("\n")[0].strip() + loc = [l for l in (r.stdout or "").split("\n") if l.lower().startswith("location:")] + say(f" [R] POST /backup/restore -> {head} {loc[:1]}") + t0 = time.time() + last = None + while time.time() - t0 < wait_s: + code, d = ctl("GET", "/api/backup/restore-status") + dd = d.get("data") or {} + cur = (dd.get("running"), dd.get("phase") or dd.get("state"), dd.get("message")) + if cur != last: + say(f" +{round(time.time()-t0,1):>6.1f}s restore {cur}") + last = cur + if not dd.get("running", False) and time.time() - t0 > 5: + break + time.sleep(2) + st = stack(name) + say(f" [R] after restore: state={st.get('state')} hold={st.get('hold_reason')!r} " + f"phase={st.get('update_phase')}") + return {"ok": True, "snapshot_id": snapshot_id, "snapshots": snaps, + "http": head, "location": loc[:1], "seconds": round(time.time() - t0, 1), + "state_after": st.get("state"), "hold_after": st.get("hold_reason"), + "observables_after": observables(name)} diff --git a/documentation/backlog/OPEN-ITEMS.md b/documentation/backlog/OPEN-ITEMS.md index 93f690cd..e5c483c2 100644 --- a/documentation/backlog/OPEN-ITEMS.md +++ b/documentation/backlog/OPEN-ITEMS.md @@ -661,18 +661,18 @@ class (an image `VOLUME` at an unmounted path) is still live — `immich-server` | **R-435** | **The snapshot-drop detector is blind to a single-app deletion — the exact shape the box can produce.** `snapshotDropFraction = 0.5` and `snapshotDropFloor = 5` (`hub/internal/monitor/offsite.go`) require a fall of MORE than half the previous count. demo-hp's baseline is **69** across 9 apps, so ~35 snapshots must go before it speaks; **one app's tag is ~9 and is invisible.** `offbox.go:1388` runs `forget --prune` **grouped by host,tags** — a per-tag wipe is precisely the shape a faulty retention or a targeted deletion produces. **This is deliberate, not accidental:** the constant's own comment argues the insensitivity, and *"a detector that cries wolf is switched off within a fortnight"* is a lesson this project paid for. **So this row is NOT a demand to lower the threshold.** It is a demand that the blind spot be written where the operator reads it, because "an unexplained fall is noticed within a day" (R-431, and `STATUS.md`) is true only of falls above half. **Discovered by arithmetic while planning the drill's Phase 2/3 pairing, which could not have worked:** Phase 2 deletes one app and Phase 3 expects the alarm to fire. **LIMITATION NOW WRITTEN INTO THE ALARM'S OWN DOCUMENTATION, hub v0.111.1** — the comment above `snapshotDropFraction` in `hub/internal/monitor/offsite.go` now states what the detector does NOT see, with the demo-hp arithmetic and the `forget --prune` grouping that makes the blind spot sit on the most likely single-app failure. **It also says explicitly that the numbers must NOT be lowered to "fix" this** and that per-app detection needs a SECOND signal keyed on the per-tag count. **The row stays OPEN because documenting a blind spot is not covering it** — and because `STATUS.md` and R-431 both still say "noticed within a day", which is true only of falls above half. | **OPEN — documented in code v0.111.1; the coverage gap itself is unclosed** | | **R-436** | **LEAD, NOT A DEFECT — append-only may be reachable without a new machine, which would make R-95's real prevention far cheaper than the spike concluded.** Hetzner's port-23 restricted shell advertises, in its own `help`, these server-side backends: `borg`, `rsync`, `scp`, `sftp`, **`rclone serve restic --stdio`**. And restic 0.14.0 **recognises the `rclone:` backend** — MEASURED 2026-09-01 with a control: `banana:` → `Fatal: parsing repository location failed: invalid backend`, while `rclone:` → `exec: "rclone": executable file not found in $PATH` (i.e. the backend parsed and it tried to run the helper). rclone is **not** in the controller image today. `rclone serve restic` carries an **`--append-only`** flag. **Why this matters:** the R-95 spike's option 3 was priced at a new always-on service in the recovery path plus either a mount in the hot path or migrating every customer's history — and it was deferred on that price. This route needs neither: the server side already runs at the provider. **THE CAVEAT, STATED FIRST because it may kill the idea:** the **client** supplies the server command line, so a compromised guest could simply omit `--append-only` unless the provider pins it. **NOT ESTABLISHED:** whether Hetzner pins the flag or accepts client-supplied arguments. **That is a vendor question and it is cheap** — it should be asked before any code is written, because if the answer is "client-supplied" this lead is worth nothing. **STRENGTHENED 2026-09-01 (operator supplied the page): the backend is OFFICIALLY DOCUMENTED, not merely advertised in a shell banner.** `docs.hetzner.com/storage/storage-box/access/access-ssh-rsync-borg/#restic` reads: *"Restic is natively supported with the SFTP backend. As another option, we support the restic backend, which is provided by Rclone over SSH."* So the transport exists as a supported product feature and the client half is already proven (restic 0.14.0 parses `rclone:`, measured with a control). **AND THE SAME PAGE SETTLES THAT THE DOCS CANNOT ANSWER THE CAVEAT: neither its Rclone nor its Restic section mentions append-only at all.** That is worth stating because it closes the cheapest alternative to asking — nobody need re-read the documentation hoping for it. **Corroboration, unlooked for:** that page's table of port-23 commands matches, item for item, the `help` output measured live on our own sub-account — independent confirmation that the live measurement was reading the right product's surface. **-- ANSWERED BY HETZNER 2026-09-22 (ticket #2026090103040671), and the lead is GOOD.** Asked directly whether `--append-only` is enforced by Hetzner or taken from what the client sends, support replied: *"You can use --append-only and it would look like this: `command="rclone serve restic --stdio --append-only path/to/repo" `"*, pointing at `fluix.one/blog/hetzner-restic-append-only/`. **The mechanism is an SSH FORCED COMMAND pinned to the key in the Storage Box's `authorized_keys`** - so the flag is enforced on the server side, by a line WE write, and a client asking for a plain `rclone serve restic --stdio` on that key gets the forced one instead. **That is real prevention without a new machine, which is what this lead claimed and could not confirm.** **What it does NOT say, and must not be read as saying:** a key WITHOUT that prefix still gets a deleting server, so this protects a repository only if every key that can reach it carries the forced command - including any key an operator adds later. **NOTHING IS MEASURED YET.** Owed, and cheap: a forced-command key on `u629488`, a restic backup through it that SUCCEEDS, and a `forget --prune` through it that is REFUSED - with the refusal quoted. Until that runs this is a support answer, not a property of our backups. | **OPEN — ask the vendor before building anything** | | **R-437** | **The register compression sweep is OWED, and it was deliberately NOT run inside the 2026-09-01 beta-line session — this row is the record of that choice, not a note.** **The ask:** compress what has closed in `OPEN-ITEMS.md`. **The measurement, taken before deciding:** 181 rows, 316 KB of row text, of which **12 rows / ~25 KB (about 7 %) carry a CLOSED/DECIDED/ANSWERED leading verdict.** So the sweep buys little and touches everything. **Why it was refused as a side-task, and the citation matters:** a compression sweep is the exact operation that has already gone wrong here. The 2026-08-22 sweep (`ef6ac6f`, R-376..R-378) matched a status word ANYWHERE in the row, moved rows that were not closed, and **R-378 caught six in the same session and missed a seventh** — R-87 sat in the wrong register for nine days while the ranking paragraph pointed at nothing (R-405). **That is a session-scale hazard, and running it as the tail end of a session about something else is how it happened the first time.** **WHAT IS OWED, scoped so it can be picked up cold:** (1) classify by the **LEADING VERDICT** of the state cell only — the rule `closed_register_gate.py` already implements and red-proofs, never a whole-row match; (2) move, never rewrite — a compressed row that loses its evidence is worse than a long one; (3) run `closed_register_gate.py` before and after and quote both; (4) re-read the ranking paragraph afterwards, because that is the surface that silently went stale last time. **Not urgent:** the file is 688 lines and every gate reads it in well under a second. | **OPEN — owed; needs its own session, not a tail end** | -| **R-440** | **[P2-MEDIUM] 23 catalog image pins float, so an update is not reproducible.** `compose pull` on a moving tag fetches whatever upstream published that day. **MEASURED 2026-09-01 over `app-catalog-felhom.eu` @ `29edad9c5bf4`: 79 `image:` lines across 53 apps, 66 distinct; 23 of those lines carry a tag with no patch version.** `postgres:16-alpine` (8 apps), `redis:7-alpine` (6), `mariadb:11.6` (2), plus one each of `postgres:15-alpine`, `postgis/postgis:16-3.5-alpine`, `mariadb:11.4`, `mariadb:12.3`, `ghcr.io/claperco/claper:2.5`, `ghcr.io/thomiceli/opengist:1.13`, `wger/server:2.6`. **A 24th is arguable and is recorded rather than rounded away:** `ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0` pins both extensions exactly but leaves the PostgreSQL patch floating. A customer pressing Frissites can therefore swap their DATABASE ENGINE build with no catalog change and no record; two boxes updated on two days end up different. **Severity MEDIUM on its own; it becomes BLOCKING the moment a pre-update copy exists**, because "what did we upgrade from and to" must be recordable and today it is not — which is also why R-440 must be read next to the digest discipline in Rule 10 of the spike. **MEASURED LIVE 2026-09-01 — the floating pins have ALREADY moved, with a passing control.** Running digests on demo-hp compared against what the registry serves for the same tag today: **`mariadb:11.4` MOVED** (`sha256:4f1d8d20...` -> `sha256:611a2fcc...`) and **`mariadb:12.3` MOVED** (`sha256:a02fe89c...` -> `sha256:dd9b303a...`), while `postgres:16-alpine`, `redis:7-alpine`, `mariadb:11.6` and `opengist:1.13` were SAME — **and both fully-pinned CONTROLS (`rommapp/romm:5.0.0`, `privatebin/pdo:2.0.5`) were SAME.** So on a box with ZERO visible drift by tag, pressing Frissites today silently swaps the DATABASE ENGINE build under `romm` and `bookstack`, with no catalog change and no record. **Compounding fact found while reading:** the recovery unit records `ImagePins` but the manifest comment says *"image NOT stored - re-pulled on restore"*, so a RESTORE of a floating-pinned app also re-pulls whatever is current — the same non-reproducibility on the recovery path. **HALF OF THE ANSWER SHIPPED 2026-09-02 (controller v0.233.0, slice 1): `app.yaml.installed_images` now records, per compose SERVICE, the reference AND the repo digest each container was actually created from — so "what did we upgrade FROM" is answerable on any box that has taken one lifecycle action since the upgrade.** What is still missing is the other half: comparing that digest against what the registry serves for the same tag TODAY, which needs a network call the render path deliberately does not make (see R-446). **The row therefore stays OPEN and its rank is unchanged** — recording a digest does not make a floating pin reproducible; it makes the drift measurable after the fact. `audits/SPIKE-app-update-2026-09-01.md` **— NIGHT 2026-09-23:** every image moved tonight (and the 21 backfilled moves) carries its resolved digest in the catalog's test record; the floating pins themselves still float until the box pulls by digest (`09` §6.4 part 6). | **OPEN — rank P2-MEDIUM; owner: CC** | +| **R-440** | **[P2-MEDIUM] 23 catalog image pins float, so an update is not reproducible.** `compose pull` on a moving tag fetches whatever upstream published that day. **MEASURED 2026-09-01 over `app-catalog-felhom.eu` @ `29edad9c5bf4`: 79 `image:` lines across 53 apps, 66 distinct; 23 of those lines carry a tag with no patch version.** `postgres:16-alpine` (8 apps), `redis:7-alpine` (6), `mariadb:11.6` (2), plus one each of `postgres:15-alpine`, `postgis/postgis:16-3.5-alpine`, `mariadb:11.4`, `mariadb:12.3`, `ghcr.io/claperco/claper:2.5`, `ghcr.io/thomiceli/opengist:1.13`, `wger/server:2.6`. **A 24th is arguable and is recorded rather than rounded away:** `ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0` pins both extensions exactly but leaves the PostgreSQL patch floating. A customer pressing Frissites can therefore swap their DATABASE ENGINE build with no catalog change and no record; two boxes updated on two days end up different. **Severity MEDIUM on its own; it becomes BLOCKING the moment a pre-update copy exists**, because "what did we upgrade from and to" must be recordable and today it is not — which is also why R-440 must be read next to the digest discipline in Rule 10 of the spike. **MEASURED LIVE 2026-09-01 — the floating pins have ALREADY moved, with a passing control.** Running digests on demo-hp compared against what the registry serves for the same tag today: **`mariadb:11.4` MOVED** (`sha256:4f1d8d20...` -> `sha256:611a2fcc...`) and **`mariadb:12.3` MOVED** (`sha256:a02fe89c...` -> `sha256:dd9b303a...`), while `postgres:16-alpine`, `redis:7-alpine`, `mariadb:11.6` and `opengist:1.13` were SAME — **and both fully-pinned CONTROLS (`rommapp/romm:5.0.0`, `privatebin/pdo:2.0.5`) were SAME.** So on a box with ZERO visible drift by tag, pressing Frissites today silently swaps the DATABASE ENGINE build under `romm` and `bookstack`, with no catalog change and no record. **Compounding fact found while reading:** the recovery unit records `ImagePins` but the manifest comment says *"image NOT stored - re-pulled on restore"*, so a RESTORE of a floating-pinned app also re-pulls whatever is current — the same non-reproducibility on the recovery path. **HALF OF THE ANSWER SHIPPED 2026-09-02 (controller v0.233.0, slice 1): `app.yaml.installed_images` now records, per compose SERVICE, the reference AND the repo digest each container was actually created from — so "what did we upgrade FROM" is answerable on any box that has taken one lifecycle action since the upgrade.** What is still missing is the other half: comparing that digest against what the registry serves for the same tag TODAY, which needs a network call the render path deliberately does not make (see R-446). **The row therefore stays OPEN and its rank is unchanged** — recording a digest does not make a floating pin reproducible; it makes the drift measurable after the fact. `audits/SPIKE-app-update-2026-09-01.md` **— NIGHT 2026-09-23:** every image moved tonight (and the 21 backfilled moves) carries its resolved digest in the catalog's test record; the floating pins themselves still float until the box pulls by digest (`09` §6.4 part 6). **-- MEASURED 2026-09-30 on demo-hp 9201: a fresh install or a guarded Update renders `name:tag@sha256` from the ladder (`digest.go` `RenderWithLadderDigests`) — 9 of 20 services there run such a definition (adventurelog, docmost, paperless-ngx). The other 11 run TAG-ONLY definitions: bookstack, kimai, opengist, privatebin, romm were installed before v0.269.0 and not updated since, and `CarryDigests` (`digest.go:141`) keeps only a digest the running definition already has; bentopdf and calibre-web have no ladder at all. So a re-pull of those (a restore) takes whatever the tag serves that day. `audits/pg-last-six-2026-09-30/E/E2-digests-demo-hp.txt`.** | **NARROWED 2026-09-30 — floating only for (1) apps with no ladder entry and (2) apps installed before v0.269.0 until their next guarded Update; owner: CC.** | | **R-444** | **[P3-LOW] Nothing runs `pct fstrim` on the fleet, and demo-hp's thin pool was carrying ~23.8 GB of blocks the guest had already freed.** MEASURED 2026-09-01 during this spike's teardown: the run itself added ~1.05 GiB that `local-lvm` did not reclaim on delete (68.97% -> 70.91%); `fstrim` INSIDE the unprivileged container is refused (`FITRIM ioctl failed: Operation not permitted`, all three mounts); `pct fstrim 9201` from the PVE host then trimmed **30.2 GiB + 57 GiB** and took `local-lvm` to **26.78%** — **23.8 GB BELOW this run's own starting point**, i.e. the surplus was long-standing, not ours. **Why it is not merely housekeeping:** a thin pool that only ever grows can reach 100% from DELETED data alone, and a full thin pool takes every guest on the host read-only. demo-hp had 16.4 GB free before the trim. **Not urgent, and the row says so** — but the appliance has no periodic trim and no operator surface reports the gap between guest-free and pool-used. Owner: **CC.** `audits/SPIKE-app-update-2026-09-01.md` | **OPEN — rank P3-LOW; owner: CC** | | **R-445** | **[P3-LOW] Hub app telemetry survives the app's removal, so a 15-minute throwaway now sets a FLEET-WIDE memory recommendation.** MEASURED 2026-09-01: this spike's Phase 6 Nextcloud existed for ~15 minutes on demo-hp, spent part of it crash-looping, and was then removed with all volumes. The hub's `/apps/nextcloud` page still reports `Deployments`, `Avg Memory 208 MB`, `P95 Memory 280 MB` and **`Suggested Limit (P95x1.2) = 352 MB`**, plus three MariaDB `io_uring` rows under Known Issues attributed to demo-hp. **The suggested limit is an operator-facing recommendation derived from a sample that no longer exists anywhere** — and Nextcloud is a real catalog app whose limit someone may act on. **RETAINED DELIBERATELY BY THIS RUN, NOT CLEARED, and the reason is part of the row:** the hub offers `POST /apps/nextcloud/reset-telemetry` whose own confirm reads *"Delete all telemetry data for nextcloud? This cannot be undone."* — an irreversible write on the operator's surface, and the operator authorised Phase 6, not this. **The one-line command is recorded in the audit doc so it is a decision, not a task.** The general question is the row: should telemetry for an app with zero live deployments age out, or be excluded from the suggestion? Owner: **VIKTOR rules, CC implements.** `audits/SPIKE-app-update-2026-09-01.md` | **OPEN — rank P3-LOW; owner: VIKTOR rules, CC implements** | -| **R-446** | **[P2-MEDIUM] „Naprakész" can be FALSE, and the badge that says it cannot tell.** Slice 2 (controller v0.233.0, 2026-09-02) compares the RECORDED image reference per compose service against the reference the current template pins, and **queries no registry** — deliberately: a customer's box must not depend on reaching eight upstream registries to render a page (`felhom-controller/controller/internal/web/updatebadge.go`, `compareInstalledToTemplate`). **For the 23 floating pins that comparison is blind by construction:** `postgres:16-alpine`, `mariadb:11.6` and 21 others can carry an identical reference over an image that has moved. **MEASURED, not theorised — spike §5 found `mariadb:11.4` and `mariadb:12.3` had BOTH already moved upstream while two fully-pinned CONTROLS held.** So `romm` and `bookstack` on demo-hp would read „Naprakész" over a database engine build that is not the one the catalog now resolves to. **This is a KNOWN LIMITATION OF A SHIPPED FEATURE, filed the same session rather than left implicit**, and it is stated in the same words in `architecture/09-update-architecture.md` §8.1 and in the controller's `README.md`. The close is a digest comparison against the registry, which needs a network call, a cache and a failure posture — it is not a one-liner and it is not slice 2's job. **Depends on R-440**, whose fix (stop floating) would remove the problem instead of measuring it — take that route first if it is available. `architecture/09-update-architecture.md` **MEASURED 2026-09-21, and the blind spot is not one or two pins.** `audits/UPDATE-ARC-STATE-2026-09-21.md` §3.3: the catalog carries **10 floating pins of 66** (recounted — the old "23" was stale), and **6 of the 7 measurable engine pins have been repushed upstream since the catalog set them** — `postgres:16-alpine` (8 apps), `postgres:15-alpine`, `redis:7-alpine` (6 apps), `mariadb:11.4`, `mariadb:12.3`, `postgis:16-3.5-alpine`; only `mariadb:11.6` has not. The 8th (immich's own ghcr build) is UNMEASURED — ghcr exposes no anonymous last-modified timestamp. **So on demo-hp today four apps read „Naprakész" over a database engine image that has demonstrably moved.** The fix does NOT need the box to query a registry: the catalog can record each pin's digest at push time (`check-image-resolvable.py` already resolves it) and the box compares digests. Put to the operator as `09` §3b **Q6**, recommended YES — the cheapest real improvement on the arc's list. **— UPDATE NIGHT 2026-09-21:** **MEASURED ON A BOX 2026-09-21 (update night, leg B8), and it REFINES the row in two ways rather than merely confirming it.** §8.1's numbers came from a registry sweep on DooPlex; this is the same question asked of a customer-shaped box, where the badge actually renders. On guest 9202, `docmost`'s two floating pins were read as `installed_images` records them and compared against the upstream digests measured the same night: `postgres:16-alpine` → **`sha256:721873c34ceb9…` on the box and `sha256:721873c34ceb9…` upstream**, and `redis:7-alpine` → **`sha256:858f009f9709c…` both sides**. **Identical. So the badge „Naprakész" is TRUE for this box**, and the app reads correctly. **(1) The defect's size is set by INSTALL AGE, not by the catalog.** A floating pin is wrong only for a box that pulled BEFORE the tag moved; a box deployed after the repush holds the current image and its badge is right. R-446's "six repushed pins" measured the tag against the date the CATALOG set it, which is the right measure for *the catalog* and not for *a box*. **(2) The producer Q6 needs ALREADY EXISTS on the box.** `installed_images` records a real `digest` per service (`installed.go` §7.1) — the box knows exactly what it is running. What it cannot do is COMPARE, because the catalog carries no digest to compare against. That is Q6's proposal, and this is a concrete confirmation that only the catalog half is missing. Evidence: `audits/update-night-2026-09-21/23-B8-floating-pin.txt`. **-- RULED 2026-09-23 (`09` §3 decision 17):** YES — the catalog records the image digest of every pin at push time; the box compares against it and, where the catalog carries one, pulls **that exact image**, which makes a floating tag reproducible, not only the badge honest. *Pull-by-digest while the definition names a tag is a claim to verify in the build, not a ruling on mechanism.* **-- 2026-09-23:** pull-by-digest MEASURED on 9202 — Docker and Compose both pull and run `redis:7-alpine@sha256:858f…` and refuse a digest that does not exist. **Build trap, read from source:** `splitImageRef` returns "unorderable" for any ref containing `@` (`stacks/updateorder.go:134`), so a digest-carrying pin must have its digest split off before ordering or every such app reads Unknown. `09` §6.4 part 6. **— NIGHT 2026-09-23:** the CATALOG half of the close shipped: every ladder entry records the digest the registry served for each `to` ref (`scripts/image_digest.py`), and the move gate refuses a digest the registry no longer serves. The box does not compare it yet (`09` §6.4 part 6, box half). | **READY TO BUILD — owner: CC; `09` §6.4** | +| **R-446** | **[P2-MEDIUM] „Naprakész" can be FALSE, and the badge that says it cannot tell.** Slice 2 (controller v0.233.0, 2026-09-02) compares the RECORDED image reference per compose service against the reference the current template pins, and **queries no registry** — deliberately: a customer's box must not depend on reaching eight upstream registries to render a page (`felhom-controller/controller/internal/web/updatebadge.go`, `compareInstalledToTemplate`). **For the 23 floating pins that comparison is blind by construction:** `postgres:16-alpine`, `mariadb:11.6` and 21 others can carry an identical reference over an image that has moved. **MEASURED, not theorised — spike §5 found `mariadb:11.4` and `mariadb:12.3` had BOTH already moved upstream while two fully-pinned CONTROLS held.** So `romm` and `bookstack` on demo-hp would read „Naprakész" over a database engine build that is not the one the catalog now resolves to. **This is a KNOWN LIMITATION OF A SHIPPED FEATURE, filed the same session rather than left implicit**, and it is stated in the same words in `architecture/09-update-architecture.md` §8.1 and in the controller's `README.md`. The close is a digest comparison against the registry, which needs a network call, a cache and a failure posture — it is not a one-liner and it is not slice 2's job. **Depends on R-440**, whose fix (stop floating) would remove the problem instead of measuring it — take that route first if it is available. `architecture/09-update-architecture.md` **MEASURED 2026-09-21, and the blind spot is not one or two pins.** `audits/UPDATE-ARC-STATE-2026-09-21.md` §3.3: the catalog carries **10 floating pins of 66** (recounted — the old "23" was stale), and **6 of the 7 measurable engine pins have been repushed upstream since the catalog set them** — `postgres:16-alpine` (8 apps), `postgres:15-alpine`, `redis:7-alpine` (6 apps), `mariadb:11.4`, `mariadb:12.3`, `postgis:16-3.5-alpine`; only `mariadb:11.6` has not. The 8th (immich's own ghcr build) is UNMEASURED — ghcr exposes no anonymous last-modified timestamp. **So on demo-hp today four apps read „Naprakész" over a database engine image that has demonstrably moved.** The fix does NOT need the box to query a registry: the catalog can record each pin's digest at push time (`check-image-resolvable.py` already resolves it) and the box compares digests. Put to the operator as `09` §3b **Q6**, recommended YES — the cheapest real improvement on the arc's list. **— UPDATE NIGHT 2026-09-21:** **MEASURED ON A BOX 2026-09-21 (update night, leg B8), and it REFINES the row in two ways rather than merely confirming it.** §8.1's numbers came from a registry sweep on DooPlex; this is the same question asked of a customer-shaped box, where the badge actually renders. On guest 9202, `docmost`'s two floating pins were read as `installed_images` records them and compared against the upstream digests measured the same night: `postgres:16-alpine` → **`sha256:721873c34ceb9…` on the box and `sha256:721873c34ceb9…` upstream**, and `redis:7-alpine` → **`sha256:858f009f9709c…` both sides**. **Identical. So the badge „Naprakész" is TRUE for this box**, and the app reads correctly. **(1) The defect's size is set by INSTALL AGE, not by the catalog.** A floating pin is wrong only for a box that pulled BEFORE the tag moved; a box deployed after the repush holds the current image and its badge is right. R-446's "six repushed pins" measured the tag against the date the CATALOG set it, which is the right measure for *the catalog* and not for *a box*. **(2) The producer Q6 needs ALREADY EXISTS on the box.** `installed_images` records a real `digest` per service (`installed.go` §7.1) — the box knows exactly what it is running. What it cannot do is COMPARE, because the catalog carries no digest to compare against. That is Q6's proposal, and this is a concrete confirmation that only the catalog half is missing. Evidence: `audits/update-night-2026-09-21/23-B8-floating-pin.txt`. **-- RULED 2026-09-23 (`09` §3 decision 17):** YES — the catalog records the image digest of every pin at push time; the box compares against it and, where the catalog carries one, pulls **that exact image**, which makes a floating tag reproducible, not only the badge honest. *Pull-by-digest while the definition names a tag is a claim to verify in the build, not a ruling on mechanism.* **-- 2026-09-23:** pull-by-digest MEASURED on 9202 — Docker and Compose both pull and run `redis:7-alpine@sha256:858f…` and refuse a digest that does not exist. **Build trap, read from source:** `splitImageRef` returns "unorderable" for any ref containing `@` (`stacks/updateorder.go:134`), so a digest-carrying pin must have its digest split off before ordering or every such app reads Unknown. `09` §6.4 part 6. **— NIGHT 2026-09-23:** the CATALOG half of the close shipped: every ladder entry records the digest the registry served for each `to` ref (`scripts/image_digest.py`), and the move gate refuses a digest the registry no longer serves. The box does not compare it yet (`09` §6.4 part 6, box half). **-- MEASURED 2026-09-30 on demo-hp 9201 (controller 0.283.1): the box half of `09` §6.4 part 6 is live — `stacks/updateorder.go:86` `digestBehind` compares the ladder's tested digest (`catalog_digests`) with `app.yaml installed_images[svc].digest`. All 18 services of the 8 ladder apps there carry both, and all 18 are equal, so their „Naprakész" is true. STILL BLIND by construction (`updateorder.go:96`): an app with NO ladder entry — the catalog carries no digest to compare (bentopdf, calibre-web on demo-hp; 21 of 53 templates after 2026-09-30). `audits/pg-last-six-2026-09-30/E/E2-digests-demo-hp.txt`.** | **NARROWED 2026-09-30 — blind only for apps with no ladder entry (21 of 53); closes as each gets its first proven step (R-462). Owner: CC.** | | **R-450** | **[P2-MEDIUM] UPDATE ARC SLICE 6 — a version sequence: automatic WITHIN a major, never ACROSS one, and an engine change gets its OWN edge.** The first half is an operator ruling of 2026-09-02 and its justification is R-449's measurement: a cross-major jump can be refused by the app itself and cannot be undone. **The second half is a rule recorded now, while it is cheap:** an engine change must never be bundled with an app version bump. `bookstack`'s `0b73e5e` moved the application 25.02.2 → 26.05.2 **and** MariaDB 11.6 → 12.3 in one commit — **two migrations behind one edge**, and an unreadable failure when it breaks. Needs a catalog-side convention and, eventually, a gate. `architecture/09-update-architecture.md` §6 **HALF SHIPPED 2026-09-21 (catalog `5ff36d098cbc`): the second half — an engine change gets its OWN edge — is now ENFORCED** by `check-engine-major.py`, which refuses a commit moving a MariaDB major together with any other image move in that template, naming what it was bundled with. The FIRST half (automatic within a major) is Slice 6 and needs four operator answers — `09` §3b **Q1–Q4**, with the shape it would take in `09` §6.2. **The urgency is now measured:** 46 of the catalog's 58 exact pins are behind upstream and **39 of those are within a major** — the population the 2026-09-02 ruling already says may move without a human. **-- RULED 2026-09-23 (operator, `09` §3 decisions 11–15):** Q1–Q4 answered. The update is a leg of the backup chain after off-site and before the full-system backup (11); automatic with a per-box switch ON by default (12); **the TEST decides, not the tag** — the box applies every step the catalog holds because the catalog holds only tested steps, and `CompareImageRefs` moves to the catalog gate (13, REPLACES "never across a major"); a box behind climbs **one tested step at a time** (14); **the box UNDOES a failed update itself** — old definition + the pre-pin safety dump + health check again, HOLD only if the undo fails (15, REPLACES §6.1's no-auto-undo). The undo and the ladder were SPIKED the same day before any build (`audits/update-rulings-2026-09-23/`); build order and costs in `09` §6.4. **-- SPIKED 2026-09-23 (`audits/update-rulings-2026-09-23/`):** the undo works by hand on three real migrating edges and needs eight product additions (R-637..R-642); **the ladder is measured absent** — one press on a box two steps behind jumped vikunja 2.3.0 → 2.5.0 in 9.5 s and 2.4.0 never ran, and the box cannot see intermediate steps at all because its catalog clone is `--depth 1` (`sync.go:283`/`:300`, one commit visible on both demo guests). The ladder's recommended format is an `update_ladder:` list in `.felhom.yml` with each intermediate step's own definition, NOT the git history (romm's image-moving commit is the definition that OOM-looped). The chain's update leg has ≤15 min as ruled (R-643). Build order `09` §6.4. **— NIGHT 2026-09-23: `09` §6.4 part 4 SHIPPED** (catalog `6db08a5`): the test record `update_ladder:` + two gates + the only writer + the 21-move backfill; 12 more steps published with records. Parts 5 (the box climbs), 6-box-half and 7 remain; the romm press on demo-hp showed today's jump live — 5.3.0 → 5.3.1 AND mariadb 11.4 → 11.8 in one press (both tested steps; `done`). **— 2026-09-24: `09` §6.4 PART 5 SHIPPED** (controller v0.268.0 `206b035`, catalog `5ed599c`): one press = one tested step, each step's own definition at `templates//steps/.yml`, proven live on 9202 (romm 5.3.0/11.4 → 5.3.1/11.4 → 5.3.1/11.8 in two presses, `audits/ladder-2026-09-24/partD/`). Left in this row: part 6's box half, part 7 (the automatic leg), part 10 (PostgreSQL majors). **— 2026-09-25 night: part 6's box half shipped in v0.269.0/v0.269.1; PART 7 SHIPPED as controller v0.271.0** (the automatic leg, proven over six simulated nights on 9202 and watched through the demo boxes' first real night, `audits/DRILL-night-2026-09-25.md`). **Left: part 10 only (PostgreSQL majors, R-463).** **-- 2026-09-25 (evening): part 10 SHIPPED for docmost** (controller v0.273.0, catalog `afd3a60`, decisions 35–39; `audits/night-2026-09-26/`). What stays open: each of the other ten PostgreSQL apps needs its own two-venue proof before the gate lets its major move. | **NARROWED — the other ten PostgreSQL apps; owner: CC** | | **R-451** | **[P3-LOW] UPDATE ARC SLICE 7 — a fleet sweep: the operator can SEE, and MOVE, how far behind every box is.** Slices 1 and 2 make one box's state visible on that box's own pages. The operator has no fleet view, and **it is not derivable from what is already reported: the hub's report payload carries container name, state, CPU and memory, and NO image field at all** (spike §5, which is why Peti's box could only be recorded UNKNOWN). So this is a hub-side change as well as a controller one. Rank LOW today because the fleet is two enrolled boxes; it rises with the fleet. `architecture/09-update-architecture.md` §6, §8.4 **BOTH SIDES VERIFIED 2026-09-21, and it is cheaper than this row implies.** The controller's payload carries no image (`internal/report/types.go` L98–103) and the hub's `Store.SaveReport` (`hub/internal/store/store.go:965`) denormalises only container **counts** — but **the hub stores the raw report JSON whole**, so a new controller field lands there the day it is sent. What is missing is the denormalisation and the page, not the transport. Shape in `09` §6.2–6.3; the payload question is `09` §3b **Q7**. **-- RULED 2026-09-23 (`09` §3 decision 18):** the report carries, per compose service (database included), the installed reference, the catalog reference and the badge state. **Built later, when the fleet grows** — Q7's recommendation, confirmed. | **RULED — build deferred until the fleet grows; owner: CC** | | **R-454** | **[P3-LOW] Five `internal/web` test files have been `gofmt`-unclean for an unknown length of time, and nothing notices.** MEASURED 2026-09-02: `gofmt -l controller/internal/web/` reports `backups_split_test.go`, `claim_code_naming_test.go`, `disk_health_test.go`, `r400_debug_routes_test.go`, `recovery_test.go` — at the **baseline** commit `960d29b0612c`, i.e. not introduced by v0.233.0 (both files added that day are clean). **`go vet` does not check formatting and `controller_gates.py` has no formatting gate**, so the only thing that would ever surface this is someone running `gofmt -l` by hand, which is how it was found. **Not reformatted in the same session, deliberately** — the minimal-changes rule, and a five-file whitespace commit inside a feature release makes that release's diff unreadable. **Small, and the cost of NOT having the instrument is the row:** the count can only grow, and every future `gofmt -l` run produces noise that hides a real one. Fix is two lines: a `gofmt -l` gate in `controller_gates.py` plus one formatting commit, in that order (the gate first, so the commit is provably complete). Owner: **CC.** | **READY — rank P3-LOW; owner: CC** | | **R-457** | **[P3-LOW] A test that hardcodes a date AND asserts an age derived from it is green on the day it is written and red the next morning — one instance PROVEN, six candidate files named.** MEASURED 2026-09-03: `TestGroupD_BadgeRendersOnBothSurfaces` (shipped the previous day in v0.233.0) pinned a fixture `catalog_since: "2026-07-18"` and asserted the rendered string `"Frissítés elérhető — 46 napja"`. **The pure badge tests inject a clock; the RENDER test does not and cannot** — it goes through the production templates, which call the funcmap entry `updateBadge`, which reads `time.Now()`. The suite was green on 2026-09-02 and **FAILED on 2026-09-03** with *"the behind badge is missing"* on both surfaces, because the true answer had become 47. **Fixed by DERIVING the fixture** — `catalog_since` is computed as *today minus 46 days*, so the test asserts the real number through the real clock and cannot rot. **THE CLASS, which is why this is a row and not just a fix:** a clock-reading test that also carries a date LITERAL is a bomb with a fuse of unknown length, and the suite being green is not evidence it is defused — it is evidence the fuse has not burned down yet. **NAMED AS UNCHECKED CANDIDATES, NOT ACCUSED** — six other test files contain both a `20xx-xx-xx` literal and `time.Now()`: `internal/backup/offbox_test.go`, `internal/web/handler_export_upload_test.go`, `internal/web/r103_tier2_action_test.go`, `internal/web/dashboard_backup_card_test.go`, `internal/web/async_restore_test.go`, `internal/stacks/installed_test.go`. Mixing the two is not itself a defect — it is one only where a literal feeds an assertion evaluated against the real clock — so each needs reading, which is a sweep and not this session. **The instrument that would end the class:** run the suite once under a faked future date in CI and see what turns red. Owner: **CC.** `felhom-controller` v0.234.0 CHANGELOG | **READY — rank P3-LOW; owner: CC** | | **R-458** | **[P3-LOW] `.felhom.yml` keeps flowing to an app whose compose file is FROZEN, so a frozen app can receive a health check written for a version it is not running.** The v0.235.0 render freezes `docker-compose.yml` for a pinned app once the catalog moves past its version, but copies `.felhom.yml` **verbatim in every case** (`Syncer.copyTemplates`). **The asymmetry is deliberate and both directions were considered:** `.felhom.yml` carries no image, and it carries `catalog_since` — the single input the update badge uses to say *„Frissítés elérhető — N napja"* — so freezing it would silently withhold the one number that tells a customer they are behind, i.e. it would break slice 2 to protect slice 3. **What it costs:** the file also carries the controller-side `healthcheck:` block and resource hints, so a template updated for a newer version can hand a frozen app a probe written for software it is not running. **THE FAILURE DIRECTION IS A FALSE ALARM, NEVER DATA LOSS** — the app keeps running; at worst it renders as degraded and, if it persisted, could reach the dead-app alarm path. That is the same class as R-330's false e-mails, which is why this is a row and not a footnote. **Not fixed now, and the reason is that the cheap fix is wrong:** freezing the whole file breaks the badge, and freezing only the `healthcheck:` key means the syncer would have to parse and re-assemble a customer-facing metadata file — new surface on the one path that touches every app on every box every 15 minutes. **What would settle it:** whether any catalog `healthcheck:` has ever been changed in the same commit as an `image:` line (measurable from the catalog's own history, no box needed). If the answer is "never", the exposure is theoretical and the row can be closed by measurement instead of by code. Owner: **CC.** `architecture/09-update-architecture.md` §5.4, §8.5 **— UPDATE NIGHT 2026-09-21:** **MEASURED 2026-09-21 (update night), leg B9, and the row's risk is NARROWER than it states.** A `.felhom.yml`-only change (a health check for a path only a newer version would serve) was pushed to a FROZEN `bentopdf` — installed `v2.8.6`, catalog ahead. §5.4's asymmetry is confirmed live: the new `.felhom.yml` reached the box while the compose `image:` line stayed `v2.8.6`. **But no false alarm was produced**: ten samples over two minutes all read `state=running` with the front door at `200`. The reason is the probe's own semantics, not luck — `healthprobe.go:258-261` treats **any response** as healthy for `type: http`, and the bogus path answers 404, which is a response. **So this row's false-alarm risk exists only for `type: api` probes carrying an `expect` block**, where the status is compared; for every `type: http` template and every `type: api` without `expect`, a newer version's path is invisible to the probe. The row's actual claim — the failure direction is a false alarm, never data loss — stands and is now measured. Evidence: `audits/update-night-2026-09-21/21-B9-frozen-app-newer-felhomyml.md`. | **READY — rank P3-LOW; owner: CC** | | **R-460** | **[P3-LOW] BookStack's FILE half cannot be seeded or verified without a browser, so its upgrades can only ever be auto-proven for the DATABASE.** MEASURED 2026-09-06 while building the R-449 harness. BookStack's API needs a token that is only mintable through its web UI, and its HTTP login is unusable headlessly for a second, independent reason: `APP_URL` comes from the template as `https://${SUBDOMAIN}.${DOMAIN}`, so the app marks its session and XSRF cookies **`secure`**; curl over plain http stores neither and **every login POST returns 419 Page Expired**, which looks exactly like a wrong password. The container serves no TLS. **The database half IS provable** — the harness seeds with `php artisan bookstack:create-admin` and reads back with a DIFFERENT artisan command that must find the record, carrying its own negative control on every call. **What is unprovable is an uploaded image or attachment**, i.e. exactly the half a customer would notice. **THIS IS A FACT ABOUT THE APP, NOT A DEFECT IN THE HARNESS**, and it is recorded because Slice 6 needs to know which apps can be auto-verified and which can only be partly verified — nobody had that list before. **Deliberately NOT worked around:** planting a file in the volume would make the test pass while proving nothing, which is R-156's exact failure. **What would remove it:** a headless token route (upstream), or accepting a browser-driven step for this app alone, which DooPlex cannot run. Owner: **CC.** `audits/SPIKE-upgrade-test-2026-09-06.md` §6 **-- UPDATE NIGHT 2026-09-21:** bookstack's edge was walked again on 2026-09-21 and is again **half-proven**: the database half read back through `php artisan` with its own negative control, the file half untouched. The limitation is unchanged and is now measured on the box as well as on the harness. Two more apps joined the same class tonight for a different reason (R-624). | **READY — rank P3-LOW; owner: CC** | -| **R-462** | **[P2-MEDIUM] Widen the upgrade harness beyond three apps — and the cost is dominated by FIXTURES, not by machine time.** The R-449 harness works and is proven by a red negative control (`audits/SPIKE-upgrade-test-2026-09-06.md` §1). **Costed with this run's REAL numbers rather than an estimate:** a successful edge takes **6.4 s – 305.1 s, median 71.8 s**; a FAILING edge takes **556 s**, roughly **8×**, because a negative is only honest if it waits out the full settle window; 3 apps / 11 images cost **5.07 GB**, so 53 apps naively extrapolate to **~90 GB** and, at the median, about an hour of harness time for one edge each. **THAT EXTRAPOLATION UNDERSTATES THE REAL COST BY AN ORDER OF MAGNITUDE, and that is the point of this row.** Two of the three apps needed a bespoke non-browser seed route; one needed two attempts and a discarded approach; one (bookstack) can only ever be half-proven (R-460). **Fixture time scales with apps and does not amortise.** **The decision this row is really asking for is scope, not schedule:** all 53, or only the apps a customer would lose data from, or only apps whose catalog transition is a MAJOR. **Recommended shape, NOT a design — the operator picks:** start with the apps that carry a database, because §3 measured that the abort question only ever bites there. Owner: **VIKTOR rules on scope, CC implements.** `audits/SPIKE-upgrade-test-2026-09-06.md` §5 **ROW CORRECTED 2026-09-21: the scope is NOT open and this row said it was.** It read *"VIKTOR rules on scope"*; the operator ruled on 2026-09-13 (`09` §3 decision 6) that the upgrade test goes to **ALL** apps through the nightly rotation, explicitly *not* "database apps first". What is open is the WORK, not the scope. An ORDER inside that ruling — the 15 database services first, because that is where a wrong answer costs data rather than uptime — is costed as a drill brief in `09` §6.4: legs A–E ≈ **21–34 CC-hours** plus ~25–30 GB on a scratch host, with legs C (a PostgreSQL `pg_upgrade` rehearsal) and E (one automatic night on a throwaway) the two that unblock a decision. **-- UPDATE NIGHT 2026-09-21:** **The count moved from 3 apps to 21 EDGES ACROSS 19 APPS.** The update night walked real within-a-major upstream edges on scratch guest 9202 through the product's own guarded Update, each app seeded and read back through its OWN front door with a negative control on every readback: **14 proven, 3 failed, 4 inconclusive**. Proven: actualbudget, audiobookshelf, bookstack, docmost, grafana, home-assistant, mealie, n8n, navidrome, papra, privatebin, romm, vikunja, and nextcloud's MariaDB engine major. **Ten of the fourteen printed a verbatim migration line**, so the database really was rewritten and the data still read back. Box-side fixtures for 20 apps now exist at `audits/update-night-2026-09-21/fixtures.py`, and four (actualbudget, navidrome, audiobookshelf, vikunja) are ported into `app-catalog-felhom.eu/scripts/upgrade_fixtures.py` with seven new EDGES (U1-U7) so the same edges can be run on the harness venue **with their ABORT step**, which the box deliberately does not offer. **OWED, stated so it is not mistaken for done:** the U1-U7 harness RUNS (the code is in, the runs are not), and fixtures for the four inconclusive apps, of which two (vaultwarden, zipline) cannot be seeded at all while the catalog rightly closes their sign-up (see R-624). **-- 2026-09-23, the RomM lesson is IN THE HARNESS:** `upgrade-test.py` v2 runs every edge that read back under light load for `--soak` seconds (default 600) and reads the kernel's `oom_kill` counter host-side; a kill or restart turns `proven` into `failed`, a peak over 80 % of the limit adds `memory_tight`. **Red-proof:** romm 5.0.0 → 5.3.0 on the template AS PROMOTED (512M, four workers) — seeded, migrated, read back, and then **OOM-killed at +76 s** under four light callers, verdict `failed` (Docker's own OOMKilled read true here; restarts stayed 0, which is why the walk never saw it). Ten minutes is ample for this failure; demo-hp's first kill came at two hours only because nothing was loading it. Evidence `audits/update-rulings-2026-09-23/harness/`. **— NIGHT 2026-09-23:** the bench and the box now share ONE fixture set — the box walk's fixtures run on the bench through `upgrade_boxport.py` (ported verbatim into the catalog), plus a new wishlist fixture and fixes for opengist 1.15, komga (`/api/v2/users/me`) and nextcloud (wait for `occ status`). 14 apps / 15 edges tried; 12 proven on both venues and published with their test records (`audits/DRILL-night-2026-09-23.md` Part C). | **READY — rank P2-MEDIUM; owner: CC (scope already ruled, `09` §3 decision 6)** | -| **R-463** | **[P2-MEDIUM] The day the catalog moves `postgres:16` to `17`, ELEVEN apps are affected and the container image will NOT perform the conversion — and nothing anywhere records that.** MEASURED 2026-09-06: 11 of the 53 templates carry PostgreSQL — **8 on `postgres:16-alpine`**, 1 on `postgres:15-alpine`, plus `postgis/postgis:16-3.5-alpine` and Immich's own `postgres:16-vectorchord…` build. **A grep of the whole register for `pg_upgrade`, "postgres major" or "postgresql major" returns ZERO** (confirmed this session, and confirmed again before filing). **WHY IT IS NOT THE SAME PROBLEM AS R-459, and this is the point of the row: the two engines fail in OPPOSITE directions.** MariaDB starts anyway and skips the conversion quietly, which is why R-459 went unnoticed until a harness looked. **PostgreSQL REFUSES TO START on a datadir from an older major** — the official image performs no `pg_upgrade` and exits with a message naming both versions. So the Postgres case cannot hide; it will present as eight apps down at once, on the sync after the catalog moves. **DELIBERATELY NOT MEASURED HERE, and saying so is the scope discipline:** R-459's task was scoped to MariaDB, and measuring the Postgres analogue is its own piece of work with its own venue. **This row exists so the gap is a record rather than a sentence in an audit nobody greps.** What would settle it: one edge on the existing harness (`postgres:16-alpine` → `17-alpine`) on a scratch host, which would also exercise the `engine_state_after` field's Postgres probe end to end — it is written but has never run against a real Postgres major. Owner: **CC.** `audits/SPIKE-r459-mariadb-upgrade-2026-09-06.md` §7 **-- UPDATE NIGHT 2026-09-21:** **Measured 2026-09-21, both halves.** (a) What a household sees TODAY: the guarded Update of `postgres:16-alpine` to `17-alpine` on docmost ended **`failed` in 5.1 s**, the app stopped and held, **the pin naming 17 while `installed_images` still said 16 and nothing ran**, the data intact, and the restore the hold sentence names back in **29.1 s**. The engine's refusal line had to be REPRODUCED independently because `failAndHold` destroyed it (R-621): *FATAL: database files are incompatible with server / DETAIL: The data directory was initialized by PostgreSQL version 16, which is not compatible with this version 17.11.* The datadir was still `16` afterwards, and the same copy started under 16 holding 48 tables as the positive control. (b) The conversion **COSTED** on a real seeded 49 MB / 48-table datadir: `pg_dumpall` **2.6 s / 132 201 B**, fresh 17 plus replay **6.5 s / 48 tables restored**, the app up on 17 saying *Database connection successful*, **the seeded account read back**, total **155.9 s of which ~9 s is engine work**. `pg_upgrade` was NOT run: it needs both majors' binaries in one image and no such image exists here. Full paragraph: `audits/update-night-2026-09-21/24-Q5-postgres-conversion-costed.md`. **-- RULED 2026-09-23 (`09` §3 decision 16):** PostgreSQL majors are converted BY THE BOX as a guarded-update step — save everything from the old engine, start the new one empty, load it back, check. Each of the eleven apps is proven on the test bench before the catalog may move it; the engine-major gate stays until then. **-- 2026-09-25 (evening): docmost CONVERTED by the box** (16 → 18, controller v0.273.0; catalog `afd3a60` moved it with the conversion mark; proven on the bench and on 9202 incl. three undo cases). Measured: `postgres:18` refuses even an EMPTY volume at `/var/lib/postgresql/data` — an 18 step moves the mount. Open: the other ten, one proof each (calcom, adventurelog/postgis, claper, rallly, immich's own image, zipline, outline, paperless-ngx, tandoor, sparkyfitness on 15). **-- 2026-09-27: paperless-ngx (to 18) and tandoor (to 17) moved, each proven on the bench and on 9202 through the product's conversion (`09` §3 decision 42, `audits/version-travel-2026-09-26/B/`); with docmost that is 3 of the 11. Not moved: calcom, claper, outline, rallly, zipline (no seed route checked, or none: R-624), immich and the PostGIS family (out of scope).** **-- 2026-09-28: claper → 17 (`4a249b9`) and calcom → 18 (`037f956`, after its memory fix R-703) moved, each proven on both venues (bench LXC 9401 + box 9202 through the guarded Update), `09` decision 43; fixtures `Claper`, `Calcom`. `audits/pg-calcom-claper-2026-09-28/`.** | **NARROWED — ten apps left; owner: CC; the gate stays per app** | +| **R-462** | **[P2-MEDIUM] Widen the upgrade harness beyond three apps — and the cost is dominated by FIXTURES, not by machine time.** The R-449 harness works and is proven by a red negative control (`audits/SPIKE-upgrade-test-2026-09-06.md` §1). **Costed with this run's REAL numbers rather than an estimate:** a successful edge takes **6.4 s – 305.1 s, median 71.8 s**; a FAILING edge takes **556 s**, roughly **8×**, because a negative is only honest if it waits out the full settle window; 3 apps / 11 images cost **5.07 GB**, so 53 apps naively extrapolate to **~90 GB** and, at the median, about an hour of harness time for one edge each. **THAT EXTRAPOLATION UNDERSTATES THE REAL COST BY AN ORDER OF MAGNITUDE, and that is the point of this row.** Two of the three apps needed a bespoke non-browser seed route; one needed two attempts and a discarded approach; one (bookstack) can only ever be half-proven (R-460). **Fixture time scales with apps and does not amortise.** **The decision this row is really asking for is scope, not schedule:** all 53, or only the apps a customer would lose data from, or only apps whose catalog transition is a MAJOR. **Recommended shape, NOT a design — the operator picks:** start with the apps that carry a database, because §3 measured that the abort question only ever bites there. Owner: **VIKTOR rules on scope, CC implements.** `audits/SPIKE-upgrade-test-2026-09-06.md` §5 **ROW CORRECTED 2026-09-21: the scope is NOT open and this row said it was.** It read *"VIKTOR rules on scope"*; the operator ruled on 2026-09-13 (`09` §3 decision 6) that the upgrade test goes to **ALL** apps through the nightly rotation, explicitly *not* "database apps first". What is open is the WORK, not the scope. An ORDER inside that ruling — the 15 database services first, because that is where a wrong answer costs data rather than uptime — is costed as a drill brief in `09` §6.4: legs A–E ≈ **21–34 CC-hours** plus ~25–30 GB on a scratch host, with legs C (a PostgreSQL `pg_upgrade` rehearsal) and E (one automatic night on a throwaway) the two that unblock a decision. **-- UPDATE NIGHT 2026-09-21:** **The count moved from 3 apps to 21 EDGES ACROSS 19 APPS.** The update night walked real within-a-major upstream edges on scratch guest 9202 through the product's own guarded Update, each app seeded and read back through its OWN front door with a negative control on every readback: **14 proven, 3 failed, 4 inconclusive**. Proven: actualbudget, audiobookshelf, bookstack, docmost, grafana, home-assistant, mealie, n8n, navidrome, papra, privatebin, romm, vikunja, and nextcloud's MariaDB engine major. **Ten of the fourteen printed a verbatim migration line**, so the database really was rewritten and the data still read back. Box-side fixtures for 20 apps now exist at `audits/update-night-2026-09-21/fixtures.py`, and four (actualbudget, navidrome, audiobookshelf, vikunja) are ported into `app-catalog-felhom.eu/scripts/upgrade_fixtures.py` with seven new EDGES (U1-U7) so the same edges can be run on the harness venue **with their ABORT step**, which the box deliberately does not offer. **OWED, stated so it is not mistaken for done:** the U1-U7 harness RUNS (the code is in, the runs are not), and fixtures for the four inconclusive apps, of which two (vaultwarden, zipline) cannot be seeded at all while the catalog rightly closes their sign-up (see R-624). **-- 2026-09-23, the RomM lesson is IN THE HARNESS:** `upgrade-test.py` v2 runs every edge that read back under light load for `--soak` seconds (default 600) and reads the kernel's `oom_kill` counter host-side; a kill or restart turns `proven` into `failed`, a peak over 80 % of the limit adds `memory_tight`. **Red-proof:** romm 5.0.0 → 5.3.0 on the template AS PROMOTED (512M, four workers) — seeded, migrated, read back, and then **OOM-killed at +76 s** under four light callers, verdict `failed` (Docker's own OOMKilled read true here; restarts stayed 0, which is why the walk never saw it). Ten minutes is ample for this failure; demo-hp's first kill came at two hours only because nothing was loading it. Evidence `audits/update-rulings-2026-09-23/harness/`. **— NIGHT 2026-09-23:** the bench and the box now share ONE fixture set — the box walk's fixtures run on the bench through `upgrade_boxport.py` (ported verbatim into the catalog), plus a new wishlist fixture and fixes for opengist 1.15, komga (`/api/v2/users/me`) and nextcloud (wait for `occ status`). 14 apps / 15 edges tried; 12 proven on both venues and published with their test records (`audits/DRILL-night-2026-09-23.md` Part C). **-- 2026-09-30 (day brief): three new front-door fixtures (sparkyfitness, rallly, outline; catalog `e6f3ec2`) and five apps moved on both venues — the three PostgreSQL conversions (R-463) plus bookstack 26.05.5 → 26.09.1 and kimai apache-2.57.0 → 2.67.0 (upstream dropped the `apache-` prefix; the plain tag's digest equals `apache`'s, measured). The catalog currency and the next-apps ranking: `audits/catalog-currency-2026-09-30.md` — 25 of 53 apps behind upstream inside a major, 19 across one (morning); after the session **31 apps can update themselves at night (+ nextcloud with a whole copy)**, 32 carry a proven step, 21 have no ladder.** |**READY — rank P2-MEDIUM; owner: CC (scope already ruled, `09` §3 decision 6)** | +| **R-463** | **[P2-MEDIUM] The day the catalog moves `postgres:16` to `17`, ELEVEN apps are affected and the container image will NOT perform the conversion — and nothing anywhere records that.** MEASURED 2026-09-06: 11 of the 53 templates carry PostgreSQL — **8 on `postgres:16-alpine`**, 1 on `postgres:15-alpine`, plus `postgis/postgis:16-3.5-alpine` and Immich's own `postgres:16-vectorchord…` build. **A grep of the whole register for `pg_upgrade`, "postgres major" or "postgresql major" returns ZERO** (confirmed this session, and confirmed again before filing). **WHY IT IS NOT THE SAME PROBLEM AS R-459, and this is the point of the row: the two engines fail in OPPOSITE directions.** MariaDB starts anyway and skips the conversion quietly, which is why R-459 went unnoticed until a harness looked. **PostgreSQL REFUSES TO START on a datadir from an older major** — the official image performs no `pg_upgrade` and exits with a message naming both versions. So the Postgres case cannot hide; it will present as eight apps down at once, on the sync after the catalog moves. **DELIBERATELY NOT MEASURED HERE, and saying so is the scope discipline:** R-459's task was scoped to MariaDB, and measuring the Postgres analogue is its own piece of work with its own venue. **This row exists so the gap is a record rather than a sentence in an audit nobody greps.** What would settle it: one edge on the existing harness (`postgres:16-alpine` → `17-alpine`) on a scratch host, which would also exercise the `engine_state_after` field's Postgres probe end to end — it is written but has never run against a real Postgres major. Owner: **CC.** `audits/SPIKE-r459-mariadb-upgrade-2026-09-06.md` §7 **-- UPDATE NIGHT 2026-09-21:** **Measured 2026-09-21, both halves.** (a) What a household sees TODAY: the guarded Update of `postgres:16-alpine` to `17-alpine` on docmost ended **`failed` in 5.1 s**, the app stopped and held, **the pin naming 17 while `installed_images` still said 16 and nothing ran**, the data intact, and the restore the hold sentence names back in **29.1 s**. The engine's refusal line had to be REPRODUCED independently because `failAndHold` destroyed it (R-621): *FATAL: database files are incompatible with server / DETAIL: The data directory was initialized by PostgreSQL version 16, which is not compatible with this version 17.11.* The datadir was still `16` afterwards, and the same copy started under 16 holding 48 tables as the positive control. (b) The conversion **COSTED** on a real seeded 49 MB / 48-table datadir: `pg_dumpall` **2.6 s / 132 201 B**, fresh 17 plus replay **6.5 s / 48 tables restored**, the app up on 17 saying *Database connection successful*, **the seeded account read back**, total **155.9 s of which ~9 s is engine work**. `pg_upgrade` was NOT run: it needs both majors' binaries in one image and no such image exists here. Full paragraph: `audits/update-night-2026-09-21/24-Q5-postgres-conversion-costed.md`. **-- RULED 2026-09-23 (`09` §3 decision 16):** PostgreSQL majors are converted BY THE BOX as a guarded-update step — save everything from the old engine, start the new one empty, load it back, check. Each of the eleven apps is proven on the test bench before the catalog may move it; the engine-major gate stays until then. **-- 2026-09-25 (evening): docmost CONVERTED by the box** (16 → 18, controller v0.273.0; catalog `afd3a60` moved it with the conversion mark; proven on the bench and on 9202 incl. three undo cases). Measured: `postgres:18` refuses even an EMPTY volume at `/var/lib/postgresql/data` — an 18 step moves the mount. Open: the other ten, one proof each (calcom, adventurelog/postgis, claper, rallly, immich's own image, zipline, outline, paperless-ngx, tandoor, sparkyfitness on 15). **-- 2026-09-27: paperless-ngx (to 18) and tandoor (to 17) moved, each proven on the bench and on 9202 through the product's conversion (`09` §3 decision 42, `audits/version-travel-2026-09-26/B/`); with docmost that is 3 of the 11. Not moved: calcom, claper, outline, rallly, zipline (no seed route checked, or none: R-624), immich and the PostGIS family (out of scope).** **-- 2026-09-28: claper → 17 (`4a249b9`) and calcom → 18 (`037f956`, after its memory fix R-703) moved, each proven on both venues (bench LXC 9401 + box 9202 through the guarded Update), `09` decision 43; fixtures `Claper`, `Calcom`. `audits/pg-calcom-claper-2026-09-28/`.** **-- 2026-09-30 (the last six, by day): rallly (`25ffd89`), outline (`aeb0cd6`) and sparkyfitness (`1666572`, from 15) → 18, each proven on both venues (bench LXC 9401: 31/42/94 tables equal; box 9202 through the guarded Update: CONVERTED in 7.1/7.9/9.8 s) with one undo case each on 9202 (the load failing on `adminpack` → undone in 57.5/57.5/74.9 s, back on the old major, the seed read back); none `memory_tight`. Each app's own upstream runs 18 (decision 42's rule). STAY, by the same rule, read from upstream 2026-09-30: zipline (upstream compose `postgres:16` at v4.6.1 and v4.8.0), adventurelog (`postgis/postgis:16-3.5` at v0.13.0, the newest release), immich (upstream runs `…:14-vectorchord0.4.3-pgvectors0.2.0` — OLDER than ours; its only 18 images drop pgvecto.rs and move VectorChord to 0.5.3+, so a move would also swap an extension). Seed routes: all three through the app's own door (rallly's e-mail code READ from its own table in place of a mailbox); `09` decision 52 was not needed. `audits/pg-last-six-2026-09-30/`.** | **CLOSED 2026-09-30 — 8 of 11 moved by the box's own conversion (docmost, paperless-ngx, tandoor, claper, calcom, rallly, outline, sparkyfitness); 3 stay by `09` decision 42's rule (zipline, adventurelog, immich — upstream runs the same or an older major). A later move of any of the three needs its own two-venue proof: the engine gate enforces it per app.** | | **R-464** | **[P3-LOW] MariaDB's entrypoint prints `MariaDB upgrade not required` on an UNSUPPORTED DOWNGRADE, so that line cannot be used as a soundness signal.** MEASURED 2026-09-06. After converting a datadir to `12.3.3-MariaDB` and then starting **11.6** on it, the entrypoint logs, on every start: **`[Note] [Entrypoint]: MariaDB upgrade not required`**. Asked properly, the same engine answers **`FATAL ERROR: Version mismatch (12.3.3-MariaDB -> 11.6.2-MariaDB): Trying to downgrade from a higher to lower version is not supported!`** **The entrypoint compares the datadir's recorded version against its own and concludes there is nothing to DO. That is true, and it is not a statement that the state is sound.** **THIS IS THIS PROJECT'S MOST-REPEATED CLASS, in a new costume** — the same shape as `CLAUDE.md`'s "presence is not success" and as R-443's HTTP 200 over a crash-looping app: a reassuring sentence that answers a narrower question than the one a reader will take it for. **Why it is worth a row rather than a footnote: the obvious cheap instrument for R-459 is to grep container logs for that exact line**, and such an instrument would report "fine" for an unsupported downgrade. **The correct probe is `mariadb-upgrade --check-if-upgrade-is-needed`**, which is what `upgrade-test.py`'s `engine_state_after` now uses. **Also recorded, because it nearly produced a wrong answer here: run without credentials that command returns `ERROR 1045 … FATAL ERROR: Upgrade failed` with exit 1** — an authentication failure wearing the shape of a verdict. Owner: **CC.** `audits/SPIKE-r459-mariadb-upgrade-2026-09-06.md` §5.4 | **READY — rank P3-LOW; owner: CC** | | **R-468** | **[P3-LOW] THE GOLDEN WAIVER — goldens on a cadence, not per release (operator ruling 2026-09-13).** 25 goldens in 26 days in August, almost one per release, because `golden_currency_gate.py` trips on every release by design and the only honest ways past it were a bake or a declared `--no-verify` (thirteen by 2026-09-01, R-404/R-417). **The ruling: bake WEEKLY, and always before any drill or fresh install.** Every release still raises the FLOOR, so both demo boxes keep getting each release in ~20 s; only the golden — which protects a fresh install and nothing else — moves to a cadence. **The mechanism (built 2026-09-13):** `documentation/tests/golden-waiver. **⚠ CORRECTED THE SAME DAY (R-472): between bakes the floor does NOT carry a release — the hub holds any floor above the vouched golden (publish-train rule 1), so releases between bakes reach the demo boxes only by hand-deploy.**yml`, four lines (`issued`, `expires`, `reason`, `register_row: R-468`), read by the gate. While valid, a golden BEHIND the record makes the gate print a loud ADVISORY and exit 0; when it expires the gate is red again until someone bakes or renews. **The 14-day cap is enforced by the gate, not the runbook** — a longer, undated, unparseable, reason-less or row-less waiver is INCONCLUSIVE (exit 2), never 0 and never silently ignored. **It never covers a golden that is UNRECORDED (R-385)** — that is not a cadence choice. **A dated waiver cannot be forgotten; it just expires** — the difference from R-242's original rule, which recurred the day after it was written. Tests: `scripts/test_golden_currency_gate.py` cases 5–15 (E/F/G/H, a 15-day, absent, unparseable, bad-row and empty-reason waiver each 2; the R-421 decoy — a file saying only `expires` — 2). **This is a PRE-CUSTOMER arrangement: the first external install retires it** (delete the file in that commit). Cadence written into `RUNBOOK-manual-build.md` §4.2 and the `felhom.eu` end-of-session checklist. **Does NOT touch R-242's open half (nothing gates the VOUCH).** | **WATCHING — rank P3-LOW; owner: CC (renew ≤ 14 days or bake); retire at the first external install** | | **R-469** | **[P3-LOW] REMOVE THE ENGINE-MAJOR RULE when Slice 4 (R-448) ships — a tracked act, not a lapse.** Since 2026-09-13 `app-catalog-felhom.eu` `CLAUDE.md` rules that *until the Update button takes a verified backup as its precondition, no template may move a database-engine image across a major version* (four MariaDB, eleven PostgreSQL services), and `scripts/check-engine-major.py` (fourth row of `catalog_gates.py`, run by `.githooks/pre-push` with the push range) refuses one, naming the rule and this expiry. **Why the rule:** every `mariadb:` sidecar now carries `MARIADB_AUTO_UPGRADE=1` (R-459), so a MariaDB major move CONVERTS the customer's datadir on the next Update; PostgreSQL converts nothing and refuses to start (R-463). Either way a customer-data event with no backup in front of it. **Honest limit, not re-filed:** the gate needs a parent commit and CI fetches at `--depth 1` — the R-452 gap — so on a shallow clone the runner skips it out loud and only the hook bites. **When R-448 ships:** delete the CLAUDE.md rule, the gate's row and the gate, in one commit that cites this row; then close this. **2026-09-13 — UNBLOCKED, NOT LIFTED.** R-448 shipped in controller v0.237.0/v0.238.0 (slice 4): an update now refuses without a restorable, proven Tier-2 copy, backs up first when it is stale, takes a safety dump, and holds an app that does not come up — the precondition this rule was waiting for. **The rule stays in force until someone deliberately removes it**, which is a separate act (and is worth weighing against R-475: an app with no Tier-2 copy cannot be updated at all, so the guard does not yet cover every app a major engine move would touch). **HALF-LIFTED 2026-09-21, catalog `5ff36d098cbc`.** Slice 4 shipped 2026-09-13, so the rule's own expiry condition is met — **for MariaDB**: the four `mariadb:` sidecars have both halves they need, a verified backup in front of the Update (any tier since v0.239.0) and `MARIADB_AUTO_UPGRADE=1` whose conversion the harness WATCHED run on E3/E3b with the seeded data read back after. **PostgreSQL and MySQL stay refused** — postgres performs no `pg_upgrade` and REFUSES to start on an older major's datadir across eleven templates (R-463); a backup is a route BACK, not a conversion. The refusal text now cites R-463 instead of the shipped R-448. **R-450's second half is enforced in its place:** a MariaDB major must be the ONLY image move in its template in that commit (the bookstack `0b73e5e` shape — two migrations behind one edge). The gate now PRINTS what it allowed, by name — a lifted rule that goes quiet is a lifted rule nobody can audit. Two new decoy cases; two red-proofs, each seen to fail; 40 cases green. **What remains of this row:** the PostgreSQL half, which is R-463's to clear — see `09` §3b **Q5**. **-- NARROWED 2026-09-25 (evening), catalog `6a4a5f0`, `09` §3 decision 35:** the PostgreSQL half now passes ONE app at a time — only a template whose ladder entry for the step is proven on BOTH venues and carries `engine_conversion` (the box converts it, controller v0.273.0), as the only image move in its commit. Every other PostgreSQL app stays refused; the postgis family is judged now (it was not). CLAUDE.md rule text updated the same commit. Decoys + red-proof: `audits/night-2026-09-26/C/`. | **PARTLY CLOSED 2026-09-21 — MariaDB lifted; the PostgreSQL half stands until R-463** | @@ -710,7 +710,7 @@ class (an image `VOLUME` at an unmounted path) is still live — `immich-server` | **R-544** | **[P3-LOW] The host-delete log line says „escrow deleted: true" while the documented (and actual) effect is DEMOTION to retained custody.** MEASURED 2026-09-16 during the teardown of the fresh box: an unacknowledged delete was correctly refused 409 („has key escrow (acknowledgement missing)") and the refusal text promises the acknowledgement „moves it to retained custody"; the acknowledged delete then logged `host deleted: tester-1-33b6a9 (escrow deleted: true)`. The hub's own customer page states the truth — „host deletion only demotes custody, never destroys it… recovery-key custody is demoted to retained custody, not destroyed", with the customer delete named as „the one true purge point". **Nothing is broken; the log is.** An operator reading that line during an incident would believe a household's last key had just been destroyed, and the R-304 retention exists precisely so it is not. **Fix shape:** log what happened — `escrow custody demoted to retained (host delete)` — and keep the boolean's name out of operator-facing text. | **READY — rank P3-LOW; owner: CC (hub)** | | **R-545** | **[P3-LOW] There is no product action that un-configures an off-site target — only one that re-starts an ORPHANED repository.** FOUND 2026-09-16 while exercising R-543's paused state on the scratch guest: `POST /backup/offbox/config` configures a target and can disable it (`enabled` unchecked), but nothing removes it. `POST /backup/offbox/reset` refuses unless `OffboxOrphaned()` is true („Az offsite tároló nincs elárvult állapotban."), and it means „start a new remote backup, set the old history aside" — not „forget this destination". So a household that sets up the wrong NAS, or a box being handed to someone else, keeps the host, user, path, ssh key and minted repo password on disk with no route to clear them; a disabled target still holds its secrets in `data/offbox/`. **Why P3 and not higher:** a disabled target runs nothing and the secrets are 0600 on the box's own disk, so nothing leaks and no copy is lost. **Fix shape:** a „Távoli cél törlése" action beside the config form that clears the target and shreds `data/offbox/`, REFUSING while the hub holds a sealed package for this box (the R-241 rule — dropping the key would orphan the history that package protects). Teardown for this session's proof had to clear it out-of-band for exactly this reason, which is the measurement. | **READY — rank P3-LOW; owner: CC** | | **R-547** | **[P3-LOW] A disk that fills and empties between sweeps is never mentioned to anyone: `disk_critical` is defined at ≥95 % used, but the fill-watch runs once a day.** MEASURED 2026-09-17 (chaos night) on a fresh box (`tester-1-022354`, controller 0.245.0): the customer guest’s root filesystem was held at **96 % for ten minutes** (29 G used, 1.5 G free) and **no alarm of any kind fired** — checked twice, once by the round’s own runner and once independently after the fill was released. Cause, established from the ladder BEFORE the round rather than after: `fillwatch` runs **daily at 03:30** plus once ~90 s after a controller start, so a ten-minute window contains no check unless a restart lands inside it. The timing here was almost comic — the controller restarted at 21:28 after the previous round’s power cut, so its one opportunistic check ran about **twenty seconds before** the disk filled. Meanwhile all twelve apps kept serving and the background household loop logged 12 operations with 0 failures, so nothing else would have hinted at it either. **This is the ladder working as designed, not a missed alarm** — the fill-watch is a daily sweep, not a monitor. It is filed because the honest answer to „would the household be told their disk is full?” is **no, unless the controller happens to restart while it is full**, and that answer is not written down anywhere. **Fix shape (one of):** sample the fill more often than daily (a cheap `statfs` on the 5-minute health pass would do it); or say plainly in `08-alarm-ladder.md` that a transient full disk is out of scope. Evidence: `audits/evidence-chaos-night-2026-09-17/round-3.txt`. | **READY — rank P3-LOW; owner: CC** | -| **R-548** | **[P3-LOW] The whole-guest backup’s LOCAL tier cannot fit on a small-system-disk box, and will retry on that tier for ever.** MEASURED 2026-09-17 (chaos night) on `tester-1-022354`: a whole-guest backup wrote a **~29 GB source** (`mp0` = `local-lvm:vm-9201-disk-1`, 70 G provisioned, 40.58 % used, `backup=1`) into `pve-root`, which on a 32 GB system disk is **14 GB total with ~4.9 GB free**. Two samples thirty seconds apart showed the archive growing ~497 MB while free space fell ~475 MB — **~16 MB/s, i.e. under four minutes to a full `/`** on the nested PVE. **The product’s behaviour is correct and legible throughout:** it failed the tier and said which one — `whole_guest_backup_failed` (error, operator-only): „Whole-guest backup FAILED on the local tier — retrying with backoff (next attempt in 15m0s)” — its status surface agreed (`target_id:"local"`, `success:false`, `size_bytes:0`), and the **off-site tier then ran from the same snapshot and succeeded in ~8½ minutes, encrypted to ep0, consuming no local disk at all**. So the data still left the house. What is filed is the loop: on a box shaped like this the local tier can **never** succeed, and it keeps retrying on a backoff for ever, burning I/O and risking `/` each time. **Honest caveat:** the 32 GB system disk is this drill’s fixture choice, so the row is conditional on disk size — but nothing in the product checks whether the local target could ever hold the source before trying. **Fix shape:** compare the source size against the target’s free space before starting the local tier and skip it with a clear reason, rather than discovering it at ~16 MB/s. Evidence: `audits/evidence-chaos-night-2026-09-17/round-6.txt`. | **READY — rank P3-LOW; owner: CC** | +| **R-548** | **[P3-LOW] The whole-guest backup’s LOCAL tier cannot fit on a small-system-disk box, and will retry on that tier for ever.** MEASURED 2026-09-17 (chaos night) on `tester-1-022354`: a whole-guest backup wrote a **~29 GB source** (`mp0` = `local-lvm:vm-9201-disk-1`, 70 G provisioned, 40.58 % used, `backup=1`) into `pve-root`, which on a 32 GB system disk is **14 GB total with ~4.9 GB free**. Two samples thirty seconds apart showed the archive growing ~497 MB while free space fell ~475 MB — **~16 MB/s, i.e. under four minutes to a full `/`** on the nested PVE. **The product’s behaviour is correct and legible throughout:** it failed the tier and said which one — `whole_guest_backup_failed` (error, operator-only): „Whole-guest backup FAILED on the local tier — retrying with backoff (next attempt in 15m0s)” — its status surface agreed (`target_id:"local"`, `success:false`, `size_bytes:0`), and the **off-site tier then ran from the same snapshot and succeeded in ~8½ minutes, encrypted to ep0, consuming no local disk at all**. So the data still left the house. What is filed is the loop: on a box shaped like this the local tier can **never** succeed, and it keeps retrying on a backoff for ever, burning I/O and risking `/` each time. **Honest caveat:** the 32 GB system disk is this drill’s fixture choice, so the row is conditional on disk size — but nothing in the product checks whether the local target could ever hold the source before trying. **Fix shape:** compare the source size against the target’s free space before starting the local tier and skip it with a clear reason, rather than discovering it at ~16 MB/s. Evidence: `audits/evidence-chaos-night-2026-09-17/round-6.txt`. **-- 2026-09-30, the class on a real box: demo-hp's whole-guest LOCAL tier was refused by the space preflight (R-685) 10 times since 2026-09-27** („local has 12.1 GiB free; the last archive of guest 9201 was 8.9 GiB, so a new one needs about 12.1 GiB") — its newest local archive was 2026-09-29 04:42, 30 h old at the day's read (the weekly PBS tier, last 2026-09-24, is its whole copy meanwhile). The refusal is correct and named; what is missing is that nothing gives the box the room back (the host's `local` holds the 8.9 GiB archive of the only guest plus templates on a 39 GB root). `audits/pg-last-six-2026-09-30/C/`. |**READY — rank P3-LOW; owner: CC** | | **R-551** | **[P3-LOW] No Tier-0 box can put the escrow ceremony in the state R-546 fixes — paused AND connected to its agent — so the readiness branches are proven only by tests.** FOUND 2026-09-17 while live-validating controller v0.246.0 (R-546). The branches (reminder bar held back while the agent's preflight is not `ok`; the waiting card on `/backup/escrow`; `POST /api/escrow/start` refused 409 before staging) need a box whose off-site tier is configured, whose escrow is NOT done, and whose controller reaches the agent. Measured on demo-hp: **9201** reaches the agent but is escrowed (the bar is off by design there; making it paused would be hand-set state on the standing demo box, and a real ceremony would supersede its live escrow — the hub keeps ONE `host_escrow` row per host, `host_id PRIMARY KEY`); **9202** is paused-capable but has **no local-API token at all** (its `bootstrap.json` holds only `schema`, `customer.id`, `disposition`), so its readiness is always UNKNOWN and the bar always shows. The fresh-bind window where this state occurs naturally (~17 min, chaos night Phase 0) needs a fresh install. **What IS proven:** five tests driving the real pages and handler through `ServeHTTP` with a fake agent, each red-proofed; and chaos night measured live that the agent's preflight is red for ~17 minutes after a bind and turns green by itself (`evidence-chaos-night-2026-09-17/phase0-escrow-*`). **Fix shape:** give the scratch guest a local-API token through the agent's own provisioning path, or walk R-546 on the next fresh install. | **READY - rank P3-LOW; owner: CC** | | **R-552** | **[P3-LOW] An interrupted-restore notice for an app that is then REMOVED stays on the restore page for ever.** FOUND 2026-09-17 by CC reviewing its own controller v0.246.0 (R-550) during live validation. The per-app notice (`Manager.opInterrupted`, persisted in `restore-status.json`) is cleared in exactly one place — `BeginRestoreOp` for that app (`internal/backup/opstatus.go`) — and `removeStack` (`internal/api/router.go`) never touches the restore record. So a household that answers „A visszaállítás megszakadt … indítsd el újra" by REMOVING the app instead of restoring it keeps a „Megszakadt visszaállítás" card about an app that no longer exists. Measured shape, not hypothetical: on 9201 the notice cleared only when homebox was restored again (08:54:50Z, card count 0) — the teardown deliberately took that path before removing it. **Fix shape:** `removeStack` clears the app's notice (a `ClearInterruptedRestore(stack)` beside the existing update-hold clear, R-491's precedent), with a wiring test. Not fixed in v0.246.0: found after the release was built; one release per repo per session. | **READY - rank P3-LOW; owner: CC** | | **R-554** | **[P3-LOW] Delete the first-boot setup wizard — obsolete by design, still reachable.** OPERATOR DECISION 2026-09-17 (localisation starter, decision 4: „out of scope, obsolete"). `02-controller-module-map.md` L56 calls `internal/setup/` obsolete; `cmd/controller/main.go` L322 still enters it when `setup.NeedsSetup(cfg)` — `customer.id` empty after bootstrap ingestion, or a `.needs-setup` marker (`internal/setup/setup.go` L17-25). Ingestion leaves `customer.id` empty on a missing/invalid `bootstrap.json`, a failed hub pull, or a failed merge/write/reload (`internal/bootstrap/bootstrap.go` L109-163) — so a box whose first boot cannot reach the hub shows a household an 8-page wizard (95 Hungarian strings, its own template set and CSRF). **Fix shape:** decide what such a box shows instead (a single „cannot reach Felhom yet, retrying" page — needs no decision beyond copy), then delete `internal/setup/` and `runSetupMode`; red-proof that a failed ingestion renders the waiting page, not a 404. **Check first** whether any drill/golden path still relies on `.needs-setup`. | **READY - rank P3-LOW; owner: CC** | @@ -788,7 +788,7 @@ class (an image `VOLUME` at an unmounted path) is still live — `immich-server` | **R-621** | **[P2-MEDIUM] A held update DESTROYS the evidence of why it failed: `failAndHold` runs `compose down`, the failing containers are removed, and their output is gone before anyone — household, operator or the next session — can read it.** MEASURED 2026-09-21 on guest 9202 on a REAL upstream edge: `adventurelog v0.12.1 → v0.13.0`. The new backend applied **nine Django migrations successfully** and then never listened; the update held after the full 5-minute health wait. **`Manager.failAndHold` (`stacks/update.go:723`) calls `updateCompose(dir, env, "down")`**, which removes the containers rather than stopping them, and nothing captures their logs first. Within seconds the box's own log recorded `Logs result for adventurelog: 0 bytes returned (empty)` and `docker ps -a` held nothing at all. **What survives is the WHAT and not the WHY:** the controller line `update adventurelog FAILED after the new version was started: not healthy: not healthy within 5m0s (last: state unhealthy)` and the household's sentence, both of which say the app did not come up and neither of which says the migrations ran and the server then failed to bind. **This is R-320 ("evidence off the machine before the teardown") as a PRODUCT behaviour rather than a session habit** — the teardown here is the product's own, it is correct to perform (a half-started new version must not keep running), and it happens before anyone can look. **Why it matters beyond a drill:** the hold sentence sends the household to a restore, and after the restore the only remaining question is *should I press Update again?* — which nobody can answer, because the one artefact that would say so no longer exists. It also makes every future held update unreportable to an upstream project. **Fix shape:** capture `compose logs --no-color --tail N` into the stack directory (beside `applied-compose.yml`, which already travels with the stack) IMMEDIATELY before the `down`, and surface it on the app page's hold panel or at least through the existing `/api/stacks//logs` fallback. Bounded size, written once per hold. A test that holds an app and asserts the captured file is non-empty — it fails today. Evidence: `audits/update-night-2026-09-21/apps/adventurelog/why-it-failed.txt`, `state-after-hold.txt`. **FIXED in v0.262.0.** `failAndHold` now writes each service's log into `/hold-logs//compose-logs.txt` (`compose logs --no-color --tail 400`) **before** the `down` that destroys them, best-effort by design: a hold must never fail because its evidence could not be written. This is what `adventurelog` cost — nine migrations ran, the app never bound its port, and the only log that could have said why was gone before anyone looked. | **CLOSED 2026-09-22 — v0.262.0: the hold keeps the app's own log before stopping it** | | **R-622** | **[P2-MEDIUM] `adventurelog v0.13.0` migrates the customer's database and then does not serve — the edge must NOT be promoted, and it is the first real-catalog candidate this project has measured as unsafe.** MEASURED 2026-09-21 on guest 9202 through the product's own guarded Update. `v0.12.1 → v0.13.0` (backend AND frontend together, PostGIS held constant). The backend applied **nine migrations, every one `... OK`** — `adventures.0072_trail_wanderer_author_fields` through `integrations.0009_alter_endurainintegration_auth_method`, plus `billing.0001_initial` — and then the container's own healthcheck failed with `URLError: [Errno 111] Connection refused` on five consecutive checks. The app never bound its port. The update held honestly after the full 5-minute wait. **THE PRODUCT DID EVERYTHING RIGHT AND THAT IS HALF THE FINDING:** the precondition found a Tier-1 copy one minute old, the safety dump was written, the pin advanced BEFORE the pull, the health wait was not short-circuited, the app was stopped rather than left half-running, and the hold sentence named the tier, the date and what the copy holds — „saját meghajtó, 2026-09-21 20:47 — ez a másolat a beállításokat, az adatbázist és az adatköteteket tartalmazza." **This is exactly the case `09` §4 exists for:** the migration RAN, so there is no undo, only a restore — and the restore is the thing slice 4 made sure existed first. **What it needs:** adventurelog stays OFF the promotion list; the cause is not diagnosed here (R-621 is why); and before it is ever promoted the edge should be re-run on the harness with its ABORT step, since an app that migrates and then refuses is the shape most likely to refuse the old image too. Evidence: `audits/update-night-2026-09-21/apps/adventurelog/`. | **READY — rank P2-MEDIUM; owner: CC (catalog); NOT a Felhom defect — an upstream edge that fails** | | **R-623** | **[P3-LOW] The unattended-update caller turned every SUCCESS into a `timeout`, and then refused to press that app again — the instrument, not the box.** FOUND 2026-09-21 (update night) by reading `unattended-caller.py` before relying on it for the Q4 hold measurement. Its `call()` returns the API **envelope** — `{"ok": true, "data": {…}}` — and `follow()` read `update_phase` and `updating` **off the envelope**, where neither exists. Both were therefore always `None`; the end test `not updating and phase in ("done","failed")` could never fire; every followed update ran the full **900-second** timeout and was recorded `timeout`, which the caller treats as terminal and adds to `never_again`. `main()` unwraps `data` for the stack LIST, which is exactly why the within-a-major half of that night worked and this half did not. **The 2026-09-21 run did not catch it because the only pass that reached `follow()` was Scenario F, whose log was lost to a buffering `tail`** — the run's own honestly-recorded instrumentation gap turns out to have hidden a second one underneath it. **This is the R-607 class in the evidence layer rather than the product layer: an instrument that can report a success as a timeout is not a measurement**, and worse, it is a measurement that says the box behaved badly when the box behaved well. **FIXED in the same file 2026-09-21** (unwrap `data`, with the reason written into the docstring so the next reader does not re-derive it), and the fixed caller is what produced tonight's unattended-hold leg. **What it does NOT invalidate:** the G-b no-retry proof, which is entirely in the refusal path and never reached `follow()`. **What it DOES qualify:** any future reading of that night's Scenario F timing — the "51 s – 1 m 26 s" figures come from the ATTENDED scenarios 04/05/07, not from the caller. | **CLOSED 2026-09-21 — fixed in `audits/update-arc-gaps-2026-09-21/unattended-caller.py`** | -| **R-624** | **[P3-LOW] Three of the catalog's apps cannot be seeded by ANY headless route, and for two of them that is a deliberate security decision — so the upgrade harness has a permanent ceiling nobody has written down.** FOUND 2026-09-21 while widening R-462 from 3 apps to . **`vaultwarden` and `zipline` close self-registration ON PURPOSE** — vaultwarden by `SIGNUPS_ALLOWED=false` (R-512, *„a stranger who guesses vault. must not be able to register"*), zipline by answering `E1037: User registration is disabled` — and neither ships a CLI that could make an account instead. So there is no route to a first account without the admin secret, and **that is correct**: the harness must not be the reason a customer-facing app accepts strangers. **`gitea` is a different and fixable case:** the template sets no `INSTALL_LOCK`, so a fresh instance sits in its web-installer state and `gitea admin user create` refuses (`MustInstalled() [F] Unable to load config file for a installed Gitea instance`); POSTing the installer form first would work and was simply not written tonight. **Why this is a row rather than three notes:** `09` §3 decision 6 says the upgrade test goes to **all** apps, and R-462 is costed as if every app is reachable given enough fixture work. It is not. There is a class — *apps whose only account-creating route the catalog deliberately closes* — for which the honest maximum is `inconclusive` unless the harness is given the app's admin secret at deploy time, which is a decision nobody has taken. **Needs:** the class named in R-462's scope so the remaining count is honest; a decision on whether the harness may hold an app's admin secret (it already holds the ones IT generates — see R-619); and, separately and cheaply, a gitea installer-form fixture. Evidence: `audits/update-night-2026-09-21/apps/{vaultwarden,zipline,gitea}/verdict.json`. **— NIGHT 2026-09-23:** `gitea` stayed inconclusive on both venues (its installer); `vaultwarden`/`zipline` not attempted (closed sign-up, by design); `code-server`, `outline`, `rallly` have no front-door seed route (listed, not moved); `bentopdf`, `glance`, `crafty-controller`, `wger`, `wanderer` (meilisearch) and `uptime-kuma` have no fixture tonight (listed, not moved). | **READY — rank P3-LOW; owner: CC (catalog harness)** | +| **R-624** | **[P3-LOW] Three of the catalog's apps cannot be seeded by ANY headless route, and for two of them that is a deliberate security decision — so the upgrade harness has a permanent ceiling nobody has written down.** FOUND 2026-09-21 while widening R-462 from 3 apps to . **`vaultwarden` and `zipline` close self-registration ON PURPOSE** — vaultwarden by `SIGNUPS_ALLOWED=false` (R-512, *„a stranger who guesses vault. must not be able to register"*), zipline by answering `E1037: User registration is disabled` — and neither ships a CLI that could make an account instead. So there is no route to a first account without the admin secret, and **that is correct**: the harness must not be the reason a customer-facing app accepts strangers. **`gitea` is a different and fixable case:** the template sets no `INSTALL_LOCK`, so a fresh instance sits in its web-installer state and `gitea admin user create` refuses (`MustInstalled() [F] Unable to load config file for a installed Gitea instance`); POSTing the installer form first would work and was simply not written tonight. **Why this is a row rather than three notes:** `09` §3 decision 6 says the upgrade test goes to **all** apps, and R-462 is costed as if every app is reachable given enough fixture work. It is not. There is a class — *apps whose only account-creating route the catalog deliberately closes* — for which the honest maximum is `inconclusive` unless the harness is given the app's admin secret at deploy time, which is a decision nobody has taken. **Needs:** the class named in R-462's scope so the remaining count is honest; a decision on whether the harness may hold an app's admin secret (it already holds the ones IT generates — see R-619); and, separately and cheaply, a gitea installer-form fixture. Evidence: `audits/update-night-2026-09-21/apps/{vaultwarden,zipline,gitea}/verdict.json`. **— NIGHT 2026-09-23:** `gitea` stayed inconclusive on both venues (its installer); `vaultwarden`/`zipline` not attempted (closed sign-up, by design); `code-server`, `outline`, `rallly` have no front-door seed route (listed, not moved); `bentopdf`, `glance`, `crafty-controller`, `wger`, `wanderer` (meilisearch) and `uptime-kuma` have no fixture tonight (listed, not moved). **-- 2026-09-30: the ceiling was WRONG for three of the six named apps.** outline has a front-door first-run route (`POST /api/installation.create` — its self-hosted setup, refused once a team exists), rallly signs up through its own better-auth API with the e-mail code read from its own table in place of a mailbox, and zipline 4's first-run route is `POST /api/setup` (the fixture had tried `/api/auth/register` and `/api/auth/setup`, which are not it). Fixtures for outline and rallly are in `upgrade_fixtures_box.py` and both apps moved on both venues; zipline's fixture now tries `/api/setup` first (measured on the bench: a SUPERADMIN made, the login works). **What remains in the class:** vaultwarden (closed sign-up by design, no CLI), code-server (a browser IDE). `audits/pg-last-six-2026-09-30/`. |**READY — rank P3-LOW; owner: CC (catalog harness)** | | **R-628** | **[P2-MEDIUM] An empty search of a mailbox I do not control was turned into a claim about what a THIRD PARTY had done, and it went into the register as fact.** FOUND 2026-09-22; the operator caught it within minutes by producing the thread. The `due_checks_gate` fired R-433 (*have Hetzner answered?*). Two searches of the felhom catch-all came back empty, and the emptiness was written into R-433 as **"Hetzner has not answered"** and **"there is no evidence the tickets were ever opened"**. Both were false: ticket **#2026090103040671** had been opened and answered. **THE PRECISE FAULT IS THE INFERENCE, NOT THE QUERY — and that distinction is the whole value of this row.** Re-run afterwards WITH a positive control: `from:monitoring@felhom.eu` returns **201 threads**, `in:anywhere … includeTrash` reaches SENT, TRASH and mail back to January — **the instrument works.** And the exact ticket number, the exact subject `Storage Box issue`, and `from:hetzner` each still return **nothing**. So the literal finding — *this correspondence is not in this mailbox* — was CORRECT. What was invented was the step from there to *Hetzner has not answered* and *the tickets were never opened*. **A mailbox I can read is not the only place a reply can be**, and the operator's own account is exactly where a support ticket he opened would land. An absent record in ONE place can never answer a question about what SOMEONE ELSE did. **This is R-96 rule 3 in a new surface, one step further out than R-607**: there the instrument reported a stale value as current; here a correct observation was promoted to a conclusion it could not carry. **It is sharper still because the same session, the night before, gave every fixture a negative control and every gate a red-proof — and then reached for a search with neither.** **THE RULE, in one line:** *an empty search may be reported as "absent from the place I looked", never as "it did not happen" — and only after a control query that MUST hit has been seen to hit.* **Done:** the rule is written into the Gmail-access memory, where the next session meets it before it searches rather than after. | **CLOSED 2026-09-22 — rule recorded; R-433 corrected with the real answers** | | **R-627** | **[P2-MEDIUM] Nothing checked that the register is a well-formed table, so an append that ate two rows' state cells went unnoticed until a person read the file — and one row had been broken the same way for 45 days.** FOUND 2026-09-22. The 2026-09-21 update night appended measured results to eight rows with a regex that matched each row's trailing state cell; on **R-446** and **R-458** it consumed the cell and did not restore it, the cell reappeared as a stray FOURTH cell on a DUPLICATED copy of **R-626** and **R-625**, and a blank line was left between each pair. The register then reported **317 rows for 315 findings**, two rows carried no state at all, and two findings existed twice with contradictory state cells. **Nothing caught it:** `one_register_gate.py` compares this file against ROADMAP and `closed_register_gate.py` forbids an id in BOTH files — neither asks whether the file is a well-formed table, and neither notices an id duplicated WITHIN it. **THE RED-PROOF THEN FOUND AN OLDER INSTANCE NOBODY HAD SEEN: R-254 lost its state cell on 2026-08-08 (commit `59527d0`) and had rendered without a State column for 45 days.** **Closed the same day:** `scripts/register_shape_gate.py`, registered in `repo_gates.py` as gate 14 and reached by the pre-push hook, refusing a row that does not end with `|` (an eaten state cell), a duplicated id, or a blank line splitting the table; four decoys in `test_gate_decoys.py` — three convicting on the exact damage shapes and one asserting a healthy register still passes. **TWO THINGS THE RED-PROOF CORRECTED IN THE GATE ITSELF, kept because they are the finding's real content:** a first draft counted CELLS and convicted **125 innocent rows** — register cells carry literal `|` inside prose and shell snippets (`owner: CC | …`), so a row cannot be split on `|`, and a count that cannot be computed is not a check; and it skipped malformed rows before counting ids, reporting **5 duplicates where there were 2**. **Repaired:** both state cells restored from the stray cells that carried them, the two duplicate rows deleted, R-254's verdict sentence given its cell back, and **15 blank lines that split the register into 12 separate markdown tables** removed — every row's text byte-identical afterwards, proven by diff. **And the gate immediately earned itself:** the very next row inserted in this session (R-628) left a blank line behind and the gate refused it. | **CLOSED 2026-09-22 — gate 14, four decoys, register repaired 317→315** | | **R-629** | **[P2-MEDIUM] The drill catalog sent the operator 47 CI-failure alarms in one night, and the drill method that created it did not mention CI at all.** FOUND 2026-09-22 while checking a different mailbox question — which is the only reason it was found. `admin/app-catalog-drill` was created on 2026-09-21 by `POST /api/v1/repos/migrate` from the live catalog, and a migrated repo inherits `has_actions: true`. Every drill push therefore ran the catalog's CI workflow, which failed immediately (the drill repo carries the workflow but the run has no meaningful gate context), and **each failure mailed `admin@felhom.eu`**: *"[felhom CI] gates FAILED in admin/app-catalog-drill"*. **47 runs, 47 alarms, all overnight, all unread and flagged IMPORTANT.** **WHY THIS MATTERS MORE THAN THE NOISE:** that mailbox is the operator's alarm channel, and R-168 made CI mail the thing that notices a bypassed gate. A night of throwaway failures from a repo nobody must ever act on trains the reader to skim exactly the sender that must never be skimmed — and it did it on the night the same mailbox was also carrying real `offsite_snapshots_dropped` and `offsite_proof_empty` alarms. **The drill method wrote down the fences it needed** — private repo, no customer box may follow it, reset at teardown — **and said nothing about CI, because nobody had run a drill repo through a CI-enabled Gitea before.** **FIXED 2026-09-22:** `has_actions` set to **false** on the drill repo (verified by re-reading the repo: `has_actions: False, private: True`), and `09` §6.5 now carries it as a step of creating a drill repo rather than as a thing to notice afterwards. **What is NOT done:** the 47 mails are still in the operator's inbox, unread — deleting another person's mail is not mine to do, and they are named here so they can be cleared in one search: `subject:"gates FAILED in admin/app-catalog-drill"`. | **CLOSED 2026-09-22 — actions disabled, method updated; the 47 mails are the operator's to clear** | @@ -806,7 +806,7 @@ class (an image `VOLUME` at an unmounted path) is still live — `immich-server` | **R-676** | **[P3-LOW] Watch: immich's first start restarted 12 times — decision 28's crash-loop stop (6 in 10 min) would stop it.** From the 2026-09-17 chaos night (DB connection dropped during the first-start geocoding import on a 6 GB guest; it did not recover that night). No healthy app in any drill evidence restarts on a first start (1831 samples, 40 live containers), so the threshold stands; this row exists so the first immich install under v0.269.x is watched. `audits/night-2026-09-24/A3/40-first-start-restarts.txt` **2026-09-25 night (read from source, v0.271.0): a DEPLOY's first start is NOT covered by decision 28's suppression** — `Deploying` clears when `compose up -d` returns (`deploy.go` "Clear deploying flag"), and `ObserveUnhealthy` then samples the app; an automatic update's step, verify and undo ARE covered (`Updating`, pinned by `TestD28_NoCrashLoopStopDuringAnAutomaticStep`). So a first start that restarts ≥ 6 times in 10 min is stopped — which R-676 already accepts for a broken first start; a healthy slow first start would be stopped too. | **OPEN — P3; owner: CC (watch)** | | **R-682** | **[P3-LOW] A Remove interrupted by a controller kill leaves the app half-removed: containers gone, the app still listed as installed (and held).** MEASURED 2026-09-24 on 9202 (chaos round 9): the kill 2 s after the Remove press answered the household `502 Bad Gateway`; after the restart `chaoscrash` read deployed, stopped, `unhealthy_stop`, with NO container left. Pressing Remove again completed it cleanly (200, only the catalog template left). Recoverable by the household's own second press; nothing tells them to press it. **Fix direction:** the remove journals its intent and finishes (or says it was interrupted) at boot, as the update does. `audits/night-2026-09-24/E/round-09*.json`, `E/round-09b-remove-again.txt` | **READY — P3; owner: CC (controller)** | | **R-683** | **[P3-LOW] Watch: after a power cut during an update's health check, the hold named an HOUR-OLD second-drive copy, not the one the update's own backup should have just made.** 2026-09-24 chaos round 3 (nextcloud, `backup_max_age: 1m`): no `backing-up` phase was seen and the hold named Tier 2 at 13:04 for an update pressed at 14:04; the pre-cut controller log was lost with the container (the runner now saves it at arm time — R-320). Round 11, the same action without a power cut, named a fresh 14:34 copy and logged the Tier-2 copy. The sentence was TRUE (it named the copy it offered); the question is why the update did not back up first. Not reproduced; watch the next power-cut drill. `audits/night-2026-09-24/E/round-03*.json`, `E/round-11-controller-pre.log` | **OPEN — P3; owner: CC (watch)** | -| **R-687** | **[P3-LOW] Part 7's live proof has four gaps a scratch box cannot close, and one observability gap.** (1) **W+5h reached with steps left** is proven by unit test only (`TestLeg_NoStepAtOrAfterW5h`) — the leg starts at W+105m and would need a 3-hour leg live; (2) **the off-site leg FAILING** before the update leg: 9202 has no off-site tier, so only the "no target" path ran live — failure and panic are `TestChainUpdateLeg_EveryPath`; (3) **a `files_may_change` step WITHOUT a whole copy**: both drill apps given the mark (wishlist, navidrome, romm) turned out whole on 9202 by the backup side's truth table (why, per app, is not logged — see the observability gap), so only "with a copy" ran live; (4) **the full-system gate waiting** cannot run on 9202 (no agent), and **did not occur on the demo boxes' real night either** (2026-09-25: both legs ended by 04:19, before the gate opened at 04:30, and no whole-box backup was due on either box) — unit + red-proof only (`TestD20_GateWaitsForTheLeg`). **Also cosmetic:** a leg with no steps reports `"steps": null` to the hub, not `[]`. **Observability:** when the leg TAKES a `files_may_change` step it does not log which whole copy allowed it (only the skip says why). `audits/night-2026-09-25/C/` **-- NARROWED 2026-09-25 (controller v0.273.0):** the cosmetic `"steps": null` → `[]` and the taken `files_may_change` step's missing log line are FIXED (red-proofed, `audits/night-2026-09-26/F/`). Items (1)–(4) stay; (4) did not occur on 2026-09-25 either (demo-felhom's whole-box backup ran at 07:29, three hours after its leg; demo-hp had none due). **-- 2026-09-28 (night 27/28):** (4) did not occur again — on demo-hp the leg ended 04:23:54 and the whole-guest backup began 04:37:06, after the gate opened at 04:30; demo-felhom's backup ran at 07:36 (`audits/evidence-golden-0276-2026-09-28/phaseD2-night-read.txt`). | **OPEN — P3, gaps (1)–(4) only; owner: CC** | +| **R-687** | **[P3-LOW] Part 7's live proof has four gaps a scratch box cannot close, and one observability gap.** (1) **W+5h reached with steps left** is proven by unit test only (`TestLeg_NoStepAtOrAfterW5h`) — the leg starts at W+105m and would need a 3-hour leg live; (2) **the off-site leg FAILING** before the update leg: 9202 has no off-site tier, so only the "no target" path ran live — failure and panic are `TestChainUpdateLeg_EveryPath`; (3) **a `files_may_change` step WITHOUT a whole copy**: both drill apps given the mark (wishlist, navidrome, romm) turned out whole on 9202 by the backup side's truth table (why, per app, is not logged — see the observability gap), so only "with a copy" ran live; (4) **the full-system gate waiting** cannot run on 9202 (no agent), and **did not occur on the demo boxes' real night either** (2026-09-25: both legs ended by 04:19, before the gate opened at 04:30, and no whole-box backup was due on either box) — unit + red-proof only (`TestD20_GateWaitsForTheLeg`). **Also cosmetic:** a leg with no steps reports `"steps": null` to the hub, not `[]`. **Observability:** when the leg TAKES a `files_may_change` step it does not log which whole copy allowed it (only the skip says why). `audits/night-2026-09-25/C/` **-- NARROWED 2026-09-25 (controller v0.273.0):** the cosmetic `"steps": null` → `[]` and the taken `files_may_change` step's missing log line are FIXED (red-proofed, `audits/night-2026-09-26/F/`). Items (1)–(4) stay; (4) did not occur on 2026-09-25 either (demo-felhom's whole-box backup ran at 07:29, three hours after its leg; demo-hp had none due). **-- 2026-09-28 (night 27/28):** (4) did not occur again — on demo-hp the leg ended 04:23:54 and the whole-guest backup began 04:37:06, after the gate opened at 04:30; demo-felhom's backup ran at 07:36 (`audits/evidence-golden-0276-2026-09-28/phaseD2-night-read.txt`). **-- 2026-09-30 (by day, demo-hp 9201): item (4) PROVEN LIVE.** The night chain pressed by hand, the window moved to W = now − 2h05m the moment the leg started, `quiesce.poll_interval` 1m: `[quiesce] full-system backup due and inside its window, but the automatic update leg is running … deferring` at 11:35:11 and 11:36:11 UTC while bookstack (55.1 s) and kimai (75.1 s) stepped; the leg's end line at 11:36:29; the backup quiesced at 11:37:11 (the first poll after), job done 11:47:19, the agent's `backup: completed` 9.98 GB. Config and window put back and read back (`audits/pg-last-six-2026-09-30/C/`). **Found, cosmetic, manual chain only:** the deferral names the moved window's W+5h (16:29) while the manual leg's own deadline was its start + the leg length (16:49). | **OPEN — P3, gaps (1)–(3) + the manual-chain deferral text; item (4) proven live 2026-09-30; owner: CC** | | **R-688** | **[P3-LOW] The customer delete says it removes the tunnel and zone, but no leg of it calls Cloudflare.** The dialog's acknowledgement reads "the customer will be RESET — offsite repo DESTROYED, PBS revoked, tunnel/zone removed" (`hub/internal/web/customer_delete.go` `deleteCascadeAcks`), while `commitCustomerReset` has legs for Hetzner, PBS, claim, descriptor and DB only. Seen 2026-09-25 retiring `peti-felhom`, whose config carried a Cloudflare tunnel token and API token (`sajatfelhom.hu`): the tokens went with the record; any tunnel or DNS record on Cloudflare's side was neither listed nor removed. **Fix direction:** either a Cloudflare leg (tunnel + DNS by the customer's ids), or the dialog stops promising it and lists what to remove by hand. `audits/RETIRE-peti-2026-09-25.md` **-- HALF DONE 2026-09-25 (hub v0.125.0):** the dialog no longer promises a Cloudflare removal; the preview lists what the operator removes by hand, by domain (the tunnel, the DNS records), never the token — proven live on the hub (`audits/night-2026-09-26/F/`). The Cloudflare leg itself is NOT built. | **NARROWED — the Cloudflare leg only; owner: operator (decide if it is wanted) / CC (build)** | | **R-691** | **[P3-LOW] Kept data (09 §3 decision 36): two gaps of the first build.** (1) **The read-only file-browser view cannot open a folder another user owns with mode 0770** — nextcloud's `appdata/nextcloud` is `www-data` `drwxrwx---` (measured on 9202 2026-09-25), FileBrowser runs as uid 1000, so „Megőrzött adatok" shows the folder and not its files; the files are still listed, sized, loadable and deletable. Fix direction needs a decision (a read-only ACL, or a helper that lists as root) — not a chmod of the household's data. (2) **„Use my kept data" / Load looks only at the own unit (Tier 1) and the second-drive mirror (Tier 2)**; an app whose only database copy is off-site gets "no backup". Controller `43e99d1`. `audits/night-2026-09-26/E/` **-- 2026-09-25 live proof:** (1) confirmed on 9202 — the view mounts nextcloud's kept folders `:ro` but its files are `www-data` 0770. Also seen: the source's name „Megőrzött adatok" is Hungarian on an English box (the file browser's config holds one name). **-- 2026-09-27 (controller v0.275.0): (1) FIXED: the view joins the kept folder's OWNING GROUP when it is group-readable (never root's, never its own), binds stay `:ro`, nothing on disk changes (CC-unattended decision, `07` §6.5); the source's name follows a language switch (the switch re-syncs the file browser). Red-proofed, `audits/version-travel-2026-09-26/D3/`. NOT live-proven with a real nextcloud kept folder. STILL OPEN: (2), the Use/Load choice does not look at the off-site copy.** **-- 2026-09-27 (second session): (2) NOT built on purpose** — it composes the unit-only off-site download (`RestoreOffboxScratch(full=false)`) with the unit restore into a new restore path on household data, and no box CC may touch has an off-site target to prove it on (9202 has none; 9201 on both demo hosts is fenced). Needs: a Tier-0 guest with an off-site target, or an operator word to use one.** **-- 2026-09-28 (controller v0.277.0): (2) BUILT** — `KeptBestCopy` offers the off-site copy when it is newer than every local copy or the only one; the page names the copy and its date; `LoadKeptOffsite` downloads the unit alone, refuses a unit of another drive, with no data, or with no recorded data version (`07` §6.5/§6.6), then restores. Red-proofed (`audits/kept-offsite-2026-09-28/redproofs/`). Tier 1 regression live on 9202 (the choice named „saját mentés, 2026-09-28 10:06”, seed + file back). Floor 0.277.0, both demo boxes. **STILL OPEN: the live off-site proof** — a throwaway nextcloud on demo-hp 9201 joined the off-site copy 2026-09-28 10:15; its first snapshot runs the night of 09-28/29 (Part E (b)). Tier 2 not runnable live (9202 has one drive). **-- 2026-09-28 afternoon: LIVE-PROVEN on demo-hp 9201 (controller 0.278.0), endpoint level.** A throwaway nextcloud, seeded through its own front door, joined the off-site copy; the off-site run-now pushed snapshot `6cb379a8`. (a) The full off-site restore (prepare → download → reconstitute): 3 volumes + the database replayed, the seed read back, a marker user written after the snapshot read ABSENT, same versions. (b) Remove keeping the data + deleting the local copies → reinstall: the choice and the kept list both named "távoli mentés, 2026-09-28 15:40" / "the off-site copy, 2026-09-28 15:40"; "use my kept data" downloaded the unit alone and loaded 3/3 volumes + 1/1 database in 55 s; the seed and the kept files read back. App removed with its data; demo-hp's app list equals the list before. `audits/kept-offsite-2026-09-28/E/`. | **CLOSED — controller v0.277.0, live 2026-09-28** | | **R-693** | **[P3-LOW] The memory watch marks a Node app `memory_tight` at any limit — its heap sizes itself from the limit.** Measured 2026-09-25 on the bench (docmost 0.96.0, harness v4): the app's own memory (`anon`) peaked at **349 MB of 384 MB (90.9 %)**, then, with the limit raised to 512 MB, at **431 MB of 512 MB (80.4 %)** — 0 OOM kills and 0 restarts in both 10-minute watches (~12 000 requests each). So the mark (decision 22's "does not fit the memory") fires for an app that fits, and the gate's remedy (raise the limit) cannot clear it. docmost moved with the limit raised to 512 MB (decision 39). **Needs:** a basis that tells growth-to-fill from pressure (e.g. kills/restarts plus a GC-pressure signal, or a second watch at a higher limit showing the peak scales), or a per-app `memory_scales_with_limit` fact. `audits/night-2026-09-26/C/bench-run1/`, `…/bench-run2/` | **OPEN — P3; owner: CC** | @@ -841,6 +841,9 @@ class (an image `VOLUME` at an unmounted path) is still live — `immich-server` | **R-727** | **[P2-MEDIUM] The whole-guest restore test picks a PREVIOUS box's archive, fails on its key, and the household sees a bare ✗ labelled with the wrong tier.** MEASURED 2026-09-30 01:52 UTC on the drill box: the agent's restore test chose `felhom-pbs:backup/ct/9201/2026-09-16T21:59:54Z` („newest settled archive … has not been proven") — written by a drill box of 2026-09-16, still in the customer's ep0 namespace next to tonight's own `2026-09-29T19:37:07Z` — and failed `wrong key - unable to verify signature since manifest's key 6b:ca:5f:3f… does not match provided key de:51:7a:18…`. One operator mail (`restore_test_failed`); the hub then re-logged the stored failure at every 15-minute report for 5 hours. The household's backups page read „✗ Visszaállítás ellenőrizve 2026-09-30 03:52 — Helyi tároló (local)" — the local tier had not failed; the pbs tier had, and the page says neither which nor why. Root: host delete leaves the old box's archives in the namespace (R-526's shape). **Fix direction:** the restore test skips (and reports as foreign) archives whose key fingerprint is not this host's; the page names the tier that failed. **FIXED 2026-09-30 (agent v0.138.0 + decision 51):** measured — a PBS archive carries its key FINGERPRINT (PVE content `encrypted`), not a host id; the storage carries its own (`encryption-key`). The restore test skips an archive written with another key (logged by name). The ✗ card names the tier (controller v0.283.0) — **and the 2026-09-30 claim "the page blames the local tier" was my misreading**: the „Helyi tároló (local)" after the ✗ was the next section's heading. ep0: the three drill archives in `tester-1` removed, other namespaces byte-identical. Delivered by signed jobs to both demo boxes (340 s); their due-check reads normally on 0.138.0. Evidence: `audits/evidence-fixes-first-tester-2026-09-30/``partC/`. | **CLOSED 2026-09-30 — agent v0.138.0** | | **R-728** | **[P3-LOW] A customer created with one press was created TWICE, and the first of its two connect mails holds a dead link.** MEASURED 2026-09-30 on `Tester-2`: the hub logged `Customer config created: Tester-2` twice in the same second and two self-bind mints (hashes `c40df008…`, `6a1cbef4…`); a mint replaces the previous link (single-active), so one of the two identical mails the tester received answers „expired". Cause not established (a double form submit, or the handler run twice). **Fix direction:** make the create idempotent within a few seconds (or disable the button on submit), and pin it. The workaround for the tester is in STATUS. | **READY — rank P3-LOW; owner: CC (hub)** | | **R-729** | **[P3-LOW] An off-site target, once saved on the page, cannot be removed through the product.** MEASURED 2026-09-30 on 9202: `/backup/offbox/config` refuses an empty address and no route clears the target; the session removed its throwaway target from `settings.json` by hand, with the controller stopped (harness teardown on a scratch guest). A household that tries its own NAS and gives up keeps a disabled target forever. **Fix direction:** a „Távoli mentési cél törlése" press that clears the target (never the repository). | **READY — rank P3-LOW; owner: CC (controller)** | +| **R-730** | **[P3-LOW] The published ISO 1.29.0 was built from a tree that git cannot name, so it cannot be tagged.** MEASURED 2026-09-30 from the build record: the manifest says `repo-commit 8d539f97` (2026-09-18 17:48), built 20:41:45; the menu-width fix the published image carries (`grub-release.cfg.tmpl`, „… / text") was committed 35 minutes AFTER the build, in `31eeb36` (21:16). `scripts/iso/build-felhom-iso.sh:498` records `git rev-parse HEAD` with no dirty-tree check, so the manifest names a commit that is not the image. **And the brief's tag name would have been wrong:** the `installer-v*` tags are the host-install SCRIPT's versions (`SCRIPT_VERSION` 1.28.0 on main; the website serves `/scripts/` from `installer-v1.28.0`), a different number line from the ISO — an `installer-v1.29.0` tag would block the next script release. **Needs:** the ISO build refuses a dirty tree (the workspace clean-tree gate, applied to this script) and records `iso-v`; optionally prove 1.29.0's source by content (the ISO's `grub.cfg` against `31eeb36`) and tag that. `audits/pg-last-six-2026-09-30/E/E4-installer-tag.txt` | **READY — rank P3-LOW; owner: CC (scripts/iso)** | +| **R-731** | **[P3-LOW] The catalog-currency comparison cannot see an upstream that changes its TAG SHAPE, and two newest tags need a release check.** MEASURED 2026-09-30 (`audits/catalog-currency-2026-09-30.md` §2 item 5): the same-shape rule read three apps as up to date that were not — gramps-web (`v25.6.0` → upstream dropped the `v`, at `26.9.1`), jellyfin (`10.11.11` → two-part `12.1`), kimai (`apache-2.57.0` → plain `2.67.0`; the plain tag's digest equals `apache`'s, so kimai moved on 2026-09-30). A control pass over every shape caught them. Not checked: whether `mariadb:13.0` and `gitea/gitea:28.0.0` (pushed 2026-09-30 00:15 UTC) are general releases. **Needs:** the currency script's shape-switch control made standing (it is in the audit's tools today), and the two release checks before either is walked. | **READY — rank P3-LOW; owner: CC (catalog audit tooling)** | +| **R-732** | **[P2-MEDIUM] immich's FIRST start at today's catalog pin could not finish on the bench: its database container was OOM-killed at 512 MiB.** MEASURED 2026-09-30, twice (the second run alone on the bench): at FROM (v3.2.2, `…/postgres:16-vectorchord0.4.3-pgvectors0.2.0` at the ladder's own digest `1a078b23…`), the server's first-start reverse-geocoding import dropped its DB connection („terminating connection because of crash of another server process"), and the harness's 420 s settle never saw it healthy; a live read of the postgres cgroup showed `oom 413, oom_kill 36`, `OOMKilled true`. **The same template on 9202 the same hour** (a fresh install, kept data moved aside) seeded in 35 s and its v3.2.4 step ended `done` — but that first container was replaced by the update, so its kill counter is gone: whether a household's fresh install on a smaller box hits this is NOT measured. R-676's watch (a first start restarting ≥ 6 times in 10 min is stopped by decision 28) makes the consequence a stopped app. So immich's v3.2.4 step stays unpublished (box proven, bench inconclusive twice — Part F's stop rule). **Needs:** a sampled first-start memory watch of immich-postgres on a fresh install (bench and box, `anon` + `oom_kill` from the container's birth), then a measured `mem_limit`. `audits/pg-last-six-2026-09-30/F/immich-first-start-oom.txt`, `F/benchq-q6.txt`, `F/benchq-q10.txt` | **READY — rank P2-MEDIUM; owner: CC (catalog)** |