96 lines
3.1 KiB
Markdown
96 lines
3.1 KiB
Markdown
# 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.
|