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