banyaro/tools/osm-extract/refresh.sh
rene 4bc7454258 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.
2026-06-03 20:44:32 +02:00

66 lines
2.4 KiB
Bash

#!/usr/bin/env bash
#
# Monatlicher POI-Refresh (Build 4) — läuft im Docker-Container auf der Synology.
# download → tags-filter (RAM-schonend) → extract → load in die Produktiv-DB.
# Ersetzt das Live-Overpass-Scannen (war Bann-Quelle).
#
# Erst-Migration ohne 5,7-GB-Download: vorab gebaute dach.sqlite mitliefern und
# PREBUILT_SQLITE=/data/dach.sqlite setzen → überspringt download/extract.
#
set -euo pipefail
DB="${DB_PATH:-/data/banyaro.db}"
WORK="${WORK_DIR:-/work}"
COUNTRIES="${COUNTRIES:-switzerland austria germany}"
GEOFABRIK="${GEOFABRIK_BASE:-https://download.geofabrik.de/europe}"
KEEP_BACKUPS="${KEEP_BACKUPS:-3}"
PREBUILT_SQLITE="${PREBUILT_SQLITE:-}"
# OSM-Tags für die 9 Ban-Yaro-Kategorien (Superset; finale Klassifikation macht
# extract_osm_pois.py). nw/ = node+way, referenzierte Knoten bleiben für die
# Weg-Geometrie automatisch erhalten.
FILTER=(
"nw/amenity=waste_basket,drinking_water,veterinary,bench,biergarten,restaurant,cafe"
"nw/leisure=dog_park,park"
"nw/shop=pet,pet_grooming"
"nw/craft=pet_grooming"
"nw/tourism=hotel,guest_house,hostel"
)
mkdir -p "$WORK"; cd "$WORK"
echo "[$(date -u)] POI-Refresh start → $DB"
# 1) Sicherheitskopie der Produktiv-DB (nur die letzten N behalten)
if [ -f "$DB" ]; then
bak="${DB%.db}.pre-osm-$(date -u +%Y%m%d).db"
cp -p "$DB" "$bak"
echo "Backup: $bak"
ls -1t "${DB%.db}".pre-osm-*.db 2>/dev/null | tail -n +$((KEEP_BACKUPS + 1)) | xargs -r rm -f
fi
# 2a) Schnellweg: vorab gebauten Extrakt direkt laden (kein Download/Extract)
if [ -n "$PREBUILT_SQLITE" ]; then
[ -f "$PREBUILT_SQLITE" ] || { echo "FEHLER: $PREBUILT_SQLITE nicht gefunden"; exit 1; }
echo "[$(date -u)] PREBUILT_SQLITE=$PREBUILT_SQLITE → überspringe download/extract"
python3 /app/load_into_prod.py "$PREBUILT_SQLITE" "$DB"
echo "[$(date -u)] POI-Refresh (prebuilt) fertig."
exit 0
fi
# 2b) Regulärer Monatslauf: frisch holen + extrahieren
rm -f dach.sqlite
for c in $COUNTRIES; do
echo "[$(date -u)] $c: download"
curl -fSL --retry 3 -o "$c.osm.pbf" "$GEOFABRIK/$c-latest.osm.pbf"
echo "[$(date -u)] $c: tags-filter"
osmium tags-filter --overwrite -o "$c.f.osm.pbf" "$c.osm.pbf" "${FILTER[@]}"
rm -f "$c.osm.pbf"
echo "[$(date -u)] $c: extract"
python3 /app/extract_osm_pois.py "$c.f.osm.pbf" dach.sqlite
rm -f "$c.f.osm.pbf"
done
echo "[$(date -u)] load → Produktiv-DB"
python3 /app/load_into_prod.py dach.sqlite "$DB"
rm -f dach.sqlite
echo "[$(date -u)] POI-Refresh fertig."