Files
hetzner-api-dyndns-records-…/README.md
T

4.2 KiB

Hetzner DynDNS Dashboard

Ein schlankes, selbst gehostetes Dashboard für mehrere Hetzner-DNS-Zonen und DynDNS-Ziele. Der Container erkennt seine öffentliche IPv4/IPv6 in einem einstellbaren Rhythmus und aktualisiert ausschließlich aktivierte A-/AAAA-Records über die Hetzner Cloud DNS API.

Was es kann

  • Mehrere Hetzner-Domains mit getrennten, verschlüsselten API-Tokens
  • Import vorhandener A-/AAAA-Records und Anlegen neuer DynDNS-Hosts
  • Reversibles Trennen von DynDNS-Zielen: Hetzner-Records bleiben bestehen und werden im lokalen Archiv angezeigt
  • Globale, konfigurierbare IP-Prüfung mit HTTPS-Fallbackquellen
  • Live-Countdown bis zum nächsten Scheduler-Lauf und manueller Sofortlauf für Admins
  • Beschreibungen lokal und als Hetzner-Record-Kommentar
  • Sichere Mehrbenutzerverwaltung:
    • Admin: vollständige Zonen-, Token-, Updater- und Benutzerverwaltung
    • Mitglied: ausschließlich explizit freigegebene Domains oder einzelne Subdomains
  • SQLite-Datenvolume, Docker Secret für die Token-Verschlüsselung und kein externer Login-Dienst

Schnellstart

  1. Secret-Verzeichnis anlegen und einen neuen Schlüssel erzeugen:

    mkdir -p secrets
    openssl rand -base64 32 > secrets/dyndns_master_key
    chmod 700 secrets
    chmod 644 secrets/dyndns_master_key
    cp .env.example .env
    
  2. Für LAN-Zugriff in .env BIND_ADDRESS auf die konkrete private IP des Docker-Hosts setzen, zum Beispiel 192.168.178.10. Verwende im HTTP-LAN-Modus nie 0.0.0.0.

    Die Schlüsseldatei benötigt bei Docker Compose Leserechte für den unprivilegierten Containerprozess. Das Verzeichnis selbst bleibt deshalb auf dem Host mit Modus 700 geschützt; im Container läuft nur der nicht-root DynDNS-Prozess.

  3. Starten:

    docker compose up -d --build
    
  4. Öffne http://<host-ip>:8080, lege den ersten Admin-Benutzer an und verbinde eine Zone mit einem Hetzner Cloud API-Token.

Produktivbetrieb

Für den Produktivserver gibt es eine separate Compose-Datei, die ein versioniertes Image aus der Gitea Container Registry bezieht und niemals lokal baut. domain-control-webinterface-prod ist nur der Name des Container-Pakets; ein zweites Git-Repository ist nicht erforderlich:

docker compose --env-file .env.production -f compose.production.yml pull
docker compose --env-file .env.production -f compose.production.yml up -d

Die vollständige Anleitung für Gitea Actions, HTTPS-Reverse-Proxy, Installation, Backups, Updates und Rollbacks steht in PRODUCTION.md.

Sicherheit

  • Passwörter werden mit Argon2id gehasht.
  • Hetzner-Tokens werden mit XChaCha20-Poly1305 verschlüsselt; der Schlüssel liegt als Docker Secret außerhalb des Datenvolumes.
  • Cookies sind HttpOnly und SameSite=Strict; alle schreibenden Formulare verwenden CSRF-Tokens.
  • Token-Anzeige verlangt die erneute Eingabe des Admin-Passworts und setzt Cache-Control: no-store.
  • Unprivilegierte Nutzer sehen niemals API-Tokens, globale IP-Quellen, Update-Historie anderer Domains oder Benutzerverwaltung.

APP_MODE=lan ist nur für ein isoliertes, vertrauenswürdiges Netz geeignet. Passwort und API-Token sind bei HTTP auf einem fremden oder geteilten Netz nicht gegen Mitlesen geschützt. Für WLAN mit Gästen oder externen Zugriff setze einen HTTPS-Reverse-Proxy vor den Container und verwende APP_MODE=https.

Berechtigungen

Ein Admin legt unter Benutzer Konten an und entscheidet pro Mitglied:

  • Ganze Domain: Zugriff auf alle aktuellen und später importierten/angelegten DynDNS-Ziele dieser Zone.
  • Einzelne Subdomain: Zugriff nur auf den konkreten Host, etwa home.example.de.

Mitglieder dürfen ihren freigegebenen Host aktivieren/deaktivieren und dessen Beschreibung pflegen. Sie können keine DNS-Records löschen, Domains importieren, API-Tokens einsehen oder globale Einstellungen verändern.

Daten und Betrieb

Die persistente Datenbank liegt im Docker-Volume dyndns-data. Sichere für Backups sowohl das Volume als auch das separate Master-Key-Secret; ohne den Master-Key lassen sich gespeicherte Hetzner-Tokens absichtlich nicht wiederherstellen.

Der Container bietet /healthz und /readyz. Für eine Aktualisierung ohne Warten auf das Intervall gibt es im Admin-Dashboard Jetzt aktualisieren.