Spaces:
Configuration error
Configuration error
File size: 3,735 Bytes
53e9cae 5cd5e02 53e9cae 5cd5e02 53e9cae |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
metadata
title: Rheinpegel-Python
emoji: 💻
colorFrom: yellow
colorTo: red
sdk: docker
pinned: false
<<<<<<< HEAD
# rheinpegel-python-app
=======
# Rheinpegel App
Eine moderne FastAPI-Anwendung, die den aktuellen Rheinpegel (Köln) abruft, zwischenspeichert und visuell aufbereitet. Die Anwendung kombiniert serverseitiges Polling mit einem reaktiven Frontend (AJAX, Countdown, Sparkline) und liefert zusätzlich Status- sowie Prometheus-Kennzahlen.
## Hauptfunktionen
- **Asynchrones Polling** der offiziellen Quelle via `httpx` mit Timeout (8 s) und exponentiellem Backoff (4 Versuche).
- **Automatische Format-Erkennung** für JSON oder XML und robuste Feldzuordnung.
- **Trend-Berechnung** aus Rohdaten oder anhand der letzten Messwerte (Δ > 2 cm ⇒ ↑, Δ < −2 ⇒ ↓).
- **Mehrstufiges Caching**: In-Memory-Ringpuffer (48 Werte) + JSON-Persistenz unter `data/cache.json`.
- **Demo-Modus** bei Netzwerkfehlern oder via `?demo=1` mit synthetischen, plausiblen Messwerten.
- **FastAPI + Jinja2** Dashboard mit responsive Karte, Warnstufen, Sparkline (Inline-SVG) sowie Auto-Refresh-Toggle und Countdown.
- **Prometheus-Metriken**: letzte Latenz, Erfolgs-/Fehlerzähler, Datenalter und Health-Endpoint.
## Voraussetzungen
- Python 3.11+
- Optional: [uv](https://github.com/astral-sh/uv) für schnelle virtuelle Umgebungen
## Installation & Setup
### Variante A: uv
```bash
uv venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
uv pip install -e .
cp .env.example .env
```
### Variante B: pip / venv
```bash
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install --upgrade pip
pip install -e .
copy .env.example .env # Windows
```
> **Hinweis:** Die Umgebungsvariablen (.env) steuern u.a. den Polling-Intervall (`REFRESH_SECONDS`), die Quelle (`SOURCE_URL`) und die Zeitzone (`TZ`).
## Starten der Anwendung
```bash
uvicorn app.main:app --reload
# oder
python -m app.main
```
Die Oberfläche ist anschließend unter http://127.0.0.1:8000 erreichbar.
## Wichtige Endpunkte
| Route | Beschreibung |
|-----------------|-------------------------------------------------|
| `/` | Dashboard mit Live-Karte, Trend, Sparkline |
| `/api/latest` | Neueste Messung (JSON) + komplette Historie |
| `/api/history` | Maximal 48 Messpunkte aus dem Ringpuffer |
| `/healthz` | 200 OK, wenn der Hintergrund-Task aktiv ist |
| `/metrics` | Prometheus-kompatible Kennzahlen |
### Demo-Modus
Alle Endpunkte akzeptieren `?demo=1`, um synthetische Daten zu liefern und das UI als „Demo“ zu markieren.
## Tests
```bash
pytest
```
Die Tests decken das Parsing (JSON/XML) sowie zentrale FastAPI-Endpunkte ab.
## Docker
```bash
docker build -t rheinpegel-app .
docker run -p 8000:8000 --env-file .env rheinpegel-app
```
Oder via Compose:
```bash
docker-compose up --build
```
Der Container läuft als Non-Root-User, besitzt einen Healthcheck (`/healthz`) und bindet `./data` für persistente Caches ein.
## Beispiel systemd Unit (optional)
```ini
[Unit]
Description=Rheinpegel App
After=network.target
[Service]
User=www-data
WorkingDirectory=/opt/rheinpegel-app
EnvironmentFile=/opt/rheinpegel-app/.env
ExecStart=/opt/rheinpegel-app/.venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000
Restart=always
[Install]
WantedBy=multi-user.target
```
## Weiterentwicklung
- UI-Optimierungen, z. B. zusätzliche Karten oder historische Auswertungen
- Export in weitere Formate (CSV/ICS)
- Alarm-Benachrichtigungen (E-Mail, Webhooks) basierend auf Warnstufen
Viel Spaß beim Ausprobieren der Rheinpegel-App!
>>>>>>> 6c0a1e2 (Initial commit)
|