Ein hochperformanter, in Go geschriebener Multi-Provider Dynamic DNS Client mit vollwertigem Web-Dashboard. Unterstützt IONOS, Cloudflare, IPv64, Hetzner DNS, Hetzner Cloud Febas und DNScale — gleichzeitig, pro Domain konfigurierbar.
/metrics/prometheus für Grafana & Co.linux/amd64 und linux/arm64 (Raspberry Pi, NAS, Server)Das einfachste Setup — Dashboard unter http://server-ip:8080, Konfiguration über die UI:
services:
go-dyndns:
image: crazyus3r/ionos-ddns:latest
container_name: go-dyndns
ports:
- "8080:8080"
volumes:
- ./config:/config
restart: unless-stopped
Beim ersten Start öffnet sich die Setup-Seite zum Erstellen des Admin-Accounts. Domains und Provider werden danach vollständig über das Dashboard konfiguriert und in /config/config.json gespeichert.
Alle Einstellungen lassen sich nach dem ersten Login unter Einstellungen im Dashboard verwalten:
Änderungen werden sofort in /config/config.json übernommen.
Für den ersten Start oder automatisierte Deployments können Domains auch per ENV konfiguriert werden. Beim ersten Schreiben wird automatisch eine config.json erzeugt.
| Variable | Beschreibung | Standard |
|---|---|---|
CONFIG_DIR | Verzeichnis für Config, Logs und Cache | /config |
IP_MODE | IPV4, IPV6 oder BOTH | BOTH |
INTERVAL | Sekunden zwischen Prüfungen | 300 |
INTERFACE | Netzwerk-Interface für IPv6 (z. B. eth0) | — |
DNS_SERVERS | Kommagetrennte DNS-Server | 1.1.1.1:53,8.8.8.8:53 |
HEALTH_PORT | Port für Dashboard und Healthcheck | 8080 |
DASHBOARD_HTTPS_PORT | Port für https Dashboard | 8443 |
LANG | Sprache der UI (de oder en) | de |
LOG_MAX_LINES | Maximale Log-Zeilen | 500 |
MAX_CONCURRENT | Parallele API-Updates | 5 |
MAX_API_RETRIES | Wiederholungsversuche bei API-Fehlern | 3 |
HOURLY_RATE_LIMIT | Max. API-Anfragen pro Stunde | 1200 |
DRY_RUN | true → keine Änderungen bei Providern | false |
DEBUG | Erweitertes Logging | false |
DEBUG_HTTP_RAW | HTTP-Traffic loggen (Achtung: Secrets!) | false |
DASHBOARD_AUTH | false → Dashboard ohne Login | true |
TRIGGER_TOKEN | Token für den /api/trigger-Endpunkt | — |
# IONOS
PROVIDER=IONOS
API_PREFIX=dein_prefix
API_SECRET=dein_secret
DOMAINS=home.example.com,sub.example.com
# Cloudflare
PROVIDER=CLOUDFLARE
CLOUDFLARE_TOKEN=dein_api_token
DOMAINS=home.example.com
# IPv64
PROVIDER=IPV64
IPV64_TOKEN=dein_token
DOMAINS=home.example.ipv64.net
# Hetzner DNS
PROVIDER=HETZNER
HETZNER_TOKEN=dein_token
DOMAINS=home.example.com
# Hetzner Cloud DNS
PROVIDER=HETZNERCLOUD
HCLOUD_TOKEN=dein_token
DOMAINS=home.example.com
# Febas
PROVIDER=FEBAS
FEBAS_UPDATE_URL=https://www.febas.de/api/dyndns.php?kundenid=DEINE_ID&token=DEIN_TOKEN
DOMAINS=home.example.com
# DNScale
PROVIDER=DNSCALE
DNSCALE_TOKEN=dein_api_key
DOMAINS=home.example.com
DOMAINS_CONFIGMehrere Provider gleichzeitig — auch gemischt:
DOMAINS_CONFIG='[
{
"fqdn": "home.example.com,sub.example.com",
"provider": "IONOS",
"api_prefix": "dein_prefix",
"api_secret": "dein_secret"
},
{
"fqdn": "home.example.ipv64.net",
"provider": "IPV64",
"ipv64_token": "dein_token"
},
{
"fqdn": "cf.example.com",
"provider": "CLOUDFLARE",
"cf_token": "dein_cf_token",
"cf_proxied": false
},
{
"fqdn": "hz.example.com",
"provider": "HETZNER",
"api_secret": "dein_hetzner_token"
},
{
"fqdn": "hc.example.com",
"provider": "HETZNERCLOUD",
"api_secret": "dein_hcloud_token"
},
{
"fqdn": "febas.example.com",
"provider": "FEBAS",
"febas_update_url": "https://www.febas.de/api/dyndns.php?kundenid=DEINE_ID&token=DEIN_TOKEN"
},
{
"fqdn": "dnscale.example.com",
"provider": "DNSCALE",
"dnscale_token": "dein_api_key"
}
]'
Unterstützte Felder je Eintrag: fqdn, provider, api_prefix, api_secret, cf_token, cf_email, cf_secret, cf_proxied, ipv64_token, hetzner_token, hcloud_token, febas_update_url, dnscale_token, ttl, ip_mode
| Provider | Typ | Records |
|---|---|---|
| IONOS | REST API | A, AAAA |
| Cloudflare | REST API | A, AAAA |
| IPv64 | NIC-Update + REST API | A, AAAA |
| Hetzner DNS | REST API | A, AAAA |
| Hetzner Cloud DNS | REST API | A, AAAA |
| Febas | NIC-Update (GET) | A, AAAA |
| DNScale | REST API | A, AAAA |
Das Dashboard ist unter http://server-ip:8080 erreichbar und bietet:
| Rolle | Beschreibung |
|---|---|
admin | Vollzugriff inkl. Benutzerverwaltung, Backup und Config-Speichern |
editor | Lesen, Updates auslösen, Domains verwalten |
viewer | Nur lesen (GET-Requests, WebSocket) |
Konfigurierbar über das Dashboard oder config.json:
| Notifier | Beschreibung |
|---|---|
| Telegram | Bot mit interaktiven Commands (/status, /metrics, /domains, /update, /health) |
| Gotify | Push-Nachrichten mit Prioritäten |
| Webhook | HTTP POST mit JSON-Payload |
| MQTT | Publish auf Topic, inkl. Home Assistant Auto Discovery |
| SMTP mit STARTTLS, direktem TLS oder Plain |
Für jeden Notifier lassen sich die gewünschten Events einzeln auswählen (Update, Create, Error, Start, Stop, Cleanup, …).
GET http://server-ip:8080/health
GET http://server-ip:8080/health?detailed=true
GET http://server-ip:8080/metrics/prometheus
Die /health-Route liefert 200 OK, degraded oder 503 Unhealthy. Docker-HEALTHCHECK ist im Image bereits konfiguriert.
/config)/config/
├── config.json # Hauptkonfiguration
├── users.json # Benutzerkonten (bcrypt/PBKDF2 gehashed)
├── lang/
│ ├── de.json
│ └── en.json
└── logs/
│ ├── dyndns.json # Ereignis-Log (JSON Lines)
│ ├── update.json # IP-Historie pro Domain
│ ├── metrics.json # Persistierte Metriken
│ ├── ionos_cache.json # Zonen-/Record-Cache IONOS
│ ├── cloudflare_cache.json
│ ├── ipv64_cache.json
│ ├── hetzner_dns_cache.json
│ └── hetzner_cloud_cache.json
└── tls/
├── dashboard.crt
└── dashboard.key
Beispiel update.json:
{
"home.example.com": {
"provider": "IONOS",
"last_changed": "18.01.2026 13:22:00",
"ips": [
{
"time": "18.01.2026 13:22:00",
"ipv4": "203.0.113.1",
"ipv6": "2001:db8::1"
}
]
}
}
Vorkompilierte Binaries für Linux (amd64/arm64) und Windows sind unter Releases verfügbar.
# Umgebungsvariablen setzen, dann:
./go-dyndns
# Oder mit CONFIG_DIR
CONFIG_DIR=/pfad/zur/config ./go-dyndns
IONOS: developer.hosting.ionos.com → neuen Key anlegen → Public Prefix + Secret kopieren
Cloudflare: Mein Profil → API-Token → Token erstellen → Zone:DNS:Edit-Berechtigung
IPv64: ipv64.net → API-Key aus dem Dashboard
Hetzner DNS: dns.hetzner.com → API-Tokens
Hetzner Cloud: console.hetzner.cloud → Projekt → API-Tokens
Febas: Kundenbereich auf febas.de → Update-URL mit kundenid und token aus dem DynDNS-Bereich kopieren
DNScale: dnscale.io → API-Bereich → Bearer-Token erstellen
Dieses Projekt steht unter der MIT-Lizenz.
Content type
Image
Digest
sha256:91bf9a0bb…
Size
6.1 MB
Last updated
9 days ago
docker pull crazyus3r/ionos-ddns