POI-Karte: Offline-Import aus OSM statt Live-Overpass-Scan (Build 4)

- osm.py: Live-Scanner deaktiviert — /pois liest nur noch aus DB,
  /analyze ist No-Op. Behebt wiederholte OSM-Banns (Tile-Load + Scanning).
- tools/osm-extract: Extraktion (pyosmium) + Loader (schützt user_edited)
  + Docker-Refresh-Job mit osmium-tags-filter-Vorstufe (RAM-schonend).
- docker-compose.osm.yml: Refresh-Service (mem_limit 4g), monatlich via
  DSM-Aufgabenplaner.
This commit is contained in:
rene 2026-06-03 20:44:32 +02:00
parent 214543559c
commit 4bc7454258
9 changed files with 457 additions and 26 deletions

View file

@ -0,0 +1,55 @@
# OSM-POI Offline-Refresh (Build 4)
Ersetzt das Live-Scannen gegen `overpass-api.de` (war wiederholt OSM-Bann-Quelle)
durch einen **monatlichen Offline-Batch**: POIs werden aus den Geofabrik-OSM-Daten
extrahiert und in die Produktiv-DB geladen. Danach keine OSM-Live-Last mehr.
## Bestandteile
| Datei | Zweck |
|---|---|
| `extract_osm_pois.py` | pbf → `osm_pois`-Schema (pyosmium). Kanonisches Kategorie→Tag-Mapping. |
| `load_into_prod.py` | Extrakt → Produktiv-DB. Schützt `user_edited=1`, ersetzt den Rest. |
| `refresh.sh` | Orchestrierung im Container: download → tags-filter → extract → load. |
| `Dockerfile` | Image mit osmium-tool + pyosmium. |
| `../../docker-compose.osm.yml` | Eigener Service, **nicht** im Default-Stack. |
## Was es tut
- Lädt CH/AT/DE von Geofabrik (~5,7 GB), dampft sie mit `osmium tags-filter`
(streaming, <500 MB RAM) auf die relevanten Objekte ein, extrahiert die 9
Ban-Yaro-Kategorien und lädt sie in `/data/banyaro.db`.
- **Sicherheitskopie** der DB vor jedem Lauf (letzte 3 bleiben).
- `user_edited=1`-POIs und `user_map_pois` (Community-Marker) bleiben unberührt.
- Peak-RAM ~12 GB, hartes `mem_limit: 4g` als Schutzschranke.
- Aktuelle Größenordnung: DACH ~1,45 Mio POIs, ~180 MB.
## Manuell ausführen (Test)
```sh
cd /pfad/zu/banyaro # dort, wo docker-compose.yml liegt
docker compose -f docker-compose.osm.yml build
docker compose -f docker-compose.osm.yml run --rm osm-refresh
```
## Monatlich per DSM-Aufgabenplaner
1. **Systemsteuerung → Aufgabenplaner → Erstellen → Geplante Aufgabe → Benutzerdefiniertes Skript**
2. Benutzer: `root` (für Docker-Zugriff)
3. Zeitplan: **monatlich**, z. B. am 1. um 04:00 (lastarm)
4. Aufgabeneinstellungen → Benutzerdefiniertes Skript:
```sh
cd /volume1/docker/banyaro && \
/usr/local/bin/docker compose -f docker-compose.osm.yml run --rm osm-refresh \
>> /volume1/docker/banyaro/data/osm-refresh.log 2>&1
```
> Pfad `/volume1/docker/banyaro` an euer Compose-Verzeichnis anpassen.
> Docker-Binary auf DSM ist meist `/usr/local/bin/docker` (`docker compose`),
> bei älteren DSM ggf. `docker-compose`.
## Rollback
Vor jedem Lauf wird `banyaro.pre-osm-JJJJMMTT.db` neben der DB abgelegt. Im
Notfall App stoppen, diese Datei auf `banyaro.db` zurückkopieren, App starten.