121 lines
4.7 KiB
Bash
Executable file
121 lines
4.7 KiB
Bash
Executable file
#!/usr/bin/env bash
|
||
# =============================================================================
|
||
# build-host.sh -- OSM Vektor-Tiles auf Host-Rechner bauen + auf Server deployen
|
||
#
|
||
# Dieses Script läuft auf dem HOST-RECHNER (nicht auf dem Server).
|
||
# Voraussetzung: Docker Desktop (macOS/Windows) oder Docker (Linux)
|
||
#
|
||
# Verwendung:
|
||
# ./scripts/build-host.sh [germany|europe|planet] [SERVER_USER@SERVER_HOST]
|
||
#
|
||
# Beispiele:
|
||
# ./scripts/build-host.sh germany rd13server@192.168.178.6
|
||
# ./scripts/build-host.sh europe rd13server@192.168.178.6
|
||
#
|
||
# Das fertige MBTiles wird per rsync auf den Server übertragen und Martin
|
||
# automatisch neu gestartet.
|
||
#
|
||
# Hardware-Anforderungen:
|
||
# germany: ≥ 8 GB RAM, ≥ 30 GB freier Disk, ~2h
|
||
# europe: ≥ 16 GB RAM, ≥ 200 GB freier Disk, ~8-12h
|
||
# planet: ≥ 32 GB RAM, ≥ 500 GB freier Disk, ~24h
|
||
# =============================================================================
|
||
set -euo pipefail
|
||
|
||
AREA="${1:-germany}"
|
||
REMOTE="${2:-}"
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
BUILD_DIR="${SCRIPT_DIR}/../data/build"
|
||
OUTPUT_FILE="${BUILD_DIR}/${AREA}.mbtiles"
|
||
|
||
# ── RAM-Profil ───────────────────────────────────────────────────────────────
|
||
case "$AREA" in
|
||
germany) RAM="8g" ;;
|
||
austria) RAM="4g" ;;
|
||
europe) RAM="16g" ;;
|
||
planet) RAM="32g" ;;
|
||
*)
|
||
echo "Unbekannte Region: $AREA"
|
||
echo "Verfügbar: germany | austria | europe | planet"
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
mkdir -p "$BUILD_DIR"
|
||
|
||
echo "================================================================"
|
||
echo " rd13 Tile-Build | Region: $AREA | RAM: $RAM | $(date)"
|
||
echo " Output: $OUTPUT_FILE"
|
||
echo "================================================================"
|
||
|
||
# ── 1. Planetiler bauen ──────────────────────────────────────────────────────
|
||
echo ""
|
||
echo "[1/3] Starte Planetiler via Docker..."
|
||
echo " (OSM-Daten werden automatisch von Geofabrik heruntergeladen)"
|
||
echo ""
|
||
|
||
docker run --rm \
|
||
-v "${BUILD_DIR}:/data" \
|
||
-e JAVA_TOOL_OPTIONS="-Xmx${RAM}" \
|
||
ghcr.io/onthegomap/planetiler:latest \
|
||
--download \
|
||
--area="${AREA}" \
|
||
--output="/data/${AREA}.mbtiles" \
|
||
--maxzoom=16 \
|
||
--force
|
||
|
||
echo ""
|
||
echo "[1/3] Build fertig: $(ls -lh "$OUTPUT_FILE" | awk '{print $5}')"
|
||
|
||
# ── 2. Validieren ────────────────────────────────────────────────────────────
|
||
echo "[2/3] Validiere MBTiles..."
|
||
python3 - <<PYEOF
|
||
import sqlite3, sys
|
||
conn = sqlite3.connect("${OUTPUT_FILE}")
|
||
meta = dict(conn.execute("SELECT name, value FROM metadata").fetchall())
|
||
maxzoom = meta.get("maxzoom", "?")
|
||
bounds = meta.get("bounds", "?")
|
||
count = conn.execute("SELECT COUNT(*) FROM tiles").fetchone()[0]
|
||
print(f" Name: {meta.get('name','?')}")
|
||
print(f" MaxZoom: {maxzoom}")
|
||
print(f" Bounds: {bounds}")
|
||
print(f" Tiles: {count:,}")
|
||
if int(maxzoom) < 14:
|
||
print("FEHLER: MaxZoom < 14 – Build unvollständig?")
|
||
sys.exit(1)
|
||
conn.close()
|
||
print(" ✓ Validierung OK")
|
||
PYEOF
|
||
|
||
# ── 3. Transfer auf Server ───────────────────────────────────────────────────
|
||
if [[ -n "$REMOTE" ]]; then
|
||
REMOTE_PATH="/mnt/services-data/rd13_tile_server/data/osm-${AREA}.mbtiles"
|
||
echo ""
|
||
echo "[3/3] Übertrage nach ${REMOTE}:${REMOTE_PATH}..."
|
||
echo " (rsync – bricht/fortsetzt bei Verbindungsunterbrechung)"
|
||
rsync -avh --progress \
|
||
--partial --partial-dir="${BUILD_DIR}/.rsync-partial" \
|
||
"${OUTPUT_FILE}" \
|
||
"${REMOTE}:${REMOTE_PATH}"
|
||
echo ""
|
||
echo "[3/3] Starte Martin auf Server neu..."
|
||
ssh "${REMOTE}" "cd /mnt/services-data/rd13_tile_server && docker compose restart martin"
|
||
echo ""
|
||
echo "✓ Fertig! Neue Source verfügbar unter:"
|
||
echo " https://tiles.rd13server.de/osm-${AREA}"
|
||
echo ""
|
||
echo " Füge in config/styles/osm-intl.json eine zweite Source hinzu:"
|
||
echo " \"osm-${AREA}\": { \"type\": \"vector\", \"url\": \"mbtiles://{osm-${AREA}}\" }"
|
||
else
|
||
echo ""
|
||
echo "[3/3] Kein Remote angegeben – Transfer übersprungen."
|
||
echo " MBTiles liegt unter: ${OUTPUT_FILE}"
|
||
echo ""
|
||
echo " Manueller Transfer:"
|
||
echo " rsync -avh --progress ${OUTPUT_FILE} USER@SERVER:/mnt/services-data/rd13_tile_server/data/osm-${AREA}.mbtiles"
|
||
fi
|
||
|
||
echo ""
|
||
echo "================================================================"
|
||
echo " Build abgeschlossen: $(date)"
|
||
echo "================================================================"
|