second night: scratch guest 9202 built (R-481 CLOSED, persists); controller v0.242.0 delivered (R-487 R-491 R-490 R-476 R-456 CLOSED, R-489 re-scoped); R-492 filed; rotation restarted from bentopdf; morning note
gates / gates (push) Successful in 19s

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-09-13 23:06:21 +02:00
parent 72ee053a9e
commit 41590f8ee6
26 changed files with 586 additions and 46 deletions
@@ -0,0 +1,17 @@
=== scratch guest 9202 — first contact 2026-09-13T20:24:41Z ===
HTTP 200
{"ok":true,"data":[{"name":"actualbudget","meta":{"display_name":"ActualBudget","description":"Személyes pénzügyek és költségvetés kezelése","category":"finance","subdomain":"budget",
--- sync the catalog ---
HTTP 200
{"ok":true,"data":{"ok":true,"message":"Sablonok naprakészek — nincs változás"},"message":"Sablonok naprakészek — nincs változás"}
stacks known: 55 | deployed: []
--- guest facts ---
VMID Status Lock Name
9201 running demo-hp
9202 running demo-hp-scratch
felhom-controller filebrowser traefik
0
SCRATCH GUEST — R-481, operator ruling 2026-09-13 (option 1)
The nightly rotation throwaway host under the demo-hp customer. Hub OFF, tunnel OFF, agent OFF, off-site OFF.
@@ -0,0 +1,60 @@
=== NIGHT 2 — bentopdf as a customer on the SCRATCH guest 9202 — 2026-09-13T20:25:37Z ===
controller: gitea.dooplex.hu/admin/felhom-controller:0.241.0 | catalog pin: image: ghcr.io/alam00000/bentopdf:v2.8.6
--- install ---
HTTP 202 {"ok":true,"message":"Telepítés elindítva – az állapot a kártyán követhető"}
after: state=running updating=False phase=None err='' hold='' | ghcr.io/alam00000/bentopdf:v2.8.6 Up 14 seconds (healthy)
--- front door: GET / and the app's assets through traefik ---
GET / -> 200 text/html 72677
GET /index.html -> 301 text/html 169
USE: BentoPDF is a browser-side toolbox — every PDF is processed in the browser and never sent to the server. There is no data route and no API; nothing to put in and nothing to read back. Recorded, not faked.
--- backup through the backups page: backup now, then the 2nd copy ---
HTTP 200 {"ok":true,"message":"Mentés elindítva"}
idle after 5 s
HTTP 200 {"ok":true,"message":"2. mentés elindítva"}
/mnt/sys_drive/felhom-data/backups/primary/bentopdf:
2026-09-13T20:26 1864 compose/.felhom.yml
2026-09-13T20:26 291 compose/app.yaml
2026-09-13T20:26 1109 compose/docker-compose.yml
2026-09-13T20:26 1009 manifest.json
/mnt/felhom-drives/scratch_hdd/backups/secondary/bentopdf:
2026-09-13T20:26 1864 recovery-unit/compose/.felhom.yml
2026-09-13T20:26 1109 recovery-unit/compose/docker-compose.yml
2026-09-13T20:26 291 recovery-unit/compose/app.yaml
2026-09-13T20:26 1009 recovery-unit/manifest.json
2026-09-13T20:26 1 .felhom-tier2-layout
card: {"ok":true,"data":{"stack":"bentopdf","backup_paths":[{"path":"/mnt/sys_drive/felhom-data/backups/primary/bentopdf","size_bytes":12465,"size_human":"24K","exists":true},{"path":"/mnt/felhom-drives/scratch_hdd/backups/secondary/bentopdf","size_bytes":16562,"size_human":"32K","exists":true}],"has_back
--- disaster: remove with data, keep backups; the way back: Teljes visszaállítás (Tier 2) ---
HTTP 200 {"ok":true,"data":{"removed":"bentopdf","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 bentopdf removed"}
removed: state=not_deployed updating=False phase=None err='' hold='' | front door now: 404 text/plain; charset=utf-8 19
HTTP/2 302
location: /backups/apps?flash=Teljes+vissza%C3%A1ll%C3%ADt%C3%A1s+elindult+%E2%80%94+az+%C3%A1llapot+itt+friss%C3%BCl.
restore-status: {"running": false, "op": "tier2-unit-restore", "stack": "bentopdf", "started_at": "2026-09-13T20:26:23.141536724Z", "last": {"op": "tier2-unit-restore", "stack": "bentopdf", "ok": true, "message": "A(z) bentopdf: 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. A viss
after restore: state=running updating=False phase=None err='' hold='' | front door: 200 text/html 72677
--- guarded Update (same pin: no edge in the catalog) ---
--- POST /api/stacks/bentopdf/update at 2026-09-13T20:26:34Z ---
HTTP 202
{"ok":true,"data":{"accepted":true,"completed":false},"message":"Frissítés elindult – az állapot a kártyán követhető"}
+ 0s phase backing-up
+ 3s phase done
end (2026-09-13T20:26:38Z, +3s): state=running updating=False phase=done err='' hold=''
2026/09/13 20:26:35 update.go:391: [INFO] [stacks] update bentopdf: accepted — guarded update started
2026/09/13 20:26:35 update.go:820: [INFO] [stacks] update bentopdf: phase checking
2026/09/13 20:26:35 update.go:508: [INFO] [stacks] update bentopdf: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-13T20:26:23Z) (found: Tier 2 (second drive) at 2026-09-13T20:26:13Z (0s old); Tier 1 (own recovery unit) at 2026-09-13T20:26:07Z (
2026/09/13 20:26:35 update.go:820: [INFO] [stacks] update bentopdf: phase backing-up
2026/09/13 20:26:35 update.go:523: [INFO] [stacks] update bentopdf: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-13T20:26:35Z
2026/09/13 20:26:35 update.go:820: [INFO] [stacks] update bentopdf: phase safety-dump
2026/09/13 20:26:35 update.go:538: [INFO] [stacks] update bentopdf: safety dump done (0 file(s)) []
2026/09/13 20:26:35 update.go:820: [INFO] [stacks] update bentopdf: phase pinning
2026/09/13 20:26:35 pin.go:362: [INFO] [stacks] update bentopdf: pin advanced to the catalog's current definition (bentopdf=ghcr.io/alam00000/bentopdf:v2.8.6)
2026/09/13 20:26:35 update.go:820: [INFO] [stacks] update bentopdf: phase pulling
2026/09/13 20:26:35 update.go:820: [INFO] [stacks] update bentopdf: phase starting
2026/09/13 20:26:36 update.go:820: [INFO] [stacks] update bentopdf: phase verifying
2026/09/13 20:26:36 update.go:614: [INFO] [stacks] update bentopdf: healthy after 0s (the app's health check passed)
2026/09/13 20:26:36 update.go:620: [INFO] [stacks] update bentopdf: DONE in 1s
--- remove with data AND backups; drive clean? ---
HTTP 200 {"ok":true,"data":{"removed":"bentopdf","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.","backup_paths_removed":["/mnt/sys_drive/felhom-data/backups/primary/bentopdf (24K)","/mnt/felhom-drives/scratch_hdd/backups/secondary/bentopdf (16.2 KB)"]},"message":"Stack bentopdf removed"}
/mnt/sys_drive/felhom-data/backups/primary/bentopdf: ABSENT
/mnt/felhom-drives/scratch_hdd/backups/secondary/bentopdf: ABSENT
containers: 0 | prefs: None None | card: state=not_deployed updating=False phase=done err='' hold=''
=== done 2026-09-13T20:26:46Z ===
@@ -0,0 +1,54 @@
=== FLOOR RAISE: 0.242.0 with min_agent 0.129.0 (R-487 R-491 R-490 R-489 R-476) ===
T0 POST at 2026-09-13T20:51:13Z
HTTP/1.1 303 See Other
Location: /configuration?flash=floor_set
DB floor + declared: id="global-floor-input" name="min_controller_version" value="0.242.0" | name="min_agent" value="0.129.0" placeholder="MinAgent from |
demo-hp on 0.242.0 at 2026-09-13T20:51:30Z (+16s): gitea.dooplex.hu/admin/felhom-controller:0.242.0 Up 7 seconds (healthy)
demo-felhom on 0.242.0 at 2026-09-13T20:51:31Z (+17s): gitea.dooplex.hu/admin/felhom-controller:0.242.0 Up 10 seconds (healthy)
--- hub log since T0 (managed floor) ---
2026/09/13 22:51:14 [INFO] Global controller-version floor set to "0.242.0" (declared MinAgent "0.129.0")
2026/09/13 22:51:16 [INFO] managed floor SERVED for demo-felhom: floor 0.242.0, agent requirement "0.129.0" from declared (golden 0.236.0)
2026/09/13 22:51:17 [INFO] managed floor SERVED for demo-hp: floor 0.242.0, agent requirement "0.129.0" from declared (golden 0.236.0)
--- demo-hp: controller log (SetFloor / self-update / version) ---
2026/09/13 20:51:23 updater.go:96: [DEBUG] [selfupdate] VerifyStartup: checking update state in /opt/docker/felhom-controller/data
2026/09/13 20:51:23 updater.go:96: [DEBUG] [selfupdate] VerifyStartup: pending update found — target=0.242.0 previous=0.241.0
2026/09/13 20:51:23 updater.go:809: [INFO] [selfupdate] Post-update startup: update successful (0.241.0 → 0.242.0)
2026/09/13 20:51:23 main.go:655: [INFO] Self-update enabled (check every 6h, auto-update: false, auto-update time: 04:30)
2026/09/13 20:51:23 scheduler.go:102: [INFO] [scheduler] Registered periodic job: selfupdate-check (every 6h0m0s)
2026/09/13 20:51:23 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="selfupdate-check" interval=6h0m0s totalJobs=18
2026/09/13 20:51:23 offsiteapply.go:151: [INFO] [offsite-apply] settle-gate: awaiting floor knowledge (first report ACK) before offsite apply
2026/09/13 20:51:24 client.go:67: [DEBUG] [agentapi] agent version seen: 0.130.0 (was "")
2026/09/13 20:51:28 builder.go:40: [DEBUG] [report] BuildReport: starting — version=0.242.0, storagePaths=1
2026/09/13 20:51:29 updater.go:96: [DEBUG] [selfupdate] SetFloor: floor "" → "0.242.0"
2026/09/13 20:51:29 updater.go:96: [DEBUG] [selfupdate] maybeAutoUpdate: current 0.242.0 >= floor 0.242.0 — no action
2026/09/13 20:51:33 offsiteapply.go:151: [INFO] [offsite-apply] settle-gate: GO — at/above floor 0.242.0 (we are 0.242.0), no managed update running
--- demo-hp: bootstrap service journal ---
Sep 13 20:51:22 demo-hp systemd[1]: felhom-controller-bootstrap.service: Deactivated successfully.
Sep 13 20:51:22 demo-hp systemd[1]: Stopped felhom-controller-bootstrap.service - Felhom controller bootstrap (deploy the baked controller from the agent-populated config mount).
Sep 13 20:51:22 demo-hp systemd[1]: Stopping felhom-controller-bootstrap.service - Felhom controller bootstrap (deploy the baked controller from the agent-populated config mount)...
Sep 13 20:51:22 demo-hp systemd[1]: Starting felhom-controller-bootstrap.service - Felhom controller bootstrap (deploy the baked controller from the agent-populated config mount)...
Sep 13 20:51:22 demo-hp felhom-controller-bootstrap.sh[2438508]: [ctrl-bootstrap] deploying gitea.dooplex.hu/admin/felhom-controller:0.242.0 from /etc/felhom-bootstrap/bootstrap.json (hostname=demo-hp)
Sep 13 20:51:22 demo-hp felhom-controller-bootstrap.sh[2438582]: 9e9e3a9987db6cab7c7d8d413a64ce73695fe5b9f090f554022ab02520ebe0b7
Sep 13 20:51:23 demo-hp felhom-controller-bootstrap.sh[2438508]: [ctrl-bootstrap] controller started
Sep 13 20:51:23 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 20:51:22 [INFO] [selfupdate] Post-update startup: update successful (0.241.0 → 0.242.0)
2026/09/13 20:51:22 [INFO] Self-update enabled (check every 6h, auto-update: false, auto-update time: 04:30)
2026/09/13 20:51:22 [INFO] [scheduler] Registered periodic job: selfupdate-check (every 6h0m0s)
2026/09/13 20:51:22 [INFO] [offsite-apply] settle-gate: awaiting floor knowledge (first report ACK) before offsite apply
2026/09/13 20:51:32 [INFO] [offsite-apply] settle-gate: GO — at/above floor 0.242.0 (we are 0.242.0), no managed update running
--- demo-felhom: bootstrap service journal ---
Sep 13 20:51:21 demo-felhom systemd[1]: felhom-controller-bootstrap.service: Deactivated successfully.
Sep 13 20:51:21 demo-felhom systemd[1]: Stopped felhom-controller-bootstrap.service - Felhom controller bootstrap (deploy the baked controller from the agent-populated config mount).
Sep 13 20:51:21 demo-felhom systemd[1]: Stopping felhom-controller-bootstrap.service - Felhom controller bootstrap (deploy the baked controller from the agent-populated config mount)...
Sep 13 20:51:21 demo-felhom systemd[1]: Starting felhom-controller-bootstrap.service - Felhom controller bootstrap (deploy the baked controller from the agent-populated config mount)...
Sep 13 20:51:21 demo-felhom felhom-controller-bootstrap.sh[3573553]: [ctrl-bootstrap] deploying gitea.dooplex.hu/admin/felhom-controller:0.242.0 from /etc/felhom-bootstrap/bootstrap.json (hostname=demo-felhom)
Sep 13 20:51:21 demo-felhom felhom-controller-bootstrap.sh[3573602]: eaa532876b7d3df1f2ab46965d08245f2b3eaff97f8ba9b4f6d93e799876a38f
Sep 13 20:51:21 demo-felhom felhom-controller-bootstrap.sh[3573553]: [ctrl-bootstrap] controller started
Sep 13 20:51:21 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-13T20:51:13Z {'demo-hp': ('2026-09-13T20:51:30Z', 16), 'demo-felhom': ('2026-09-13T20:51:31Z', 17)} not done: []
@@ -0,0 +1,90 @@
=== v0.242.0 LIVE on the scratch guest 9202 — 2026-09-13T20:52:22Z ===
controller: gitea.dooplex.hu/admin/felhom-controller:0.242.0 Up 35 seconds (healthy)
--- R-490: GET /api/system/info (the monitoring card's fetch) ---
HTTP HTTP 200 | hdd_configured=True hdd_total_gb=937.8 used_mem_mb=0
--- install opengist (throwaway) ---
HTTP 202 {"ok":true,"message":"Telepítés elindítva – az állapot a kártyán követhető"}
after: state=running updating=False phase=None err='' hold='' | front door: 302 0
--- backup now → the primary unit ---
HTTP 200 {"ok":true,"message":"Mentés elindítva"}
idle after 5 s
/mnt/sys_drive/felhom-data/backups/primary/opengist:
2026-09-13T20:52 1941 compose/.felhom.yml
2026-09-13T20:52 292 compose/app.yaml
2026-09-13T20:52 1260 compose/docker-compose.yml
2026-09-13T20:52 181248 volume-dumps/opengist_opengist_data.tar
2026-09-13T20:52 1041 manifest.json
/mnt/felhom-drives/scratch_hdd/backups/secondary/opengist: ABSENT
--- R-491: seed an UPDATE hold (settings file edit on the scratch guest + controller restart; the hold's origin is not what is under test) ---
positive control — held: state=running updating=False phase=None err='' hold='A(z) opengist frissítése 2026-09-13 22:52-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 22:52 — ez a másolat a'
settings has hold: True
--- R-489 + R-491: remove with data, KEEP backups ---
HTTP HTTP 409
volumes_removed=None backup_paths_removed=None hdd_paths_removed=None
log:
after removal: state=running updating=False phase=None err='' hold='A(z) opengist frissítése 2026-09-13 22:52-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 22:52 — ez a másolat a' | settings still has hold: True
docker volume ls: opengist_opengist_data
--- R-487: the removed app on the two pages and the picker API ---
/backups/apps has the row: False | Megtartva badge: False | restore form: False
row says last backup: None
GET /api/backup/snapshots → HTTP 200 {"ok":true,"data":[{"time":"2026-09-13T20:52:42Z","short_id":"helyi","tier":1,"drive_label":"Belső SSD (rendszer)"}]}
/backups/restore picker lists it: False
--- R-487: Visszaállítás a mentésből (POST /backup/restore, the row's button) ---
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: {"running": false, "op": "restore", "stack": "opengist", "started_at": "2026-09-13T20:53:18.897214019Z", "last": {"op": "restore", "stack": "opengist", "ok": true, "message": "A(z) opengist: 1 adatkötet visszaállítva — az alkalmazás újraindult.", "finished_at": "2026-09-13T20:53:28.201829063Z"}, "last_recent": true}
after restore: state=running updating=False phase=None err='' hold='' | front door: 302 0
log: 2026/09/13 20:53:28 handlers.go:1542: [INFO] [web] Restore completed (async): stack=opengist in 9.304495819s (volumes 1/1, dbs 0/0)
--- R-476: two captures, one definition → the Tier-2 date must be the DATA's ---
HTTP 200 {"ok":true,"message":"Mentés elindítva"}
capture A manifest
HTTP 200 {"ok":true,"message":"Mentés elindítva"}
capture B manifest (same = definition unchanged)
newest dump: -rw-r--r-- 1 root root 181248 2026-09-13T20:54Z opengist_opengist_data.tar
HTTP 200 {"ok":true,"message":"2. mentés elindítva"}
/mnt/sys_drive/felhom-data/backups/primary/opengist:
2026-09-13T20:52 1941 compose/.felhom.yml
2026-09-13T20:52 292 compose/app.yaml
2026-09-13T20:52 1260 compose/docker-compose.yml
2026-09-13T20:54 181248 volume-dumps/opengist_opengist_data.tar
2026-09-13T20:52 1041 manifest.json
/mnt/felhom-drives/scratch_hdd/backups/secondary/opengist:
2026-09-13T20:52 1941 recovery-unit/compose/.felhom.yml
2026-09-13T20:52 1260 recovery-unit/compose/docker-compose.yml
2026-09-13T20:52 292 recovery-unit/compose/app.yaml
2026-09-13T20:54 181248 recovery-unit/volume-dumps/opengist_opengist_data.tar
2026-09-13T20:52 1041 recovery-unit/manifest.json
2026-09-13T20:54 1 .felhom-tier2-layout
Tier-2 unit confirm sentences on the page: []
--- teardown: remove with data AND backups ---
HTTP HTTP 409
volumes_removed=None backup_paths_removed=None
/mnt/sys_drive/felhom-data/backups/primary/opengist:
2026-09-13T20:52 1941 compose/.felhom.yml
2026-09-13T20:52 292 compose/app.yaml
2026-09-13T20:52 1260 compose/docker-compose.yml
2026-09-13T20:54 181248 volume-dumps/opengist_opengist_data.tar
2026-09-13T20:52 1041 manifest.json
/mnt/felhom-drives/scratch_hdd/backups/secondary/opengist:
2026-09-13T20:52 1941 recovery-unit/compose/.felhom.yml
2026-09-13T20:52 1260 recovery-unit/compose/docker-compose.yml
2026-09-13T20:52 292 recovery-unit/compose/app.yaml
2026-09-13T20:54 181248 recovery-unit/volume-dumps/opengist_opengist_data.tar
2026-09-13T20:52 1041 recovery-unit/manifest.json
2026-09-13T20:54 1 .felhom-tier2-layout
volumes left: opengist_opengist_data
/backups/apps still lists it: True | Megtartva anywhere: False
settings restore_holds: none
=== done 2026-09-13T20:55:01Z ===
live-rc=0
@@ -0,0 +1,75 @@
=== v0.242.0 LIVE on 9202, second pass (the first was refused 409: a running app must be stopped before removal) — 2026-09-13T20:56:25Z ===
controller: gitea.dooplex.hu/admin/felhom-controller:0.242.0 Up 3 minutes (healthy) | state=running updating=False phase=None err='' hold=''
--- R-491: seed an UPDATE hold (settings file edit + controller restart; the hold's ORIGIN is not what is under test) ---
positive control — held: A(z) opengist frissítése 2026-09-13 22:56-kor nem sikerült, és az alkalmazás nem indult el az új verzióval. Az alkalmazá | settings has hold: True
--- R-489 + R-491: stop, then remove with data, KEEP backups ---
stop: HTTP 200 {"ok":true,"message":"Stack opengist stop completed"}
HTTP 200
volumes_removed=[] backup_paths_removed=None hdd_paths_removed=[]
log: 2026/09/13 20:56:57 router.go:916: [INFO] [api] remove opengist: its update hold is cleared with it (R-491)
after removal: state=not_deployed updating=False phase=None err='' hold='' | settings still has hold: False
docker volume ls: none
/mnt/sys_drive/felhom-data/backups/primary/opengist:
2026-09-13T20:52 1941 compose/.felhom.yml
2026-09-13T20:52 292 compose/app.yaml
2026-09-13T20:52 1260 compose/docker-compose.yml
2026-09-13T20:54 181248 volume-dumps/opengist_opengist_data.tar
2026-09-13T20:52 1041 manifest.json
/mnt/felhom-drives/scratch_hdd/backups/secondary/opengist:
2026-09-13T20:52 1941 recovery-unit/compose/.felhom.yml
2026-09-13T20:52 1260 recovery-unit/compose/docker-compose.yml
2026-09-13T20:52 292 recovery-unit/compose/app.yaml
2026-09-13T20:54 181248 recovery-unit/volume-dumps/opengist_opengist_data.tar
2026-09-13T20:52 1041 recovery-unit/manifest.json
2026-09-13T20:54 1 .felhom-tier2-layout
--- R-487: the removed app on the two pages and the picker API ---
/backups/apps row: True | Megtartva badge: True | restore form: True
row says last backup: 2026-09-13 22:54
GET /api/backup/snapshots → HTTP 200 {"ok":true,"data":[{"time":"2026-09-13T20:54:42Z","short_id":"helyi","tier":1,"drive_label":"Belső SSD (rendszer)"}]}
/backups/restore picker lists it: True
--- R-487: Visszaállítás a mentésből (the row's button = POST /backup/restore) ---
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: {"op": "restore", "stack": "opengist", "ok": true, "message": "A(z) opengist: 1 adatkötet visszaállítva — az alkalmazás újraindult.", "finished_at": "2026-09-13T20:57:13.803999331Z"}
after restore: state=running updating=False phase=None err='' hold='' | front door: 302 0
log: 2026/09/13 20:57:13 handlers.go:1542: [INFO] [web] Restore completed (async): stack=opengist in 9.118788015s (volumes 1/1, dbs 0/0)
row is a normal deployed row again (no Megtartva): True
--- R-476: two captures under one definition → the Tier-2 date must be the DATA's ---
HTTP 200 {"ok":true,"message":"Mentés elindítva"}
capture A manifest "created_at": "2026-09-13T20:52:42Z" at 2026-09-13T20:57:22Z
HTTP 200 {"ok":true,"message":"Mentés elindítva"}
capture B manifest "created_at": "2026-09-13T20:52:42Z" at 2026-09-13T20:58:34Z (same = definition unchanged)
newest dump: -rw-r--r-- 1 root root 181248 2026-09-13T20:58:28Z opengist_opengist_data.tar
HTTP 200 {"ok":true,"message":"2. mentés elindítva"}
/mnt/sys_drive/felhom-data/backups/primary/opengist:
2026-09-13T20:52 1941 compose/.felhom.yml
2026-09-13T20:52 292 compose/app.yaml
2026-09-13T20:52 1260 compose/docker-compose.yml
2026-09-13T20:58 181248 volume-dumps/opengist_opengist_data.tar
2026-09-13T20:52 1041 manifest.json
/mnt/felhom-drives/scratch_hdd/backups/secondary/opengist:
2026-09-13T20:52 1941 recovery-unit/compose/.felhom.yml
2026-09-13T20:52 1260 recovery-unit/compose/docker-compose.yml
2026-09-13T20:52 292 recovery-unit/compose/app.yaml
2026-09-13T20:58 181248 recovery-unit/volume-dumps/opengist_opengist_data.tar
2026-09-13T20:52 1041 recovery-unit/manifest.json
2026-09-13T20:58 1 .felhom-tier2-layout
Tier-2 unit confirm for opengist: második meghajtón lévő másolattal. Ami a másolat óta keletkezett, elveszik. A másolat kelte: 2026-09-13 22:58. A mellette lévő „Fájlok visszaállítása” ezzel szemben csak a hiányzó fájlokat pótolja, és semmit nem ír felül. Az alkalmazás a művelet idejére leáll.
--- teardown: stop, remove with data AND backups ---
stop: HTTP 200 {"ok":true,"message":"Stack opengist stop completed"}
HTTP 200
volumes_removed=[] backup_paths_removed=['/mnt/sys_drive/felhom-data/backups/primary/opengist (208K)', '/mnt/felhom-drives/scratch_hdd/backups/secondary/opengist (197.4 KB)']
/mnt/sys_drive/felhom-data/backups/primary/opengist: ABSENT
/mnt/felhom-drives/scratch_hdd/backups/secondary/opengist: ABSENT
volumes left: none
/backups/apps still lists it: False | Megtartva anywhere: False
settings restore_holds: none
docker ps: felhom-controller filebrowser traefik
=== done 2026-09-13T20:58:52Z ===
@@ -0,0 +1,19 @@
=== R-489 cause on 9202 — 2026-09-13T21:01:40Z ===
A) fresh compose-created volume
HTTP 202 {"ok":true,"message":"Telepítés elindítva – az állapot a kártyán követhető"}
labels: {"com.docker.compose.config-hash":"5f89c3baba6dff6769fa699a804f2c56a643af979b55241e2af324dfde6be51c","com.docker.compose.project":"opengist","com.docker.compose.version":"5.5.0","com.docker.compose.volume":"opengist_data"}
remove-all → HTTP 200 ["opengist_opengist_data"]
left: none
B) volume recreated by a unit restore
HTTP 202 {"ok":true,"message":"Telepítés elindítva – az állapot a kártyán követhető"}
HTTP 200 {"ok":true,"message":"Mentés elindítva"}
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: A(z) opengist: 1 adatkötet visszaállítva — az alkalmazás újraindult.
labels: null
remove-all → HTTP 200 []
left: none
units: /mnt/sys_drive/felhom-data/backups/primary/opengist: ABSENT
/mnt/felhom-drives/scratch_hdd/backups/secondary/opengist: ABSENT
=== done 2026-09-13T21:02:40Z ===
@@ -0,0 +1,11 @@
MUTATION in internal/backup/tier2_restore.go:
- if !c.UnitLegPreserved && c.UnitDataDate != "" && c.UnitDataDate > c.UnitPackageDate {
+ if false && !c.UnitLegPreserved && c.UnitDataDate != "" && c.UnitDataDate > c.UnitPackageDate {
=== RUN TestR476_UnitRestoreDateNamesTheDataTimeWhenTheLegWasRefreshed
r476_unit_data_date_test.go:13: refreshed leg: got "2026-09-12T02:15:29Z" preserved=false, want the dump's time
--- FAIL: TestR476_UnitRestoreDateNamesTheDataTimeWhenTheLegWasRefreshed (0.00s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/backup 0.005s
FAIL
exit=1
@@ -0,0 +1,20 @@
MUTATION in internal/backup/removed_units.go:
- if m.stackProvider == nil {
return nil
}
deployed
+ if m.stackProvider == nil || true {
return nil
}
deployed
=== RUN TestR487_ListRemovedAppUnits_ListsKeptUnitsOfUndeployedApps
[INFO] [settings] No settings.json found, using defaults
[INFO] [settings] Added storage path: /tmp/TestR487_ListRemovedAppUnits_ListsKeptUnitsOfUndeployedApps3160582406/004
[INFO] [settings] Settings saved
r487_removed_units_test.go:88: want [drive-app gone-app], got []
--- FAIL: TestR487_ListRemovedAppUnits_ListsKeptUnitsOfUndeployedApps (0.00s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/backup 0.007s
FAIL
exit=1
@@ -0,0 +1,12 @@
MUTATION in internal/backup/restore_points.go:
- if u, found := m.RemovedAppUnitFor(stackName); found {
+ if u, found := m.RemovedAppUnitFor(stackName); found && false {
=== RUN TestR487_ListRestorePointsFindsARemovedAppsUnit
[INFO] [settings] No settings.json found, using defaults
r487_removed_units_test.go:112: want found with one point, got found=false pts=[]
--- FAIL: TestR487_ListRestorePointsFindsARemovedAppsUnit (0.00s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/backup 0.006s
FAIL
exit=1
@@ -0,0 +1,11 @@
MUTATION in internal/web/templates/backups_restore.html:
- <option value="{{.StackName}}" data-removed="true"
+ <option value="{{.StackName}}" data-gone="true"
=== RUN TestR487_RestorePickerListsRemovedApps
r487_removed_row_test.go:46: removed app must be an option in the picker
--- FAIL: TestR487_RestorePickerListsRemovedApps (0.03s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/web 0.038s
FAIL
exit=1
@@ -0,0 +1,16 @@
MUTATION in internal/backup/restore_unit.go:
- if u, found := m.RemovedAppUnitFor(stackName); found {
return u.UnitDir
+ if u, found := m.RemovedAppUnitFor(stackName); found && false {
return u.UnitDir
=== RUN TestR487_PrimaryUnitDirForNamesTheRemovedUnitWhereItSits
[INFO] [settings] No settings.json found, using defaults
[INFO] [settings] Added storage path: /tmp/TestR487_PrimaryUnitDirForNamesTheRemovedUnitWhereItSits2078383903/004
[INFO] [settings] Settings saved
r487_removed_units_test.go:133: unit dir: got /tmp/TestR487_PrimaryUnitDirForNamesTheRemovedUnitWhereItSits2078383903/001/felhom-data/backups/primary/drive-app want /tmp/TestR487_PrimaryUnitDirForNamesTheRemovedUnitWhereItSits2078383903/004/backups/primary/drive-app
--- FAIL: TestR487_PrimaryUnitDirForNamesTheRemovedUnitWhereItSits (0.00s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/backup 0.006s
FAIL
exit=1
@@ -0,0 +1,15 @@
MUTATION in internal/web/handlers.go:
- for _, u := range s.backupMgr.ListRemovedAppUnits() {
rows = append(rows, AppBackupRow{
+ for _, u := range s.backupMgr.ListRemovedAppUnits() {
_ = u
continue
rows = append(rows, AppBackupRow{
=== RUN TestR487_BuildAppBackupRowsAppendsRemovedApps
r487_removed_row_test.go:109: want one removed row for gone-app, got []
--- FAIL: TestR487_BuildAppBackupRowsAppendsRemovedApps (0.00s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/web 0.007s
FAIL
exit=1
@@ -0,0 +1,11 @@
MUTATION in internal/web/templates/backups_apps.html:
- <input type="hidden" name="snapshot_id" value="helyi">
+
=== RUN TestR487_BackupsPageListsARemovedAppWithItsRestore
r487_removed_row_test.go:28: removed row must render "name=\"snapshot_id\" value=\"helyi\""
--- FAIL: TestR487_BackupsPageListsARemovedAppWithItsRestore (0.02s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/web 0.032s
FAIL
exit=1
@@ -0,0 +1,15 @@
MUTATION in /mnt/5_hdd/felhom.eu/git/felhom-controller/controller/internal/stacks/delete.go:
- removed := []string{}
for _, v := range before {
+ var removed []string
for _, v := range before {
=== RUN TestR489_RemovedVolumesIsADifferenceAndNeverNull
r489_volumes_removed_test.go:20: no volumes must read as [] — got {"removed":"","volumes_removed":null,"hdd_paths_removed":null,"hdd_paths_preserved":null}
--- FAIL: TestR489_RemovedVolumesIsADifferenceAndNeverNull (0.00s)
=== RUN TestR489_ProjectVolumesReadsTheDockerListing
--- PASS: TestR489_ProjectVolumesReadsTheDockerListing (0.00s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/stacks 0.008s
FAIL
exit=1
@@ -0,0 +1,11 @@
MUTATION in /mnt/5_hdd/felhom.eu/git/felhom-controller/controller/cmd/controller/main.go:
- mux.Handle("/api/system/info", webServer.RequireAuth(webServer.CsrfProtect(http.HandlerFunc(apiRouter.ServeHTTP))))
+ _ = 0 // RED-PROOF: exact mount removed
=== RUN TestR490_SystemInfoIsMountedAheadOfTheWebPrefix
r475_wiring_test.go:111: /api/system/info must be mounted on the API router ahead of the web layer's /api/system/ prefix (R-490)
--- FAIL: TestR490_SystemInfoIsMountedAheadOfTheWebPrefix (0.01s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/cmd/controller 0.016s
FAIL
exit=1
@@ -0,0 +1,11 @@
MUTATION in internal/api/router.go:
- if p := r.sett.GetDefaultStoragePath(); p != "" {
+ if p := r.sett.GetDefaultStoragePath(); p != "" && false {
=== RUN TestR490_SystemInfoFallsBackToTheDefaultStoragePath
r474_remove_wiring_test.go:119: hdd_configured must be true with a default storage path registered; body {"ok":true,"data":{"sync_status":null,"system":{"total_mem_mb":64272,"used_mem_mb":0,"avail_mem_mb":64272,"mem_percent":0,"disk_total_gb":444.60704803466797,"disk_used_gb":215.30562591552734,"disk_avail_gb":206.64654159545898,"disk_percent":48.42604876986543,"disk_known":true,"hdd_configured":false,"hdd_known":false,"cpu_percent":0,"load_avg_1":4.9,"load_avg_5":4.46,"load_avg_15":4.54,"temperature_celsius":48,"temperature_source":"x86_pkg_temp"}}}
--- FAIL: TestR490_SystemInfoFallsBackToTheDefaultStoragePath (0.15s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/api 0.158s
FAIL
exit=1
@@ -0,0 +1,11 @@
MUTATION in /mnt/5_hdd/felhom.eu/git/felhom-controller/controller/internal/api/router.go:
- if cleared, err := r.sett.ClearUpdateHold(name); err != nil {
+ if cleared, err := false, error(nil); err != nil {
=== RUN TestR491_RemovalClearsTheUpdateHold
r474_remove_wiring_test.go:87: removeStack must clear the app's update hold (R-491), or a reinstall starts held
--- FAIL: TestR491_RemovalClearsTheUpdateHold (0.00s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/api 0.011s
FAIL
exit=1