diff --git a/VERSION b/VERSION index 32b1dc7..14d56a2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.19 \ No newline at end of file +1.3.20 \ No newline at end of file diff --git a/cmd/edgeguard-scheduler/main.go b/cmd/edgeguard-scheduler/main.go index 9a0fb16..a552533 100644 --- a/cmd/edgeguard-scheduler/main.go +++ b/cmd/edgeguard-scheduler/main.go @@ -191,7 +191,8 @@ func main() { auditRepo := audit.New(pool) alertDedupe := newDedupe(12 * time.Hour) - if renewer != nil { + // ACME nur auf dem VIP-Master (siehe Tick-Kommentar unten). + if renewer != nil && nodeHoldsVIP(ctx, pool) { runRenewer(ctx, renewer, alertSvc, alertDedupe) } runLicenseVerify(ctx, licClient, licKeyStore, licRepo, nodeID, alertSvc, alertDedupe) @@ -258,7 +259,13 @@ func main() { for { select { case <-renewTick.C: - if renewer != nil { + // ACME-HTTP-01-Challenges laufen auf :80 der VIP → nur der + // VIP-Master kann sie bestehen. Ein BACKUP-Node scheitert IMMER + // mit 403 (invalid authorization) und setzt tls_certs.status lokal + // auf "error" → Divergenz zur replizierten Row (Primary=active) → + // Config-Drift-Banner + Log-Noise. Renewal daher nur am VIP-Master; + // die Cert-Row/PEM repliziert von dort ohnehin auf den Standby. + if renewer != nil && nodeHoldsVIP(ctx, pool) { runRenewer(ctx, renewer, alertSvc, alertDedupe) } runCertExpiryCheck(ctx, tlsRepo, alertSvc, alertDedupe)