Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017PsnU2ASocYrvzqE82YDYW
7.0 KiB
REPORT — v0.40.0: SSD user-data volume (/mnt/sys_drive, mp1) — the third CT-volume split
Task: add a third CT volume (mp1 @ /mnt/sys_drive, backup=1) baked into the golden + grown
at provision (-sysdata-grow), so the controller's system_data_path becomes a separate, PBS-covered
mount and the "not a separate drive" warning clears with zero controller change. Option A (static
CT volume, NOT the enrolled-drive intent machinery).
1. Baselines
- felhom-agent
main@b908b9a(= spec'sb908b9a8e), version v0.39.0 → v0.40.0. - Currently-deployed in-guest controller:
felhom-controller:0.77.0(spec guessed 0.76.0; actual is 0.77.0 — this is theCONTROLLER_IMAGEthe golden must bake). - felhom-controller untouched (it already expects
/mnt/sys_drive+ warns viasystem.IsMountPoint).
2. Files modified (felhom-agent only)
configs/build-golden.sh—--mp1 ...,mp=/mnt/sys_drive,backup=1(envGOLDEN_SYSDATA_GB=8);findmnt /mnt/sys_driveseparate-mount guard; vzdump-inclusion guard now aborts if mp0 OR mp1 excluded (the B3 trap), with the mirrored WARN-if-unconfirmed.internal/reconcile/bringup.go—const DefaultSysDataMount = "mp1";BringUpSpec.{SysDataGrowGB, SysDataMount}; new "4c" online grow-onlyResizeLXCblock mirroring the "4b" Docker-data grow.cmd/felhom-agent/main.go—-sysdata-grow/-sysdata-mountflags;bringUpSizing.{SysDataGrowGB, SysDataMount}; wired at all three sites (the two--selftest=bring-updispatch/spec paths + the--selftest=provisionspec); version0.40.0;--selftest=provisionhelp text updated.internal/reconcile/bringup_test.go—TestRunBringUp_StorageSplit_SysDataGrow+…_SysDataGrowZeroNoResize.CHANGELOG.md(v0.40.0 entry, newest on top),RUNBOOK-provisioning-storage.md(three-volume layout), thisREPORT.md.
3. Commits pushed to main
459dad9— v0.40.0: third CT volume +-sysdata-grow(code + tests + CHANGELOG + RUNBOOK).- (REPORT.md commit follows.)
4. Tests + red-proofs
go build ./... && go vet ./... && go test ./...— green (reconcile + cmd + all packages).- Pre-existing unrelated flake:
internal/escrow/TestGenerateRecoveryCode_EntropyAndFormat(random 10/11-word count) — passes on re-run; not touched by this change.
- Pre-existing unrelated flake:
TestRunBringUp_StorageSplit_SysDataGrow: PASS — fake api recordsResizeLXC(8051,"mp1","+42G")alongsidemp0 +240G.TestRunBringUp_StorageSplit_SysDataGrowZeroNoResize: PASS —SysDataGrowGB=0⇒ no mp1 resize.- Red-proof #1 (Go "4c" block): removed the "4c" grow block →
…_SysDataGrowFAILED (got [{mp0 +240G}], no mp1 resize) → reverted → green. ✅ - reconcile test count: 127 RUN entries (subtests included), all pass.
- Red-proof #2 (shell vzdump guard): to be run live during the golden rebuild — temporarily flip
mp1tobackup=0, confirm the guard ABORTS, revert. PENDING (needs golden rebuild — §6).
5. Live deploy DONE — agent binary (§13-A)
- Built v0.40.0 on the build server (192.168.0.180, go1.26.0,
-ldflags -X main.version=0.40.0). - Deployed to felhom-pve: backed up prior binary to
/usr/local/bin/felhom-agent.bak-0.39.0, installed,systemctl restart felhom-agent. - Verified:
felhom-agent --version→0.40.0; serviceactive; clean restart (local-api listening on 192.168.0.162:8443; only WARN is the expected intent-gated skip of the lingering ejectedce9d…drive on 9201 — documented prior behavior, not an error).
6. Live acceptance — PENDING (blocked on operator-held secrets + an irreversible CHECKPOINT)
The golden rebuild (§13-B), the pct destroy 9201 CHECKPOINT (§13-C), and the re-provision (§13-D/E)
were not executed because they require inputs CC does not hold:
REGISTRY_USER+REGISTRY_TOKEN— for the golden's one-time controller-image pull inside the build guest. Confirmed absent on-host (no/root/.docker/config.json, no saved build env).DEMO_RETRIEVAL_PASSPHRASE(the-hub-password) — for the 9201 re-provision (the controller's hub config pull).- Operator confirmation for the irreversible
pct stop 9201; pct destroy 9201 --purge(§13-C CHECKPOINT). Operator pre-authorized a clean reinstall in principle, but the destroy is gated.
Planned live run once provided (locked sizing per RUNBOOK = 32 rootfs / 200 docker-data / 50 user-data):
# B. rebuild golden (root@felhom-pve) — bake controller 0.77.0
GOLDEN_SYSDATA_GB=8 REGISTRY_USER=… REGISTRY_TOKEN=… \
./build-golden.sh 9100 <TEMPLATE> local-lvm local vmbr0 \
gitea.dooplex.hu/admin/felhom-controller:0.77.0
# → vzdump log MUST show BOTH "including mount point mp0" AND "… mp1"; capture the new volid.
# → Red-proof #2 here (flip mp1 backup=0 → guard aborts → revert).
# C. CHECKPOINT: pct stop 9201; pct destroy 9201 --purge
# D. re-provision: felhom-agent --selftest=provision -archive <new-golden> -vmid 9201 \
# -customer-id demo-felhom -hub-password <SECRET> -rootfs-grow 0 -datavol-grow 184 -sysdata-grow 42
# then: pct reboot 9201
# E. accept: pct config 9201 (mp0,mp1 backup=1,mp8,mp9) ; pct exec 9201 -- findmnt /mnt/sys_drive ;
# pct exec 9201 -- docker exec felhom-controller findmnt /mnt/sys_drive (← propagation gate) ;
# controller monitor: /mnt/sys_drive warning GONE, SSD user-data ~50G.
Current 9201 baseline (pre-change, confirms the warning state): rootfs 32G, mp0 docker-data 256G
(backup=1), mp3 /mnt/felhom-drives, mp9 bootstrap — no mp1 / /mnt/sys_drive volume (so
/mnt/sys_drive is on the rootfs and the controller warns). Memory 12288 MiB.
7. NOT yet live-validated / residual
- The §13-B golden rebuild, the §13-D/E re-provision + acceptance gates (the three
findmnts + the controller-UI/API warning-cleared check), and shell-guard Red-proof #2 — all blocked on §6. - External-drive re-enroll after the clean reinstall: the destroy wipes the controller's
felhom-controller-datavolume (its storage registry), sofelhom-usb/felhom-flashwill need re-enrollment via the UI. Expected for a clean reinstall; out of scope for this task's acceptance (solely/mnt/sys_drivebecoming a separate, warning-free, PBS-covered mount).
8. Observations (noted, NOT acted on)
build-golden.shCONTROLLER_IMAGEdefault is stale (:0.43.0); the live controller is0.77.0. The golden rebuild passes the tag explicitly, so the stale default is cosmetic — left as-is per the minimal-change rule.felhom-agent/CLAUDE.mdself-reports "Current: v0.31.0" — stale; authoritative version is themain.govar + CHANGELOG top (now0.40.0). Left as-is (out of scope).- Live 9201 uses
mp3for the shared drives parent (/mnt/felhom-drives), not themp8the spec cited —freeMountSlotpicks the lowest free slot, so the exact number varies. The bakedmp1does not collide regardless (the guest is rebuilt from the new golden). No action needed.