feat(ipv6): IPv6-Support für HAProxy + Settings-Toggle

- setup.State.IPv6Enabled + Store.SetIPv6Enabled()
- GET/POST /system/ipv6 im SystemHandler; HAProxy-Reload on save
- HAProxy-Template: bind [::]:80, [::]:443, quic6@:443, [::]:3443
  werden nur emittiert wenn IPv6Enabled=true
- haproxy.View.IPv6Enabled aus SetupStore befüllt
- Settings-UI: neues IPv6-Card (zwischen Auto-Update und Passwort)
- i18n de+en ergänzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Debian
2026-05-23 16:48:26 +02:00
parent 906c2e17a6
commit 4e01b4569c
8 changed files with 128 additions and 2 deletions

View File

@@ -57,6 +57,11 @@ type State struct {
// Compliance (z. B. SOX = 7 Jahre = 2555) oder reduzieren falls
// /var-Disk-Druck.
AuditRetentionDays int `json:"audit_retention_days,omitempty"`
// IPv6Enabled: wenn true bindet HAProxy zusätzlich auf [::]:80,
// [::]:443 und [::]:3443. Default false weil nicht alle Deployments
// IPv6 haben. Nach Änderung wird HAProxy neu geladen.
IPv6Enabled bool `json:"ipv6_enabled,omitempty"`
}
// Request is the JSON body POST /api/v1/setup/complete accepts.
@@ -192,6 +197,19 @@ func (s *Store) SetAuditRetention(days int) error {
return s.Save(prev)
}
// SetIPv6Enabled schaltet IPv6-Binds in HAProxy an oder aus.
func (s *Store) SetIPv6Enabled(enabled bool) error {
prev, err := s.Load()
if err != nil {
return err
}
if prev == nil {
return errors.New("setup not completed — cannot edit IPv6 before initial setup")
}
prev.IPv6Enabled = enabled
return s.Save(prev)
}
// SetContactEmails aktualisiert AdminEmail + ACMEEmail. Beide werden
// gegen mail.ParseAddress validiert. Lower-case + trim wie beim Setup-
// Wizard, damit Login-Vergleich (EqualFold) konsistent bleibt.