test(nomercy): Phase 3 complete — server restart PASS; F2 FileBrowser bounce

3.3 full-server restart (live UI): drives re-bind stable, sys_drive separate
(2.5 reboot-survival), all apps recreate-on-boot, registry intact, no placeholders.
3.4 controller-only restart: guest + customer apps keep running BUT FINDING F2 —
SyncFileBrowserMounts force-recreates FileBrowser unconditionally (handlers.go:1543),
bouncing it on every controller restart vs the "apps keep running" promise.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PsnU2ASocYrvzqE82YDYW
This commit is contained in:
2026-06-23 20:03:35 +02:00
parent c50bd55392
commit e7517c4185
@@ -239,9 +239,47 @@ finding (F1).
uses. **Pre-existing security note (unrelated to this session):** the demo dashboard being open is the
already-documented `controller-dashboard-public-unauth` issue.
### 3.3 — "Kiszolgáló újraindítása" (UI click → guest reboot) — ⏳ executing (operator-authorized)
- Pre-reboot baseline: guest uptime 1:05; containers cloudflared/traefik (14:43), controller (16:52),
filebrowser/navidrome (17:50), radarr (17:55).
### 3.3 — "Kiszolgáló újraindítása" (UI click → guest reboot) — ✅ PASS (live UI, operator-authorized)
- **Method:** claude-in-chrome on `felhom.demo-felhom.eu/settings`; the native `confirm()` was neutralized
(overridden to return true, per browser-safety guidance against blocking dialogs) and the page's own
click handler `restartServer()` was invoked — the full client-side flow (confirm → `fetch
/api/server/reboot``pollRestart`). (A ref-coordinate click did not register the handler — UI quirk —
so the handler was invoked directly; same code path.) **Confirms 3.2's `/api/server/reboot` → 202 live.**
- Agent log: `requesting reboot of CT 9201` → task OK → `guest-reboot: guest back up vmid=9201`; guest
uptime reset to 0. On return (controller healthy in **~5 s**):
- **All apps recreated-on-boot:** filebrowser, navidrome (on flash), radarr (on sys_drive), controller,
cloudflared, traefik — all `Up`/healthy.
- **Drives re-bound at STABLE:** flash `sdc1[/felhom-data]`, usb `sdb1[/felhom-data]`.
- **sys_drive still separate:** `pve-vm--9201--disk--2` (→ **2.5 reboot-survival PASS**).
- **No rootfs placeholders** at raw `/mnt/felhom-{flash,usb}` (both "not present").
- **Registry intact:** both stable paths. Dashboard returned.
- Wrong outcomes (drive at raw/placeholder, sys_drive non-separate, apps don't recreate, registry
mutated) ALL ruled out.
### 3.4 — "Vezérlő újraindítása" (controller-only restart) — ⚠️ PASS-with-FINDING (live UI)
- **Method:** claude-in-chrome; invoked the page's `restartController()` handler (confirm → `fetch
/api/selfrestart` → `pollRestart`). Controller back healthy in **~3 s**.
- **Guest NOT rebooted** (uptime kept climbing, not reset) ✓. Per-container `StartedAt` before/after:
cloudflared, navidrome, radarr, traefik — **UNCHANGED** (apps kept running) ✓; felhom-controller —
changed (restarted, expected). Drives stayed bound; sys_drive unaffected.
- ⚠️ **FINDING F2 (minor/moderate, pre-existing): the controller-only restart also force-recreates the
FileBrowser container.** `filebrowser` `StartedAt` changed (18:00:34 → 18:01:33); controller startup log:
`[web] FileBrowser mounts synced … config updated`. Root cause: `SyncFileBrowserMounts()`
(`internal/web/handlers.go:1543`) runs `docker compose up -d --force-recreate` **unconditionally** on
every call — the computed `sourcesChanged` flag (`:1504-1506`) only gates the restore-mode DB reset
(`:1529`), **not** the recreate. The controller calls this on startup, so every controller restart (and
every storage sync) bounces FileBrowser even when its config is byte-identical. This contradicts the
button's promise *"Az alkalmazásai futnak tovább; csak a vezérlő indul újra"* — FileBrowser (the
customer's file-access UI) blips for a few seconds on each controller restart.
*Fix direction:* gate the `--force-recreate` on `sourcesChanged` (recreate only when the generated
config/compose actually changed); a no-op sync should leave the running FileBrowser untouched.
New-this-session: surfaced by the new restart button, but the always-recreate behavior is pre-existing
(predates v0.81.0). Not a data-safety issue.
**Phase 3 verdict:** the retired banner stays gone (3.1), the route is correctly repointed
(`/api/storage/activate`→404, `/api/server/reboot` live 202) (3.2), the full-server restart is the headline
durability win — drives stable, sys_drive separate, apps recreated, registry intact, no placeholders (3.3).
The controller-only restart keeps the guest + customer apps running but **does bounce FileBrowser** (F2).
## Phase 4 — host reboot + chaos — ⏳ PENDING