rd13_tile_server/scripts/build-host.sh

122 lines
4.7 KiB
Bash
Raw Permalink Normal View History

#!/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 "================================================================"