- 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.
66 lines
2.4 KiB
Bash
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."
|