version-travel: session record, evidence B/C/D/R, 09 decision 42, 07 §6.5 decision, register 339 -> 336, STATUS (D4)
gates / gates (push) Successful in 26s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-09-27 13:02:33 +02:00
parent bff98a81a2
commit 7696836f84
85 changed files with 10970 additions and 48 deletions
@@ -0,0 +1,66 @@
# DRILL — 2026-09-26/27: a backup's data and its version travel together; the next PostgreSQL apps; adventurelog; leftovers
Brief: "a backup's data and its version always travel together; the next PostgreSQL apps; adventurelog; small leftovers".
Architecture read before any claim: `07-backup-architecture.md` §6 (now §6.6 added), `09-update-architecture.md` §3
decisions 13–42, §5.3, §6.4 parts 4, 5, 10. Evidence: `audits/version-travel-2026-09-26/`.
## Not done, or changed
- **One controller release (v0.275.0), not two**, with Parts A, D2–D4 and **R-699** (found live during Part B, filed and
fixed). Live proofs ran on `0.275.0-rc1` (identical except R-699); 0.275.0 itself ran the adventurelog box proof.
- **The session paused ~17 h** (usage limit) between the build and the live proof. In that gap the box's own night ran the
engine step on docmost, which became the shape-2 live proof — observed, not pressed.
- **R-691 (2) NOT built** — Load does not look at the off-site copy. (1) built and red-proofed, **not live-proven** (no
nextcloud kept folder existed on 9202).
- **Part B moved 2 apps** (paperless-ngx, tandoor). calcom and claper were not attempted (no seed route in the fixtures).
- **adventurelog's health fix is a DROP of the override, not `/usr/bin/node`**: no single node path works on both versions
(measured). It rides the image move in the same commit, as asked.
- **Off-site restore NOT exercised live** (9202 has no off-site target; the boxes that do are fenced). Unit-tested.
- **The conversion-copy RELEASE on a real 18 dump not observed** — due on 9202 after tonight's 00:30 data run.
- **D1's scheduled restore-test cycle on demo-hp**: due ~18:28 CEST, read into `D1/D1-cycle-demo-hp.txt` if the session is
still alive; otherwise it is the first thing to read.
- **Part E (night watch) not done.**
- D4 is **not ruled**: option A is built and in force (STATUS).
## Claims in the brief, judged
1. *`CaptureRecoveryUnit` rewrites `compose/` and `image_pins` before the data is refreshed* — **TRUE** (measured: the
refresh 2 min after the update rewrote both; the dumps stayed).
2. *A restore replays the database's raw volume tar before the SQL dump* — **TRUE** (`restore_unit.go`; live: the 16 datadir
tar replaced the volume first).
3. *The 18 definition over a 16 tar does X* — **REFUSED by the engine, and the app was left DOWN**: `postgres:18` refused the
old layout, the replay timed out, the start failed. Not "a fresh cluster with the SQL".
4. *A restored version older than the ladder would jump* — **TRUE for a person's press, FALSE for the automatic leg**
(`LegSkipOlderThanLadder` already refuses). The page now says the box will not update it by itself.
5. *`07` says nothing on which version a restore brings back* — **TRUE** for `07` (only `09` §5.3 said the restore pins to
the unit's compose). `07` §6.6 now says it.
## A — the data and its version (R-696)
A1 spike (`A1/README.md`) → A2–A4 built (stamps, the definition kept with its data, restore guard, off-site definition,
data times on all three tiers, release needs a dump on the new major) → red-proofs RP1–RP6 (`A5-redproofs/`) → live
(`A5-live/README.md`): shape 2 in the box's own night (restore offered 00:30 = the data; restore back whole at 16 with the
sentence „A(z) docmost visszaállt a(z) 2026-09-27 02:30-i mentésből, a(z) docmost:0.96.0, postgres:16-alpine,
redis:7-alpine verzióra. Elérhető frissítés: a doboz lépésenként hozza naprakészre."; climb again 55 s); shape 1 (back
whole at 0.95.0, "No pending database migrations"; climb 46 s). A7: 42 of 42 ladder digests resolve; filed R-698.
## B, C, D
B: `B/README.md` — paperless-ngx → 18 and tandoor → 17, both venues, engine gate ALLOWED, catalog `46affe0`, `53b84ca`.
C: `C/README.md` — adventurelog v0.13.0, catalog `06ea7da`. D1 agent v0.135.0 (signed delivery to both hosts); D2 R-695;
D3 R-691 (1); D4 R-694 (per-app measurement, 6 of 7 keep the login in their data).
## Teardown
- **Machine:** bench LXC 9401 created and destroyed (hostname checked), template removed. 9202: docmost, tandoor and
adventurelog removed through the product; paperless-ngx (standing) now on PostgreSQL 18 like the live catalog, its kept
16 copy waiting for the release; back on the LIVE catalog (`controller.yaml.pre-vt0926`), controller 0.275.0. Drill repo
reset to live `main` (`f1a7d6c`).
- **Host:** demo-hp `pct list` 9201 + 9202 only; `local` and `nvme-scratch` as before the bench.
- **Hub:** global floor 0.275.0 (declared MinAgent 0.131.0); two signed `agent_update` jobs consumed; no customer or
appliance created.
## Register
Before: **339 rows / 682,159 B** (the brief's count). Opened R-697, R-698, R-699; closed R-655, R-689, R-694, R-695, R-696,
R-699 (moved to `CLOSED-ITEMS.md`); narrowed R-691 (to its (2)) and R-463 (3 of 11 moved). After: **336 rows / 678,058 B**.
@@ -0,0 +1,6 @@
# R-699 red-proof — a definition-only unit accepted (v0.274.0 / rc1 shape)
a_version_travel_test.go:595: the precondition accepted tier 1 at 2026-09-27 09:43:08 +0000 UTC — a unit with no data is not a copy
--- FAIL: TestR699_ADefinitionOnlyUnitIsNotAPreconditionCopy (0.00s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/backup 0.008s
FAIL
@@ -0,0 +1,7 @@
VMID Status Lock Name
9201 running demo-hp
9202 running demo-hp-scratch
local dir active 40453376 22919900 15446360 56.66%
nvme-scratch dir active 983379700 75028908 858324180 7.63%
total used free shared buff/cache available
Mem: 29 6 11 0 12 23
@@ -0,0 +1,8 @@
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
Creating SSH host key 'ssh_host_ecdsa_key' - this may take some time ...
done: SHA256:NNo2rVOhZjaTMhKYXI2z7nZzWZe672bnB+EkWCOFvQE root@upgrade-harness
192.168.0.124/24
Docker version 26.1.5+dfsg1, build a72d7cd
Docker Compose version 2.26.1-4
Python 3.13.5
net-ok
@@ -0,0 +1,8 @@
hostname: upgrade-harness
purging CT 9401 from related configurations..
destroyed-9401
VMID Status Lock Name
9201 running demo-hp
9202 running demo-hp-scratch
local dir active 40453376 22942648 15423612 56.71%
nvme-scratch dir active 983379700 75279156 858073932 7.66%
@@ -0,0 +1,14 @@
# B — the next PostgreSQL apps (2026-09-27)
Targets (`09` §3 decision 42, read from each upstream): paperless-ngx → 18 (upstream compose ships `postgres:18` at
`/var/lib/postgresql`, Django ~5.2.5, psycopg 3); tandoor → 17 (upstream compose ships `postgres:16-alpine`; Django 5.2.16
documents up to 17). calcom and claper were not taken (no seed route in the fixtures); outline, rallly, zipline have none (R-624).
| app | bench (LXC 9401, `apps/<app>/bench/`) | box 9202 (`apps/<app>/box/`) |
|---|---|---|
| paperless-ngx | converted 35.4 s, check equal over 72 tables, seed ✓; memory anon peaks: webserver 40.0 %, postgres 3.8 %; 0 restarts | precondition: Tier 2 copy of 00:30Z; converted 16 → 18 in 10.6 s (72 tables, 812 rows equal); done 64.6 s; seed ✓; pre-conversion copy KEPT |
| tandoor | converted 23.6 s, 100 tables equal, seed ✓; tandoor app anon peak 78.7 % (cgroup 97.8 % = file cache), postgres 5.1 % | converted 16 → 17 in 11.4 s (100 tables, 687 rows equal); done 52.3 s; seed ✓ — this run found R-699 |
Written into the live catalog by `upgrade-test.py --write-ladder` (`46affe0`, `53b84ca`); the engine gate printed ALLOWED for both.
Bench created and destroyed this session (`B1-bench-create.txt`, `B9-bench-destroy.txt`). demo-hp runs paperless-ngx: its
automatic leg converts it on its next night (controller 0.275.0).
@@ -0,0 +1,166 @@
[09:33:45] scratch drive folders cleared before FROM (R-656): none existed
[09:33:45] MV-paperless-ngx: deploying paperless-ngx at FROM {'paperless-webserver': 'ghcr.io/paperless-ngx/paperless-ngx:2.20.15', 'paperless-postgres': 'postgres:16-alpine', 'paperless-redis': 'redis:7-alpine'}
[09:35:37] FROM settled=True in 62.2s :: {"paperless-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "paperless-redis": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "paperless-webserver": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[09:35:37] fixture: the BOX walk's own (Django), through upgrade_boxport
[09:35:45] paperless-webserver: createsuperuser :: Superuser created successfully.
[09:35:51] paperless-webserver: seeded superuser drill248892
[09:36:03] paperless-webserver: readback of the seeded account found=True
[09:36:03] C1 (seed reads back BEFORE): True
[09:36:04] MV-paperless-ngx: PostgreSQL major move {'service': 'paperless-postgres', 'engine': 'postgres', 'from': 16, 'to': 18} — converting on the bench before the swap
[09:36:39] CONVERTED paperless-postgres PostgreSQL 16 -> 18 in 35.4s (dump 0.63s / 246453 B, load 2.59s, check equal over 72 tables)
[09:36:39] MV-paperless-ngx: swapping to TO {'paperless-webserver': 'ghcr.io/paperless-ngx/paperless-ngx:2.20.15', 'paperless-postgres': 'postgres:18-alpine', 'paperless-redis': 'redis:7-alpine'}
[09:36:50] TO up -d rc=0
[09:37:22] TO settled=True in 31.5s :: {"paperless-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "paperless-redis": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "paperless-webserver": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[09:37:22] engine state paperless-postgres: 18
[09:37:22] migration lines observed: 4
[09:37:33] paperless-webserver: readback of the seeded account found=True
[09:37:33] RESULT (seed reads back AFTER): True
[09:37:33] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:8000
[09:37:48] + 15s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=5M kills=0 rs=0 paperless-webserver=535M/1280M peak=630M kills=0 rs=0 reqs=298
[09:38:04] + 30s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=5M kills=0 rs=0 paperless-webserver=536M/1280M peak=630M kills=0 rs=0 reqs=594
[09:38:19] + 46s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=5M kills=0 rs=0 paperless-webserver=536M/1280M peak=630M kills=0 rs=0 reqs=888
[09:38:34] + 61s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=5M kills=0 rs=0 paperless-webserver=535M/1280M peak=630M kills=0 rs=0 reqs=1184
[09:38:49] + 76s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=5M kills=0 rs=0 paperless-webserver=535M/1280M peak=630M kills=0 rs=0 reqs=1480
[09:39:04] + 91s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=536M/1280M peak=630M kills=0 rs=0 reqs=1776
[09:39:19] + 106s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=536M/1280M peak=630M kills=0 rs=0 reqs=2072
[09:39:35] + 121s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=535M/1280M peak=630M kills=0 rs=0 reqs=2366
[09:39:50] + 136s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=536M/1280M peak=630M kills=0 rs=0 reqs=2662
[09:40:05] + 152s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=2958
[09:40:20] + 167s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=532M/1280M peak=630M kills=0 rs=0 reqs=3254
[09:40:35] + 182s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=3550
[09:40:50] + 197s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=3843
[09:41:06] + 212s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=4139
[09:41:21] + 227s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=4434
[09:41:36] + 243s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=4730
[09:41:51] + 258s paperless-postgres=123M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=5026
[09:42:06] + 273s paperless-postgres=124M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=5322
[09:42:21] + 288s paperless-postgres=126M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=5618
[09:42:36] + 303s paperless-postgres=126M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=5914
[09:42:52] + 318s paperless-postgres=128M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=534M/1280M peak=630M kills=0 rs=0 reqs=6208
[09:43:07] + 334s paperless-postgres=129M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=6502
[09:43:22] + 349s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=6798
[09:43:37] + 364s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=7095
[09:43:52] + 379s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=7392
[09:44:07] + 394s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=7686
[09:44:23] + 409s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=7982
[09:44:38] + 424s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=8278
[09:44:53] + 440s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=8576
[09:45:08] + 455s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=8874
[09:45:23] + 470s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=9168
[09:45:39] + 485s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=9464
[09:45:54] + 500s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=9760
[09:46:09] + 516s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=534M/1280M peak=630M kills=0 rs=0 reqs=10056
[09:46:24] + 531s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=10352
[09:46:39] + 546s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=10648
[09:46:54] + 561s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=10944
[09:47:10] + 576s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=11240
[09:47:25] + 591s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=534M/1280M peak=630M kills=0 rs=0 reqs=11536
[09:47:40] + 607s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=11832
[09:47:40] memory watch: killed=False tight=[] requests=11832 codes={'302': 11832}
[09:47:40] MV-paperless-ngx: ABORT — putting the FROM images back
[09:50:50] ABORT: the app did NOT come back (rc=1, 180.5s)
{
"harness_version": 4,
"edge": "MV-paperless-ngx",
"app": "paperless-ngx",
"note": "night 2026-09-23 within-a-major move: paperless-postgres=postgres:18-alpine",
"from": {
"paperless-webserver": "ghcr.io/paperless-ngx/paperless-ngx:2.20.15",
"paperless-postgres": "postgres:16-alpine",
"paperless-redis": "redis:7-alpine"
},
"to": {
"paperless-webserver": "ghcr.io/paperless-ngx/paperless-ngx:2.20.15",
"paperless-postgres": "postgres:18-alpine",
"paperless-redis": "redis:7-alpine"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": "\u001b[2Kpaperless-webserver | [init-migrations] Apply database migrations...",
"abort": "refuses",
"abort_detail": "less-postgres | The files belonging to this database system will be owned by user \"postgres\".\n\u001b[2Kpaperless-postgres | This user must also own the server process.\n\u001b[2Kpaperless-postgres | \n\u001b[2Kpaperless-postgres | initdb: error: directory \"/var/lib/postgresql/data\" exists but is not empty\n\u001b[2Kpaperless-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\".\n\u001b[2Kpaperless-postgres | The database cluster will be initialized with locale \"en_US.utf8\".\n\u001b[2Kpaperless-postgres | The default database encoding has accordingly been set to \"UTF8\".\n\u001b[2Kpaperless-postgres | The default text search configuration will be set to \"english\".\n\u001b[2Kpaperless-postgres | \n\u001b[2Kpaperless-postgres | Data page checksums are disabled.\n\u001b[2Kpaperless-postgres |",
"engine_state_after": {
"paperless-postgres": {
"image": "postgres:18-alpine",
"probe": "datadir major version",
"answer": "18",
"probe_rc": 0
}
},
"memory": {
"soak_s": 606.9,
"requested_s": 600,
"requests": 11832,
"codes": {
"302": 11832
},
"first_kill": null,
"containers": {
"paperless-postgres": {
"limit": 268435456,
"peak": 193302528,
"peak_pct": 0.72,
"anon_peak_sampled": 10256384,
"anon_peak_pct": 0.038,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"paperless-redis": {
"limit": 134217728,
"peak": 7303168,
"peak_pct": 0.054,
"anon_peak_sampled": 3137536,
"anon_peak_pct": 0.023,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"paperless-webserver": {
"limit": 1342177280,
"peak": 660705280,
"peak_pct": 0.492,
"anon_peak_sampled": 537432064,
"anon_peak_pct": 0.4,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"load": "reached"
},
"marks": [],
"duration_s": 31.5,
"measured_at": "2026-09-27T09:50:50Z",
"evidence": "evidence/MV-paperless-ngx",
"scratch_cleared": [],
"engine_conversion": {
"service": "paperless-postgres",
"engine": "postgres",
"from": 16,
"to": 18,
"dump_s": 0.63,
"dump_bytes": 246453,
"new_engine_ready_s": 6.4,
"load_s": 2.59,
"dropped": [
"paperless"
],
"skipped_create_role": [
"CREATE ROLE paperless;"
],
"result": "converted",
"check_equal": true,
"pg_version": "18",
"tables": 72,
"convert_s": 35.4
},
"files_changed": [],
"total_s": 1024.4
}
@@ -0,0 +1,74 @@
paperless-redis | 1:C 27 Sep 2026 11:34:24.893 # 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.
paperless-redis | 1:C 27 Sep 2026 11:34:24.894 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
paperless-redis | 1:C 27 Sep 2026 11:34:24.894 * Redis version=7.4.11, bits=64, commit=00000000, modified=0, pid=1, just started
paperless-redis | 1:C 27 Sep 2026 11:34:24.894 * Configuration loaded
paperless-redis | 1:M 27 Sep 2026 11:34:24.894 * monotonic clock: POSIX clock_gettime
paperless-redis | 1:M 27 Sep 2026 11:34:24.896 * Running mode=standalone, port=6379.
paperless-redis | 1:M 27 Sep 2026 11:34:24.896 * Server initialized
paperless-redis | 1:M 27 Sep 2026 11:34:24.900 * Creating AOF base file appendonly.aof.1.base.rdb on server start
paperless-redis | 1:M 27 Sep 2026 11:34:24.905 * Creating AOF incr file appendonly.aof.1.incr.aof on server start
paperless-redis | 1:M 27 Sep 2026 11:34:24.905 * Ready to accept connections tcp
paperless-redis | 1:signal-handler (1790501771) Received SIGTERM scheduling shutdown...
paperless-redis | 1:M 27 Sep 2026 11:36:11.595 * User requested shutdown...
paperless-redis | 1:M 27 Sep 2026 11:36:11.595 * Calling fsync() on the AOF file.
paperless-redis | 1:M 27 Sep 2026 11:36:11.597 * Saving the final RDB snapshot before exiting.
paperless-redis | 1:M 27 Sep 2026 11:36:11.609 * DB saved on disk
paperless-redis | 1:M 27 Sep 2026 11:36:11.609 # Redis is now ready to exit, bye bye...
paperless-redis | 1:C 27 Sep 2026 11:36:39.936 # 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.
paperless-redis | 1:C 27 Sep 2026 11:36:39.936 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
paperless-redis | 1:C 27 Sep 2026 11:36:39.936 * Redis version=7.4.11, bits=64, commit=00000000, modified=0, pid=1, just started
paperless-redis | 1:C 27 Sep 2026 11:36:39.936 * Configuration loaded
paperless-redis | 1:M 27 Sep 2026 11:36:39.937 * monotonic clock: POSIX clock_gettime
paperless-redis | 1:M 27 Sep 2026 11:36:39.938 * Running mode=standalone, port=6379.
paperless-redis | 1:M 27 Sep 2026 11:36:39.938 * Server initialized
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * Reading RDB base file on AOF loading...
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * Loading RDB produced by version 7.4.11
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * RDB age 135 seconds
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * RDB memory usage when created 0.90 Mb
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * RDB is base AOF
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * Done loading RDB, keys loaded: 0, keys expired: 0.
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * DB loaded from base file appendonly.aof.1.base.rdb: 0.000 seconds
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * DB loaded from incr file appendonly.aof.1.incr.aof: 0.000 seconds
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * DB loaded from append only file: 0.001 seconds
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * Opening AOF incr file appendonly.aof.1.incr.aof on server start
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * Ready to accept connections tcp
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
@@ -0,0 +1,20 @@
{
"paperless-postgres": {
"status": "restarting",
"health": "unhealthy",
"restarts": 0,
"exit": 1
},
"paperless-redis": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
},
"paperless-webserver": {
"status": "created",
"health": null,
"restarts": 0,
"exit": 0
}
}
@@ -0,0 +1,166 @@
paperless-redis | 1:C 27 Sep 2026 11:34:24.893 # 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.
paperless-redis | 1:C 27 Sep 2026 11:34:24.894 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
paperless-redis | 1:C 27 Sep 2026 11:34:24.894 * Redis version=7.4.11, bits=64, commit=00000000, modified=0, pid=1, just started
paperless-redis | 1:C 27 Sep 2026 11:34:24.894 * Configuration loaded
paperless-redis | 1:M 27 Sep 2026 11:34:24.894 * monotonic clock: POSIX clock_gettime
paperless-redis | 1:M 27 Sep 2026 11:34:24.896 * Running mode=standalone, port=6379.
paperless-redis | 1:M 27 Sep 2026 11:34:24.896 * Server initialized
paperless-redis | 1:M 27 Sep 2026 11:34:24.900 * Creating AOF base file appendonly.aof.1.base.rdb on server start
paperless-redis | 1:M 27 Sep 2026 11:34:24.905 * Creating AOF incr file appendonly.aof.1.incr.aof on server start
paperless-redis | 1:M 27 Sep 2026 11:34:24.905 * Ready to accept connections tcp
paperless-redis | 1:signal-handler (1790501771) Received SIGTERM scheduling shutdown...
paperless-redis | 1:M 27 Sep 2026 11:36:11.595 * User requested shutdown...
paperless-redis | 1:M 27 Sep 2026 11:36:11.595 * Calling fsync() on the AOF file.
paperless-redis | 1:M 27 Sep 2026 11:36:11.597 * Saving the final RDB snapshot before exiting.
paperless-redis | 1:M 27 Sep 2026 11:36:11.609 * DB saved on disk
paperless-redis | 1:M 27 Sep 2026 11:36:11.609 # Redis is now ready to exit, bye bye...
paperless-redis | 1:C 27 Sep 2026 11:36:39.936 # 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.
paperless-redis | 1:C 27 Sep 2026 11:36:39.936 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
paperless-redis | 1:C 27 Sep 2026 11:36:39.936 * Redis version=7.4.11, bits=64, commit=00000000, modified=0, pid=1, just started
paperless-redis | 1:C 27 Sep 2026 11:36:39.936 * Configuration loaded
paperless-redis | 1:M 27 Sep 2026 11:36:39.937 * monotonic clock: POSIX clock_gettime
paperless-redis | 1:M 27 Sep 2026 11:36:39.938 * Running mode=standalone, port=6379.
paperless-redis | 1:M 27 Sep 2026 11:36:39.938 * Server initialized
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * Reading RDB base file on AOF loading...
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * Loading RDB produced by version 7.4.11
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * RDB age 135 seconds
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * RDB memory usage when created 0.90 Mb
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * RDB is base AOF
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * Done loading RDB, keys loaded: 0, keys expired: 0.
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * DB loaded from base file appendonly.aof.1.base.rdb: 0.000 seconds
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * DB loaded from incr file appendonly.aof.1.incr.aof: 0.000 seconds
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * DB loaded from append only file: 0.001 seconds
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * Opening AOF incr file appendonly.aof.1.incr.aof on server start
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * Ready to accept connections tcp
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
paperless-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".
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-postgres |
paperless-postgres | Data page checksums are disabled.
paperless-postgres |
@@ -0,0 +1,76 @@
db:paperless owner=paperless enc=UTF8 coll=en_US.utf8
db:postgres owner=paperless enc=UTF8 coll=en_US.utf8
ext:paperless:plpgsql
role:paperless super=true login=true pw=true
rows:paperless:public.account_emailaddress=0
rows:paperless:public.account_emailconfirmation=0
rows:paperless:public.auditlog_logentry=0
rows:paperless:public.auth_group=0
rows:paperless:public.auth_group_permissions=0
rows:paperless:public.auth_permission=176
rows:paperless:public.auth_user=4
rows:paperless:public.auth_user_groups=0
rows:paperless:public.auth_user_user_permissions=0
rows:paperless:public.authtoken_token=0
rows:paperless:public.django_admin_log=0
rows:paperless:public.django_celery_results_chordcounter=0
rows:paperless:public.django_celery_results_groupresult=0
rows:paperless:public.django_celery_results_taskresult=0
rows:paperless:public.django_content_type=44
rows:paperless:public.django_migrations=216
rows:paperless:public.django_session=0
rows:paperless:public.documents_correspondent=0
rows:paperless:public.documents_customfield=0
rows:paperless:public.documents_customfieldinstance=0
rows:paperless:public.documents_document=0
rows:paperless:public.documents_document_tags=0
rows:paperless:public.documents_documenttype=0
rows:paperless:public.documents_note=0
rows:paperless:public.documents_paperlesstask=0
rows:paperless:public.documents_savedview=0
rows:paperless:public.documents_savedviewfilterrule=0
rows:paperless:public.documents_sharelink=0
rows:paperless:public.documents_storagepath=0
rows:paperless:public.documents_tag=0
rows:paperless:public.documents_uisettings=0
rows:paperless:public.documents_workflow=0
rows:paperless:public.documents_workflow_actions=0
rows:paperless:public.documents_workflow_triggers=0
rows:paperless:public.documents_workflowaction=0
rows:paperless:public.documents_workflowaction_assign_change_groups=0
rows:paperless:public.documents_workflowaction_assign_change_users=0
rows:paperless:public.documents_workflowaction_assign_custom_fields=0
rows:paperless:public.documents_workflowaction_assign_tags=0
rows:paperless:public.documents_workflowaction_assign_view_groups=0
rows:paperless:public.documents_workflowaction_assign_view_users=0
rows:paperless:public.documents_workflowaction_remove_change_groups=0
rows:paperless:public.documents_workflowaction_remove_change_users=0
rows:paperless:public.documents_workflowaction_remove_correspondents=0
rows:paperless:public.documents_workflowaction_remove_custom_fields=0
rows:paperless:public.documents_workflowaction_remove_document_types=0
rows:paperless:public.documents_workflowaction_remove_owners=0
rows:paperless:public.documents_workflowaction_remove_storage_paths=0
rows:paperless:public.documents_workflowaction_remove_tags=0
rows:paperless:public.documents_workflowaction_remove_view_groups=0
rows:paperless:public.documents_workflowaction_remove_view_users=0
rows:paperless:public.documents_workflowactionemail=0
rows:paperless:public.documents_workflowactionwebhook=0
rows:paperless:public.documents_workflowrun=0
rows:paperless:public.documents_workflowtrigger=0
rows:paperless:public.documents_workflowtrigger_filter_has_all_tags=0
rows:paperless:public.documents_workflowtrigger_filter_has_not_correspondents=0
rows:paperless:public.documents_workflowtrigger_filter_has_not_document_types=0
rows:paperless:public.documents_workflowtrigger_filter_has_not_storage_paths=0
rows:paperless:public.documents_workflowtrigger_filter_has_not_tags=0
rows:paperless:public.documents_workflowtrigger_filter_has_tags=0
rows:paperless:public.guardian_groupobjectpermission=0
rows:paperless:public.guardian_userobjectpermission=0
rows:paperless:public.mfa_authenticator=0
rows:paperless:public.paperless_applicationconfiguration=1
rows:paperless:public.paperless_mail_mailaccount=0
rows:paperless:public.paperless_mail_mailrule=0
rows:paperless:public.paperless_mail_mailrule_assign_tags=0
rows:paperless:public.paperless_mail_processedmail=0
rows:paperless:public.socialaccount_socialaccount=0
rows:paperless:public.socialaccount_socialapp=0
rows:paperless:public.socialaccount_socialtoken=0
@@ -0,0 +1,76 @@
db:paperless owner=paperless enc=UTF8 coll=en_US.utf8
db:postgres owner=paperless enc=UTF8 coll=en_US.utf8
ext:paperless:plpgsql
role:paperless super=true login=true pw=true
rows:paperless:public.account_emailaddress=0
rows:paperless:public.account_emailconfirmation=0
rows:paperless:public.auditlog_logentry=0
rows:paperless:public.auth_group=0
rows:paperless:public.auth_group_permissions=0
rows:paperless:public.auth_permission=176
rows:paperless:public.auth_user=4
rows:paperless:public.auth_user_groups=0
rows:paperless:public.auth_user_user_permissions=0
rows:paperless:public.authtoken_token=0
rows:paperless:public.django_admin_log=0
rows:paperless:public.django_celery_results_chordcounter=0
rows:paperless:public.django_celery_results_groupresult=0
rows:paperless:public.django_celery_results_taskresult=0
rows:paperless:public.django_content_type=44
rows:paperless:public.django_migrations=216
rows:paperless:public.django_session=0
rows:paperless:public.documents_correspondent=0
rows:paperless:public.documents_customfield=0
rows:paperless:public.documents_customfieldinstance=0
rows:paperless:public.documents_document=0
rows:paperless:public.documents_document_tags=0
rows:paperless:public.documents_documenttype=0
rows:paperless:public.documents_note=0
rows:paperless:public.documents_paperlesstask=0
rows:paperless:public.documents_savedview=0
rows:paperless:public.documents_savedviewfilterrule=0
rows:paperless:public.documents_sharelink=0
rows:paperless:public.documents_storagepath=0
rows:paperless:public.documents_tag=0
rows:paperless:public.documents_uisettings=0
rows:paperless:public.documents_workflow=0
rows:paperless:public.documents_workflow_actions=0
rows:paperless:public.documents_workflow_triggers=0
rows:paperless:public.documents_workflowaction=0
rows:paperless:public.documents_workflowaction_assign_change_groups=0
rows:paperless:public.documents_workflowaction_assign_change_users=0
rows:paperless:public.documents_workflowaction_assign_custom_fields=0
rows:paperless:public.documents_workflowaction_assign_tags=0
rows:paperless:public.documents_workflowaction_assign_view_groups=0
rows:paperless:public.documents_workflowaction_assign_view_users=0
rows:paperless:public.documents_workflowaction_remove_change_groups=0
rows:paperless:public.documents_workflowaction_remove_change_users=0
rows:paperless:public.documents_workflowaction_remove_correspondents=0
rows:paperless:public.documents_workflowaction_remove_custom_fields=0
rows:paperless:public.documents_workflowaction_remove_document_types=0
rows:paperless:public.documents_workflowaction_remove_owners=0
rows:paperless:public.documents_workflowaction_remove_storage_paths=0
rows:paperless:public.documents_workflowaction_remove_tags=0
rows:paperless:public.documents_workflowaction_remove_view_groups=0
rows:paperless:public.documents_workflowaction_remove_view_users=0
rows:paperless:public.documents_workflowactionemail=0
rows:paperless:public.documents_workflowactionwebhook=0
rows:paperless:public.documents_workflowrun=0
rows:paperless:public.documents_workflowtrigger=0
rows:paperless:public.documents_workflowtrigger_filter_has_all_tags=0
rows:paperless:public.documents_workflowtrigger_filter_has_not_correspondents=0
rows:paperless:public.documents_workflowtrigger_filter_has_not_document_types=0
rows:paperless:public.documents_workflowtrigger_filter_has_not_storage_paths=0
rows:paperless:public.documents_workflowtrigger_filter_has_not_tags=0
rows:paperless:public.documents_workflowtrigger_filter_has_tags=0
rows:paperless:public.guardian_groupobjectpermission=0
rows:paperless:public.guardian_userobjectpermission=0
rows:paperless:public.mfa_authenticator=0
rows:paperless:public.paperless_applicationconfiguration=1
rows:paperless:public.paperless_mail_mailaccount=0
rows:paperless:public.paperless_mail_mailrule=0
rows:paperless:public.paperless_mail_mailrule_assign_tags=0
rows:paperless:public.paperless_mail_processedmail=0
rows:paperless:public.socialaccount_socialaccount=0
rows:paperless:public.socialaccount_socialapp=0
rows:paperless:public.socialaccount_socialtoken=0
@@ -0,0 +1,8 @@
{
"paperless-postgres": {
"image": "postgres:18-alpine",
"probe": "datadir major version",
"answer": "18",
"probe_rc": 0
}
}
@@ -0,0 +1,5 @@
{
"/srv/felhom-gate/hdd/appdata/paperless/export": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"/srv/felhom-gate/hdd/appdata/paperless/media": "3d56384a871d4d286ff78c003cf877c8708bf525f82961a087edae6d911d4506",
"/srv/felhom-gate/import/paperless": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
@@ -0,0 +1,5 @@
{
"/srv/felhom-gate/hdd/appdata/paperless/export": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"/srv/felhom-gate/hdd/appdata/paperless/media": "3d56384a871d4d286ff78c003cf877c8708bf525f82961a087edae6d911d4506",
"/srv/felhom-gate/import/paperless": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
@@ -0,0 +1,4 @@
paperless-webserver | [init-migrations] Apply database migrations...
paperless-webserver | Apply all migrations: account, admin, auditlog, auth, authtoken, contenttypes, django_celery_results, documents, guardian, mfa, paperless, paperless_mail, sessions, socialaccount
paperless-webserver | Running migrations:
paperless-webserver | No migrations to apply.
@@ -0,0 +1,61 @@
[09:33:45] scratch drive folders cleared before FROM (R-656): none existed
[09:33:45] MV-paperless-ngx: deploying paperless-ngx at FROM {'paperless-webserver': 'ghcr.io/paperless-ngx/paperless-ngx:2.20.15', 'paperless-postgres': 'postgres:16-alpine', 'paperless-redis': 'redis:7-alpine'}
[09:35:37] FROM settled=True in 62.2s :: {"paperless-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "paperless-redis": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "paperless-webserver": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[09:35:37] fixture: the BOX walk's own (Django), through upgrade_boxport
[09:35:45] paperless-webserver: createsuperuser :: Superuser created successfully.
[09:35:51] paperless-webserver: seeded superuser drill248892
[09:36:03] paperless-webserver: readback of the seeded account found=True
[09:36:03] C1 (seed reads back BEFORE): True
[09:36:04] MV-paperless-ngx: PostgreSQL major move {'service': 'paperless-postgres', 'engine': 'postgres', 'from': 16, 'to': 18} — converting on the bench before the swap
[09:36:39] CONVERTED paperless-postgres PostgreSQL 16 -> 18 in 35.4s (dump 0.63s / 246453 B, load 2.59s, check equal over 72 tables)
[09:36:39] MV-paperless-ngx: swapping to TO {'paperless-webserver': 'ghcr.io/paperless-ngx/paperless-ngx:2.20.15', 'paperless-postgres': 'postgres:18-alpine', 'paperless-redis': 'redis:7-alpine'}
[09:36:50] TO up -d rc=0
[09:37:22] TO settled=True in 31.5s :: {"paperless-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "paperless-redis": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "paperless-webserver": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[09:37:22] engine state paperless-postgres: 18
[09:37:22] migration lines observed: 4
[09:37:33] paperless-webserver: readback of the seeded account found=True
[09:37:33] RESULT (seed reads back AFTER): True
[09:37:33] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:8000
[09:37:48] + 15s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=5M kills=0 rs=0 paperless-webserver=535M/1280M peak=630M kills=0 rs=0 reqs=298
[09:38:04] + 30s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=5M kills=0 rs=0 paperless-webserver=536M/1280M peak=630M kills=0 rs=0 reqs=594
[09:38:19] + 46s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=5M kills=0 rs=0 paperless-webserver=536M/1280M peak=630M kills=0 rs=0 reqs=888
[09:38:34] + 61s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=5M kills=0 rs=0 paperless-webserver=535M/1280M peak=630M kills=0 rs=0 reqs=1184
[09:38:49] + 76s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=5M kills=0 rs=0 paperless-webserver=535M/1280M peak=630M kills=0 rs=0 reqs=1480
[09:39:04] + 91s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=536M/1280M peak=630M kills=0 rs=0 reqs=1776
[09:39:19] + 106s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=536M/1280M peak=630M kills=0 rs=0 reqs=2072
[09:39:35] + 121s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=535M/1280M peak=630M kills=0 rs=0 reqs=2366
[09:39:50] + 136s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=536M/1280M peak=630M kills=0 rs=0 reqs=2662
[09:40:05] + 152s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=2958
[09:40:20] + 167s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=532M/1280M peak=630M kills=0 rs=0 reqs=3254
[09:40:35] + 182s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=3550
[09:40:50] + 197s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=3843
[09:41:06] + 212s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=4139
[09:41:21] + 227s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=4434
[09:41:36] + 243s paperless-postgres=122M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=4730
[09:41:51] + 258s paperless-postgres=123M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=5026
[09:42:06] + 273s paperless-postgres=124M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=5322
[09:42:21] + 288s paperless-postgres=126M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=5618
[09:42:36] + 303s paperless-postgres=126M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=5914
[09:42:52] + 318s paperless-postgres=128M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=534M/1280M peak=630M kills=0 rs=0 reqs=6208
[09:43:07] + 334s paperless-postgres=129M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=6502
[09:43:22] + 349s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=6798
[09:43:37] + 364s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=7095
[09:43:52] + 379s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=7392
[09:44:07] + 394s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=7686
[09:44:23] + 409s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=7982
[09:44:38] + 424s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=8278
[09:44:53] + 440s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=8576
[09:45:08] + 455s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=8874
[09:45:23] + 470s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=9168
[09:45:39] + 485s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=9464
[09:45:54] + 500s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=9760
[09:46:09] + 516s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=534M/1280M peak=630M kills=0 rs=0 reqs=10056
[09:46:24] + 531s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=10352
[09:46:39] + 546s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=4M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=10648
[09:46:54] + 561s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=10944
[09:47:10] + 576s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=11240
[09:47:25] + 591s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=534M/1280M peak=630M kills=0 rs=0 reqs=11536
[09:47:40] + 607s paperless-postgres=131M/256M peak=184M kills=0 rs=0 paperless-redis=3M/128M peak=6M kills=0 rs=0 paperless-webserver=533M/1280M peak=630M kills=0 rs=0 reqs=11832
[09:47:40] memory watch: killed=False tight=[] requests=11832 codes={'302': 11832}
[09:47:40] MV-paperless-ngx: ABORT — putting the FROM images back
[09:50:50] ABORT: the app did NOT come back (rc=1, 180.5s)
@@ -0,0 +1,432 @@
paperless-redis | 1:C 27 Sep 2026 11:34:24.893 # 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.
paperless-redis | 1:C 27 Sep 2026 11:34:24.894 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
paperless-redis | 1:C 27 Sep 2026 11:34:24.894 * Redis version=7.4.11, bits=64, commit=00000000, modified=0, pid=1, just started
paperless-redis | 1:C 27 Sep 2026 11:34:24.894 * Configuration loaded
paperless-redis | 1:M 27 Sep 2026 11:34:24.894 * monotonic clock: POSIX clock_gettime
paperless-redis | 1:M 27 Sep 2026 11:34:24.896 * Running mode=standalone, port=6379.
paperless-webserver | [init-start] paperless-ngx docker container starting...
paperless-webserver | [init-start] paperless-ngx docker container starting init as root
paperless-webserver | [env-init] Checking for environment from files
paperless-webserver | [env-init] No *_FILE environment found
paperless-webserver | [init-redis-wait] Waiting for Redis to report ready
paperless-webserver | [init-tesseract-langs] Checking if additional teseract languages needed
paperless-webserver | [init-db-wait] Waiting for PostgreSQL to start...
paperless-webserver | Installing languages...
paperless-webserver | [init-user] No UID changes for paperless
paperless-webserver | [init-user] No GID changes for paperless
paperless-webserver | [init-tesseract-langs] Package tesseract-ocr-eng already installed!
paperless-redis | 1:M 27 Sep 2026 11:34:24.896 * Server initialized
paperless-webserver | [init-folders] Running with root privileges, adjusting directories and permissions
paperless-webserver | mkdir: created directory '/tmp/paperless'
paperless-postgres | The files belonging to this database system will be owned by user "postgres".
paperless-postgres | This user must also own the server process.
paperless-postgres |
paperless-postgres | The database cluster will be initialized with locale "en_US.utf8".
paperless-postgres | The default database encoding has accordingly been set to "UTF8".
paperless-postgres | The default text search configuration will be set to "english".
paperless-webserver | [init-tesseract-langs] Package tesseract-ocr-deu already installed!
paperless-webserver | mkdir: created directory '/usr/src/paperless/data/index'
paperless-webserver | mkdir: created directory '/usr/src/paperless/media/documents'
paperless-postgres |
paperless-postgres | Data page checksums are enabled.
paperless-postgres |
paperless-webserver | mkdir: created directory '/usr/src/paperless/media/documents/originals'
paperless-webserver | mkdir: created directory '/usr/src/paperless/media/documents/thumbnails'
paperless-webserver | changed ownership of '/usr/src/paperless/export' from root:root to paperless:paperless
paperless-webserver | changed ownership of '/usr/src/paperless/data/index' from root:root to paperless:paperless
paperless-redis | 1:M 27 Sep 2026 11:34:24.900 * Creating AOF base file appendonly.aof.1.base.rdb on server start
paperless-redis | 1:M 27 Sep 2026 11:34:24.905 * Creating AOF incr file appendonly.aof.1.incr.aof on server start
paperless-redis | 1:M 27 Sep 2026 11:34:24.905 * Ready to accept connections tcp
paperless-redis | 1:signal-handler (1790501771) Received SIGTERM scheduling shutdown...
paperless-redis | 1:M 27 Sep 2026 11:36:11.595 * User requested shutdown...
paperless-redis | 1:M 27 Sep 2026 11:36:11.595 * Calling fsync() on the AOF file.
paperless-redis | 1:M 27 Sep 2026 11:36:11.597 * Saving the final RDB snapshot before exiting.
paperless-redis | 1:M 27 Sep 2026 11:36:11.609 * DB saved on disk
paperless-redis | 1:M 27 Sep 2026 11:36:11.609 # Redis is now ready to exit, bye bye...
paperless-redis | 1:C 27 Sep 2026 11:36:39.936 # 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.
paperless-webserver | changed ownership of '/usr/src/paperless/media' from root:root to paperless:paperless
paperless-postgres | fixing permissions on existing directory /var/lib/postgresql/18/docker ... ok
paperless-webserver | changed ownership of '/usr/src/paperless/media/documents' from root:root to paperless:paperless
paperless-webserver | changed ownership of '/usr/src/paperless/media/documents/thumbnails' from root:root to paperless:paperless
paperless-webserver | changed ownership of '/usr/src/paperless/media/documents/originals' from root:root to paperless:paperless
paperless-webserver | changed ownership of '/usr/src/paperless/consume' from root:root to paperless:paperless
paperless-webserver | changed ownership of '/tmp/paperless' from root:root to paperless:paperless
paperless-webserver | paperless-postgres:5432 - accepting connections
paperless-webserver | [init-db-wait] Connected to PostgreSQL
paperless-webserver | [init-db-wait] Database is ready
paperless-webserver | [init-migrations] Apply database migrations...
paperless-webserver | Waiting for Redis...
paperless-webserver | Connected to Redis broker.
paperless-webserver | [init-redis-wait] Redis ready
paperless-webserver | Operations to perform:
paperless-redis | 1:C 27 Sep 2026 11:36:39.936 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
paperless-redis | 1:C 27 Sep 2026 11:36:39.936 * Redis version=7.4.11, bits=64, commit=00000000, modified=0, pid=1, just started
paperless-postgres | creating subdirectories ... ok
paperless-redis | 1:C 27 Sep 2026 11:36:39.936 * Configuration loaded
paperless-redis | 1:M 27 Sep 2026 11:36:39.937 * monotonic clock: POSIX clock_gettime
paperless-redis | 1:M 27 Sep 2026 11:36:39.938 * Running mode=standalone, port=6379.
paperless-redis | 1:M 27 Sep 2026 11:36:39.938 * Server initialized
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * Reading RDB base file on AOF loading...
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * Loading RDB produced by version 7.4.11
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * RDB age 135 seconds
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * RDB memory usage when created 0.90 Mb
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * RDB is base AOF
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * Done loading RDB, keys loaded: 0, keys expired: 0.
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * DB loaded from base file appendonly.aof.1.base.rdb: 0.000 seconds
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * DB loaded from incr file appendonly.aof.1.incr.aof: 0.000 seconds
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * DB loaded from append only file: 0.001 seconds
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * Opening AOF incr file appendonly.aof.1.incr.aof on server start
paperless-redis | 1:M 27 Sep 2026 11:36:39.939 * Ready to accept connections tcp
paperless-webserver | Apply all migrations: account, admin, auditlog, auth, authtoken, contenttypes, django_celery_results, documents, guardian, mfa, paperless, paperless_mail, sessions, socialaccount
paperless-webserver | Running migrations:
paperless-webserver | Applying contenttypes.0001_initial... OK
paperless-webserver | Applying auth.0001_initial... OK
paperless-webserver | Applying account.0001_initial... OK
paperless-webserver | Applying account.0002_email_max_length... OK
paperless-webserver | Applying account.0003_alter_emailaddress_create_unique_verified_email... OK
paperless-postgres | selecting dynamic shared memory implementation ... posix
paperless-postgres | selecting default "max_connections" ... 100
paperless-postgres | selecting default "shared_buffers" ... 128MB
paperless-postgres | selecting default time zone ... Europe/Budapest
paperless-postgres | creating configuration files ... ok
paperless-postgres | running bootstrap script ... ok
paperless-postgres | sh: locale: not found
paperless-postgres | 2026-09-27 11:36:29.987 CEST [46] WARNING: no usable system locales were found
paperless-postgres | performing post-bootstrap initialization ... ok
paperless-postgres | syncing data to disk ... ok
paperless-postgres |
paperless-postgres |
paperless-postgres | Success. You can now start the database server using:
paperless-postgres |
paperless-postgres | pg_ctl -D /var/lib/postgresql/18/docker -l logfile start
paperless-postgres |
paperless-postgres | initdb: warning: enabling "trust" authentication for local connections
paperless-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.
paperless-postgres | waiting for server to start....2026-09-27 11:36:33.552 CEST [58] LOG: starting PostgreSQL 18.6 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit
paperless-postgres | 2026-09-27 11:36:33.555 CEST [58] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
paperless-postgres | 2026-09-27 11:36:33.570 CEST [64] LOG: database system was shut down at 2026-09-27 11:36:33 CEST
paperless-postgres | 2026-09-27 11:36:33.577 CEST [58] LOG: database system is ready to accept connections
paperless-postgres | done
paperless-postgres | server started
paperless-postgres | CREATE DATABASE
paperless-postgres |
paperless-postgres |
paperless-postgres | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
paperless-postgres |
paperless-postgres | waiting for server to shut down....2026-09-27 11:36:34.209 CEST [58] LOG: received fast shutdown request
paperless-postgres | 2026-09-27 11:36:34.213 CEST [58] LOG: aborting any active transactions
paperless-postgres | 2026-09-27 11:36:34.216 CEST [58] LOG: background worker "logical replication launcher" (PID 67) exited with exit code 1
paperless-postgres | 2026-09-27 11:36:34.221 CEST [62] LOG: shutting down
paperless-postgres | 2026-09-27 11:36:34.224 CEST [62] LOG: checkpoint starting: shutdown immediate
paperless-postgres | 2026-09-27 11:36:34.330 CEST [62] LOG: checkpoint complete: wrote 943 buffers (5.8%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.029 s, sync=0.060 s, total=0.110 s; sync files=303, longest=0.020 s, average=0.001 s; distance=4362 kB, estimate=4362 kB; lsn=0/1BA8868, redo lsn=0/1BA8868
paperless-postgres | 2026-09-27 11:36:34.356 CEST [58] LOG: database system is shut down
paperless-postgres | done
paperless-postgres | server stopped
paperless-postgres |
paperless-postgres | PostgreSQL init process complete; ready for start up.
paperless-postgres |
paperless-postgres | 2026-09-27 11:36:34.450 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
paperless-postgres | 2026-09-27 11:36:34.450 CEST [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
paperless-postgres | 2026-09-27 11:36:34.450 CEST [1] LOG: listening on IPv6 address "::", port 5432
paperless-postgres | 2026-09-27 11:36:34.456 CEST [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
paperless-postgres | 2026-09-27 11:36:34.468 CEST [86] LOG: database system was shut down at 2026-09-27 11:36:34 CEST
paperless-postgres | 2026-09-27 11:36:34.475 CEST [1] LOG: database system is ready to accept connections
paperless-postgres | 2026-09-27 11:36:36.185 CEST [84] LOG: checkpoint starting: immediate force wait
paperless-postgres | 2026-09-27 11:36:36.214 CEST [84] 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.029 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
paperless-webserver | Applying account.0004_alter_emailaddress_drop_unique_email... OK
paperless-webserver | Applying account.0005_emailaddress_idx_upper_email... OK
paperless-webserver | Applying account.0006_emailaddress_lower... OK
paperless-webserver | Applying account.0007_emailaddress_idx_email... OK
paperless-webserver | Applying account.0008_emailaddress_unique_primary_email_fixup... OK
paperless-webserver | Applying account.0009_emailaddress_unique_primary_email... OK
paperless-webserver | Applying admin.0001_initial... OK
paperless-webserver | Applying admin.0002_logentry_remove_auto_add... OK
paperless-webserver | Applying admin.0003_logentry_add_action_flag_choices... OK
paperless-webserver | Applying auditlog.0001_initial... OK
paperless-webserver | Applying auditlog.0002_auto_support_long_primary_keys... OK
paperless-webserver | Applying auditlog.0003_logentry_remote_addr... OK
paperless-webserver | Applying auditlog.0004_logentry_detailed_object_repr... OK
paperless-webserver | Applying auditlog.0005_logentry_additional_data_verbose_name... OK
paperless-webserver | Applying auditlog.0006_object_pk_index... OK
paperless-webserver | Applying auditlog.0007_object_pk_type... OK
paperless-webserver | Applying auditlog.0008_action_index... OK
paperless-webserver | Applying auditlog.0009_alter_logentry_additional_data... OK
paperless-webserver | Applying auditlog.0010_alter_logentry_timestamp... OK
paperless-webserver | Applying auditlog.0011_logentry_serialized_data... OK
paperless-webserver | Applying auditlog.0012_add_logentry_action_access... OK
paperless-webserver | Applying auditlog.0013_alter_logentry_timestamp... OK
paperless-webserver | Applying auditlog.0014_logentry_cid... OK
paperless-webserver | Applying auditlog.0015_alter_logentry_changes... OK
paperless-webserver | Applying auditlog.0016_logentry_remote_port... OK
paperless-webserver | Applying auditlog.0017_add_actor_email... OK
paperless-webserver | Applying contenttypes.0002_remove_content_type_name... OK
paperless-webserver | Applying auth.0002_alter_permission_name_max_length... OK
paperless-webserver | Applying auth.0003_alter_user_email_max_length... OK
paperless-webserver | Applying auth.0004_alter_user_username_opts... OK
paperless-webserver | Applying auth.0005_alter_user_last_login_null... OK
paperless-webserver | Applying auth.0006_require_contenttypes_0002... OK
paperless-webserver | Applying auth.0007_alter_validators_add_error_messages... OK
paperless-webserver | Applying auth.0008_alter_user_username_max_length... OK
paperless-webserver | Applying auth.0009_alter_user_last_name_max_length... OK
paperless-webserver | Applying auth.0010_alter_group_name_max_length... OK
paperless-webserver | Applying auth.0011_update_proxy_permissions... OK
paperless-webserver | Applying auth.0012_alter_user_first_name_max_length... OK
paperless-webserver | Applying authtoken.0001_initial... OK
paperless-webserver | Applying authtoken.0002_auto_20160226_1747... OK
paperless-webserver | Applying authtoken.0003_tokenproxy... OK
paperless-webserver | Applying authtoken.0004_alter_tokenproxy_options... OK
paperless-webserver | Applying django_celery_results.0001_initial... OK
paperless-webserver | Applying django_celery_results.0002_add_task_name_args_kwargs... OK
paperless-webserver | Applying django_celery_results.0003_auto_20181106_1101... OK
paperless-webserver | Applying django_celery_results.0004_auto_20190516_0412... OK
paperless-webserver | Applying django_celery_results.0005_taskresult_worker... OK
paperless-webserver | Applying django_celery_results.0006_taskresult_date_created... OK
paperless-webserver | Applying django_celery_results.0007_remove_taskresult_hidden... OK
paperless-webserver | Applying django_celery_results.0008_chordcounter... OK
paperless-webserver | Applying django_celery_results.0009_groupresult... OK
paperless-webserver | Applying django_celery_results.0010_remove_duplicate_indices... OK
paperless-webserver | Applying django_celery_results.0011_taskresult_periodic_task_name... OK
paperless-webserver | Applying django_celery_results.0012_taskresult_date_started... OK
paperless-webserver | Applying django_celery_results.0013_taskresult_django_cele_periodi_1993cf_idx... OK
paperless-webserver | Applying django_celery_results.0014_alter_taskresult_status... OK
paperless-webserver | Applying documents.0001_initial... OK
paperless-webserver | Applying documents.0002_auto_20151226_1316... OK
paperless-webserver | Applying documents.0003_sender... OK
paperless-webserver | Applying documents.0004_auto_20160114_1844_squashed_0011_auto_20160303_1929... OK
paperless-webserver | Applying documents.0012_auto_20160305_0040...[init-tesseract-langs] Installing package tesseract-ocr-hun...
paperless-webserver | OK
paperless-webserver | Applying documents.0013_auto_20160325_2111... OK
paperless-webserver | Applying documents.0014_document_checksum... OK
paperless-webserver | Applying documents.0015_add_insensitive_to_match_squashed_0018_auto_20170715_1712... OK
paperless-webserver | Applying documents.0019_add_consumer_user... OK
paperless-webserver | Applying documents.0020_document_added... OK
paperless-webserver | Applying documents.0021_document_storage_type... OK
paperless-webserver | Applying documents.0022_auto_20181007_1420... OK
paperless-webserver | Applying documents.0023_document_current_filename... OK
paperless-webserver | Applying documents.1000_update_paperless_all... OK
paperless-webserver | Applying documents.1001_auto_20201109_1636... OK
paperless-webserver | Applying documents.1002_auto_20201111_1105... OK
paperless-webserver | Applying documents.1003_mime_types... OK
paperless-webserver | Applying documents.1004_sanity_check_schedule... OK
paperless-webserver | Applying documents.1005_checksums... OK
paperless-webserver | Applying documents.1006_auto_20201208_2209_squashed_1011_auto_20210101_2340... OK
paperless-webserver | Applying paperless_mail.0001_initial_squashed_0009_mailrule_assign_tags... OK
paperless-webserver | Applying paperless_mail.0010_auto_20220311_1602... OK
paperless-webserver | Applying paperless_mail.0011_remove_mailrule_assign_tag_squashed_0024_alter_mailrule_name_and_more... OK
paperless-webserver | Applying documents.1012_fix_archive_files... OK
paperless-webserver | Applying documents.1013_migrate_tag_colour... OK
paperless-webserver | Applying documents.1014_auto_20210228_1614... OK
paperless-webserver | Applying documents.1015_remove_null_characters... OK
paperless-webserver | Applying documents.1016_auto_20210317_1351_squashed_1020_merge_20220518_1839... OK
paperless-webserver | Applying documents.1021_webp_thumbnail_conversion... OK
paperless-webserver | Applying documents.1022_paperlesstask_squashed_1036_alter_savedviewfilterrule_rule_type... OK
paperless-webserver | Applying documents.1037_webp_encrypted_thumbnail_conversion...[init-tesseract-langs] Installed tesseract-ocr-hun
paperless-webserver | [init-tesseract-langs] Additional packages installed
paperless-webserver | OK
paperless-webserver | Applying documents.1038_sharelink... OK
paperless-webserver | Applying documents.1039_consumptiontemplate... OK
paperless-webserver | Applying documents.1040_customfield_customfieldinstance_and_more... OK
paperless-webserver | Applying documents.1041_alter_consumptiontemplate_sources... OK
paperless-webserver | Applying documents.1042_consumptiontemplate_assign_custom_fields_and_more... OK
paperless-webserver | Applying documents.1043_alter_savedviewfilterrule_rule_type... OK
paperless-webserver | Applying documents.1044_workflow_workflowaction_workflowtrigger_and_more... OK
paperless-webserver | Applying documents.1045_alter_customfieldinstance_value_monetary_squashed_1049_document_deleted_at_document_restored_at... OK
paperless-webserver | Applying documents.1050_customfield_extra_data_and_more... OK
paperless-webserver | Applying documents.1051_alter_correspondent_owner_alter_document_owner_and_more... OK
paperless-webserver | Applying documents.1052_document_transaction_id... OK
paperless-webserver | Applying documents.1053_document_page_count... OK
paperless-webserver | Applying documents.1054_customfieldinstance_value_monetary_amount_and_more... OK
paperless-webserver | Applying documents.1055_alter_storagepath_path... OK
paperless-webserver | Applying documents.1056_customfieldinstance_deleted_at_and_more... OK
paperless-webserver | Applying documents.1057_paperlesstask_owner... OK
paperless-webserver | Applying documents.1058_workflowtrigger_schedule_date_custom_field_and_more... OK
paperless-webserver | Applying documents.1059_workflowactionemail_workflowactionwebhook_and_more... OK
paperless-webserver | Applying documents.1060_alter_customfieldinstance_value_select... OK
paperless-webserver | Applying documents.1061_workflowactionwebhook_as_json... OK
paperless-webserver | Applying documents.1062_alter_savedviewfilterrule_rule_type... OK
paperless-webserver | Applying documents.1063_paperlesstask_type_alter_paperlesstask_task_name_and_more... OK
paperless-webserver | Applying documents.1064_delete_log... OK
paperless-webserver | Applying documents.1065_workflowaction_assign_custom_fields_values... OK
paperless-webserver | Applying documents.1066_alter_workflowtrigger_schedule_offset_days... OK
paperless-webserver | Applying documents.1067_alter_document_created... OK
paperless-webserver | Applying documents.1068_alter_document_created... OK
paperless-webserver | Applying documents.1069_workflowtrigger_filter_has_storage_path_and_more... OK
paperless-webserver | Applying documents.1070_customfieldinstance_value_long_text_and_more... OK
paperless-webserver | Applying documents.1071_tag_tn_ancestors_count_tag_tn_ancestors_pks_and_more... OK
paperless-webserver | Applying documents.1072_workflowtrigger_filter_custom_field_query_and_more... OK
paperless-webserver | Applying documents.1073_migrate_workflow_title_jinja... OK
paperless-webserver | Applying documents.1074_workflowrun_deleted_at_workflowrun_restored_at_and_more... OK
paperless-webserver | Applying documents.1075_workflowaction_order... OK
paperless-webserver | Applying guardian.0001_initial... OK
paperless-webserver | Applying guardian.0002_generic_permissions_index... OK
paperless-webserver | Applying guardian.0003_remove_groupobjectpermission_guardian_gr_content_ae6aec_idx_and_more... OK
paperless-webserver | Applying mfa.0001_initial... OK
paperless-webserver | Applying mfa.0002_authenticator_timestamps... OK
paperless-webserver | Applying mfa.0003_authenticator_type_uniq... OK
paperless-webserver | Applying paperless.0001_initial... OK
paperless-webserver | Applying paperless.0002_applicationconfiguration_app_logo_and_more... OK
paperless-webserver | Applying paperless.0003_alter_applicationconfiguration_max_image_pixels... OK
paperless-webserver | Applying paperless.0004_applicationconfiguration_barcode_asn_prefix_and_more... OK
paperless-webserver | Applying paperless_mail.0025_alter_mailaccount_owner_alter_mailrule_owner_and_more... OK
paperless-webserver | Applying paperless_mail.0026_mailrule_enabled... OK
paperless-webserver | Applying paperless_mail.0027_mailaccount_expiration_mailaccount_account_type_and_more... OK
paperless-webserver | Applying paperless_mail.0028_alter_mailaccount_password_and_more... OK
paperless-webserver | Applying paperless_mail.0029_mailrule_pdf_layout... OK
paperless-webserver | Applying sessions.0001_initial... OK
paperless-webserver | Applying socialaccount.0001_initial... OK
paperless-webserver | Applying socialaccount.0002_token_max_lengths... OK
paperless-webserver | Applying socialaccount.0003_extra_data_default_dict... OK
paperless-webserver | Applying socialaccount.0004_app_provider_id_settings... OK
paperless-webserver | Applying socialaccount.0005_socialtoken_nullable_app... OK
paperless-webserver | Applying socialaccount.0006_alter_socialaccount_extra_data... OK
paperless-webserver | [init-superuser] Creating superuser...
paperless-webserver | [init-index] No index version file found
paperless-webserver | [init-index] Search index out of date. Updating...
paperless-webserver | Created superuser "admin" with provided password.
paperless-webserver | [init-superuser] Superuser creation done
paperless-webserver | [init-checks] Running Django checks
paperless-webserver | System check identified no issues (0 silenced).
paperless-webserver | [custom-init] /custom-cont-init.d doesn't exist, nothing to do
paperless-webserver | [init-complete] paperless-ngx docker container init completed in 35 seconds
paperless-webserver | [init-complete] Starting services
paperless-webserver | [svc-flower] Checking if we should start flower...
paperless-webserver | [svc-flower] Not starting flower
paperless-webserver | [INFO] Starting granian (main PID: 267)
paperless-webserver | [INFO] Listening at: http://:::8000
paperless-webserver | [INFO] Spawning worker-1 with PID: 290
paperless-webserver | celery beat v5.5.3 (immunity) is starting.
paperless-webserver | [2026-09-27 11:35:17,211] [INFO] [paperless.management.consumer] Polling directory for changes: /usr/src/paperless/consume
paperless-webserver | [2026-09-27 11:35:17,413] [INFO] [paperless.asgi] [init] Paperless-ngx version: v2.20.15
paperless-webserver | __ - ... __ - _
paperless-webserver | LocalTime -> 2026-09-27 11:35:18
paperless-webserver | Configuration ->
paperless-webserver | . broker -> redis://paperless-redis:6379//
paperless-webserver | . loader -> celery.loaders.app.AppLoader
paperless-webserver | . scheduler -> celery.beat.PersistentScheduler
paperless-webserver | . db -> /usr/src/paperless/data/celerybeat-schedule.db
paperless-webserver | . logfile -> [stderr]@%INFO
paperless-webserver | . maxinterval -> 5.00 minutes (300s)
paperless-webserver | [2026-09-27 11:35:18,163] [INFO] [celery.beat] beat: Starting...
paperless-webserver |
paperless-webserver | -------------- celery@3cca2aaddffe v5.5.3 (immunity)
paperless-webserver | --- ***** -----
paperless-webserver | -- ******* ---- Linux-7.0.2-6-pve-x86_64-with-glibc2.41 2026-09-27 11:35:18
paperless-webserver | - *** --- * ---
paperless-webserver | - ** ---------- [config]
paperless-webserver | - ** ---------- .> app: paperless:0x7337f6bde330
paperless-webserver | - ** ---------- .> transport: redis://paperless-redis:6379//
paperless-webserver | - ** ---------- .> results:
paperless-webserver | - *** --- * --- .> concurrency: 1 (prefork)
paperless-webserver | -- ******* ---- .> task events: ON
paperless-webserver | --- ***** -----
paperless-webserver | -------------- [queues]
paperless-webserver | .> celery exchange=celery(direct) key=celery
paperless-webserver |
paperless-webserver |
paperless-webserver | [tasks]
paperless-webserver | . documents.bulk_edit.delete
paperless-webserver | . documents.signals.handlers.process_cf_select_update
paperless-webserver | . documents.tasks.bulk_update_documents
paperless-webserver | . documents.tasks.check_scheduled_workflows
paperless-webserver | . documents.tasks.consume_file
paperless-webserver | . documents.tasks.empty_trash
paperless-webserver | . documents.tasks.index_optimize
paperless-webserver | . documents.tasks.sanity_check
paperless-webserver | . documents.tasks.train_classifier
paperless-webserver | . documents.tasks.update_document_content_maybe_archive_file
paperless-webserver | . documents.workflows.webhooks.send_webhook
paperless-webserver | . paperless_mail.mail.apply_mail_action
paperless-webserver | . paperless_mail.mail.error_callback
paperless-webserver | . paperless_mail.tasks.process_mail_accounts
paperless-webserver |
paperless-webserver | [2026-09-27 11:35:18,443] [INFO] [celery.worker.consumer.connection] Connected to redis://paperless-redis:6379//
paperless-webserver | [2026-09-27 11:35:18,464] [INFO] [celery.apps.worker] celery@3cca2aaddffe ready.
paperless-webserver | [INFO] Shutting down granian
paperless-webserver |
paperless-webserver | worker: Warm shutdown (MainProcess)
paperless-webserver | [init-start] paperless-ngx docker container starting...
paperless-webserver | [init-start] paperless-ngx docker container starting init as root
paperless-webserver | [env-init] Checking for environment from files
paperless-webserver | [env-init] No *_FILE environment found
paperless-webserver | [init-redis-wait] Waiting for Redis to report ready
paperless-webserver | [init-tesseract-langs] Checking if additional teseract languages needed
paperless-webserver | Installing languages...
paperless-webserver | [init-db-wait] Waiting for PostgreSQL to start...
paperless-webserver | [init-user] No UID changes for paperless
paperless-webserver | [init-user] No GID changes for paperless
paperless-webserver | [init-tesseract-langs] Package tesseract-ocr-eng already installed!
paperless-webserver | [init-folders] Running with root privileges, adjusting directories and permissions
paperless-webserver | [init-tesseract-langs] Package tesseract-ocr-hun already installed!
paperless-webserver | [init-tesseract-langs] Package tesseract-ocr-deu already installed!
paperless-webserver | [init-tesseract-langs] Additional packages installed
paperless-webserver | paperless-postgres:5432 - accepting connections
paperless-webserver | [init-db-wait] Connected to PostgreSQL
paperless-webserver | [init-db-wait] Database is ready
paperless-webserver | [init-migrations] Apply database migrations...
paperless-webserver | Waiting for Redis...
paperless-webserver | Connected to Redis broker.
paperless-webserver | [init-redis-wait] Redis ready
paperless-webserver | Operations to perform:
paperless-webserver | Apply all migrations: account, admin, auditlog, auth, authtoken, contenttypes, django_celery_results, documents, guardian, mfa, paperless, paperless_mail, sessions, socialaccount
paperless-webserver | Running migrations:
paperless-webserver | No migrations to apply.
paperless-webserver | [init-superuser] Creating superuser...
paperless-webserver | Did not create superuser, a user admin already exists
paperless-webserver | [init-superuser] Superuser creation done
paperless-webserver | [init-checks] Running Django checks
paperless-webserver | System check identified no issues (0 silenced).
paperless-webserver | [custom-init] /custom-cont-init.d doesn't exist, nothing to do
paperless-webserver | [init-complete] paperless-ngx docker container init completed in 20 seconds
paperless-webserver | [init-complete] Starting services
paperless-webserver | [svc-flower] Checking if we should start flower...
paperless-webserver | [svc-flower] Not starting flower
paperless-webserver | [INFO] Starting granian (main PID: 181)
paperless-webserver | [INFO] Listening at: http://:::8000
paperless-webserver | [INFO] Spawning worker-1 with PID: 200
paperless-webserver | celery beat v5.5.3 (immunity) is starting.
paperless-webserver | [2026-09-27 11:37:19,186] [INFO] [paperless.asgi] [init] Paperless-ngx version: v2.20.15
paperless-webserver | [2026-09-27 11:37:19,918] [INFO] [paperless.management.consumer] Polling directory for changes: /usr/src/paperless/consume
paperless-webserver | __ - ... __ - _
paperless-webserver | LocalTime -> 2026-09-27 11:37:20
paperless-webserver | Configuration ->
paperless-webserver | . broker -> redis://paperless-redis:6379//
paperless-webserver | . loader -> celery.loaders.app.AppLoader
paperless-webserver | . scheduler -> celery.beat.PersistentScheduler
paperless-webserver | . db -> /usr/src/paperless/data/celerybeat-schedule.db
paperless-webserver | . logfile -> [stderr]@%INFO
paperless-webserver | . maxinterval -> 5.00 minutes (300s)
paperless-webserver | [2026-09-27 11:37:20,475] [INFO] [celery.beat] beat: Starting...
paperless-webserver |
paperless-webserver | -------------- celery@3cca2aaddffe v5.5.3 (immunity)
paperless-webserver | --- ***** -----
paperless-webserver | -- ******* ---- Linux-7.0.2-6-pve-x86_64-with-glibc2.41 2026-09-27 11:37:20
paperless-webserver | - *** --- * ---
paperless-webserver | - ** ---------- [config]
paperless-webserver | - ** ---------- .> app: paperless:0x7e717854f800
paperless-webserver | - ** ---------- .> transport: redis://paperless-redis:6379//
paperless-webserver | - ** ---------- .> results:
paperless-webserver | - *** --- * --- .> concurrency: 1 (prefork)
paperless-webserver | -- ******* ---- .> task events: ON
paperless-webserver | --- ***** -----
paperless-webserver | -------------- [queues]
paperless-webserver | .> celery exchange=celery(direct) key=celery
paperless-webserver |
paperless-webserver |
paperless-webserver | [tasks]
paperless-webserver | . documents.bulk_edit.delete
paperless-webserver | . documents.signals.handlers.process_cf_select_update
paperless-webserver | . documents.tasks.bulk_update_documents
paperless-webserver | . documents.tasks.check_scheduled_workflows
paperless-webserver | . documents.tasks.consume_file
paperless-webserver | . documents.tasks.empty_trash
paperless-webserver | . documents.tasks.index_optimize
paperless-webserver | . documents.tasks.sanity_check
paperless-webserver | . documents.tasks.train_classifier
paperless-webserver | . documents.tasks.update_document_content_maybe_archive_file
paperless-webserver | . documents.workflows.webhooks.send_webhook
paperless-webserver | . paperless_mail.mail.apply_mail_action
paperless-webserver | . paperless_mail.mail.error_callback
paperless-webserver | . paperless_mail.tasks.process_mail_accounts
paperless-webserver |
paperless-webserver | [2026-09-27 11:37:21,038] [INFO] [celery.worker.consumer.connection] Connected to redis://paperless-redis:6379//
paperless-webserver | [2026-09-27 11:37:21,060] [INFO] [celery.apps.worker] celery@3cca2aaddffe ready.
@@ -0,0 +1,20 @@
{
"paperless-postgres": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
},
"paperless-redis": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
},
"paperless-webserver": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
}
}
@@ -0,0 +1,105 @@
{
"harness_version": 4,
"edge": "MV-paperless-ngx",
"app": "paperless-ngx",
"note": "night 2026-09-23 within-a-major move: paperless-postgres=postgres:18-alpine",
"from": {
"paperless-webserver": "ghcr.io/paperless-ngx/paperless-ngx:2.20.15",
"paperless-postgres": "postgres:16-alpine",
"paperless-redis": "redis:7-alpine"
},
"to": {
"paperless-webserver": "ghcr.io/paperless-ngx/paperless-ngx:2.20.15",
"paperless-postgres": "postgres:18-alpine",
"paperless-redis": "redis:7-alpine"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": "\u001b[2Kpaperless-webserver | [init-migrations] Apply database migrations...",
"abort": "refuses",
"abort_detail": "less-postgres | The files belonging to this database system will be owned by user \"postgres\".\n\u001b[2Kpaperless-postgres | This user must also own the server process.\n\u001b[2Kpaperless-postgres | \n\u001b[2Kpaperless-postgres | initdb: error: directory \"/var/lib/postgresql/data\" exists but is not empty\n\u001b[2Kpaperless-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\".\n\u001b[2Kpaperless-postgres | The database cluster will be initialized with locale \"en_US.utf8\".\n\u001b[2Kpaperless-postgres | The default database encoding has accordingly been set to \"UTF8\".\n\u001b[2Kpaperless-postgres | The default text search configuration will be set to \"english\".\n\u001b[2Kpaperless-postgres | \n\u001b[2Kpaperless-postgres | Data page checksums are disabled.\n\u001b[2Kpaperless-postgres |",
"engine_state_after": {
"paperless-postgres": {
"image": "postgres:18-alpine",
"probe": "datadir major version",
"answer": "18",
"probe_rc": 0
}
},
"memory": {
"soak_s": 606.9,
"requested_s": 600,
"requests": 11832,
"codes": {
"302": 11832
},
"first_kill": null,
"containers": {
"paperless-postgres": {
"limit": 268435456,
"peak": 193302528,
"peak_pct": 0.72,
"anon_peak_sampled": 10256384,
"anon_peak_pct": 0.038,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"paperless-redis": {
"limit": 134217728,
"peak": 7303168,
"peak_pct": 0.054,
"anon_peak_sampled": 3137536,
"anon_peak_pct": 0.023,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"paperless-webserver": {
"limit": 1342177280,
"peak": 660705280,
"peak_pct": 0.492,
"anon_peak_sampled": 537432064,
"anon_peak_pct": 0.4,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"load": "reached"
},
"marks": [],
"duration_s": 31.5,
"measured_at": "2026-09-27T09:50:50Z",
"evidence": "evidence/MV-paperless-ngx",
"scratch_cleared": [],
"engine_conversion": {
"service": "paperless-postgres",
"engine": "postgres",
"from": 16,
"to": 18,
"dump_s": 0.63,
"dump_bytes": 246453,
"new_engine_ready_s": 6.4,
"load_s": 2.59,
"dropped": [
"paperless"
],
"skipped_create_role": [
"CREATE ROLE paperless;"
],
"result": "converted",
"check_equal": true,
"pg_version": "18",
"tables": 72,
"convert_s": 35.4
},
"files_changed": [],
"total_s": 1024.4
}
@@ -0,0 +1,29 @@
{
"app": "paperless-ngx",
"venue": "box 9202 (drill catalog, controller 0.275.0-rc1), the product's guarded Update",
"from": {
"paperless-postgres": "postgres:16-alpine",
"paperless-redis": "redis:7-alpine",
"paperless-webserver": "ghcr.io/paperless-ngx/paperless-ngx:2.20.15"
},
"to": {
"paperless-postgres": "postgres:18-alpine",
"paperless-redis": "redis:7-alpine",
"paperless-webserver": "ghcr.io/paperless-ngx/paperless-ngx:2.20.15"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"engine_conversion": {
"service": "paperless-postgres",
"engine": "postgres",
"from": 16,
"to": 18,
"result": "converted",
"controller_line": "update paperless-ngx: CONVERTED 16 \u2192 18 in 10.607s \u2014 the check is equal (2 database(s), 72 table(s), 812 row(s)), PG_VERSION 18"
},
"duration_s": 64.7,
"measured_at": "2026-09-27T09:44:10Z",
"evidence": "felhom.eu/documentation/audits/version-travel-2026-09-26/B/apps/paperless-ngx/box/move.txt"
}
@@ -0,0 +1,43 @@
before: pinned={'paperless-postgres': 'postgres:16-alpine', 'paperless-redis': 'redis:7-alpine', 'paperless-webserver': 'ghcr.io/paperless-ngx/paperless-ngx:2.20.15'} PG_VERSION=16
drill: 48f45df DRILL paperless-ngx: paperless-postgres postgres:16-alpine -> postgres:18-alpine with the engine_conversion mark (box proof)
phase +0.0s safety-dump | err=None
phase +3.1s pulling | err=None
phase +4.1s copying | err=None
phase +12.3s converting | err=None
phase +22.6s starting | err=None
phase +33.9s verifying | err=None
phase +64.6s done | err=None
paperless-webserver: readback of the seeded account found=True
2026/09/27 09:44:11 update.go:536: [INFO] [stacks] update paperless-ngx: accepted — guarded update started
2026/09/27 09:44:11 update.go:1365: [INFO] [stacks] update paperless-ngx: phase checking
2026/09/27 09:44:11 update.go:786: [INFO] [stacks] update paperless-ngx: ladder — the last step (1 of 1) — the catalog's current definition
2026/09/27 09:44:11 update.go:800: [INFO] [stacks] update paperless-ngx: this step CONVERTS paperless-postgres PostgreSQL 16 → 18 (the ladder entry's mark); database volume paperless-ngx_paperless_postgres_data
2026/09/27 09:44:11 update.go:814: [INFO] [stacks] update paperless-ngx: precondition met — Tier 2 (second drive) copy from 2026-09-27T00:30:00Z (9h14m0s old, limit 24h0m0s)
2026/09/27 09:44:11 update.go:1365: [INFO] [stacks] update paperless-ngx: phase safety-dump
2026/09/27 09:44:12 update.go:846: [INFO] [stacks] update paperless-ngx: safety dump done (1 file(s)) [/mnt/felhom-drives/scratch_hdd/userdata/paperless-ngx/backups/primary/paperless-ngx/db-dumps/pre-restore-20260927T094411Z-paperless-ngx-postgres.sql]
2026/09/27 09:44:13 undo.go:287: [INFO] [stacks] update paperless-ngx: the undo copy will hold 3 named volume(s), 72.2 MiB
2026/09/27 09:44:13 pgconvert.go:340: [INFO] [stacks] update paperless-ngx: conversion space — database volume paperless-ngx_paperless_postgres_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/27 09:44:13 update.go:1365: [INFO] [stacks] update paperless-ngx: phase pinning
2026/09/27 09:44:13 pin.go:373: [INFO] [stacks] update paperless-ngx: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/paperless-ngx/docker-compose.yml (paperless-postgres=postgres:18-alpine, paperless-redis=redis:7-alpine, paperless-webserver=ghcr.io/paperless-ngx/paperless-ngx:2.20.15)
2026/09/27 09:44:13 update.go:1365: [INFO] [stacks] update paperless-ngx: phase pulling
2026/09/27 09:44:15 update.go:1365: [INFO] [stacks] update paperless-ngx: phase copying
2026/09/27 09:44:21 update.go:1365: [INFO] [stacks] update paperless-ngx: phase copying
2026/09/27 09:44:22 undo.go:437: [INFO] [stacks] update paperless-ngx: copied paperless-ngx_paperless_data → paperless-ngx_paperless_data.pre-update-20260927T094421Z in 477ms
2026/09/27 09:44:22 update.go:1365: [INFO] [stacks] update paperless-ngx: phase copying
2026/09/27 09:44:23 undo.go:437: [INFO] [stacks] update paperless-ngx: copied paperless-ngx_paperless_postgres_data → paperless-ngx_paperless_postgres_data.pre-update-20260927T094421Z in 954ms
2026/09/27 09:44:23 update.go:1365: [INFO] [stacks] update paperless-ngx: phase copying
2026/09/27 09:44:23 undo.go:437: [INFO] [stacks] update paperless-ngx: copied paperless-ngx_paperless_redis_data → paperless-ngx_paperless_redis_data.pre-update-20260927T094421Z in 454ms
2026/09/27 09:44:23 update.go:1365: [INFO] [stacks] update paperless-ngx: phase converting
2026/09/27 09:44:23 pgconvert.go:423: [INFO] [stacks] update paperless-ngx: CONVERTING paperless-postgres PostgreSQL 16 → 18 (volume paperless-ngx_paperless_postgres_data, kept copy paperless-ngx_paperless_postgres_data.pre-update-20260927T094421Z)
2026/09/27 09:44:27 pgconvert.go:468: [INFO] [stacks] update paperless-ngx: pg_dumpall from 16 done in 609ms — 335 kB, completion line present; before: 2 database(s), 72 table(s), 812 row(s)
2026/09/27 09:44:28 update.go:1365: [INFO] [stacks] update paperless-ngx: phase converting
2026/09/27 09:44:28 pgconvert.go:484: [INFO] [stacks] update paperless-ngx: database volume paperless-ngx_paperless_postgres_data emptied (its copy paperless-ngx_paperless_postgres_data.pre-update-20260927T094421Z holds the old datadir, marker checked twice)
2026/09/27 09:44:33 pgconvert.go:513: [INFO] [stacks] update paperless-ngx: loaded into 18 in 2.318s (dropped the entrypoint's empty database(s) [paperless]; skipped CREATE ROLE for [paperless])
2026/09/27 09:44:34 pgconvert.go:529: [INFO] [stacks] update paperless-ngx: CONVERTED 16 → 18 in 10.607s — the check is equal (2 database(s), 72 table(s), 812 row(s)), PG_VERSION 18
2026/09/27 09:44:34 update.go:1365: [INFO] [stacks] update paperless-ngx: phase starting
2026/09/27 09:44:45 update.go:1365: [INFO] [stacks] update paperless-ngx: phase verifying
2026/09/27 09:45:15 update.go:997: [INFO] [stacks] update paperless-ngx: healthy after 30s (the app's health check passed)
2026/09/27 09:45:15 update.go:1015: [INFO] [stacks] update paperless-ngx: KEEPING the pre-conversion datadir copy paperless-ngx_paperless_postgres_data.pre-update-20260927T094421Z (PostgreSQL 16) until a backup of the converted app is proven
2026/09/27 09:45:15 update.go:1033: [INFO] [stacks] update paperless-ngx: DONE in 1m4s
RESULT final_phase=done PG_VERSION=18 seed_after=True verdict=proven
@@ -0,0 +1,5 @@
deploy/reuse paperless-ngx: True
paperless-webserver: createsuperuser :: Superuser created successfully.
paperless-webserver: seeded superuser drill411bd8
paperless-webserver: readback of the seeded account found=True
C1 seed reads back BEFORE: True
@@ -0,0 +1,153 @@
[09:50:59] scratch drive folders cleared before FROM (R-656): none existed
[09:50:59] MV-tandoor: deploying tandoor at FROM {'tandoor': 'ghcr.io/tandoorrecipes/recipes:2.6.15', 'tandoor-postgres': 'postgres:16-alpine'}
[09:52:53] FROM settled=True in 61.9s :: {"tandoor": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "tandoor-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[09:52:53] fixture: the BOX walk's own (Django), through upgrade_boxport
[09:53:03] tandoor: createsuperuser :: Running django-vite in production mode (no HMR) Superuser created successfully.
[09:53:04] tandoor: seeded superuser drill2e9797
[09:53:07] tandoor: readback of the seeded account found=True
[09:53:07] C1 (seed reads back BEFORE): True
[09:53:07] MV-tandoor: PostgreSQL major move {'service': 'tandoor-postgres', 'engine': 'postgres', 'from': 16, 'to': 17} — converting on the bench before the swap
[09:53:31] CONVERTED tandoor-postgres PostgreSQL 16 -> 17 in 23.6s (dump 0.71s / 338574 B, load 3.04s, check equal over 100 tables)
[09:53:31] MV-tandoor: swapping to TO {'tandoor': 'ghcr.io/tandoorrecipes/recipes:2.6.15', 'tandoor-postgres': 'postgres:17-alpine'}
[09:53:35] TO up -d rc=0
[09:54:06] TO settled=True in 31.0s :: {"tandoor": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "tandoor-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[09:54:06] engine state tandoor-postgres: 17
[09:54:07] migration lines observed: 4
[09:54:09] tandoor: readback of the seeded account found=True
[09:54:09] RESULT (seed reads back AFTER): True
[09:54:10] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:80
[09:54:25] + 15s tandoor=951M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=158M/256M peak=183M kills=0 rs=0 reqs=295
[09:54:40] + 30s tandoor=951M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=591
[09:54:55] + 45s tandoor=952M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=887
[09:55:10] + 60s tandoor=952M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=1182
[09:55:25] + 76s tandoor=952M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=1478
[09:55:40] + 91s tandoor=952M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=158M/256M peak=183M kills=0 rs=0 reqs=1773
[09:55:56] + 106s tandoor=952M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=2068
[09:56:11] + 121s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=158M/256M peak=183M kills=0 rs=0 reqs=2363
[09:56:26] + 136s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=2656
[09:56:41] + 151s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=2952
[09:56:56] + 166s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=3248
[09:57:11] + 182s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=3544
[09:57:26] + 197s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=3840
[09:57:42] + 212s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=158M/256M peak=183M kills=0 rs=0 reqs=4136
[09:57:57] + 227s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=158M/256M peak=183M kills=0 rs=0 reqs=4428
[09:58:12] + 242s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=4724
[09:58:27] + 257s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=5020
[09:58:42] + 272s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=159M/256M peak=183M kills=0 rs=0 reqs=5316
[09:58:57] + 288s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=160M/256M peak=183M kills=0 rs=0 reqs=5612
[09:59:12] + 303s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=161M/256M peak=183M kills=0 rs=0 reqs=5908
[09:59:27] + 318s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=161M/256M peak=183M kills=0 rs=0 reqs=6202
[09:59:43] + 333s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=162M/256M peak=183M kills=0 rs=0 reqs=6497
[09:59:58] + 348s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=163M/256M peak=183M kills=0 rs=0 reqs=6793
[10:00:13] + 363s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=7089
[10:00:28] + 378s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=7385
[10:00:43] + 394s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=166M/256M peak=183M kills=0 rs=0 reqs=7681
[10:00:58] + 409s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=7975
[10:01:13] + 424s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=8270
[10:01:29] + 439s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=166M/256M peak=183M kills=0 rs=0 reqs=8566
[10:01:44] + 454s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=8862
[10:01:59] + 469s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=9158
[10:02:14] + 484s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=166M/256M peak=183M kills=0 rs=0 reqs=9454
[10:02:29] + 499s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=9750
[10:02:44] + 514s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=10046
[10:02:59] + 530s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=166M/256M peak=183M kills=0 rs=0 reqs=10342
[10:03:14] + 545s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=10636
[10:03:30] + 560s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=10930
[10:03:45] + 575s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=11226
[10:04:00] + 590s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=11522
[10:04:15] + 605s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=11818
[10:04:15] memory watch: killed=False tight=[] requests=11818 codes={'302': 11818}
[10:04:15] MV-tandoor: ABORT — putting the FROM images back
[10:07:25] ABORT: the app did NOT come back (rc=1, 184.7s)
{
"harness_version": 4,
"edge": "MV-tandoor",
"app": "tandoor",
"note": "night 2026-09-23 within-a-major move: tandoor-postgres=postgres:17-alpine",
"from": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.15",
"tandoor-postgres": "postgres:16-alpine"
},
"to": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.15",
"tandoor-postgres": "postgres:17-alpine"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": "\u001b[2Ktandoor | Migrating database",
"abort": "refuses",
"abort_detail": "rsion 16.15.\n\u001b[2Ktandoor-postgres | \n\u001b[2Ktandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization\n\u001b[2Ktandoor-postgres | \n\u001b[2Ktandoor-postgres | 2026-09-27 12:06:04.351 CEST [1] FATAL: database files are incompatible with server\n\u001b[2Ktandoor-postgres | 2026-09-27 12:06:04.351 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.\n\u001b[2Ktandoor-postgres | \n\u001b[2Ktandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization\n\u001b[2Ktandoor-postgres | \n\u001b[2Ktandoor-postgres | 2026-09-27 12:07:04.677 CEST [1] FATAL: database files are incompatible with server\n\u001b[2Ktandoor-postgres | 2026-09-27 12:07:04.677 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.",
"engine_state_after": {
"tandoor-postgres": {
"image": "postgres:17-alpine",
"probe": "datadir major version",
"answer": "17",
"probe_rc": 0
}
},
"memory": {
"soak_s": 605.6,
"requested_s": 600,
"requests": 11818,
"codes": {
"302": 11818
},
"first_kill": null,
"containers": {
"tandoor": {
"limit": 1073741824,
"peak": 1049731072,
"peak_pct": 0.978,
"anon_peak_sampled": 845176832,
"anon_peak_pct": 0.787,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"tandoor-postgres": {
"limit": 268435456,
"peak": 192729088,
"peak_pct": 0.718,
"anon_peak_sampled": 13815808,
"anon_peak_pct": 0.051,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"load": "reached"
},
"marks": [],
"duration_s": 31.0,
"measured_at": "2026-09-27T10:07:25Z",
"evidence": "evidence/MV-tandoor",
"scratch_cleared": [],
"engine_conversion": {
"service": "tandoor-postgres",
"engine": "postgres",
"from": 16,
"to": 17,
"dump_s": 0.71,
"dump_bytes": 338574,
"new_engine_ready_s": 2.2,
"load_s": 3.04,
"dropped": [
"tandoor"
],
"skipped_create_role": [
"CREATE ROLE tandoor;"
],
"result": "converted",
"check_equal": true,
"pg_version": "17",
"tables": 100,
"convert_s": 23.6
},
"files_changed": [],
"total_s": 985.7
}
@@ -0,0 +1,40 @@
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:04:21.604 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:04:21.604 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:04:23.533 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:04:23.533 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:04:27.053 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:04:27.053 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:04:33.779 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:04:33.779 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:04:46.906 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:04:46.906 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:05:12.828 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:05:12.828 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:06:04.351 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:06:04.351 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:07:04.677 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:07:04.677 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
@@ -0,0 +1,14 @@
{
"tandoor": {
"status": "created",
"health": null,
"restarts": 0,
"exit": 0
},
"tandoor-postgres": {
"status": "restarting",
"health": "unhealthy",
"restarts": 0,
"exit": 1
}
}
@@ -0,0 +1,60 @@
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:04:18.773 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:04:18.773 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:04:19.223 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:04:19.223 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:04:19.775 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:04:19.775 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:04:20.491 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:04:20.491 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:04:21.604 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:04:21.604 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:04:23.533 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:04:23.533 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:04:27.053 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:04:27.053 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:04:33.779 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:04:33.779 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:04:46.906 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:04:46.906 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:05:12.828 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:05:12.828 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:06:04.351 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:06:04.351 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-27 12:07:04.677 CEST [1] FATAL: database files are incompatible with server
tandoor-postgres | 2026-09-27 12:07:04.677 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.
@@ -0,0 +1,106 @@
db:postgres owner=tandoor enc=UTF8 coll=en_US.utf8
db:tandoor owner=tandoor enc=UTF8 coll=en_US.utf8
ext:tandoor:pg_trgm
ext:tandoor:plpgsql
ext:tandoor:unaccent
role:tandoor super=true login=true pw=true
rows:tandoor:public.account_emailaddress=0
rows:tandoor:public.account_emailconfirmation=0
rows:tandoor:public.auth_group=3
rows:tandoor:public.auth_group_permissions=0
rows:tandoor:public.auth_permission=288
rows:tandoor:public.auth_user=1
rows:tandoor:public.auth_user_groups=0
rows:tandoor:public.auth_user_user_permissions=0
rows:tandoor:public.authtoken_token=0
rows:tandoor:public.cookbook_ailog=0
rows:tandoor:public.cookbook_aiprovider=0
rows:tandoor:public.cookbook_automation=0
rows:tandoor:public.cookbook_bookmarkletimport=0
rows:tandoor:public.cookbook_comment=0
rows:tandoor:public.cookbook_connectorconfig=0
rows:tandoor:public.cookbook_cooklog=0
rows:tandoor:public.cookbook_customfilter=0
rows:tandoor:public.cookbook_customfilter_shared=0
rows:tandoor:public.cookbook_exportlog=0
rows:tandoor:public.cookbook_food=0
rows:tandoor:public.cookbook_food_child_inherit_fields=0
rows:tandoor:public.cookbook_food_inherit_fields=0
rows:tandoor:public.cookbook_food_onhand_users=0
rows:tandoor:public.cookbook_food_shopping_lists=0
rows:tandoor:public.cookbook_food_substitute=0
rows:tandoor:public.cookbook_foodinheritfield=6
rows:tandoor:public.cookbook_foodproperty=0
rows:tandoor:public.cookbook_household=0
rows:tandoor:public.cookbook_importlog=0
rows:tandoor:public.cookbook_ingredient=0
rows:tandoor:public.cookbook_inventoryentry=0
rows:tandoor:public.cookbook_inventorylocation=0
rows:tandoor:public.cookbook_inventorylog=0
rows:tandoor:public.cookbook_invitelink=0
rows:tandoor:public.cookbook_keyword=0
rows:tandoor:public.cookbook_mealplan=0
rows:tandoor:public.cookbook_mealplan_shared=0
rows:tandoor:public.cookbook_mealtype=0
rows:tandoor:public.cookbook_nutritioninformation=0
rows:tandoor:public.cookbook_property=0
rows:tandoor:public.cookbook_propertytype=0
rows:tandoor:public.cookbook_recipe=0
rows:tandoor:public.cookbook_recipe_keywords=0
rows:tandoor:public.cookbook_recipe_properties=0
rows:tandoor:public.cookbook_recipe_shared=0
rows:tandoor:public.cookbook_recipe_steps=0
rows:tandoor:public.cookbook_recipebook=0
rows:tandoor:public.cookbook_recipebook_shared=0
rows:tandoor:public.cookbook_recipebookentry=0
rows:tandoor:public.cookbook_recipeimport=0
rows:tandoor:public.cookbook_searchfields=6
rows:tandoor:public.cookbook_searchpreference=0
rows:tandoor:public.cookbook_searchpreference_fulltext=0
rows:tandoor:public.cookbook_searchpreference_icontains=0
rows:tandoor:public.cookbook_searchpreference_istartswith=0
rows:tandoor:public.cookbook_searchpreference_trigram=0
rows:tandoor:public.cookbook_searchpreference_unaccent=0
rows:tandoor:public.cookbook_sharelink=0
rows:tandoor:public.cookbook_shoppinglist=0
rows:tandoor:public.cookbook_shoppinglistentry=0
rows:tandoor:public.cookbook_shoppinglistentry_shopping_lists=0
rows:tandoor:public.cookbook_shoppinglistrecipe=0
rows:tandoor:public.cookbook_space=0
rows:tandoor:public.cookbook_space_food_inherit=0
rows:tandoor:public.cookbook_step=0
rows:tandoor:public.cookbook_step_ingredients=0
rows:tandoor:public.cookbook_storage=0
rows:tandoor:public.cookbook_supermarket=0
rows:tandoor:public.cookbook_supermarket_shopping_lists=0
rows:tandoor:public.cookbook_supermarketcategory=0
rows:tandoor:public.cookbook_supermarketcategoryrelation=0
rows:tandoor:public.cookbook_sync=0
rows:tandoor:public.cookbook_synclog=0
rows:tandoor:public.cookbook_telegrambot=0
rows:tandoor:public.cookbook_unit=0
rows:tandoor:public.cookbook_unitconversion=0
rows:tandoor:public.cookbook_userfile=0
rows:tandoor:public.cookbook_userpreference=1
rows:tandoor:public.cookbook_userpreference_plan_share=0
rows:tandoor:public.cookbook_userpreference_shopping_share=0
rows:tandoor:public.cookbook_userspace=0
rows:tandoor:public.cookbook_userspace_groups=0
rows:tandoor:public.cookbook_viewlog=0
rows:tandoor:public.django_admin_log=0
rows:tandoor:public.django_content_type=72
rows:tandoor:public.django_migrations=309
rows:tandoor:public.django_session=0
rows:tandoor:public.django_site=1
rows:tandoor:public.mfa_authenticator=0
rows:tandoor:public.oauth2_provider_accesstoken=0
rows:tandoor:public.oauth2_provider_application=0
rows:tandoor:public.oauth2_provider_devicegrant=0
rows:tandoor:public.oauth2_provider_grant=0
rows:tandoor:public.oauth2_provider_idtoken=0
rows:tandoor:public.oauth2_provider_refreshtoken=0
rows:tandoor:public.socialaccount_socialaccount=0
rows:tandoor:public.socialaccount_socialapp=0
rows:tandoor:public.socialaccount_socialapp_sites=0
rows:tandoor:public.socialaccount_socialtoken=0
rows:tandoor:public.usersessions_usersession=0
@@ -0,0 +1,106 @@
db:postgres owner=tandoor enc=UTF8 coll=en_US.utf8
db:tandoor owner=tandoor enc=UTF8 coll=en_US.utf8
ext:tandoor:pg_trgm
ext:tandoor:plpgsql
ext:tandoor:unaccent
role:tandoor super=true login=true pw=true
rows:tandoor:public.account_emailaddress=0
rows:tandoor:public.account_emailconfirmation=0
rows:tandoor:public.auth_group=3
rows:tandoor:public.auth_group_permissions=0
rows:tandoor:public.auth_permission=288
rows:tandoor:public.auth_user=1
rows:tandoor:public.auth_user_groups=0
rows:tandoor:public.auth_user_user_permissions=0
rows:tandoor:public.authtoken_token=0
rows:tandoor:public.cookbook_ailog=0
rows:tandoor:public.cookbook_aiprovider=0
rows:tandoor:public.cookbook_automation=0
rows:tandoor:public.cookbook_bookmarkletimport=0
rows:tandoor:public.cookbook_comment=0
rows:tandoor:public.cookbook_connectorconfig=0
rows:tandoor:public.cookbook_cooklog=0
rows:tandoor:public.cookbook_customfilter=0
rows:tandoor:public.cookbook_customfilter_shared=0
rows:tandoor:public.cookbook_exportlog=0
rows:tandoor:public.cookbook_food=0
rows:tandoor:public.cookbook_food_child_inherit_fields=0
rows:tandoor:public.cookbook_food_inherit_fields=0
rows:tandoor:public.cookbook_food_onhand_users=0
rows:tandoor:public.cookbook_food_shopping_lists=0
rows:tandoor:public.cookbook_food_substitute=0
rows:tandoor:public.cookbook_foodinheritfield=6
rows:tandoor:public.cookbook_foodproperty=0
rows:tandoor:public.cookbook_household=0
rows:tandoor:public.cookbook_importlog=0
rows:tandoor:public.cookbook_ingredient=0
rows:tandoor:public.cookbook_inventoryentry=0
rows:tandoor:public.cookbook_inventorylocation=0
rows:tandoor:public.cookbook_inventorylog=0
rows:tandoor:public.cookbook_invitelink=0
rows:tandoor:public.cookbook_keyword=0
rows:tandoor:public.cookbook_mealplan=0
rows:tandoor:public.cookbook_mealplan_shared=0
rows:tandoor:public.cookbook_mealtype=0
rows:tandoor:public.cookbook_nutritioninformation=0
rows:tandoor:public.cookbook_property=0
rows:tandoor:public.cookbook_propertytype=0
rows:tandoor:public.cookbook_recipe=0
rows:tandoor:public.cookbook_recipe_keywords=0
rows:tandoor:public.cookbook_recipe_properties=0
rows:tandoor:public.cookbook_recipe_shared=0
rows:tandoor:public.cookbook_recipe_steps=0
rows:tandoor:public.cookbook_recipebook=0
rows:tandoor:public.cookbook_recipebook_shared=0
rows:tandoor:public.cookbook_recipebookentry=0
rows:tandoor:public.cookbook_recipeimport=0
rows:tandoor:public.cookbook_searchfields=6
rows:tandoor:public.cookbook_searchpreference=0
rows:tandoor:public.cookbook_searchpreference_fulltext=0
rows:tandoor:public.cookbook_searchpreference_icontains=0
rows:tandoor:public.cookbook_searchpreference_istartswith=0
rows:tandoor:public.cookbook_searchpreference_trigram=0
rows:tandoor:public.cookbook_searchpreference_unaccent=0
rows:tandoor:public.cookbook_sharelink=0
rows:tandoor:public.cookbook_shoppinglist=0
rows:tandoor:public.cookbook_shoppinglistentry=0
rows:tandoor:public.cookbook_shoppinglistentry_shopping_lists=0
rows:tandoor:public.cookbook_shoppinglistrecipe=0
rows:tandoor:public.cookbook_space=0
rows:tandoor:public.cookbook_space_food_inherit=0
rows:tandoor:public.cookbook_step=0
rows:tandoor:public.cookbook_step_ingredients=0
rows:tandoor:public.cookbook_storage=0
rows:tandoor:public.cookbook_supermarket=0
rows:tandoor:public.cookbook_supermarket_shopping_lists=0
rows:tandoor:public.cookbook_supermarketcategory=0
rows:tandoor:public.cookbook_supermarketcategoryrelation=0
rows:tandoor:public.cookbook_sync=0
rows:tandoor:public.cookbook_synclog=0
rows:tandoor:public.cookbook_telegrambot=0
rows:tandoor:public.cookbook_unit=0
rows:tandoor:public.cookbook_unitconversion=0
rows:tandoor:public.cookbook_userfile=0
rows:tandoor:public.cookbook_userpreference=1
rows:tandoor:public.cookbook_userpreference_plan_share=0
rows:tandoor:public.cookbook_userpreference_shopping_share=0
rows:tandoor:public.cookbook_userspace=0
rows:tandoor:public.cookbook_userspace_groups=0
rows:tandoor:public.cookbook_viewlog=0
rows:tandoor:public.django_admin_log=0
rows:tandoor:public.django_content_type=72
rows:tandoor:public.django_migrations=309
rows:tandoor:public.django_session=0
rows:tandoor:public.django_site=1
rows:tandoor:public.mfa_authenticator=0
rows:tandoor:public.oauth2_provider_accesstoken=0
rows:tandoor:public.oauth2_provider_application=0
rows:tandoor:public.oauth2_provider_devicegrant=0
rows:tandoor:public.oauth2_provider_grant=0
rows:tandoor:public.oauth2_provider_idtoken=0
rows:tandoor:public.oauth2_provider_refreshtoken=0
rows:tandoor:public.socialaccount_socialaccount=0
rows:tandoor:public.socialaccount_socialapp=0
rows:tandoor:public.socialaccount_socialapp_sites=0
rows:tandoor:public.socialaccount_socialtoken=0
rows:tandoor:public.usersessions_usersession=0
@@ -0,0 +1,8 @@
{
"tandoor-postgres": {
"image": "postgres:17-alpine",
"probe": "datadir major version",
"answer": "17",
"probe_rc": 0
}
}
@@ -0,0 +1,4 @@
tandoor | Migrating database
tandoor | Apply all migrations: account, admin, auth, authtoken, contenttypes, cookbook, mfa, oauth2_provider, sessions, sites, socialaccount, usersessions
tandoor | Running migrations:
tandoor | No migrations to apply.
@@ -0,0 +1,61 @@
[09:50:59] scratch drive folders cleared before FROM (R-656): none existed
[09:50:59] MV-tandoor: deploying tandoor at FROM {'tandoor': 'ghcr.io/tandoorrecipes/recipes:2.6.15', 'tandoor-postgres': 'postgres:16-alpine'}
[09:52:53] FROM settled=True in 61.9s :: {"tandoor": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "tandoor-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[09:52:53] fixture: the BOX walk's own (Django), through upgrade_boxport
[09:53:03] tandoor: createsuperuser :: Running django-vite in production mode (no HMR) Superuser created successfully.
[09:53:04] tandoor: seeded superuser drill2e9797
[09:53:07] tandoor: readback of the seeded account found=True
[09:53:07] C1 (seed reads back BEFORE): True
[09:53:07] MV-tandoor: PostgreSQL major move {'service': 'tandoor-postgres', 'engine': 'postgres', 'from': 16, 'to': 17} — converting on the bench before the swap
[09:53:31] CONVERTED tandoor-postgres PostgreSQL 16 -> 17 in 23.6s (dump 0.71s / 338574 B, load 3.04s, check equal over 100 tables)
[09:53:31] MV-tandoor: swapping to TO {'tandoor': 'ghcr.io/tandoorrecipes/recipes:2.6.15', 'tandoor-postgres': 'postgres:17-alpine'}
[09:53:35] TO up -d rc=0
[09:54:06] TO settled=True in 31.0s :: {"tandoor": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "tandoor-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[09:54:06] engine state tandoor-postgres: 17
[09:54:07] migration lines observed: 4
[09:54:09] tandoor: readback of the seeded account found=True
[09:54:09] RESULT (seed reads back AFTER): True
[09:54:10] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:80
[09:54:25] + 15s tandoor=951M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=158M/256M peak=183M kills=0 rs=0 reqs=295
[09:54:40] + 30s tandoor=951M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=591
[09:54:55] + 45s tandoor=952M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=887
[09:55:10] + 60s tandoor=952M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=1182
[09:55:25] + 76s tandoor=952M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=1478
[09:55:40] + 91s tandoor=952M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=158M/256M peak=183M kills=0 rs=0 reqs=1773
[09:55:56] + 106s tandoor=952M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=2068
[09:56:11] + 121s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=158M/256M peak=183M kills=0 rs=0 reqs=2363
[09:56:26] + 136s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=2656
[09:56:41] + 151s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=2952
[09:56:56] + 166s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=3248
[09:57:11] + 182s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=3544
[09:57:26] + 197s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=3840
[09:57:42] + 212s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=158M/256M peak=183M kills=0 rs=0 reqs=4136
[09:57:57] + 227s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=158M/256M peak=183M kills=0 rs=0 reqs=4428
[09:58:12] + 242s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=4724
[09:58:27] + 257s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=157M/256M peak=183M kills=0 rs=0 reqs=5020
[09:58:42] + 272s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=159M/256M peak=183M kills=0 rs=0 reqs=5316
[09:58:57] + 288s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=160M/256M peak=183M kills=0 rs=0 reqs=5612
[09:59:12] + 303s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=161M/256M peak=183M kills=0 rs=0 reqs=5908
[09:59:27] + 318s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=161M/256M peak=183M kills=0 rs=0 reqs=6202
[09:59:43] + 333s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=162M/256M peak=183M kills=0 rs=0 reqs=6497
[09:59:58] + 348s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=163M/256M peak=183M kills=0 rs=0 reqs=6793
[10:00:13] + 363s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=7089
[10:00:28] + 378s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=7385
[10:00:43] + 394s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=166M/256M peak=183M kills=0 rs=0 reqs=7681
[10:00:58] + 409s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=7975
[10:01:13] + 424s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=8270
[10:01:29] + 439s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=166M/256M peak=183M kills=0 rs=0 reqs=8566
[10:01:44] + 454s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=8862
[10:01:59] + 469s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=9158
[10:02:14] + 484s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=166M/256M peak=183M kills=0 rs=0 reqs=9454
[10:02:29] + 499s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=9750
[10:02:44] + 514s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=10046
[10:02:59] + 530s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=166M/256M peak=183M kills=0 rs=0 reqs=10342
[10:03:14] + 545s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=10636
[10:03:30] + 560s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=10930
[10:03:45] + 575s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=11226
[10:04:00] + 590s tandoor=954M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=11522
[10:04:15] + 605s tandoor=955M/1024M peak=1001M kills=0 rs=0 tandoor-postgres=165M/256M peak=183M kills=0 rs=0 reqs=11818
[10:04:15] memory watch: killed=False tight=[] requests=11818 codes={'302': 11818}
[10:04:15] MV-tandoor: ABORT — putting the FROM images back
[10:07:25] ABORT: the app did NOT come back (rc=1, 184.7s)
@@ -0,0 +1,14 @@
{
"tandoor": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
},
"tandoor-postgres": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
}
}
@@ -0,0 +1,92 @@
{
"harness_version": 4,
"edge": "MV-tandoor",
"app": "tandoor",
"note": "night 2026-09-23 within-a-major move: tandoor-postgres=postgres:17-alpine",
"from": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.15",
"tandoor-postgres": "postgres:16-alpine"
},
"to": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.15",
"tandoor-postgres": "postgres:17-alpine"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": "\u001b[2Ktandoor | Migrating database",
"abort": "refuses",
"abort_detail": "rsion 16.15.\n\u001b[2Ktandoor-postgres | \n\u001b[2Ktandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization\n\u001b[2Ktandoor-postgres | \n\u001b[2Ktandoor-postgres | 2026-09-27 12:06:04.351 CEST [1] FATAL: database files are incompatible with server\n\u001b[2Ktandoor-postgres | 2026-09-27 12:06:04.351 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.\n\u001b[2Ktandoor-postgres | \n\u001b[2Ktandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization\n\u001b[2Ktandoor-postgres | \n\u001b[2Ktandoor-postgres | 2026-09-27 12:07:04.677 CEST [1] FATAL: database files are incompatible with server\n\u001b[2Ktandoor-postgres | 2026-09-27 12:07:04.677 CEST [1] DETAIL: The data directory was initialized by PostgreSQL version 17, which is not compatible with this version 16.15.",
"engine_state_after": {
"tandoor-postgres": {
"image": "postgres:17-alpine",
"probe": "datadir major version",
"answer": "17",
"probe_rc": 0
}
},
"memory": {
"soak_s": 605.6,
"requested_s": 600,
"requests": 11818,
"codes": {
"302": 11818
},
"first_kill": null,
"containers": {
"tandoor": {
"limit": 1073741824,
"peak": 1049731072,
"peak_pct": 0.978,
"anon_peak_sampled": 845176832,
"anon_peak_pct": 0.787,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"tandoor-postgres": {
"limit": 268435456,
"peak": 192729088,
"peak_pct": 0.718,
"anon_peak_sampled": 13815808,
"anon_peak_pct": 0.051,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"load": "reached"
},
"marks": [],
"duration_s": 31.0,
"measured_at": "2026-09-27T10:07:25Z",
"evidence": "evidence/MV-tandoor",
"scratch_cleared": [],
"engine_conversion": {
"service": "tandoor-postgres",
"engine": "postgres",
"from": 16,
"to": 17,
"dump_s": 0.71,
"dump_bytes": 338574,
"new_engine_ready_s": 2.2,
"load_s": 3.04,
"dropped": [
"tandoor"
],
"skipped_create_role": [
"CREATE ROLE tandoor;"
],
"result": "converted",
"check_equal": true,
"pg_version": "17",
"tables": 100,
"convert_s": 23.6
},
"files_changed": [],
"total_s": 985.7
}
@@ -0,0 +1,27 @@
{
"app": "tandoor",
"venue": "box 9202 (drill catalog, controller 0.275.0-rc1), the product's guarded Update",
"from": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.15",
"tandoor-postgres": "postgres:16-alpine"
},
"to": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.15",
"tandoor-postgres": "postgres:17-alpine"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"engine_conversion": {
"service": "tandoor-postgres",
"engine": "postgres",
"from": 16,
"to": 17,
"result": "converted",
"controller_line": "update tandoor: CONVERTED 16 \u2192 17 in 11.418s \u2014 the check is equal (2 database(s), 100 table(s), 687 row(s)), PG_VERSION 17"
},
"duration_s": 52.4,
"measured_at": "2026-09-27T09:38:08Z",
"evidence": "felhom.eu/documentation/audits/version-travel-2026-09-26/B/apps/tandoor/box/move.txt"
}
@@ -0,0 +1,43 @@
before: pinned={'tandoor': 'ghcr.io/tandoorrecipes/recipes:2.6.15', 'tandoor-postgres': 'postgres:16-alpine'} PG_VERSION=16
drill: 19b57b1 DRILL tandoor: tandoor-postgres postgres:16-alpine -> postgres:17-alpine with the engine_conversion mark (box proof)
phase +0.0s safety-dump | err=None
phase +3.1s pulling | err=None
phase +4.1s copying | err=None
phase +10.3s converting | err=None
phase +21.6s starting | err=None
phase +22.6s verifying | err=None
phase +52.3s done | err=None
tandoor: readback of the seeded account found=True
2026/09/27 09:38:09 update.go:536: [INFO] [stacks] update tandoor: accepted — guarded update started
2026/09/27 09:38:09 update.go:1365: [INFO] [stacks] update tandoor: phase checking
2026/09/27 09:38:09 update.go:786: [INFO] [stacks] update tandoor: ladder — the last step (2 of 2) — the catalog's current definition
2026/09/27 09:38:09 update.go:800: [INFO] [stacks] update tandoor: this step CONVERTS tandoor-postgres PostgreSQL 16 → 17 (the ladder entry's mark); database volume tandoor_tandoor_postgres_data
2026/09/27 09:38:09 update.go:814: [INFO] [stacks] update tandoor: precondition met — Tier 1 (own recovery unit) copy from 2026-09-27T09:36:36Z (2m0s old, limit 24h0m0s)
2026/09/27 09:38:09 update.go:1365: [INFO] [stacks] update tandoor: phase safety-dump
2026/09/27 09:38:09 update.go:846: [INFO] [stacks] update tandoor: safety dump done (1 file(s)) [/mnt/sys_drive/felhom-data/backups/primary/tandoor/db-dumps/pre-restore-20260927T093809Z-tandoor-postgres.sql]
2026/09/27 09:38:11 undo.go:287: [INFO] [stacks] update tandoor: the undo copy will hold 3 named volume(s), 141.0 MiB
2026/09/27 09:38:11 pgconvert.go:340: [INFO] [stacks] update tandoor: conversion space — database volume tandoor_tandoor_postgres_data is 53 MB; the dump needs up to 66 MB + the 2 GB floor; 27.7 GB free beside the stack dir
2026/09/27 09:38:11 update.go:1365: [INFO] [stacks] update tandoor: phase pinning
2026/09/27 09:38:11 pin.go:373: [INFO] [stacks] update tandoor: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/tandoor/docker-compose.yml (tandoor=ghcr.io/tandoorrecipes/recipes:2.6.15, tandoor-postgres=postgres:17-alpine)
2026/09/27 09:38:11 update.go:1365: [INFO] [stacks] update tandoor: phase pulling
2026/09/27 09:38:13 update.go:1365: [INFO] [stacks] update tandoor: phase copying
2026/09/27 09:38:16 update.go:1365: [INFO] [stacks] update tandoor: phase copying
2026/09/27 09:38:16 undo.go:437: [INFO] [stacks] update tandoor: copied tandoor_tandoor_media → tandoor_tandoor_media.pre-update-20260927T093816Z in 473ms
2026/09/27 09:38:16 update.go:1365: [INFO] [stacks] update tandoor: phase copying
2026/09/27 09:38:17 undo.go:437: [INFO] [stacks] update tandoor: copied tandoor_tandoor_postgres_data → tandoor_tandoor_postgres_data.pre-update-20260927T093816Z in 741ms
2026/09/27 09:38:17 update.go:1365: [INFO] [stacks] update tandoor: phase copying
2026/09/27 09:38:18 undo.go:437: [INFO] [stacks] update tandoor: copied tandoor_tandoor_static → tandoor_tandoor_static.pre-update-20260927T093816Z in 1.445s
2026/09/27 09:38:18 update.go:1365: [INFO] [stacks] update tandoor: phase converting
2026/09/27 09:38:18 pgconvert.go:423: [INFO] [stacks] update tandoor: CONVERTING tandoor-postgres PostgreSQL 16 → 17 (volume tandoor_tandoor_postgres_data, kept copy tandoor_tandoor_postgres_data.pre-update-20260927T093816Z)
2026/09/27 09:38:22 pgconvert.go:468: [INFO] [stacks] update tandoor: pg_dumpall from 16 done in 603ms — 330 kB, completion line present; before: 2 database(s), 100 table(s), 687 row(s)
2026/09/27 09:38:22 update.go:1365: [INFO] [stacks] update tandoor: phase converting
2026/09/27 09:38:23 pgconvert.go:484: [INFO] [stacks] update tandoor: database volume tandoor_tandoor_postgres_data emptied (its copy tandoor_tandoor_postgres_data.pre-update-20260927T093816Z holds the old datadir, marker checked twice)
2026/09/27 09:38:29 pgconvert.go:513: [INFO] [stacks] update tandoor: loaded into 17 in 3.111s (dropped the entrypoint's empty database(s) [tandoor]; skipped CREATE ROLE for [tandoor])
2026/09/27 09:38:30 pgconvert.go:529: [INFO] [stacks] update tandoor: CONVERTED 16 → 17 in 11.418s — the check is equal (2 database(s), 100 table(s), 687 row(s)), PG_VERSION 17
2026/09/27 09:38:30 update.go:1365: [INFO] [stacks] update tandoor: phase starting
2026/09/27 09:38:31 update.go:1365: [INFO] [stacks] update tandoor: phase verifying
2026/09/27 09:39:01 update.go:997: [INFO] [stacks] update tandoor: healthy after 30s (the app's health check passed)
2026/09/27 09:39:01 update.go:1015: [INFO] [stacks] update tandoor: KEEPING the pre-conversion datadir copy tandoor_tandoor_postgres_data.pre-update-20260927T093816Z (PostgreSQL 16) until a backup of the converted app is proven
2026/09/27 09:39:01 update.go:1033: [INFO] [stacks] update tandoor: DONE in 52s
RESULT final_phase=done PG_VERSION=17 seed_after=True verdict=proven
@@ -0,0 +1,5 @@
deploy/reuse tandoor: True
tandoor: createsuperuser :: Running django-vite in production mode (no HMR) Superuser created successfully.
tandoor: seeded superuser drill8e586d
tandoor: readback of the seeded account found=True
C1 seed reads back BEFORE: True
@@ -0,0 +1,5 @@
11:33:40 START paperless-ngx ['paperless-postgres=postgres:18-alpine']
11:50:54 DONE paperless-ngx rc=0 verdict=proven read_before=True read_after=True abort=refuses marks=[] peaks={'paperless-postgres': 0.72, 'paperless-redis': 0.054, 'paperless-webserver': 0.492} detail='less-postgres | The files belonging to this database system will be owned by user "postgres".\n\x1b[2Kpaperless-postgres | This user must also own the server proc' (1034s)
11:50:54 START tandoor ['tandoor-postgres=postgres:17-alpine']
12:07:29 DONE tandoor rc=0 verdict=proven read_before=True read_after=True abort=refuses marks=[] peaks={'tandoor': 0.978, 'tandoor-postgres': 0.718} detail='rsion 16.15.\n\x1b[2Ktandoor-postgres | \n\x1b[2Ktandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization\n\x1b[2Ktandoor-p' (995s)
12:07:29 QUEUE q1 FINISHED
@@ -0,0 +1,24 @@
== frontend v0.12.1 healthcheck: null
/usr/bin/node: ABSENT
/nodejs/bin/node: present (v22.22.0)
/usr/local/bin/node: ABSENT
== backend v0.12.1 healthcheck: null user=
== frontend v0.13.0 healthcheck: {"Test":["CMD","node","-e","fetch('http://127.0.0.1:3000/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"],"Interval":30000000000,"Timeout":5000000000,"StartPeriod":30000000000,"Retries":3}
/usr/bin/node: present (v26.3.0)
/nodejs/bin/node: ABSENT
/usr/local/bin/node: ABSENT
== backend v0.13.0 healthcheck: {"Test":["CMD-SHELL","python3 -c \"import urllib.request; urllib.request.urlopen('http://localhost:80/health/')\""],"Interval":15000000000,"Timeout":5000000000,"StartPeriod":60000000000,"Retries":5} user=
== v0.12.1 PATH=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
exec 'node' on PATH: FAILS
== v0.13.0 PATH=PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin
exec 'node' on PATH: works (v26.3.0)
== backend v0.12.1 ENTRYPOINT=["/code/entrypoint.sh"] CMD=["supervisord","-c","/etc/supervisor/conf.d/supervisord.conf"]
ijson 3.3.0
/bin/bash
/code/main/settings.py:398:COUNTRY_REGION_JSON_VERSION = 'v3.1'
/code/main/settings.py:398:COUNTRY_REGION_JSON_VERSION = 'v3.1'
== backend v0.13.0 ENTRYPOINT=["/code/entrypoint.sh"] CMD=["supervisord","-c","/etc/supervisor/conf.d/supervisord.conf"]
ijson 3.3.0
/bin/bash
/code/main/settings.py:470:COUNTRY_REGION_JSON_VERSION = 'v3.1'
/code/main/settings.py:470:COUNTRY_REGION_JSON_VERSION = 'v3.1'
@@ -0,0 +1,29 @@
# 1. clean start, the image's own entrypoint (downloads the world data) — 10:30:34
state: running health=healthy restarts=0
file: 46724025 bytes
# 2. the file cut to half, the image's own entrypoint — 10:32:51
truncated to 23362012 of 46724025 bytes
after 120 s: running health=healthy restarts=0
1 Running download-countries (first boot may take several minutes; ensure ~2GB RAM is available)...
# 3. OUR template's start (the set-aside step), same volume — 10:34:54
state: running health=healthy restarts=0
felhom: /code/media/countries+regions+states-v3.1.json did not parse to its end - set aside, it is downloaded again
JSON file downloaded successfully
46724025 countries+regions+states-v3.1.json
23362012 countries+regions+states-v3.1.json.cutoff-20260927103501
# 4. a second start with the repaired file (nothing set aside) — 10:38:02
state: running health=healthy restarts=0
set-aside lines on the second start: 0
# 5. an import still PENDING (a fresh database) + the file cut to half, the image's own entrypoint — 10:38:59
truncated to 23362012 of 46724025 bytes
after 150 s: running health=starting restarts=10
10 raise common.IncompleteJSONError('Incomplete JSON content')
10 ijson.common.IncompleteJSONError: Incomplete JSON content
# 6. OUR template's start on the same state — 10:41:43
state: running health=healthy restarts=0
1 JSON file downloaded successfully
1 felhom: /code/media/countries+regions+states-v3.1.json did not parse to its end - set aside, it is downloaded again
46724025 countries+regions+states-v3.1.json
23362012 countries+regions+states-v3.1.json.cutoff-20260927103501
23362012 countries+regions+states-v3.1.json.cutoff-20260927104158
trunc volumes left: 0
@@ -0,0 +1,17 @@
# C — adventurelog v0.12.1 → v0.13.0 (R-655, `09` §3 decision 41)
- **Images (`C1-images.txt`).** Frontend v0.12.1: no image healthcheck, node only at `/nodejs/bin/node` (not on the PATH);
v0.13.0: its own healthcheck (`node` on the PATH → `/usr/bin/node`, fetching `/health`). No single exec path works on
both → the override is DROPPED. Backends: same entrypoint and CMD, `ijson` 3.3.0 in both, the same file
`countries+regions+states-v3.1.json` in `/code/media`.
- **The cut-off file (`C2-truncated-file.txt`).** With the data already imported, v0.13.0 does not read the file ("Latest data
already imported") — a cut-off file does no harm there (measured, step 2). With an import PENDING (fresh database) and the
file cut to half, the image's own start crash-looped **10 times in 150 s on `IncompleteJSONError`**; with the template's
set-aside step the file was renamed `….cutoff-<time>`, downloaded again (46,724,025 B) and the app was healthy; a second
start set nothing aside. The update's first start does NOT repair the file; the template does.
- **Bench (`apps/adventurelog/bench/`)**: FROM healthy (world data downloaded by v0.12.1); TO healthy in 217 s, "Latest data
already imported", 6 migration lines, seed ✓, anon peaks backend 73.0 %, frontend 37.9 %; 0 restarts.
- **Box 9202 (`apps/adventurelog/box/`)**: first press under the drill's 90 s health wait → the backend was still starting →
UNDONE correctly in 36 s, seed intact (`move.txt`). With the product's default 5-min wait → done in 204 s, the file reused,
seed ✓, all three healthy (`move2-5m.txt`). The fresh install got `backing-up` first — R-699 working.
- Catalog `06ea7da`: the move, the dropped override and the set-aside step in ONE commit.
@@ -0,0 +1,136 @@
[10:12:57] scratch drive folders cleared before FROM (R-656): none existed
[10:12:57] MV-adventurelog: deploying adventurelog at FROM {'adventurelog': 'ghcr.io/seanmorley15/adventurelog-backend:v0.12.1', 'adventurelog-postgres': 'postgis/postgis:16-3.5-alpine', 'adventurelog-frontend': 'ghcr.io/seanmorley15/adventurelog-frontend:v0.12.1'}
[10:14:55] FROM settled=True in 93.2s :: {"adventurelog": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "adventurelog-frontend": {"status": "running", "health": null, "restarts": 0, "exit": 0}, "adventurelog-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[10:14:55] fixture: the BOX walk's own (Django), through upgrade_boxport
[10:14:58] adventurelog: createsuperuser :: Superuser created successfully.
[10:15:00] adventurelog: seeded superuser drill2a47a0
[10:15:05] adventurelog: readback of the seeded account found=True
[10:15:05] C1 (seed reads back BEFORE): True
[10:15:06] MV-adventurelog: swapping to TO {'adventurelog': 'ghcr.io/seanmorley15/adventurelog-backend:v0.13.0', 'adventurelog-postgres': 'postgis/postgis:16-3.5-alpine', 'adventurelog-frontend': 'ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0'}
[10:15:09] TO up -d rc=0
[10:18:45] TO settled=True in 216.9s :: {"adventurelog": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "adventurelog-frontend": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "adventurelog-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[10:18:46] migration lines observed: 6
[10:18:49] adventurelog: readback of the seeded account found=True
[10:18:49] RESULT (seed reads back AFTER): True
[10:18:50] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:3000
[10:19:05] + 15s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=44M/256M peak=44M kills=0 rs=0 adventurelog-postgres=244M/256M peak=256M kills=0 rs=0 reqs=300
[10:19:20] + 30s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=53M/256M peak=67M kills=0 rs=0 adventurelog-postgres=250M/256M peak=256M kills=0 rs=0 reqs=596
[10:19:35] + 46s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=54M/256M peak=67M kills=0 rs=0 adventurelog-postgres=254M/256M peak=256M kills=0 rs=0 reqs=896
[10:19:50] + 61s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=59M/256M peak=75M kills=0 rs=0 adventurelog-postgres=254M/256M peak=256M kills=0 rs=0 reqs=1196
[10:20:06] + 76s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=59M/256M peak=75M kills=0 rs=0 adventurelog-postgres=253M/256M peak=256M kills=0 rs=0 reqs=1493
[10:20:21] + 91s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=61M/256M peak=77M kills=0 rs=0 adventurelog-postgres=253M/256M peak=256M kills=0 rs=0 reqs=1792
[10:20:36] + 106s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=64M/256M peak=77M kills=0 rs=0 adventurelog-postgres=254M/256M peak=256M kills=0 rs=0 reqs=2092
[10:20:51] + 121s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=65M/256M peak=81M kills=0 rs=0 adventurelog-postgres=252M/256M peak=256M kills=0 rs=0 reqs=2392
[10:21:06] + 136s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=65M/256M peak=81M kills=0 rs=0 adventurelog-postgres=254M/256M peak=256M kills=0 rs=0 reqs=2688
[10:21:21] + 152s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=65M/256M peak=82M kills=0 rs=0 adventurelog-postgres=255M/256M peak=256M kills=0 rs=0 reqs=2988
[10:21:36] + 167s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=67M/256M peak=82M kills=0 rs=0 adventurelog-postgres=253M/256M peak=256M kills=0 rs=0 reqs=3288
[10:21:52] + 182s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=68M/256M peak=85M kills=0 rs=0 adventurelog-postgres=255M/256M peak=256M kills=0 rs=0 reqs=3588
[10:22:07] + 197s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=68M/256M peak=85M kills=0 rs=0 adventurelog-postgres=255M/256M peak=256M kills=0 rs=0 reqs=3888
[10:22:22] + 212s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=73M/256M peak=86M kills=0 rs=0 adventurelog-postgres=255M/256M peak=256M kills=0 rs=0 reqs=4184
[10:22:37] + 227s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=73M/256M peak=86M kills=0 rs=0 adventurelog-postgres=254M/256M peak=256M kills=0 rs=0 reqs=4484
[10:22:52] + 242s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=73M/256M peak=91M kills=0 rs=0 adventurelog-postgres=253M/256M peak=256M kills=0 rs=0 reqs=4784
[10:23:07] + 258s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=74M/256M peak=91M kills=0 rs=0 adventurelog-postgres=253M/256M peak=256M kills=0 rs=0 reqs=5084
[10:23:23] + 273s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=75M/256M peak=92M kills=0 rs=0 adventurelog-postgres=253M/256M peak=256M kills=0 rs=0 reqs=5384
[10:23:38] + 288s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=78M/256M peak=92M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=5680
[10:23:53] + 303s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=79M/256M peak=96M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=5980
[10:24:08] + 318s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=79M/256M peak=96M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=6280
[10:24:23] + 333s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=80M/256M peak=97M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=6580
[10:24:38] + 349s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=80M/256M peak=97M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=6876
[10:24:54] + 364s adventurelog=315M/384M peak=384M kills=0 rs=0 adventurelog-frontend=81M/256M peak=98M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=7176
[10:25:09] + 379s adventurelog=315M/384M peak=384M kills=0 rs=0 adventurelog-frontend=83M/256M peak=98M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=7476
[10:25:24] + 394s adventurelog=315M/384M peak=384M kills=0 rs=0 adventurelog-frontend=83M/256M peak=100M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=7776
[10:25:39] + 409s adventurelog=315M/384M peak=384M kills=0 rs=0 adventurelog-frontend=84M/256M peak=100M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=8076
[10:25:54] + 424s adventurelog=315M/384M peak=384M kills=0 rs=0 adventurelog-frontend=88M/256M peak=102M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=8372
[10:26:09] + 440s adventurelog=315M/384M peak=384M kills=0 rs=0 adventurelog-frontend=90M/256M peak=102M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=8672
[10:26:25] + 455s adventurelog=315M/384M peak=384M kills=0 rs=0 adventurelog-frontend=91M/256M peak=107M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=8972
[10:26:40] + 470s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=92M/256M peak=107M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=9272
[10:26:55] + 485s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=93M/256M peak=109M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=9572
[10:27:10] + 500s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=93M/256M peak=109M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=9868
[10:27:25] + 515s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=94M/256M peak=112M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=10168
[10:27:40] + 530s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=96M/256M peak=112M kills=0 rs=0 adventurelog-postgres=250M/256M peak=256M kills=0 rs=0 reqs=10468
[10:27:55] + 546s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=98M/256M peak=113M kills=0 rs=0 adventurelog-postgres=250M/256M peak=256M kills=0 rs=0 reqs=10768
[10:28:11] + 561s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=98M/256M peak=113M kills=0 rs=0 adventurelog-postgres=250M/256M peak=256M kills=0 rs=0 reqs=11068
[10:28:26] + 576s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=99M/256M peak=115M kills=0 rs=0 adventurelog-postgres=250M/256M peak=256M kills=0 rs=0 reqs=11364
[10:28:41] + 591s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=100M/256M peak=115M kills=0 rs=0 adventurelog-postgres=250M/256M peak=256M kills=0 rs=0 reqs=11664
[10:28:56] + 606s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=101M/256M peak=117M kills=0 rs=0 adventurelog-postgres=250M/256M peak=256M kills=0 rs=0 reqs=11964
[10:28:56] memory watch: killed=False tight=[] requests=11964 codes={'200': 11964}
[10:28:56] MV-adventurelog: ABORT — putting the FROM images back
[10:29:35] adventurelog: readback of the seeded account found=True
[10:29:35] ABORT: app came back in 31.1s; data present=True
{
"harness_version": 4,
"edge": "MV-adventurelog",
"app": "adventurelog",
"note": "night 2026-09-23 within-a-major move: adventurelog=ghcr.io/seanmorley15/adventurelog-backend:v0.13.0, adventurelog-frontend=ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0",
"from": {
"adventurelog": "ghcr.io/seanmorley15/adventurelog-backend:v0.12.1",
"adventurelog-postgres": "postgis/postgis:16-3.5-alpine",
"adventurelog-frontend": "ghcr.io/seanmorley15/adventurelog-frontend:v0.12.1"
},
"to": {
"adventurelog": "ghcr.io/seanmorley15/adventurelog-backend:v0.13.0",
"adventurelog-postgres": "postgis/postgis:16-3.5-alpine",
"adventurelog-frontend": "ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": "\u001b[2Kadventurelog | Apply all migrations: account, admin, adventures, auth, authtoken, billing, contenttypes, integrations, invitations, mfa, sessions, sites, socialaccount, users, worldtravel",
"abort": "starts-and-serves",
"abort_detail": null,
"engine_state_after": null,
"memory": {
"soak_s": 606.6,
"requested_s": 600,
"requests": 11964,
"codes": {
"200": 11964
},
"first_kill": null,
"containers": {
"adventurelog": {
"limit": 402653184,
"peak": 402653184,
"peak_pct": 1.0,
"anon_peak_sampled": 293941248,
"anon_peak_pct": 0.73,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"adventurelog-frontend": {
"limit": 268435456,
"peak": 123539456,
"peak_pct": 0.46,
"anon_peak_sampled": 101703680,
"anon_peak_pct": 0.379,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"adventurelog-postgres": {
"limit": 268435456,
"peak": 268439552,
"peak_pct": 1.0,
"anon_peak_sampled": 4337664,
"anon_peak_pct": 0.016,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"load": "reached"
},
"marks": [],
"duration_s": 216.9,
"measured_at": "2026-09-27T10:29:35Z",
"evidence": "evidence/MV-adventurelog",
"scratch_cleared": [],
"files_changed": [],
"total_s": 998.6
}
@@ -0,0 +1,20 @@
{
"adventurelog": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
},
"adventurelog-frontend": {
"status": "running",
"health": null,
"restarts": 0,
"exit": 0
},
"adventurelog-postgres": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
}
}
@@ -0,0 +1,102 @@
adventurelog | PostgreSQL is up - continuing...
adventurelog-postgres | The files belonging to this database system will be owned by user "postgres".
adventurelog-postgres | This user must also own the server process.
adventurelog-postgres |
adventurelog-postgres | The database cluster will be initialized with locale "en_US.utf8".
adventurelog-postgres | The default database encoding has accordingly been set to "UTF8".
adventurelog-postgres | The default text search configuration will be set to "english".
adventurelog-postgres |
adventurelog-postgres | Data page checksums are disabled.
adventurelog-postgres |
adventurelog-postgres | fixing permissions on existing directory /var/lib/postgresql/data ... ok
adventurelog-postgres | creating subdirectories ... ok
adventurelog-postgres | selecting dynamic shared memory implementation ... posix
adventurelog-postgres | selecting default max_connections ... 100
adventurelog-postgres | selecting default shared_buffers ... 128MB
adventurelog-postgres | selecting default time zone ... Europe/Budapest
adventurelog-postgres | creating configuration files ... ok
adventurelog | Operations to perform:
adventurelog | Apply all migrations: account, admin, adventures, auth, authtoken, contenttypes, integrations, invitations, mfa, sessions, sites, socialaccount, users, worldtravel
adventurelog | Running migrations:
adventurelog | No migrations to apply.
adventurelog | Latest data already imported.
adventurelog | █████╗ ██████╗ ██╗ ██╗███████╗███╗ ██╗████████╗██╗ ██╗██████╗ ███████╗██╗ ██████╗ ██████╗
adventurelog | ██╔══██╗██╔══██╗██║ ██║██╔════╝████╗ ██║╚══██╔══╝██║ ██║██╔══██╗██╔════╝██║ ██╔═══██╗██╔════╝
adventurelog | ███████║██║ ██║██║ ██║█████╗ ██╔██╗ ██║ ██║ ██║ ██║██████╔╝█████╗ ██║ ██║ ██║██║ ███╗
adventurelog | ██╔══██║██║ ██║╚██╗ ██╔╝██╔══╝ ██║╚██╗██║ ██║ ██║ ██║██╔══██╗██╔══╝ ██║ ██║ ██║██║ ██║
adventurelog | ██║ ██║██████╔╝ ╚████╔╝ ███████╗██║ ╚████║ ██║ ╚██████╔╝██║ ██║███████╗███████╗╚██████╔╝╚██████╔╝
adventurelog | ╚═╝ ╚═╝╚═════╝ ╚═══╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝ ╚═════╝ ╚═════╝
adventurelog | “Go confidently in the direction of your dreams! Live the life you've imagined.” ― Henry David Thoreau
adventurelog | 2026-09-27 10:29:16,509 CRIT Supervisor is running as root. Privileges were not dropped because no user is specified in the config file. If you intend to run as root, you can set user=root in the config file to avoid this message.
adventurelog | 2026-09-27 10:29:16,511 INFO supervisord started with pid 1
adventurelog | 2026-09-27 10:29:17,515 INFO spawned: 'gunicorn' with pid 28
adventurelog | 2026-09-27 10:29:17,519 INFO spawned: 'memcached' with pid 29
adventurelog | 2026-09-27 10:29:17,521 INFO spawned: 'nginx' with pid 30
adventurelog | 2026-09-27 10:29:17,524 INFO spawned: 'sync_visited_regions' with pid 31
adventurelog | [2026-09-27 10:29:18 +0000] [28] [INFO] Starting gunicorn 23.0.0
adventurelog | [2026-09-27 10:29:18 +0000] [28] [INFO] Listening at: http://[::]:8000 (28)
adventurelog | [2026-09-27 10:29:18 +0000] [28] [INFO] Using worker: sync
adventurelog | [2026-09-27 10:29:18 +0000] [42] [INFO] Booting worker with pid: 42
adventurelog | [2026-09-27 10:29:18 +0000] [43] [INFO] Booting worker with pid: 43
adventurelog | 2026-09-27 10:29:19,151 INFO success: gunicorn entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
adventurelog | 2026-09-27 10:29:19,151 INFO success: memcached entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
adventurelog | 2026-09-27 10:29:19,151 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
adventurelog | 2026-09-27 10:29:19,151 INFO success: sync_visited_regions entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
adventurelog | Starting periodic sync worker for midnight background jobs...
adventurelog | Next sync scheduled in 48641s (~13.51h) at UTC midnight
adventurelog-postgres | running bootstrap script ... ok
adventurelog-postgres | sh: locale: not found
adventurelog-postgres | 2026-09-27 12:13:11.819 CEST [35] WARNING: no usable system locales were found
adventurelog-postgres | performing post-bootstrap initialization ... ok
adventurelog-postgres | syncing data to disk ... ok
adventurelog-postgres |
adventurelog-postgres |
adventurelog-postgres | Success. You can now start the database server using:
adventurelog-postgres | initdb: warning: enabling "trust" authentication for local connections
adventurelog-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.
adventurelog-postgres |
adventurelog-postgres | pg_ctl -D /var/lib/postgresql/data -l logfile start
adventurelog-postgres |
adventurelog-postgres | waiting for server to start....2026-09-27 12:13:13.210 CEST [41] LOG: starting PostgreSQL 16.15 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit
adventurelog-postgres | 2026-09-27 12:13:13.213 CEST [41] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
adventurelog-postgres | 2026-09-27 12:13:13.223 CEST [44] LOG: database system was shut down at 2026-09-27 12:13:12 CEST
adventurelog-postgres | 2026-09-27 12:13:13.231 CEST [41] LOG: database system is ready to accept connections
adventurelog-postgres | done
adventurelog-postgres | server started
adventurelog-postgres | CREATE DATABASE
adventurelog-postgres |
adventurelog-postgres |
adventurelog-postgres | /usr/local/bin/docker-entrypoint.sh: sourcing /docker-entrypoint-initdb.d/10_postgis.sh
adventurelog-postgres | CREATE DATABASE
adventurelog-postgres | Loading PostGIS extensions into template_postgis
adventurelog-postgres | CREATE EXTENSION
adventurelog-postgres | CREATE EXTENSION
adventurelog-postgres | You are now connected to database "template_postgis" as user "adventurelog".
adventurelog-postgres | DO
adventurelog-postgres | Loading PostGIS extensions into adventurelog
adventurelog-postgres | CREATE EXTENSION
adventurelog-postgres | CREATE EXTENSION
adventurelog-postgres | You are now connected to database "adventurelog" as user "adventurelog".
adventurelog-postgres | DO
adventurelog-postgres |
adventurelog-postgres | waiting for server to shut down....2026-09-27 12:13:17.020 CEST [41] LOG: received fast shutdown request
adventurelog-postgres | 2026-09-27 12:13:17.024 CEST [41] LOG: aborting any active transactions
adventurelog-postgres | 2026-09-27 12:13:17.031 CEST [41] LOG: background worker "logical replication launcher" (PID 47) exited with exit code 1
adventurelog-postgres | 2026-09-27 12:13:17.031 CEST [42] LOG: shutting down
adventurelog-postgres | 2026-09-27 12:13:17.034 CEST [42] LOG: checkpoint starting: shutdown immediate
adventurelog-postgres | 2026-09-27 12:13:17.354 CEST [42] LOG: checkpoint complete: wrote 4465 buffers (27.3%); 0 WAL file(s) added, 0 removed, 2 recycled; write=0.069 s, sync=0.235 s, total=0.323 s; sync files=963, longest=0.130 s, average=0.001 s; distance=34851 kB, estimate=34851 kB; lsn=0/36FFEE8, redo lsn=0/36FFEE8
adventurelog-postgres | 2026-09-27 12:13:17.378 CEST [41] LOG: database system is shut down
adventurelog-postgres | done
adventurelog-postgres | server stopped
adventurelog-postgres |
adventurelog-postgres | PostgreSQL init process complete; ready for start up.
adventurelog-postgres |
adventurelog-postgres | 2026-09-27 12:13:17.455 CEST [1] LOG: starting PostgreSQL 16.15 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit
adventurelog-postgres | 2026-09-27 12:13:17.455 CEST [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
adventurelog-postgres | 2026-09-27 12:13:17.456 CEST [1] LOG: listening on IPv6 address "::", port 5432
adventurelog-postgres | 2026-09-27 12:13:17.461 CEST [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
adventurelog-postgres | 2026-09-27 12:13:17.470 CEST [65] LOG: database system was shut down at 2026-09-27 12:13:17 CEST
adventurelog-postgres | 2026-09-27 12:13:17.479 CEST [1] LOG: database system is ready to accept connections
adventurelog-postgres | 2026-09-27 12:18:17.161 CEST [63] LOG: checkpoint starting: time
adventurelog-postgres | 2026-09-27 12:22:47.148 CEST [63] LOG: checkpoint complete: wrote 7242 buffers (44.2%); 0 WAL file(s) added, 0 removed, 10 recycled; write=269.896 s, sync=0.051 s, total=269.987 s; sync files=489, longest=0.006 s, average=0.001 s; distance=172672 kB, estimate=172672 kB; lsn=0/EB41138, redo lsn=0/DF9FF80
adventurelog-frontend | Listening on http://0.0.0.0:3000
@@ -0,0 +1,6 @@
adventurelog | Apply all migrations: account, admin, adventures, auth, authtoken, billing, contenttypes, integrations, invitations, mfa, sessions, sites, socialaccount, users, worldtravel
adventurelog | Running migrations:
adventurelog | Applying adventures.0072_trail_wanderer_author_fields... OK
adventurelog | Applying adventures.0073_pointfield_geography... OK
adventurelog | Applying adventures.0074_contentimage_source_metadata... OK
adventurelog | Applying adventures.0075_make_visit_dates_timezone_aware... OK
@@ -0,0 +1,59 @@
[10:12:57] scratch drive folders cleared before FROM (R-656): none existed
[10:12:57] MV-adventurelog: deploying adventurelog at FROM {'adventurelog': 'ghcr.io/seanmorley15/adventurelog-backend:v0.12.1', 'adventurelog-postgres': 'postgis/postgis:16-3.5-alpine', 'adventurelog-frontend': 'ghcr.io/seanmorley15/adventurelog-frontend:v0.12.1'}
[10:14:55] FROM settled=True in 93.2s :: {"adventurelog": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "adventurelog-frontend": {"status": "running", "health": null, "restarts": 0, "exit": 0}, "adventurelog-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[10:14:55] fixture: the BOX walk's own (Django), through upgrade_boxport
[10:14:58] adventurelog: createsuperuser :: Superuser created successfully.
[10:15:00] adventurelog: seeded superuser drill2a47a0
[10:15:05] adventurelog: readback of the seeded account found=True
[10:15:05] C1 (seed reads back BEFORE): True
[10:15:06] MV-adventurelog: swapping to TO {'adventurelog': 'ghcr.io/seanmorley15/adventurelog-backend:v0.13.0', 'adventurelog-postgres': 'postgis/postgis:16-3.5-alpine', 'adventurelog-frontend': 'ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0'}
[10:15:09] TO up -d rc=0
[10:18:45] TO settled=True in 216.9s :: {"adventurelog": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "adventurelog-frontend": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "adventurelog-postgres": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[10:18:46] migration lines observed: 6
[10:18:49] adventurelog: readback of the seeded account found=True
[10:18:49] RESULT (seed reads back AFTER): True
[10:18:50] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:3000
[10:19:05] + 15s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=44M/256M peak=44M kills=0 rs=0 adventurelog-postgres=244M/256M peak=256M kills=0 rs=0 reqs=300
[10:19:20] + 30s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=53M/256M peak=67M kills=0 rs=0 adventurelog-postgres=250M/256M peak=256M kills=0 rs=0 reqs=596
[10:19:35] + 46s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=54M/256M peak=67M kills=0 rs=0 adventurelog-postgres=254M/256M peak=256M kills=0 rs=0 reqs=896
[10:19:50] + 61s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=59M/256M peak=75M kills=0 rs=0 adventurelog-postgres=254M/256M peak=256M kills=0 rs=0 reqs=1196
[10:20:06] + 76s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=59M/256M peak=75M kills=0 rs=0 adventurelog-postgres=253M/256M peak=256M kills=0 rs=0 reqs=1493
[10:20:21] + 91s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=61M/256M peak=77M kills=0 rs=0 adventurelog-postgres=253M/256M peak=256M kills=0 rs=0 reqs=1792
[10:20:36] + 106s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=64M/256M peak=77M kills=0 rs=0 adventurelog-postgres=254M/256M peak=256M kills=0 rs=0 reqs=2092
[10:20:51] + 121s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=65M/256M peak=81M kills=0 rs=0 adventurelog-postgres=252M/256M peak=256M kills=0 rs=0 reqs=2392
[10:21:06] + 136s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=65M/256M peak=81M kills=0 rs=0 adventurelog-postgres=254M/256M peak=256M kills=0 rs=0 reqs=2688
[10:21:21] + 152s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=65M/256M peak=82M kills=0 rs=0 adventurelog-postgres=255M/256M peak=256M kills=0 rs=0 reqs=2988
[10:21:36] + 167s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=67M/256M peak=82M kills=0 rs=0 adventurelog-postgres=253M/256M peak=256M kills=0 rs=0 reqs=3288
[10:21:52] + 182s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=68M/256M peak=85M kills=0 rs=0 adventurelog-postgres=255M/256M peak=256M kills=0 rs=0 reqs=3588
[10:22:07] + 197s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=68M/256M peak=85M kills=0 rs=0 adventurelog-postgres=255M/256M peak=256M kills=0 rs=0 reqs=3888
[10:22:22] + 212s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=73M/256M peak=86M kills=0 rs=0 adventurelog-postgres=255M/256M peak=256M kills=0 rs=0 reqs=4184
[10:22:37] + 227s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=73M/256M peak=86M kills=0 rs=0 adventurelog-postgres=254M/256M peak=256M kills=0 rs=0 reqs=4484
[10:22:52] + 242s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=73M/256M peak=91M kills=0 rs=0 adventurelog-postgres=253M/256M peak=256M kills=0 rs=0 reqs=4784
[10:23:07] + 258s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=74M/256M peak=91M kills=0 rs=0 adventurelog-postgres=253M/256M peak=256M kills=0 rs=0 reqs=5084
[10:23:23] + 273s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=75M/256M peak=92M kills=0 rs=0 adventurelog-postgres=253M/256M peak=256M kills=0 rs=0 reqs=5384
[10:23:38] + 288s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=78M/256M peak=92M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=5680
[10:23:53] + 303s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=79M/256M peak=96M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=5980
[10:24:08] + 318s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=79M/256M peak=96M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=6280
[10:24:23] + 333s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=80M/256M peak=97M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=6580
[10:24:38] + 349s adventurelog=316M/384M peak=384M kills=0 rs=0 adventurelog-frontend=80M/256M peak=97M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=6876
[10:24:54] + 364s adventurelog=315M/384M peak=384M kills=0 rs=0 adventurelog-frontend=81M/256M peak=98M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=7176
[10:25:09] + 379s adventurelog=315M/384M peak=384M kills=0 rs=0 adventurelog-frontend=83M/256M peak=98M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=7476
[10:25:24] + 394s adventurelog=315M/384M peak=384M kills=0 rs=0 adventurelog-frontend=83M/256M peak=100M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=7776
[10:25:39] + 409s adventurelog=315M/384M peak=384M kills=0 rs=0 adventurelog-frontend=84M/256M peak=100M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=8076
[10:25:54] + 424s adventurelog=315M/384M peak=384M kills=0 rs=0 adventurelog-frontend=88M/256M peak=102M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=8372
[10:26:09] + 440s adventurelog=315M/384M peak=384M kills=0 rs=0 adventurelog-frontend=90M/256M peak=102M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=8672
[10:26:25] + 455s adventurelog=315M/384M peak=384M kills=0 rs=0 adventurelog-frontend=91M/256M peak=107M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=8972
[10:26:40] + 470s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=92M/256M peak=107M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=9272
[10:26:55] + 485s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=93M/256M peak=109M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=9572
[10:27:10] + 500s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=93M/256M peak=109M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=9868
[10:27:25] + 515s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=94M/256M peak=112M kills=0 rs=0 adventurelog-postgres=251M/256M peak=256M kills=0 rs=0 reqs=10168
[10:27:40] + 530s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=96M/256M peak=112M kills=0 rs=0 adventurelog-postgres=250M/256M peak=256M kills=0 rs=0 reqs=10468
[10:27:55] + 546s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=98M/256M peak=113M kills=0 rs=0 adventurelog-postgres=250M/256M peak=256M kills=0 rs=0 reqs=10768
[10:28:11] + 561s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=98M/256M peak=113M kills=0 rs=0 adventurelog-postgres=250M/256M peak=256M kills=0 rs=0 reqs=11068
[10:28:26] + 576s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=99M/256M peak=115M kills=0 rs=0 adventurelog-postgres=250M/256M peak=256M kills=0 rs=0 reqs=11364
[10:28:41] + 591s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=100M/256M peak=115M kills=0 rs=0 adventurelog-postgres=250M/256M peak=256M kills=0 rs=0 reqs=11664
[10:28:56] + 606s adventurelog=314M/384M peak=384M kills=0 rs=0 adventurelog-frontend=101M/256M peak=117M kills=0 rs=0 adventurelog-postgres=250M/256M peak=256M kills=0 rs=0 reqs=11964
[10:28:56] memory watch: killed=False tight=[] requests=11964 codes={'200': 11964}
[10:28:56] MV-adventurelog: ABORT — putting the FROM images back
[10:29:35] adventurelog: readback of the seeded account found=True
[10:29:35] ABORT: app came back in 31.1s; data present=True
@@ -0,0 +1,109 @@
adventurelog-frontend | Listening on http://0.0.0.0:3000
adventurelog-postgres | The files belonging to this database system will be owned by user "postgres".
adventurelog-postgres | This user must also own the server process.
adventurelog-postgres |
adventurelog-postgres | The database cluster will be initialized with locale "en_US.utf8".
adventurelog-postgres | The default database encoding has accordingly been set to "UTF8".
adventurelog-postgres | The default text search configuration will be set to "english".
adventurelog-postgres |
adventurelog-postgres | Data page checksums are disabled.
adventurelog | PostgreSQL is up - continuing...
adventurelog | Operations to perform:
adventurelog | Apply all migrations: account, admin, adventures, auth, authtoken, billing, contenttypes, integrations, invitations, mfa, sessions, sites, socialaccount, users, worldtravel
adventurelog | Running migrations:
adventurelog | Applying adventures.0072_trail_wanderer_author_fields... OK
adventurelog | Applying adventures.0073_pointfield_geography... OK
adventurelog | Applying adventures.0074_contentimage_source_metadata... OK
adventurelog | Applying adventures.0075_make_visit_dates_timezone_aware... OK
adventurelog | Applying adventures.0076_normalize_all_day_visit_end_dates... OK
adventurelog | Applying billing.0001_initial... OK
adventurelog | Applying integrations.0007_wandererintegration_api_key_auth... OK
adventurelog | Applying integrations.0008_endurainintegration... OK
adventurelog | Applying integrations.0009_alter_endurainintegration_auth_method... OK
adventurelog | Applying worldtravel.0019_pointfield_coordinates... OK
adventurelog | Running download-countries (first boot may take several minutes; ensure ~2GB RAM is available)...
adventurelog | Latest data already imported.
adventurelog | █████╗ ██████╗ ██╗ ██╗███████╗███╗ ██╗████████╗██╗ ██╗██████╗ ███████╗██╗ ██████╗ ██████╗
adventurelog | ██╔══██╗██╔══██╗██║ ██║██╔════╝████╗ ██║╚══██╔══╝██║ ██║██╔══██╗██╔════╝██║ ██╔═══██╗██╔════╝
adventurelog | ███████║██║ ██║██║ ██║█████╗ ██╔██╗ ██║ ██║ ██║ ██║██████╔╝█████╗ ██║ ██║ ██║██║ ███╗
adventurelog | ██╔══██║██║ ██║╚██╗ ██╔╝██╔══╝ ██║╚██╗██║ ██║ ██║ ██║██╔══██╗██╔══╝ ██║ ██║ ██║██║ ██║
adventurelog | ██║ ██║██████╔╝ ╚████╔╝ ███████╗██║ ╚████║ ██║ ╚██████╔╝██║ ██║███████╗███████╗╚██████╔╝╚██████╔╝
adventurelog | ╚═╝ ╚═╝╚═════╝ ╚═══╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝ ╚═════╝ ╚═════╝
adventurelog | “Go confidently in the direction of your dreams! Live the life you've imagined.” ― Henry David Thoreau
adventurelog | 2026-09-27 10:18:08,990 CRIT Supervisor is running as root. Privileges were not dropped because no user is specified in the config file. If you intend to run as root, you can set user=root in the config file to avoid this message.
adventurelog | 2026-09-27 10:18:08,992 INFO supervisord started with pid 1
adventurelog | 2026-09-27 10:18:09,996 INFO spawned: 'cron' with pid 82
adventurelog | 2026-09-27 10:18:09,999 INFO spawned: 'gunicorn' with pid 83
adventurelog | 2026-09-27 10:18:10,002 INFO spawned: 'memcached' with pid 84
adventurelog | 2026-09-27 10:18:10,004 INFO spawned: 'nginx' with pid 85
adventurelog | [2026-09-27 10:18:10 +0000] [83] [INFO] Starting gunicorn 23.0.0
adventurelog | [2026-09-27 10:18:10 +0000] [83] [INFO] Listening at: http://[::]:8000 (83)
adventurelog | [2026-09-27 10:18:10 +0000] [83] [INFO] Using worker: sync
adventurelog | [2026-09-27 10:18:10 +0000] [96] [INFO] Booting worker with pid: 96
adventurelog | [2026-09-27 10:18:10 +0000] [97] [INFO] Booting worker with pid: 97
adventurelog | 2026-09-27 10:18:11,534 INFO success: cron entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
adventurelog | 2026-09-27 10:18:11,535 INFO success: gunicorn entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
adventurelog | 2026-09-27 10:18:11,535 INFO success: memcached entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
adventurelog | 2026-09-27 10:18:11,535 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
adventurelog-postgres |
adventurelog-postgres | fixing permissions on existing directory /var/lib/postgresql/data ... ok
adventurelog-postgres | creating subdirectories ... ok
adventurelog-postgres | selecting dynamic shared memory implementation ... posix
adventurelog-postgres | selecting default max_connections ... 100
adventurelog-postgres | selecting default shared_buffers ... 128MB
adventurelog-postgres | selecting default time zone ... Europe/Budapest
adventurelog-postgres | creating configuration files ... ok
adventurelog-postgres | running bootstrap script ... ok
adventurelog-postgres | sh: locale: not found
adventurelog-postgres | 2026-09-27 12:13:11.819 CEST [35] WARNING: no usable system locales were found
adventurelog-postgres | performing post-bootstrap initialization ... ok
adventurelog-postgres | syncing data to disk ... ok
adventurelog-postgres |
adventurelog-postgres |
adventurelog-postgres | Success. You can now start the database server using:
adventurelog-postgres | initdb: warning: enabling "trust" authentication for local connections
adventurelog-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.
adventurelog-postgres |
adventurelog-postgres | pg_ctl -D /var/lib/postgresql/data -l logfile start
adventurelog-postgres |
adventurelog-postgres | waiting for server to start....2026-09-27 12:13:13.210 CEST [41] LOG: starting PostgreSQL 16.15 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit
adventurelog-postgres | 2026-09-27 12:13:13.213 CEST [41] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
adventurelog-postgres | 2026-09-27 12:13:13.223 CEST [44] LOG: database system was shut down at 2026-09-27 12:13:12 CEST
adventurelog-postgres | 2026-09-27 12:13:13.231 CEST [41] LOG: database system is ready to accept connections
adventurelog-postgres | done
adventurelog-postgres | server started
adventurelog-postgres | CREATE DATABASE
adventurelog-postgres |
adventurelog-postgres |
adventurelog-postgres | /usr/local/bin/docker-entrypoint.sh: sourcing /docker-entrypoint-initdb.d/10_postgis.sh
adventurelog-postgres | CREATE DATABASE
adventurelog-postgres | Loading PostGIS extensions into template_postgis
adventurelog-postgres | CREATE EXTENSION
adventurelog-postgres | CREATE EXTENSION
adventurelog-postgres | You are now connected to database "template_postgis" as user "adventurelog".
adventurelog-postgres | DO
adventurelog-postgres | Loading PostGIS extensions into adventurelog
adventurelog-postgres | CREATE EXTENSION
adventurelog-postgres | CREATE EXTENSION
adventurelog-postgres | You are now connected to database "adventurelog" as user "adventurelog".
adventurelog-postgres | DO
adventurelog-postgres |
adventurelog-postgres | waiting for server to shut down....2026-09-27 12:13:17.020 CEST [41] LOG: received fast shutdown request
adventurelog-postgres | 2026-09-27 12:13:17.024 CEST [41] LOG: aborting any active transactions
adventurelog-postgres | 2026-09-27 12:13:17.031 CEST [41] LOG: background worker "logical replication launcher" (PID 47) exited with exit code 1
adventurelog-postgres | 2026-09-27 12:13:17.031 CEST [42] LOG: shutting down
adventurelog-postgres | 2026-09-27 12:13:17.034 CEST [42] LOG: checkpoint starting: shutdown immediate
adventurelog-postgres | 2026-09-27 12:13:17.354 CEST [42] LOG: checkpoint complete: wrote 4465 buffers (27.3%); 0 WAL file(s) added, 0 removed, 2 recycled; write=0.069 s, sync=0.235 s, total=0.323 s; sync files=963, longest=0.130 s, average=0.001 s; distance=34851 kB, estimate=34851 kB; lsn=0/36FFEE8, redo lsn=0/36FFEE8
adventurelog-postgres | 2026-09-27 12:13:17.378 CEST [41] LOG: database system is shut down
adventurelog-postgres | done
adventurelog-postgres | server stopped
adventurelog-postgres |
adventurelog-postgres | PostgreSQL init process complete; ready for start up.
adventurelog-postgres |
adventurelog-postgres | 2026-09-27 12:13:17.455 CEST [1] LOG: starting PostgreSQL 16.15 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit
adventurelog-postgres | 2026-09-27 12:13:17.455 CEST [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
adventurelog-postgres | 2026-09-27 12:13:17.456 CEST [1] LOG: listening on IPv6 address "::", port 5432
adventurelog-postgres | 2026-09-27 12:13:17.461 CEST [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
adventurelog-postgres | 2026-09-27 12:13:17.470 CEST [65] LOG: database system was shut down at 2026-09-27 12:13:17 CEST
adventurelog-postgres | 2026-09-27 12:13:17.479 CEST [1] LOG: database system is ready to accept connections
adventurelog-postgres | 2026-09-27 12:18:17.161 CEST [63] LOG: checkpoint starting: time
@@ -0,0 +1,20 @@
{
"adventurelog": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
},
"adventurelog-frontend": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
},
"adventurelog-postgres": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
}
}
@@ -0,0 +1,77 @@
{
"harness_version": 4,
"edge": "MV-adventurelog",
"app": "adventurelog",
"note": "night 2026-09-23 within-a-major move: adventurelog=ghcr.io/seanmorley15/adventurelog-backend:v0.13.0, adventurelog-frontend=ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0",
"from": {
"adventurelog": "ghcr.io/seanmorley15/adventurelog-backend:v0.12.1",
"adventurelog-postgres": "postgis/postgis:16-3.5-alpine",
"adventurelog-frontend": "ghcr.io/seanmorley15/adventurelog-frontend:v0.12.1"
},
"to": {
"adventurelog": "ghcr.io/seanmorley15/adventurelog-backend:v0.13.0",
"adventurelog-postgres": "postgis/postgis:16-3.5-alpine",
"adventurelog-frontend": "ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": "\u001b[2Kadventurelog | Apply all migrations: account, admin, adventures, auth, authtoken, billing, contenttypes, integrations, invitations, mfa, sessions, sites, socialaccount, users, worldtravel",
"abort": "starts-and-serves",
"abort_detail": null,
"engine_state_after": null,
"memory": {
"soak_s": 606.6,
"requested_s": 600,
"requests": 11964,
"codes": {
"200": 11964
},
"first_kill": null,
"containers": {
"adventurelog": {
"limit": 402653184,
"peak": 402653184,
"peak_pct": 1.0,
"anon_peak_sampled": 293941248,
"anon_peak_pct": 0.73,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"adventurelog-frontend": {
"limit": 268435456,
"peak": 123539456,
"peak_pct": 0.46,
"anon_peak_sampled": 101703680,
"anon_peak_pct": 0.379,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"adventurelog-postgres": {
"limit": 268435456,
"peak": 268439552,
"peak_pct": 1.0,
"anon_peak_sampled": 4337664,
"anon_peak_pct": 0.016,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"load": "reached"
},
"marks": [],
"duration_s": 216.9,
"measured_at": "2026-09-27T10:29:35Z",
"evidence": "evidence/MV-adventurelog",
"scratch_cleared": [],
"files_changed": [],
"total_s": 998.6
}
@@ -0,0 +1,22 @@
{
"app": "adventurelog",
"venue": "box 9202 (drill catalog, controller 0.275.0, health_timeout 5m = the product default), the product's guarded Update",
"from": {
"adventurelog": "ghcr.io/seanmorley15/adventurelog-backend:v0.12.1",
"adventurelog-frontend": "ghcr.io/seanmorley15/adventurelog-frontend:v0.12.1",
"adventurelog-postgres": "postgis/postgis:16-3.5-alpine"
},
"to": {
"adventurelog": "ghcr.io/seanmorley15/adventurelog-backend:v0.13.0",
"adventurelog-frontend": "ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0",
"adventurelog-postgres": "postgis/postgis:16-3.5-alpine"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"world_data": "1 Latest data already imported.",
"duration_s": 204.1,
"measured_at": "2026-09-27T10:50:47Z",
"evidence": "felhom.eu/documentation/audits/version-travel-2026-09-26/C/apps/adventurelog/box/move2-5m.txt"
}
@@ -0,0 +1,40 @@
phase +0.0s backing-up | err=None
phase +14.4s safety-dump | err=None
phase +16.4s pulling | err=None
phase +17.5s copying | err=None
phase +31.8s starting | err=None
phase +38.0s verifying | err=None
phase +128.2s undoing | err=None
phase +165.1s undone | err=None
adventurelog: readback of the seeded account found=True
backend world-data lines: 1 Latest data already imported.
containers: adventurelog ghcr.io/seanmorley15/adventurelog-backend:v0.12.1 Up 42 seconds (healthy) | adventurelog-postgres postgis/postgis:16-3.5-alpine Up 48 seconds (healthy) | adventurelog-frontend ghcr.io/seanmorley15/adventurelog-frontend:v0.12.1 Up 48 seconds (healthy) |
2026/09/27 10:46:33 update.go:536: [INFO] [stacks] update adventurelog: accepted — guarded update started
2026/09/27 10:46:33 update.go:1365: [INFO] [stacks] update adventurelog: phase checking
2026/09/27 10:46:33 update.go:786: [INFO] [stacks] update adventurelog: ladder — the last step (1 of 1) — the catalog's current definition
2026/09/27 10:46:33 update.go:816: [INFO] [stacks] update adventurelog: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-27T10:43:45Z) (found: none) — backing up first
2026/09/27 10:46:33 update.go:1365: [INFO] [stacks] update adventurelog: phase backing-up
2026/09/27 10:46:46 update.go:831: [INFO] [stacks] update adventurelog: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-27T10:46:33Z
2026/09/27 10:46:46 update.go:1365: [INFO] [stacks] update adventurelog: phase safety-dump
2026/09/27 10:46:47 update.go:846: [INFO] [stacks] update adventurelog: safety dump done (1 file(s)) [/mnt/sys_drive/felhom-data/backups/primary/adventurelog/db-dumps/pre-restore-20260927T104647Z-adventurelog-postgres.sql]
2026/09/27 10:46:48 undo.go:287: [INFO] [stacks] update adventurelog: the undo copy will hold 2 named volume(s), 234.1 MiB
2026/09/27 10:46:48 update.go:1365: [INFO] [stacks] update adventurelog: phase pinning
2026/09/27 10:46:48 pin.go:373: [INFO] [stacks] update adventurelog: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/adventurelog/docker-compose.yml (adventurelog=ghcr.io/seanmorley15/adventurelog-backend:v0.13.0, adventurelog-frontend=ghcr.io/seanmorley15/adventurelog-fro
2026/09/27 10:46:48 update.go:1365: [INFO] [stacks] update adventurelog: phase pulling
2026/09/27 10:46:49 update.go:1365: [INFO] [stacks] update adventurelog: phase copying
2026/09/27 10:47:00 update.go:1365: [INFO] [stacks] update adventurelog: phase copying
2026/09/27 10:47:01 undo.go:437: [INFO] [stacks] update adventurelog: copied adventurelog_adventurelog_media → adventurelog_adventurelog_media.pre-update-20260927T104700Z in 1.508s
2026/09/27 10:47:01 update.go:1365: [INFO] [stacks] update adventurelog: phase copying
2026/09/27 10:47:04 undo.go:437: [INFO] [stacks] update adventurelog: copied adventurelog_adventurelog_postgres_data → adventurelog_adventurelog_postgres_data.pre-update-20260927T104700Z in 2.066s
2026/09/27 10:47:04 update.go:1365: [INFO] [stacks] update adventurelog: phase starting
2026/09/27 10:47:10 update.go:1365: [INFO] [stacks] update adventurelog: phase verifying
2026/09/27 10:48:35 update.go:1228: [WARN] [stacks] update adventurelog: no probe container for adventurelog — settling on container state instead; candidates: [adventurelog(starting) adventurelog-frontend(unhealthy) adventurelog-postgres(running)]
2026/09/27 10:48:40 update.go:1066: [ERROR] [stacks] update adventurelog FAILED after the new version was started: not healthy: not healthy within 1m30s (last: unhealthy, and the check resolves to no container)
2026/09/27 10:48:41 update.go:1058: [INFO] [stacks] update adventurelog: kept 3903 bytes of the app's own log at /opt/docker/stacks/adventurelog/hold-logs/20260927T104840Z/compose-logs.txt before stopping it (R-621)
2026/09/27 10:48:41 update.go:1365: [INFO] [stacks] update adventurelog: phase undoing
2026/09/27 10:48:41 undo.go:515: [WARN] [stacks] update adventurelog: UNDO — putting back the previous version and its 2 volume copy(ies) (reason: not healthy: not healthy within 1m30s (last: unhealthy, and the check resolves to no container))
2026/09/27 10:49:17 unattended.go:492: [INFO] [stacks] update adventurelog: step adventurelog=ghcr.io/seanmorley15/adventurelog-backend:v0.13.0, adventurelog-frontend=ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0, adventurelog-postgres=postgis/postgis:16-3.5-alpine recorded as undone — the au
2026/09/27 10:49:17 undo.go:640: [INFO] [stacks] update adventurelog: event app_update_undone
2026/09/27 10:49:17 undo.go:568: [INFO] [stacks] update adventurelog: UNDONE in 36s — the previous version is running on the data from before the update (the app's health check passed)
RESULT final_phase=undone seed_after=True state=running verdict=failed
@@ -0,0 +1,31 @@
phase +0.0s safety-dump | err=None
phase +2.1s pulling | err=None
phase +3.1s copying | err=None
phase +10.3s starting | err=None
phase +16.4s verifying | err=None
phase +204.1s done | err=None
adventurelog: readback of the seeded account found=True
world-data lines: 1 Latest data already imported.
containers: adventurelog ghcr.io/seanmorley15/adventurelog-backend:v0.13.0 Up 3 minutes (healthy) | adventurelog-frontend ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0 Up 3 minutes (healthy) | adventurelog-postgres postgis/postgis:16-3.5-alpine Up 3 minutes (healthy) |
2026/09/27 10:50:48 update.go:536: [INFO] [stacks] update adventurelog: accepted — guarded update started
2026/09/27 10:50:48 update.go:1365: [INFO] [stacks] update adventurelog: phase checking
2026/09/27 10:50:48 update.go:786: [INFO] [stacks] update adventurelog: ladder — the last step (1 of 1) — the catalog's current definition
2026/09/27 10:50:48 update.go:814: [INFO] [stacks] update adventurelog: precondition met — Tier 2 (second drive) copy from 2026-09-27T10:46:33Z (4m0s old, limit 24h0m0s)
2026/09/27 10:50:48 update.go:1365: [INFO] [stacks] update adventurelog: phase safety-dump
2026/09/27 10:50:49 update.go:846: [INFO] [stacks] update adventurelog: safety dump done (1 file(s)) [/mnt/sys_drive/felhom-data/backups/primary/adventurelog/db-dumps/pre-restore-20260927T105048Z-adventurelog-postgres.sql]
2026/09/27 10:50:49 undo.go:287: [INFO] [stacks] update adventurelog: the undo copy will hold 2 named volume(s), 234.6 MiB
2026/09/27 10:50:49 update.go:1365: [INFO] [stacks] update adventurelog: phase pinning
2026/09/27 10:50:49 pin.go:373: [INFO] [stacks] update adventurelog: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/adventurelog/docker-compose.yml (adventurelog=ghcr.io/seanmorley15/adventurelog-backend:v0.13.0, adventurelog-frontend=ghcr.io/seanmorley15/adventurelog-fro
2026/09/27 10:50:49 update.go:1365: [INFO] [stacks] update adventurelog: phase pulling
2026/09/27 10:50:51 update.go:1365: [INFO] [stacks] update adventurelog: phase copying
2026/09/27 10:50:54 update.go:1365: [INFO] [stacks] update adventurelog: phase copying
2026/09/27 10:50:55 undo.go:437: [INFO] [stacks] update adventurelog: copied adventurelog_adventurelog_media → adventurelog_adventurelog_media.pre-update-20260927T105054Z in 832ms
2026/09/27 10:50:55 update.go:1365: [INFO] [stacks] update adventurelog: phase copying
2026/09/27 10:50:57 undo.go:437: [INFO] [stacks] update adventurelog: copied adventurelog_adventurelog_postgres_data → adventurelog_adventurelog_postgres_data.pre-update-20260927T105054Z in 2.031s
2026/09/27 10:50:57 update.go:1365: [INFO] [stacks] update adventurelog: phase starting
2026/09/27 10:51:03 update.go:1365: [INFO] [stacks] update adventurelog: phase verifying
2026/09/27 10:52:29 update.go:1228: [WARN] [stacks] update adventurelog: no probe container for adventurelog — settling on container state instead; candidates: [adventurelog(starting) adventurelog-frontend(unhealthy) adventurelog-postgres(running)]
2026/09/27 10:54:11 update.go:997: [INFO] [stacks] update adventurelog: healthy after 3m8s (the app's health check passed)
2026/09/27 10:54:11 update.go:1033: [INFO] [stacks] update adventurelog: DONE in 3m24s
RESULT final_phase=done seed_after=True state=running verdict=proven
@@ -0,0 +1,5 @@
deploy/reuse adventurelog: True
adventurelog: createsuperuser :: Superuser created successfully.
adventurelog: seeded superuser drillfa397d
adventurelog: readback of the seeded account found=True
C1 seed reads back BEFORE: True
@@ -0,0 +1,3 @@
update:
health_timeout: 5m
Up 20 seconds (healthy)
@@ -0,0 +1,3 @@
12:12:51 START adventurelog ['adventurelog=ghcr.io/seanmorley15/adventurelog-backend:v0.13.0', 'adventurelog-frontend=ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0']
12:29:43 DONE adventurelog rc=0 verdict=proven read_before=True read_after=True abort=starts-and-serves marks=[] peaks={'adventurelog': 1.0, 'adventurelog-frontend': 0.46, 'adventurelog-postgres': 1.0} detail='None' (1012s)
12:29:43 QUEUE q2 FINISHED
@@ -0,0 +1,17 @@
== demo-hp-bb76ea 2026-09-27T10:16:42Z
{"op_blob_b64":"eyJleHBpcmVzX2F0IjoiMjAyNi0wOS0yN1QxMDo0Njo0MloiLCJpc3N1ZWRfYXQiOiIyMDI2LTA5LTI3VDEwOjE2OjQyWiIsImtleV9pZCI6ImZlbGhvbS1vcC0xIiwibm9uY2UiOiIyZWExMWJiNjk3Zjc3ZjAwM2RiMDA4MTJhOGVhMTI5MSIsIm9wIjoiYWdlbnRfdXBkYXRlIiwicGFyYW1zIjp7InNoYTI1NiI6ImFkNGU3NWYxNmQzMzg1NTJmNDU4OGQzZmU2NGM1MWNiZjk2NTEyMjBiOWQyMjNiNTM4NmI4NWI2YzM3ZmQ0YzMiLCJ2ZXJzaW9uIjoiMC4xMzUuMCJ9LCJ0YXJnZXQiOnsiZ3Vlc3RfaWQiOiIiLCJob3N0X2lkIjoiZGVtby1ocC1iYjc2ZWEifX0=","sig_armored":"-----BEGIN SSH SIGNATURE-----\nU1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgvzPSoI2ADfHbHEAHRCPmujzBoW\nMZnxNr+xYHre2UvD4AAAAMZmVsaG9tLW9wLXYxAAAAAAAAAAZzaGE1MTIAAABTAAAAC3Nz\naC1lZDI1NTE5AAAAQDW14qvokAwDQxiNXvQAK1KQgi0KM/8MCr4QXDmFhZEjnmdmu6CfP0\nIz55SCBDCHPYOENfBvftpYMD6wz3elqwE=\n-----END SSH SIGNATURE-----\n"}
uploaded signed op to the hub jobs queue
== demo-felhom-8363b5 2026-09-27T10:16:42Z
{"op_blob_b64":"eyJleHBpcmVzX2F0IjoiMjAyNi0wOS0yN1QxMDo0Njo0MloiLCJpc3N1ZWRfYXQiOiIyMDI2LTA5LTI3VDEwOjE2OjQyWiIsImtleV9pZCI6ImZlbGhvbS1vcC0xIiwibm9uY2UiOiIxNjAyYjIzOTI5MTg1ZWU2ZDlkNGQ0ZTNhMGY1ODg5YyIsIm9wIjoiYWdlbnRfdXBkYXRlIiwicGFyYW1zIjp7InNoYTI1NiI6ImFkNGU3NWYxNmQzMzg1NTJmNDU4OGQzZmU2NGM1MWNiZjk2NTEyMjBiOWQyMjNiNTM4NmI4NWI2YzM3ZmQ0YzMiLCJ2ZXJzaW9uIjoiMC4xMzUuMCJ9LCJ0YXJnZXQiOnsiZ3Vlc3RfaWQiOiIiLCJob3N0X2lkIjoiZGVtby1mZWxob20tODM2M2I1In19","sig_armored":"-----BEGIN SSH SIGNATURE-----\nU1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgvzPSoI2ADfHbHEAHRCPmujzBoW\nMZnxNr+xYHre2UvD4AAAAMZmVsaG9tLW9wLXYxAAAAAAAAAAZzaGE1MTIAAABTAAAAC3Nz\naC1lZDI1NTE5AAAAQBWbQHqOcEJPGWVn6+zIDnLgtjp0I7ls56AqcJd8QE0jVtIahHyAhN\ng9dnVhL8lclx5Jcd6MOBs2G7LrTzRYiw4=\n-----END SSH SIGNATURE-----\n"}
uploaded signed op to the hub jobs queue
== demo-hp felhom-agent 0.134.0
== felhom-pve felhom-agent 0.135.0
Sep 27 12:21:53 demo-felhom felhom-agent[2789656]: time=2026-09-27T12:21:53.431+02:00 level=WARN msg="selfupdate: new version running — dwelling before commit" version=0.135.0 prev=0.134.0 dwell=1m0s
Sep 27 12:22:53 demo-felhom sudo[2790969]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/local/sbin/felhom-selfupdate-guarded commit
Sep 27 12:22:53 demo-felhom felhom-selfupdate-guarded[2790977]: committed (pending cleared, .prev retained)
Sep 27 12:22:53 demo-felhom felhom-agent[2789656]: time=2026-09-27T12:22:53.450+02:00 level=WARN msg="selfupdate: update committed" version=0.135.0 wrapper=""
== demo-hp 2026-09-27T10:29:13Z felhom-agent 0.135.0
Sep 27 12:27:58 demo-hp felhom-agent[995644]: time=2026-09-27T12:27:58.210+02:00 level=WARN msg="signedjobs: signed op COMPLETED" job=94658c4370ef2c79 op=agent_update
Sep 27 12:28:02 demo-hp felhom-agent[998480]: time=2026-09-27T12:28:02.239+02:00 level=WARN msg="selfupdate: new version running — dwelling before commit" version=0.135.0 prev=0.134.0 dwell=1m0s
Sep 27 12:29:02 demo-hp sudo[1003468]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/local/sbin/felhom-selfupdate-guarded commit
Sep 27 12:29:02 demo-hp felhom-agent[998480]: time=2026-09-27T12:29:02.260+02:00 level=WARN msg="selfupdate: update committed" version=0.135.0 wrapper=""
@@ -0,0 +1,6 @@
# D1 — R-689, agent v0.135.0
Fix: `backup/runner.go` `guestBackupArchive`. Red-proof `RP-r689-golden-picked.txt`. Released by `scripts/release-agent.sh`
(tag `v0.135.0` at `d4be12c`, sha256 `ad4e75f1…fd4c3`, verified by download; NOT vouched). Delivered by signed `agent_update`
to both demo hosts (`D1-signed-delivery.txt`): demo-felhom committed 12:22:53 CEST, demo-hp 12:29:02 CEST. The first
scheduled restore-test evaluation on demo-hp after the update is due ~18:28 CEST: `D1-cycle-demo-hp.txt` (read later).
@@ -0,0 +1,5 @@
# D2 — R-695: single-flight file-browser sync; no empty kept folder listed or bound
Tests `TestR695_QueuedSyncsCoalesceIntoOne` (6 requests → 2 syncs; a later request is never dropped) and
`TestR695_AnEmptyDatedKeptFolderIsNeverListed`; both red-proofed (`RP-r695.txt`). Not reproduced live (the original was a
same-second race).
@@ -0,0 +1,6 @@
# D3 — R-691: the kept view reads a folder another user owns; its name follows the language
Decision (CC unattended, `07` §6.5): the file browser joins the OWNING GROUP of a group-readable kept folder (`group_add`;
never gid 0, never its own 1000); binds stay `:ro`; nothing on disk changes. A language switch re-syncs the file browser.
Tests `TestR691_KeptReadGroups`, `TestR691_ALanguageSwitchResyncsTheFileBrowser`, red-proofed (`RP-r691.txt`).
NOT live-proven: no nextcloud kept folder existed on 9202 this session. NOT built: (2) Load from the off-site copy.
@@ -0,0 +1,4 @@
# 9202 before: gitea.dooplex.hu/admin/felhom-controller:0.275.0-rc1
gitea.dooplex.hu/admin/felhom-controller:0.275.0
# 9202 after: gitea.dooplex.hu/admin/felhom-controller:0.275.0 Up 6 seconds (healthy)
2026/09/27 10:14:16 main.go:337: [INFO] felhom-controller 0.275.0 starting (customer: demo-hp, domain: enkisfelhom.hu)
@@ -0,0 +1,8 @@
# global floor 0.275.0 (declared MinAgent 0.131.0) — 2026-09-27T10:14:31Z
HTTP/1.1 303 See Other
Location: /configuration?flash=floor_set
2026-09-27T10:14:44Z
demo-hp: gitea.dooplex.hu/admin/felhom-controller:0.275.0
demo-felhom: gitea.dooplex.hu/admin/felhom-controller:0.275.0
gitea.dooplex.hu/admin/felhom-controller:0.275.0 Up 4 seconds (health: starting)
gitea.dooplex.hu/admin/felhom-controller:0.275.0 Up 8 seconds (healthy)
@@ -0,0 +1,27 @@
12:56:12 [X] stop -> 200 {'ok': True, 'message': 'Stack docmost stop completed'}
12:56:44 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'docmost', 'volumes_removed': ['docmost_docmost_postgres_data', 'docmost_docmost_redis_data', 'docmost_docmost_storage']
12:56:52 [X] after remove: deployed=False leftovers='/opt/docker/stacks/docmost'
12:56:55 [X] stop -> 200 {'ok': True, 'message': 'Stack tandoor stop completed'}
12:57:27 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'tandoor', 'volumes_removed': ['tandoor_tandoor_media', 'tandoor_tandoor_postgres_data', 'tandoor_tandoor_static'], 'hdd
12:57:35 [X] after remove: deployed=False leftovers='/opt/docker/stacks/tandoor'
12:57:38 [X] stop -> 200 {'ok': True, 'message': 'Stack adventurelog stop completed'}
12:58:10 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'adventurelog', 'volumes_removed': ['adventurelog_adventurelog_media', 'adventurelog_adventurelog_postgres_data'], 'hdd_
12:58:18 [X] after remove: deployed=False leftovers='/opt/docker/stacks/adventurelog'
sync_interval: 15m
token: <redacted>
username: ""
hub:
0
drill main now f1a7d6c, live main f1a7d6c
# 9202 after teardown 2026-09-27T10:58:55Z
repo_url: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git
0
felhom-controller gitea.dooplex.hu/admin/felhom-controller:0.275.0 Up 25 seconds (healthy)
filebrowser gtstef/filebrowser:1.3.3-stable Up 45 hours (healthy)
paperless-postgres postgres:18-alpine Up About an hour (healthy)
paperless-redis redis:7-alpine Up About an hour (healthy)
paperless-webserver ghcr.io/paperless-ngx/paperless-ngx:2.20.15 Up About an hour (healthy)
privatebin privatebin/pdo:2.0.6 Up 10 hours (healthy)
traefik traefik:v3.6.7 Up 2 days
paperless-ngx_paperless_postgres_data.pre-update-20260927T094421Z
@@ -0,0 +1,48 @@
#!/usr/bin/env python3
"""benchq.py <queue-name> <app> <svc=ref>[,<svc=ref>] [<app> <moves> ...]
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/<app>/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-<queue>.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/a061fcea-2c08-478c-9fd6-991dc8e748f0/scratchpad/bench.sh"
q = sys.argv[1]
args = sys.argv[2:]
out = open(os.path.join(HERE, "..", os.environ.get("BQ", "B"), 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", "B"), "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")
@@ -0,0 +1,47 @@
"""boxmove.py <phase> <app> <sub> [<svc> <from> <to> <fmj> <tmj>] — 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/<app>/box/."""
import json, os, sys, time, subprocess
import walk as w, fixtures
phase, app, sub = sys.argv[1:4]
EVD = f"{w.EV}/B/apps/{app}/box"; os.makedirs(EVD, exist_ok=True)
TOK = w.SC + "/seed-tokens.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] = fixtures.FIXTURES[app].seed(w, sub, say)
json.dump(toks, open(TOK, "w"), default=str); os.chmod(TOK, 0o600)
say(f"C1 seed reads back BEFORE: {fixtures.FIXTURES[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()}")
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 = fixtures.FIXTURES[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.275.0-rc1), 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/version-travel-2026-09-26/B/apps/{app}/box/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']}")
@@ -0,0 +1,39 @@
"""drillmove.py <app> <svc> <from-ref> <to-ref> <from-major> <to-major>
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}")
if int(tmj) >= 18: # 18+ wants the volume at /var/lib/postgresql (09 decision 37)
s = re.sub(r"(-\s+[A-Za-z0-9_.-]*postgres[A-Za-z0-9_.-]*:)/var/lib/postgresql/data(\s*)$", r"\1/var/lib/postgresql\2", s, flags=re.M)
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:])
@@ -1075,6 +1075,10 @@ FIXTURES = {
"adventurelog": Django("adventurelog", "travel", "/admin/login/"),
"tandoor": Django("tandoor", "recipes", "/accounts/login/",
python="/opt/recipes/venv/bin/python", workdir="/opt/recipes"),
# 2026-09-26 (version-travel Part B): paperless-ngx is Django too — `manage.py` in its WORKDIR
# (/usr/src/paperless/src), python3 on PATH; measured on 9202 (the readback answered False for a
# username that cannot exist) before this line was written.
"paperless-ngx": Django("paperless-webserver", "paperless", "/accounts/login/"),
"privatebin": PrivateBin(),
"docmost": Docmost(),
"bookstack": BookStack(),