controller v0.271.0: automatic app updates — the update leg after the off-site copy, the backup gate waits, the switch (09 6.4 part 7; R-680, R-678, R-643)
gates / gates (push) Successful in 24s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-09-24 22:07:24 +02:00
parent 1495ca43fb
commit 9cf13a3add
33 changed files with 1672 additions and 14 deletions
+4
View File
@@ -181,6 +181,10 @@ func BuildReport(
// DR recipe app-half — customer identity + per-app {catalog_ref, enabled, storage_bindings}.
// Allowlist-only (the boundary): NO env/secret fields. The hub assembles it with the agent half.
if stackMgr != nil {
r.UpdateLeg = stackMgr.LastUpdateLegSummary()
}
r.DRRecipe = BuildDRRecipeAppHalf(cfg.Customer.ID, cfg.Customer.Name, cfg.Customer.Domain,
stackMgr.GetStacks(), readComposeFile)
// fork-4: attach the non-secret offsite restic repo coordinates so DR knows where to recover from.
+6
View File
@@ -5,6 +5,7 @@ import (
"gitea.dooplex.hu/admin/felhom-controller/internal/backup"
"gitea.dooplex.hu/admin/felhom-controller/internal/metrics"
"gitea.dooplex.hu/admin/felhom-controller/internal/stacks"
)
// Report is the JSON payload pushed to the central hub.
@@ -53,6 +54,11 @@ type Report struct {
// customer e-mails can follow it (plan slice 3). Additive: the hub stores the raw report and no hub
// release reads it yet. Always present, never omitted: a box that never chose reports "hu".
Language string `json:"language"`
// UpdateLeg (v0.271.0, `09` §6.4 part 7) — the operator's one summary of the last automatic update
// leg on this box: steps done / undone / held / failed / skipped, each skip with its reason. Absent
// until a leg has run since the controller started. Additive: the hub stores the raw report.
UpdateLeg *stacks.UpdateLegSummary `json:"update_leg,omitempty"`
}
// SystemReport holds host-level system info.