initial commit
This commit is contained in:
95
README.md
Normal file
95
README.md
Normal file
@@ -0,0 +1,95 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user