Files
HexaWetter/README.md
2026-06-18 23:59:08 +02:00

107 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```bash
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)
- **Radar-Animation**: Zeitleiste (60120 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/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 `.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
- API-Port nur auf `127.0.0.1` gebunden (kein direkter externer Zugriff)
- Schreibende Endpunkte (Radar-Sync, Cache leeren, Einstellungen) nur im Admin-Bereich
```bash
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/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)
```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.