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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user