heathcheck / README.md / webhook_port

This commit is contained in:
2026-08-07 13:13:41 +02:00
parent dc029f1cf9
commit aefcd90119
5 changed files with 14 additions and 14 deletions
+1 -2
View File
@@ -13,8 +13,7 @@ CLOUDFLARE_RECORDS=sub1.example.org,sub2.example.org,sub3.example.org
# FreeDNS (Fallback/Parallelbetrieb) # FreeDNS (Fallback/Parallelbetrieb)
FREEDNS_UPDATE_URL=https://freedns.afraid.org/dynamic/update.php?TOKEN FREEDNS_UPDATE_URL=https://freedns.afraid.org/dynamic/update.php?TOKEN
# Webhook (kein Auth, rein intern) # Webhook (kein Auth, rein intern, Port fest 8090)
WEBHOOK_PORT=8090
# Fallback Polling # Fallback Polling
POLL_INTERVAL_MINUTES=15 POLL_INTERVAL_MINUTES=15
+3
View File
@@ -17,4 +17,7 @@ ENV PYTHONUNBUFFERED=1
EXPOSE 8090 EXPOSE 8090
HEALTHCHECK --interval=5m --timeout=3s --retries=3 \
CMD python3 -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8090/healthz', timeout=2)" || exit 1
CMD ["python", "-m", "app.main"] CMD ["python", "-m", "app.main"]
+7 -5
View File
@@ -35,16 +35,18 @@ Alle Einstellungen erfolgen ausschließlich über Umgebungsvariablen (siehe
| `CLOUDFLARE_ZONE_ID` | Cloudflare-Zone | | `CLOUDFLARE_ZONE_ID` | Cloudflare-Zone |
| `CLOUDFLARE_RECORDS` | Kommagetrennte A-Record-Namen (DNS-only) | | `CLOUDFLARE_RECORDS` | Kommagetrennte A-Record-Namen (DNS-only) |
Optional: `FREEDNS_UPDATE_URL`, `WEBHOOK_PORT`, `POLL_INTERVAL_MINUTES`, Optional: `FREEDNS_UPDATE_URL`, `POLL_INTERVAL_MINUTES`,
`HEALTHCHECK_PING_URL`, `TZ`, `LOG_LEVEL`. Die IP kommt ausschließlich aus der `HEALTHCHECK_PING_URL`, `TZ`, `LOG_LEVEL`. Die IP kommt ausschließlich aus der
FritzBox, nie aus Webhook-Parametern. FritzBox, nie aus Webhook-Parametern.
## Betrieb ## Betrieb
- **State:** zuletzt bekannte IP liegt als `data/last-known-ip.json` (Volume) - **State (bewusst ohne Volume, ephemeral):** zuletzt bekannte IP liegt als
Änderung wird erst nach erfolgreichem Update gespeichert. `data/last-known-ip.json` im Container. Bei jedem neu erstellten Container ist
- **Webhook:** `GET <port>/webhook/update` (kein Auth, intern) löst einen Zyklus aus. der State wieder leer, wodurch beim Start ein Force-Push erzwungen wird.
- **Healthz:** `GET <port>/healthz` für Container-Healhcheck. Die Änderung wird erst nach erfolgreichem Update gespeichert.
- **Webhook:** `GET /webhook/update` (kein Auth, intern, Port fest 8090) löst einen Zyklus aus.
- **Healthz:** `GET /healthz` für den Container-Healthcheck (genutzt vom Docker-`HEALTHCHECK`).
- **Healthchecks:** Healthy Ping bei jedem Poll, Failure Ping bei IP-Fehler bzw. Teilfehler. - **Healthchecks:** Healthy Ping bei jedem Poll, Failure Ping bei IP-Fehler bzw. Teilfehler.
- **Logs/Wartung:** `docker compose logs -f`; Updates via Watchtower (Label im Compose). - **Logs/Wartung:** `docker compose logs -f`; Updates via Watchtower (Label im Compose).
+1 -3
View File
@@ -33,7 +33,6 @@ class Config:
self.freedns_update_url = os.environ.get("FREEDNS_UPDATE_URL", "") self.freedns_update_url = os.environ.get("FREEDNS_UPDATE_URL", "")
self.webhook_port = int(os.environ.get("WEBHOOK_PORT", "8090"))
self.poll_interval_minutes = int(os.environ.get("POLL_INTERVAL_MINUTES", "15")) self.poll_interval_minutes = int(os.environ.get("POLL_INTERVAL_MINUTES", "15"))
self.healthcheck_ping_url = os.environ.get("HEALTHCHECK_PING_URL", "") self.healthcheck_ping_url = os.environ.get("HEALTHCHECK_PING_URL", "")
@@ -49,10 +48,9 @@ class Config:
log.error("CLOUDFLARE_RECORDS ist leer - mindestens eine Subdomain angeben.") log.error("CLOUDFLARE_RECORDS ist leer - mindestens eine Subdomain angeben.")
sys.exit(1) sys.exit(1)
log.info( log.info(
"Konfiguration geladen: %d Cloudflare-Record(s), Poll-Intervall=%d Min, Webhook-Port=%d", "Konfiguration geladen: %d Cloudflare-Record(s), Poll-Intervall=%d Min",
len(self.cloudflare_records), len(self.cloudflare_records),
self.poll_interval_minutes, self.poll_interval_minutes,
self.webhook_port,
) )
+2 -4
View File
@@ -108,11 +108,9 @@ def main():
scheduler.start() scheduler.start()
log.info("Fallback-Polling gestartet (alle %d Minuten).", config.poll_interval_minutes) log.info("Fallback-Polling gestartet (alle %d Minuten).", config.poll_interval_minutes)
log.info( log.info("Webhook-Server startet auf Port 8090 (GET /webhook/update, kein Auth).")
"Webhook-Server startet auf Port %d (GET /webhook/update, kein Auth).", config.webhook_port
)
logging.getLogger("werkzeug").setLevel(logging.ERROR) logging.getLogger("werkzeug").setLevel(logging.ERROR)
app.run(host="0.0.0.0", port=config.webhook_port) app.run(host="0.0.0.0", port=8090)
if __name__ == "__main__": if __name__ == "__main__":