docs: rulings 7 and 8 shipped and proven live (R-470/R-472/R-475 CLOSED); R-477..R-480 opened
gates / gates (push) Successful in 21s

Hub v0.112.0 serves a floor above the golden with a declared MinAgent;
controller v0.239.0 reached both demo boxes by that floor in 14 s and 15 s
and updates on any backup tier. 09 §3 decisions 7 and 8, §6/§6.1; 07 §6
line; capability map row; STATUS items 15/16 done and the cadence line
corrected; CONTEXT; register: R-470/R-472/R-475 compressed to CLOSED-ITEMS
(full text at 2f5d3af), R-477..R-480 opened, R-474 reproduced a third
time. OPEN-ITEMS 431689 -> 432156 bytes, CLOSED-ITEMS 118051 -> 120598.
Evidence: documentation/audits/rulings-r472-r475-2026-09-13/.
This commit is contained in:
2026-09-13 17:54:23 +02:00
parent 2f5d3af6f9
commit 681c3d6a6d
25 changed files with 735 additions and 71 deletions
@@ -0,0 +1,45 @@
=== hub 0.112.0 deploy — 2026-09-13T14:50:54Z ===
sync=Synced health=Healthy revision=2f5d3af6f9f48f5508614e1b90c0ec098c881e5f op=Succeeded
image=gitea.dooplex.hu/admin/felhom-hub:0.112.0
hub-687c88ccf8-lc54n 1/1 Running 0 88s 10.42.0.53 dooplex <none> <none>
--- hub log since start ---
2026/09/13 16:49:28 [INFO] felhom-hub 0.112.0 starting
2026/09/13 16:49:28 [INFO] Database opened at /data/hub.db
2026/09/13 16:49:28 [INFO] Default controller-version floor: 0.120.0
2026/09/13 16:49:28 [INFO] Template fetcher started (every 1h)
2026/09/13 16:49:30 [INFO] Asset seed: all 210 files up-to-date
2026/09/13 16:49:30 [INFO] Asset manifest built: 211 files
2026/09/13 16:49:30 [INFO] App-email relay enabled (limit 30/min/customer, From domains [felhom.eu])
2026/09/13 16:49:30 [INFO] Gitea artifact browser enabled (Day-0 version dropdowns) via http://gitea.gitea-system.svc.cluster.local:3000
2026/09/13 16:49:30 [INFO] Offsite provisioning enabled (pool_box=611714, location=fsn1)
2026/09/13 16:49:30 [INFO] Offsite pool-box checker initialized: box=611714 fill warn=80% crit=90%, oversub warn=2.00x, unreachable after 3 consecutive failed reads, refresh 15m0s
2026/09/13 16:49:30 [INFO] Registry version checker started (every 6h)
2026/09/13 16:49:30 [INFO] WG peer-sync enabled (endpoint 167.233.158.164:22, user felhom-peersync)
2026/09/13 16:49:30 [INFO] PBS DR tenantsync enabled (endpoint 167.233.158.164:22, user felhom-peersync; WG-registration auto-provision hook armed)
2026/09/13 16:49:30 [INFO] PBS-DR box checker initialized: fill warn=80% crit=90%, unreachable after 3 consecutive failed reads, refresh 15m0s
2026/09/13 16:49:30 [INFO] agent-plane poke enabled (endpoint 167.233.158.164:22, user felhom-peersync; web + api admin seams armed)
2026/09/13 16:49:30 [INFO] PBS-DR self-heal reconciler started (interval 5m)
2026/09/13 16:49:30 [INFO] offsite credential self-heal reconciler started (interval 5m, debounce 2 reports)
2026/09/13 16:49:43 [INFO] Pruned 59 old report rows
2026/09/13 16:49:44 [INFO] Pruned 21 old event rows
2026/09/13 16:49:45 [INFO] Pruned 763 old app telemetry rows
2026/09/13 16:49:45 [INFO] Pruned 3 stale app issues
2026/09/13 16:49:45 [INFO] prune: next run at 2026-09-14 04:30 CEST (in 11h40m14s)
2026/09/13 16:49:45 [INFO] Staleness checker initialized: 2 ok, 0 stale, 1 down
2026/09/13 16:49:45 [INFO] Host staleness checker initialized: 2 ok, 0 stale, 0 down (stale/down left unseeded → first Check emits)
2026/09/13 16:49:45 [INFO] Host capability checker initialized: 2 ok, 0 degraded (degraded left unseeded → first Check emits)
2026/09/13 16:49:45 [INFO] Host leaf checker initialized: 2 host fingerprint(s) seeded
2026/09/13 16:49:45 [INFO] Host disk checker initialized: warn=90% crit=95%, 2 ok seeded, 0 already-breached left unseeded (first Check emits)
2026/09/13 16:49:45 [INFO] Storage fill checker initialized: warn=90% crit=95%, 5 ok seeded, 0 already-breached left unseeded, 2 root-backed excluded
2026/09/13 16:49:45 [INFO] Host mgmt-plane checker initialized: 0 host heal-state(s) seeded
2026/09/13 16:49:45 [INFO] Host OOB checker initialized: 0 host(s) seeded degraded
2026/09/13 16:49:45 [INFO] Offsite checker initialized: fill warn=90% crit=95%, stale after 48h0m0s, 3 ok-seeded
2026/09/13 16:49:45 [INFO] deadline-check: next run at 2026-09-14 05:00 CEST (in 12h10m14s)
2026/09/13 16:49:45 [INFO] Listening on :8080
2026/09/13 16:50:03 [INFO] DR-recipe app-half stored for customer demo-felhom (v1)
2026/09/13 16:50:03 [INFO] Received report from demo-felhom (3268 bytes)
2026/09/13 16:50:03 [INFO] managed floor SERVED for demo-felhom: floor 0.236.0, agent requirement "0.129.0" from manifest (golden 0.236.0)
2026/09/13 16:50:04 [INFO] DR-recipe app-half stored for customer demo-hp (v1)
2026/09/13 16:50:04 [INFO] Received report from demo-hp (8019 bytes)
2026/09/13 16:50:04 [INFO] managed floor SERVED for demo-hp: floor 0.236.0, agent requirement "0.129.0" from manifest (golden 0.236.0)
2026/09/13 16:50:50 [INFO] Offsite pool-box refreshed: 0.3% full (2.7 GB of 1.00 TB), Σ shared quota 150 GB, oversub 0.15x
@@ -0,0 +1,17 @@
=== baseline — 2026-09-13T15:18:28Z ===
hub image: gitea.dooplex.hu/admin/felhom-hub:0.112.0
DB floor: "0.236.0" declared field: name="min_agent" value=""
demo-hp (ssh hp) 9201: gitea.dooplex.hu/admin/felhom-controller:0.238.1 Up 5 hours (healthy)
demo-felhom (felhom-pve-lan) 9201: gitea.dooplex.hu/admin/felhom-controller:0.238.1 Up 5 hours (healthy)
VMID Status Lock Name
9201 running demo-felhom
=== NEGATIVE CONTROL: floor 0.239.0 WITHOUT min_agent — 2026-09-13T15:18:34Z ===
HTTP/1.1 303 See Other
Location: /configuration?flash=floor_needs_min_agent
DB floor after: "0.236.0" declared field after: name="min_agent" value=""
--- hub log, the refusal ---
2026/09/13 17:18:34 [WARN] floor 0.239.0 refused: it is above the vouched golden 0.236.0 and no MinAgent was declared (R-472)
--- the rendered flash (ASCII fragment + control) ---
1
0
@@ -0,0 +1,54 @@
=== DECLARED FLOOR: 0.239.0 with min_agent 0.129.0 ===
T0 POST at 2026-09-13T15:19:12Z
HTTP/1.1 303 See Other
Location: /configuration?flash=floor_set
DB floor + declared: id="global-floor-input" name="min_controller_version" value="0.239.0" | name="min_agent" value="0.129.0" placeholder="MinAgent from |
demo-hp on 0.239.0 at 2026-09-13T15:19:26Z (+14s): gitea.dooplex.hu/admin/felhom-controller:0.239.0 Up 5 seconds (healthy)
demo-felhom on 0.239.0 at 2026-09-13T15:19:27Z (+15s): gitea.dooplex.hu/admin/felhom-controller:0.239.0 Up 8 seconds (healthy)
--- hub log since T0 (managed floor) ---
2026/09/13 17:19:12 [INFO] Global controller-version floor set to "0.239.0" (declared MinAgent "0.129.0")
2026/09/13 17:19:14 [INFO] managed floor SERVED for demo-felhom: floor 0.239.0, agent requirement "0.129.0" from declared (golden 0.236.0)
2026/09/13 17:19:15 [INFO] managed floor SERVED for demo-hp: floor 0.239.0, agent requirement "0.129.0" from declared (golden 0.236.0)
--- demo-hp: controller log (SetFloor / self-update / version) ---
2026/09/13 15:19:22 updater.go:96: [DEBUG] [selfupdate] VerifyStartup: checking update state in /opt/docker/felhom-controller/data
2026/09/13 15:19:22 updater.go:96: [DEBUG] [selfupdate] VerifyStartup: pending update found — target=0.239.0 previous=0.238.1
2026/09/13 15:19:22 updater.go:809: [INFO] [selfupdate] Post-update startup: update successful (0.238.1 → 0.239.0)
2026/09/13 15:19:22 main.go:655: [INFO] Self-update enabled (check every 6h, auto-update: false, auto-update time: 04:30)
2026/09/13 15:19:22 offsiteapply.go:151: [INFO] [offsite-apply] settle-gate: awaiting floor knowledge (first report ACK) before offsite apply
2026/09/13 15:19:22 scheduler.go:102: [INFO] [scheduler] Registered periodic job: selfupdate-check (every 6h0m0s)
2026/09/13 15:19:22 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="selfupdate-check" interval=6h0m0s totalJobs=18
2026/09/13 15:19:23 client.go:67: [DEBUG] [agentapi] agent version seen: 0.130.0 (was "")
2026/09/13 15:19:27 builder.go:40: [DEBUG] [report] BuildReport: starting — version=0.239.0, storagePaths=1
2026/09/13 15:19:28 updater.go:96: [DEBUG] [selfupdate] SetFloor: floor "" → "0.239.0"
2026/09/13 15:19:28 updater.go:96: [DEBUG] [selfupdate] maybeAutoUpdate: current 0.239.0 >= floor 0.239.0 — no action
2026/09/13 15:19:32 offsiteapply.go:151: [INFO] [offsite-apply] settle-gate: GO — at/above floor 0.239.0 (we are 0.239.0), no managed update running
--- demo-hp: bootstrap service journal ---
Sep 13 15:19:20 demo-hp systemd[1]: felhom-controller-bootstrap.service: Deactivated successfully.
Sep 13 15:19:20 demo-hp systemd[1]: Stopped felhom-controller-bootstrap.service - Felhom controller bootstrap (deploy the baked controller from the agent-populated config mount).
Sep 13 15:19:20 demo-hp systemd[1]: Stopping felhom-controller-bootstrap.service - Felhom controller bootstrap (deploy the baked controller from the agent-populated config mount)...
Sep 13 15:19:20 demo-hp systemd[1]: Starting felhom-controller-bootstrap.service - Felhom controller bootstrap (deploy the baked controller from the agent-populated config mount)...
Sep 13 15:19:21 demo-hp felhom-controller-bootstrap.sh[1829428]: [ctrl-bootstrap] deploying gitea.dooplex.hu/admin/felhom-controller:0.239.0 from /etc/felhom-bootstrap/bootstrap.json (hostname=demo-hp)
Sep 13 15:19:21 demo-hp felhom-controller-bootstrap.sh[1829480]: d27aeecc7f869b5836ee7a6c2c566213df05fce8f0f97a1f6beca99661680e16
Sep 13 15:19:21 demo-hp felhom-controller-bootstrap.sh[1829428]: [ctrl-bootstrap] controller started
Sep 13 15:19:21 demo-hp systemd[1]: Finished felhom-controller-bootstrap.service - Felhom controller bootstrap (deploy the baked controller from the agent-populated config mount).
--- demo-felhom: controller log (SetFloor / self-update / version) ---
2026/09/13 15:19:20 [INFO] [selfupdate] Post-update startup: update successful (0.238.1 → 0.239.0)
2026/09/13 15:19:20 [INFO] Self-update enabled (check every 6h, auto-update: false, auto-update time: 04:30)
2026/09/13 15:19:20 [INFO] [scheduler] Registered periodic job: selfupdate-check (every 6h0m0s)
2026/09/13 15:19:20 [INFO] [offsite-apply] settle-gate: awaiting floor knowledge (first report ACK) before offsite apply
2026/09/13 15:19:30 [INFO] [offsite-apply] settle-gate: GO — at/above floor 0.239.0 (we are 0.239.0), no managed update running
--- demo-felhom: bootstrap service journal ---
Sep 13 15:19:19 demo-felhom systemd[1]: felhom-controller-bootstrap.service: Deactivated successfully.
Sep 13 15:19:19 demo-felhom systemd[1]: Stopped felhom-controller-bootstrap.service - Felhom controller bootstrap (deploy the baked controller from the agent-populated config mount).
Sep 13 15:19:19 demo-felhom systemd[1]: Stopping felhom-controller-bootstrap.service - Felhom controller bootstrap (deploy the baked controller from the agent-populated config mount)...
Sep 13 15:19:19 demo-felhom systemd[1]: Starting felhom-controller-bootstrap.service - Felhom controller bootstrap (deploy the baked controller from the agent-populated config mount)...
Sep 13 15:19:19 demo-felhom felhom-controller-bootstrap.sh[3492140]: [ctrl-bootstrap] deploying gitea.dooplex.hu/admin/felhom-controller:0.239.0 from /etc/felhom-bootstrap/bootstrap.json (hostname=demo-felhom)
Sep 13 15:19:19 demo-felhom felhom-controller-bootstrap.sh[3492189]: 30f28bf3afa5f7b665ef62ca3ae5df0b23a1610eb74385a834382e3eaf6b7805
Sep 13 15:19:19 demo-felhom felhom-controller-bootstrap.sh[3492140]: [ctrl-bootstrap] controller started
Sep 13 15:19:19 demo-felhom systemd[1]: Finished felhom-controller-bootstrap.service - Felhom controller bootstrap (deploy the baked controller from the agent-populated config mount).
SUMMARY T0=2026-09-13T15:19:12Z {'demo-hp': ('2026-09-13T15:19:26Z', 14), 'demo-felhom': ('2026-09-13T15:19:27Z', 15)} not done: []
@@ -0,0 +1,58 @@
=== Scenario K — no unit on ANY tier, a backup can be taken — 2026-09-13T15:25:41Z, controller 0.239.0 ===
Fixture: throwaway actualbudget (deployed 15:24:21Z, Tier 2 switched off per app). A fresh deploy gets its
Tier-1 unit within seconds (attempt 04a), so the unit is REMOVED here to make 'no unit anywhere' true.
--- BEFORE removal (helper fixed: every tier location) ---
/mnt/sys_drive/felhom-data/backups/primary/actualbudget:
2026-09-13T15:24:22.6041945430 1017 manifest.json
2026-09-13T15:24:22.6041945430 291 compose/app.yaml
2026-09-13T15:24:22.6041945430 2259 compose/.felhom.yml
2026-09-13T15:24:22.6041945430 1412 compose/docker-compose.yml
/mnt/felhom-drives/hdd_1/backups/primary/actualbudget: ABSENT
/mnt/felhom-drives/hdd_1/backups/secondary/actualbudget: ABSENT
app_backup record (off-site per-app pref): {'enabled': False, 'cross_drive': {'enabled': False, 'method': 'rsync', 'destination_path': '', 'schedule': 'daily', 'user_disabled': True}}
--- remove the throwaway's own recovery unit, then POST the update with NO request in between ---
removed
ls: cannot access '/mnt/sys_drive/felhom-data/backups/primary/actualbudget': No such file or directory
--- POST /api/stacks/actualbudget/update at 2026-09-13T15:25:45Z ---
HTTP 202
{"ok":true,"data":{"accepted":true,"completed":false},"message":"Frissítés elindult – az állapot a kártyán követhető"}
end (2026-09-13T15:26:10Z, +24s): state=running updating=False phase=done err='' hold=''
--- the controller, verbatim ---
2026/09/13 15:25:45 update.go:336: [INFO] [stacks] update actualbudget: accepted — guarded update started
2026/09/13 15:25:45 update.go:763: [INFO] [stacks] update actualbudget: phase checking
2026/09/13 15:25:45 update_guard.go:173: [DEBUG] [backup] update precondition for actualbudget: no Tier-2 copy (nincs másodlagos fájlmásolat ehhez az alkalmazáshoz)
2026/09/13 15:26:00 update.go:452: [INFO] [stacks] update actualbudget: no copy younger than 24h0m0s on any tier (found: none) — backing up first
2026/09/13 15:26:00 update.go:763: [INFO] [stacks] update actualbudget: phase backing-up
2026/09/13 15:26:00 update_guard.go:287: [INFO] [backup] update pre-backup for actualbudget: starting (DB dump → volume dump → unit capture → Tier 2)
2026/09/13 15:26:00 manager.go:1199: [DEBUG] [stacks] StopStack actualbudget: current state=running deployed=true containers=1
2026/09/13 15:26:01 manager.go:1117: [DEBUG] [stacks] StartStack actualbudget: current state=stopped deployed=true
2026/09/13 15:26:01 manager.go:1127: [DEBUG] [stacks] StartStack actualbudget: prepared 8 env vars for compose
2026/09/13 15:26:02 installed.go:397: [DEBUG] [stacks] installed-images actualbudget: unchanged (1 service(s)) — app.yaml not rewritten
2026/09/13 15:26:02 update_guard.go:337: [INFO] [backup] update pre-backup for actualbudget: volume dump OK
2026/09/13 15:26:02 update_guard.go:343: [INFO] [backup] update pre-backup for actualbudget: recovery unit captured (0 database dump(s))
2026/09/13 15:26:02 tier2.go:293: [INFO] [backup] Tier 2 for actualbudget skipped — disabled by customer
2026/09/13 15:26:02 update_guard.go:352: [INFO] [backup] update pre-backup for actualbudget: complete in 1.423s
2026/09/13 15:26:02 update_guard.go:173: [DEBUG] [backup] update precondition for actualbudget: no Tier-2 copy (nincs másodlagos fájlmásolat ehhez az alkalmazáshoz)
2026/09/13 15:26:02 update.go:467: [INFO] [stacks] update actualbudget: precondition met after the backup — Tier 1 (own recovery unit) copy from 2026-09-13T15:26:02Z
2026/09/13 15:26:02 update.go:763: [INFO] [stacks] update actualbudget: phase safety-dump
2026/09/13 15:26:02 update_guard.go:403: [INFO] [backup] update safety dump for actualbudget: the app has no database — nothing to copy (no-op)
2026/09/13 15:26:02 update.go:482: [INFO] [stacks] update actualbudget: safety dump done (0 file(s)) []
2026/09/13 15:26:02 update.go:763: [INFO] [stacks] update actualbudget: phase pinning
2026/09/13 15:26:02 pin.go:362: [INFO] [stacks] update actualbudget: pin advanced to the catalog's current definition (actualbudget=actualbudget/actual-server:26.7.0)
2026/09/13 15:26:02 update.go:763: [INFO] [stacks] update actualbudget: phase pulling
2026/09/13 15:26:03 update.go:763: [INFO] [stacks] update actualbudget: phase starting
2026/09/13 15:26:03 update.go:763: [INFO] [stacks] update actualbudget: phase verifying
2026/09/13 15:26:08 healthprobe.go:153: [DEBUG] Health probe actualbudget: HTTP GET :5006/ → 200 (4ms)
2026/09/13 15:26:08 update.go:558: [INFO] [stacks] update actualbudget: healthy after 5s (the app's health check passed)
2026/09/13 15:26:08 installed.go:397: [DEBUG] [stacks] installed-images actualbudget: unchanged (1 service(s)) — app.yaml not rewritten
2026/09/13 15:26:08 update.go:564: [INFO] [stacks] update actualbudget: DONE in 23s
--- AFTER: every tier location ---
/mnt/sys_drive/felhom-data/backups/primary/actualbudget:
2026-09-13T15:26:02.2202745980 1059 manifest.json
2026-09-13T15:26:02.2194343050 291 compose/app.yaml
2026-09-13T15:26:02.2194343050 2259 compose/.felhom.yml
2026-09-13T15:26:02.2194343050 1412 compose/docker-compose.yml
2026-09-13T15:26:01.5313724220 74240 volume-dumps/actualbudget_actualbudget_data.tar
/mnt/felhom-drives/hdd_1/backups/primary/actualbudget: ABSENT
/mnt/felhom-drives/hdd_1/backups/secondary/actualbudget: ABSENT
=== K done 2026-09-13T15:26:12Z ===
@@ -0,0 +1,84 @@
=== Scenario K — no unit anywhere, a backup can be taken — 2026-09-13T15:24:19Z, controller 0.239.0 ===
--- BEFORE: every tier's location ---
:
2026-07-04T09:05:00.0000000000 132 .profile
2026-08-18T10:54:08.4964149220 0 .bash_history
2026-08-21T21:09:27.0884871020 2777 settings.json.drill-backup
2026-07-04T09:05:00.0000000000 607 .bashrc
:
2026-07-04T09:05:00.0000000000 132 .profile
2026-08-18T10:54:08.4964149220 0 .bash_history
2026-08-21T21:09:27.0884871020 2777 settings.json.drill-backup
2026-07-04T09:05:00.0000000000 607 .bashrc
:
2026-07-04T09:05:00.0000000000 132 .profile
2026-08-18T10:54:08.4964149220 0 .bash_history
2026-08-21T21:09:27.0884871020 2777 settings.json.drill-backup
2026-07-04T09:05:00.0000000000 607 .bashrc
app_backup record: None
--- deploy actualbudget (throwaway) at 2026-09-13T15:24:21Z ---
HTTP 202
{"ok":true,"message":"Telepítés elindítva – az állapot a kártyán követhető"}
after deploy (2026-09-13T15:24:47Z): state=running updating=False phase=None err='' hold=''
--- Tier 2 OFF for actualbudget via POST /stacks/actualbudget/backup (form, enabled absent) at 2026-09-13T15:24:47Z ---
HTTP/2 303
location: /stacks/actualbudget/backup?flash=A+2.+ment%C3%A9s+be%C3%A1ll%C3%ADt%C3%A1sa+elmentve.
--- IMMEDIATELY BEFORE the update: still no unit? ---
:
2026-07-04T09:05:00.0000000000 132 .profile
2026-08-18T10:54:08.4964149220 0 .bash_history
2026-08-21T21:09:27.0884871020 2777 settings.json.drill-backup
2026-07-04T09:05:00.0000000000 607 .bashrc
:
2026-07-04T09:05:00.0000000000 132 .profile
2026-08-18T10:54:08.4964149220 0 .bash_history
2026-08-21T21:09:27.0884871020 2777 settings.json.drill-backup
2026-07-04T09:05:00.0000000000 607 .bashrc
:
2026-07-04T09:05:00.0000000000 132 .profile
2026-08-18T10:54:08.4964149220 0 .bash_history
2026-08-21T21:09:27.0884871020 2777 settings.json.drill-backup
2026-07-04T09:05:00.0000000000 607 .bashrc
--- POST /api/stacks/actualbudget/update at 2026-09-13T15:24:48Z ---
HTTP 202
{"ok":true,"data":{"accepted":true,"completed":false},"message":"Frissítés elindult – az állapot a kártyán követhető"}
+ 0s phase safety-dump
+ 3s phase done
end (2026-09-13T15:24:51Z, +3s): state=running updating=False phase=done err='' hold=''
--- the controller, verbatim (update + pre-backup + tier choice) ---
2026/09/13 15:24:48 update.go:336: [INFO] [stacks] update actualbudget: accepted — guarded update started
2026/09/13 15:24:48 update.go:763: [INFO] [stacks] update actualbudget: phase checking
2026/09/13 15:24:48 update_guard.go:173: [DEBUG] [backup] update precondition for actualbudget: no Tier-2 copy (nincs másodlagos fájlmásolat ehhez az alkalmazáshoz)
2026/09/13 15:24:48 update.go:450: [INFO] [stacks] update actualbudget: precondition met — Tier 1 (own recovery unit) copy from 2026-09-13T15:24:22Z (0s old, limit 24h0m0s)
2026/09/13 15:24:48 update.go:763: [INFO] [stacks] update actualbudget: phase safety-dump
2026/09/13 15:24:48 update_guard.go:403: [INFO] [backup] update safety dump for actualbudget: the app has no database — nothing to copy (no-op)
2026/09/13 15:24:48 update.go:482: [INFO] [stacks] update actualbudget: safety dump done (0 file(s)) []
2026/09/13 15:24:48 update.go:763: [INFO] [stacks] update actualbudget: phase pinning
2026/09/13 15:24:48 pin.go:362: [INFO] [stacks] update actualbudget: pin advanced to the catalog's current definition (actualbudget=actualbudget/actual-server:26.7.0)
2026/09/13 15:24:48 update.go:763: [INFO] [stacks] update actualbudget: phase pulling
2026/09/13 15:24:50 update.go:763: [INFO] [stacks] update actualbudget: phase starting
2026/09/13 15:24:50 update.go:763: [INFO] [stacks] update actualbudget: phase verifying
2026/09/13 15:24:50 healthprobe.go:153: [DEBUG] Health probe actualbudget: HTTP GET :5006/ → 200 (3ms)
2026/09/13 15:24:50 update.go:558: [INFO] [stacks] update actualbudget: healthy after 0s (the app's health check passed)
2026/09/13 15:24:50 installed.go:397: [DEBUG] [stacks] installed-images actualbudget: unchanged (1 service(s)) — app.yaml not rewritten
2026/09/13 15:24:50 update.go:564: [INFO] [stacks] update actualbudget: DONE in 2s
--- AFTER: the unit the backup-first made ---
:
2026-07-04T09:05:00.0000000000 132 .profile
2026-08-18T10:54:08.4964149220 0 .bash_history
2026-08-21T21:09:27.0884871020 2777 settings.json.drill-backup
2026-07-04T09:05:00.0000000000 607 .bashrc
:
2026-07-04T09:05:00.0000000000 132 .profile
2026-08-18T10:54:08.4964149220 0 .bash_history
2026-08-21T21:09:27.0884871020 2777 settings.json.drill-backup
2026-07-04T09:05:00.0000000000 607 .bashrc
:
2026-07-04T09:05:00.0000000000 132 .profile
2026-08-18T10:54:08.4964149220 0 .bash_history
2026-08-21T21:09:27.0884871020 2777 settings.json.drill-backup
2026-07-04T09:05:00.0000000000 607 .bashrc
--- the card ---
state=running updating=False phase=done err='' hold=''
=== K done 2026-09-13T15:24:54Z ===
@@ -0,0 +1,52 @@
=== Scenario H — gokapi, only its own recovery unit (Tier 1) — 2026-09-13T15:30:45Z, controller 0.239.0 ===
--- BEFORE: every tier location (a unit left from 06:59Z, R-474); Tier 2 already switched off per app ---
/mnt/sys_drive/felhom-data/backups/primary/gokapi:
2026-09-13T06:59:17.4202088100 1014 manifest.json
2026-09-13T06:59:17.4202088100 394 compose/app.yaml
2026-09-13T06:59:17.4202088100 2497 compose/.felhom.yml
2026-09-13T06:59:17.4202088100 2993 compose/docker-compose.yml
/mnt/felhom-drives/hdd_1/backups/primary/gokapi: ABSENT
/mnt/felhom-drives/hdd_1/backups/secondary/gokapi: ABSENT
--- deploy gokapi (throwaway; GOKAPI_PASSWORD generated here, never printed or stored) at 2026-09-13T15:30:46Z ---
HTTP 202
{"ok":true,"message":"Telepítés elindítva – az állapot a kártyán követhető"}
after deploy (2026-09-13T15:31:07Z): state=running updating=False phase=None err='' hold=''
app_backup record: {'enabled': False, 'cross_drive': {'enabled': False, 'method': 'rsync', 'destination_path': '', 'schedule': 'daily', 'user_disabled': True}}
--- IMMEDIATELY BEFORE the update ---
/mnt/sys_drive/felhom-data/backups/primary/gokapi:
2026-09-13T06:59:17.4202088100 1014 manifest.json
2026-09-13T06:59:17.4202088100 394 compose/app.yaml
2026-09-13T06:59:17.4202088100 2497 compose/.felhom.yml
2026-09-13T06:59:17.4202088100 2993 compose/docker-compose.yml
/mnt/felhom-drives/hdd_1/backups/primary/gokapi: ABSENT
/mnt/felhom-drives/hdd_1/backups/secondary/gokapi: ABSENT
--- POST /api/stacks/gokapi/update at 2026-09-13T15:31:09Z ---
HTTP 202
{"ok":true,"data":{"accepted":true,"completed":false},"message":"Frissítés elindult – az állapot a kártyán követhető"}
+ 0s phase safety-dump
+ 3s phase done
end (2026-09-13T15:31:13Z, +3s): state=running updating=False phase=done err='' hold=''
--- the controller, verbatim ---
2026/09/13 15:31:10 update.go:336: [INFO] [stacks] update gokapi: accepted — guarded update started
2026/09/13 15:31:10 update.go:763: [INFO] [stacks] update gokapi: phase checking
2026/09/13 15:31:10 update_guard.go:173: [DEBUG] [backup] update precondition for gokapi: no Tier-2 copy (nincs másodlagos fájlmásolat ehhez az alkalmazáshoz)
2026/09/13 15:31:10 update.go:450: [INFO] [stacks] update gokapi: precondition met — Tier 1 (own recovery unit) copy from 2026-09-13T06:59:17Z (8h32m0s old, limit 24h0m0s)
2026/09/13 15:31:10 update.go:763: [INFO] [stacks] update gokapi: phase safety-dump
2026/09/13 15:31:10 update.go:482: [INFO] [stacks] update gokapi: safety dump done (0 file(s)) []
2026/09/13 15:31:10 update.go:763: [INFO] [stacks] update gokapi: phase pinning
2026/09/13 15:31:10 pin.go:362: [INFO] [stacks] update gokapi: pin advanced to the catalog's current definition (gokapi=f0rc3/gokapi:v1.9.6)
2026/09/13 15:31:10 update.go:763: [INFO] [stacks] update gokapi: phase pulling
2026/09/13 15:31:11 update.go:763: [INFO] [stacks] update gokapi: phase starting
2026/09/13 15:31:11 update.go:763: [INFO] [stacks] update gokapi: phase verifying
2026/09/13 15:31:11 update.go:558: [INFO] [stacks] update gokapi: healthy after 0s (the app's health check passed)
2026/09/13 15:31:11 update.go:564: [INFO] [stacks] update gokapi: DONE in 2s
--- AFTER ---
/mnt/sys_drive/felhom-data/backups/primary/gokapi:
2026-09-13T06:59:17.4202088100 1014 manifest.json
2026-09-13T06:59:17.4202088100 394 compose/app.yaml
2026-09-13T06:59:17.4202088100 2497 compose/.felhom.yml
2026-09-13T06:59:17.4202088100 2993 compose/docker-compose.yml
/mnt/felhom-drives/hdd_1/backups/primary/gokapi: ABSENT
/mnt/felhom-drives/hdd_1/backups/secondary/gokapi: ABSENT
f0rc3/gokapi:v1.9.6 Up 29 seconds (healthy)
=== H done 2026-09-13T15:31:16Z ===
@@ -0,0 +1,42 @@
=== Scenario H — gokapi, only its own recovery unit (Tier 1) — 2026-09-13T15:26:36Z, controller 0.239.0 ===
--- BEFORE: every tier location (a unit left from 06:59Z, R-474) ---
/mnt/sys_drive/felhom-data/backups/primary/gokapi:
2026-09-13T06:59:17.4202088100 1014 manifest.json
2026-09-13T06:59:17.4202088100 394 compose/app.yaml
2026-09-13T06:59:17.4202088100 2497 compose/.felhom.yml
2026-09-13T06:59:17.4202088100 2993 compose/docker-compose.yml
/mnt/felhom-drives/hdd_1/backups/primary/gokapi: ABSENT
/mnt/felhom-drives/hdd_1/backups/secondary/gokapi: ABSENT
--- deploy gokapi (throwaway) at 2026-09-13T15:26:37Z ---
HTTP 400
{"ok":false,"error":"a(z) \"Admin jelszó\" mező kitöltése kötelező — használja a Generálás gombot vagy írjon be egy jelszót"}
after deploy (2026-09-13T15:29:59Z): state=not_deployed updating=False phase=None err='' hold=''
--- Tier 2 OFF for gokapi via POST /stacks/gokapi/backup (form, enabled absent) at 2026-09-13T15:29:59Z ---
HTTP/2 303
location: /stacks/gokapi/backup?flash=A+2.+ment%C3%A9s+be%C3%A1ll%C3%ADt%C3%A1sa+elmentve.
app_backup record: {'enabled': False, 'cross_drive': {'enabled': False, 'method': 'rsync', 'destination_path': '', 'schedule': 'daily', 'user_disabled': True}}
--- IMMEDIATELY BEFORE the update ---
/mnt/sys_drive/felhom-data/backups/primary/gokapi:
2026-09-13T06:59:17.4202088100 1014 manifest.json
2026-09-13T06:59:17.4202088100 394 compose/app.yaml
2026-09-13T06:59:17.4202088100 2497 compose/.felhom.yml
2026-09-13T06:59:17.4202088100 2993 compose/docker-compose.yml
/mnt/felhom-drives/hdd_1/backups/primary/gokapi: ABSENT
/mnt/felhom-drives/hdd_1/backups/secondary/gokapi: ABSENT
--- POST /api/stacks/gokapi/update at 2026-09-13T15:30:02Z ---
HTTP 409
{"ok":false,"error":"Az alkalmazás nincs telepítve, ezért nem frissíthető."}
end (2026-09-13T15:30:05Z, +3s): state=not_deployed updating=False phase=None err='' hold=''
--- the controller, verbatim ---
2026/09/13 15:30:02 update.go:217: [ERROR] [stacks] update gokapi REFUSED (not_deployed): not deployed
--- AFTER ---
/mnt/sys_drive/felhom-data/backups/primary/gokapi:
2026-09-13T06:59:17.4202088100 1014 manifest.json
2026-09-13T06:59:17.4202088100 394 compose/app.yaml
2026-09-13T06:59:17.4202088100 2497 compose/.felhom.yml
2026-09-13T06:59:17.4202088100 2993 compose/docker-compose.yml
/mnt/felhom-drives/hdd_1/backups/primary/gokapi: ABSENT
/mnt/felhom-drives/hdd_1/backups/secondary/gokapi: ABSENT
=== H done 2026-09-13T15:30:08Z ===
@@ -0,0 +1,10 @@
=== F setup — wait for the capture sweep to rewrite gokapi's Tier-1 unit for THIS install — 2026-09-13T15:31:51Z ===
manifest mtime now: 2026-09-13 15:34:22.637661403 +0000 (+151s)
/mnt/sys_drive/felhom-data/backups/primary/gokapi:
2026-09-13T15:34:22.6376614030 1014 manifest.json
2026-09-13T15:34:22.6376614030 393 compose/app.yaml
2026-09-13T15:34:22.6366613900 2497 compose/.felhom.yml
2026-09-13T15:34:22.6366613900 2993 compose/docker-compose.yml
/mnt/felhom-drives/hdd_1/backups/primary/gokapi: ABSENT
/mnt/felhom-drives/hdd_1/backups/secondary/gokapi: ABSENT
SUBDOMAIN: gokapih5
@@ -0,0 +1,38 @@
=== Scenario F-shape on Tier 1 — gokapi's new version never comes up — 2026-09-13T15:34:50Z, controller 0.239.0 ===
Fixture: a BOX-LOCAL edit of gokapi's catalog-cache template (image -> alpine:3.20, which exits at once),
put back as soon as the job is past the pin. No catalog commit.
16: image: alpine:3.20
--- POST /api/stacks/gokapi/update at 2026-09-13T15:34:51Z ---
HTTP 202
{"ok":true,"data":{"accepted":true,"completed":false},"message":"Frissítés elindult – az állapot a kártyán követhető"}
+ 0s phase safety-dump
+ 3s phase verifying
[fixture] template put back at 2026-09-13T15:34:55Z: 1
+305s phase failed
end (2026-09-13T15:39:57Z, +305s): state=stopped updating=False phase=failed err='A(z) gokapi frissítése 2026-09-13 17:39-kor nem sikerült, és az alkalmazás nem indult el az új verzióval. Az alkalmazás biztonsági okból leállítva marad, hogy az adatai ne sérüljenek. Visszaállítható a Mentések oldalon ebből a biztonsági mentésből: saját meghajtó, 2026-09-13 17:34.' hold='A(z) gokapi frissítése 2026-09-13 17:39-kor nem sikerült, és az alkalmazás nem indult el az új verzióval. Az alkalmazás biztonsági okból leállítva marad, hogy az adatai ne sérüljenek. Visszaállítható a Mentések oldalon ebből a biztonsági mentésből: saját meghajtó, 2026-09-13 17:34.'
--- the hold sentence (Python string checks, no shell grep) ---
A(z) gokapi frissítése 2026-09-13 17:39-kor nem sikerült, és az alkalmazás nem indult el az új verzióval. Az alkalmazás biztonsági okból leállítva marad, hogy az adatai ne sérüljenek. Visszaállítható a Mentések oldalon ebből a biztonsági mentésből: saját meghajtó, 2026-09-13 17:34.
names 'saját meghajtó': True | control 'második meghajtó': False | control 'távoli mentés': False
--- a held app refuses start ---
HTTP 409
{"ok":false,"error":"A(z) gokapi frissítése 2026-09-13 17:39-kor nem sikerült, és az alkalmazás nem indult el az új verzióval. Az alkalmazás biztonsági okból leállítva marad, hogy az adatai ne sérüljenek. Visszaállítható a Mentések oldalon ebből a biztonsági mentésből: saját meghajtó, 2026-09-13 17:34."}
--- the controller, verbatim ---
2026/09/13 15:34:51 update.go:336: [INFO] [stacks] update gokapi: accepted — guarded update started
2026/09/13 15:34:51 update.go:763: [INFO] [stacks] update gokapi: phase checking
2026/09/13 15:34:51 update_guard.go:173: [DEBUG] [backup] update precondition for gokapi: no Tier-2 copy (nincs másodlagos fájlmásolat ehhez az alkalmazáshoz)
2026/09/13 15:34:51 update.go:450: [INFO] [stacks] update gokapi: precondition met — Tier 1 (own recovery unit) copy from 2026-09-13T15:34:22Z (0s old, limit 24h0m0s)
2026/09/13 15:34:51 update.go:763: [INFO] [stacks] update gokapi: phase safety-dump
2026/09/13 15:34:52 update_guard.go:403: [INFO] [backup] update safety dump for gokapi: the app has no database — nothing to copy (no-op)
2026/09/13 15:34:52 update.go:482: [INFO] [stacks] update gokapi: safety dump done (0 file(s)) []
2026/09/13 15:34:52 update.go:763: [INFO] [stacks] update gokapi: phase pinning
2026/09/13 15:34:52 pin.go:362: [INFO] [stacks] update gokapi: pin advanced to the catalog's current definition (gokapi=alpine:3.20)
2026/09/13 15:34:52 update.go:763: [INFO] [stacks] update gokapi: phase pulling
2026/09/13 15:34:54 update.go:763: [INFO] [stacks] update gokapi: phase starting
2026/09/13 15:34:54 update.go:763: [INFO] [stacks] update gokapi: phase verifying
2026/09/13 15:39:56 update.go:569: [ERROR] [stacks] update gokapi FAILED after the new version was started: not healthy: not healthy within 5m0s (last: state restarting) — stopping and HOLDING the app; the pin stays on the new version (its migration may have run)
2026/09/13 15:39:56 update_guard.go:468: [WARN] [backup] gokapi is HELD STOPPED after a failed update (restore point: tier 1 "saját meghajtó", 2026-09-13T15:34:22Z)
--- the hold record ---
{'stack': 'gokapi', 'at': '2026-09-13T15:39:56Z', 'reason': 'update_failed', 'copy_date': '2026-09-13T15:34:22Z', 'copy_tier': 1}
--- the template after the fixture ---
16: image: f0rc3/gokapi:v1.9.6
=== F done 2026-09-13T15:40:00Z ===
@@ -0,0 +1,56 @@
=== The restore walk — from „helyi” through the restore page — 2026-09-13T15:40:16Z ===
--- BEFORE: state=stopped updating=False phase=failed err='A(z) gokapi frissítése 2026-09-13 17:39-kor nem sikerült, és az alkalmazás nem indult el az új verzióval. Az alkalmazás biztonsági okból leállítva marad, hogy az adatai ne sérüljenek. Visszaállítható a Mentések oldalon ebből a biztonsági mentésből: saját meghajtó, 2026-09-13 17:34.' hold='A(z) gokapi frissítése 2026-09-13 17:39-kor nem sikerült, és az alkalmazás nem indult el az új verzióval. Az alkalmazás biztonsági okból leállítva marad, hogy az adatai ne sérüljenek. Visszaállítható a Mentések oldalon ebből a biztonsági mentésből: saját meghajtó, 2026-09-13 17:34.'
--- POST /backup/restore (form: stack_name=gokapi, snapshot_id=helyi — what the restore page submits) at 2026-09-13T15:40:16Z ---
HTTP/2 302
location: /backups/restore?flash=Vissza%C3%A1ll%C3%ADt%C3%A1s+elindult+%E2%80%94+az+%C3%A1llapot+itt+friss%C3%BCl.
--- restore-status at the end ---
{
"_raw": "404 page not found"
}
--- the app after the restore ---
state=starting updating=False phase=failed err='A(z) gokapi frissítése 2026-09-13 17:39-kor nem sikerült, és az alkalmazás nem indult el az új verzióval. Az alkalmazás biztonsági okból leállítva marad, hogy az adatai ne sérüljenek. Visszaállítható a Mentések oldalon ebből a biztonsági mentésből: saját meghajtó, 2026-09-13 17:34.' hold='A(z) gokapi frissítése 2026-09-13 17:39-kor nem sikerült, és az alkalmazás nem indult el az új verzióval. Az alkalmazás biztonsági okból leállítva marad, hogy az adatai ne sérüljenek. Visszaállítható a Mentések oldalon ebből a biztonsági mentésből: saját meghajtó, 2026-09-13 17:34.'
f0rc3/gokapi:v1.9.6 Up 4 seconds (health: starting)
pinned: {'gokapi': 'f0rc3/gokapi:v1.9.6'} | installed: None
--- the hold store ---
{'stack': 'gokapi', 'at': '2026-09-13T15:39:56Z', 'reason': 'update_failed', 'copy_date': '2026-09-13T15:34:22Z', 'copy_tier': 1}
--- the controller, verbatim ---
2026/09/13 15:40:16 auth.go:134: [DEBUG] [web] auth: valid session for POST /backup/restore
2026/09/13 15:40:16 server.go:393: [DEBUG] [web] ServeHTTP: POST /backup/restore from 172.18.0.3:33564
2026/09/13 15:40:16 handlers.go:1480: [DEBUG] [web] backupRestoreHandler: stack=gokapi snapshot=helyi from 172.18.0.3:33564
2026/09/13 15:40:16 handlers.go:1506: [WARN] [web] Restore requested (async): stack=gokapi, snapshot=helyi from 172.18.0.3:33564
2026/09/13 15:40:16 restore_unit.go:313: [INFO] [backup] Restoring gokapi from recovery unit /mnt/sys_drive/felhom-data/backups/primary/gokapi: images=1, secrets recovered=1/1, data_keys=0
2026/09/13 15:40:16 manager.go:1199: [DEBUG] [stacks] StopStack gokapi: current state=stopped deployed=true containers=0
2026/09/13 15:40:16 auth.go:134: [DEBUG] [web] auth: valid session for GET /backup/restore-status
2026/09/13 15:40:16 server.go:393: [DEBUG] [web] ServeHTTP: GET /backup/restore-status from 172.18.0.3:33564
2026/09/13 15:40:16 server.go:640: [WARN] [web] 404 Not Found: GET /backup/restore-status
2026/09/13 15:40:16 pin.go:93: [INFO] [stacks] pin gokapi: gokapi=f0rc3/gokapi:v1.9.6
2026/09/13 15:40:16 manager.go:1117: [DEBUG] [stacks] StartStack gokapi: current state=stopped deployed=true
2026/09/13 15:40:16 manager.go:1127: [DEBUG] [stacks] StartStack gokapi: prepared 9 env vars for compose
2026/09/13 15:40:16 installed.go:408: [INFO] [stacks] installed-images gokapi: recorded 1 service(s) (gokapi=f0rc3/gokapi:v1.9.6 (sha256:ae9094a0ead8…))
2026/09/13 15:40:19 auth.go:134: [DEBUG] [web] auth: valid session for GET /backup/restore-status
2026/09/13 15:40:19 server.go:393: [DEBUG] [web] ServeHTTP: GET /backup/restore-status from 172.18.0.3:33564
2026/09/13 15:40:19 server.go:640: [WARN] [web] 404 Not Found: GET /backup/restore-status
2026/09/13 15:40:19 restore.go:212: [DEBUG] [backup] Post-restore health check: gokapi not yet running, waiting...
=== restore walk done 2026-09-13T15:40:22Z ===
=== SECOND READ — the first read above stopped after 3 s: it polled /backup/restore-status, which is 404,
=== so it saw the restore still running. This is the finished state — 2026-09-13T15:40:44Z ===
GET /api/backup/restore-status -> HTTP 200 {"ok":true,"data":{"running":false,"op":"restore","stack":"gokapi","started_at":"2026-09-13T15:40:16.222440489Z","last":{"op":"restore","stack":"gokapi","ok":true,"message":"A(z) gokapi: a beállítások visszaálltak — az alkalmazás újraindult. FIGYELEM: ez a mentés csak a beállításokat tartalmazta, adatot nem. Az alkalmazás adatai NEM álltak vissza ebből a mentésből.","finished_at":"2026-09-13T15:40:24.982262899Z"},"last_recent":true}}
GET /backups/restore-status -> HTTP 404 404 page not found
GET /api/restore-status -> HTTP 404 {"ok":false,"error":"endpoint not found"}
--- the app ---
state=running updating=False phase=failed err='A(z) gokapi frissítése 2026-09-13 17:39-kor nem sikerült, és az alkalmazás nem indult el az új verzióval. Az alkalmazás biztonsági okból leállítva marad, hogy az adatai ne sérüljenek. Visszaállítható a Mentések oldalon ebből a biztonsági mentésből: saját meghajtó, 2026-09-13 17:34.' hold=''
f0rc3/gokapi:v1.9.6 Up 29 seconds (healthy)
pinned: {'gokapi': 'f0rc3/gokapi:v1.9.6'}
--- the hold store ---
None
--- a start is no longer refused (the app is running; restart as the probe) ---
--- the controller, verbatim, restore end ---
2026/09/13 15:40:19 restore.go:212: [DEBUG] [backup] Post-restore health check: gokapi not yet running, waiting...
2026/09/13 15:40:24 restore.go:207: [DEBUG] [backup] Post-restore health check: gokapi is running
2026/09/13 15:40:24 restore_unit.go:391: [INFO] [backup] Restore-from-unit completed: gokapi — 0 volume(s) of 0 listed, 0 database(s) of 0 listed
2026/09/13 15:40:24 settings.go:1656: [INFO] [settings] restore hold CLEARED for gokapi
2026/09/13 15:40:24 update_guard.go:517: [INFO] [backup] gokapi: restore completed — the update hold (set 2026-09-13T15:39:56Z) is CLEARED
2026/09/13 15:40:24 handlers.go:1518: [INFO] [web] Restore completed (async): stack=gokapi in 8.759734524s (volumes 0/0, dbs 0/0)
=== second read done 2026-09-13T15:40:48Z ===
@@ -0,0 +1,4 @@
=== The card AFTER a successful restore — 2026-09-13T15:42:12Z ===
API: state=running updating=False phase=failed err='A(z) gokapi frissítése 2026-09-13 17:39-kor nem sikerült, és az alkalmazás nem indult el az új verzióval. Az alkalmazás biztonsági okból leállítva marad, hogy az adatai ne sérüljenek. Visszaállítható a Mentések oldalon ebből a biztonsági mentésből: saját meghajtó, 2026-09-13 17:34.' hold=''
GET /stacks (145958 bytes, read 15:41Z): 'leállítva marad' inside gokapi card region: True | control, actualbudget card: False
FINDING: the hold is cleared and the app runs, but update_phase=failed + update_error stay, so the card still says the app is stopped.
@@ -0,0 +1,83 @@
=== Teardown — three layers — 2026-09-13T15:42:12Z ===
--- layer 1: the two throwaway apps, through the product's own removal ---
gokapi HTTP 200 {"ok":true,"message":"Stack gokapi stop completed"}
gokapi HTTP 200 {"ok":true,"data":{"removed":"gokapi","volumes_removed":null,"hdd_paths_removed":[],"hdd_paths_preserved":[],"hdd_note":"Az alkalmazás nem tárolt saját adatot külső meghajtón, így ott nem volt mit törölni."},"message":"Stack gokapi removed"}
actualbudget HTTP 200 {"ok":true,"message":"Stack actualbudget stop completed"}
actualbudget HTTP 200 {"ok":true,"data":{"removed":"actualbudget","volumes_removed":null,"hdd_paths_removed":[],"hdd_paths_preserved":[],"hdd_note":"Az alkalmazás nem tárolt saját adatot külső meghajtón, így ott nem volt mit törölni."},"message":"Stack actualbudget removed"}
gokapi -> state=not_deployed updating=False phase=failed err='A(z) gokapi frissítése 2026-09-13 17:39-kor nem sikerült, és az alkalmazás nem indult el az új verzióval. Az alkalmazás biztonsági okból leállítva marad, hogy az adatai ne sérüljenek. Visszaállítható a Mentések oldalon ebből a biztonsági mentésből: saját meghajtó, 2026-09-13 17:34.' hold=''
no containers
/mnt/sys_drive/felhom-data/backups/primary/gokapi:
2026-09-13T15:34:22.6376614030 1014 manifest.json
2026-09-13T15:34:22.6376614030 393 compose/app.yaml
2026-09-13T15:34:22.6366613900 2497 compose/.felhom.yml
2026-09-13T15:34:22.6366613900 2993 compose/docker-compose.yml
/mnt/felhom-drives/hdd_1/backups/primary/gokapi: ABSENT
/mnt/felhom-drives/hdd_1/backups/secondary/gokapi: ABSENT
actualbudget -> state=not_deployed updating=False phase=done err='' hold=''
no containers
/mnt/sys_drive/felhom-data/backups/primary/actualbudget:
2026-09-13T15:26:02.2202745980 1059 manifest.json
2026-09-13T15:26:02.2194343050 291 compose/app.yaml
2026-09-13T15:26:02.2194343050 2259 compose/.felhom.yml
2026-09-13T15:26:02.2194343050 1412 compose/docker-compose.yml
2026-09-13T15:26:01.5313724220 74240 volume-dumps/actualbudget_actualbudget_data.tar
/mnt/felhom-drives/hdd_1/backups/primary/actualbudget: ABSENT
/mnt/felhom-drives/hdd_1/backups/secondary/actualbudget: ABSENT
app_backup prefs left: {'gokapi': {'enabled': False}, 'actualbudget': {'enabled': False}}
holds: None
--- layer 2: the box-local fixture ---
ls: cannot access '/root/gokapi-compose.orig': No such file or directory
16: image: f0rc3/gokapi:v1.9.6
--- layer 3: fleet + hub, left as the release state (floor 0.239.0 with declared MinAgent 0.129.0 is the CORRECT floor now) ---
hp gitea.dooplex.hu/admin/felhom-controller:0.239.0 Up 23 minutes (healthy)
felhom-pve-lan gitea.dooplex.hu/admin/felhom-controller:0.239.0 Up 23 minutes (healthy)
standing apps:
2026/09/13 16:50:03 [INFO] managed floor SERVED for demo-felhom: floor 0.236.0, agent requirement "0.129.0" from manifest (golden 0.236.0)
2026/09/13 16:50:04 [INFO] managed floor SERVED for demo-hp: floor 0.236.0, agent requirement "0.129.0" from manifest (golden 0.236.0)
2026/09/13 17:19:14 [INFO] managed floor SERVED for demo-felhom: floor 0.239.0, agent requirement "0.129.0" from declared (golden 0.236.0)
2026/09/13 17:19:15 [INFO] managed floor SERVED for demo-hp: floor 0.239.0, agent requirement "0.129.0" from declared (golden 0.236.0)
=== teardown done 2026-09-13T15:42:28Z ===
=== CORRECTION — the 'standing apps:' line above printed EMPTY because of a quoting slip in the teardown script (the tr argument). Re-read with a plain command — 2026-09-13T15:43:01Z ===
bentopdf Up 11 hours (healthy)
bookstack Up 11 hours (healthy)
bookstack-db Up 8 hours (healthy)
calibre-web Up 11 hours (healthy)
cloudflared Up 11 days
docmost Up 11 hours (healthy)
docmost-postgres Up 11 hours (healthy)
docmost-redis Up 11 hours (healthy)
felhom-controller Up 23 minutes (healthy)
filebrowser Up 11 days (healthy)
kimai Up 11 hours (healthy)
kimai-db Up 11 hours (healthy)
opengist Up 11 hours (healthy)
privatebin Up 11 hours (healthy)
romm Up 11 hours (healthy)
romm-db Up 11 hours (healthy)
romm-redis Up 11 hours (healthy)
traefik Up 11 days
=== CORRECTION 2 — the list above is MISSING paperless-ngx: the filter 'grep -v perl' (meant for a perl locale warning) also drops every line containing 'paperless'. Re-read filtering only the warning text — 2026-09-13T15:46:05Z ===
bentopdf Up 11 hours (healthy)
bookstack Up 11 hours (healthy)
bookstack-db Up 8 hours (healthy)
calibre-web Up 11 hours (healthy)
cloudflared Up 11 days
docmost Up 11 hours (healthy)
docmost-postgres Up 11 hours (healthy)
docmost-redis Up 11 hours (healthy)
felhom-controller Up 26 minutes (healthy)
filebrowser Up 11 days (healthy)
kimai Up 11 hours (healthy)
kimai-db Up 11 hours (healthy)
opengist Up 11 hours (healthy)
paperless-postgres Up 11 hours (healthy)
paperless-redis Up 11 hours (healthy)
paperless-webserver Up 11 hours (healthy)
privatebin Up 11 hours (healthy)
romm Up 11 hours (healthy)
romm-db Up 11 hours (healthy)
romm-redis Up 11 hours (healthy)
traefik Up 11 days
@@ -0,0 +1,17 @@
F...
======================================================================
FAIL: test_decoy_body_mention_is_not_the_line (__main__.MinAgentHeaderGateTest.test_decoy_body_mention_is_not_the_line)
R-421: the word in prose, a code span, or a non-bold form is the LABEL without the FACT.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/mnt/5_hdd/felhom.eu/git/felhom-controller/controller/scripts/test_minagent_header_gate.py", line 49, in test_decoy_body_mention_is_not_the_line
self.assertEqual(rc, 1, out)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^
AssertionError: 0 != 1 : minagent header gate OK — v0.239.0 declares MinAgent 0.129.0
----------------------------------------------------------------------
Ran 4 tests in 0.124s
FAILED (failures=1)
mutated-rc=1
@@ -0,0 +1,11 @@
MUTATION in /mnt/5_hdd/felhom.eu/git/felhom-controller/controller/internal/stacks/update.go:
- if _, found, seen := g.RestorePoints(context.Background(), name, nil); !found {
+ if _, _, seen := g.RestorePoints(context.Background(), name, nil); true {
=== RUN TestR475_L_AnExistingCopyStillCarriesAnAppThatCannotBeBackedUp
update_tiers_test.go:118: a fresh off-site copy must carry the update even when no backup can be taken now, got "A(z) nextcloud nem frissíthető, mert nincs olyan biztonsági mentése, amelyből vissza lehetne állítani, és most új mentés sem készíthető róla. Ellenőrizd a Mentések oldalon, hogy az alkalmazás meghajtója elérhető-e — utána a frissítés elindítható."
--- FAIL: TestR475_L_AnExistingCopyStillCarriesAnAppThatCannotBeBackedUp (0.00s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/stacks 0.006s
FAIL
exit=1
@@ -0,0 +1,23 @@
MUTATION in /mnt/5_hdd/felhom.eu/git/felhom-controller/controller/internal/stacks/update.go:
- return !p.ProvenAt.IsZero() && now.Sub(p.ProvenAt) <= maxAge
+ return !p.ProvenAt.IsZero() && (p.Tier != UpdateTierSecondDrive || now.Sub(p.ProvenAt) <= maxAge)
=== RUN TestR475_M_TheAgeRuleAppliesToTheChosenTier
=== RUN TestR475_M_TheAgeRuleAppliesToTheChosenTier/control:_a_stale_second-drive_copy_is_backed_up_first
=== RUN TestR475_M_TheAgeRuleAppliesToTheChosenTier/a_stale_own_unit_is_backed_up_first
update_tiers_test.go:150: backed up first = false, want true (calls [CanBackUp RestorePoints SafetyDump HoldAfterFailedUpdate])
update_tiers_test.go:156: the chosen copy is 30h0m0s old — past the age limit
=== RUN TestR475_M_TheAgeRuleAppliesToTheChosenTier/a_stale_off-site_copy_is_backed_up_first
update_tiers_test.go:150: backed up first = false, want true (calls [CanBackUp RestorePoints SafetyDump HoldAfterFailedUpdate])
update_tiers_test.go:153: the chosen copy is tier 3, want 1 (hold {Tier:3 ProvenAt:2026-09-12 04:00:00 +0000 UTC}, err "HELD-SENTENCE")
update_tiers_test.go:156: the chosen copy is 30h0m0s old — past the age limit
=== RUN TestR475_M_TheAgeRuleAppliesToTheChosenTier/a_stale_second_drive_does_not_block_a_fresh_own_unit
--- FAIL: TestR475_M_TheAgeRuleAppliesToTheChosenTier (0.02s)
--- PASS: TestR475_M_TheAgeRuleAppliesToTheChosenTier/control:_a_stale_second-drive_copy_is_backed_up_first (0.01s)
--- FAIL: TestR475_M_TheAgeRuleAppliesToTheChosenTier/a_stale_own_unit_is_backed_up_first (0.01s)
--- FAIL: TestR475_M_TheAgeRuleAppliesToTheChosenTier/a_stale_off-site_copy_is_backed_up_first (0.01s)
--- PASS: TestR475_M_TheAgeRuleAppliesToTheChosenTier/a_stale_second_drive_does_not_block_a_fresh_own_unit (0.01s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/stacks 0.032s
FAIL
exit=1
@@ -0,0 +1,19 @@
MUTATION in /mnt/5_hdd/felhom.eu/git/felhom-controller/controller/internal/backup/offbox_reconstitute.go:
- m.clearUpdateHoldAfterRestore(stack)
+ _ = stack
=== RUN TestR475_OffsiteRestoreClearsAnUpdateHold
[INFO] [settings] No settings.json found, using defaults
[INFO] [settings] Settings saved
[INFO] [settings] Added storage path: /tmp/TestR475_OffsiteRestoreClearsAnUpdateHold1546124815/001
[INFO] [settings] Settings saved
[WARN] [settings] restore hold SET for immich — the app stays stopped until it is cleared
[INFO] [settings] Settings saved
[WARN] [backup] immich is HELD STOPPED after a failed update (restore point: tier 3 "távoli mentés", 2026-09-13T11:00:00Z)
[INFO] [offbox] reconstituted immich from snapshot snap1: 3 file(s) placed, 0 volume(s) replayed, 0 DB dump(s) replayed, safety dump=., skewed=false
update_tiers_test.go:315: a successful off-site restore is the route back the hold names — the hold must be lifted
--- FAIL: TestR475_OffsiteRestoreClearsAnUpdateHold (3.00s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/backup 3.008s
FAIL
exit=1
@@ -0,0 +1,12 @@
MUTATION in /mnt/5_hdd/felhom.eu/git/felhom-controller/controller/internal/backup/update_guard.go:
- os.Chtimes(RecoveryUnitManifestPath(nsRoot, stackName), now, now)
+ os.Chtimes(RecoveryUnitManifestPath(nsRoot, stackName+".absent"), now, now)
=== RUN TestR475_PreBackupTail_Tier2FailureIsAWarnAndTheOwnUnitIsFresh
update_tiers_test.go:241: the own unit must read as proven NOW (mtime 2026-09-12 11:08:10.733138645 +0200 CEST, now 2026-09-13 17:08:10.733144378 +0200 CEST m=+0.001178047)
update_tiers_test.go:249: a successful Tier-2 copy must not WARN; log = "[WARN] [backup] update pre-backup for gokapi: could not mark the recovery unit as proven current (chtimes /tmp/TestR475_PreBackupTail_Tier2FailureIsAWarnAndTheOwnUnitIsFresh2878992753/001/backups/primary/gokapi.absent/manifest.json: no such file or directory) — its own-unit copy may read older than it is\n"
--- FAIL: TestR475_PreBackupTail_Tier2FailureIsAWarnAndTheOwnUnitIsFresh (0.00s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/backup 0.005s
FAIL
exit=1