Add SPEC, PLAN, Dockerfile, compose, env example, app modules, CI workflow

This commit is contained in:
Stefan Koelle
2026-08-07 00:18:57 +02:00
parent d456a856e3
commit 6dd541b798
14 changed files with 549 additions and 0 deletions
+54
View File
@@ -0,0 +1,54 @@
# DynDNS-Updater - Spezifikation
**Status:** Entwurf fuer Umsetzung
**Zielumgebung:** Docker-Host (Debian VM auf Proxmox)
**Hosting:** GitHub (Repo + GitHub Actions)
**IP-Version:** Nur IPv4 (kein AAAA/IPv6 in v1)
## 1. Ziel
Abloesung des aktuellen Setups (Cloudflare-CNAME -> FreeDNS-Subdomain) durch einen selbst
gehosteten Updater-Container, der eine variable Anzahl Cloudflare-A-Records DNS-only (graue
Cloud) direkt mit der aktuellen oeffentlichen IPv4-Adresse pflegt und parallel weiterhin die
bestehende FreeDNS-Update-URL aufruft.
Trigger fuer einen Update-Zyklus:
1. Container-Start (Initial-Check)
2. Webhook-Aufruf (GET) von der FritzBox bei IP-Wechsel
3. Fallback-Polling alle 15 Minuten
Die tatsaechliche IP wird niemals aus Webhook-Parametern uebernommen. Der Container ermittelt
die IP bei jedem Trigger selbst ueber die FritzBox TR-064-Schnittstelle.
## 2. Ablauflogik
1. IP_aktuell = fritzbox.get_external_ip(retries=3, backoff=[2s,5s,10s])
2. IP_letzte = state.load()
3. Wenn gleich: Poll -> nur Heartbeat-Ping, kein Update. Webhook/Start -> nur Log.
4. Wenn unterschiedlich: Cloudflare-Records updaten, FreeDNS aufrufen, state speichern,
Healthcheck-Erfolgs-Ping. Bei Teilfehler: state NICHT speichern, Fail-Ping.
## 3. Cloudflare
- Nur A-Records, DNS-only (proxied=false)
- Variable Subdomain-Liste ueber CLOUDFLARE_RECORDS (ENV)
- Records pro Lauf per Name aufgeloest, nicht gecacht
- Benoetigter Token-Scope: Zone -> DNS -> Edit (Template "Edit zone DNS") + Zone -> Zone -> Read
## 4. Webhook
- GET /webhook/update, kein Auth, nur fuer internen LAN-Aufruf gedacht
## 5. Sicherheit
- .env niemals committen
- Cloudflare-Token nur mit minimal noetigen Rechten
- FritzBox-TR-064-User mit eingeschraenkten Rechten
- Alle Records bleiben DNS-only (kein Proxy-Mode in v1)
## 6. Offene Punkte
- IPv6/AAAA
- Proxy-Mode fuer reine HTTP(S)-Subdomains
- Redundanter Lauf auf zweitem Host
- Spaetere Abschaltung der FreeDNS-Anbindung