PDNS Manager

← Zurück zur Übersicht

v2.3.7 · Veröffentlicht April 2026

Größeres Release mit Records-Sync über mehrere Server, Login-Rate-Limit, SSRF-Schutz für Webhooks und vollständiger i18n in allen 6 Sprachen.

Records & Multi-Server-Sync

  • Fan-out beim Schreiben: POST/PUT/DELETE und Bulk-Updates auf Records werden jetzt automatisch auf alle Server angewendet, die Speichern: Ja (allow_writes=true) haben und die Zone führen. Read-only Server werden hart abgelehnt (HTTP 403). Per-Server-Status (ok / skipped / error) liegt im Response-Body unter details.
  • Frontend kennt schreibbare Server: /api/v1/servers liefert pro Server allow_writes mit. Klick auf eine Zone navigiert automatisch zu einem schreibbaren Server.
  • Synchronisierte Anzeige: Zonenliste, Suche und Dashboard fassen identische Zonen/Records über mehrere Server zu jeweils einer Zeile zusammen. Server, auf denen die Zone existiert, werden als Badges angezeigt.
  • Zonen-Detail-Banner: Aktueller Server schreibgeschützt → rote Warnung + Wechsel-Button. Zusätzliche schreibbare Peers vorhanden → Info-Banner, dass jede Änderung auf allen entsprechenden Servern landet.

Zonenrechte (Lesen / Voll)

  • In Benutzer → Zonen zuweisen pro Zone wählbar. „Nur lesen" blockiert API-seitig alle schreibenden Aktionen (Records, DNSSEC ein/aus, NOTIFY).

Sicherheit

  • Login-Rate-Limit: IP-basierte Sperre nach mehreren fehlgeschlagenen Logins (HTTP 429, gleitendes Fenster).
  • Webhook SSRF-Schutz: Webhook-URLs werden vor dem Speichern und vor jedem Versand geprüft. Localhost / private / link-local / multicast-Ziele sind standardmäßig blockiert. Wer das in einem internen Netz braucht, setzt WEBHOOK_ALLOW_PRIVATE_URLS=true in der .env.
  • PowerDNS-Fehler: 5xx-Antworten landen mit vollständigem Detail im Backend-Log; nach außen geht eine kundenfreundliche Meldung ohne Stacktrace-Leck.

i18n

  • Alle 6 Sprachen (en / de / sr / hr / bs / hu) sind jetzt vollständig synchronisiert auf identische Key-Liste (770 Keys). Vorher fehlten in bs/hr/hu/sr ca. 60 Keys.
  • Pflege weiter via node scripts/sync-locales.mjs.

Tests

  • Pytest-Suite mit echten Modultests: DNSSEC-Parse, ACME-Helfer, Zonen-ACL, Login-Rate-Limit, Webhook-URL-Validierung, Health.
  • backend/pytest.ini für konsistente Test-Pfade.

Audit

  • Admin kann das Log als CSV exportieren (GET /api/v1/audit-log/export).

Health-Check

  • GET /health prüft die Datenbank mit SELECT 1. Wenn die DB weg ist: HTTP 503 + status: unhealthy.
  • compose.yaml hängt einen Healthcheck am Backend-Service – depends_on: condition: service_healthy zieht dadurch sauber.

UX & Stabilität

  • AppErrorBoundary: Statt weißer Seite bei einem Frontend-Runtime-Fehler ein verständlicher Hinweis mit „Neu laden"-Button.
  • Leere Record-Listen zeigen Hinweis + Add-Button statt einer leeren Tabelle.
  • Settings → API & Sicherheit kapselt Tokens / TOTP / Webhooks in einem Panel; QR-Code für TOTP läuft über das qrcode-Paket.

Build / Deployment

  • backend/Dockerfile prüft nach dem Frontend-Copy explizit, dass index.html, assets/ und mindestens ein gebautes JS-Bundle vorhanden sind.
  • compose.yaml: Backend-Healthcheck via /health, neuer Env-Eintrag WEBHOOK_ALLOW_PRIVATE_URLS.

Docs

  • docs/PANEL-API.md ausgebaut: Authentifizierungswege, Endpoint-Beispiele für Zonen / Records / DNSSEC, Webhook-Signaturprüfung mit Code-Snippet.