diff --git a/docker-compose.dwd.yml b/docker-compose.dwd.yml index 8834680..71d4493 100644 --- a/docker-compose.dwd.yml +++ b/docker-compose.dwd.yml @@ -1,6 +1,8 @@ # DWD-Regenvorhersage-Pipeline (RV-Komposit → PMTiles-Frames) — NICHT Teil des Default-Stacks. -# Trigger: DSM-Aufgabenplaner ALLE 5 MINUTEN: -# docker compose -f docker-compose.dwd.yml run --rm dwd-radar +# DAUER-CONTAINER mit interner 5-Min-Schleife (loop.sh): der DSM-Aufgabenplaner kann nur +# stündlich, daher KEIN Cron. Einmal starten (überlebt Reboots via restart-Policy): +# docker compose -f docker-compose.dwd.yml up -d --build +# Stoppen: docker compose -f docker-compose.dwd.yml down # ⚠️ NIE mit --remove-orphans aufrufen (löscht den App-Container)! # Schreibt ins data-Volume (./data/radar) — ausgeliefert von main.py /radar/* (Range-Route). # Georeferenzierung PoC-bewiesen 2026-06-08, s. tools/dwd-radar/ + docs/DWD_RAIN_FORECAST_PLAN.md. @@ -13,6 +15,7 @@ services: volumes: - ./data/radar:/out environment: + - INTERVAL_S=300 # Schleifen-Intervall (RV-Läufe kommen alle 5 Min) - FRAME_STEP=1 # alle 25 Frames (5-Min-Schritte); 2 = 10-Min-Schritte falls DS-Last zu hoch - KEEP_RUNS=2 - restart: "no" + restart: unless-stopped diff --git a/tools/dwd-radar/Dockerfile b/tools/dwd-radar/Dockerfile index 9136775..b0f622c 100644 --- a/tools/dwd-radar/Dockerfile +++ b/tools/dwd-radar/Dockerfile @@ -11,5 +11,9 @@ RUN ARCH=$([ "$TARGETARCH" = "arm64" ] && echo arm64 || echo x86_64) && \ rm /tmp/pmtiles.tar.gz && pmtiles version || true COPY make_radar_tiles.py /app/make_radar_tiles.py +COPY loop.sh /app/loop.sh +RUN chmod +x /app/loop.sh WORKDIR /app -CMD ["python3", "/app/make_radar_tiles.py"] +# Dauerbetrieb mit interner 5-Min-Schleife (DSM-Aufgabenplaner kann nur stündlich). +# Einmal-Lauf weiterhin möglich: docker compose run --rm dwd-radar python3 /app/make_radar_tiles.py +CMD ["/app/loop.sh"] diff --git a/tools/dwd-radar/loop.sh b/tools/dwd-radar/loop.sh new file mode 100644 index 0000000..499f4eb --- /dev/null +++ b/tools/dwd-radar/loop.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# Endlos-Schleife statt Cron: Der DSM-Aufgabenplaner kann minimal stündlich (René 2026-06-08), +# die RV-Läufe kommen aber alle 5 Minuten. Der Container läuft daher dauerhaft (restart: +# unless-stopped) und schläft zwischen den Läufen — idle ist nur die sh+sleep (winzig), +# Python/GDAL leben nur während des Laufs. make_radar_tiles.py ist idempotent +# (gleicher Lauf vorhanden → sofort fertig), Fehler brechen die Schleife nicht. +INTERVAL="${INTERVAL_S:-300}" +echo "DWD-Radar-Loop: alle ${INTERVAL}s (INTERVAL_S zum Ändern)" +while true; do + python3 /app/make_radar_tiles.py || echo "Lauf fehlgeschlagen — nächster Versuch in ${INTERVAL}s" + sleep "$INTERVAL" +done