3.8 KiB
REPORT — live-drive Batch 1 (+F17) → controller v0.61.0 (2026-06-14)
Implemented the controller-side fixes from LIVE-DRIVE-FIXSPEC-2026-06-14.md (Batch 1 + the CRITICAL
F17), shipped as v0.61.0 to demo guest 9201. Each fix has a regression test that fails on the
pre-fix code; the authoritative go build && go vet && go test ./... is green on the Linux build server.
Fixes (each its own commit)
| Finding | Sev | Change | Test | Live-verified |
|---|---|---|---|---|
| F17 | CRIT | per-app restore now replays the captured .sql dump (new appbackup.ImportDump + backup.reimportDBDumps), AFTER volume restore so the dump wins; volume/DB failures now surface |
restore_db_test.go (injectable seams) |
marker DB round-trip PASSED on romm |
| F1 | HIGH | guest RAM cap from docker info (daemon runs in LXC); deploy guard "used" = committed memory |
info_cgroup_test.go (cgroup + docker-info paths) |
total_mem_mb=2048 (was 15771) |
| F20-BUG1 | HIGH | agentapi.FormatDisk surfaces non-2xx/ok:false instead of zero-value success |
disks_test.go (502→err) |
unit |
| F5 (catalog) | HIGH | uptime-kuma healthcheck → v2 extra/healthcheck binary + 180s start_period |
— (catalog) | uptime-kuma healthy → route 302 (was 404) |
| F5 (dashboard) | HIGH | routeUnpublished helper + distinct indicator for unhealthy/restarting deployed apps |
route_unpublished_test.go |
render test |
| F8 | LOW-MED | controller.yaml persisted 0600 (holds infra tokens) |
config_perms_test.go |
unit (Linux) |
| F6 | LOW | deploy POST → 202 + "Telepítés elindítva" (was "deployed" before compose) | — | code/UI |
| F7 | LOW | status-refresh 30s → 10s |
— | cadence |
| F4 | TRIV | GET /api/stacks/rescan → 405 + Allow: POST |
— | → 405 |
Key implementation notes
- F17 reuse decision:
ImportDumplives ininternal/appbackup(the DB-domain package withDiscoverDatabases/DumpOne/getMariaDBPassword), NOT reusingappexport's unexported copies —appexport→appbackupalready exists, so the reverse would import-cycle.DiscoveredDBcarries the live container's own creds, so no env threading. Precedence: replay runs after volume restore →.sqlwins. - F1 reroot: the FIXSPEC's cgroup-limit approach was a no-op on the demo (the container's own
cgroup is unlimited; the 2 GB cap is on the LXC ancestor, hidden; no lxcfs in the container). The
working source is
docker infoMemTotal. The deploy guard's "used" switched from host RSS (not per-guest observable) to the controller's committed-memory accounting.
Deploy & verification
- Built+pushed
gitea.dooplex.hu/admin/felhom-controller:0.61.0; deployed via the guest-9201 golden/bootstrap mechanism (/etc/felhom-controller-image+ restart bootstrap). Healthy,/api/health- dashboard 200, no startup errors.
- Live-verified: F1 (
total_mem_mb=2048), F4 (405), F5 (uptime-kuma healthy → route 302), F17 (marker row dropped after backup was restored by/backup/restore).
Test approach
Controller code is largely //go:build linux; dev host is Windows. Per-commit gate =
CGO_ENABLED=0 GOOS=linux go build && go vet locally (compiles code + tests); authoritative
go test ./... ran on the Linux build server (all green, incl. the linux system tests).
Not in this batch (SUPERVISED, next session — agent/golden)
F9 (HDD provisioning/guest-attach + reporting), F20-BUG2 (durable_id scheme), F20-BUG3 (async mkfs). These touch the host agent, golden template, and bring-up (blast radius beyond the disposable demo).
Final state
Demo guest 9201 on :0.61.0, healthy; agent unchanged. Apps: actualbudget, gokapi, mealie, privatebin,
romm(+db,+redis), uptime-kuma (now healthy), vikunja — all healthy. felhom-usb still not attached to
the guest (F9, deferred).