0568e53ee9c0970b3d5f1602057885c0ee651972
HexaWetter – Selfhosted Wetterportal
HexaWetter ist ein vollständiges Self-Hosting-Wetterportal mit Forecast, DWD-Beobachtungen, interaktiver Radar-Karte (WMS + Zeitleiste), Warnungen, Geocoding und lokalem Radar-Rendering.
Repository
git clone ssh://git@git.hexahost.dev:8006/smueller/HexaWetter.git
cd HexaWetter
Features
- Dashboard: Aktuelles Wetter, DWD-Station, 48h-Stundenansicht, 7-Tage-Forecast
- Radar-Karte: Leaflet + OpenStreetMap + DWD WMS (Niederschlagsradar, Warnungen)
- Regenvorhersage-Karte: Open-Meteo-Modell als Kartenoverlay (6–24 h, stündlich)
- Radar-Animation: Zeitleiste (60–120 Min., 5-Min-Schritte), Play/Pause, Vor/Zurück
- Warnungen: DWD-Warnungen mit Standortfilter (Landkreis-Matching)
- Ortssuche: PLZ/Ort via Nominatim-Proxy, GPS, Favoriten
- Lokales Radar: Worker lädt Rohdaten, Renderer erzeugt PNG-Overlays
- Infrastruktur: PostgreSQL + TimescaleDB + PostGIS, Redis-Cache, Healthchecks
Admin-Bereich
pip install bcrypt
python scripts/setup_secrets.py 'dein-sicheres-passwort'
Die ausgegebenen Werte in .env eintragen, dann Stack neu starten.
Admin-UI: http://localhost:8080/admin.html
Sicherheit:
- API-Key (
API_KEY) für alle/api/*-Endpunkte (Nginx setzt den Header automatisch) - bcrypt-Passwort-Hash (niemals Klartext in
.envcommitten) - JWT mit
ADMIN_JWT_SECRET(min. 32 Zeichen) - Rate-Limiting auf Login (5 Versuche / 5 Min.)
- Token nur in
sessionStorage(nicht localStorage) - Security-Headers auf allen API-Antworten
- API-Port nur auf
127.0.0.1gebunden (kein direkter externer Zugriff) - Schreibende Endpunkte (Radar-Sync, Cache leeren, Einstellungen) nur im Admin-Bereich
cp .env.example .env
docker compose up -d --build
Web-UI: http://localhost:8080 · API (lokal): http://127.0.0.1:8081/api/health
Architektur
| Service | Rolle |
|---|---|
frontend |
Nginx + statisches UI |
api |
FastAPI-Backend |
postgres |
TimescaleDB + PostGIS (Cache, Radar-Metadaten) |
redis |
Kurzzeit-Cache |
radar-worker |
DWD OpenData Download |
radar-renderer |
HDF5 → PNG aus Rohdaten |
API-Endpunkte (Auswahl)
| Endpoint | Beschreibung |
|---|---|
GET /api/health |
Status inkl. Quellen-Healthchecks |
GET /api/forecast |
7-Tage-Forecast |
GET /api/forecast/precipitation-map |
Regenvorhersage-Gitternetz für Karte |
GET /api/observations |
DWD-Beobachtung (Bright Sky) |
GET /api/warnings |
DWD-Warnungen (standortbezogen) |
GET /api/geocode/search |
Ortssuche |
GET /api/radar/wms/times |
WMS-Zeitschritte für Animation |
GET /api/admin/radar/files |
Lokale Radar-Rohdaten (Admin) |
GET /api/admin/radar/rendered |
Gerenderte Radar-Frames (Admin) |
Selfhosted Forecast (optional)
docker compose -f docker-compose.yml -f docker-compose.selfhosted.yml --profile selfhosted up -d
Siehe docs/NEXT_STEPS.md für Hardware-Empfehlungen zu Open-Meteo und Bright Sky.
Konfiguration
Wichtige .env-Variablen:
OPEN_METEO_BASE_URL,BRIGHTSKY_BASE_URL– Forecast/BeobachtungenDWD_WMS_URL,DWD_RADAR_BASE_URL– Radar-Karte und RohdatenPOSTGRES_PASSWORD,RADAR_RETENTION_HOURSCACHE_TTL_*,RATE_LIMIT_PER_MINUTE
Backup
- PostgreSQL:
docker exec hexawetter-postgres pg_dump -U hexawetter hexawetter > backup.sql - Radar-Rohdaten:
./data/raw/radar/ - Gerenderte Frames:
./data/processed/radar/
Entwicklung
cd api && pip install -r requirements.txt && uvicorn app.main:app --reload --port 8081
Lizenz / Attribution
Datenbasis: Deutscher Wetterdienst (DWD), Open Data. Kartenbasis: OpenStreetMap. Keine amtliche Wetterberatung.
Description
Languages
Python
51.3%
JavaScript
25.9%
HTML
11.1%
CSS
11%
Dockerfile
0.7%