Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HxLA1mZurFq9kt8hneFeCs
3.6 KiB
felhom.eu — task reports
Overwrite this file with a summary of the most recent task only (uniform with the other repos; not cumulative). The cumulative hub history lives in hub/CHANGELOG.md.
REPORT — Hub GUI correctness + pull-based config delivery (hub v0.26.0)
Date: 2026-06-30 · Repo: felhom.eu (hub/) · Companion: felhom-controller v0.94.0
Implements the "retire the 5 inbound controls + pull-based config-refresh" task. Resolves audit
documentation/audits/AUDIT-hub-gui-2026-06-30.md F-S1/F-S4 + the dead-template findings.
Baselines
- hub
felhom.euwase51e03b(v0.25.0) → codea3ac6c9, manifestd88b43a(v0.26.0, live on k3s). - (companion) felhom-controller v0.93.0 → v0.94.0.
What changed (hub)
- Pull-based config delivery. New
customer_configs.config_version(stored counter, NOT a YAML hash —configgenemits a freshsession_secret+timestamp each call).SaveCustomerConfigbumps it on every save (new=1, updates increment). The report ACK (handleReport) advertisesconfig_versionbeside the floor/latest; omitted for report-only customers. - Retired the 5 inbound (hub→box) controls (
01-topology-and-trust.md:11never-inbound): Trigger Update, Push Config, Pull Config, Show Diff (+compareYAMLValues/flattenYAML/maskSensitivehelpers + deadConfigSyncStatus/ConfigDiffCount) — handlers + routes + buttons + JS deleted. Geo-disable KEEPS its hub→CloudflareRemoveGeoRules; its inboundnotifyControllerGeoDisabledeleted. - GUI staleness + dead templates. Setup Commands now show
sudo ./felhom-host-install.sh --customer-id <id>(no-echo passphrase) instead ofdocker-setup.sh; Option 2 relabelled "Manual config fetch (debug only)". Deleted orphanedcustomer.html+config_detail.html.
Files
internal/store/store.go (column + bump + 3 SELECTs + struct), internal/api/handler.go (ACK),
internal/web/server.go (routes + handleTriggerUpdate removed), internal/web/configs.go
(handlers/helpers removed, geo trimmed), internal/web/templates/customer_unified.html (setup cmd,
buttons/JS removed), deleted customer.html+config_detail.html, manifests/hub.yaml (tag).
Tests: internal/store/config_version_test.go, internal/api/config_version_ack_test.go.
Tests & green gate
go build ./... && go vet ./... && go test ./...— all green.- Red-proof (version bump): with the
config_version + 1bump defeated, bothTestSaveCustomerConfig_BumpsConfigVersionandTestReportACK_ConfigVersionFAIL (config_version after edit = 1, want 2) — the bump is load-bearing. Restored → green. - No-inbound:
grep client.Do internal/web/→ only Gitea registry/template fetches; zero ControllerURL targets (ControllerURL remains a display-only link).
Live validation (demo, hub.felhom.eu + guest 9201)
- Hub v0.26.0 rolled out on k3s (Synced/Healthy,
[INFO] felhom-hub … starting). - Live ACK for demo-felhom:
{"config_version":1,"latest_version":"0.94.0","min_controller_version":"0.87.0","status":"ok"}. - Bumped demo-felhom
config_version1→2 in the hub DB (equivalent to a config save; the SaveCustomerConfig bump itself is unit-tested + red-proofed). The controller detected it, re-pulled, and self-restarted (see controller REPORT for the box-side trace) — full pull-based delivery, no inbound connection.
Open follow-ups (from the audit, not in scope here)
Hosts page (F-M1); controller-side geo intent sync (geo-disable is now CF-only, no box notify); Show-Diff could return later as a read-only hub-vs-reported view.