Big steps close-out: Wanderer, Termix, Homepage, Seerr live (bench + box + undo); R-1335/R-1311/R-1320/R-1317 closed, R-1338 opened, R-1334 VERIFY (0 refused in two dry runs, no login); 09 decision 279 + [DESIGN] path rule; STATUS, CONTEXT, evidence
gates / gates (push) Successful in 2m53s

This commit is contained in:
admin committed 2026-10-28 18:23:33 +01:00
1 parent 3c0a33c1a0
commit 1be7aa87dc
141 files changed
+14955 -11

No files matched your search

@@ -1153,6 +1153,26 @@ its length, and both fixes cost something the household would notice — operato
major gets automated by accident). Why A: the brief („a normal step if it counts as a main version in our ladder
rules, else the lane") and the one-comparator rule; the box walk + soak is the guard either way.
### 2026-10-28 (afternoon, attended) — the four big steps; D59 ends; Wanderer's inbound federation stays off
279. **D59 ends: Wanderer is offered again** after its big step v0.20.0 → v0.21.2 went live (catalog `1825247`), and
**its inbound federation stays OFF** — the template sets no `POCKETBASE_PROXY_SECRET`, so v0.21 rejects every
inbound ActivityPub delivery (fail closed, upstream's docs). Options: off (a family instance takes nothing from
strangers' servers; the route GHSA-fprh abused stays shut) or on (a generated shared secret; other servers deliver
follows, comments, updates). *Operator, 2026-10-28, at the Wanderer STOP; CC's pick both times.*
**[DESIGN] A pin move needs its step — also when no box runs the app (2026-10-28, stated here because the brief asked
for „the rule for a pin change when no box runs the old version" and this document did not say it).** The rule lives in
the catalog: `app-catalog-felhom.eu/CLAUDE.md` („An `image:` move needs its TEST RECORD") and its gates —
`check-test-record.py` (the newest ladder entry IS the compose) and `check-test-record-move.py` (a moved ref must add a
proven entry). There is no exception for an app no box runs: the writer (`upgrade-test.py --write-ladder`) refuses
unless the bench AND the box walk say `proven`, so every big step is a normal ladder step. A big step's UNDO is proven
on 9202 as well (the 2026-10-27 Jellyfin method, generalised in `audits/dockerhub-bigsteps-2026-10-28/undo_proof2.py`):
TO with failing checks must end `undone` and the seed must read back on FROM. **The broken probe must fail on any app:**
a single-page app answers 200 on every path, so a „no such path" probe passed and Termix's update ended `done`; the
tool now probes port 1. `test-record-move` also refuses a `memory_tight` step whose range does not raise the limit —
Wanderer's Meilisearch went 256 → 384 MB and was measured again (it sizes itself to its limit: 88.8 %).
### 2026-10-28 (day, attended) — RomM kept; the runtime cache fills itself in CI
277. **D61 = keep RomM offered** (R-1330) while no RomM release carries Node ≥ 24.22.1; the first one that does is taken
@@ -0,0 +1,114 @@
[13:22:12] scratch drive folders cleared before FROM (R-656): none existed
[13:22:12] MV-homepage: deploying homepage at FROM {'homepage': 'ghcr.io/gethomepage/homepage:v1.13.2'}
[13:23:07] FROM settled=True in 30.9s :: {"homepage": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[13:23:07] fixture: the BOX walk's own (Homepage), through upgrade_boxport
[13:23:07] homepage: first-start config read: services=['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'] bookmarks=['Developer', 'Developer/Github', 'Entertainment', 'Entertainment/YouTube', 'Social', 'Social/Reddit']
[13:23:07] homepage: the same services and bookmarks after: True (['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'])
[13:23:07] C1 (seed reads back BEFORE): True
[13:23:07] MV-homepage: swapping to TO {'homepage': 'ghcr.io/gethomepage/homepage:v2.7.0'}
[13:23:25] TO up -d rc=0
[13:23:56] TO settled=True in 30.9s :: {"homepage": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[13:23:56] migration lines observed: 0
[13:23:56] homepage: the same services and bookmarks after: True (['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'])
[13:23:56] RESULT (seed reads back AFTER): True
[13:23:57] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:3000
[13:24:12] + 15s homepage=154M/256M peak=171M kills=0 rs=0 reqs=280
[13:24:27] + 30s homepage=156M/256M peak=199M kills=0 rs=0 reqs=562
[13:24:42] + 45s homepage=155M/256M peak=199M kills=0 rs=0 reqs=844
[13:24:57] + 60s homepage=162M/256M peak=199M kills=0 rs=0 reqs=1127
[13:25:12] + 76s homepage=160M/256M peak=199M kills=0 rs=0 reqs=1409
[13:25:27] + 91s homepage=160M/256M peak=199M kills=0 rs=0 reqs=1692
[13:25:43] + 106s homepage=161M/256M peak=199M kills=0 rs=0 reqs=1972
[13:25:58] + 121s homepage=161M/256M peak=199M kills=0 rs=0 reqs=2256
[13:26:13] + 136s homepage=160M/256M peak=199M kills=0 rs=0 reqs=2539
[13:26:28] + 151s homepage=162M/256M peak=199M kills=0 rs=0 reqs=2822
[13:26:43] + 166s homepage=161M/256M peak=199M kills=0 rs=0 reqs=3102
[13:26:58] + 182s homepage=161M/256M peak=199M kills=0 rs=0 reqs=3386
[13:27:13] + 197s homepage=161M/256M peak=199M kills=0 rs=0 reqs=3670
[13:27:28] + 212s homepage=161M/256M peak=199M kills=0 rs=0 reqs=3954
[13:27:44] + 227s homepage=161M/256M peak=199M kills=0 rs=0 reqs=4235
[13:27:59] + 242s homepage=162M/256M peak=199M kills=0 rs=0 reqs=4519
[13:28:14] + 257s homepage=162M/256M peak=199M kills=0 rs=0 reqs=4802
[13:28:29] + 272s homepage=162M/256M peak=199M kills=0 rs=0 reqs=5085
[13:28:44] + 288s homepage=163M/256M peak=199M kills=0 rs=0 reqs=5366
[13:28:59] + 303s homepage=163M/256M peak=199M kills=0 rs=0 reqs=5651
[13:29:14] + 318s homepage=163M/256M peak=199M kills=0 rs=0 reqs=5932
[13:29:30] + 333s homepage=162M/256M peak=199M kills=0 rs=0 reqs=6216
[13:29:45] + 348s homepage=162M/256M peak=199M kills=0 rs=0 reqs=6498
[13:30:00] + 363s homepage=163M/256M peak=199M kills=0 rs=0 reqs=6782
[13:30:15] + 378s homepage=162M/256M peak=199M kills=0 rs=0 reqs=7064
[13:30:30] + 393s homepage=164M/256M peak=199M kills=0 rs=0 reqs=7348
[13:30:45] + 408s homepage=163M/256M peak=199M kills=0 rs=0 reqs=7633
[13:31:00] + 424s homepage=163M/256M peak=199M kills=0 rs=0 reqs=7917
[13:31:15] + 439s homepage=163M/256M peak=199M kills=0 rs=0 reqs=8202
[13:31:31] + 454s homepage=163M/256M peak=199M kills=0 rs=0 reqs=8486
[13:31:46] + 469s homepage=163M/256M peak=199M kills=0 rs=0 reqs=8769
[13:32:01] + 484s homepage=163M/256M peak=199M kills=0 rs=0 reqs=9054
[13:32:16] + 499s homepage=163M/256M peak=199M kills=0 rs=0 reqs=9339
[13:32:31] + 514s homepage=163M/256M peak=199M kills=0 rs=0 reqs=9623
[13:32:46] + 530s homepage=163M/256M peak=199M kills=0 rs=0 reqs=9907
[13:33:01] + 545s homepage=162M/256M peak=199M kills=0 rs=0 reqs=10191
[13:33:17] + 560s homepage=163M/256M peak=199M kills=0 rs=0 reqs=10475
[13:33:32] + 575s homepage=165M/256M peak=199M kills=0 rs=0 reqs=10759
[13:33:47] + 590s homepage=163M/256M peak=199M kills=0 rs=0 reqs=11044
[13:34:02] + 605s homepage=163M/256M peak=199M kills=0 rs=0 reqs=11328
[13:34:02] memory watch: killed=False tight=[] requests=11329 codes={'200': 11329}
[13:34:02] MV-homepage: ABORT — putting the FROM images back
[13:34:34] homepage: the same services and bookmarks after: True (['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'])
[13:34:34] ABORT: app came back in 30.9s; data present=True
{
"harness_version": 5,
"edge": "MV-homepage",
"app": "homepage",
"note": "night 2026-09-23 within-a-major move: homepage=ghcr.io/gethomepage/homepage:v2.7.0",
"from": {
"homepage": "ghcr.io/gethomepage/homepage:v1.13.2"
},
"to": {
"homepage": "ghcr.io/gethomepage/homepage:v2.7.0"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": null,
"abort": "starts-and-serves",
"abort_detail": null,
"engine_state_after": null,
"memory": {
"soak_s": 605.6,
"requested_s": 600,
"requests": 11329,
"codes": {
"200": 11329
},
"first_kill": null,
"containers": {
"homepage": {
"limit": 268435456,
"peak": 208699392,
"peak_pct": 0.777,
"anon_peak_sampled": 161771520,
"anon_peak_pct": 0.603,
"swap_peak": 0,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"venue_swap_bytes": 0,
"load": "reached"
},
"marks": [],
"bench_overrides": null,
"duration_s": 30.9,
"measured_at": "2026-10-28T13:34:34Z",
"evidence": "evidence/MV-homepage",
"scratch_cleared": [],
"files_changed": [],
"files_changed_detail": [],
"files_ignored": [],
"total_s": 741.8
}
@@ -0,0 +1,8 @@
{
"homepage": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
}
}
@@ -0,0 +1,7 @@
homepage | Skipping ownership changes for /app/config
homepage | Skipping ownership changes for /app/config/logs
homepage | /app/.next already owned by correct UID/GID or running as root, skipping chown
homepage | ▲ Next.js 16.2.6
homepage | - Local: http://[::1]:3000
homepage | - Network: http://[::]:3000
homepage | ✓ Ready in 0ms
@@ -0,0 +1,762 @@
[
{
"t": 15.1,
"containers": {
"homepage": {
"limit": 268435456,
"current": 161652736,
"peak": 179814400,
"anon": 150859776,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 280
},
{
"t": 30.3,
"containers": {
"homepage": {
"limit": 268435456,
"current": 163991552,
"peak": 208699392,
"anon": 152416256,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 562
},
{
"t": 45.4,
"containers": {
"homepage": {
"limit": 268435456,
"current": 163385344,
"peak": 208699392,
"anon": 152231936,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 844
},
{
"t": 60.5,
"containers": {
"homepage": {
"limit": 268435456,
"current": 169988096,
"peak": 208699392,
"anon": 158003200,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 1127
},
{
"t": 75.6,
"containers": {
"homepage": {
"limit": 268435456,
"current": 168656896,
"peak": 208699392,
"anon": 157360128,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 1409
},
{
"t": 90.8,
"containers": {
"homepage": {
"limit": 268435456,
"current": 168165376,
"peak": 208699392,
"anon": 156856320,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 1692
},
{
"t": 105.9,
"containers": {
"homepage": {
"limit": 268435456,
"current": 169406464,
"peak": 208699392,
"anon": 158060544,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 1972
},
{
"t": 121.0,
"containers": {
"homepage": {
"limit": 268435456,
"current": 169168896,
"peak": 208699392,
"anon": 157667328,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 2256
},
{
"t": 136.2,
"containers": {
"homepage": {
"limit": 268435456,
"current": 168607744,
"peak": 208699392,
"anon": 157224960,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 2539
},
{
"t": 151.3,
"containers": {
"homepage": {
"limit": 268435456,
"current": 170373120,
"peak": 208699392,
"anon": 158826496,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 2822
},
{
"t": 166.4,
"containers": {
"homepage": {
"limit": 268435456,
"current": 169033728,
"peak": 208699392,
"anon": 157913088,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 3102
},
{
"t": 181.6,
"containers": {
"homepage": {
"limit": 268435456,
"current": 169242624,
"peak": 208699392,
"anon": 157732864,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 3386
},
{
"t": 196.7,
"containers": {
"homepage": {
"limit": 268435456,
"current": 169426944,
"peak": 208699392,
"anon": 157798400,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 3670
},
{
"t": 211.8,
"containers": {
"homepage": {
"limit": 268435456,
"current": 168857600,
"peak": 208699392,
"anon": 157683712,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 3954
},
{
"t": 227.0,
"containers": {
"homepage": {
"limit": 268435456,
"current": 169488384,
"peak": 208699392,
"anon": 157790208,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 4235
},
{
"t": 242.1,
"containers": {
"homepage": {
"limit": 268435456,
"current": 170385408,
"peak": 208699392,
"anon": 158494720,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 4519
},
{
"t": 257.2,
"containers": {
"homepage": {
"limit": 268435456,
"current": 169967616,
"peak": 208699392,
"anon": 158564352,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 4802
},
{
"t": 272.4,
"containers": {
"homepage": {
"limit": 268435456,
"current": 170127360,
"peak": 208699392,
"anon": 159055872,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 5085
},
{
"t": 287.5,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171749376,
"peak": 208699392,
"anon": 160464896,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 5366
},
{
"t": 302.6,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171405312,
"peak": 208699392,
"anon": 159744000,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 5651
},
{
"t": 317.7,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171618304,
"peak": 208699392,
"anon": 160129024,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 5932
},
{
"t": 332.9,
"containers": {
"homepage": {
"limit": 268435456,
"current": 170696704,
"peak": 208699392,
"anon": 159551488,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 6216
},
{
"t": 348.0,
"containers": {
"homepage": {
"limit": 268435456,
"current": 170672128,
"peak": 208699392,
"anon": 159531008,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 6498
},
{
"t": 363.1,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171352064,
"peak": 208699392,
"anon": 160030720,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 6782
},
{
"t": 378.3,
"containers": {
"homepage": {
"limit": 268435456,
"current": 170725376,
"peak": 208699392,
"anon": 159576064,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 7064
},
{
"t": 393.4,
"containers": {
"homepage": {
"limit": 268435456,
"current": 172216320,
"peak": 208699392,
"anon": 160309248,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 7348
},
{
"t": 408.5,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171229184,
"peak": 208699392,
"anon": 159686656,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 7633
},
{
"t": 423.7,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171028480,
"peak": 208699392,
"anon": 159797248,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 7917
},
{
"t": 438.8,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171425792,
"peak": 208699392,
"anon": 159899648,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 8202
},
{
"t": 454.0,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171757568,
"peak": 208699392,
"anon": 159948800,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 8486
},
{
"t": 469.1,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171950080,
"peak": 208699392,
"anon": 160251904,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 8769
},
{
"t": 484.2,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171294720,
"peak": 208699392,
"anon": 160100352,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 9054
},
{
"t": 499.4,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171728896,
"peak": 208699392,
"anon": 159932416,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 9339
},
{
"t": 514.5,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171315200,
"peak": 208699392,
"anon": 160292864,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 9623
},
{
"t": 529.7,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171278336,
"peak": 208699392,
"anon": 160030720,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 9907
},
{
"t": 544.8,
"containers": {
"homepage": {
"limit": 268435456,
"current": 170803200,
"peak": 208699392,
"anon": 159604736,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 10191
},
{
"t": 559.9,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171347968,
"peak": 208699392,
"anon": 159899648,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 10475
},
{
"t": 575.0,
"containers": {
"homepage": {
"limit": 268435456,
"current": 173502464,
"peak": 208699392,
"anon": 161771520,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 10759
},
{
"t": 590.2,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171962368,
"peak": 208699392,
"anon": 160731136,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 11044
},
{
"t": 605.3,
"containers": {
"homepage": {
"limit": 268435456,
"current": 171524096,
"peak": 208699392,
"anon": 160374784,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 11328
}
]
@@ -0,0 +1,58 @@
[13:22:12] scratch drive folders cleared before FROM (R-656): none existed
[13:22:12] MV-homepage: deploying homepage at FROM {'homepage': 'ghcr.io/gethomepage/homepage:v1.13.2'}
[13:23:07] FROM settled=True in 30.9s :: {"homepage": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[13:23:07] fixture: the BOX walk's own (Homepage), through upgrade_boxport
[13:23:07] homepage: first-start config read: services=['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'] bookmarks=['Developer', 'Developer/Github', 'Entertainment', 'Entertainment/YouTube', 'Social', 'Social/Reddit']
[13:23:07] homepage: the same services and bookmarks after: True (['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'])
[13:23:07] C1 (seed reads back BEFORE): True
[13:23:07] MV-homepage: swapping to TO {'homepage': 'ghcr.io/gethomepage/homepage:v2.7.0'}
[13:23:25] TO up -d rc=0
[13:23:56] TO settled=True in 30.9s :: {"homepage": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[13:23:56] migration lines observed: 0
[13:23:56] homepage: the same services and bookmarks after: True (['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'])
[13:23:56] RESULT (seed reads back AFTER): True
[13:23:57] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:3000
[13:24:12] + 15s homepage=154M/256M peak=171M kills=0 rs=0 reqs=280
[13:24:27] + 30s homepage=156M/256M peak=199M kills=0 rs=0 reqs=562
[13:24:42] + 45s homepage=155M/256M peak=199M kills=0 rs=0 reqs=844
[13:24:57] + 60s homepage=162M/256M peak=199M kills=0 rs=0 reqs=1127
[13:25:12] + 76s homepage=160M/256M peak=199M kills=0 rs=0 reqs=1409
[13:25:27] + 91s homepage=160M/256M peak=199M kills=0 rs=0 reqs=1692
[13:25:43] + 106s homepage=161M/256M peak=199M kills=0 rs=0 reqs=1972
[13:25:58] + 121s homepage=161M/256M peak=199M kills=0 rs=0 reqs=2256
[13:26:13] + 136s homepage=160M/256M peak=199M kills=0 rs=0 reqs=2539
[13:26:28] + 151s homepage=162M/256M peak=199M kills=0 rs=0 reqs=2822
[13:26:43] + 166s homepage=161M/256M peak=199M kills=0 rs=0 reqs=3102
[13:26:58] + 182s homepage=161M/256M peak=199M kills=0 rs=0 reqs=3386
[13:27:13] + 197s homepage=161M/256M peak=199M kills=0 rs=0 reqs=3670
[13:27:28] + 212s homepage=161M/256M peak=199M kills=0 rs=0 reqs=3954
[13:27:44] + 227s homepage=161M/256M peak=199M kills=0 rs=0 reqs=4235
[13:27:59] + 242s homepage=162M/256M peak=199M kills=0 rs=0 reqs=4519
[13:28:14] + 257s homepage=162M/256M peak=199M kills=0 rs=0 reqs=4802
[13:28:29] + 272s homepage=162M/256M peak=199M kills=0 rs=0 reqs=5085
[13:28:44] + 288s homepage=163M/256M peak=199M kills=0 rs=0 reqs=5366
[13:28:59] + 303s homepage=163M/256M peak=199M kills=0 rs=0 reqs=5651
[13:29:14] + 318s homepage=163M/256M peak=199M kills=0 rs=0 reqs=5932
[13:29:30] + 333s homepage=162M/256M peak=199M kills=0 rs=0 reqs=6216
[13:29:45] + 348s homepage=162M/256M peak=199M kills=0 rs=0 reqs=6498
[13:30:00] + 363s homepage=163M/256M peak=199M kills=0 rs=0 reqs=6782
[13:30:15] + 378s homepage=162M/256M peak=199M kills=0 rs=0 reqs=7064
[13:30:30] + 393s homepage=164M/256M peak=199M kills=0 rs=0 reqs=7348
[13:30:45] + 408s homepage=163M/256M peak=199M kills=0 rs=0 reqs=7633
[13:31:00] + 424s homepage=163M/256M peak=199M kills=0 rs=0 reqs=7917
[13:31:15] + 439s homepage=163M/256M peak=199M kills=0 rs=0 reqs=8202
[13:31:31] + 454s homepage=163M/256M peak=199M kills=0 rs=0 reqs=8486
[13:31:46] + 469s homepage=163M/256M peak=199M kills=0 rs=0 reqs=8769
[13:32:01] + 484s homepage=163M/256M peak=199M kills=0 rs=0 reqs=9054
[13:32:16] + 499s homepage=163M/256M peak=199M kills=0 rs=0 reqs=9339
[13:32:31] + 514s homepage=163M/256M peak=199M kills=0 rs=0 reqs=9623
[13:32:46] + 530s homepage=163M/256M peak=199M kills=0 rs=0 reqs=9907
[13:33:01] + 545s homepage=162M/256M peak=199M kills=0 rs=0 reqs=10191
[13:33:17] + 560s homepage=163M/256M peak=199M kills=0 rs=0 reqs=10475
[13:33:32] + 575s homepage=165M/256M peak=199M kills=0 rs=0 reqs=10759
[13:33:47] + 590s homepage=163M/256M peak=199M kills=0 rs=0 reqs=11044
[13:34:02] + 605s homepage=163M/256M peak=199M kills=0 rs=0 reqs=11328
[13:34:02] memory watch: killed=False tight=[] requests=11329 codes={'200': 11329}
[13:34:02] MV-homepage: ABORT — putting the FROM images back
[13:34:34] homepage: the same services and bookmarks after: True (['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'])
[13:34:34] ABORT: app came back in 30.9s; data present=True
@@ -0,0 +1,9 @@
homepage | Skipping ownership changes for /app/config
homepage | Skipping ownership changes for /app/config/logs
homepage | /app/.next already owned by correct UID/GID or running as root, skipping chown
homepage | ▲ Next.js 16.4.1
homepage | - Local: http://[::1]:3000
homepage | - Network: http://[::]:3000
homepage | ✓ Ready in 0ms
homepage | ✓ Running next.config took 2ms
homepage | [2026-10-28T13:23:55.893Z] info: widgets.yaml was copied to the config folder
@@ -0,0 +1,8 @@
{
"homepage": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
}
}
@@ -0,0 +1,56 @@
{
"harness_version": 5,
"edge": "MV-homepage",
"app": "homepage",
"note": "night 2026-09-23 within-a-major move: homepage=ghcr.io/gethomepage/homepage:v2.7.0",
"from": {
"homepage": "ghcr.io/gethomepage/homepage:v1.13.2"
},
"to": {
"homepage": "ghcr.io/gethomepage/homepage:v2.7.0"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": null,
"abort": "starts-and-serves",
"abort_detail": null,
"engine_state_after": null,
"memory": {
"soak_s": 605.6,
"requested_s": 600,
"requests": 11329,
"codes": {
"200": 11329
},
"first_kill": null,
"containers": {
"homepage": {
"limit": 268435456,
"peak": 208699392,
"peak_pct": 0.777,
"anon_peak_sampled": 161771520,
"anon_peak_pct": 0.603,
"swap_peak": 0,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"venue_swap_bytes": 0,
"load": "reached"
},
"marks": [],
"bench_overrides": null,
"duration_s": 30.9,
"measured_at": "2026-10-28T13:34:34Z",
"evidence": "evidence/MV-homepage",
"scratch_cleared": [],
"files_changed": [],
"files_changed_detail": [],
"files_ignored": [],
"total_s": 741.8
}
@@ -0,0 +1,231 @@
{
"app": "homepage",
"walk": "security",
"box_walk_version": 1,
"verdict": "proven",
"venue": "box 9202 (drill catalog), the guarded Update",
"from": {
"homepage": "ghcr.io/gethomepage/homepage:v1.13.2"
},
"to": {
"homepage": "ghcr.io/gethomepage/homepage:v2.7.0"
},
"observables_before": {
"pinned_images": {
"homepage": "ghcr.io/gethomepage/homepage:v1.13.2"
},
"installed_images": {
"homepage": "ghcr.io/gethomepage/homepage:v1.13.2"
},
"catalog_images": {
"homepage": "ghcr.io/gethomepage/homepage:v1.13.2"
},
"live_compose_image_lines": [
"image: ghcr.io/gethomepage/homepage:v1.13.2"
],
"docker_inspect": [
"homepage ghcr.io/gethomepage/homepage:v1.13.2 running=true restarts=0"
]
},
"setup_gate_before": {
"browser": {
"status": "302",
"redirect": "https://felhom.enkisfelhom.hu/__family/start?…"
},
"script": {
"status": "401",
"redirect": null
}
},
"seed": "read_back",
"drill_commit": "05ffd16393f5",
"sync_waited_s": 4.5,
"badge_before": {
"hu": [
{
"title": "Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.",
"text": "Frissítés elérhető — ma"
}
],
"en": [
{
"title": "A newer version of this app is available. Select the Update button to start it.",
"text": "Update available — today"
}
]
},
"measured_at": "2026-10-28T14:06:00Z",
"update": {
"accepted": true,
"http": "202",
"phases": [
{
"t": 0.0,
"phase": "backing-up",
"label": "Biztonsági mentés készül a frissítés előtt…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 2.1,
"phase": "safety-dump",
"label": "Adatbázis pillanatkép…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 3.1,
"phase": "pulling",
"label": "Új verzió letöltése…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 15.4,
"phase": "copying",
"label": "Az adatok másolása a frissítés előtt…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 21.5,
"phase": "starting",
"label": "Indítás az új verzióval…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 22.6,
"phase": "verifying",
"label": "Működés ellenőrzése…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 32.8,
"phase": "done",
"label": "Frissítve",
"updating": false,
"error": null,
"hold": null
}
],
"duration_s": 32.8,
"final_phase": "done",
"update_error": null,
"hold_reason": null,
"state": "running"
},
"observables_after": {
"pinned_images": {
"homepage": "ghcr.io/gethomepage/homepage:v2.7.0"
},
"installed_images": {
"homepage": "ghcr.io/gethomepage/homepage:v2.7.0"
},
"catalog_images": {
"homepage": "ghcr.io/gethomepage/homepage:v2.7.0"
},
"live_compose_image_lines": [
"image: ghcr.io/gethomepage/homepage:v2.7.0"
],
"docker_inspect": [
"homepage ghcr.io/gethomepage/homepage:v2.7.0 running=true restarts=0"
]
},
"badge_after": {
"hu": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"en": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
]
},
"state_after": "running",
"hold_after": null,
"to_digests": {
"homepage": "sha256:19c5c09184458a41b7b5915e71463a39f36cd33540f41bdbed008791b8182d5f"
},
"four_observables": {
"pinned": {
"homepage": "ghcr.io/gethomepage/homepage:v2.7.0"
},
"installed": {
"homepage": "ghcr.io/gethomepage/homepage:v2.7.0"
},
"catalog": {
"homepage": "ghcr.io/gethomepage/homepage:v2.7.0"
},
"live_compose": [
"ghcr.io/gethomepage/homepage:v2.7.0"
]
},
"seed_read_after": true,
"setup_gate_after": {
"browser": {
"status": "302",
"redirect": "https://felhom.enkisfelhom.hu/__family/start?…"
},
"script": {
"status": "401",
"redirect": null
}
},
"memory": {
"soak_s": 600,
"interval_s": 10,
"samples": 60,
"containers": {
"homepage": {
"samples": 60,
"anon_peak_bytes": 113119232,
"limit_bytes": 268435456,
"anon_peak_pct": 42.1,
"cgroup_peak_pct": 47.1,
"oom_kill_delta": 0,
"oom_killed_flag": false,
"restarts_delta": 0,
"running_all_samples": true,
"cgroup": "/sys/fs/cgroup/system.slice/docker-08d02265b7bf6977d598cb090c27333644e839e6f3afc81cf33231564b86826d.scope"
}
},
"oom_kills": 0,
"restarts": 0,
"peak_pct": 42.1
},
"why": "the security-fix step ran on the box through the guarded Update; healthy, TO on all four observables, no undo, no hold, a clean soak, seed read back",
"log": [
"15:05:02 [5] the box's drill mirror now at 4834d9dce",
"15:05:06 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}",
"15:05:41 [1] deployed, controller state=running, pinned={'homepage': 'ghcr.io/gethomepage/homepage:v1.13.2'}",
"15:05:42 family gate: home is family-gated — passed as the household (cookie set)",
"15:05:45 [2] setup gate as installed: {'browser': {'status': '302', 'redirect': 'https://felhom.enkisfelhom.hu/__family/start?…'}, 'script': {'status': '401', 'redirect': None}}",
"15:05:45 homepage: first-start config read: services=['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'] bookmarks=['Developer', 'Developer/Github', 'Entertainment', 'Entertainment/YouTube', 'Social', 'Social/Reddit']",
"15:05:45 homepage: the same services and bookmarks after: True (['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'])",
"15:05:46 [5] drill commit 05ffd16393f5: homepage ghcr.io/gethomepage/homepage:v1.13.2 -> ghcr.io/gethomepage/homepage:v2.7.0 (push rc=0)",
"15:05:55 [5] the box's drill mirror now at 05ffd1639",
"15:06:00 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}",
"15:06:00 + 0.0s phase=backing-up label=Biztonsági mentés készül a frissítés előtt… err=None hold=None",
"15:06:02 + 2.1s phase=safety-dump label=Adatbázis pillanatkép… err=None hold=None",
"15:06:03 + 3.1s phase=pulling label=Új verzió letöltése… err=None hold=None",
"15:06:15 + 15.4s phase=copying label=Az adatok másolása a frissítés előtt… err=None hold=None",
"15:06:21 + 21.5s phase=starting label=Indítás az új verzióval… err=None hold=None",
"15:06:22 + 22.6s phase=verifying label=Működés ellenőrzése… err=None hold=None",
"15:06:33 + 32.8s phase=done label=Frissítve err=None hold=None",
"15:06:51 homepage: the same services and bookmarks after: True (['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'])",
"15:06:51 [7] memory soak 600 s …",
"15:16:57 [7] soak: peak 42.1% of the limit (anon), kills 0, restarts 0"
]
}
@@ -0,0 +1,25 @@
15:05:02 [5] the box's drill mirror now at 4834d9dce
15:05:06 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
15:05:41 [1] deployed, controller state=running, pinned={'homepage': 'ghcr.io/gethomepage/homepage:v1.13.2'}
15:05:42 family gate: home is family-gated — passed as the household (cookie set)
15:05:45 [2] setup gate as installed: {'browser': {'status': '302', 'redirect': 'https://felhom.enkisfelhom.hu/__family/start?…'}, 'script': {'status': '401', 'redirect': None}}
15:05:45 homepage: first-start config read: services=['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'] bookmarks=['Developer', 'Developer/Github', 'Entertainment', 'Entertainment/YouTube', 'Social', 'Social/Reddit']
15:05:45 homepage: the same services and bookmarks after: True (['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'])
15:05:46 [5] drill commit 05ffd16393f5: homepage ghcr.io/gethomepage/homepage:v1.13.2 -> ghcr.io/gethomepage/homepage:v2.7.0 (push rc=0)
15:05:55 [5] the box's drill mirror now at 05ffd1639
15:06:00 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}
15:06:00 + 0.0s phase=backing-up label=Biztonsági mentés készül a frissítés előtt… err=None hold=None
15:06:02 + 2.1s phase=safety-dump label=Adatbázis pillanatkép… err=None hold=None
15:06:03 + 3.1s phase=pulling label=Új verzió letöltése… err=None hold=None
15:06:15 + 15.4s phase=copying label=Az adatok másolása a frissítés előtt… err=None hold=None
15:06:21 + 21.5s phase=starting label=Indítás az új verzióval… err=None hold=None
15:06:22 + 22.6s phase=verifying label=Működés ellenőrzése… err=None hold=None
15:06:33 + 32.8s phase=done label=Frissítve err=None hold=None
15:06:51 homepage: the same services and bookmarks after: True (['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'])
15:06:51 [7] memory soak 600 s …
15:16:57 [7] soak: peak 42.1% of the limit (anon), kills 0, restarts 0
15:16:57 [9] verdict proven -> /tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/0b76c4d7-9b39-4e4e-869d-d0d2c6006331/scratchpad/p2/box/homepage/verdict.json
15:16:57 RESULT proven — the security-fix step ran on the box through the guarded Update; healthy, TO on all four observables, no undo, no hold, a clean soak, seed read back
15:16:57 [X] stop -> 200 {'ok': True, 'message': 'Stack homepage stop completed'}
15:17:29 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'homepage', 'volumes_removed': ['homepage_homepage_config'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'A
15:17:38 [X] after remove: deployed=False leftovers=''
@@ -0,0 +1,24 @@
16:06:23 [5] the box's drill mirror now at c1b7f241d
16:06:28 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
16:06:58 [1] deployed, controller state=running, pinned={'homepage': 'ghcr.io/gethomepage/homepage:v1.13.2'}
16:06:58 family gate: home is family-gated — passed as the household (cookie set)
16:06:58 homepage: first-start config read: services=['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'] bookmarks=['Developer', 'Developer/Github', 'Entertainment', 'Entertainment/YouTube', 'Social', 'Social/Reddit']
16:06:58 homepage: the same services and bookmarks after: True (['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'])
16:06:59 drill commit c6c4b528c5ab: homepage TO with failing checks
16:07:08 [5] the box's drill mirror now at c6c4b528c
16:07:13 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}
16:07:13 + 0.0s phase=backing-up label=Biztonsági mentés készül a frissítés előtt… err=None hold=None
16:07:16 + 3.1s phase=pulling label=Új verzió letöltése… err=None hold=None
16:07:36 + 22.6s phase=copying label=Az adatok másolása a frissítés előtt… err=None hold=None
16:07:43 + 29.8s phase=starting label=Indítás az új verzióval… err=None hold=None
16:07:44 + 30.8s phase=verifying label=Működés ellenőrzése… err=None hold=None
16:12:46 + 333.1s phase=undoing label=Visszaállítás az előző változatra… err=None hold=None
16:12:59 + 345.5s phase=undone label=Visszaállítva az előző változatra err=None hold=None
16:13:28 homepage: the same services and bookmarks after: True (['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'])
16:13:28 RESULT proven — TO started on the data and failed its check; the box undid it: FROM runs again and the seed reads back
16:13:29 [X] stop -> 200 {'ok': True, 'message': 'Stack homepage stop completed'}
16:14:01 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'homepage', 'volumes_removed': ['homepage_homepage_config'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'A
16:14:09 [X] after remove: deployed=False leftovers=''
16:14:19 [5] the box's drill mirror now at f574f6fef
16:14:19 drill revert c6c4b528c5ab: rc=0
16:14:19 drill templates/homepage equal to before: True
@@ -0,0 +1,144 @@
{
"app": "homepage",
"from": {
"homepage": "ghcr.io/gethomepage/homepage:v1.13.2"
},
"to": {
"homepage": "ghcr.io/gethomepage/homepage:v2.7.0"
},
"started": "2026-10-28T15:06:14Z",
"drill_head_before": "c1b7f241da1dfef40579011f9d032dcafbbf29c4",
"failing_compose_main_healthcheck": [
"test: [\"CMD\", \"false\"]"
],
"failing_probe": true,
"update": {
"accepted": true,
"http": "202",
"phases": [
{
"t": 0.0,
"phase": "backing-up",
"label": "Biztons\u00e1gi ment\u00e9s k\u00e9sz\u00fcl a friss\u00edt\u00e9s el\u0151tt\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 3.1,
"phase": "pulling",
"label": "\u00daj verzi\u00f3 let\u00f6lt\u00e9se\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 22.6,
"phase": "copying",
"label": "Az adatok m\u00e1sol\u00e1sa a friss\u00edt\u00e9s el\u0151tt\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 29.8,
"phase": "starting",
"label": "Ind\u00edt\u00e1s az \u00faj verzi\u00f3val\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 30.8,
"phase": "verifying",
"label": "M\u0171k\u00f6d\u00e9s ellen\u0151rz\u00e9se\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 333.1,
"phase": "undoing",
"label": "Vissza\u00e1ll\u00edt\u00e1s az el\u0151z\u0151 v\u00e1ltozatra\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 345.5,
"phase": "undone",
"label": "Vissza\u00e1ll\u00edtva az el\u0151z\u0151 v\u00e1ltozatra",
"updating": false,
"error": null,
"hold": null
}
],
"duration_s": 345.5,
"final_phase": "undone",
"update_error": null,
"hold_reason": null,
"state": "running"
},
"to_log_while_verifying": [
"ghcr.io/gethomepage/homepage:v2.7.0",
"Skipping ownership changes for /app/config",
"Skipping ownership changes for /app/config/logs",
"/app/.next already owned by correct UID/GID or running as root, skipping chown",
"\u25b2 Next.js 16.4.1",
"- Local: http://[::1]:3000",
"- Network: http://[::]:3000",
"\u2713 Ready in 0ms",
"\u2713 Running next.config took 3ms"
],
"observables_after": {
"pinned_images": {
"homepage": "ghcr.io/gethomepage/homepage:v1.13.2"
},
"installed_images": {
"homepage": "ghcr.io/gethomepage/homepage:v1.13.2"
},
"catalog_images": {
"homepage": "ghcr.io/gethomepage/homepage:v2.7.0"
},
"live_compose_image_lines": [
"image: ghcr.io/gethomepage/homepage:v1.13.2"
],
"docker_inspect": [
"homepage ghcr.io/gethomepage/homepage:v1.13.2 running=true restarts=0"
]
},
"running_images_after": {
"homepage": "ghcr.io/gethomepage/homepage:v1.13.2"
},
"seed_after_undo": true,
"verdict": "proven",
"why": "TO started on the data and failed its check; the box undid it: FROM runs again and the seed reads back",
"drill_head_after": "f574f6fef47182eaa13b330a2b69c7ad8dfdfa18",
"drill_tree_equal_to_before": true,
"log": [
"16:06:23 [5] the box's drill mirror now at c1b7f241d",
"16:06:28 [1] deploy -> 202 {'ok': True, 'message': 'Telep\u00edt\u00e9s elind\u00edtva \u2013 az \u00e1llapot a k\u00e1rty\u00e1n k\u00f6vethet\u0151'}",
"16:06:58 [1] deployed, controller state=running, pinned={'homepage': 'ghcr.io/gethomepage/homepage:v1.13.2'}",
"16:06:58 family gate: home is family-gated \u2014 passed as the household (cookie set)",
"16:06:58 homepage: first-start config read: services=['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'] bookmarks=['Developer', 'Developer/Github', 'Entertainment', 'Entertainment/YouTube', 'Social', 'Social/Reddit']",
"16:06:58 homepage: the same services and bookmarks after: True (['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'])",
"16:06:59 drill commit c6c4b528c5ab: homepage TO with failing checks",
"16:07:08 [5] the box's drill mirror now at c6c4b528c",
"16:07:13 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Friss\u00edt\u00e9s elindult \u2013 az \u00e1llapot a k\u00e1rty\u00e1n k\u00f6vethet\u0151'}",
"16:07:13 + 0.0s phase=backing-up label=Biztons\u00e1gi ment\u00e9s k\u00e9sz\u00fcl a friss\u00edt\u00e9s el\u0151tt\u2026 err=None hold=None",
"16:07:16 + 3.1s phase=pulling label=\u00daj verzi\u00f3 let\u00f6lt\u00e9se\u2026 err=None hold=None",
"16:07:36 + 22.6s phase=copying label=Az adatok m\u00e1sol\u00e1sa a friss\u00edt\u00e9s el\u0151tt\u2026 err=None hold=None",
"16:07:43 + 29.8s phase=starting label=Ind\u00edt\u00e1s az \u00faj verzi\u00f3val\u2026 err=None hold=None",
"16:07:44 + 30.8s phase=verifying label=M\u0171k\u00f6d\u00e9s ellen\u0151rz\u00e9se\u2026 err=None hold=None",
"16:12:46 + 333.1s phase=undoing label=Vissza\u00e1ll\u00edt\u00e1s az el\u0151z\u0151 v\u00e1ltozatra\u2026 err=None hold=None",
"16:12:59 + 345.5s phase=undone label=Vissza\u00e1ll\u00edtva az el\u0151z\u0151 v\u00e1ltozatra err=None hold=None",
"16:13:28 homepage: the same services and bookmarks after: True (['My First Group', 'My First Group/My First Service', 'My Second Group', 'My Second Group/My Second Service', 'My Third Group', 'My Third Group/My Third Service'])",
"16:13:28 RESULT proven \u2014 TO started on the data and failed its check; the box undid it: FROM runs again and the seed reads back",
"16:13:29 [X] stop -> 200 {'ok': True, 'message': 'Stack homepage stop completed'}",
"16:14:01 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'homepage', 'volumes_removed': ['homepage_homepage_config'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'A",
"16:14:09 [X] after remove: deployed=False leftovers=''",
"16:14:19 [5] the box's drill mirror now at f574f6fef",
"16:14:19 drill revert c6c4b528c5ab: rc=0",
"16:14:19 drill templates/homepage equal to before: True"
]
}
@@ -0,0 +1,16 @@
RESTORED-IDENTICAL
26: repo_url: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git
2026/10/28 17:21:37 sync.go:535: [INFO] [sync] Updated wanderer/.felhom.yml
2026/10/28 17:21:37 sync.go:535: [INFO] [sync] Updated zipline/docker-compose.yml
2026/10/28 17:21:37 sync.go:535: [INFO] [sync] Updated zipline/.felhom.yml
2026/10/28 17:21:37 sync.go:261: [INFO] [sync] catalog moved dff3cb84fcea -> 9ef06a7a891f (0 new, 14 stack dir(s) changed)
2026/10/28 17:21:38 sync.go:299: [INFO] [sync] Catalog sync complete
2026/10/28 17:21:38 sync.go:142: [INFO] [sync] Initial sync: Sablonok frissítve — frissítve: adventurelog, dawarich, ghost, home-assistant, homepage, immich, karakeep, metube, papra, seerr, tandoo
26: repo_url: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git
-rw------- 1 root root 1994 Oct 22 14:47 /var/lib/docker/volumes/felhom-controller-data/_data/controller.yaml.pre-release1026-drill
mirror main dff3cb84fc
cache HEAD 9ef06a7
https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git
@@ -0,0 +1,35 @@
[15:23:46] scratch drive folders cleared before FROM (R-656): none existed
[15:23:46] MV-seerr: deploying seerr at FROM {'seerr': 'fallenbagel/jellyseerr:2.7.3'}
[15:24:17] FROM settled=True in 30.9s :: {"seerr": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[15:24:17] fixture: the BOX walk's own (Seerr), through upgrade_boxport
[15:24:22] seerr: throwaway Jellyfin on traefik-public: user=503 complete=503
[15:24:22] seerr: first sign-in through Jellyfin http=500 cookie=False
[15:24:22] INCONCLUSIVE — no non-browser seed route. Nothing was planted by hand.
{
"harness_version": 5,
"edge": "MV-seerr",
"app": "seerr",
"note": "definition step to seerr-v3",
"from": {
"seerr": "fallenbagel/jellyseerr:2.7.3"
},
"to": {
"seerr": "ghcr.io/seerr-team/seerr:v3.5.1"
},
"verdict": "inconclusive",
"seed_read_before": false,
"seed_read_after": false,
"healthy_after": false,
"migration_observed": null,
"abort": "not-attempted",
"abort_detail": "no non-browser seed route",
"engine_state_after": null,
"memory": null,
"marks": [],
"bench_overrides": null,
"duration_s": 35.8,
"measured_at": "2026-10-28T15:24:22Z",
"evidence": "evidence/MV-seerr",
"scratch_cleared": [],
"total_s": 35.8
}
@@ -0,0 +1,24 @@
seerr |
seerr | > jellyseerr@2.7.3 start /app
seerr | > NODE_ENV=production node dist/index.js
seerr |
seerr | 2026-10-28T15:23:50.009Z [info]: Commit Tag: $GIT_SHA
seerr | 2026-10-28T15:23:50.602Z [info]: Starting Jellyseerr version 2.7.3
seerr | 2026-10-28T15:23:51.718Z [info][Notifications]: Registered notification agents
seerr | 2026-10-28T15:23:51.725Z [info][Server]: Skipping starting the scheduled jobs as we have no Plex/Jellyfin/Emby servers setup yet
seerr | 2026-10-28T15:23:51.731Z [info][Discover Slider]: Creating built-in discovery slider {"slider":{"type":1,"enabled":true,"isBuiltIn":true,"order":0}}
seerr | 2026-10-28T15:23:51.752Z [info][Discover Slider]: Creating built-in discovery slider {"slider":{"type":2,"enabled":true,"isBuiltIn":true,"order":1}}
seerr | 2026-10-28T15:23:51.759Z [info][Discover Slider]: Creating built-in discovery slider {"slider":{"type":3,"enabled":true,"isBuiltIn":true,"order":2}}
seerr | 2026-10-28T15:23:51.766Z [info][Discover Slider]: Creating built-in discovery slider {"slider":{"type":4,"enabled":true,"isBuiltIn":true,"order":3}}
seerr | 2026-10-28T15:23:51.773Z [info][Discover Slider]: Creating built-in discovery slider {"slider":{"type":5,"enabled":true,"isBuiltIn":true,"order":4}}
seerr | 2026-10-28T15:23:51.784Z [info][Discover Slider]: Creating built-in discovery slider {"slider":{"type":6,"enabled":true,"isBuiltIn":true,"order":5}}
seerr | 2026-10-28T15:23:51.790Z [info][Discover Slider]: Creating built-in discovery slider {"slider":{"type":7,"enabled":true,"isBuiltIn":true,"order":6}}
seerr | 2026-10-28T15:23:51.796Z [info][Discover Slider]: Creating built-in discovery slider {"slider":{"type":8,"enabled":true,"isBuiltIn":true,"order":7}}
seerr | 2026-10-28T15:23:51.803Z [info][Discover Slider]: Creating built-in discovery slider {"slider":{"type":9,"enabled":true,"isBuiltIn":true,"order":8}}
seerr | 2026-10-28T15:23:51.810Z [info][Discover Slider]: Creating built-in discovery slider {"slider":{"type":10,"enabled":true,"isBuiltIn":true,"order":9}}
seerr | 2026-10-28T15:23:51.816Z [info][Discover Slider]: Creating built-in discovery slider {"slider":{"type":11,"enabled":true,"isBuiltIn":true,"order":10}}
seerr | 2026-10-28T15:23:51.822Z [info][Discover Slider]: Creating built-in discovery slider {"slider":{"type":12,"enabled":true,"isBuiltIn":true,"order":11}}
seerr | 2026-10-28T15:23:52.024Z [info][Server]: Server ready on port 5055
seerr | 2026-10-28T15:24:22.415Z [debug][Jellyfin API]: Failed to authenticate with headers {"error":"Service Unavailable","ip":"172.18.0.1"}
seerr | 2026-10-28T15:24:22.424Z [error][Jellyfin API]: Something went wrong while authenticating with the Jellyfin server: Request failed with status code 503 {"error":503,"ip":"172.18.0.1"}
seerr | 2026-10-28T15:24:22.424Z [error][Auth]:
@@ -0,0 +1,7 @@
[15:23:46] scratch drive folders cleared before FROM (R-656): none existed
[15:23:46] MV-seerr: deploying seerr at FROM {'seerr': 'fallenbagel/jellyseerr:2.7.3'}
[15:24:17] FROM settled=True in 30.9s :: {"seerr": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[15:24:17] fixture: the BOX walk's own (Seerr), through upgrade_boxport
[15:24:22] seerr: throwaway Jellyfin on traefik-public: user=503 complete=503
[15:24:22] seerr: first sign-in through Jellyfin http=500 cookie=False
[15:24:22] INCONCLUSIVE — no non-browser seed route. Nothing was planted by hand.
@@ -0,0 +1,28 @@
{
"harness_version": 5,
"edge": "MV-seerr",
"app": "seerr",
"note": "definition step to seerr-v3",
"from": {
"seerr": "fallenbagel/jellyseerr:2.7.3"
},
"to": {
"seerr": "ghcr.io/seerr-team/seerr:v3.5.1"
},
"verdict": "inconclusive",
"seed_read_before": false,
"seed_read_after": false,
"healthy_after": false,
"migration_observed": null,
"abort": "not-attempted",
"abort_detail": "no non-browser seed route",
"engine_state_after": null,
"memory": null,
"marks": [],
"bench_overrides": null,
"duration_s": 35.8,
"measured_at": "2026-10-28T15:24:22Z",
"evidence": "evidence/MV-seerr",
"scratch_cleared": [],
"total_s": 35.8
}
@@ -0,0 +1,115 @@
[15:24:47] scratch drive folders cleared before FROM (R-656): none existed
[15:24:47] MV-seerr: deploying seerr at FROM {'seerr': 'fallenbagel/jellyseerr:2.7.3'}
[15:25:18] FROM settled=True in 30.8s :: {"seerr": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[15:25:18] fixture: the BOX walk's own (Seerr), through upgrade_boxport
[15:25:30] seerr: throwaway Jellyfin on traefik-public: user=204 complete=204
[15:25:31] seerr: admin drilld5609dd3 signed in through Jellyfin; application title stored http=200
[15:25:32] seerr: the title read back True; sign-in http=200 (wrong password refused: http 401) ok=True
[15:25:32] C1 (seed reads back BEFORE): True
[15:25:32] MV-seerr: swapping to TO {'seerr': 'ghcr.io/seerr-team/seerr:v3.5.1'}
[15:25:33] TO up -d rc=0
[15:26:04] TO settled=True in 31.0s :: {"seerr": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[15:26:04] migration lines observed: 6
[15:26:05] seerr: the title read back True; sign-in http=200 (wrong password refused: http 401) ok=True
[15:26:05] RESULT (seed reads back AFTER): True
[15:26:05] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:5055
[15:26:21] + 15s seerr=207M/384M peak=209M kills=0 rs=0 reqs=285
[15:26:36] + 30s seerr=208M/384M peak=209M kills=0 rs=0 reqs=572
[15:26:51] + 45s seerr=208M/384M peak=211M kills=0 rs=0 reqs=860
[15:27:06] + 60s seerr=208M/384M peak=211M kills=0 rs=0 reqs=1145
[15:27:21] + 76s seerr=208M/384M peak=211M kills=0 rs=0 reqs=1435
[15:27:36] + 91s seerr=207M/384M peak=211M kills=0 rs=0 reqs=1721
[15:27:51] + 106s seerr=207M/384M peak=212M kills=0 rs=0 reqs=2010
[15:28:06] + 121s seerr=208M/384M peak=212M kills=0 rs=0 reqs=2300
[15:28:22] + 136s seerr=207M/384M peak=212M kills=0 rs=0 reqs=2589
[15:28:37] + 151s seerr=207M/384M peak=212M kills=0 rs=0 reqs=2877
[15:28:52] + 166s seerr=208M/384M peak=217M kills=0 rs=0 reqs=3165
[15:29:07] + 182s seerr=210M/384M peak=217M kills=0 rs=0 reqs=3457
[15:29:22] + 197s seerr=210M/384M peak=217M kills=0 rs=0 reqs=3745
[15:29:37] + 212s seerr=209M/384M peak=217M kills=0 rs=0 reqs=4033
[15:29:52] + 227s seerr=209M/384M peak=217M kills=0 rs=0 reqs=4325
[15:30:07] + 242s seerr=215M/384M peak=220M kills=0 rs=0 reqs=4603
[15:30:23] + 257s seerr=221M/384M peak=225M kills=0 rs=0 reqs=4892
[15:30:38] + 272s seerr=223M/384M peak=225M kills=0 rs=0 reqs=5183
[15:30:53] + 287s seerr=222M/384M peak=228M kills=0 rs=0 reqs=5471
[15:31:08] + 302s seerr=223M/384M peak=228M kills=0 rs=0 reqs=5763
[15:31:23] + 318s seerr=223M/384M peak=229M kills=0 rs=0 reqs=6051
[15:31:38] + 333s seerr=223M/384M peak=229M kills=0 rs=0 reqs=6339
[15:31:53] + 348s seerr=223M/384M peak=229M kills=0 rs=0 reqs=6631
[15:32:08] + 363s seerr=222M/384M peak=229M kills=0 rs=0 reqs=6919
[15:32:24] + 378s seerr=223M/384M peak=229M kills=0 rs=0 reqs=7210
[15:32:39] + 393s seerr=222M/384M peak=229M kills=0 rs=0 reqs=7499
[15:32:54] + 408s seerr=223M/384M peak=229M kills=0 rs=0 reqs=7787
[15:33:09] + 424s seerr=223M/384M peak=229M kills=0 rs=0 reqs=8079
[15:33:24] + 439s seerr=223M/384M peak=229M kills=0 rs=0 reqs=8367
[15:33:39] + 454s seerr=223M/384M peak=229M kills=0 rs=0 reqs=8656
[15:33:54] + 469s seerr=223M/384M peak=229M kills=0 rs=0 reqs=8947
[15:34:09] + 484s seerr=223M/384M peak=229M kills=0 rs=0 reqs=9235
[15:34:25] + 499s seerr=223M/384M peak=229M kills=0 rs=0 reqs=9527
[15:34:40] + 514s seerr=223M/384M peak=229M kills=0 rs=0 reqs=9815
[15:34:55] + 529s seerr=223M/384M peak=229M kills=0 rs=0 reqs=10104
[15:35:10] + 545s seerr=223M/384M peak=229M kills=0 rs=0 reqs=10395
[15:35:25] + 560s seerr=223M/384M peak=229M kills=0 rs=0 reqs=10685
[15:35:40] + 575s seerr=223M/384M peak=229M kills=0 rs=0 reqs=10975
[15:35:55] + 590s seerr=223M/384M peak=229M kills=0 rs=0 reqs=11265
[15:36:11] + 605s seerr=223M/384M peak=229M kills=0 rs=0 reqs=11555
[15:36:11] memory watch: killed=False tight=[] requests=11555 codes={'307': 11555}
[15:36:11] MV-seerr: ABORT — putting the FROM images back
[15:36:43] seerr: the title read back True; sign-in http=500 (wrong password refused: http 500) ok=False
[15:36:43] ABORT: app came back in 30.9s; data present=False
{
"harness_version": 5,
"edge": "MV-seerr",
"app": "seerr",
"note": "definition step to seerr-v3",
"from": {
"seerr": "fallenbagel/jellyseerr:2.7.3"
},
"to": {
"seerr": "ghcr.io/seerr-team/seerr:v3.5.1"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": "\u001b[2Kseerr | 2026-10-28T15:25:39.146Z [\u001b[34mdebug\u001b[39m][Settings Migrator]: Checking migration '0001_migrate_hostname.js'...",
"abort": "starts-data-gone",
"abort_detail": "the app started but the seeded data was gone",
"engine_state_after": null,
"memory": {
"soak_s": 605.3,
"requested_s": 600,
"requests": 11555,
"codes": {
"307": 11555
},
"first_kill": null,
"containers": {
"seerr": {
"limit": 402653184,
"peak": 240267264,
"peak_pct": 0.597,
"anon_peak_sampled": 206442496,
"anon_peak_pct": 0.513,
"swap_peak": 0,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"venue_swap_bytes": 0,
"load": "reached"
},
"marks": [],
"bench_overrides": null,
"duration_s": 31.0,
"measured_at": "2026-10-28T15:36:43Z",
"evidence": "evidence/MV-seerr",
"scratch_cleared": [],
"files_changed": [],
"files_changed_detail": [],
"files_ignored": [],
"total_s": 716.0
}
@@ -0,0 +1,8 @@
{
"seerr": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
}
}
@@ -0,0 +1,17 @@
seerr |
seerr | > jellyseerr@2.7.3 start /app
seerr | > NODE_ENV=production node dist/index.js
seerr |
seerr | 2026-10-28T15:36:14.807Z [info]: Commit Tag: $GIT_SHA
seerr | 2026-10-28T15:36:15.338Z [info]: Starting Jellyseerr version 2.7.3
seerr | 2026-10-28T15:36:16.170Z [debug][Settings Migrator]: Checking migration '0001_migrate_hostname.js'...
seerr | 2026-10-28T15:36:16.173Z [debug][Settings Migrator]: Checking migration '0002_migrate_apitokens.js'...
seerr | 2026-10-28T15:36:16.176Z [debug][Settings Migrator]: Checking migration '0003_emby_media_server_type.js'...
seerr | 2026-10-28T15:36:16.178Z [debug][Settings Migrator]: Checking migration '0004_migrate_region_setting.js'...
seerr | 2026-10-28T15:36:16.179Z [debug][Settings Migrator]: Checking migration '0005_migrate_network_settings.js'...
seerr | 2026-10-28T15:36:16.180Z [debug][Settings Migrator]: Checking migration '0006_remove_lunasea.js'...
seerr | 2026-10-28T15:36:16.186Z [info][Notifications]: Registered notification agents
seerr | 2026-10-28T15:36:16.233Z [info][Jobs]: Scheduled jobs loaded
seerr | 2026-10-28T15:36:16.411Z [info][Server]: Server ready on port 5055
seerr | 2026-10-28T15:36:43.306Z [error][Auth]: SQLITE_ERROR: no such column: User_settings.discordId
seerr | 2026-10-28T15:36:43.346Z [error][Auth]: SQLITE_ERROR: no such column: User_settings.discordId
@@ -0,0 +1,762 @@
[
{
"t": 15.1,
"containers": {
"seerr": {
"limit": 402653184,
"current": 218066944,
"peak": 219787264,
"anon": 194387968,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 285
},
{
"t": 30.3,
"containers": {
"seerr": {
"limit": 402653184,
"current": 218734592,
"peak": 219881472,
"anon": 194379776,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 572
},
{
"t": 45.4,
"containers": {
"seerr": {
"limit": 402653184,
"current": 218189824,
"peak": 221515776,
"anon": 194027520,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 860
},
{
"t": 60.5,
"containers": {
"seerr": {
"limit": 402653184,
"current": 218800128,
"peak": 221761536,
"anon": 194486272,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 1145
},
{
"t": 75.6,
"containers": {
"seerr": {
"limit": 402653184,
"current": 218316800,
"peak": 221761536,
"anon": 194056192,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 1435
},
{
"t": 90.8,
"containers": {
"seerr": {
"limit": 402653184,
"current": 217550848,
"peak": 222285824,
"anon": 194109440,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 1721
},
{
"t": 105.9,
"containers": {
"seerr": {
"limit": 402653184,
"current": 218071040,
"peak": 222932992,
"anon": 194211840,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 2010
},
{
"t": 121.0,
"containers": {
"seerr": {
"limit": 402653184,
"current": 218202112,
"peak": 222932992,
"anon": 194326528,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 2300
},
{
"t": 136.2,
"containers": {
"seerr": {
"limit": 402653184,
"current": 218058752,
"peak": 222932992,
"anon": 194510848,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 2589
},
{
"t": 151.3,
"containers": {
"seerr": {
"limit": 402653184,
"current": 217653248,
"peak": 222932992,
"anon": 194613248,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 2877
},
{
"t": 166.4,
"containers": {
"seerr": {
"limit": 402653184,
"current": 218628096,
"peak": 227950592,
"anon": 195092480,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 3165
},
{
"t": 181.5,
"containers": {
"seerr": {
"limit": 402653184,
"current": 220233728,
"peak": 227950592,
"anon": 195674112,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 3457
},
{
"t": 196.6,
"containers": {
"seerr": {
"limit": 402653184,
"current": 220606464,
"peak": 227950592,
"anon": 195592192,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 3745
},
{
"t": 211.8,
"containers": {
"seerr": {
"limit": 402653184,
"current": 219820032,
"peak": 227950592,
"anon": 195751936,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 4033
},
{
"t": 226.9,
"containers": {
"seerr": {
"limit": 402653184,
"current": 220160000,
"peak": 227950592,
"anon": 195829760,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 4325
},
{
"t": 242.0,
"containers": {
"seerr": {
"limit": 402653184,
"current": 226287616,
"peak": 230899712,
"anon": 200019968,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 4603
},
{
"t": 257.1,
"containers": {
"seerr": {
"limit": 402653184,
"current": 231821312,
"peak": 236445696,
"anon": 204804096,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 4892
},
{
"t": 272.3,
"containers": {
"seerr": {
"limit": 402653184,
"current": 234160128,
"peak": 236445696,
"anon": 205254656,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 5183
},
{
"t": 287.4,
"containers": {
"seerr": {
"limit": 402653184,
"current": 233672704,
"peak": 239206400,
"anon": 205099008,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 5471
},
{
"t": 302.5,
"containers": {
"seerr": {
"limit": 402653184,
"current": 234659840,
"peak": 239206400,
"anon": 205484032,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 5763
},
{
"t": 317.6,
"containers": {
"seerr": {
"limit": 402653184,
"current": 234852352,
"peak": 240267264,
"anon": 206442496,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 6051
},
{
"t": 332.8,
"containers": {
"seerr": {
"limit": 402653184,
"current": 234242048,
"peak": 240267264,
"anon": 205271040,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 6339
},
{
"t": 347.9,
"containers": {
"seerr": {
"limit": 402653184,
"current": 234409984,
"peak": 240267264,
"anon": 205357056,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 6631
},
{
"t": 363.0,
"containers": {
"seerr": {
"limit": 402653184,
"current": 233758720,
"peak": 240267264,
"anon": 205361152,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 6919
},
{
"t": 378.1,
"containers": {
"seerr": {
"limit": 402653184,
"current": 234557440,
"peak": 240267264,
"anon": 205385728,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 7210
},
{
"t": 393.3,
"containers": {
"seerr": {
"limit": 402653184,
"current": 233463808,
"peak": 240267264,
"anon": 205189120,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 7499
},
{
"t": 408.4,
"containers": {
"seerr": {
"limit": 402653184,
"current": 233975808,
"peak": 240267264,
"anon": 205185024,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 7787
},
{
"t": 423.5,
"containers": {
"seerr": {
"limit": 402653184,
"current": 234721280,
"peak": 240267264,
"anon": 205381632,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 8079
},
{
"t": 438.6,
"containers": {
"seerr": {
"limit": 402653184,
"current": 234045440,
"peak": 240267264,
"anon": 205336576,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 8367
},
{
"t": 453.8,
"containers": {
"seerr": {
"limit": 402653184,
"current": 234254336,
"peak": 240267264,
"anon": 205303808,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 8656
},
{
"t": 468.9,
"containers": {
"seerr": {
"limit": 402653184,
"current": 233943040,
"peak": 240267264,
"anon": 205479936,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 8947
},
{
"t": 484.0,
"containers": {
"seerr": {
"limit": 402653184,
"current": 234426368,
"peak": 240267264,
"anon": 205561856,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 9235
},
{
"t": 499.2,
"containers": {
"seerr": {
"limit": 402653184,
"current": 233865216,
"peak": 240267264,
"anon": 205283328,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 9527
},
{
"t": 514.3,
"containers": {
"seerr": {
"limit": 402653184,
"current": 233902080,
"peak": 240267264,
"anon": 205365248,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 9815
},
{
"t": 529.4,
"containers": {
"seerr": {
"limit": 402653184,
"current": 234385408,
"peak": 240267264,
"anon": 205262848,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 10104
},
{
"t": 544.6,
"containers": {
"seerr": {
"limit": 402653184,
"current": 233947136,
"peak": 240267264,
"anon": 205352960,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 10395
},
{
"t": 559.7,
"containers": {
"seerr": {
"limit": 402653184,
"current": 234487808,
"peak": 240267264,
"anon": 205418496,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 10685
},
{
"t": 574.8,
"containers": {
"seerr": {
"limit": 402653184,
"current": 234237952,
"peak": 240267264,
"anon": 205307904,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 10975
},
{
"t": 590.0,
"containers": {
"seerr": {
"limit": 402653184,
"current": 234426368,
"peak": 240267264,
"anon": 205385728,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 11265
},
{
"t": 605.1,
"containers": {
"seerr": {
"limit": 402653184,
"current": 234315776,
"peak": 240267264,
"anon": 205606912,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 11555
}
]
@@ -0,0 +1,6 @@
seerr | 2026-10-28T15:25:39.146Z [debug][Settings Migrator]: Checking migration '0001_migrate_hostname.js'...
seerr | 2026-10-28T15:25:39.150Z [debug][Settings Migrator]: Checking migration '0002_migrate_apitokens.js'...
seerr | 2026-10-28T15:25:39.153Z [debug][Settings Migrator]: Checking migration '0003_emby_media_server_type.js'...
seerr | 2026-10-28T15:25:39.155Z [debug][Settings Migrator]: Checking migration '0004_migrate_region_setting.js'...
seerr | 2026-10-28T15:25:39.157Z [debug][Settings Migrator]: Checking migration '0005_migrate_network_settings.js'...
seerr | 2026-10-28T15:25:39.159Z [debug][Settings Migrator]: Checking migration '0006_remove_lunasea.js'...
@@ -0,0 +1,59 @@
[15:24:47] scratch drive folders cleared before FROM (R-656): none existed
[15:24:47] MV-seerr: deploying seerr at FROM {'seerr': 'fallenbagel/jellyseerr:2.7.3'}
[15:25:18] FROM settled=True in 30.8s :: {"seerr": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[15:25:18] fixture: the BOX walk's own (Seerr), through upgrade_boxport
[15:25:30] seerr: throwaway Jellyfin on traefik-public: user=204 complete=204
[15:25:31] seerr: admin drilld5609dd3 signed in through Jellyfin; application title stored http=200
[15:25:32] seerr: the title read back True; sign-in http=200 (wrong password refused: http 401) ok=True
[15:25:32] C1 (seed reads back BEFORE): True
[15:25:32] MV-seerr: swapping to TO {'seerr': 'ghcr.io/seerr-team/seerr:v3.5.1'}
[15:25:33] TO up -d rc=0
[15:26:04] TO settled=True in 31.0s :: {"seerr": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[15:26:04] migration lines observed: 6
[15:26:05] seerr: the title read back True; sign-in http=200 (wrong password refused: http 401) ok=True
[15:26:05] RESULT (seed reads back AFTER): True
[15:26:05] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:5055
[15:26:21] + 15s seerr=207M/384M peak=209M kills=0 rs=0 reqs=285
[15:26:36] + 30s seerr=208M/384M peak=209M kills=0 rs=0 reqs=572
[15:26:51] + 45s seerr=208M/384M peak=211M kills=0 rs=0 reqs=860
[15:27:06] + 60s seerr=208M/384M peak=211M kills=0 rs=0 reqs=1145
[15:27:21] + 76s seerr=208M/384M peak=211M kills=0 rs=0 reqs=1435
[15:27:36] + 91s seerr=207M/384M peak=211M kills=0 rs=0 reqs=1721
[15:27:51] + 106s seerr=207M/384M peak=212M kills=0 rs=0 reqs=2010
[15:28:06] + 121s seerr=208M/384M peak=212M kills=0 rs=0 reqs=2300
[15:28:22] + 136s seerr=207M/384M peak=212M kills=0 rs=0 reqs=2589
[15:28:37] + 151s seerr=207M/384M peak=212M kills=0 rs=0 reqs=2877
[15:28:52] + 166s seerr=208M/384M peak=217M kills=0 rs=0 reqs=3165
[15:29:07] + 182s seerr=210M/384M peak=217M kills=0 rs=0 reqs=3457
[15:29:22] + 197s seerr=210M/384M peak=217M kills=0 rs=0 reqs=3745
[15:29:37] + 212s seerr=209M/384M peak=217M kills=0 rs=0 reqs=4033
[15:29:52] + 227s seerr=209M/384M peak=217M kills=0 rs=0 reqs=4325
[15:30:07] + 242s seerr=215M/384M peak=220M kills=0 rs=0 reqs=4603
[15:30:23] + 257s seerr=221M/384M peak=225M kills=0 rs=0 reqs=4892
[15:30:38] + 272s seerr=223M/384M peak=225M kills=0 rs=0 reqs=5183
[15:30:53] + 287s seerr=222M/384M peak=228M kills=0 rs=0 reqs=5471
[15:31:08] + 302s seerr=223M/384M peak=228M kills=0 rs=0 reqs=5763
[15:31:23] + 318s seerr=223M/384M peak=229M kills=0 rs=0 reqs=6051
[15:31:38] + 333s seerr=223M/384M peak=229M kills=0 rs=0 reqs=6339
[15:31:53] + 348s seerr=223M/384M peak=229M kills=0 rs=0 reqs=6631
[15:32:08] + 363s seerr=222M/384M peak=229M kills=0 rs=0 reqs=6919
[15:32:24] + 378s seerr=223M/384M peak=229M kills=0 rs=0 reqs=7210
[15:32:39] + 393s seerr=222M/384M peak=229M kills=0 rs=0 reqs=7499
[15:32:54] + 408s seerr=223M/384M peak=229M kills=0 rs=0 reqs=7787
[15:33:09] + 424s seerr=223M/384M peak=229M kills=0 rs=0 reqs=8079
[15:33:24] + 439s seerr=223M/384M peak=229M kills=0 rs=0 reqs=8367
[15:33:39] + 454s seerr=223M/384M peak=229M kills=0 rs=0 reqs=8656
[15:33:54] + 469s seerr=223M/384M peak=229M kills=0 rs=0 reqs=8947
[15:34:09] + 484s seerr=223M/384M peak=229M kills=0 rs=0 reqs=9235
[15:34:25] + 499s seerr=223M/384M peak=229M kills=0 rs=0 reqs=9527
[15:34:40] + 514s seerr=223M/384M peak=229M kills=0 rs=0 reqs=9815
[15:34:55] + 529s seerr=223M/384M peak=229M kills=0 rs=0 reqs=10104
[15:35:10] + 545s seerr=223M/384M peak=229M kills=0 rs=0 reqs=10395
[15:35:25] + 560s seerr=223M/384M peak=229M kills=0 rs=0 reqs=10685
[15:35:40] + 575s seerr=223M/384M peak=229M kills=0 rs=0 reqs=10975
[15:35:55] + 590s seerr=223M/384M peak=229M kills=0 rs=0 reqs=11265
[15:36:11] + 605s seerr=223M/384M peak=229M kills=0 rs=0 reqs=11555
[15:36:11] memory watch: killed=False tight=[] requests=11555 codes={'307': 11555}
[15:36:11] MV-seerr: ABORT — putting the FROM images back
[15:36:43] seerr: the title read back True; sign-in http=500 (wrong password refused: http 500) ok=False
[15:36:43] ABORT: app came back in 30.9s; data present=False
@@ -0,0 +1,20 @@
seerr |
seerr | > seerr@3.5.1 start
seerr | > NODE_ENV=production node dist/index.js
seerr |
seerr | 2026-10-28T15:25:34.950Z [info]: Commit Tag: 564bfb08b54caa374bddaf820abfd226e5e69151
seerr | 2026-10-28T15:25:36.823Z [info]: Starting Seerr version 3.5.1
seerr | 2026-10-28T15:25:39.146Z [debug][Settings Migrator]: Checking migration '0001_migrate_hostname.js'...
seerr | 2026-10-28T15:25:39.150Z [debug][Settings Migrator]: Checking migration '0002_migrate_apitokens.js'...
seerr | 2026-10-28T15:25:39.153Z [debug][Settings Migrator]: Checking migration '0003_emby_media_server_type.js'...
seerr | 2026-10-28T15:25:39.155Z [debug][Settings Migrator]: Checking migration '0004_migrate_region_setting.js'...
seerr | 2026-10-28T15:25:39.157Z [debug][Settings Migrator]: Checking migration '0005_migrate_network_settings.js'...
seerr | 2026-10-28T15:25:39.159Z [debug][Settings Migrator]: Checking migration '0006_remove_lunasea.js'...
seerr | 2026-10-28T15:25:39.160Z [debug][Settings Migrator]: Checking migration '0007_migrate_arr_tags.js'...
seerr | 2026-10-28T15:25:39.176Z [debug][Settings Migrator]: Migration '0007_migrate_arr_tags.js' has been applied.
seerr | 2026-10-28T15:25:39.177Z [debug][Settings Migrator]: Checking migration '0008_migrate_blacklist_to_blocklist.js'...
seerr | 2026-10-28T15:25:39.178Z [debug][Settings Migrator]: Migration '0008_migrate_blacklist_to_blocklist.js' has been applied.
seerr | 2026-10-28T15:25:39.191Z [info][Notifications]: Registered notification agents
seerr | 2026-10-28T15:25:39.228Z [info][Jobs]: Scheduled jobs loaded
seerr | 2026-10-28T15:25:39.315Z [info][Server]: Server ready on port 5055
seerr | 2026-10-28T15:26:00.021Z [debug][Jobs]: Starting scheduled job: Download Sync
@@ -0,0 +1,8 @@
{
"seerr": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
}
}
@@ -0,0 +1,56 @@
{
"harness_version": 5,
"edge": "MV-seerr",
"app": "seerr",
"note": "definition step to seerr-v3",
"from": {
"seerr": "fallenbagel/jellyseerr:2.7.3"
},
"to": {
"seerr": "ghcr.io/seerr-team/seerr:v3.5.1"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": "\u001b[2Kseerr | 2026-10-28T15:25:39.146Z [\u001b[34mdebug\u001b[39m][Settings Migrator]: Checking migration '0001_migrate_hostname.js'...",
"abort": "starts-data-gone",
"abort_detail": "the app started but the seeded data was gone",
"engine_state_after": null,
"memory": {
"soak_s": 605.3,
"requested_s": 600,
"requests": 11555,
"codes": {
"307": 11555
},
"first_kill": null,
"containers": {
"seerr": {
"limit": 402653184,
"peak": 240267264,
"peak_pct": 0.597,
"anon_peak_sampled": 206442496,
"anon_peak_pct": 0.513,
"swap_peak": 0,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"venue_swap_bytes": 0,
"load": "reached"
},
"marks": [],
"bench_overrides": null,
"duration_s": 31.0,
"measured_at": "2026-10-28T15:36:43Z",
"evidence": "evidence/MV-seerr",
"scratch_cleared": [],
"files_changed": [],
"files_changed_detail": [],
"files_ignored": [],
"total_s": 716.0
}
@@ -0,0 +1,225 @@
{
"app": "seerr",
"walk": "security",
"box_walk_version": 1,
"verdict": "proven",
"venue": "box 9202 (drill catalog), the guarded Update",
"from": {
"seerr": "fallenbagel/jellyseerr:2.7.3"
},
"to": {
"seerr": "ghcr.io/seerr-team/seerr:v3.5.1"
},
"observables_before": {
"pinned_images": {
"seerr": "fallenbagel/jellyseerr:2.7.3"
},
"installed_images": {
"seerr": "fallenbagel/jellyseerr:2.7.3"
},
"catalog_images": {
"seerr": "fallenbagel/jellyseerr:2.7.3"
},
"live_compose_image_lines": [
"image: fallenbagel/jellyseerr:2.7.3"
],
"docker_inspect": [
"seerr fallenbagel/jellyseerr:2.7.3 running=true restarts=0"
]
},
"setup_gate_before": {
"browser": {
"status": "302",
"redirect": "https://felhom.enkisfelhom.hu/__gate/start?…"
},
"script": {
"status": "401",
"redirect": null
}
},
"seed": "read_back",
"to_definition": "/tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/0b76c4d7-9b39-4e4e-869d-d0d2c6006331/scratchpad/defs/seerr-v3",
"drill_commit": "5632a0eeeb45",
"sync_waited_s": 4.5,
"badge_before": {
"hu": [
{
"title": "Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.",
"text": "Frissítés elérhető — ma"
}
],
"en": [
{
"title": "A newer version of this app is available. Select the Update button to start it.",
"text": "Update available — today"
}
]
},
"measured_at": "2026-10-28T15:34:20Z",
"update": {
"accepted": true,
"http": "202",
"phases": [
{
"t": 0.0,
"phase": "backing-up",
"label": "Biztonsági mentés készül a frissítés előtt…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 2.1,
"phase": "safety-dump",
"label": "Adatbázis pillanatkép…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 3.1,
"phase": "pulling",
"label": "Új verzió letöltése…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 52.3,
"phase": "copying",
"label": "Az adatok másolása a frissítés előtt…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 62.5,
"phase": "verifying",
"label": "Működés ellenőrzése…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 78.0,
"phase": "done",
"label": "Frissítve",
"updating": false,
"error": null,
"hold": null
}
],
"duration_s": 78.0,
"final_phase": "done",
"update_error": null,
"hold_reason": null,
"state": "running"
},
"observables_after": {
"pinned_images": {
"seerr": "ghcr.io/seerr-team/seerr:v3.5.1"
},
"installed_images": {
"seerr": "ghcr.io/seerr-team/seerr:v3.5.1"
},
"catalog_images": {
"seerr": "ghcr.io/seerr-team/seerr:v3.5.1"
},
"live_compose_image_lines": [
"image: ghcr.io/seerr-team/seerr:v3.5.1"
],
"docker_inspect": [
"seerr ghcr.io/seerr-team/seerr:v3.5.1 running=true restarts=0"
]
},
"badge_after": {
"hu": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"en": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
]
},
"state_after": "running",
"hold_after": null,
"to_digests": {
"seerr": "sha256:d8fab675b55ad293ded98fd71efcfd46054cbad9746534ae1cc4794a88c0b3be"
},
"four_observables": {
"pinned": {
"seerr": "ghcr.io/seerr-team/seerr:v3.5.1"
},
"installed": {
"seerr": "ghcr.io/seerr-team/seerr:v3.5.1"
},
"catalog": {
"seerr": "ghcr.io/seerr-team/seerr:v3.5.1"
},
"live_compose": [
"ghcr.io/seerr-team/seerr:v3.5.1"
]
},
"seed_read_after": true,
"setup_gate_after": {
"browser": {
"status": "302",
"redirect": "https://felhom.enkisfelhom.hu/__gate/start?…"
},
"script": {
"status": "401",
"redirect": null
}
},
"memory": {
"soak_s": 600,
"interval_s": 10,
"samples": 60,
"containers": {
"seerr": {
"samples": 60,
"anon_peak_bytes": 174673920,
"limit_bytes": 402653184,
"anon_peak_pct": 43.4,
"cgroup_peak_pct": 52.8,
"oom_kill_delta": 0,
"oom_killed_flag": false,
"restarts_delta": 0,
"running_all_samples": true,
"cgroup": "/sys/fs/cgroup/system.slice/docker-824256c63a7fb4236dcd70f4e725bbd2c7414724a9c2e91a920cef5b3cf6aa1d.scope"
}
},
"oom_kills": 0,
"restarts": 0,
"peak_pct": 43.4
},
"why": "the security-fix step ran on the box through the guarded Update; healthy, TO on all four observables, no undo, no hold, a clean soak, seed read back",
"log": [
"16:26:30 [5] the box's drill mirror now at f574f6fef",
"16:26:34 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}",
"16:28:00 [1] deployed, controller state=running, pinned={'seerr': 'fallenbagel/jellyseerr:2.7.3'}",
"16:28:00 gate: seerr is gated — passed as the household (cookie set)",
"16:33:03 app never answered on seerr/ (last rc=0 code=307)",
"16:33:06 [2] setup gate as installed: {'browser': {'status': '302', 'redirect': 'https://felhom.enkisfelhom.hu/__gate/start?…'}, 'script': {'status': '401', 'redirect': None}}",
"16:34:04 seerr: throwaway Jellyfin on traefik-public: user=204 complete=204",
"16:34:05 seerr: admin drilla4afc57d signed in through Jellyfin; application title stored http=200",
"16:34:06 seerr: the title read back True; sign-in http=200 (wrong password refused: http 401) ok=True",
"16:34:07 [5] drill commit 5632a0eeeb45: seerr -> the definition in /tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/0b76c4d7-9b39-4e4e-869d-d0d2c6006331/scratchpad/defs/seerr-v3 (push rc=0)",
"16:34:15 [5] the box's drill mirror now at 5632a0eee",
"16:34:20 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}",
"16:34:20 + 0.0s phase=backing-up label=Biztonsági mentés készül a frissítés előtt… err=None hold=None",
"16:34:22 + 2.1s phase=safety-dump label=Adatbázis pillanatkép… err=None hold=None",
"16:34:23 + 3.1s phase=pulling label=Új verzió letöltése… err=None hold=None",
"16:35:13 + 52.3s phase=copying label=Az adatok másolása a frissítés előtt… err=None hold=None",
"16:35:23 + 62.5s phase=verifying label=Működés ellenőrzése… err=None hold=None",
"16:35:38 + 78.0s phase=done label=Frissítve err=None hold=None",
"16:35:57 seerr: the title read back True; sign-in http=200 (wrong password refused: http 401) ok=True",
"16:35:57 [7] memory soak 600 s …",
"16:46:03 [7] soak: peak 43.4% of the limit (anon), kills 0, restarts 0"
]
}
@@ -0,0 +1,24 @@
16:26:30 [5] the box's drill mirror now at f574f6fef
16:26:34 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
16:28:00 [1] deployed, controller state=running, pinned={'seerr': 'fallenbagel/jellyseerr:2.7.3'}
16:28:00 gate: seerr is gated — passed as the household (cookie set)
16:33:03 app never answered on seerr/ (last rc=0 code=307)
16:33:06 [2] setup gate as installed: {'browser': {'status': '302', 'redirect': 'https://felhom.enkisfelhom.hu/__gate/start?…'}, 'script': {'status': '401', 'redirect': None}}
16:34:04 seerr: throwaway Jellyfin on traefik-public: user=204 complete=204
16:34:05 seerr: admin drilla4afc57d signed in through Jellyfin; application title stored http=200
16:34:06 seerr: the title read back True; sign-in http=200 (wrong password refused: http 401) ok=True
16:34:07 [5] drill commit 5632a0eeeb45: seerr -> the definition in /tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/0b76c4d7-9b39-4e4e-869d-d0d2c6006331/scratchpad/defs/seerr-v3 (push rc=0)
16:34:15 [5] the box's drill mirror now at 5632a0eee
16:34:20 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}
16:34:20 + 0.0s phase=backing-up label=Biztonsági mentés készül a frissítés előtt… err=None hold=None
16:34:22 + 2.1s phase=safety-dump label=Adatbázis pillanatkép… err=None hold=None
16:34:23 + 3.1s phase=pulling label=Új verzió letöltése… err=None hold=None
16:35:13 + 52.3s phase=copying label=Az adatok másolása a frissítés előtt… err=None hold=None
16:35:23 + 62.5s phase=verifying label=Működés ellenőrzése… err=None hold=None
16:35:38 + 78.0s phase=done label=Frissítve err=None hold=None
16:35:57 seerr: the title read back True; sign-in http=200 (wrong password refused: http 401) ok=True
16:35:57 [7] memory soak 600 s …
16:46:03 [7] soak: peak 43.4% of the limit (anon), kills 0, restarts 0
16:46:03 [9] verdict proven -> /tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/0b76c4d7-9b39-4e4e-869d-d0d2c6006331/scratchpad/p2/box/seerr/verdict.json
16:46:03 RESULT proven — the security-fix step ran on the box through the guarded Update; healthy, TO on all four observables, no undo, no hold, a clean soak, seed read back
16:46:03 [X] stop -> 200 {'ok': True, 'message': 'Stack seerr stop completed'}
@@ -0,0 +1,188 @@
# =============================================================================
# .felhom.yml - App metadata for felhom-controller
# =============================================================================
# --- Display info (shown on dashboard) ---
display_name: "Jellyseerr"
description: "Média igénylés kezelő Jellyfin/Plex integrációval"
category: "media-automation"
subdomain: "requests"
slug: "seerr"
# catalog_since: the date THIS repo last changed this app's pinned images. Any commit that
# changes an image: line must set this to the same day (see CLAUDE.md).
catalog_since: "2026-07-18"
# --- Resource hints (displayed on deploy screen) ---
resources:
mem_request: "200M"
mem_limit: "384M"
pi_compatible: true
needs_hdd: false
# --- Deploy fields (first deployment only) ---
deploy_fields:
- env_var: DOMAIN
label: "Domain"
type: domain
description: "A szerver domain neve"
locked_after_deploy: true
- env_var: SUBDOMAIN
label: "Aldomain"
type: subdomain
default: "requests"
required: true
locked_after_deploy: true
description: "Az alkalmazás aldomainje"
# --- The setup gate (controller >= 0.281.0, `09` §3 decisions 46-47) ---
# The first visitor would create the admin; a fresh install is closed to everyone but the household until the first setup is done.
setup_gate: true
# --- App info (info page content) ---
app_info:
tagline: "Film és sorozat igénylő a háztartás tagjai számára"
docs_url: "https://docs.overseerr.dev/"
use_cases:
- 'Családtagok filmeket és sorozatokat igényelhetnek egyszerűen'
- 'Automatikus letöltés Sonarr/Radarr integrációval'
- 'Elérhető tartalmak böngészése szép felületen'
- 'Igénylések állapotának követése'
- 'Felhasználói kvóták és jogosultságok kezelése'
first_steps:
- 'Nyisd meg a requests.DOMAIN címet a böngészőben'
- 'Kövesd a beállítás varázslót'
- 'Csatlakoztasd a Jellyfin vagy Plex szerveredet'
- 'Csatlakoztasd a Sonarr és Radarr példányokat'
- 'Hívd meg a családtagokat'
prerequisites:
- 'Jellyfin vagy Plex szerver szükséges'
- 'Sonarr és/vagy Radarr szükséges az automatikus letöltéshez'
guide:
checked_version: "2.7.3"
sections:
- title: "Film vagy sorozat kérése"
intro: "Bármelyik családtag kérhet filmet vagy sorozatot, a Jellyseerr pedig továbbadja a Radarrnak vagy a Sonarrnak."
steps:
- "Írd be a címet a felső „Search Movies & TV” (keresés) mezőbe."
- "Nyisd meg a találatot, és kattints a „Request” (kérés) gombra."
- "Sorozatnál jelöld be a kívánt évadokat."
- "Erősítsd meg a kérést az ablak alján lévő gombbal."
- title: "Kérések jóváhagyása"
intro: "A családtag kérése addig vár, amíg jóvá nem hagyod."
steps:
- "Nyisd meg a bal oldali menüben a „Requests” (kérések) oldalt."
- "A várakozó kérés mellett „Pending” (függőben) áll."
- "Kattints az „Approve” (jóváhagyás) gombra, és a kérés a Radarrhoz vagy a Sonarrhoz kerül. A „Decline” (elutasítás) elveti."
- title: "Kérés jóváhagyás nélkül"
intro: "Akiben megbízol, annak a kérését nem kell külön jóváhagynod."
steps:
- "Nyisd meg a „Users” (felhasználók) oldalt, és a családtag sorában kattints az „Edit” (szerkesztés) gombra."
- "Nyisd meg a „Permissions” (jogosultságok) lapot, és jelöld be az „Auto-Approve” (automatikus jóváhagyás) jelölőt."
- "Kattints a „Save Changes” (változások mentése) gombra."
- title: "Hiba jelzése egy filmnél"
intro: "Ha egy film rossz hanggal vagy felirat nélkül érkezett, a családtag jelezheti neked."
steps:
- "Nyisd meg a filmet, és kattints a figyelmeztető jelre („Report an Issue”, hiba jelzése)."
- "Válaszd ki, mi a gond, például „Audio” (hang) vagy „Subtitle” (felirat), és írd le röviden."
- "Kattints a „Submit Issue” (beküldés) gombra."
- "A beküldött jelzéseket az „Issues” (hibák) oldalon látod."
faq:
- q: "Jóváhagytam, de nem töltődik le. Miért?"
a: "A doboz a Sonarrban és a Radarrban minden meghajtóhoz címkét adott (például hdd-1), és csak a címkézett tétel kap letöltőt. A Jellyseerr „Settings” (beállítások) „Services” (szolgáltatások) oldalán a Radarrnál és a Sonarrnál a „Root Folder” (gyökérmappa) és a „Tags” (címkék) ugyanannak a meghajtónak a mappáját és címkéjét válassza."
- q: "Mit írjak be a Radarr és a Sonarr címéhez?"
a: "A „Hostname or IP Address” (cím) mezőbe radarr, a „Port” mezőbe 7878 kerül; a Sonarrnál sonarr és 8989. Az API kulcsot a Radarr és a Sonarr saját beállításaiban találod."
- q: "Mit jelent az „Available” állapot?"
a: "A film vagy a sorozat letöltődött, és a Jellyfinben vagy a Plexben nézheted."
- q: "Lehet magyar a felület?"
a: "Igen. A „Settings” (beállítások) „General” (általános) lapján a „Display Language” (megjelenítési nyelv) mezőben válaszd a magyart, majd kattints a „Save Changes” (változások mentése) gombra."
- q: "Mit kérhetek?"
a: "Csak olyan tartalmat, amihez jogod van, például szabad licencű filmeket. Hogy honnan jön a letöltés, azt a Prowlarrban te döntöd el."
# --- Controller-side health probe ---
healthcheck:
checks:
- type: api
port: 5055
path: "/api/v1/status"
expect:
status: 200
# --- English copy (localisation slice 5, R-560) --------------------------------------------
# The Hungarian above is UNCHANGED. A box on English reads this block field by field; a missing
# field shows the Hungarian one; a controller older than 0.257.0 ignores the block entirely.
i18n:
en:
description: 'Media requests, wired into Jellyfin/Plex'
app_info:
tagline: 'The household asks for a film or a series here'
use_cases:
- 'The household can ask for films and series without fuss'
- 'Sonarr/Radarr fetch them on their own'
- 'Browse what is already there, on a good-looking page'
- 'Follow what has happened to a request'
- 'Per-person quotas and permissions'
first_steps:
- 'Open requests.DOMAIN in your browser'
- 'Follow the setup wizard'
- 'Connect your Jellyfin or Plex server'
- 'Connect your Sonarr and Radarr'
- 'Invite the household'
prerequisites:
- 'A Jellyfin or Plex server is needed'
- 'Sonarr and/or Radarr is needed for the downloading'
guide:
sections:
- title: "Ask for a film or a series"
intro: "Anyone in the family can ask for a film or a series, and Jellyseerr hands it to Radarr or Sonarr."
steps:
- "Type the title into the „Search Movies & TV” box at the top."
- "Open the result and select „Request”."
- "For a series, tick the seasons you want."
- "Confirm the request with the button at the bottom of the window."
- title: "Approve requests"
intro: "A family member's request waits until you approve it."
steps:
- "Open the „Requests” page in the menu on the left."
- "A waiting request says „Pending”."
- "Select „Approve”, and the request goes to Radarr or Sonarr. „Decline” drops it."
- title: "Requests without approval"
intro: "For someone you trust, you do not have to approve each request."
steps:
- "Open the „Users” page and select „Edit” in the family member's row."
- "Open the „Permissions” tab and tick „Auto-Approve”."
- "Select „Save Changes”."
- title: "Report a problem with a film"
intro: "If a film came with the wrong audio or without subtitles, a family member can tell you."
steps:
- "Open the film and select the warning sign („Report an Issue”)."
- "Choose what is wrong, for example „Audio” or „Subtitle”, and describe it briefly."
- "Select „Submit Issue”."
- "You see the reports on the „Issues” page."
faq:
- q: "I approved it, but it does not download. Why?"
a: "The box gave Sonarr and Radarr a tag for every drive (for example hdd-1), and only a tagged item gets a download client. On the „Services” page of Jellyseerr's „Settings”, make „Root Folder” and „Tags” for Radarr and Sonarr name the folder and the tag of the same drive."
- q: "What do I enter as the address of Radarr and Sonarr?"
a: "In „Hostname or IP Address” enter radarr, and in „Port” 7878; for Sonarr, sonarr and 8989. You find the API key in Radarr's and Sonarr's own settings."
- q: "What does „Available” mean?"
a: "The film or series has downloaded, and you can watch it in Jellyfin or Plex."
- q: "Can the interface be in Hungarian?"
a: "Yes. On the „General” tab of „Settings”, choose Hungarian in „Display Language”, then select „Save Changes”."
- q: "What may I ask for?"
a: "Only content you have the right to, for example films under a free licence. Where the download comes from is your choice in Prowlarr."
deploy_fields:
- env_var: DOMAIN
label: 'Domain'
description: 'The server domain name'
- env_var: SUBDOMAIN
label: 'Subdomain'
description: 'The subdomain this app answers on'
# --- Security watch (felhom.eu R-1303): where each image's security notices are published ---
# One line per image in docker-compose.yml; the grammar is in NEW-APP-CHECKLIST.md (1.10).
upstream:
fallenbagel/jellyseerr: "github:seerr-team/seerr"
ghcr.io/seerr-team/seerr: "github:seerr-team/seerr"
@@ -0,0 +1,55 @@
# Jellyseerr - Média igénylés kezelő Jellyfin/Plex integrációval
# Domain: ${SUBDOMAIN}.${DOMAIN}
# Database: None (file-based)
# RAM: ~100M (mem_limit: 384M) | Pi-compatible: Yes
#
# Environment variables:
# DOMAIN - Your domain (e.g., demo-felhom.eu)
services:
seerr:
# Seerr v3 (2026-10-28, felhom.eu R-1317): Jellyseerr and Overseerr merged into `ghcr.io/seerr-team/seerr`. v3 runs as
# `node` (UID 1000) and needs /app/config owned by it; a Jellyseerr volume is owned by root. So the container STARTS
# as root only to hand /app/config to 1000, then runs Seerr as `node` through busybox `su` (no root process stays;
# measured on the bench: root PID 1 is docker-init, Seerr is `node`). `init: true` is upstream's own requirement
# (the image has no init). Seerr migrates Jellyseerr's settings and database by itself on the first start.
image: ghcr.io/seerr-team/seerr:v3.5.1
container_name: seerr
restart: unless-stopped
init: true
user: "0:0"
entrypoint: ["/bin/sh", "-c", "chown -R 1000:1000 /app/config && exec su node -s /bin/sh -c 'exec docker-entrypoint.sh npm start'"]
environment:
- TZ=Europe/Budapest
volumes:
- seerr_config:/app/config
networks:
- traefik-public
deploy:
resources:
limits:
memory: 384M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:5055/api/v1/status"]
interval: 30s
timeout: 5s
retries: 3
start_period: 30s
labels:
- "traefik.enable=true"
- "traefik.http.routers.seerr.rule=Host(`${SUBDOMAIN}.${DOMAIN}`)"
# R-753: this app reads the LEFTMOST X-Forwarded-For entry, which a stranger writes once traefik keeps the
# tunnel's chain — so its chain is removed here (it then reads traefik's X-Real-Ip or peer; never forgeable).
- "traefik.http.middlewares.seerr-xff.headers.customrequestheaders.X-Forwarded-For="
- "traefik.http.routers.seerr.middlewares=seerr-xff"
- "traefik.http.routers.seerr.entrypoints=websecure"
- "traefik.http.routers.seerr.tls=true"
- "traefik.http.routers.seerr.tls.certresolver=letsencrypt"
- "traefik.http.services.seerr.loadbalancer.server.port=5055"
volumes:
seerr_config:
networks:
traefik-public:
external: true
@@ -0,0 +1,28 @@
16:46:18 [X] stop -> 200 {'ok': True, 'message': 'Stack seerr stop completed'}
16:46:50 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'seerr', 'volumes_removed': [], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalmazás nem tárolt saját
16:46:59 [X] after remove: deployed=False leftovers=''
16:47:07 [5] the box's drill mirror now at 3884d373a
16:47:12 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
16:48:27 [1] deployed, controller state=running, pinned={'seerr': 'fallenbagel/jellyseerr:2.7.3'}
16:48:27 gate: seerr is gated — passed as the household (cookie set)
16:48:49 seerr: throwaway Jellyfin on traefik-public: user=204 complete=204
16:48:50 seerr: admin drilld31a3e56 signed in through Jellyfin; application title stored http=200
16:48:51 seerr: the title read back True; sign-in http=200 (wrong password refused: http 401) ok=True
16:48:52 drill commit 19cbcb22db30: seerr TO with failing checks
16:49:00 [5] the box's drill mirror now at 19cbcb22d
16:49:05 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}
16:49:05 + 0.0s phase=backing-up label=Biztonsági mentés készül a frissítés előtt… err=None hold=None
16:49:07 + 2.1s phase=safety-dump label=Adatbázis pillanatkép… err=None hold=None
16:49:08 + 3.1s phase=pulling label=Új verzió letöltése… err=None hold=None
16:49:56 + 51.2s phase=copying label=Az adatok másolása a frissítés előtt… err=None hold=None
16:50:03 + 58.4s phase=verifying label=Működés ellenőrzése… err=None hold=None
16:55:06 + 361.7s phase=undoing label=Visszaállítás az előző változatra… err=None hold=None
16:55:19 + 374.0s phase=undone label=Visszaállítva az előző változatra err=None hold=None
16:55:41 seerr: the title read back True; sign-in http=200 (wrong password refused: http 401) ok=True
16:55:41 RESULT proven — TO started on the data and failed its check; the box undid it: FROM runs again and the seed reads back
16:55:42 [X] stop -> 200 {'ok': True, 'message': 'Stack seerr stop completed'}
16:56:14 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'seerr', 'volumes_removed': ['seerr_seerr_config'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalma
16:56:22 [X] after remove: deployed=False leftovers=''
16:56:32 [5] the box's drill mirror now at dff3cb84fc
16:56:32 drill revert 19cbcb22db30: rc=0
16:56:32 drill templates/seerr equal to before: True
@@ -0,0 +1,170 @@
{
"app": "seerr",
"from": {
"seerr": "fallenbagel/jellyseerr:2.7.3"
},
"to": {
"seerr": "ghcr.io/seerr-team/seerr:v3.5.1"
},
"started": "2026-10-28T15:46:18Z",
"drill_head_before": "3884d373adc45b72d5e6e4271765ea68251d5d67",
"failing_compose_main_healthcheck": [
"test: [\"CMD\", \"false\"]"
],
"failing_probe": true,
"update": {
"accepted": true,
"http": "202",
"phases": [
{
"t": 0.0,
"phase": "backing-up",
"label": "Biztons\u00e1gi ment\u00e9s k\u00e9sz\u00fcl a friss\u00edt\u00e9s el\u0151tt\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 2.1,
"phase": "safety-dump",
"label": "Adatb\u00e1zis pillanatk\u00e9p\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 3.1,
"phase": "pulling",
"label": "\u00daj verzi\u00f3 let\u00f6lt\u00e9se\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 51.2,
"phase": "copying",
"label": "Az adatok m\u00e1sol\u00e1sa a friss\u00edt\u00e9s el\u0151tt\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 58.4,
"phase": "verifying",
"label": "M\u0171k\u00f6d\u00e9s ellen\u0151rz\u00e9se\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 361.7,
"phase": "undoing",
"label": "Vissza\u00e1ll\u00edt\u00e1s az el\u0151z\u0151 v\u00e1ltozatra\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 374.0,
"phase": "undone",
"label": "Vissza\u00e1ll\u00edtva az el\u0151z\u0151 v\u00e1ltozatra",
"updating": false,
"error": null,
"hold": null
}
],
"duration_s": 374.0,
"final_phase": "undone",
"update_error": null,
"hold_reason": null,
"state": "running"
},
"to_log_while_verifying": [
"ghcr.io/seerr-team/seerr:v3.5.1",
"",
"> seerr@3.5.1 start",
"> NODE_ENV=production node dist/index.js",
"",
"2026-10-28T15:50:04.487Z [\u001b[32minfo\u001b[39m]: Commit Tag: 564bfb08b54caa374bddaf820abfd226e5e69151 ",
"2026-10-28T15:50:06.230Z [\u001b[32minfo\u001b[39m]: Starting Seerr version 3.5.1 ",
"2026-10-28T15:50:08.578Z [\u001b[34mdebug\u001b[39m][Settings Migrator]: Checking migration '0001_migrate_hostname.js'... ",
"2026-10-28T15:50:08.582Z [\u001b[34mdebug\u001b[39m][Settings Migrator]: Checking migration '0002_migrate_apitokens.js'... ",
"2026-10-28T15:50:08.584Z [\u001b[34mdebug\u001b[39m][Settings Migrator]: Checking migration '0003_emby_media_server_type.js'... ",
"2026-10-28T15:50:08.586Z [\u001b[34mdebug\u001b[39m][Settings Migrator]: Checking migration '0004_migrate_region_setting.js'... ",
"2026-10-28T15:50:08.587Z [\u001b[34mdebug\u001b[39m][Settings Migrator]: Checking migration '0005_migrate_network_settings.js'... ",
"2026-10-28T15:50:08.589Z [\u001b[34mdebug\u001b[39m][Settings Migrator]: Checking migration '0006_remove_lunasea.js'... ",
"2026-10-28T15:50:08.590Z [\u001b[34mdebug\u001b[39m][Settings Migrator]: Checking migration '0007_migrate_arr_tags.js'... ",
"2026-10-28T15:50:08.608Z [\u001b[34mdebug\u001b[39m][Settings Migrator]: Migration '0007_migrate_arr_tags.js' has been applied. ",
"2026-10-28T15:50:08.609Z [\u001b[34mdebug\u001b[39m][Settings Migrator]: Checking migration '0008_migrate_blacklist_to_blocklist.js'... ",
"2026-10-28T15:50:08.610Z [\u001b[34mdebug\u001b[39m][Settings Migrator]: Migration '0008_migrate_blacklist_to_blocklist.js' has been applied. ",
"2026-10-28T15:50:08.620Z [\u001b[32minfo\u001b[39m][Notifications]: Registered notification agents ",
"2026-10-28T15:50:08.659Z [\u001b[32minfo\u001b[39m][Jobs]: Scheduled jobs loaded ",
"2026-10-28T15:50:08.752Z [\u001b[32minfo\u001b[39m][Server]: Server ready on port 5055 ",
"2026-10-28T15:51:00.027Z [\u001b[34mdebug\u001b[39m][Jobs]: Starting scheduled job: Download Sync ",
"2026-10-28T15:52:00.025Z [\u001b[34mdebug\u001b[39m][Jobs]: Starting scheduled job: Download Sync ",
"2026-10-28T15:53:00.026Z [\u001b[34mdebug\u001b[39m][Jobs]: Starting scheduled job: Download Sync ",
"2026-10-28T15:54:00.028Z [\u001b[34mdebug\u001b[39m][Jobs]: Starting scheduled job: Download Sync ",
"2026-10-28T15:55:00.024Z [\u001b[34mdebug\u001b[39m][Jobs]: Starting scheduled job: Download Sync ",
"2026-10-28T15:55:00.031Z [\u001b[32minfo\u001b[39m][Jobs]: Starting scheduled job: Jellyfin Recently Added Scan ",
"2026-10-28T15:55:00.032Z [\u001b[32minfo\u001b[39m][Jellyfin Sync]: Scan starting {\"sessionId\":\"0a058d41-505e-4598-9a2e-06a61e572a9f\"}",
"2026-10-28T15:55:00.042Z [\u001b[32minfo\u001b[39m][Anime-List Sync]: Downloading latest mapping file ",
"2026-10-28T15:55:00.202Z [\u001b[32minfo\u001b[39m][Anime-List Sync]: Loading mapping file ",
"2026-10-28T15:55:00.608Z [\u001b[32minfo\u001b[39m][Anime-List Sync]: Loaded 10782 AniDB items from mapping file ",
"2026-10-28T15:55:00.609Z [\u001b[32minfo\u001b[39m][Jellyfin Sync]: Recently Added Scan Complete"
],
"observables_after": {
"pinned_images": {
"seerr": "fallenbagel/jellyseerr:2.7.3"
},
"installed_images": {
"seerr": "fallenbagel/jellyseerr:2.7.3"
},
"catalog_images": {
"seerr": "ghcr.io/seerr-team/seerr:v3.5.1"
},
"live_compose_image_lines": [
"image: fallenbagel/jellyseerr:2.7.3"
],
"docker_inspect": [
"seerr fallenbagel/jellyseerr:2.7.3 running=true restarts=0"
]
},
"running_images_after": {
"seerr": "fallenbagel/jellyseerr:2.7.3"
},
"seed_after_undo": true,
"verdict": "proven",
"why": "TO started on the data and failed its check; the box undid it: FROM runs again and the seed reads back",
"drill_head_after": "dff3cb84fcea54dcf4ac9dbb282660d1907873ab",
"drill_tree_equal_to_before": true,
"log": [
"16:46:18 [X] stop -> 200 {'ok': True, 'message': 'Stack seerr stop completed'}",
"16:46:50 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'seerr', 'volumes_removed': [], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalmaz\u00e1s nem t\u00e1rolt saj\u00e1t",
"16:46:59 [X] after remove: deployed=False leftovers=''",
"16:47:07 [5] the box's drill mirror now at 3884d373a",
"16:47:12 [1] deploy -> 202 {'ok': True, 'message': 'Telep\u00edt\u00e9s elind\u00edtva \u2013 az \u00e1llapot a k\u00e1rty\u00e1n k\u00f6vethet\u0151'}",
"16:48:27 [1] deployed, controller state=running, pinned={'seerr': 'fallenbagel/jellyseerr:2.7.3'}",
"16:48:27 gate: seerr is gated \u2014 passed as the household (cookie set)",
"16:48:49 seerr: throwaway Jellyfin on traefik-public: user=204 complete=204",
"16:48:50 seerr: admin drilld31a3e56 signed in through Jellyfin; application title stored http=200",
"16:48:51 seerr: the title read back True; sign-in http=200 (wrong password refused: http 401) ok=True",
"16:48:52 drill commit 19cbcb22db30: seerr TO with failing checks",
"16:49:00 [5] the box's drill mirror now at 19cbcb22d",
"16:49:05 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Friss\u00edt\u00e9s elindult \u2013 az \u00e1llapot a k\u00e1rty\u00e1n k\u00f6vethet\u0151'}",
"16:49:05 + 0.0s phase=backing-up label=Biztons\u00e1gi ment\u00e9s k\u00e9sz\u00fcl a friss\u00edt\u00e9s el\u0151tt\u2026 err=None hold=None",
"16:49:07 + 2.1s phase=safety-dump label=Adatb\u00e1zis pillanatk\u00e9p\u2026 err=None hold=None",
"16:49:08 + 3.1s phase=pulling label=\u00daj verzi\u00f3 let\u00f6lt\u00e9se\u2026 err=None hold=None",
"16:49:56 + 51.2s phase=copying label=Az adatok m\u00e1sol\u00e1sa a friss\u00edt\u00e9s el\u0151tt\u2026 err=None hold=None",
"16:50:03 + 58.4s phase=verifying label=M\u0171k\u00f6d\u00e9s ellen\u0151rz\u00e9se\u2026 err=None hold=None",
"16:55:06 + 361.7s phase=undoing label=Vissza\u00e1ll\u00edt\u00e1s az el\u0151z\u0151 v\u00e1ltozatra\u2026 err=None hold=None",
"16:55:19 + 374.0s phase=undone label=Vissza\u00e1ll\u00edtva az el\u0151z\u0151 v\u00e1ltozatra err=None hold=None",
"16:55:41 seerr: the title read back True; sign-in http=200 (wrong password refused: http 401) ok=True",
"16:55:41 RESULT proven \u2014 TO started on the data and failed its check; the box undid it: FROM runs again and the seed reads back",
"16:55:42 [X] stop -> 200 {'ok': True, 'message': 'Stack seerr stop completed'}",
"16:56:14 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'seerr', 'volumes_removed': ['seerr_seerr_config'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalma",
"16:56:22 [X] after remove: deployed=False leftovers=''",
"16:56:32 [5] the box's drill mirror now at dff3cb84fc",
"16:56:32 drill revert 19cbcb22db30: rc=0",
"16:56:32 drill templates/seerr equal to before: True"
]
}
@@ -0,0 +1,114 @@
[13:07:28] scratch drive folders cleared before FROM (R-656): none existed
[13:07:28] MV-termix: deploying termix at FROM {'termix': 'ghcr.io/lukegus/termix:2.9.2'}
[13:08:36] FROM settled=True in 68.0s :: {"termix": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[13:08:36] fixture: the BOX walk's own (Termix), through upgrade_boxport
[13:08:36] termix: seeded user drill1380c770 via /users/create
[13:08:36] termix: readback found=True (http 200, control refused as it must)
[13:08:36] C1 (seed reads back BEFORE): True
[13:08:37] MV-termix: swapping to TO {'termix': 'ghcr.io/lukegus/termix:26.10.5'}
[13:09:07] TO up -d rc=0
[13:09:38] TO settled=True in 30.9s :: {"termix": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[13:09:38] migration lines observed: 2
[13:09:38] termix: readback found=True (http 200, control refused as it must)
[13:09:38] RESULT (seed reads back AFTER): True
[13:09:38] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:8080
[13:09:54] + 15s termix=226M/256M peak=256M kills=0 rs=0 reqs=301
[13:10:09] + 30s termix=234M/256M peak=256M kills=0 rs=0 reqs=601
[13:10:24] + 45s termix=232M/256M peak=256M kills=0 rs=0 reqs=901
[13:10:39] + 60s termix=232M/256M peak=256M kills=0 rs=0 reqs=1202
[13:10:54] + 76s termix=233M/256M peak=256M kills=0 rs=0 reqs=1504
[13:11:09] + 91s termix=233M/256M peak=256M kills=0 rs=0 reqs=1805
[13:11:24] + 106s termix=233M/256M peak=256M kills=0 rs=0 reqs=2105
[13:11:39] + 121s termix=232M/256M peak=256M kills=0 rs=0 reqs=2405
[13:11:55] + 136s termix=243M/256M peak=256M kills=0 rs=0 reqs=2705
[13:12:10] + 151s termix=236M/256M peak=256M kills=0 rs=0 reqs=3006
[13:12:25] + 166s termix=236M/256M peak=256M kills=0 rs=0 reqs=3306
[13:12:40] + 182s termix=236M/256M peak=256M kills=0 rs=0 reqs=3606
[13:12:55] + 197s termix=252M/256M peak=256M kills=0 rs=0 reqs=3906
[13:13:10] + 212s termix=252M/256M peak=256M kills=0 rs=0 reqs=4206
[13:13:25] + 227s termix=253M/256M peak=256M kills=0 rs=0 reqs=4509
[13:13:40] + 242s termix=253M/256M peak=256M kills=0 rs=0 reqs=4810
[13:13:56] + 257s termix=252M/256M peak=256M kills=0 rs=0 reqs=5110
[13:14:11] + 272s termix=252M/256M peak=256M kills=0 rs=0 reqs=5410
[13:14:26] + 287s termix=252M/256M peak=256M kills=0 rs=0 reqs=5710
[13:14:41] + 302s termix=250M/256M peak=256M kills=0 rs=0 reqs=6010
[13:14:56] + 318s termix=251M/256M peak=256M kills=0 rs=0 reqs=6312
[13:15:11] + 333s termix=251M/256M peak=256M kills=0 rs=0 reqs=6614
[13:15:26] + 348s termix=252M/256M peak=256M kills=0 rs=0 reqs=6914
[13:15:42] + 363s termix=252M/256M peak=256M kills=0 rs=0 reqs=7214
[13:15:57] + 378s termix=252M/256M peak=256M kills=0 rs=0 reqs=7515
[13:16:12] + 393s termix=252M/256M peak=256M kills=0 rs=0 reqs=7816
[13:16:27] + 408s termix=252M/256M peak=256M kills=0 rs=0 reqs=8116
[13:16:42] + 424s termix=253M/256M peak=256M kills=0 rs=0 reqs=8418
[13:16:57] + 439s termix=253M/256M peak=256M kills=0 rs=0 reqs=8718
[13:17:12] + 454s termix=253M/256M peak=256M kills=0 rs=0 reqs=9020
[13:17:27] + 469s termix=253M/256M peak=256M kills=0 rs=0 reqs=9320
[13:17:43] + 484s termix=253M/256M peak=256M kills=0 rs=0 reqs=9620
[13:17:58] + 499s termix=253M/256M peak=256M kills=0 rs=0 reqs=9920
[13:18:13] + 514s termix=253M/256M peak=256M kills=0 rs=0 reqs=10220
[13:18:28] + 530s termix=253M/256M peak=256M kills=0 rs=0 reqs=10520
[13:18:43] + 545s termix=253M/256M peak=256M kills=0 rs=0 reqs=10821
[13:18:58] + 560s termix=254M/256M peak=256M kills=0 rs=0 reqs=11124
[13:19:13] + 575s termix=253M/256M peak=256M kills=0 rs=0 reqs=11424
[13:19:28] + 590s termix=253M/256M peak=256M kills=0 rs=0 reqs=11724
[13:19:44] + 605s termix=253M/256M peak=256M kills=0 rs=0 reqs=12024
[13:19:44] memory watch: killed=False tight=[] requests=12024 codes={'200': 12024}
[13:19:44] MV-termix: ABORT — putting the FROM images back
[13:20:16] termix: readback found=True (http 200, control refused as it must)
[13:20:16] ABORT: app came back in 30.9s; data present=True
{
"harness_version": 5,
"edge": "MV-termix",
"app": "termix",
"note": "night 2026-09-23 within-a-major move: termix=ghcr.io/lukegus/termix:26.10.5",
"from": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"to": {
"termix": "ghcr.io/lukegus/termix:26.10.5"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": "\u001b[2Ktermix | [2:09:31 PM] [SUCCESS] [\ud83d\uddc4\ufe0f] Schema migration completed [op:schema_migration]",
"abort": "starts-and-serves",
"abort_detail": null,
"engine_state_after": null,
"memory": {
"soak_s": 605.4,
"requested_s": 600,
"requests": 12024,
"codes": {
"200": 12024
},
"first_kill": null,
"containers": {
"termix": {
"limit": 268435456,
"peak": 268439552,
"peak_pct": 1.0,
"anon_peak_sampled": 141152256,
"anon_peak_pct": 0.526,
"swap_peak": 0,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"venue_swap_bytes": 0,
"load": "reached"
},
"marks": [],
"bench_overrides": null,
"duration_s": 30.9,
"measured_at": "2026-10-28T13:20:16Z",
"evidence": "evidence/MV-termix",
"scratch_cleared": [],
"files_changed": [],
"files_changed_detail": [],
"files_ignored": [],
"total_s": 768.3
}
@@ -0,0 +1,8 @@
{
"termix": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
}
}
@@ -0,0 +1,296 @@
termix | Setting up user permissions (PUID: 1000, PGID: 1000)...
termix | usermod: no changes
termix | User node is now UID: 1000, GID: 1000
termix | Loading persisted SSL settings from /app/data/.env
termix | Configuring web UI to run on port: 8080
termix | SSL disabled - using HTTP-only configuration (default)
termix | Data directory is writable
termix | Starting nginx...
termix | Starting backend services...
termix | [2:20:01 PM] [INFO] [🚀] Termix backend initialization started [op:backend_init_start]
termix | [2:20:01 PM] [INFO] [📦] Termix Backend starting - Version: 2.9.2 [op:startup]
termix | [2:20:02 PM] [INFO] [🚀] SSL not enabled - skipping certificate generation [op:ssl_disabled_default]
termix | [2:20:02 PM] [SUCCESS] [🚀] SSL setup completed [op:backend_init_ssl]
termix | [2:20:02 PM] [INFO] [🗄️] Initializing SQLite database [op:db_init]
termix | [2:20:02 PM] [INFO] [🗄️] Performance indexes ready in 0ms [op:performance_index_create]
termix | [2:20:02 PM] [SUCCESS] [🗄️] Schema migration completed [op:schema_migration]
termix | [2:20:02 PM] [SUCCESS] [🚀] Database initialized (sqlite) [op:backend_init_db]
termix | [2:20:02 PM] [INFO] [🗄️] User key migration pass finished [op:dek_migration_boot]
termix | [2:20:03 PM] [INFO] [🗄️] Removed routine plugin audit entries [op:audit_noise_cleanup]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin acme-ssl@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin ai@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin alerts@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin automations@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin docker@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin file-manager@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin fleets@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin homepage@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin host-metrics@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin ldap@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin network-topology@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin opkssh@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin proxmox@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin remote-desktop@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin secret-sources@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin serial@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin session-recording@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin session-sharing@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin snippets@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin ssh-terminal@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin sso@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin step-ca@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin tailscale@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin telemetry@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin termix-identity@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin tmux-monitor@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin totp@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin tunnels@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin vault@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin wake-on-lan@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin warpgate@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin web-endpoint@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin webauthn@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [INFO] [🧩] Loaded plugin workspaces@1.0.0 [op:plugin_load]
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory acme-ssl.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory ai.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory automations.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory fleets.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory homepage.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory ldap.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory network-topology.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory opkssh.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory proxmox.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory secret-sources.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory session-recording.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory session-sharing.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory step-ca.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory tailscale.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory termix-identity.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory tmux-monitor.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory vault.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory wake-on-lan.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory warpgate.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [ERROR] [🧩] Skipping plugin directory web-endpoint.tmxplug in /app/data/plugins [op:plugin_load]
termix | Error: signature check failed: this build trusts no signing keys
termix | at PluginLoader.loadArtifact (file:///app/dist/backend/backend/plugins/loader.js:211:23)
termix | at async PluginLoader.loadAll (file:///app/dist/backend/backend/plugins/loader.js:163:40)
termix | at async initializePlugins (file:///app/dist/backend/backend/plugins/index.js:166:20)
termix | at async file:///app/dist/backend/backend/starter.js:209:28
termix | [2:20:03 PM] [INFO] [🧩] Revoked ai capability "events:core": the manifest no longer declares it [op:plugin_grants]
termix | [2:20:03 PM] [INFO] [🧩] Revoked ai capability "process:spawn": the manifest no longer declares it [op:plugin_grants]
termix | [2:20:03 PM] [INFO] [🧩] Revoked ai capability "users:read": the manifest no longer declares it [op:plugin_grants]
termix | [2:20:03 PM] [INFO] [🧩] Revoked alerts capability "db:core-refs": the manifest no longer declares it [op:plugin_grants]
termix | [2:20:03 PM] [INFO] [🧩] Revoked file-manager capability "desktop:local": the manifest no longer declares it [op:plugin_grants]
termix | [2:20:03 PM] [INFO] [🧩] Revoked homepage capability "hosts:activity-provide": the manifest no longer declares it [op:plugin_grants]
termix | [2:20:03 PM] [INFO] [🧩] Revoked host-metrics capability "notify:send": the manifest no longer declares it [op:plugin_grants]
termix | [2:20:03 PM] [INFO] [🧩] Revoked remote-desktop capability "desktop:local": the manifest no longer declares it [op:plugin_grants]
termix | [2:20:03 PM] [INFO] [🧩] Revoked snippets capability "credentials:read": the manifest no longer declares it [op:plugin_grants]
termix | [2:20:03 PM] [INFO] [🧩] Revoked ssh-terminal capability "desktop:local": the manifest no longer declares it [op:plugin_grants]
termix | [2:20:03 PM] [INFO] [🧩] Revoked tunnels capability "desktop:local": the manifest no longer declares it [op:plugin_grants]
termix | [2:20:03 PM] [INFO] [🧩] Revoked tunnels capability "secrets:own": the manifest no longer declares it [op:plugin_grants]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/acme-ssl [op:plugin_http_mount]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin acme-ssl [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/workspaces [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] Workspaces routes mounted at /plugin-api/workspaces [op:plugin:workspaces]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin workspaces [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/network-topology [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] Network Topology routes mounted at /plugin-api/network-topology [op:plugin:network-topology]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin network-topology [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/snippets [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] Snippets routes mounted at /plugin-api/snippets [op:plugin:snippets]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin snippets [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/fleets [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] Fleets routes mounted at /plugin-api/fleets [op:plugin:fleets]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin fleets [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Plugin ssh-terminal optional service "tmux.sessions" is not available [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Plugin ssh-terminal optional service "sessions.sharing" is not available [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Plugin ssh-terminal optional service "recordings.writer" is not available [op:plugin_activate]
termix | [2:20:04 PM] [WARN] [🧩] Plugin ssh-terminal serves /plugin-ws/ssh-terminal/terminal without core authentication [op:plugin_ws_public]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-ws/ssh-terminal/terminal [op:plugin_ws_mount]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/ssh-terminal [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] SSH terminal mounted at /plugin-ws/ssh-terminal/terminal [op:plugin:ssh-terminal]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin ssh-terminal [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/tunnels [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-ws/tunnels/c2s/stream [op:plugin_ws_mount]
termix | [2:20:04 PM] [INFO] [🧩] Tunnel routes mounted at /plugin-api/tunnels [op:plugin:tunnels]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin tunnels [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/docker [op:plugin_http_mount]
termix | [2:20:04 PM] [WARN] [🧩] Plugin docker serves /plugin-ws/docker/console without core authentication [op:plugin_ws_public]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-ws/docker/console [op:plugin_ws_mount]
termix | [2:20:04 PM] [INFO] [🧩] Docker mounted at /plugin-api/docker and /plugin-ws/docker/console [op:plugin:docker]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin docker [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/host-metrics [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] Host Metrics mounted at /plugin-api/host-metrics [op:plugin:host-metrics]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin host-metrics [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/wake-on-lan [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] Wake-on-LAN routes mounted at /plugin-api/wake-on-lan [op:plugin:wake-on-lan]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin wake-on-lan [op:plugin_activate]
termix | [2:20:04 PM] [WARN] [🧩] Plugin automations serves 1 route(s) without authentication: /webhook/:token [op:plugin_http_public]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/automations [op:plugin_http_mount]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin automations [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/homepage [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] Homepage routes mounted at /plugin-api/homepage [op:plugin:homepage]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin homepage [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/ai [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] AI assistant routes mounted at /plugin-api/ai [op:plugin:ai]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin ai [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/alerts [op:plugin_http_mount]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin alerts [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/file-manager [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] File manager mounted at /plugin-api/file-manager [op:plugin:file-manager]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin file-manager [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/ldap [op:plugin_http_mount]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin ldap [op:plugin_activate]
termix | [2:20:04 PM] [WARN] [🧩] Plugin opkssh serves 5 route(s) without authentication: /chooser/:requestId, /chooser/:requestId/*, /callback, /callback/:requestId, /callback/:requestId/* [op:plugin_http_public]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/opkssh [op:plugin_http_mount]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin opkssh [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/proxmox [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] Proxmox routes mounted at /plugin-api/proxmox [op:plugin:proxmox]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin proxmox [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/session-recording [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] Session Recording routes mounted at /plugin-api/session-recording [op:plugin:session-recording]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin session-recording [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/remote-desktop [op:plugin_http_mount]
termix | [2:20:04 PM] [WARN] [🧩] Plugin remote-desktop serves /plugin-ws/remote-desktop/display without core authentication [op:plugin_ws_public]
termix | [2:20:04 PM] [INFO] [🧩] Mounted raw upgrade /plugin-ws/remote-desktop/display [op:plugin_ws_mount]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin remote-desktop [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/secret-sources [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] Secret sources routes mounted at /plugin-api/secret-sources [op:plugin:secret-sources]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin secret-sources [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-ws/serial/console [op:plugin_ws_mount]
termix | [2:20:04 PM] [INFO] [🧩] Serial console mounted at /plugin-ws/serial/console [op:plugin:serial]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin serial [op:plugin_activate]
termix | [2:20:04 PM] [WARN] [🧩] Plugin session-sharing serves 2 route(s) without authentication: /resolve/:linkToken, /guest/:token [op:plugin_http_public]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/session-sharing [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] Session sharing mounted at /plugin-api/session-sharing [op:plugin:session-sharing]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin session-sharing [op:plugin_activate]
termix | [2:20:04 PM] [WARN] [🧩] Plugin sso serves 4 route(s) without authentication: /start, /callback, /backchannel-logout, /config [op:plugin_http_public]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/sso [op:plugin_http_mount]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin sso [op:plugin_activate]
termix | [2:20:04 PM] [WARN] [🧩] Plugin step-ca serves 1 route(s) without authentication: /callback [op:plugin_http_public]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/step-ca [op:plugin_http_mount]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin step-ca [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/tailscale [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] Tailscale routes mounted at /plugin-api/tailscale [op:plugin:tailscale]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin tailscale [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/telemetry [op:plugin_http_mount]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin telemetry [op:plugin_activate]
termix | [2:20:04 PM] [WARN] [🧩] Plugin termix-identity serves 2 route(s) without authentication: /u/:handle, /u/:handle/:algo [op:plugin_http_public]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/termix-identity [op:plugin_http_mount]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin termix-identity [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/tmux-monitor [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] Tmux Monitor routes mounted at /plugin-api/tmux-monitor [op:plugin:tmux-monitor]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin tmux-monitor [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/totp [op:plugin_http_mount]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin totp [op:plugin_activate]
termix | [2:20:04 PM] [WARN] [🧩] Plugin vault serves 1 route(s) without authentication: /oidc/callback [op:plugin_http_public]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/vault [op:plugin_http_mount]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin vault [op:plugin_activate]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin warpgate [op:plugin_activate]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/web-endpoint [op:plugin_http_mount]
termix | [2:20:04 PM] [INFO] [🧩] Web Endpoint routes mounted at /plugin-api/web-endpoint [op:plugin:web-endpoint]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin web-endpoint [op:plugin_activate]
termix | [2:20:04 PM] [WARN] [🧩] Plugin webauthn serves 1 route(s) without authentication: /authenticate/options [op:plugin_http_public]
termix | [2:20:04 PM] [INFO] [🧩] Mounted /plugin-api/webauthn [op:plugin_http_mount]
termix | [2:20:04 PM] [SUCCESS] [🧩] Activated plugin webauthn [op:plugin_activate]
termix | [2:20:05 PM] [INFO] [🚀] Loaded 34 plugin(s) [op:plugin_init]
termix | [2:20:05 PM] [SUCCESS] [🚀] Termix backend started successfully [op:backend_init_complete,duration:3278ms]
termix | [2:20:16 PM] [INFO] [🔐] User login request received [op:user_login_request]
termix | [2:20:16 PM] [SUCCESS] [🔐] User login successful [op:user_login_complete,user:erOsjw18K2uJv32xZpt9m]
termix | [2:20:16 PM] [INFO] [🔐] User login request received [op:user_login_request]
termix | [2:20:16 PM] [WARN] [🔐] Login failed: user not found [op:user_login]
@@ -0,0 +1,762 @@
[
{
"t": 15.1,
"containers": {
"termix": {
"limit": 268435456,
"current": 237457408,
"peak": 268439552,
"anon": 141119488,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 301
},
{
"t": 30.3,
"containers": {
"termix": {
"limit": 268435456,
"current": 245866496,
"peak": 268439552,
"anon": 141152256,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 601
},
{
"t": 45.4,
"containers": {
"termix": {
"limit": 268435456,
"current": 243888128,
"peak": 268439552,
"anon": 139042816,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 901
},
{
"t": 60.5,
"containers": {
"termix": {
"limit": 268435456,
"current": 244166656,
"peak": 268439552,
"anon": 139042816,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 1202
},
{
"t": 75.6,
"containers": {
"termix": {
"limit": 268435456,
"current": 244748288,
"peak": 268439552,
"anon": 139042816,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 1504
},
{
"t": 90.7,
"containers": {
"termix": {
"limit": 268435456,
"current": 244330496,
"peak": 268439552,
"anon": 139042816,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 1805
},
{
"t": 105.9,
"containers": {
"termix": {
"limit": 268435456,
"current": 244559872,
"peak": 268439552,
"anon": 139042816,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 2105
},
{
"t": 121.0,
"containers": {
"termix": {
"limit": 268435456,
"current": 244215808,
"peak": 268439552,
"anon": 139051008,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 2405
},
{
"t": 136.1,
"containers": {
"termix": {
"limit": 268435456,
"current": 255594496,
"peak": 268439552,
"anon": 139558912,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 2705
},
{
"t": 151.2,
"containers": {
"termix": {
"limit": 268435456,
"current": 247951360,
"peak": 268439552,
"anon": 132026368,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 3006
},
{
"t": 166.4,
"containers": {
"termix": {
"limit": 268435456,
"current": 247816192,
"peak": 268439552,
"anon": 132055040,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 3306
},
{
"t": 181.5,
"containers": {
"termix": {
"limit": 268435456,
"current": 248016896,
"peak": 268439552,
"anon": 132444160,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 3606
},
{
"t": 196.6,
"containers": {
"termix": {
"limit": 268435456,
"current": 264421376,
"peak": 268439552,
"anon": 137977856,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 3906
},
{
"t": 211.7,
"containers": {
"termix": {
"limit": 268435456,
"current": 264630272,
"peak": 268439552,
"anon": 137981952,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 4206
},
{
"t": 226.9,
"containers": {
"termix": {
"limit": 268435456,
"current": 265302016,
"peak": 268439552,
"anon": 137981952,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 4509
},
{
"t": 242.0,
"containers": {
"termix": {
"limit": 268435456,
"current": 265375744,
"peak": 268439552,
"anon": 137981952,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 4810
},
{
"t": 257.1,
"containers": {
"termix": {
"limit": 268435456,
"current": 265146368,
"peak": 268439552,
"anon": 137981952,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 5110
},
{
"t": 272.2,
"containers": {
"termix": {
"limit": 268435456,
"current": 264978432,
"peak": 268439552,
"anon": 137994240,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 5410
},
{
"t": 287.4,
"containers": {
"termix": {
"limit": 268435456,
"current": 265023488,
"peak": 268439552,
"anon": 137994240,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 5710
},
{
"t": 302.5,
"containers": {
"termix": {
"limit": 268435456,
"current": 262983680,
"peak": 268439552,
"anon": 136015872,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 6010
},
{
"t": 317.7,
"containers": {
"termix": {
"limit": 268435456,
"current": 264159232,
"peak": 268439552,
"anon": 136269824,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 6312
},
{
"t": 332.8,
"containers": {
"termix": {
"limit": 268435456,
"current": 263876608,
"peak": 268439552,
"anon": 136634368,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 6614
},
{
"t": 347.9,
"containers": {
"termix": {
"limit": 268435456,
"current": 264839168,
"peak": 268439552,
"anon": 137089024,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 6914
},
{
"t": 363.1,
"containers": {
"termix": {
"limit": 268435456,
"current": 264441856,
"peak": 268439552,
"anon": 137097216,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 7214
},
{
"t": 378.2,
"containers": {
"termix": {
"limit": 268435456,
"current": 264998912,
"peak": 268439552,
"anon": 137101312,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 7515
},
{
"t": 393.3,
"containers": {
"termix": {
"limit": 268435456,
"current": 264732672,
"peak": 268439552,
"anon": 137109504,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 7816
},
{
"t": 408.4,
"containers": {
"termix": {
"limit": 268435456,
"current": 264605696,
"peak": 268439552,
"anon": 137113600,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 8116
},
{
"t": 423.6,
"containers": {
"termix": {
"limit": 268435456,
"current": 265306112,
"peak": 268439552,
"anon": 137748480,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 8418
},
{
"t": 438.7,
"containers": {
"termix": {
"limit": 268435456,
"current": 265609216,
"peak": 268439552,
"anon": 137752576,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 8718
},
{
"t": 453.9,
"containers": {
"termix": {
"limit": 268435456,
"current": 265965568,
"peak": 268439552,
"anon": 137752576,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 9020
},
{
"t": 469.0,
"containers": {
"termix": {
"limit": 268435456,
"current": 265478144,
"peak": 268439552,
"anon": 137756672,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 9320
},
{
"t": 484.1,
"containers": {
"termix": {
"limit": 268435456,
"current": 265314304,
"peak": 268439552,
"anon": 137760768,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 9620
},
{
"t": 499.2,
"containers": {
"termix": {
"limit": 268435456,
"current": 265371648,
"peak": 268439552,
"anon": 137773056,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 9920
},
{
"t": 514.4,
"containers": {
"termix": {
"limit": 268435456,
"current": 265445376,
"peak": 268439552,
"anon": 137773056,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 10220
},
{
"t": 529.5,
"containers": {
"termix": {
"limit": 268435456,
"current": 265736192,
"peak": 268439552,
"anon": 137789440,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 10520
},
{
"t": 544.6,
"containers": {
"termix": {
"limit": 268435456,
"current": 266149888,
"peak": 268439552,
"anon": 137830400,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 10821
},
{
"t": 559.7,
"containers": {
"termix": {
"limit": 268435456,
"current": 266727424,
"peak": 268439552,
"anon": 137854976,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 11124
},
{
"t": 574.8,
"containers": {
"termix": {
"limit": 268435456,
"current": 266268672,
"peak": 268439552,
"anon": 137859072,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 11424
},
{
"t": 590.0,
"containers": {
"termix": {
"limit": 268435456,
"current": 265801728,
"peak": 268439552,
"anon": 137863168,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 11724
},
{
"t": 605.1,
"containers": {
"termix": {
"limit": 268435456,
"current": 266174464,
"peak": 268439552,
"anon": 137871360,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 12024
}
]
@@ -0,0 +1,2 @@
termix | [2:09:31 PM] [SUCCESS] [🗄️] Schema migration completed [op:schema_migration]
termix | [2:09:31 PM] [INFO] [🗄️] User key migration pass finished [op:dek_migration_boot]
@@ -0,0 +1,58 @@
[13:07:28] scratch drive folders cleared before FROM (R-656): none existed
[13:07:28] MV-termix: deploying termix at FROM {'termix': 'ghcr.io/lukegus/termix:2.9.2'}
[13:08:36] FROM settled=True in 68.0s :: {"termix": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[13:08:36] fixture: the BOX walk's own (Termix), through upgrade_boxport
[13:08:36] termix: seeded user drill1380c770 via /users/create
[13:08:36] termix: readback found=True (http 200, control refused as it must)
[13:08:36] C1 (seed reads back BEFORE): True
[13:08:37] MV-termix: swapping to TO {'termix': 'ghcr.io/lukegus/termix:26.10.5'}
[13:09:07] TO up -d rc=0
[13:09:38] TO settled=True in 30.9s :: {"termix": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[13:09:38] migration lines observed: 2
[13:09:38] termix: readback found=True (http 200, control refused as it must)
[13:09:38] RESULT (seed reads back AFTER): True
[13:09:38] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:8080
[13:09:54] + 15s termix=226M/256M peak=256M kills=0 rs=0 reqs=301
[13:10:09] + 30s termix=234M/256M peak=256M kills=0 rs=0 reqs=601
[13:10:24] + 45s termix=232M/256M peak=256M kills=0 rs=0 reqs=901
[13:10:39] + 60s termix=232M/256M peak=256M kills=0 rs=0 reqs=1202
[13:10:54] + 76s termix=233M/256M peak=256M kills=0 rs=0 reqs=1504
[13:11:09] + 91s termix=233M/256M peak=256M kills=0 rs=0 reqs=1805
[13:11:24] + 106s termix=233M/256M peak=256M kills=0 rs=0 reqs=2105
[13:11:39] + 121s termix=232M/256M peak=256M kills=0 rs=0 reqs=2405
[13:11:55] + 136s termix=243M/256M peak=256M kills=0 rs=0 reqs=2705
[13:12:10] + 151s termix=236M/256M peak=256M kills=0 rs=0 reqs=3006
[13:12:25] + 166s termix=236M/256M peak=256M kills=0 rs=0 reqs=3306
[13:12:40] + 182s termix=236M/256M peak=256M kills=0 rs=0 reqs=3606
[13:12:55] + 197s termix=252M/256M peak=256M kills=0 rs=0 reqs=3906
[13:13:10] + 212s termix=252M/256M peak=256M kills=0 rs=0 reqs=4206
[13:13:25] + 227s termix=253M/256M peak=256M kills=0 rs=0 reqs=4509
[13:13:40] + 242s termix=253M/256M peak=256M kills=0 rs=0 reqs=4810
[13:13:56] + 257s termix=252M/256M peak=256M kills=0 rs=0 reqs=5110
[13:14:11] + 272s termix=252M/256M peak=256M kills=0 rs=0 reqs=5410
[13:14:26] + 287s termix=252M/256M peak=256M kills=0 rs=0 reqs=5710
[13:14:41] + 302s termix=250M/256M peak=256M kills=0 rs=0 reqs=6010
[13:14:56] + 318s termix=251M/256M peak=256M kills=0 rs=0 reqs=6312
[13:15:11] + 333s termix=251M/256M peak=256M kills=0 rs=0 reqs=6614
[13:15:26] + 348s termix=252M/256M peak=256M kills=0 rs=0 reqs=6914
[13:15:42] + 363s termix=252M/256M peak=256M kills=0 rs=0 reqs=7214
[13:15:57] + 378s termix=252M/256M peak=256M kills=0 rs=0 reqs=7515
[13:16:12] + 393s termix=252M/256M peak=256M kills=0 rs=0 reqs=7816
[13:16:27] + 408s termix=252M/256M peak=256M kills=0 rs=0 reqs=8116
[13:16:42] + 424s termix=253M/256M peak=256M kills=0 rs=0 reqs=8418
[13:16:57] + 439s termix=253M/256M peak=256M kills=0 rs=0 reqs=8718
[13:17:12] + 454s termix=253M/256M peak=256M kills=0 rs=0 reqs=9020
[13:17:27] + 469s termix=253M/256M peak=256M kills=0 rs=0 reqs=9320
[13:17:43] + 484s termix=253M/256M peak=256M kills=0 rs=0 reqs=9620
[13:17:58] + 499s termix=253M/256M peak=256M kills=0 rs=0 reqs=9920
[13:18:13] + 514s termix=253M/256M peak=256M kills=0 rs=0 reqs=10220
[13:18:28] + 530s termix=253M/256M peak=256M kills=0 rs=0 reqs=10520
[13:18:43] + 545s termix=253M/256M peak=256M kills=0 rs=0 reqs=10821
[13:18:58] + 560s termix=254M/256M peak=256M kills=0 rs=0 reqs=11124
[13:19:13] + 575s termix=253M/256M peak=256M kills=0 rs=0 reqs=11424
[13:19:28] + 590s termix=253M/256M peak=256M kills=0 rs=0 reqs=11724
[13:19:44] + 605s termix=253M/256M peak=256M kills=0 rs=0 reqs=12024
[13:19:44] memory watch: killed=False tight=[] requests=12024 codes={'200': 12024}
[13:19:44] MV-termix: ABORT — putting the FROM images back
[13:20:16] termix: readback found=True (http 200, control refused as it must)
[13:20:16] ABORT: app came back in 30.9s; data present=True
@@ -0,0 +1,51 @@
termix | Setting up user permissions (PUID: 1000, PGID: 1000)...
termix | usermod: no changes
termix | User node is now UID: 1000, GID: 1000
termix | Loading persisted SSL settings from /app/data/.env
termix | Configuring web UI to run on port: 8080
termix | SSL disabled - using HTTP-only configuration (default)
termix | Data directory is writable
termix | Starting nginx...
termix | Starting backend services...
termix | [2:09:30 PM] [INFO] [🚀] Termix backend initialization started [op:backend_init_start]
termix | [2:09:30 PM] [INFO] [📦] Termix Backend starting - Version: 26.10.5 [op:startup]
termix | [2:09:31 PM] [INFO] [🚀] SSL not enabled - skipping certificate generation [op:ssl_disabled_default]
termix | [2:09:31 PM] [SUCCESS] [🚀] SSL setup completed [op:backend_init_ssl]
termix | [2:09:31 PM] [INFO] [🗄️] Initializing SQLite database [op:db_init]
termix | [2:09:31 PM] [INFO] [🗄️] Performance indexes ready in 0ms [op:performance_index_create]
termix | [2:09:31 PM] [SUCCESS] [🗄️] Schema migration completed [op:schema_migration]
termix | [2:09:31 PM] [SUCCESS] [🚀] Database initialized (sqlite) [op:backend_init_db]
termix | [2:09:31 PM] [INFO] [🗄️] User key migration pass finished [op:dek_migration_boot]
termix | [2:09:31 PM] [INFO] [🗄️] Removed routine plugin audit entries [op:audit_noise_cleanup]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin alerts@1.1.0 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin classic-layout@1.0.2 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin classic-themes@1.0.0 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin credential-tools@1.0.0 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin docker@1.2.1 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin file-manager@1.1.1 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin host-metrics@1.2.0 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin host-status@1.0.0 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin import-export@1.0.0 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin remote-desktop@1.2.1 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin serial@1.0.2 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin snippets@1.1.0 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin ssh-terminal@1.1.1 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin sso@1.0.4 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin sync@1.0.1 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin telemetry@1.0.2 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin totp@1.0.2 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin tunnels@1.2.1 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin webauthn@1.1.0 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Loaded plugin workspaces@1.1.0 [op:plugin_load]
termix | [2:09:32 PM] [INFO] [🧩] Registered bundled plugin classic-layout [op:plugin_seed]
termix | [2:09:32 PM] [INFO] [🧩] Registered bundled plugin classic-themes [op:plugin_seed]
termix | [2:09:32 PM] [INFO] [🧩] Registered bundled plugin credential-tools [op:plugin_seed]
termix | [2:09:32 PM] [INFO] [🧩] Registered bundled plugin host-status [op:plugin_seed]
termix | [2:09:32 PM] [INFO] [🧩] Registered bundled plugin import-export [op:plugin_seed]
termix | [2:09:32 PM] [INFO] [🧩] Registered bundled plugin sync [op:plugin_seed]
termix | [2:09:34 PM] [INFO] [🧩] Loaded plugin acme-ssl@1.1.0 [op:plugin_load]
termix | [2:09:34 PM] [INFO] [🧩] Restored acme-ssl@1.1.0 from the registry [op:plugin_restore_missing]
termix | [2:09:37 PM] [INFO] [🧩] Loaded plugin ai@1.3.0 [op:plugin_load]
termix | [2:09:37 PM] [INFO] [🧩] Restored ai@1.3.0 from the registry [op:plugin_restore_missing]
termix | [2:09:37 PM] [INFO] [🧩] Loaded plugin automations@1.2.0 [op:plugin_load]
termix | [2:09:37 PM] [INFO] [🧩] Restored automations@1.2.0 from the registry [op:plugin_restore_missing]
@@ -0,0 +1,8 @@
{
"termix": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
}
}
@@ -0,0 +1,56 @@
{
"harness_version": 5,
"edge": "MV-termix",
"app": "termix",
"note": "night 2026-09-23 within-a-major move: termix=ghcr.io/lukegus/termix:26.10.5",
"from": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"to": {
"termix": "ghcr.io/lukegus/termix:26.10.5"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": "\u001b[2Ktermix | [2:09:31 PM] [SUCCESS] [\ud83d\uddc4\ufe0f] Schema migration completed [op:schema_migration]",
"abort": "starts-and-serves",
"abort_detail": null,
"engine_state_after": null,
"memory": {
"soak_s": 605.4,
"requested_s": 600,
"requests": 12024,
"codes": {
"200": 12024
},
"first_kill": null,
"containers": {
"termix": {
"limit": 268435456,
"peak": 268439552,
"peak_pct": 1.0,
"anon_peak_sampled": 141152256,
"anon_peak_pct": 0.526,
"swap_peak": 0,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"venue_swap_bytes": 0,
"load": "reached"
},
"marks": [],
"bench_overrides": null,
"duration_s": 30.9,
"measured_at": "2026-10-28T13:20:16Z",
"evidence": "evidence/MV-termix",
"scratch_cleared": [],
"files_changed": [],
"files_changed_detail": [],
"files_ignored": [],
"total_s": 768.3
}
@@ -0,0 +1,220 @@
{
"app": "termix",
"walk": "security",
"box_walk_version": 1,
"verdict": "proven",
"venue": "box 9202 (drill catalog), the guarded Update",
"from": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"to": {
"termix": "ghcr.io/lukegus/termix:26.10.5"
},
"observables_before": {
"pinned_images": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"installed_images": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"catalog_images": null,
"live_compose_image_lines": [
"image: ghcr.io/lukegus/termix:2.9.2"
],
"docker_inspect": [
"termix ghcr.io/lukegus/termix:2.9.2 running=true restarts=0"
]
},
"setup_gate_before": {
"browser": {
"status": "302",
"redirect": "https://felhom.enkisfelhom.hu/__gate/start?…"
},
"script": {
"status": "401",
"redirect": null
}
},
"seed": "read_back",
"drill_commit": "69b61c69d26e",
"sync_waited_s": 4.5,
"badge_before": {
"hu": [
{
"title": "Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.",
"text": "Frissítés elérhető — ma"
}
],
"en": [
{
"title": "A newer version of this app is available. Select the Update button to start it.",
"text": "Update available — today"
}
]
},
"measured_at": "2026-10-28T13:28:48Z",
"update": {
"accepted": true,
"http": "202",
"phases": [
{
"t": 0.0,
"phase": "backing-up",
"label": "Biztonsági mentés készül a frissítés előtt…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 12.3,
"phase": "safety-dump",
"label": "Adatbázis pillanatkép…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 13.3,
"phase": "pulling",
"label": "Új verzió letöltése…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 33.8,
"phase": "copying",
"label": "Az adatok másolása a frissítés előtt…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 51.2,
"phase": "verifying",
"label": "Működés ellenőrzése…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 71.7,
"phase": "done",
"label": "Frissítve",
"updating": false,
"error": null,
"hold": null
}
],
"duration_s": 71.7,
"final_phase": "done",
"update_error": null,
"hold_reason": null,
"state": "running"
},
"observables_after": {
"pinned_images": {
"termix": "ghcr.io/lukegus/termix:26.10.5"
},
"installed_images": {
"termix": "ghcr.io/lukegus/termix:26.10.5"
},
"catalog_images": {
"termix": "ghcr.io/lukegus/termix:26.10.5"
},
"live_compose_image_lines": [
"image: ghcr.io/lukegus/termix:26.10.5"
],
"docker_inspect": [
"termix ghcr.io/lukegus/termix:26.10.5 running=true restarts=0"
]
},
"badge_after": {
"hu": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"en": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
]
},
"state_after": "running",
"hold_after": null,
"to_digests": {
"termix": "sha256:28a627c1e2a568ea8c2d3fd83861675fdd3d8327a09f5a245c399b4864ad5ceb"
},
"four_observables": {
"pinned": {
"termix": "ghcr.io/lukegus/termix:26.10.5"
},
"installed": {
"termix": "ghcr.io/lukegus/termix:26.10.5"
},
"catalog": {
"termix": "ghcr.io/lukegus/termix:26.10.5"
},
"live_compose": [
"ghcr.io/lukegus/termix:26.10.5"
]
},
"seed_read_after": true,
"setup_gate_after": {
"browser": {
"status": "200",
"redirect": null
},
"script": {
"status": "200",
"redirect": null
}
},
"memory": {
"soak_s": 600,
"interval_s": 10,
"samples": 60,
"containers": {
"termix": {
"samples": 60,
"anon_peak_bytes": 134029312,
"limit_bytes": 268435456,
"anon_peak_pct": 49.9,
"cgroup_peak_pct": 100.1,
"oom_kill_delta": 0,
"oom_killed_flag": false,
"restarts_delta": 0,
"running_all_samples": true,
"cgroup": "/sys/fs/cgroup/system.slice/docker-745345c6011321862f4c497f00f96fe49ea15f1482c5d664f1dc55a330a564d9.scope"
}
},
"oom_kills": 0,
"restarts": 0,
"peak_pct": 49.9
},
"why": "the security-fix step ran on the box through the guarded Update; healthy, TO on all four observables, no undo, no hold, a clean soak, seed read back",
"log": [
"14:27:24 [5] the box's drill mirror now at a19ffb289",
"14:27:29 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}",
"14:28:29 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:2.9.2'}",
"14:28:29 gate: termix is gated — passed as the household (cookie set)",
"14:28:33 [2] setup gate as installed: {'browser': {'status': '302', 'redirect': 'https://felhom.enkisfelhom.hu/__gate/start?…'}, 'script': {'status': '401', 'redirect': None}}",
"14:28:33 termix: seeded user drill3fc6d6b3 via /users/create",
"14:28:33 termix: readback found=True (http 200, control refused as it must)",
"14:28:34 [5] drill commit 69b61c69d26e: termix ghcr.io/lukegus/termix:2.9.2 -> ghcr.io/lukegus/termix:26.10.5 (push rc=0)",
"14:28:43 [5] the box's drill mirror now at 69b61c69d",
"14:28:48 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}",
"14:28:48 + 0.0s phase=backing-up label=Biztonsági mentés készül a frissítés előtt… err=None hold=None",
"14:29:00 + 12.3s phase=safety-dump label=Adatbázis pillanatkép… err=None hold=None",
"14:29:01 + 13.3s phase=pulling label=Új verzió letöltése… err=None hold=None",
"14:29:22 + 33.8s phase=copying label=Az adatok másolása a frissítés előtt… err=None hold=None",
"14:29:39 + 51.2s phase=verifying label=Működés ellenőrzése… err=None hold=None",
"14:30:00 + 71.7s phase=done label=Frissítve err=None hold=None",
"14:30:18 termix: readback found=True (http 200, control refused as it must)",
"14:30:18 [7] memory soak 600 s …",
"14:40:24 [7] soak: peak 49.9% of the limit (anon), kills 0, restarts 0"
]
}
@@ -0,0 +1,24 @@
14:27:24 [5] the box's drill mirror now at a19ffb289
14:27:29 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
14:28:29 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:2.9.2'}
14:28:29 gate: termix is gated — passed as the household (cookie set)
14:28:33 [2] setup gate as installed: {'browser': {'status': '302', 'redirect': 'https://felhom.enkisfelhom.hu/__gate/start?…'}, 'script': {'status': '401', 'redirect': None}}
14:28:33 termix: seeded user drill3fc6d6b3 via /users/create
14:28:33 termix: readback found=True (http 200, control refused as it must)
14:28:34 [5] drill commit 69b61c69d26e: termix ghcr.io/lukegus/termix:2.9.2 -> ghcr.io/lukegus/termix:26.10.5 (push rc=0)
14:28:43 [5] the box's drill mirror now at 69b61c69d
14:28:48 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}
14:28:48 + 0.0s phase=backing-up label=Biztonsági mentés készül a frissítés előtt… err=None hold=None
14:29:00 + 12.3s phase=safety-dump label=Adatbázis pillanatkép… err=None hold=None
14:29:01 + 13.3s phase=pulling label=Új verzió letöltése… err=None hold=None
14:29:22 + 33.8s phase=copying label=Az adatok másolása a frissítés előtt… err=None hold=None
14:29:39 + 51.2s phase=verifying label=Működés ellenőrzése… err=None hold=None
14:30:00 + 71.7s phase=done label=Frissítve err=None hold=None
14:30:18 termix: readback found=True (http 200, control refused as it must)
14:30:18 [7] memory soak 600 s …
14:40:24 [7] soak: peak 49.9% of the limit (anon), kills 0, restarts 0
14:40:24 [9] verdict proven -> /tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/0b76c4d7-9b39-4e4e-869d-d0d2c6006331/scratchpad/p2/box/termix-26105/verdict.json
14:40:24 RESULT proven — the security-fix step ran on the box through the guarded Update; healthy, TO on all four observables, no undo, no hold, a clean soak, seed read back
14:40:24 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:40:56 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:41:05 [X] after remove: deployed=False leftovers=''
@@ -0,0 +1,24 @@
14:55:05 [5] the box's drill mirror now at 7011ef316
14:55:10 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
14:56:20 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:2.9.2'}
14:56:20 gate: termix is gated — passed as the household (cookie set)
14:56:21 termix: seeded user drill5eec15db via /users/create
14:56:21 termix: readback found=True (http 200, control refused as it must)
14:56:22 drill commit 9e086d4dad4f: termix TO with failing checks
14:56:31 [5] the box's drill mirror now at 9e086d4da
14:56:36 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}
14:56:36 + 0.0s phase=backing-up label=Biztonsági mentés készül a frissítés előtt… err=None hold=None
14:56:50 + 13.3s phase=pulling label=Új verzió letöltése… err=None hold=None
14:57:21 + 45.1s phase=copying label=Az adatok másolása a frissítés előtt… err=None hold=None
14:57:35 + 58.4s phase=starting label=Indítás az új verzióval… err=None hold=None
14:57:36 + 59.4s phase=verifying label=Működés ellenőrzése… err=None hold=None
15:02:38 + 361.7s phase=undoing label=Visszaállítás az előző változatra… err=None hold=None
15:03:06 + 389.4s phase=undone label=Visszaállítva az előző változatra err=None hold=None
15:03:34 termix: readback found=True (http 200, control refused as it must)
15:03:34 RESULT proven — TO started on the data and failed its check; the box undid it: FROM runs again and the seed reads back
15:03:34 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
15:04:06 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
15:04:15 [X] after remove: deployed=False leftovers=''
15:04:24 [5] the box's drill mirror now at 4834d9dce
15:04:24 drill revert 9e086d4dad4f: rc=0
15:04:24 drill templates/termix equal to before: True
@@ -0,0 +1,175 @@
{
"app": "termix",
"from": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"to": {
"termix": "ghcr.io/lukegus/termix:26.10.5"
},
"started": "2026-10-28T13:54:56Z",
"drill_head_before": "7011ef31674f7efa8c524cb3a0cfc32827e57d9c",
"failing_compose_main_healthcheck": [
"test: [\"CMD\", \"false\"]"
],
"failing_probe": true,
"update": {
"accepted": true,
"http": "202",
"phases": [
{
"t": 0.0,
"phase": "backing-up",
"label": "Biztons\u00e1gi ment\u00e9s k\u00e9sz\u00fcl a friss\u00edt\u00e9s el\u0151tt\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 13.3,
"phase": "pulling",
"label": "\u00daj verzi\u00f3 let\u00f6lt\u00e9se\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 45.1,
"phase": "copying",
"label": "Az adatok m\u00e1sol\u00e1sa a friss\u00edt\u00e9s el\u0151tt\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 58.4,
"phase": "starting",
"label": "Ind\u00edt\u00e1s az \u00faj verzi\u00f3val\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 59.4,
"phase": "verifying",
"label": "M\u0171k\u00f6d\u00e9s ellen\u0151rz\u00e9se\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 361.7,
"phase": "undoing",
"label": "Vissza\u00e1ll\u00edt\u00e1s az el\u0151z\u0151 v\u00e1ltozatra\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 389.4,
"phase": "undone",
"label": "Vissza\u00e1ll\u00edtva az el\u0151z\u0151 v\u00e1ltozatra",
"updating": false,
"error": null,
"hold": null
}
],
"duration_s": 389.4,
"final_phase": "undone",
"update_error": null,
"hold_reason": null,
"state": "running"
},
"to_log_while_verifying": [
"[2:58:05 PM] [SUCCESS] [\ud83e\udde9] Activated plugin ai [op:plugin_activate]",
"[2:58:05 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/ldap [op:plugin_http_mount]",
"[2:58:05 PM] [SUCCESS] [\ud83e\udde9] Activated plugin ldap [op:plugin_activate]",
"[2:58:06 PM] [WARN] [\ud83e\udde9] Plugin opkssh serves 5 route(s) without authentication: /chooser/:requestId, /chooser/:requestId/*, /callback, /callback/:requestId, /callback/:requestId/* [op:plugin_http_public]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/opkssh [op:plugin_http_mount]",
"[2:58:06 PM] [SUCCESS] [\ud83e\udde9] Activated plugin opkssh [op:plugin_activate]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Applied 1 migration(s) for plugin proxmox: 0002_mysql_indexes [op:plugin_migrate]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/proxmox [op:plugin_http_mount]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Proxmox routes mounted at /plugin-api/proxmox [op:plugin:proxmox]",
"[2:58:06 PM] [SUCCESS] [\ud83e\udde9] Activated plugin proxmox [op:plugin_activate]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/secret-sources [op:plugin_http_mount]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Secret sources routes mounted at /plugin-api/secret-sources [op:plugin:secret-sources]",
"[2:58:06 PM] [SUCCESS] [\ud83e\udde9] Activated plugin secret-sources [op:plugin_activate]",
"[2:58:06 PM] [WARN] [\ud83e\udde9] Plugin session-sharing serves 2 route(s) without authentication: /resolve/:linkToken, /guest/:token [op:plugin_http_public]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/session-sharing [op:plugin_http_mount]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Session sharing mounted at /plugin-api/session-sharing [op:plugin:session-sharing]",
"[2:58:06 PM] [SUCCESS] [\ud83e\udde9] Activated plugin session-sharing [op:plugin_activate]",
"[2:58:06 PM] [WARN] [\ud83e\udde9] Plugin step-ca serves 1 route(s) without authentication: /callback [op:plugin_http_public]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/step-ca [op:plugin_http_mount]",
"[2:58:06 PM] [SUCCESS] [\ud83e\udde9] Activated plugin step-ca [op:plugin_activate]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/tailscale [op:plugin_http_mount]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Tailscale routes mounted at /plugin-api/tailscale [op:plugin:tailscale]",
"[2:58:06 PM] [SUCCESS] [\ud83e\udde9] Activated plugin tailscale [op:plugin_activate]",
"[2:58:06 PM] [WARN] [\ud83e\udde9] Plugin termix-identity serves 2 route(s) without authentication: /u/:handle, /u/:handle/:algo [op:plugin_http_public]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/termix-identity [op:plugin_http_mount]",
"[2:58:06 PM] [SUCCESS] [\ud83e\udde9] Activated plugin termix-identity [op:plugin_activate]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/tmux-monitor [op:plugin_http_mount]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Tmux Monitor routes mounted at /plugin-api/tmux-monitor [op:plugin:tmux-monitor]",
"[2:58:06 PM] [SUCCESS] [\ud83e\udde9] Activated plugin tmux-monitor [op:plugin_activate]",
"[2:58:06 PM] [WARN] [\ud83e\udde9] Plugin vault serves 1 route(s) without authentication: /oidc/callback [op:plugin_http_public]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/vault [op:plugin_http_mount]",
"[2:58:06 PM] [SUCCESS] [\ud83e\udde9] Activated plugin vault [op:plugin_activate]",
"[2:58:06 PM] [SUCCESS] [\ud83e\udde9] Activated plugin warpgate [op:plugin_activate]",
"[2:58:06 PM] [WARN] [\ud83e\udde9] Plugin web-endpoint serves 1 route(s) without authentication: /p/:token/* [op:plugin_http_public]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/web-endpoint [op:plugin_http_mount]",
"[2:58:06 PM] [INFO] [\ud83e\udde9] Web Endpoint routes mounted at /plugin-api/web-endpoint [op:plugin:web-endpoint]",
"[2:58:06 PM] [SUCCESS] [\ud83e\udde9] Activated plugin web-endpoint [op:plugin_activate]",
"[2:58:06 PM] [INFO] [\ud83d\ude80] Loaded 40 plugin(s) [op:plugin_init]",
"[2:58:06 PM] [SUCCESS] [\ud83d\ude80] Termix backend started successfully [op:backend_init_complete,duration:18712ms]",
"[3:01:05 PM] [INFO] [\ud83e\udde9] Sent daily usage statistics [op:plugin:telemetry]"
],
"observables_after": {
"pinned_images": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"installed_images": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"catalog_images": {
"termix": "ghcr.io/lukegus/termix:26.10.5"
},
"live_compose_image_lines": [
"image: ghcr.io/lukegus/termix:2.9.2"
],
"docker_inspect": [
"termix ghcr.io/lukegus/termix:2.9.2 running=true restarts=0"
]
},
"running_images_after": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"seed_after_undo": true,
"verdict": "proven",
"why": "TO started on the data and failed its check; the box undid it: FROM runs again and the seed reads back",
"drill_head_after": "4834d9dceb7ef88702562cae12d05e96938b0d30",
"drill_tree_equal_to_before": true,
"log": [
"14:55:05 [5] the box's drill mirror now at 7011ef316",
"14:55:10 [1] deploy -> 202 {'ok': True, 'message': 'Telep\u00edt\u00e9s elind\u00edtva \u2013 az \u00e1llapot a k\u00e1rty\u00e1n k\u00f6vethet\u0151'}",
"14:56:20 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:2.9.2'}",
"14:56:20 gate: termix is gated \u2014 passed as the household (cookie set)",
"14:56:21 termix: seeded user drill5eec15db via /users/create",
"14:56:21 termix: readback found=True (http 200, control refused as it must)",
"14:56:22 drill commit 9e086d4dad4f: termix TO with failing checks",
"14:56:31 [5] the box's drill mirror now at 9e086d4da",
"14:56:36 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Friss\u00edt\u00e9s elindult \u2013 az \u00e1llapot a k\u00e1rty\u00e1n k\u00f6vethet\u0151'}",
"14:56:36 + 0.0s phase=backing-up label=Biztons\u00e1gi ment\u00e9s k\u00e9sz\u00fcl a friss\u00edt\u00e9s el\u0151tt\u2026 err=None hold=None",
"14:56:50 + 13.3s phase=pulling label=\u00daj verzi\u00f3 let\u00f6lt\u00e9se\u2026 err=None hold=None",
"14:57:21 + 45.1s phase=copying label=Az adatok m\u00e1sol\u00e1sa a friss\u00edt\u00e9s el\u0151tt\u2026 err=None hold=None",
"14:57:35 + 58.4s phase=starting label=Ind\u00edt\u00e1s az \u00faj verzi\u00f3val\u2026 err=None hold=None",
"14:57:36 + 59.4s phase=verifying label=M\u0171k\u00f6d\u00e9s ellen\u0151rz\u00e9se\u2026 err=None hold=None",
"15:02:38 + 361.7s phase=undoing label=Vissza\u00e1ll\u00edt\u00e1s az el\u0151z\u0151 v\u00e1ltozatra\u2026 err=None hold=None",
"15:03:06 + 389.4s phase=undone label=Vissza\u00e1ll\u00edtva az el\u0151z\u0151 v\u00e1ltozatra err=None hold=None",
"15:03:34 termix: readback found=True (http 200, control refused as it must)",
"15:03:34 RESULT proven \u2014 TO started on the data and failed its check; the box undid it: FROM runs again and the seed reads back",
"15:03:34 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}",
"15:04:06 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm",
"15:04:15 [X] after remove: deployed=False leftovers=''",
"15:04:24 [5] the box's drill mirror now at 4834d9dce",
"15:04:24 drill revert 9e086d4dad4f: rc=0",
"15:04:24 drill templates/termix equal to before: True"
]
}
@@ -0,0 +1,114 @@
[12:19:56] scratch drive folders cleared before FROM (R-656): none existed
[12:19:56] MV-termix: deploying termix at FROM {'termix': 'ghcr.io/lukegus/termix:2.8.0'}
[12:20:54] FROM settled=True in 30.9s :: {"termix": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[12:20:54] fixture: the BOX walk's own (Termix), through upgrade_boxport
[12:20:54] termix: seeded user drillad5146d6 via /users/create
[12:20:54] termix: readback found=True (http 200, control refused as it must)
[12:20:54] C1 (seed reads back BEFORE): True
[12:20:54] MV-termix: swapping to TO {'termix': 'ghcr.io/lukegus/termix:2.9.2'}
[12:21:22] TO up -d rc=0
[12:22:19] TO settled=True in 56.9s :: {"termix": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[12:22:19] migration lines observed: 6
[12:22:20] termix: readback found=True (http 200, control refused as it must)
[12:22:20] RESULT (seed reads back AFTER): True
[12:22:20] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:8080
[12:22:35] + 15s termix=162M/256M peak=173M kills=0 rs=0 reqs=304
[12:22:50] + 30s termix=157M/256M peak=173M kills=0 rs=0 reqs=604
[12:23:05] + 45s termix=158M/256M peak=173M kills=0 rs=0 reqs=904
[12:23:20] + 60s termix=156M/256M peak=173M kills=0 rs=0 reqs=1204
[12:23:36] + 76s termix=157M/256M peak=173M kills=0 rs=0 reqs=1504
[12:23:51] + 91s termix=157M/256M peak=173M kills=0 rs=0 reqs=1804
[12:24:06] + 106s termix=150M/256M peak=173M kills=0 rs=0 reqs=2104
[12:24:21] + 121s termix=150M/256M peak=173M kills=0 rs=0 reqs=2404
[12:24:36] + 136s termix=151M/256M peak=173M kills=0 rs=0 reqs=2708
[12:24:51] + 151s termix=151M/256M peak=173M kills=0 rs=0 reqs=3008
[12:25:06] + 166s termix=152M/256M peak=173M kills=0 rs=0 reqs=3308
[12:25:21] + 182s termix=153M/256M peak=173M kills=0 rs=0 reqs=3608
[12:25:37] + 197s termix=151M/256M peak=173M kills=0 rs=0 reqs=3908
[12:25:52] + 212s termix=151M/256M peak=173M kills=0 rs=0 reqs=4208
[12:26:07] + 227s termix=151M/256M peak=173M kills=0 rs=0 reqs=4509
[12:26:22] + 242s termix=151M/256M peak=173M kills=0 rs=0 reqs=4810
[12:26:37] + 257s termix=152M/256M peak=173M kills=0 rs=0 reqs=5110
[12:26:52] + 272s termix=151M/256M peak=173M kills=0 rs=0 reqs=5412
[12:27:07] + 287s termix=151M/256M peak=173M kills=0 rs=0 reqs=5712
[12:27:22] + 303s termix=150M/256M peak=173M kills=0 rs=0 reqs=6013
[12:27:38] + 318s termix=151M/256M peak=173M kills=0 rs=0 reqs=6314
[12:27:53] + 333s termix=153M/256M peak=173M kills=0 rs=0 reqs=6614
[12:28:08] + 348s termix=152M/256M peak=173M kills=0 rs=0 reqs=6914
[12:28:23] + 363s termix=153M/256M peak=173M kills=0 rs=0 reqs=7217
[12:28:38] + 378s termix=154M/256M peak=173M kills=0 rs=0 reqs=7518
[12:28:53] + 393s termix=153M/256M peak=173M kills=0 rs=0 reqs=7818
[12:29:08] + 408s termix=153M/256M peak=173M kills=0 rs=0 reqs=8118
[12:29:23] + 424s termix=153M/256M peak=173M kills=0 rs=0 reqs=8418
[12:29:39] + 439s termix=153M/256M peak=173M kills=0 rs=0 reqs=8718
[12:29:54] + 454s termix=153M/256M peak=173M kills=0 rs=0 reqs=9018
[12:30:09] + 469s termix=152M/256M peak=173M kills=0 rs=0 reqs=9318
[12:30:24] + 484s termix=153M/256M peak=173M kills=0 rs=0 reqs=9618
[12:30:39] + 499s termix=153M/256M peak=173M kills=0 rs=0 reqs=9918
[12:30:54] + 514s termix=153M/256M peak=173M kills=0 rs=0 reqs=10218
[12:31:09] + 530s termix=153M/256M peak=173M kills=0 rs=0 reqs=10518
[12:31:24] + 545s termix=153M/256M peak=173M kills=0 rs=0 reqs=10818
[12:31:40] + 560s termix=153M/256M peak=173M kills=0 rs=0 reqs=11118
[12:31:55] + 575s termix=154M/256M peak=173M kills=0 rs=0 reqs=11422
[12:32:10] + 590s termix=154M/256M peak=173M kills=0 rs=0 reqs=11722
[12:32:25] + 605s termix=153M/256M peak=173M kills=0 rs=0 reqs=12022
[12:32:25] memory watch: killed=False tight=[] requests=12022 codes={'200': 12022}
[12:32:25] MV-termix: ABORT — putting the FROM images back
[12:32:57] termix: readback found=True (http 200, control refused as it must)
[12:32:57] ABORT: app came back in 30.9s; data present=True
{
"harness_version": 5,
"edge": "MV-termix",
"app": "termix",
"note": "night 2026-09-23 within-a-major move: termix=ghcr.io/lukegus/termix:2.9.2",
"from": {
"termix": "ghcr.io/lukegus/termix:2.8.0"
},
"to": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": "\u001b[2Ktermix | [1:21:40 PM] [INFO] [\ud83d\uddc4\ufe0f] Database layer pre-upgrade backup created [op:database_layer_preupgrade_backup_created]",
"abort": "starts-and-serves",
"abort_detail": null,
"engine_state_after": null,
"memory": {
"soak_s": 605.4,
"requested_s": 600,
"requests": 12022,
"codes": {
"200": 12022
},
"first_kill": null,
"containers": {
"termix": {
"limit": 268435456,
"peak": 181923840,
"peak_pct": 0.678,
"anon_peak_sampled": 117604352,
"anon_peak_pct": 0.438,
"swap_peak": 0,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"venue_swap_bytes": 0,
"load": "reached"
},
"marks": [],
"bench_overrides": null,
"duration_s": 56.9,
"measured_at": "2026-10-28T12:32:57Z",
"evidence": "evidence/MV-termix",
"scratch_cleared": [],
"files_changed": [],
"files_changed_detail": [],
"files_ignored": [],
"total_s": 781.3
}
@@ -0,0 +1,8 @@
{
"termix": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
}
}
@@ -0,0 +1,29 @@
termix | Setting up user permissions (PUID: 1000, PGID: 1000)...
termix | usermod: no changes
termix | User node is now UID: 1000, GID: 1000
termix | Loading persisted SSL settings from /app/data/.env
termix | Configuring web UI to run on port: 8080
termix | SSL disabled - using HTTP-only configuration (default)
termix | Data directory is writable
termix | OPKSSH directory is writable
termix | OPKSSH binary directory found at /app/data/opkssh
termix | Starting nginx...
termix | Starting backend services...
termix | [1:32:31 PM] [INFO] [🚀] Termix backend initialization started [op:backend_init_start]
termix | [1:32:31 PM] [INFO] [📦] Termix Backend starting - Version: 2.8.0 [op:startup]
termix | [1:32:31 PM] [INFO] [🗄️] Database layer pre-upgrade backup created [op:database_layer_preupgrade_backup_created]
termix | [1:32:31 PM] [INFO] [🚀] SSL not enabled - skipping certificate generation [op:ssl_disabled_default]
termix | [1:32:31 PM] [SUCCESS] [🚀] SSL setup completed [op:backend_init_ssl]
termix | [1:32:31 PM] [INFO] [🗄️] Initializing SQLite database [op:db_init]
termix | [1:32:31 PM] [INFO] [🗄️] Performance indexes ready in 1ms [op:performance_index_create]
termix | [1:32:31 PM] [SUCCESS] [🗄️] Schema migration completed [op:schema_migration]
termix | [1:32:31 PM] [SUCCESS] [🚀] Database initialized (sqlite) [op:backend_init_db]
termix | [1:32:31 PM] [INFO] [🗄️] User key migration pass finished [op:dek_migration_boot]
termix | [1:32:33 PM] [INFO] [🚀] Guacamole server initialized [op:guac_init]
termix | [1:32:33 PM] [SUCCESS] [🚀] Termix backend started successfully [op:backend_init_complete,duration:1748ms]
termix | [1:32:33 PM] [INFO] [📈] Sent daily usage heartbeat [op:analytics_heartbeat_sent]
termix | [1:32:35 PM] [INFO] [📡] Found 0 autostart hosts and 0 total hosts for endpointHost resolution
termix | [1:32:57 PM] [INFO] [🔐] User login request received [op:user_login_request]
termix | [1:32:57 PM] [SUCCESS] [🔐] User login successful [op:user_login_complete,user:5Fs4CJ1YTMxvQG_-KFAzU,session:FwnE-SnTqgSKAYg0iQpww]
termix | [1:32:57 PM] [INFO] [🔐] User login request received [op:user_login_request]
termix | [1:32:57 PM] [WARN] [🔐] Login failed: user not found [op:user_login]
@@ -0,0 +1,762 @@
[
{
"t": 15.1,
"containers": {
"termix": {
"limit": 268435456,
"current": 170094592,
"peak": 181923840,
"anon": 117604352,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 304
},
{
"t": 30.2,
"containers": {
"termix": {
"limit": 268435456,
"current": 165572608,
"peak": 181923840,
"anon": 113020928,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 604
},
{
"t": 45.4,
"containers": {
"termix": {
"limit": 268435456,
"current": 165994496,
"peak": 181923840,
"anon": 113205248,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 904
},
{
"t": 60.5,
"containers": {
"termix": {
"limit": 268435456,
"current": 164257792,
"peak": 181923840,
"anon": 112222208,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 1204
},
{
"t": 75.6,
"containers": {
"termix": {
"limit": 268435456,
"current": 164651008,
"peak": 181923840,
"anon": 112345088,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 1504
},
{
"t": 90.7,
"containers": {
"termix": {
"limit": 268435456,
"current": 165478400,
"peak": 181923840,
"anon": 112672768,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 1804
},
{
"t": 105.9,
"containers": {
"termix": {
"limit": 268435456,
"current": 157818880,
"peak": 181923840,
"anon": 105185280,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 2104
},
{
"t": 121.0,
"containers": {
"termix": {
"limit": 268435456,
"current": 158027776,
"peak": 181923840,
"anon": 105877504,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 2404
},
{
"t": 136.1,
"containers": {
"termix": {
"limit": 268435456,
"current": 158887936,
"peak": 181923840,
"anon": 106237952,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 2708
},
{
"t": 151.3,
"containers": {
"termix": {
"limit": 268435456,
"current": 158810112,
"peak": 181923840,
"anon": 105660416,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 3008
},
{
"t": 166.4,
"containers": {
"termix": {
"limit": 268435456,
"current": 159948800,
"peak": 181923840,
"anon": 107597824,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 3308
},
{
"t": 181.5,
"containers": {
"termix": {
"limit": 268435456,
"current": 160612352,
"peak": 181923840,
"anon": 107995136,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 3608
},
{
"t": 196.7,
"containers": {
"termix": {
"limit": 268435456,
"current": 159170560,
"peak": 181923840,
"anon": 107048960,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 3908
},
{
"t": 211.8,
"containers": {
"termix": {
"limit": 268435456,
"current": 158351360,
"peak": 181923840,
"anon": 105943040,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 4208
},
{
"t": 226.9,
"containers": {
"termix": {
"limit": 268435456,
"current": 158720000,
"peak": 181923840,
"anon": 106274816,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 4509
},
{
"t": 242.0,
"containers": {
"termix": {
"limit": 268435456,
"current": 159330304,
"peak": 181923840,
"anon": 106606592,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 4810
},
{
"t": 257.2,
"containers": {
"termix": {
"limit": 268435456,
"current": 159465472,
"peak": 181923840,
"anon": 106946560,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 5110
},
{
"t": 272.3,
"containers": {
"termix": {
"limit": 268435456,
"current": 159092736,
"peak": 181923840,
"anon": 106385408,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 5412
},
{
"t": 287.4,
"containers": {
"termix": {
"limit": 268435456,
"current": 159031296,
"peak": 181923840,
"anon": 106729472,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 5712
},
{
"t": 302.6,
"containers": {
"termix": {
"limit": 268435456,
"current": 158273536,
"peak": 181923840,
"anon": 106184704,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 6013
},
{
"t": 317.7,
"containers": {
"termix": {
"limit": 268435456,
"current": 159199232,
"peak": 181923840,
"anon": 106508288,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 6314
},
{
"t": 332.8,
"containers": {
"termix": {
"limit": 268435456,
"current": 160768000,
"peak": 181923840,
"anon": 108290048,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 6614
},
{
"t": 348.0,
"containers": {
"termix": {
"limit": 268435456,
"current": 159772672,
"peak": 181923840,
"anon": 107606016,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 6914
},
{
"t": 363.1,
"containers": {
"termix": {
"limit": 268435456,
"current": 160948224,
"peak": 181923840,
"anon": 107913216,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 7217
},
{
"t": 378.2,
"containers": {
"termix": {
"limit": 268435456,
"current": 161591296,
"peak": 181923840,
"anon": 108240896,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 7518
},
{
"t": 393.4,
"containers": {
"termix": {
"limit": 268435456,
"current": 160481280,
"peak": 181923840,
"anon": 107638784,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 7818
},
{
"t": 408.5,
"containers": {
"termix": {
"limit": 268435456,
"current": 160911360,
"peak": 181923840,
"anon": 107950080,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 8118
},
{
"t": 423.6,
"containers": {
"termix": {
"limit": 268435456,
"current": 161333248,
"peak": 181923840,
"anon": 108285952,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 8418
},
{
"t": 438.7,
"containers": {
"termix": {
"limit": 268435456,
"current": 160444416,
"peak": 181923840,
"anon": 107593728,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 8718
},
{
"t": 453.8,
"containers": {
"termix": {
"limit": 268435456,
"current": 160923648,
"peak": 181923840,
"anon": 108023808,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 9018
},
{
"t": 469.0,
"containers": {
"termix": {
"limit": 268435456,
"current": 160178176,
"peak": 181923840,
"anon": 107536384,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 9318
},
{
"t": 484.1,
"containers": {
"termix": {
"limit": 268435456,
"current": 160813056,
"peak": 181923840,
"anon": 107839488,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 9618
},
{
"t": 499.2,
"containers": {
"termix": {
"limit": 268435456,
"current": 161468416,
"peak": 181923840,
"anon": 108163072,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 9918
},
{
"t": 514.3,
"containers": {
"termix": {
"limit": 268435456,
"current": 160518144,
"peak": 181923840,
"anon": 107642880,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 10218
},
{
"t": 529.5,
"containers": {
"termix": {
"limit": 268435456,
"current": 161099776,
"peak": 181923840,
"anon": 107945984,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 10518
},
{
"t": 544.6,
"containers": {
"termix": {
"limit": 268435456,
"current": 161296384,
"peak": 181923840,
"anon": 108273664,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 10818
},
{
"t": 559.7,
"containers": {
"termix": {
"limit": 268435456,
"current": 160882688,
"peak": 181923840,
"anon": 107589632,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 11118
},
{
"t": 574.8,
"containers": {
"termix": {
"limit": 268435456,
"current": 162177024,
"peak": 181923840,
"anon": 108048384,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 11422
},
{
"t": 590.0,
"containers": {
"termix": {
"limit": 268435456,
"current": 161759232,
"peak": 181923840,
"anon": 108388352,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 11722
},
{
"t": 605.1,
"containers": {
"termix": {
"limit": 268435456,
"current": 161034240,
"peak": 181923840,
"anon": 107679744,
"swap": 0,
"swap_peak": 0,
"oom_kill": 0,
"restarts": 0,
"oomkilled_flag": false,
"status": "running",
"cgroup": true
}
},
"requests": 12022
}
]
@@ -0,0 +1,6 @@
termix | [1:21:40 PM] [INFO] [🗄️] Database layer pre-upgrade backup created [op:database_layer_preupgrade_backup_created]
termix | [1:21:40 PM] [INFO] [🗄️] Relaxed plugin_permission_grants.granted_by to allow bundled grants [op:schema_migration]
termix | [1:21:40 PM] [SUCCESS] [🗄️] Schema migration completed [op:schema_migration]
termix | [1:21:40 PM] [INFO] [🗄️] User key migration pass finished [op:dek_migration_boot]
termix | [1:21:44 PM] [SUCCESS] [🗄️] Schema migration completed [op:schema_migration]
termix | [1:21:44 PM] [INFO] [🗄️] User key migration pass finished [op:dek_migration_boot]
@@ -0,0 +1,58 @@
[12:19:56] scratch drive folders cleared before FROM (R-656): none existed
[12:19:56] MV-termix: deploying termix at FROM {'termix': 'ghcr.io/lukegus/termix:2.8.0'}
[12:20:54] FROM settled=True in 30.9s :: {"termix": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[12:20:54] fixture: the BOX walk's own (Termix), through upgrade_boxport
[12:20:54] termix: seeded user drillad5146d6 via /users/create
[12:20:54] termix: readback found=True (http 200, control refused as it must)
[12:20:54] C1 (seed reads back BEFORE): True
[12:20:54] MV-termix: swapping to TO {'termix': 'ghcr.io/lukegus/termix:2.9.2'}
[12:21:22] TO up -d rc=0
[12:22:19] TO settled=True in 56.9s :: {"termix": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[12:22:19] migration lines observed: 6
[12:22:20] termix: readback found=True (http 200, control refused as it must)
[12:22:20] RESULT (seed reads back AFTER): True
[12:22:20] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:8080
[12:22:35] + 15s termix=162M/256M peak=173M kills=0 rs=0 reqs=304
[12:22:50] + 30s termix=157M/256M peak=173M kills=0 rs=0 reqs=604
[12:23:05] + 45s termix=158M/256M peak=173M kills=0 rs=0 reqs=904
[12:23:20] + 60s termix=156M/256M peak=173M kills=0 rs=0 reqs=1204
[12:23:36] + 76s termix=157M/256M peak=173M kills=0 rs=0 reqs=1504
[12:23:51] + 91s termix=157M/256M peak=173M kills=0 rs=0 reqs=1804
[12:24:06] + 106s termix=150M/256M peak=173M kills=0 rs=0 reqs=2104
[12:24:21] + 121s termix=150M/256M peak=173M kills=0 rs=0 reqs=2404
[12:24:36] + 136s termix=151M/256M peak=173M kills=0 rs=0 reqs=2708
[12:24:51] + 151s termix=151M/256M peak=173M kills=0 rs=0 reqs=3008
[12:25:06] + 166s termix=152M/256M peak=173M kills=0 rs=0 reqs=3308
[12:25:21] + 182s termix=153M/256M peak=173M kills=0 rs=0 reqs=3608
[12:25:37] + 197s termix=151M/256M peak=173M kills=0 rs=0 reqs=3908
[12:25:52] + 212s termix=151M/256M peak=173M kills=0 rs=0 reqs=4208
[12:26:07] + 227s termix=151M/256M peak=173M kills=0 rs=0 reqs=4509
[12:26:22] + 242s termix=151M/256M peak=173M kills=0 rs=0 reqs=4810
[12:26:37] + 257s termix=152M/256M peak=173M kills=0 rs=0 reqs=5110
[12:26:52] + 272s termix=151M/256M peak=173M kills=0 rs=0 reqs=5412
[12:27:07] + 287s termix=151M/256M peak=173M kills=0 rs=0 reqs=5712
[12:27:22] + 303s termix=150M/256M peak=173M kills=0 rs=0 reqs=6013
[12:27:38] + 318s termix=151M/256M peak=173M kills=0 rs=0 reqs=6314
[12:27:53] + 333s termix=153M/256M peak=173M kills=0 rs=0 reqs=6614
[12:28:08] + 348s termix=152M/256M peak=173M kills=0 rs=0 reqs=6914
[12:28:23] + 363s termix=153M/256M peak=173M kills=0 rs=0 reqs=7217
[12:28:38] + 378s termix=154M/256M peak=173M kills=0 rs=0 reqs=7518
[12:28:53] + 393s termix=153M/256M peak=173M kills=0 rs=0 reqs=7818
[12:29:08] + 408s termix=153M/256M peak=173M kills=0 rs=0 reqs=8118
[12:29:23] + 424s termix=153M/256M peak=173M kills=0 rs=0 reqs=8418
[12:29:39] + 439s termix=153M/256M peak=173M kills=0 rs=0 reqs=8718
[12:29:54] + 454s termix=153M/256M peak=173M kills=0 rs=0 reqs=9018
[12:30:09] + 469s termix=152M/256M peak=173M kills=0 rs=0 reqs=9318
[12:30:24] + 484s termix=153M/256M peak=173M kills=0 rs=0 reqs=9618
[12:30:39] + 499s termix=153M/256M peak=173M kills=0 rs=0 reqs=9918
[12:30:54] + 514s termix=153M/256M peak=173M kills=0 rs=0 reqs=10218
[12:31:09] + 530s termix=153M/256M peak=173M kills=0 rs=0 reqs=10518
[12:31:24] + 545s termix=153M/256M peak=173M kills=0 rs=0 reqs=10818
[12:31:40] + 560s termix=153M/256M peak=173M kills=0 rs=0 reqs=11118
[12:31:55] + 575s termix=154M/256M peak=173M kills=0 rs=0 reqs=11422
[12:32:10] + 590s termix=154M/256M peak=173M kills=0 rs=0 reqs=11722
[12:32:25] + 605s termix=153M/256M peak=173M kills=0 rs=0 reqs=12022
[12:32:25] memory watch: killed=False tight=[] requests=12022 codes={'200': 12022}
[12:32:25] MV-termix: ABORT — putting the FROM images back
[12:32:57] termix: readback found=True (http 200, control refused as it must)
[12:32:57] ABORT: app came back in 30.9s; data present=True
@@ -0,0 +1,328 @@
termix | Setting up user permissions (PUID: 1000, PGID: 1000)...
termix | usermod: no changes
termix | User node is now UID: 1000, GID: 1000
termix | Loading persisted SSL settings from /app/data/.env
termix | Configuring web UI to run on port: 8080
termix | SSL disabled - using HTTP-only configuration (default)
termix | Data directory is writable
termix | Starting nginx...
termix | Starting backend services...
termix | [1:21:39 PM] [INFO] [🚀] Termix backend initialization started [op:backend_init_start]
termix | [1:21:39 PM] [INFO] [📦] Termix Backend starting - Version: 2.9.2 [op:startup]
termix | [1:21:40 PM] [INFO] [🗄️] Database layer pre-upgrade backup created [op:database_layer_preupgrade_backup_created]
termix | [1:21:40 PM] [INFO] [🚀] SSL not enabled - skipping certificate generation [op:ssl_disabled_default]
termix | [1:21:40 PM] [SUCCESS] [🚀] SSL setup completed [op:backend_init_ssl]
termix | [1:21:40 PM] [INFO] [🗄️] Initializing SQLite database [op:db_init]
termix | [1:21:40 PM] [INFO] [🗄️] Relaxed plugin_permission_grants.granted_by to allow bundled grants [op:schema_migration]
termix | [1:21:40 PM] [INFO] [🗄️] Performance indexes ready in 0ms [op:performance_index_create]
termix | [1:21:40 PM] [SUCCESS] [🗄️] Schema migration completed [op:schema_migration]
termix | [1:21:40 PM] [SUCCESS] [🚀] Database initialized (sqlite) [op:backend_init_db]
termix | [1:21:40 PM] [INFO] [🗄️] User key migration pass finished [op:dek_migration_boot]
termix | [1:21:41 PM] [INFO] [🗄️] Recorded 3 permission(s) already held by a role [op:prime_known_permissions]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin acme-ssl@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin ai@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin alerts@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin automations@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin docker@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin file-manager@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin fleets@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin homepage@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin host-metrics@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin ldap@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin network-topology@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin opkssh@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin proxmox@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin remote-desktop@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin secret-sources@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin serial@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin session-recording@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin session-sharing@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin snippets@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin ssh-terminal@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin sso@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin step-ca@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin tailscale@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin telemetry@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin termix-identity@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin tmux-monitor@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin totp@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin tunnels@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin vault@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin wake-on-lan@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin warpgate@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin web-endpoint@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin webauthn@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Loaded plugin workspaces@1.0.0 [op:plugin_load]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin acme-ssl [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin ai [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin alerts [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin automations [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin docker [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin file-manager [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin fleets [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin homepage [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin host-metrics [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin ldap [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin network-topology [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin opkssh [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin proxmox [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin remote-desktop [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin secret-sources [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin serial [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin session-recording [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin session-sharing [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin snippets [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin ssh-terminal [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin sso [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin step-ca [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin tailscale [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin telemetry [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin termix-identity [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin tmux-monitor [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin totp [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin tunnels [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin vault [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin wake-on-lan [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin warpgate [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin web-endpoint [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin webauthn [op:plugin_seed]
termix | [1:21:41 PM] [INFO] [🧩] Registered bundled plugin workspaces [op:plugin_seed]
termix | Setting up user permissions (PUID: 1000, PGID: 1000)...
termix | usermod: no changes
termix | User node is now UID: 1000, GID: 1000
termix | Loading persisted SSL settings from /app/data/.env
termix | Configuring web UI to run on port: 8080
termix | SSL disabled - using HTTP-only configuration (default)
termix | Data directory is writable
termix | Starting nginx...
termix | Starting backend services...
termix | [1:21:43 PM] [INFO] [🚀] Termix backend initialization started [op:backend_init_start]
termix | [1:21:43 PM] [INFO] [📦] Termix Backend starting - Version: 2.9.2 [op:startup]
termix | [1:21:44 PM] [INFO] [🚀] SSL not enabled - skipping certificate generation [op:ssl_disabled_default]
termix | [1:21:44 PM] [SUCCESS] [🚀] SSL setup completed [op:backend_init_ssl]
termix | [1:21:44 PM] [INFO] [🗄️] Initializing SQLite database [op:db_init]
termix | [1:21:44 PM] [INFO] [🗄️] Performance indexes ready in 0ms [op:performance_index_create]
termix | [1:21:44 PM] [SUCCESS] [🗄️] Schema migration completed [op:schema_migration]
termix | [1:21:44 PM] [SUCCESS] [🚀] Database initialized (sqlite) [op:backend_init_db]
termix | [1:21:44 PM] [INFO] [🗄️] User key migration pass finished [op:dek_migration_boot]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin acme-ssl@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin ai@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin alerts@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin automations@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin docker@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin file-manager@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin fleets@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin homepage@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin host-metrics@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin ldap@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin network-topology@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin opkssh@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin proxmox@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin remote-desktop@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin secret-sources@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin serial@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin session-recording@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin session-sharing@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin snippets@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin ssh-terminal@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin sso@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin step-ca@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin tailscale@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin telemetry@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin termix-identity@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin tmux-monitor@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin totp@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin tunnels@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin vault@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin wake-on-lan@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin warpgate@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin web-endpoint@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin webauthn@1.0.0 [op:plugin_load]
termix | [1:21:45 PM] [INFO] [🧩] Loaded plugin workspaces@1.0.0 [op:plugin_load]
termix | Setting up user permissions (PUID: 1000, PGID: 1000)...
termix | usermod: no changes
termix | User node is now UID: 1000, GID: 1000
termix | Loading persisted SSL settings from /app/data/.env
termix | Configuring web UI to run on port: 8080
termix | SSL disabled - using HTTP-only configuration (default)
termix | Data directory is writable
termix | Starting nginx...
termix | Starting backend services...
termix | [1:21:48 PM] [INFO] [🚀] Termix backend initialization started [op:backend_init_start]
termix | [1:21:48 PM] [INFO] [📦] Termix Backend starting - Version: 2.9.2 [op:startup]
termix | [1:21:49 PM] [INFO] [🚀] SSL not enabled - skipping certificate generation [op:ssl_disabled_default]
termix | [1:21:49 PM] [SUCCESS] [🚀] SSL setup completed [op:backend_init_ssl]
termix | [1:21:49 PM] [INFO] [🗄️] Initializing SQLite database [op:db_init]
termix | [1:21:49 PM] [INFO] [🗄️] Performance indexes ready in 0ms [op:performance_index_create]
termix | [1:21:49 PM] [SUCCESS] [🗄️] Schema migration completed [op:schema_migration]
termix | [1:21:49 PM] [SUCCESS] [🚀] Database initialized (sqlite) [op:backend_init_db]
termix | [1:21:49 PM] [INFO] [🗄️] User key migration pass finished [op:dek_migration_boot]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin acme-ssl@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin ai@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin alerts@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin automations@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin docker@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin file-manager@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin fleets@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin homepage@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin host-metrics@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin ldap@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin network-topology@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin opkssh@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin proxmox@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin remote-desktop@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin secret-sources@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin serial@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin session-recording@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin session-sharing@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin snippets@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin ssh-terminal@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin sso@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin step-ca@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin tailscale@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin telemetry@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin termix-identity@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin tmux-monitor@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin totp@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin tunnels@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin vault@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin wake-on-lan@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin warpgate@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin web-endpoint@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin webauthn@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Loaded plugin workspaces@1.0.0 [op:plugin_load]
termix | [1:21:50 PM] [INFO] [🧩] Mounted /plugin-api/acme-ssl [op:plugin_http_mount]
termix | [1:21:50 PM] [SUCCESS] [🧩] Activated plugin acme-ssl [op:plugin_activate]
termix | [1:21:50 PM] [INFO] [🧩] Applied 1 migration(s) for plugin workspaces: 0001_adopt_user_workspaces [op:plugin_migrate]
termix | [1:21:50 PM] [INFO] [🗄️] Moved 1 Host Metrics setting(s) and 0 host(s) into plugin settings [op:host_metrics_settings_migration]
termix | [1:21:50 PM] [INFO] [🧩] Mounted /plugin-api/workspaces [op:plugin_http_mount]
termix | [1:21:50 PM] [INFO] [🧩] Workspaces routes mounted at /plugin-api/workspaces [op:plugin:workspaces]
termix | [1:21:50 PM] [SUCCESS] [🧩] Activated plugin workspaces [op:plugin_activate]
termix | [1:21:50 PM] [INFO] [🧩] Applied 1 migration(s) for plugin network-topology: 0001_adopt_network_topology [op:plugin_migrate]
termix | [1:21:50 PM] [INFO] [🧩] Mounted /plugin-api/network-topology [op:plugin_http_mount]
termix | [1:21:50 PM] [INFO] [🧩] Network Topology routes mounted at /plugin-api/network-topology [op:plugin:network-topology]
termix | [1:21:50 PM] [SUCCESS] [🧩] Activated plugin network-topology [op:plugin_activate]
termix | [1:21:50 PM] [INFO] [🧩] Applied 1 migration(s) for plugin snippets: 0001_adopt_snippets_tables [op:plugin_migrate]
termix | [1:21:50 PM] [INFO] [🧩] Mounted /plugin-api/snippets [op:plugin_http_mount]
termix | [1:21:50 PM] [INFO] [🧩] Snippets routes mounted at /plugin-api/snippets [op:plugin:snippets]
termix | [1:21:50 PM] [SUCCESS] [🧩] Activated plugin snippets [op:plugin_activate]
termix | [1:21:50 PM] [INFO] [🧩] Applied 1 migration(s) for plugin fleets: 0001_adopt_fleets [op:plugin_migrate]
termix | [1:21:50 PM] [INFO] [🧩] Mounted /plugin-api/fleets [op:plugin_http_mount]
termix | [1:21:50 PM] [INFO] [🧩] Fleets routes mounted at /plugin-api/fleets [op:plugin:fleets]
termix | [1:21:50 PM] [SUCCESS] [🧩] Activated plugin fleets [op:plugin_activate]
termix | [1:21:50 PM] [INFO] [🧩] Plugin ssh-terminal optional service "tmux.sessions" is not available [op:plugin_activate]
termix | [1:21:50 PM] [INFO] [🧩] Plugin ssh-terminal optional service "sessions.sharing" is not available [op:plugin_activate]
termix | [1:21:50 PM] [INFO] [🧩] Plugin ssh-terminal optional service "recordings.writer" is not available [op:plugin_activate]
termix | [1:21:50 PM] [INFO] [🧩] Applied 1 migration(s) for plugin ssh-terminal: 0001_adopt_command_history [op:plugin_migrate]
termix | [1:21:51 PM] [WARN] [🧩] Plugin ssh-terminal serves /plugin-ws/ssh-terminal/terminal without core authentication [op:plugin_ws_public]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-ws/ssh-terminal/terminal [op:plugin_ws_mount]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/ssh-terminal [op:plugin_http_mount]
termix | [1:21:51 PM] [INFO] [🧩] SSH terminal mounted at /plugin-ws/ssh-terminal/terminal [op:plugin:ssh-terminal]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin ssh-terminal [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 1 migration(s) for plugin tunnels: 0001_adopt_c2s_tunnel_presets [op:plugin_migrate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/tunnels [op:plugin_http_mount]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-ws/tunnels/c2s/stream [op:plugin_ws_mount]
termix | [1:21:51 PM] [INFO] [🧩] Tunnel routes mounted at /plugin-api/tunnels [op:plugin:tunnels]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin tunnels [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/docker [op:plugin_http_mount]
termix | [1:21:51 PM] [WARN] [🧩] Plugin docker serves /plugin-ws/docker/console without core authentication [op:plugin_ws_public]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-ws/docker/console [op:plugin_ws_mount]
termix | [1:21:51 PM] [INFO] [🧩] Docker mounted at /plugin-api/docker and /plugin-ws/docker/console [op:plugin:docker]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin docker [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 1 migration(s) for plugin host-metrics: 0001_adopt_host_metrics_tables [op:plugin_migrate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/host-metrics [op:plugin_http_mount]
termix | [1:21:51 PM] [INFO] [🧩] Host Metrics mounted at /plugin-api/host-metrics [op:plugin:host-metrics]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin host-metrics [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/wake-on-lan [op:plugin_http_mount]
termix | [1:21:51 PM] [INFO] [🧩] Wake-on-LAN routes mounted at /plugin-api/wake-on-lan [op:plugin:wake-on-lan]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin wake-on-lan [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 4 migration(s) for plugin automations: 0001_adopt_automations, 0002_unlink_channels, 0003_host_maintenance, 0004_rename_maintenance_index [op:plugin_migrate]
termix | [1:21:51 PM] [WARN] [🧩] Plugin automations serves 1 route(s) without authentication: /webhook/:token [op:plugin_http_public]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/automations [op:plugin_http_mount]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin automations [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 1 migration(s) for plugin homepage: 0001_adopt_homepage_tables [op:plugin_migrate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/homepage [op:plugin_http_mount]
termix | [1:21:51 PM] [INFO] [🧩] Homepage routes mounted at /plugin-api/homepage [op:plugin:homepage]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin homepage [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 2 migration(s) for plugin ai: 0001_adopt_ai_tables, 0002_provider_sync [op:plugin_migrate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/ai [op:plugin_http_mount]
termix | [1:21:51 PM] [INFO] [🧩] AI assistant routes mounted at /plugin-api/ai [op:plugin:ai]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin ai [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 1 migration(s) for plugin alerts: 0001_create_alerts [op:plugin_migrate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/alerts [op:plugin_http_mount]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin alerts [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 1 migration(s) for plugin file-manager: 0001_adopt_file_manager_tables [op:plugin_migrate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/file-manager [op:plugin_http_mount]
termix | [1:21:51 PM] [INFO] [🧩] File manager mounted at /plugin-api/file-manager [op:plugin:file-manager]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin file-manager [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 1 migration(s) for plugin ldap: 0001_create_providers [op:plugin_migrate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/ldap [op:plugin_http_mount]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin ldap [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 1 migration(s) for plugin opkssh: 0001_adopt_opkssh_tokens [op:plugin_migrate]
termix | [1:21:51 PM] [WARN] [🧩] Plugin opkssh serves 5 route(s) without authentication: /chooser/:requestId, /chooser/:requestId/*, /callback, /callback/:requestId, /callback/:requestId/* [op:plugin_http_public]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/opkssh [op:plugin_http_mount]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin opkssh [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 1 migration(s) for plugin proxmox: 0001_adopt_proxmox_stats [op:plugin_migrate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/proxmox [op:plugin_http_mount]
termix | [1:21:51 PM] [INFO] [🧩] Proxmox routes mounted at /plugin-api/proxmox [op:plugin:proxmox]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin proxmox [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 1 migration(s) for plugin session-recording: 0001_adopt_session_recordings [op:plugin_migrate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/session-recording [op:plugin_http_mount]
termix | [1:21:51 PM] [INFO] [🧩] Session Recording routes mounted at /plugin-api/session-recording [op:plugin:session-recording]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin session-recording [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/remote-desktop [op:plugin_http_mount]
termix | [1:21:51 PM] [WARN] [🧩] Plugin remote-desktop serves /plugin-ws/remote-desktop/display without core authentication [op:plugin_ws_public]
termix | [1:21:51 PM] [INFO] [🧩] Mounted raw upgrade /plugin-ws/remote-desktop/display [op:plugin_ws_mount]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin remote-desktop [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 1 migration(s) for plugin secret-sources: 0001_adopt_secret_sources [op:plugin_migrate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/secret-sources [op:plugin_http_mount]
termix | [1:21:51 PM] [INFO] [🧩] Secret sources routes mounted at /plugin-api/secret-sources [op:plugin:secret-sources]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin secret-sources [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-ws/serial/console [op:plugin_ws_mount]
termix | [1:21:51 PM] [INFO] [🧩] Serial console mounted at /plugin-ws/serial/console [op:plugin:serial]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin serial [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 1 migration(s) for plugin session-sharing: 0001_adopt_session_sharing [op:plugin_migrate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/session-sharing [op:plugin_http_mount]
termix | [1:21:51 PM] [WARN] [🧩] Plugin session-sharing serves 2 route(s) without authentication: /resolve/:linkToken, /guest/:token [op:plugin_http_public]
termix | [1:21:51 PM] [INFO] [🧩] Session sharing mounted at /plugin-api/session-sharing [op:plugin:session-sharing]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin session-sharing [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 2 migration(s) for plugin sso: 0001_adopt_sso_providers, 0002_legacy_callback [op:plugin_migrate]
termix | [1:21:51 PM] [WARN] [🧩] Plugin sso serves 4 route(s) without authentication: /start, /callback, /backchannel-logout, /config [op:plugin_http_public]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/sso [op:plugin_http_mount]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin sso [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 1 migration(s) for plugin step-ca: 0001_create_certs [op:plugin_migrate]
termix | [1:21:51 PM] [WARN] [🧩] Plugin step-ca serves 1 route(s) without authentication: /callback [op:plugin_http_public]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/step-ca [op:plugin_http_mount]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin step-ca [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/tailscale [op:plugin_http_mount]
termix | [1:21:51 PM] [INFO] [🧩] Tailscale routes mounted at /plugin-api/tailscale [op:plugin:tailscale]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin tailscale [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/telemetry [op:plugin_http_mount]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin telemetry [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 1 migration(s) for plugin termix-identity: 0001_adopt_termix_identity_tables [op:plugin_migrate]
termix | [1:21:51 PM] [WARN] [🧩] Plugin termix-identity serves 2 route(s) without authentication: /u/:handle, /u/:handle/:algo [op:plugin_http_public]
termix | [1:21:51 PM] [INFO] [🧩] Mounted /plugin-api/termix-identity [op:plugin_http_mount]
termix | [1:21:51 PM] [SUCCESS] [🧩] Activated plugin termix-identity [op:plugin_activate]
termix | [1:21:51 PM] [INFO] [🧩] Applied 1 migration(s) for plugin tmux-monitor: 0001_adopt_tmux_session_tags [op:plugin_migrate]
termix | [1:21:52 PM] [INFO] [🧩] Mounted /plugin-api/tmux-monitor [op:plugin_http_mount]
termix | [1:21:52 PM] [INFO] [🧩] Tmux Monitor routes mounted at /plugin-api/tmux-monitor [op:plugin:tmux-monitor]
termix | [1:21:52 PM] [SUCCESS] [🧩] Activated plugin tmux-monitor [op:plugin_activate]
termix | [1:21:52 PM] [INFO] [🧩] Applied 1 migration(s) for plugin totp: 0001_create_enrollments [op:plugin_migrate]
termix | [1:21:52 PM] [INFO] [🧩] Mounted /plugin-api/totp [op:plugin_http_mount]
termix | [1:21:52 PM] [SUCCESS] [🧩] Activated plugin totp [op:plugin_activate]
termix | [1:21:52 PM] [INFO] [🧩] Applied 1 migration(s) for plugin vault: 0001_adopt_vault_tables [op:plugin_migrate]
termix | [1:21:52 PM] [WARN] [🧩] Plugin vault serves 1 route(s) without authentication: /oidc/callback [op:plugin_http_public]
termix | [1:21:52 PM] [INFO] [🧩] Mounted /plugin-api/vault [op:plugin_http_mount]
termix | [1:21:52 PM] [SUCCESS] [🧩] Activated plugin vault [op:plugin_activate]
termix | [1:21:52 PM] [SUCCESS] [🧩] Activated plugin warpgate [op:plugin_activate]
termix | [1:21:52 PM] [INFO] [🧩] Mounted /plugin-api/web-endpoint [op:plugin_http_mount]
termix | [1:21:52 PM] [INFO] [🧩] Web Endpoint routes mounted at /plugin-api/web-endpoint [op:plugin:web-endpoint]
termix | [1:21:52 PM] [SUCCESS] [🧩] Activated plugin web-endpoint [op:plugin_activate]
termix | [1:21:52 PM] [INFO] [🧩] Applied 1 migration(s) for plugin webauthn: 0001_adopt_webauthn_credentials [op:plugin_migrate]
termix | [1:21:52 PM] [WARN] [🧩] Plugin webauthn serves 1 route(s) without authentication: /authenticate/options [op:plugin_http_public]
termix | [1:21:52 PM] [INFO] [🧩] Mounted /plugin-api/webauthn [op:plugin_http_mount]
termix | [1:21:52 PM] [SUCCESS] [🧩] Activated plugin webauthn [op:plugin_activate]
termix | [1:21:52 PM] [INFO] [🚀] Loaded 34 plugin(s) [op:plugin_init]
termix | [1:21:52 PM] [INFO] [🗄️] Moved 2 Remote Desktop setting(s), 0 user(s) and 0 host(s) into plugin settings [op:remote_desktop_settings_migration]
termix | [1:21:52 PM] [INFO] [🗄️] Moved telemetry settings into plugin settings [op:telemetry_settings_migration]
termix | [1:21:52 PM] [SUCCESS] [🚀] Termix backend started successfully [op:backend_init_complete,duration:3747ms]
@@ -0,0 +1,8 @@
{
"termix": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
}
}
@@ -0,0 +1,56 @@
{
"harness_version": 5,
"edge": "MV-termix",
"app": "termix",
"note": "night 2026-09-23 within-a-major move: termix=ghcr.io/lukegus/termix:2.9.2",
"from": {
"termix": "ghcr.io/lukegus/termix:2.8.0"
},
"to": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": "\u001b[2Ktermix | [1:21:40 PM] [INFO] [\ud83d\uddc4\ufe0f] Database layer pre-upgrade backup created [op:database_layer_preupgrade_backup_created]",
"abort": "starts-and-serves",
"abort_detail": null,
"engine_state_after": null,
"memory": {
"soak_s": 605.4,
"requested_s": 600,
"requests": 12022,
"codes": {
"200": 12022
},
"first_kill": null,
"containers": {
"termix": {
"limit": 268435456,
"peak": 181923840,
"peak_pct": 0.678,
"anon_peak_sampled": 117604352,
"anon_peak_pct": 0.438,
"swap_peak": 0,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"venue_swap_bytes": 0,
"load": "reached"
},
"marks": [],
"bench_overrides": null,
"duration_s": 56.9,
"measured_at": "2026-10-28T12:32:57Z",
"evidence": "evidence/MV-termix",
"scratch_cleared": [],
"files_changed": [],
"files_changed_detail": [],
"files_ignored": [],
"total_s": 781.3
}
@@ -0,0 +1,222 @@
{
"app": "termix",
"walk": "security",
"box_walk_version": 1,
"verdict": "proven",
"venue": "box 9202 (drill catalog), the guarded Update",
"from": {
"termix": "ghcr.io/lukegus/termix:2.8.0"
},
"to": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"observables_before": {
"pinned_images": {
"termix": "ghcr.io/lukegus/termix:2.8.0"
},
"installed_images": {
"termix": "ghcr.io/lukegus/termix:2.8.0"
},
"catalog_images": {
"termix": "ghcr.io/lukegus/termix:2.8.0"
},
"live_compose_image_lines": [
"image: ghcr.io/lukegus/termix:2.8.0@sha256:25e8a0eb39f45c9ac5e8e7615fd84a0380018ea012317bc665b86458d900b4b9"
],
"docker_inspect": [
"termix ghcr.io/lukegus/termix:2.8.0@sha256:25e8a0eb39f45c9ac5e8e7615fd84a0380018ea012317bc665b86458d900b4b9 running=true restarts=0"
]
},
"setup_gate_before": {
"browser": {
"status": "302",
"redirect": "https://felhom.enkisfelhom.hu/__gate/start?…"
},
"script": {
"status": "401",
"redirect": null
}
},
"seed": "read_back",
"drill_commit": "071db0085d6f",
"sync_waited_s": 4.4,
"badge_before": {
"hu": [
{
"title": "Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.",
"text": "Frissítés elérhető — ma"
}
],
"en": [
{
"title": "A newer version of this app is available. Select the Update button to start it.",
"text": "Update available — today"
}
]
},
"measured_at": "2026-10-28T12:53:47Z",
"update": {
"accepted": true,
"http": "202",
"phases": [
{
"t": 0.0,
"phase": "backing-up",
"label": "Biztonsági mentés készül a frissítés előtt…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 13.3,
"phase": "pulling",
"label": "Új verzió letöltése…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 33.8,
"phase": "copying",
"label": "Az adatok másolása a frissítés előtt…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 42.0,
"phase": "starting",
"label": "Indítás az új verzióval…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 43.0,
"phase": "verifying",
"label": "Működés ellenőrzése…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 68.7,
"phase": "done",
"label": "Frissítve",
"updating": false,
"error": null,
"hold": null
}
],
"duration_s": 68.7,
"final_phase": "done",
"update_error": null,
"hold_reason": null,
"state": "running"
},
"observables_after": {
"pinned_images": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"installed_images": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"catalog_images": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"live_compose_image_lines": [
"image: ghcr.io/lukegus/termix:2.9.2"
],
"docker_inspect": [
"termix ghcr.io/lukegus/termix:2.9.2 running=true restarts=0"
]
},
"badge_after": {
"hu": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"en": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
]
},
"state_after": "running",
"hold_after": null,
"to_digests": {
"termix": "sha256:d64c841a560c54aa7c27b0e6bbd2fbf8b51073565040d2a6bfbc127f0a72cf1e"
},
"four_observables": {
"pinned": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"installed": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"catalog": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"live_compose": [
"ghcr.io/lukegus/termix:2.9.2"
]
},
"seed_read_after": true,
"setup_gate_after": {
"browser": {
"status": "200",
"redirect": null
},
"script": {
"status": "200",
"redirect": null
}
},
"memory": {
"soak_s": 600,
"interval_s": 10,
"samples": 60,
"containers": {
"termix": {
"samples": 60,
"anon_peak_bytes": 118284288,
"limit_bytes": 268435456,
"anon_peak_pct": 44.1,
"cgroup_peak_pct": 100.0,
"oom_kill_delta": 0,
"oom_killed_flag": false,
"restarts_delta": 0,
"running_all_samples": true,
"cgroup": "/sys/fs/cgroup/system.slice/docker-2d522faa2de6d34c156c32c7950dfde9764bdb5e8a09f08c6c2d68d918f8f733.scope"
}
},
"oom_kills": 0,
"restarts": 0,
"peak_pct": 44.1
},
"why": "the security-fix step ran on the box through the guarded Update; healthy, TO on all four observables, no undo, no hold, a clean soak, seed read back",
"log": [
"13:52:43 [5] the box's drill mirror now at e410bac1c",
"13:52:48 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}",
"13:53:28 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:2.8.0'}",
"13:53:28 gate: termix is gated — passed as the household (cookie set)",
"13:53:31 [2] setup gate as installed: {'browser': {'status': '302', 'redirect': 'https://felhom.enkisfelhom.hu/__gate/start?…'}, 'script': {'status': '401', 'redirect': None}}",
"13:53:31 termix: seeded user drilla57e7f53 via /users/create",
"13:53:32 termix: readback found=True (http 200, control refused as it must)",
"13:53:33 [5] drill commit 071db0085d6f: termix ghcr.io/lukegus/termix:2.8.0 -> ghcr.io/lukegus/termix:2.9.2 (push rc=0)",
"13:53:42 [5] the box's drill mirror now at 071db0085",
"13:53:47 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}",
"13:53:47 + 0.0s phase=backing-up label=Biztonsági mentés készül a frissítés előtt… err=None hold=None",
"13:54:00 + 13.3s phase=pulling label=Új verzió letöltése… err=None hold=None",
"13:54:21 + 33.8s phase=copying label=Az adatok másolása a frissítés előtt… err=None hold=None",
"13:54:29 + 42.0s phase=starting label=Indítás az új verzióval… err=None hold=None",
"13:54:30 + 43.0s phase=verifying label=Működés ellenőrzése… err=None hold=None",
"13:54:56 + 68.7s phase=done label=Frissítve err=None hold=None",
"13:55:14 termix: readback found=True (http 200, control refused as it must)",
"13:55:14 [7] memory soak 600 s …",
"14:05:20 [7] soak: peak 44.1% of the limit (anon), kills 0, restarts 0"
]
}
@@ -0,0 +1,24 @@
13:52:43 [5] the box's drill mirror now at e410bac1c
13:52:48 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
13:53:28 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:2.8.0'}
13:53:28 gate: termix is gated — passed as the household (cookie set)
13:53:31 [2] setup gate as installed: {'browser': {'status': '302', 'redirect': 'https://felhom.enkisfelhom.hu/__gate/start?…'}, 'script': {'status': '401', 'redirect': None}}
13:53:31 termix: seeded user drilla57e7f53 via /users/create
13:53:32 termix: readback found=True (http 200, control refused as it must)
13:53:33 [5] drill commit 071db0085d6f: termix ghcr.io/lukegus/termix:2.8.0 -> ghcr.io/lukegus/termix:2.9.2 (push rc=0)
13:53:42 [5] the box's drill mirror now at 071db0085
13:53:47 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}
13:53:47 + 0.0s phase=backing-up label=Biztonsági mentés készül a frissítés előtt… err=None hold=None
13:54:00 + 13.3s phase=pulling label=Új verzió letöltése… err=None hold=None
13:54:21 + 33.8s phase=copying label=Az adatok másolása a frissítés előtt… err=None hold=None
13:54:29 + 42.0s phase=starting label=Indítás az új verzióval… err=None hold=None
13:54:30 + 43.0s phase=verifying label=Működés ellenőrzése… err=None hold=None
13:54:56 + 68.7s phase=done label=Frissítve err=None hold=None
13:55:14 termix: readback found=True (http 200, control refused as it must)
13:55:14 [7] memory soak 600 s …
14:05:20 [7] soak: peak 44.1% of the limit (anon), kills 0, restarts 0
14:05:20 [9] verdict proven -> /tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/0b76c4d7-9b39-4e4e-869d-d0d2c6006331/scratchpad/p2/box/termix-292/verdict.json
14:05:20 RESULT proven — the security-fix step ran on the box through the guarded Update; healthy, TO on all four observables, no undo, no hold, a clean soak, seed read back
14:05:21 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:05:53 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:06:01 [X] after remove: deployed=False leftovers=''
@@ -0,0 +1,22 @@
14:07:26 [5] the box's drill mirror now at fcadb0a09
14:07:31 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
14:08:21 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:2.8.0'}
14:08:21 gate: termix is gated — passed as the household (cookie set)
14:08:22 termix: seeded user drill3ba18d55 via /users/create
14:08:22 termix: readback found=True (http 200, control refused as it must)
14:08:23 drill commit 36230429acc4: termix TO with failing checks
14:08:32 [5] the box's drill mirror now at 36230429a
14:08:36 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}
14:08:37 + 0.1s phase=backing-up label=Biztonsági mentés készül a frissítés előtt… err=None hold=None
14:08:40 + 3.1s phase=pulling label=Új verzió letöltése… err=None hold=None
14:09:13 + 36.9s phase=copying label=Az adatok másolása a frissítés előtt… err=None hold=None
14:09:18 + 42.0s phase=starting label=Indítás az új verzióval… err=None hold=None
14:09:19 + 43.1s phase=verifying label=Működés ellenőrzése… err=None hold=None
14:10:51 + 134.2s phase=done label=Frissítve err=None hold=None
14:11:19 RESULT failed — the update ended 'done', not 'undone'
14:11:19 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:11:51 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:11:59 [X] after remove: deployed=False leftovers=''
14:12:10 [5] the box's drill mirror now at 718be0f30
14:12:10 drill revert 36230429acc4: rc=0
14:12:10 drill templates/termix equal to before: True
@@ -0,0 +1,164 @@
{
"app": "termix",
"from": {
"termix": "ghcr.io/lukegus/termix:2.8.0"
},
"to": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"started": "2026-10-28T13:07:17Z",
"drill_head_before": "fcadb0a0935bb06581b9df06e6ce723fcc835ee0",
"failing_compose_main_healthcheck": [
"test: [\"CMD\", \"false\"]"
],
"failing_probe": true,
"update": {
"accepted": true,
"http": "202",
"phases": [
{
"t": 0.1,
"phase": "backing-up",
"label": "Biztons\u00e1gi ment\u00e9s k\u00e9sz\u00fcl a friss\u00edt\u00e9s el\u0151tt\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 3.1,
"phase": "pulling",
"label": "\u00daj verzi\u00f3 let\u00f6lt\u00e9se\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 36.9,
"phase": "copying",
"label": "Az adatok m\u00e1sol\u00e1sa a friss\u00edt\u00e9s el\u0151tt\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 42.0,
"phase": "starting",
"label": "Ind\u00edt\u00e1s az \u00faj verzi\u00f3val\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 43.1,
"phase": "verifying",
"label": "M\u0171k\u00f6d\u00e9s ellen\u0151rz\u00e9se\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 134.2,
"phase": "done",
"label": "Friss\u00edtve",
"updating": false,
"error": null,
"hold": null
}
],
"duration_s": 134.2,
"final_phase": "done",
"update_error": null,
"hold_reason": null,
"state": "unhealthy"
},
"to_log_while_verifying": [
"[2:09:47 PM] [INFO] [\ud83e\udde9] Applied 2 migration(s) for plugin sso: 0001_adopt_sso_providers, 0002_legacy_callback [op:plugin_migrate]",
"[2:09:47 PM] [WARN] [\ud83e\udde9] Plugin sso serves 4 route(s) without authentication: /start, /callback, /backchannel-logout, /config [op:plugin_http_public]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/sso [op:plugin_http_mount]",
"[2:09:47 PM] [SUCCESS] [\ud83e\udde9] Activated plugin sso [op:plugin_activate]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Applied 1 migration(s) for plugin step-ca: 0001_create_certs [op:plugin_migrate]",
"[2:09:47 PM] [WARN] [\ud83e\udde9] Plugin step-ca serves 1 route(s) without authentication: /callback [op:plugin_http_public]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/step-ca [op:plugin_http_mount]",
"[2:09:47 PM] [SUCCESS] [\ud83e\udde9] Activated plugin step-ca [op:plugin_activate]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/tailscale [op:plugin_http_mount]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Tailscale routes mounted at /plugin-api/tailscale [op:plugin:tailscale]",
"[2:09:47 PM] [SUCCESS] [\ud83e\udde9] Activated plugin tailscale [op:plugin_activate]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/telemetry [op:plugin_http_mount]",
"[2:09:47 PM] [SUCCESS] [\ud83e\udde9] Activated plugin telemetry [op:plugin_activate]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Applied 1 migration(s) for plugin termix-identity: 0001_adopt_termix_identity_tables [op:plugin_migrate]",
"[2:09:47 PM] [WARN] [\ud83e\udde9] Plugin termix-identity serves 2 route(s) without authentication: /u/:handle, /u/:handle/:algo [op:plugin_http_public]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/termix-identity [op:plugin_http_mount]",
"[2:09:47 PM] [SUCCESS] [\ud83e\udde9] Activated plugin termix-identity [op:plugin_activate]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Applied 1 migration(s) for plugin tmux-monitor: 0001_adopt_tmux_session_tags [op:plugin_migrate]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/tmux-monitor [op:plugin_http_mount]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Tmux Monitor routes mounted at /plugin-api/tmux-monitor [op:plugin:tmux-monitor]",
"[2:09:47 PM] [SUCCESS] [\ud83e\udde9] Activated plugin tmux-monitor [op:plugin_activate]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Applied 1 migration(s) for plugin totp: 0001_create_enrollments [op:plugin_migrate]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/totp [op:plugin_http_mount]",
"[2:09:47 PM] [SUCCESS] [\ud83e\udde9] Activated plugin totp [op:plugin_activate]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Applied 1 migration(s) for plugin vault: 0001_adopt_vault_tables [op:plugin_migrate]",
"[2:09:47 PM] [WARN] [\ud83e\udde9] Plugin vault serves 1 route(s) without authentication: /oidc/callback [op:plugin_http_public]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/vault [op:plugin_http_mount]",
"[2:09:47 PM] [SUCCESS] [\ud83e\udde9] Activated plugin vault [op:plugin_activate]",
"[2:09:47 PM] [SUCCESS] [\ud83e\udde9] Activated plugin warpgate [op:plugin_activate]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/web-endpoint [op:plugin_http_mount]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Web Endpoint routes mounted at /plugin-api/web-endpoint [op:plugin:web-endpoint]",
"[2:09:47 PM] [SUCCESS] [\ud83e\udde9] Activated plugin web-endpoint [op:plugin_activate]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Applied 1 migration(s) for plugin webauthn: 0001_adopt_webauthn_credentials [op:plugin_migrate]",
"[2:09:47 PM] [WARN] [\ud83e\udde9] Plugin webauthn serves 1 route(s) without authentication: /authenticate/options [op:plugin_http_public]",
"[2:09:47 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/webauthn [op:plugin_http_mount]",
"[2:09:47 PM] [SUCCESS] [\ud83e\udde9] Activated plugin webauthn [op:plugin_activate]",
"[2:09:47 PM] [INFO] [\ud83d\ude80] Loaded 34 plugin(s) [op:plugin_init]",
"[2:09:47 PM] [INFO] [\ud83d\uddc4\ufe0f] Moved 2 Remote Desktop setting(s), 0 user(s) and 0 host(s) into plugin settings [op:remote_desktop_settings_migration]",
"[2:09:47 PM] [INFO] [\ud83d\uddc4\ufe0f] Moved telemetry settings into plugin settings [op:telemetry_settings_migration]",
"[2:09:47 PM] [SUCCESS] [\ud83d\ude80] Termix backend started successfully [op:backend_init_complete,duration:8680ms]"
],
"observables_after": {
"pinned_images": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"installed_images": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"catalog_images": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"live_compose_image_lines": [
"image: ghcr.io/lukegus/termix:2.9.2"
],
"docker_inspect": [
"termix ghcr.io/lukegus/termix:2.9.2 running=true restarts=0"
]
},
"running_images_after": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"verdict": "failed",
"why": "the update ended 'done', not 'undone'",
"drill_head_after": "718be0f305031668e62b450eadc860ddbfed4cf4",
"drill_tree_equal_to_before": true,
"log": [
"14:07:26 [5] the box's drill mirror now at fcadb0a09",
"14:07:31 [1] deploy -> 202 {'ok': True, 'message': 'Telep\u00edt\u00e9s elind\u00edtva \u2013 az \u00e1llapot a k\u00e1rty\u00e1n k\u00f6vethet\u0151'}",
"14:08:21 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:2.8.0'}",
"14:08:21 gate: termix is gated \u2014 passed as the household (cookie set)",
"14:08:22 termix: seeded user drill3ba18d55 via /users/create",
"14:08:22 termix: readback found=True (http 200, control refused as it must)",
"14:08:23 drill commit 36230429acc4: termix TO with failing checks",
"14:08:32 [5] the box's drill mirror now at 36230429a",
"14:08:36 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Friss\u00edt\u00e9s elindult \u2013 az \u00e1llapot a k\u00e1rty\u00e1n k\u00f6vethet\u0151'}",
"14:08:37 + 0.1s phase=backing-up label=Biztons\u00e1gi ment\u00e9s k\u00e9sz\u00fcl a friss\u00edt\u00e9s el\u0151tt\u2026 err=None hold=None",
"14:08:40 + 3.1s phase=pulling label=\u00daj verzi\u00f3 let\u00f6lt\u00e9se\u2026 err=None hold=None",
"14:09:13 + 36.9s phase=copying label=Az adatok m\u00e1sol\u00e1sa a friss\u00edt\u00e9s el\u0151tt\u2026 err=None hold=None",
"14:09:18 + 42.0s phase=starting label=Ind\u00edt\u00e1s az \u00faj verzi\u00f3val\u2026 err=None hold=None",
"14:09:19 + 43.1s phase=verifying label=M\u0171k\u00f6d\u00e9s ellen\u0151rz\u00e9se\u2026 err=None hold=None",
"14:10:51 + 134.2s phase=done label=Friss\u00edtve err=None hold=None",
"14:11:19 RESULT failed \u2014 the update ended 'done', not 'undone'",
"14:11:19 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}",
"14:11:51 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm",
"14:11:59 [X] after remove: deployed=False leftovers=''",
"14:12:10 [5] the box's drill mirror now at 718be0f30",
"14:12:10 drill revert 36230429acc4: rc=0",
"14:12:10 drill templates/termix equal to before: True"
]
}
@@ -0,0 +1,25 @@
14:13:34 [5] the box's drill mirror now at 718be0f30
14:13:38 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
14:14:19 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:2.8.0'}
14:14:19 gate: termix is gated — passed as the household (cookie set)
14:14:19 termix: seeded user drill86061530 via /users/create
14:14:19 termix: readback found=True (http 200, control refused as it must)
14:14:20 drill commit 39f59c8d713e: termix TO with failing checks
14:14:28 [5] the box's drill mirror now at 39f59c8d7
14:14:33 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}
14:14:33 + 0.0s phase=checking label=Ellenőrzés… err=None hold=None
14:14:34 + 1.0s phase=backing-up label=Biztonsági mentés készül a frissítés előtt… err=None hold=None
14:14:37 + 4.1s phase=safety-dump label=Adatbázis pillanatkép… err=None hold=None
14:14:38 + 5.2s phase=pulling label=Új verzió letöltése… err=None hold=None
14:15:04 + 30.8s phase=copying label=Az adatok másolása a frissítés előtt… err=None hold=None
14:15:10 + 36.9s phase=verifying label=Működés ellenőrzése… err=None hold=None
14:20:13 + 340.1s phase=undoing label=Visszaállítás az előző változatra… err=None hold=None
14:20:20 + 347.3s phase=undone label=Visszaállítva az előző változatra err=None hold=None
14:20:50 termix: readback found=True (http 200, control refused as it must)
14:20:50 RESULT proven — TO started on the data and failed its check; the box undid it: FROM runs again and the seed reads back
14:20:50 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:21:22 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:21:31 [X] after remove: deployed=False leftovers=''
14:21:41 [5] the box's drill mirror now at 465e60882
14:21:41 drill revert 39f59c8d713e: rc=0
14:21:41 drill templates/termix equal to before: True
@@ -0,0 +1,184 @@
{
"app": "termix",
"from": {
"termix": "ghcr.io/lukegus/termix:2.8.0"
},
"to": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"started": "2026-10-28T13:13:24Z",
"drill_head_before": "718be0f305031668e62b450eadc860ddbfed4cf4",
"failing_compose_main_healthcheck": [
"test: [\"CMD\", \"false\"]"
],
"failing_probe": true,
"update": {
"accepted": true,
"http": "202",
"phases": [
{
"t": 0.0,
"phase": "checking",
"label": "Ellen\u0151rz\u00e9s\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 1.0,
"phase": "backing-up",
"label": "Biztons\u00e1gi ment\u00e9s k\u00e9sz\u00fcl a friss\u00edt\u00e9s el\u0151tt\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 4.1,
"phase": "safety-dump",
"label": "Adatb\u00e1zis pillanatk\u00e9p\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 5.2,
"phase": "pulling",
"label": "\u00daj verzi\u00f3 let\u00f6lt\u00e9se\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 30.8,
"phase": "copying",
"label": "Az adatok m\u00e1sol\u00e1sa a friss\u00edt\u00e9s el\u0151tt\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 36.9,
"phase": "verifying",
"label": "M\u0171k\u00f6d\u00e9s ellen\u0151rz\u00e9se\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 340.1,
"phase": "undoing",
"label": "Vissza\u00e1ll\u00edt\u00e1s az el\u0151z\u0151 v\u00e1ltozatra\u2026",
"updating": true,
"error": null,
"hold": null
},
{
"t": 347.3,
"phase": "undone",
"label": "Vissza\u00e1ll\u00edtva az el\u0151z\u0151 v\u00e1ltozatra",
"updating": false,
"error": null,
"hold": null
}
],
"duration_s": 347.3,
"final_phase": "undone",
"update_error": null,
"hold_reason": null,
"state": "running"
},
"to_log_while_verifying": [
"[2:15:32 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/sso [op:plugin_http_mount]",
"[2:15:32 PM] [SUCCESS] [\ud83e\udde9] Activated plugin sso [op:plugin_activate]",
"[2:15:32 PM] [WARN] [\ud83e\udde9] Plugin sso serves 4 route(s) without authentication: /start, /callback, /backchannel-logout, /config [op:plugin_http_public]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Applied 1 migration(s) for plugin step-ca: 0001_create_certs [op:plugin_migrate]",
"[2:15:33 PM] [WARN] [\ud83e\udde9] Plugin step-ca serves 1 route(s) without authentication: /callback [op:plugin_http_public]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/step-ca [op:plugin_http_mount]",
"[2:15:33 PM] [SUCCESS] [\ud83e\udde9] Activated plugin step-ca [op:plugin_activate]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/tailscale [op:plugin_http_mount]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Tailscale routes mounted at /plugin-api/tailscale [op:plugin:tailscale]",
"[2:15:33 PM] [SUCCESS] [\ud83e\udde9] Activated plugin tailscale [op:plugin_activate]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/telemetry [op:plugin_http_mount]",
"[2:15:33 PM] [SUCCESS] [\ud83e\udde9] Activated plugin telemetry [op:plugin_activate]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Applied 1 migration(s) for plugin termix-identity: 0001_adopt_termix_identity_tables [op:plugin_migrate]",
"[2:15:33 PM] [WARN] [\ud83e\udde9] Plugin termix-identity serves 2 route(s) without authentication: /u/:handle, /u/:handle/:algo [op:plugin_http_public]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/termix-identity [op:plugin_http_mount]",
"[2:15:33 PM] [SUCCESS] [\ud83e\udde9] Activated plugin termix-identity [op:plugin_activate]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Applied 1 migration(s) for plugin tmux-monitor: 0001_adopt_tmux_session_tags [op:plugin_migrate]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/tmux-monitor [op:plugin_http_mount]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Tmux Monitor routes mounted at /plugin-api/tmux-monitor [op:plugin:tmux-monitor]",
"[2:15:33 PM] [SUCCESS] [\ud83e\udde9] Activated plugin tmux-monitor [op:plugin_activate]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Applied 1 migration(s) for plugin totp: 0001_create_enrollments [op:plugin_migrate]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/totp [op:plugin_http_mount]",
"[2:15:33 PM] [SUCCESS] [\ud83e\udde9] Activated plugin totp [op:plugin_activate]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Applied 1 migration(s) for plugin vault: 0001_adopt_vault_tables [op:plugin_migrate]",
"[2:15:33 PM] [WARN] [\ud83e\udde9] Plugin vault serves 1 route(s) without authentication: /oidc/callback [op:plugin_http_public]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/vault [op:plugin_http_mount]",
"[2:15:33 PM] [SUCCESS] [\ud83e\udde9] Activated plugin vault [op:plugin_activate]",
"[2:15:33 PM] [SUCCESS] [\ud83e\udde9] Activated plugin warpgate [op:plugin_activate]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/web-endpoint [op:plugin_http_mount]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Web Endpoint routes mounted at /plugin-api/web-endpoint [op:plugin:web-endpoint]",
"[2:15:33 PM] [SUCCESS] [\ud83e\udde9] Activated plugin web-endpoint [op:plugin_activate]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Applied 1 migration(s) for plugin webauthn: 0001_adopt_webauthn_credentials [op:plugin_migrate]",
"[2:15:33 PM] [WARN] [\ud83e\udde9] Plugin webauthn serves 1 route(s) without authentication: /authenticate/options [op:plugin_http_public]",
"[2:15:33 PM] [INFO] [\ud83e\udde9] Mounted /plugin-api/webauthn [op:plugin_http_mount]",
"[2:15:33 PM] [SUCCESS] [\ud83e\udde9] Activated plugin webauthn [op:plugin_activate]",
"[2:15:33 PM] [INFO] [\ud83d\ude80] Loaded 34 plugin(s) [op:plugin_init]",
"[2:15:33 PM] [INFO] [\ud83d\uddc4\ufe0f] Moved 2 Remote Desktop setting(s), 0 user(s) and 0 host(s) into plugin settings [op:remote_desktop_settings_migration]",
"[2:15:33 PM] [INFO] [\ud83d\uddc4\ufe0f] Moved telemetry settings into plugin settings [op:telemetry_settings_migration]",
"[2:15:33 PM] [SUCCESS] [\ud83d\ude80] Termix backend started successfully [op:backend_init_complete,duration:6972ms]",
"[2:18:33 PM] [INFO] [\ud83e\udde9] Sent daily usage statistics [op:plugin:telemetry]"
],
"observables_after": {
"pinned_images": {
"termix": "ghcr.io/lukegus/termix:2.8.0"
},
"installed_images": {
"termix": "ghcr.io/lukegus/termix:2.8.0"
},
"catalog_images": {
"termix": "ghcr.io/lukegus/termix:2.9.2"
},
"live_compose_image_lines": [
"image: ghcr.io/lukegus/termix:2.8.0@sha256:25e8a0eb39f45c9ac5e8e7615fd84a0380018ea012317bc665b86458d900b4b9"
],
"docker_inspect": [
"termix ghcr.io/lukegus/termix:2.8.0@sha256:25e8a0eb39f45c9ac5e8e7615fd84a0380018ea012317bc665b86458d900b4b9 running=true restarts=0"
]
},
"running_images_after": {
"termix": "ghcr.io/lukegus/termix:2.8.0@sha256:25e8a0eb39f45c9ac5e8e7615fd84a0380018ea012317bc665b86458d900b4b9"
},
"seed_after_undo": true,
"verdict": "proven",
"why": "TO started on the data and failed its check; the box undid it: FROM runs again and the seed reads back",
"drill_head_after": "465e608822e17b14ec45beab71266ee1524ab005",
"drill_tree_equal_to_before": true,
"log": [
"14:13:34 [5] the box's drill mirror now at 718be0f30",
"14:13:38 [1] deploy -> 202 {'ok': True, 'message': 'Telep\u00edt\u00e9s elind\u00edtva \u2013 az \u00e1llapot a k\u00e1rty\u00e1n k\u00f6vethet\u0151'}",
"14:14:19 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:2.8.0'}",
"14:14:19 gate: termix is gated \u2014 passed as the household (cookie set)",
"14:14:19 termix: seeded user drill86061530 via /users/create",
"14:14:19 termix: readback found=True (http 200, control refused as it must)",
"14:14:20 drill commit 39f59c8d713e: termix TO with failing checks",
"14:14:28 [5] the box's drill mirror now at 39f59c8d7",
"14:14:33 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Friss\u00edt\u00e9s elindult \u2013 az \u00e1llapot a k\u00e1rty\u00e1n k\u00f6vethet\u0151'}",
"14:14:33 + 0.0s phase=checking label=Ellen\u0151rz\u00e9s\u2026 err=None hold=None",
"14:14:34 + 1.0s phase=backing-up label=Biztons\u00e1gi ment\u00e9s k\u00e9sz\u00fcl a friss\u00edt\u00e9s el\u0151tt\u2026 err=None hold=None",
"14:14:37 + 4.1s phase=safety-dump label=Adatb\u00e1zis pillanatk\u00e9p\u2026 err=None hold=None",
"14:14:38 + 5.2s phase=pulling label=\u00daj verzi\u00f3 let\u00f6lt\u00e9se\u2026 err=None hold=None",
"14:15:04 + 30.8s phase=copying label=Az adatok m\u00e1sol\u00e1sa a friss\u00edt\u00e9s el\u0151tt\u2026 err=None hold=None",
"14:15:10 + 36.9s phase=verifying label=M\u0171k\u00f6d\u00e9s ellen\u0151rz\u00e9se\u2026 err=None hold=None",
"14:20:13 + 340.1s phase=undoing label=Vissza\u00e1ll\u00edt\u00e1s az el\u0151z\u0151 v\u00e1ltozatra\u2026 err=None hold=None",
"14:20:20 + 347.3s phase=undone label=Vissza\u00e1ll\u00edtva az el\u0151z\u0151 v\u00e1ltozatra err=None hold=None",
"14:20:50 termix: readback found=True (http 200, control refused as it must)",
"14:20:50 RESULT proven \u2014 TO started on the data and failed its check; the box undid it: FROM runs again and the seed reads back",
"14:20:50 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}",
"14:21:22 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm",
"14:21:31 [X] after remove: deployed=False leftovers=''",
"14:21:41 [5] the box's drill mirror now at 465e60882",
"14:21:41 drill revert 39f59c8d713e: rc=0",
"14:21:41 drill templates/termix equal to before: True"
]
}
@@ -0,0 +1,13 @@
14:22:11 [5] the box's drill mirror now at 465e60882
14:22:16 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
14:23:01 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:2.8.0'}
14:23:01 gate: termix is gated — passed as the household (cookie set)
14:23:01 termix: seeded user drill974d3df9 via /users/create
seed: True
{"label": "2.8.0", "image": "ghcr.io/lukegus/termix:2.8.0@sha256:25e8a0eb39f45c9ac5e8e7615fd84a0380018ea012317bc665b86458d900b4b9", "lan_codes": ["401", "401", "401", "401", "401", "429", "429"], "tunnel_codes": ["404", "404", "404", "404", "404", "404", "404"], "lan_fixed": true, "tunnel_fixed": false}
14:23:20 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:23:52 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:24:00 [X] after remove: deployed=False leftovers=''
14:23:20 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:23:52 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:24:00 [X] after remove: deployed=False leftovers=''
@@ -0,0 +1,13 @@
14:25:21 [5] the box's drill mirror now at 465e60882
14:25:25 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
14:26:10 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:2.8.0'}
14:26:10 gate: termix is gated — passed as the household (cookie set)
14:26:11 termix: seeded user drill08407c55 via /users/create
seed: True
{"label": "2.8.0", "image": "ghcr.io/lukegus/termix:2.8.0@sha256:25e8a0eb39f45c9ac5e8e7615fd84a0380018ea012317bc665b86458d900b4b9", "lan_codes": ["401", "401", "401", "401", "401", "429", "429"], "tunnel_codes": ["401", "401", "401", "401", "401", "401", "401"], "lan_fixed": true, "tunnel_fixed": false}
14:26:18 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:26:50 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:26:58 [X] after remove: deployed=False leftovers=''
14:26:18 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:26:50 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:26:58 [X] after remove: deployed=False leftovers=''
@@ -0,0 +1,16 @@
14:40:46 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:41:17 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': [], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalmazás nem tárolt sajá
14:41:26 [X] after remove: deployed=False leftovers=''
14:41:36 [5] the box's drill mirror now at 69b61c69d
14:41:40 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
14:42:31 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:26.10.5'}
14:42:31 gate: termix is gated — passed as the household (cookie set)
14:42:31 termix: seeded user drill6906ad90 via /users/create
seed: True
{"label": "26.10.5", "image": "ghcr.io/lukegus/termix:26.10.5", "lan_codes": ["401", "401", "401", "401", "401", "429", "429"], "tunnel_codes": ["401", "401", "401", "401", "401", "401", "401"], "lan_fixed": true, "tunnel_fixed": false}
14:42:39 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:43:11 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:43:20 [X] after remove: deployed=False leftovers=''
14:42:39 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:43:11 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:43:20 [X] after remove: deployed=False leftovers=''
@@ -0,0 +1,24 @@
{
"label": "2.8.0",
"image": "ghcr.io/lukegus/termix:2.8.0@sha256:25e8a0eb39f45c9ac5e8e7615fd84a0380018ea012317bc665b86458d900b4b9",
"lan_codes": [
"401",
"401",
"401",
"401",
"401",
"429",
"429"
],
"tunnel_codes": [
"401",
"401",
"401",
"401",
"401",
"401",
"401"
],
"lan_fixed": true,
"tunnel_fixed": false
}
@@ -0,0 +1,24 @@
{
"label": "26.10.5",
"image": "ghcr.io/lukegus/termix:26.10.5",
"lan_codes": [
"401",
"401",
"401",
"401",
"401",
"429",
"429"
],
"tunnel_codes": [
"401",
"401",
"401",
"401",
"401",
"401",
"401"
],
"lan_fixed": true,
"tunnel_fixed": false
}
@@ -0,0 +1,13 @@
14:45:56 [5] the box's drill mirror now at 6e9a885d5
14:46:00 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
14:47:01 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:2.9.2'}
14:47:01 gate: termix is gated — passed as the household (cookie set)
14:47:01 termix: seeded user drill7fb9a190 via /users/create
seed: True
{"label": "2.9.2", "image": "ghcr.io/lukegus/termix:2.9.2", "lan_codes": ["401", "401", "401", "401", "401", "429", "429"], "tunnel_codes": ["502", "404", "404", "404", "404", "404", "404"], "lan_fixed": true, "tunnel_fixed": false}
14:47:20 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:47:52 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:48:00 [X] after remove: deployed=False leftovers=''
14:47:20 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:47:52 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:48:00 [X] after remove: deployed=False leftovers=''
@@ -0,0 +1,24 @@
{
"label": "2.9.2",
"image": "ghcr.io/lukegus/termix:2.9.2",
"lan_codes": [
"401",
"401",
"401",
"401",
"401",
"429",
"429"
],
"tunnel_codes": [
"502",
"404",
"404",
"404",
"404",
"404",
"404"
],
"lan_fixed": true,
"tunnel_fixed": false
}
@@ -0,0 +1,24 @@
{
"label": "2.8.0",
"image": "ghcr.io/lukegus/termix:2.8.0@sha256:25e8a0eb39f45c9ac5e8e7615fd84a0380018ea012317bc665b86458d900b4b9",
"lan_codes": [
"401",
"401",
"401",
"401",
"401",
"429",
"429"
],
"tunnel_codes": [
"404",
"404",
"404",
"404",
"404",
"404",
"404"
],
"lan_fixed": true,
"tunnel_fixed": false
}
@@ -0,0 +1,14 @@
14:51:48 [5] the box's drill mirror now at e79107cb1
14:51:53 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
14:52:38 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:2.8.0'}
14:52:38 gate: termix is gated — passed as the household (cookie set)
14:52:38 termix: seeded user drill6867516f via /users/create
seed: True
health before the test: healthy 0
{"label": "2.8.0", "image": "ghcr.io/lukegus/termix:2.8.0@sha256:25e8a0eb39f45c9ac5e8e7615fd84a0380018ea012317bc665b86458d900b4b9", "lan_codes": ["401", "401", "401", "401", "401", "429", "429"], "tunnel_codes": ["401", "401", "401", "401", "401", "429", "429"], "lan_fixed": true, "tunnel_fixed": true}
14:53:52 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:54:24 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:54:33 [X] after remove: deployed=False leftovers=''
14:53:52 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:54:24 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:54:33 [X] after remove: deployed=False leftovers=''
@@ -0,0 +1,14 @@
14:48:23 [5] the box's drill mirror now at 6e9a885d5
14:48:28 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
14:49:28 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:2.9.2'}
14:49:28 gate: termix is gated — passed as the household (cookie set)
14:49:28 termix: seeded user drilld73d1a05 via /users/create
seed: True
health before the test: healthy 0
{"label": "2.9.2", "image": "ghcr.io/lukegus/termix:2.9.2", "lan_codes": ["401", "401", "401", "401", "401", "429", "429"], "tunnel_codes": ["401", "401", "401", "401", "401", "429", "429"], "lan_fixed": true, "tunnel_fixed": true}
14:50:43 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:51:15 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:51:24 [X] after remove: deployed=False leftovers=''
14:50:43 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:51:15 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:51:24 [X] after remove: deployed=False leftovers=''
@@ -0,0 +1,13 @@
14:43:49 [5] the box's drill mirror now at 69b61c69d
14:43:54 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
14:44:49 [1] deployed, controller state=running, pinned={'termix': 'ghcr.io/lukegus/termix:26.10.5'}
14:44:49 gate: termix is gated — passed as the household (cookie set)
14:44:49 termix: seeded user drill3b783abf via /users/create
seed: True
{"label": "26.10.5", "image": "ghcr.io/lukegus/termix:26.10.5", "lan_codes": ["401", "401", "401", "401", "401", "429", "429"], "tunnel_codes": ["401", "401", "401", "401", "401", "429", "429"], "lan_fixed": true, "tunnel_fixed": true}
14:44:57 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:45:29 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:45:38 [X] after remove: deployed=False leftovers=''
14:44:57 [X] stop -> 200 {'ok': True, 'message': 'Stack termix stop completed'}
14:45:29 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'termix', 'volumes_removed': ['termix_termix_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
14:45:38 [X] after remove: deployed=False leftovers=''
@@ -0,0 +1,24 @@
{
"label": "2.8.0",
"image": "ghcr.io/lukegus/termix:2.8.0@sha256:25e8a0eb39f45c9ac5e8e7615fd84a0380018ea012317bc665b86458d900b4b9",
"lan_codes": [
"401",
"401",
"401",
"401",
"401",
"429",
"429"
],
"tunnel_codes": [
"401",
"401",
"401",
"401",
"401",
"429",
"429"
],
"lan_fixed": true,
"tunnel_fixed": true
}
@@ -0,0 +1,24 @@
{
"label": "2.9.2",
"image": "ghcr.io/lukegus/termix:2.9.2",
"lan_codes": [
"401",
"401",
"401",
"401",
"401",
"429",
"429"
],
"tunnel_codes": [
"401",
"401",
"401",
"401",
"401",
"429",
"429"
],
"lan_fixed": true,
"tunnel_fixed": true
}
@@ -0,0 +1,24 @@
{
"label": "26.10.5",
"image": "ghcr.io/lukegus/termix:26.10.5",
"lan_codes": [
"401",
"401",
"401",
"401",
"401",
"429",
"429"
],
"tunnel_codes": [
"401",
"401",
"401",
"401",
"401",
"429",
"429"
],
"lan_fixed": true,
"tunnel_fixed": true
}
@@ -0,0 +1,40 @@
#!/usr/bin/env python3
"""termix_xff.py LABEL — D58 / GHSA-7j7m on the Termix installed on scratch 9202: does a forged X-Forwarded-For let one
address skip the login limit? 7 wrong logins, 7 different usernames, 7 different forged X-Forwarded-For values:
LAN: from DooPlex straight to 9202's traefik (the household's LAN path; traefik does NOT trust this peer);
TUNNEL: from a throwaway curl container on 9202's felhom-tunnel network at 172.16.253.2 — the address cloudflared has on
a real box, the ONE peer whose forwarded headers traefik keeps (the internet path). The header is what Cloudflare
delivers: the visitor's forged value, then the real visitor address Cloudflare APPENDS (one constant, 203.0.113.99).
Fixed = an HTTP 429 by the 6th attempt (the per-address limit, MAX_ATTEMPTS 5). Not fixed = no 429 in 7.
usage: SC=<dir with .ctlpw> TARGET=9202 python3 termix_xff.py LABEL (prints, and writes xff-LABEL.json in EV)"""
import json, os, secrets, sys
sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts")
import box_walk as w
label, EV = sys.argv[1], os.environ["EV"]
os.makedirs(EV, exist_ok=True)
sub = "termix"
w.login()
res = {"label": label, "image": w.guest("docker inspect -f '{{.Config.Image}}' termix").strip()}
lan = []
for i in range(7):
rc, code, out = w.app_curl(sub, "/users/login", "-H", "Content-Type: application/json",
"-H", f"X-Forwarded-For: 203.0.113.{10 + i}",
data=json.dumps({"username": "nobody" + secrets.token_hex(3), "password": "wrong-" + secrets.token_hex(4)}),
method="POST")
lan.append(code)
res["lan_codes"] = lan
host = f"{sub}.{w.DOMAIN}"
gc = w.GATE.get(sub) or w.gate_cookie(sub) or "" # the household's gate cookie, as the LAN half sends it; never printed
lines = ["for x in 11 12 13 14 15 16 17; do",
" curl -sk -o /dev/null -w '%{http_code} ' --resolve " + host + ":443:172.16.253.3 \\",
" -H \"X-Forwarded-For: 198.51.100.$x, 203.0.113.99\" -H 'Content-Type: application/json' -H \"Cookie: $GC\" \\",
" --data \"{\\\"username\\\":\\\"tun$x$$\\\",\\\"password\\\":\\\"wrong-pass-$x\\\"}\" https://" + host + "/users/login",
"done"]
script = ("cat > /tmp/xff.sh <<'XEOF'\n" + "\n".join(lines) + "\nXEOF\n"
"docker run --rm --network felhom-tunnel --ip 172.16.253.2 -e GC -v /tmp/xff.sh:/xff.sh:ro curlimages/curl:8.11.1 sh /xff.sh; rm -f /tmp/xff.sh")
out = w.guest("export GC=" + json.dumps(gc) + "\n" + script, timeout=300)
res["tunnel_codes"] = out.split()
res["lan_fixed"] = "429" in lan[:6]
res["tunnel_fixed"] = "429" in res["tunnel_codes"][:6]
print(json.dumps(res))
json.dump(res, open(os.path.join(EV, f"xff-{label}.json"), "w"), indent=1)
@@ -0,0 +1,31 @@
#!/usr/bin/env python3
"""termix_xff_install.py LABEL — install Termix from the drill on 9202 through the product, make the first account (the
fixture's own sign-up: it lifts the setup gate), run termix_xff.py LABEL, remove the app through the product."""
import os, runpy, sys
sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts")
import box_walk as w
import upgrade_fixtures_box28 as f28
w.login()
try:
if w.stack("termix").get("deployed"):
w.remove("termix")
w.refresh_box_mirror(); w.sync_rescan()
if not w.deploy("termix", "termix"):
print("install failed"); sys.exit(1)
t = f28.FIXTURES28["termix"].seed(w, "termix", w.say)
print("seed:", bool(t))
# 2.9.2 dropped its route for a while right after the first install (502, then 404 — 2026-10-28): wait until the
# container is healthy and stays so for 60 s before the test
import time
for _ in range(40):
if w.guest("docker inspect -f '{{.State.Health.Status}}' termix").strip() == "healthy":
break
time.sleep(10)
time.sleep(60)
print("health before the test:", w.guest("docker inspect -f '{{.State.Health.Status}} {{.RestartCount}}' termix").strip())
sys.argv = ["termix_xff.py", sys.argv[1]]
runpy.run_path(os.path.join(os.path.dirname(os.path.abspath(__file__)), "termix_xff.py"), run_name="__main__")
finally:
if w.stack("termix").get("deployed"):
w.remove("termix")
print("\n".join(w.LOG[-3:]))
@@ -0,0 +1,132 @@
#!/usr/bin/env python3
"""undo_proof2.py APP MAIN_SVC FROM(svc=ref,…) TO(svc=ref,…) — a big step's UNDO, proven on scratch 9202 through the product's
own guarded Update (generalised from audits/security-app-updates-2026-10-27/part3/tools/undo_proof.py, Jellyfin):
1. the drill's APP must stand at FROM (this tool checks, never guesses); install, seed with the box fixture, read back (C1);
2. a temporary drill commit moves the images to TO AND makes the checks fail (MAIN_SVC's compose healthcheck `false`,
the .felhom.yml probe on a path that does not exist) — so TO starts on the data, runs its migrations, and the
Update fails in its check;
3. press the guarded Update: the final phase must be `undone`; MAIN_SVC's log is saved while TO verifies;
4. after the undo: the running images are FROM and the seed reads back;
5. the temporary drill commit is reverted (the template equal to before), the app removed.
usage: SC=<dir with .ctlpw> TARGET=9202 EV=<dir> python3 undo_proof2.py APP MAIN_SVC FROM TO [DEFINITION_DIR]"""
import json, os, re, subprocess, sys, threading, time
sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts")
import box_walk as w
import upgrade_fixtures_box as fb
import upgrade_fixtures_box28 as f28
APP, MAIN = sys.argv[1], sys.argv[2]
FROM = dict(x.split("=", 1) for x in sys.argv[3].split(","))
TO = dict(x.split("=", 1) for x in sys.argv[4].split(","))
DEF = sys.argv[5] if len(sys.argv) > 5 else None # a definition step: TO is that whole definition (box_walk --to-definition)
FX = dict(f28.FIXTURES28); FX.update(fb.FIXTURES)
fx = FX[APP]
SUB = getattr(fx, "sub", APP)
D = w.DRILL
EV = os.environ["EV"]
os.makedirs(EV, exist_ok=True)
OUT = os.path.join(EV, "undo-proof-%s.json" % APP)
rec = {"app": APP, "from": FROM, "to": TO, "started": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())}
def git(*a):
return subprocess.run(["git", "-C", D] + list(a), capture_output=True, text=True, timeout=120)
def finish(verdict, why):
rec["verdict"], rec["why"] = verdict, why
w.say(f"RESULT {verdict} — {why}")
def failing_to(c, y):
if DEF:
c = open(os.path.join(DEF, "docker-compose.yml")).read()
y = open(os.path.join(DEF, ".felhom.yml")).read()
assert w.images_of(c) == TO, (w.images_of(c), TO)
for svc in ({} if DEF else FROM):
if FROM[svc] != TO[svc]:
assert f"image: {FROM[svc]}" in c, svc
c = c.replace(f"image: {FROM[svc]}", f"image: {TO[svc]}")
# MAIN's own block only (never past the next service), comment lines allowed between healthcheck: and test:
m = re.search(r"(?m)^ %s:\n(?:(?! \S)[^\n]*\n)*? healthcheck:\n(?:\s*#[^\n]*\n)*(\s+)test: [^\n]*\n" % re.escape(MAIN), c)
if m:
c = c[:m.start()] + m.group(0).replace(m.group(0).split("\n")[-2], m.group(1) + 'test: ["CMD", "false"]') + c[m.end():]
else: # no test line of our own (the image's own): add a failing healthcheck under the service
c = re.sub(r"(?m)^( %s:\n)" % re.escape(MAIN), r'\1 healthcheck:\n test: ["CMD", "false"]\n', c, count=1)
# port 1: nothing listens there, so the probe fails on ANY app — an app that answers 200 on every path (a single-page
# app: Termix, 2026-10-28) passed a „no such path" probe and the update ended `done`
y2 = re.sub(r"(?m)^(healthcheck:\n checks:\n - type: )\w+(\n port: )\d+\n(?: path: [^\n]*\n)?(?: expect:\n status: \d+\n)?",
r'\1api\g<2>1\n path: "/undo-proof-no-such-path"\n expect:\n status: 200\n', y, count=1)
return c, y2
w.login()
git("pull", "-q", "--rebase", "origin", "main")
head0 = git("rev-parse", "HEAD").stdout.strip()
rec["drill_head_before"] = head0
comp, fy = f"{D}/templates/{APP}/docker-compose.yml", f"{D}/templates/{APP}/.felhom.yml"
commit = None
try:
if w.images_of(open(comp).read()) != FROM:
finish("inconclusive", f"the drill's {APP} is not at FROM"); raise SystemExit(1)
if w.stack(APP).get("deployed"):
w.remove(APP)
w.refresh_box_mirror()
w.sync_rescan()
if not w.deploy(APP, SUB):
finish("inconclusive", "the install at FROM did not complete"); raise SystemExit(1)
tok = fx.seed(w, SUB, w.say)
if not tok or not fx.verify(w, SUB, tok, w.say):
finish("inconclusive", "C1: the seed did not read back before the update"); raise SystemExit(1)
c, y = failing_to(open(comp).read(), open(fy).read())
rec["failing_compose_main_healthcheck"] = re.findall(r'test: \["CMD", "false"\]', c)
rec["failing_probe"] = "/undo-proof-no-such-path" in y
open(comp, "w").write(c); open(fy, "w").write(y)
git("add", f"templates/{APP}")
git("commit", "-q", "-m", f"UNDO-PROOF: {APP} at TO whose checks fail (temporary, reverted at the end)")
git("push", "-q", "origin", "main")
commit = git("rev-parse", "--short=12", "HEAD").stdout.strip()
w.say(f" drill commit {commit}: {APP} TO with failing checks")
w.refresh_box_mirror()
main_to = TO[MAIN]
w.sync_rescan(APP, main_to, tries=40, delay=10)
seen = {"lines": []}
stop = threading.Event()
def watch():
while not stop.is_set():
out = w.guest(f"docker inspect -f '{{{{.Config.Image}}}}' {MAIN} 2>/dev/null; docker logs --tail 300 {MAIN} 2>&1 | tail -40")
if main_to.split(":")[-1] in out.split("\n")[0]:
seen["lines"] = out.strip().split("\n")
time.sleep(5)
th = threading.Thread(target=watch, daemon=True)
th.start()
rec["update"] = u = w.press_update(APP, poll=1.0, cap_s=1800)
stop.set(); th.join(timeout=30)
rec["to_log_while_verifying"] = seen["lines"][-40:]
time.sleep(15)
rec["observables_after"] = w.observables(APP)
running = {s: w.guest(f"docker inspect -f '{{{{.Config.Image}}}}' {s} 2>/dev/null").strip() for s in FROM}
rec["running_images_after"] = running
if u.get("final_phase") != "undone":
finish("failed", f"the update ended {u.get('final_phase')!r}, not 'undone'"); raise SystemExit(1)
if any(running[s].split("@")[0] != FROM[s] for s in FROM):
finish("failed", f"after the undo the running images are {running}, not FROM"); raise SystemExit(1)
rec["seed_after_undo"] = ok = fx.verify(w, SUB, tok, w.say)
if not ok:
finish("failed", "the undo put the old images back but the seed does not read back"); raise SystemExit(1)
finish("proven", "TO started on the data and failed its check; the box undid it: FROM runs again and the seed reads back")
finally:
if w.stack(APP).get("deployed"):
w.remove(APP)
if commit:
git("pull", "-q", "--rebase", "origin", "main")
r = git("revert", "--no-edit", commit)
git("push", "-q", "origin", "main")
w.refresh_box_mirror()
w.say(f" drill revert {commit}: rc={r.returncode}")
rec["drill_head_after"] = git("rev-parse", "HEAD").stdout.strip()
rec["drill_tree_equal_to_before"] = git("diff", "--quiet", head0, "HEAD", "--", f"templates/{APP}").returncode == 0
w.say(f" drill templates/{APP} equal to before: {rec['drill_tree_equal_to_before']}")
rec["log"] = w.LOG
json.dump(rec, open(OUT, "w"), indent=2)
@@ -0,0 +1,145 @@
[12:02:54] scratch drive folders cleared before FROM (R-656): none existed
[12:02:54] MV-wanderer: deploying wanderer at FROM {'wanderer': 'flomp/wanderer-web:v0.20.0', 'wanderer-db': 'flomp/wanderer-db:v0.20.0', 'wanderer-search': 'getmeili/meilisearch:v1.36.0'}
[12:03:57] FROM settled=True in 31.2s :: {"wanderer": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "wanderer-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "wanderer-search": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[12:03:57] fixture: the BOX walk's own (Wanderer), through upgrade_boxport
[12:03:58] wanderer: sign-up http=200
[12:03:58] wanderer: seeded user drill5229bfc6 and private list Drill-0943754405 http=200 id=True
[12:03:58] wanderer: sign-in ok (wrong password refused: http 400); the private list read back http=200 ok=True
[12:03:58] C1 (seed reads back BEFORE): True
[12:03:59] MV-wanderer: swapping to TO {'wanderer': 'flomp/wanderer-web:v0.21.2', 'wanderer-db': 'flomp/wanderer-db:v0.21.2', 'wanderer-search': 'getmeili/meilisearch:v1.36.0'}
[12:04:47] TO up -d rc=0
[12:05:24] TO settled=True in 36.4s :: {"wanderer": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "wanderer-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "wanderer-search": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[12:05:24] migration lines observed: 0
[12:05:24] wanderer: sign-in ok (wrong password refused: http 400); the private list read back http=200 ok=True
[12:05:24] RESULT (seed reads back AFTER): True
[12:05:25] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:3000
[12:05:40] + 15s wanderer=136M/512M peak=141M kills=0 rs=0 wanderer-db=20M/256M peak=22M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=244
[12:05:55] + 30s wanderer=137M/512M peak=143M kills=0 rs=0 wanderer-db=24M/256M peak=24M kills=0 rs=0 wanderer-search=250M/256M peak=256M kills=0 rs=0 reqs=501
[12:06:11] + 46s wanderer=139M/512M peak=146M kills=0 rs=0 wanderer-db=27M/256M peak=27M kills=0 rs=0 wanderer-search=250M/256M peak=256M kills=0 rs=0 reqs=749
[12:06:26] + 61s wanderer=140M/512M peak=146M kills=0 rs=0 wanderer-db=31M/256M peak=34M kills=0 rs=0 wanderer-search=250M/256M peak=256M kills=0 rs=0 reqs=988
[12:06:41] + 76s wanderer=139M/512M peak=146M kills=0 rs=0 wanderer-db=32M/256M peak=34M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=1237
[12:06:56] + 91s wanderer=139M/512M peak=146M kills=0 rs=0 wanderer-db=33M/256M peak=35M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=1482
[12:07:11] + 106s wanderer=141M/512M peak=150M kills=0 rs=0 wanderer-db=37M/256M peak=37M kills=0 rs=0 wanderer-search=252M/256M peak=256M kills=0 rs=0 reqs=1735
[12:07:26] + 121s wanderer=138M/512M peak=150M kills=0 rs=0 wanderer-db=37M/256M peak=39M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=1977
[12:07:42] + 137s wanderer=140M/512M peak=150M kills=0 rs=0 wanderer-db=40M/256M peak=41M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=2231
[12:07:57] + 152s wanderer=139M/512M peak=154M kills=0 rs=0 wanderer-db=40M/256M peak=42M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=2465
[12:08:12] + 167s wanderer=141M/512M peak=154M kills=0 rs=0 wanderer-db=43M/256M peak=46M kills=0 rs=0 wanderer-search=252M/256M peak=256M kills=0 rs=0 reqs=2713
[12:08:27] + 182s wanderer=141M/512M peak=154M kills=0 rs=0 wanderer-db=43M/256M peak=46M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=2949
[12:08:42] + 197s wanderer=141M/512M peak=154M kills=0 rs=0 wanderer-db=45M/256M peak=46M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=3192
[12:08:58] + 212s wanderer=139M/512M peak=154M kills=0 rs=0 wanderer-db=47M/256M peak=47M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=3444
[12:09:13] + 228s wanderer=142M/512M peak=154M kills=0 rs=0 wanderer-db=48M/256M peak=49M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=3703
[12:09:28] + 243s wanderer=143M/512M peak=154M kills=0 rs=0 wanderer-db=50M/256M peak=51M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=3949
[12:09:43] + 258s wanderer=143M/512M peak=154M kills=0 rs=0 wanderer-db=52M/256M peak=53M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=4192
[12:09:58] + 273s wanderer=143M/512M peak=154M kills=0 rs=0 wanderer-db=53M/256M peak=54M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=4435
[12:10:13] + 288s wanderer=142M/512M peak=154M kills=0 rs=0 wanderer-db=54M/256M peak=55M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=4675
[12:10:29] + 304s wanderer=141M/512M peak=154M kills=0 rs=0 wanderer-db=56M/256M peak=57M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=4910
[12:10:44] + 319s wanderer=142M/512M peak=154M kills=0 rs=0 wanderer-db=57M/256M peak=59M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=5159
[12:10:59] + 334s wanderer=142M/512M peak=154M kills=0 rs=0 wanderer-db=59M/256M peak=60M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=5395
[12:11:14] + 349s wanderer=140M/512M peak=154M kills=0 rs=0 wanderer-db=60M/256M peak=62M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=5631
[12:11:29] + 364s wanderer=143M/512M peak=154M kills=0 rs=0 wanderer-db=61M/256M peak=63M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=5868
[12:11:45] + 380s wanderer=142M/512M peak=154M kills=0 rs=0 wanderer-db=63M/256M peak=64M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=6107
[12:12:00] + 395s wanderer=142M/512M peak=154M kills=0 rs=0 wanderer-db=65M/256M peak=66M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=6348
[12:12:15] + 410s wanderer=139M/512M peak=154M kills=0 rs=0 wanderer-db=67M/256M peak=67M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=6604
[12:12:30] + 425s wanderer=142M/512M peak=154M kills=0 rs=0 wanderer-db=68M/256M peak=69M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=6837
[12:12:45] + 440s wanderer=143M/512M peak=154M kills=0 rs=0 wanderer-db=69M/256M peak=71M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=7091
[12:13:01] + 456s wanderer=141M/512M peak=154M kills=0 rs=0 wanderer-db=71M/256M peak=72M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=7351
[12:13:16] + 471s wanderer=142M/512M peak=154M kills=0 rs=0 wanderer-db=73M/256M peak=73M kills=0 rs=0 wanderer-search=252M/256M peak=256M kills=0 rs=0 reqs=7602
[12:13:31] + 486s wanderer=142M/512M peak=154M kills=0 rs=0 wanderer-db=74M/256M peak=75M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=7852
[12:13:46] + 501s wanderer=144M/512M peak=154M kills=0 rs=0 wanderer-db=76M/256M peak=76M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=8107
[12:14:01] + 516s wanderer=141M/512M peak=154M kills=0 rs=0 wanderer-db=77M/256M peak=79M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=8340
[12:14:16] + 531s wanderer=141M/512M peak=154M kills=0 rs=0 wanderer-db=78M/256M peak=79M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=8582
[12:14:32] + 547s wanderer=141M/512M peak=154M kills=0 rs=0 wanderer-db=80M/256M peak=81M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=8820
[12:14:47] + 562s wanderer=143M/512M peak=154M kills=0 rs=0 wanderer-db=81M/256M peak=83M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=9057
[12:15:02] + 577s wanderer=142M/512M peak=154M kills=0 rs=0 wanderer-db=83M/256M peak=84M kills=0 rs=0 wanderer-search=252M/256M peak=256M kills=0 rs=0 reqs=9295
[12:15:17] + 592s wanderer=141M/512M peak=154M kills=0 rs=0 wanderer-db=84M/256M peak=86M kills=0 rs=0 wanderer-search=251M/256M peak=256M kills=0 rs=0 reqs=9538
[12:15:32] + 607s wanderer=140M/512M peak=154M kills=0 rs=0 wanderer-db=86M/256M peak=87M kills=0 rs=0 wanderer-search=252M/256M peak=256M kills=0 rs=0 reqs=9780
[12:15:33] memory watch: killed=False tight=['wanderer-search'] requests=9781 codes={'200': 9781}
[12:15:33] MV-wanderer: ABORT — putting the FROM images back
[12:16:22] wanderer: sign-in ok (wrong password refused: http 400); the private list read back http=200 ok=True
[12:16:22] ABORT: app came back in 31.3s; data present=True
{
"harness_version": 5,
"edge": "MV-wanderer",
"app": "wanderer",
"note": "night 2026-09-23 within-a-major move: wanderer=flomp/wanderer-web:v0.21.2, wanderer-db=flomp/wanderer-db:v0.21.2",
"from": {
"wanderer": "flomp/wanderer-web:v0.20.0",
"wanderer-db": "flomp/wanderer-db:v0.20.0",
"wanderer-search": "getmeili/meilisearch:v1.36.0"
},
"to": {
"wanderer": "flomp/wanderer-web:v0.21.2",
"wanderer-db": "flomp/wanderer-db:v0.21.2",
"wanderer-search": "getmeili/meilisearch:v1.36.0"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": null,
"abort": "starts-and-serves",
"abort_detail": null,
"engine_state_after": null,
"memory": {
"soak_s": 607.8,
"requested_s": 600,
"requests": 9781,
"codes": {
"200": 9781
},
"first_kill": null,
"containers": {
"wanderer": {
"limit": 536870912,
"peak": 161669120,
"peak_pct": 0.301,
"anon_peak_sampled": 140189696,
"anon_peak_pct": 0.261,
"swap_peak": 0,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"wanderer-db": {
"limit": 268435456,
"peak": 91942912,
"peak_pct": 0.343,
"anon_peak_sampled": 57614336,
"anon_peak_pct": 0.215,
"swap_peak": 0,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"wanderer-search": {
"limit": 268435456,
"peak": 268439552,
"peak_pct": 1.0,
"anon_peak_sampled": 257552384,
"anon_peak_pct": 0.959,
"swap_peak": 0,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"venue_swap_bytes": 0,
"load": "reached"
},
"marks": [
"memory_tight"
],
"bench_overrides": null,
"duration_s": 36.4,
"measured_at": "2026-10-28T12:16:22Z",
"evidence": "evidence/MV-wanderer",
"scratch_cleared": [],
"files_changed": [],
"files_changed_detail": [],
"files_ignored": [],
"total_s": 808.3
}
Loaded 100 of 141 files, more files were not shown because too many files have changed in this diff. Show more