# 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.

## Features

- **Dashboard**: Aktuelles Wetter, DWD-Station, 48h-Stundenansicht, 7-Tage-Forecast
- **Radar-Karte**: Leaflet + OpenStreetMap + DWD WMS (Niederschlagsradar, Warnungen)
- **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

```bash
pip install bcrypt
python scripts/hash_admin_password.py 'dein-sicheres-passwort'
```

Die ausgegebenen Werte in `.env` eintragen, dann Stack neu starten.

Admin-UI: `http://localhost:8080/admin.html`

Sicherheit:
- bcrypt-Passwort-Hash (niemals Klartext in `.env` committen)
- 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


```bash
cp .env.example .env
docker compose up -d --build
```

Web-UI: `http://localhost:8080` · API: `http://localhost: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/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/radar/rendered` | Lokal gerenderte Radar-Frames |

## Selfhosted Forecast (optional)

```bash
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/Beobachtungen
- `DWD_WMS_URL`, `DWD_RADAR_BASE_URL` – Radar-Karte und Rohdaten
- `POSTGRES_PASSWORD`, `RADAR_RETENTION_HOURS`
- `CACHE_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

```bash
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.
