# 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: ```bash 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: ```bash docker compose up -d --build ``` 4. Öffne `http://: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: ```bash 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](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**.