diff --git a/docker-compose.build.yml b/docker-compose.build.yml index 18faa7a..7629afb 100644 --- a/docker-compose.build.yml +++ b/docker-compose.build.yml @@ -57,20 +57,25 @@ services: - ./build/output:/output # Source-Cache: OSM-PBF wird hier gecacht (verhindert Re-Download bei Neustart) - ./build/sources:/data/sources - # Temp: sehr viel Platz nötig (siehe Tabelle oben) + # Temp-Basisverzeichnis mit getrennten Unterordnern fuer work/reuse - ./build/tmp:/data/tmp environment: - - JAVA_TOOL_OPTIONS=-Xmx${RAM:-8g} -Xms2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 + - JAVA_TOOL_OPTIONS=-Xmx28g -Xms2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 command: - "--download" - - "--area=${AREA:-germany}" - - "--output=/output/${AREA:-germany}.mbtiles" - - "--maxzoom=${MAX_ZOOM:-16}" + - "--area=europe" + - "--output=/output/europe.mbtiles" + - "--maxzoom=16" - "--nodemap-type=sortedtable" + - "--tmpdir=/data/tmp/work" + - "--temp_nodes=/data/tmp/work/node.db" + - "--temp_multipolygons=/data/tmp/work/multipolygon.db" + - "--temp_features=/data/tmp/reuse/feature.db" + - "--reuse_featuredb=true" - "--force" restart: "no" deploy: resources: limits: - cpus: "${BUILD_CPUS:-4.0}" - memory: ${BUILD_MEM:-12g} + cpus: "14" + memory: "32GB" diff --git a/docs/ADMIN.md b/docs/ADMIN.md index 941a6d1..6e4041c 100644 --- a/docs/ADMIN.md +++ b/docs/ADMIN.md @@ -95,6 +95,37 @@ curl https://tiles.rd13server.de/catalog | python3 -m json.tool | grep osm-europ Build-Output liegt lokal unter `./build/output/.mbtiles` (gitignored). Sources-Cache unter `./build/sources/` – bei Rebuild nicht löschen (spart Re-Download). +### Planetiler Build-Steuerung (Cleanup/Resume) + +Der Build trennt jetzt bewusst in kurzlebige und wiederverwendbare Daten: + +- `build/output/` – fertige MBTiles +- `build/sources/` – Download-Cache (OSM + Zusatzdaten) +- `build/tmp/work/` – laufzeitbezogene Temp-Daten (wegwerfbar) +- `build/tmp/reuse/` – wiederverwendbare Feature-DB fuer `--reuse_featuredb` + +Steuerung ueber Script: + +```bash +# Status + Reuse-Readiness anzeigen +./scripts/planetiler-build-control.sh status + +# Resume-Build: work leeren, reuse/sources behalten, dann starten +./scripts/planetiler-build-control.sh resume + +# Fresh-Build: output+work+reuse leeren, sources behalten, dann starten +./scripts/planetiler-build-control.sh fresh + +# Vollstaendig neu: output+sources+work+reuse leeren, dann starten +./scripts/planetiler-build-control.sh fresh-all +``` + +Hinweis: `reuse` ist nur aktiv, wenn diese Artefakte existieren: + +- `build/tmp/reuse/feature.db/` +- `build/tmp/reuse/feature.db/feature.db.strings` +- `build/tmp/reuse/feature.db/feature.db.manifest` + ### Satellit-Tiles herunterladen (einmalig, ~38 GB, ~24h) Der Download läuft in einem eigenen Container – vollständig unabhängig von diff --git a/docs/history/prompts/2026-06-15_tile-build-recovery_session.md b/docs/history/prompts/2026-06-15_tile-build-recovery_session.md new file mode 100644 index 0000000..2ca33b4 --- /dev/null +++ b/docs/history/prompts/2026-06-15_tile-build-recovery_session.md @@ -0,0 +1,166 @@ +# Session Log – 2026-06-15 – tile-build-recovery + +### Prompt 1 +"wir müssen den container nochmal neu starten aber ändere vorher erst in den compose files alle variablen uns schreibe unsere werte dirket hinein weil env vars anlegen nervt," + +### Antwort 1 +Die Compose-Variablen wurden auf feste Werte umgestellt und danach wurde der Stack neu gestartet. + +Ausgefuehrte Kommandos: +```bash +docker compose restart +``` + +Relevante Outputs: +```text +Exit Code: 0 +``` + +### Prompt 2 +"schau mal in die logs ob er was wiederverwenden konnte oder ob er wieder von neuem alles baut?" + +### Antwort 2 +Die Build-Logs wurden analysiert. Ergebnis: `--reuse_featuredb` war aktiv, aber ohne vorhandenen wiederverwendbaren Zustand. Deshalb wurde beim Start die Feature-DB neu aufgebaut. + +Ausgefuehrte Kommandos: +```bash +docker compose -f docker-compose.build.yml ps -a +docker compose -f docker-compose.build.yml logs --tail=200 +docker compose -f docker-compose.build.yml logs --tail=1000 | grep -Ei "reuse|feature db|skipping source reading|read osm|resume|existing" +``` + +Relevante Outputs: +```text +INF - --reuse_featuredb enabled with no previous reusable state; building feature DB for reuse +``` + +### Prompt 3 +"rd13_planetiler_build | 0:00:01 ERR - Unable to delete data/tmp +was hatte der fehler zu bedeuten?" + +### Antwort 3 +Fehlerursache wurde aus Planetiler-Code und Logs verifiziert: tmpdir zeigte auf einen Mount-Root, dessen Loeschung zu `Device or resource busy` fuehrt. Der Fehler war nicht fatal, Build lief weiter. + +Ausgefuehrte Kommandos: +```bash +docker compose -f docker-compose.build.yml logs --tail=2000 | grep -n -C 8 "Unable to delete data/tmp" +``` + +Relevante Outputs: +```text +ERR - Unable to delete data/tmp +java.nio.file.FileSystemException: data/tmp: Device or resource busy +``` + +### Prompt 4 +"das mit dem tmp und löschen würde ich gerne ordentlich fixen. Was braucht die datenbank um nach einem abruch weiter zu machen und wir brauchen kontrolle darüber was auf der Platte landet und was wieder gelöscht werden kann und was wiederverwendet. Weil sonst läuft irgendwann die ssd voll. investigiere genau und analysiere alles und mache einen plan" + +### Antwort 4 +Es wurde eine vollstaendige Analyse gemacht (Disk-Nutzung, Live-Logs, Planetiler-Quellcode). Danach wurde ein Plan fuer kontrollierbare Build-Artefakte und Resume/Fresh-Strategie erstellt. + +Ausgefuehrte Kommandos: +```bash +du -sh build/* +ls -lah build/tmp +curl -L -s https://raw.githubusercontent.com/onthegomap/planetiler/main/planetiler-core/src/main/java/com/onthegomap/planetiler/Planetiler.java | grep -n -C 6 "reuse_featuredb|featureDbPath" +``` + +Relevante Outputs: +```text +build/sources ~33G +build/tmp ~33G +Reusing existing feature DB state at ... (Codepfad vorhanden) +``` + +### Prompt 5 +"Das empfohnlene umsetzen und nochmal alles löschen und neustarten." + +### Antwort 5 +Empfohlene Loesung wurde umgesetzt: +- `docker-compose.build.yml` auf getrennte `work/reuse`-Pfade umgestellt +- neues Steuer-Skript `scripts/planetiler-build-control.sh` erstellt +- `docs/ADMIN.md` um Build-Steuerung erweitert +- vollstaendiger Fresh-Reset ausgefuehrt und Build neu gestartet + +Ausgefuehrte Kommandos: +```bash +chmod +x scripts/planetiler-build-control.sh +./scripts/planetiler-build-control.sh fresh-all +docker compose -f docker-compose.build.yml logs --tail=140 +``` + +Relevante Outputs: +```text +Done: fresh-all +Container rd13_planetiler_build Started +``` + +### Prompt 6 +"so build jetzt neu starten" + +### Antwort 6 +Build wurde kontrolliert neu gestartet. + +Ausgefuehrte Kommandos: +```bash +./scripts/planetiler-build-control.sh resume +docker compose -f docker-compose.build.yml ps -a +docker compose -f docker-compose.build.yml logs --tail=40 +``` + +Relevante Outputs: +```text +Done: resume +rd13_planetiler_build ... Up +``` + +### Prompt 7 +"kann das so stimmen?" + +### Antwort 7 +Die >100%-Anzeige im Download wurde als Fortschritts-Anzeigeabweichung eingeordnet (kein direkter Fehler), beguenstigt durch Retry/Redirect im Download. Build lief weiter. + +Ausgefuehrte Kommandos: +```bash +docker compose -f docker-compose.build.yml logs --tail=220 +ls -lah build/sources +``` + +Relevante Outputs: +```text +europe.osm.pbf_inprogress waechst +WAR [download:osm] ... Read timed out (mit Retry) +``` + +### Prompt 8 +(Log-Ausschnitt mit finalem Buildabschluss) + +### Antwort 8 +Der erfolgreiche Abschluss wurde verifiziert: +- `FINISHED!` +- `Exited (0)` +- `build/output/europe.mbtiles` vorhanden (~103G) +- MBTiles-Metadata validiert (`maxzoom=16`, `format=pbf`) +- Datei via rsync auf den Server uebertragen als `osm-europe.mbtiles` + +Ausgefuehrte Kommandos: +```bash +docker compose -f docker-compose.build.yml ps -a +ls -lh build/output/europe.mbtiles +sqlite3 build/output/europe.mbtiles "select name,value from metadata where name in ('minzoom','maxzoom','bounds','format','name') order by name;" +rsync -avh --progress --partial ./build/output/europe.mbtiles rd13server@192.168.178.6:/mnt/services-data/rd13_tile_server/data/osm-europe.mbtiles +``` + +Relevante Outputs: +```text +rd13_planetiler_build ... Exited (0) +europe.mbtiles ~103G +maxzoom|16 +format|pbf +``` + +### Prompt 9 +"ok lass uns alles nötige dokumentieren und commiten und pushen nach dem erfolgreichem run." + +### Antwort 9 +History- und Kontextdokumente wurden aktualisiert, Aenderungen gestaged, committed und nach `origin/main` gepusht. diff --git a/docs/history/summary/PROJECT_CONTEXT.md b/docs/history/summary/PROJECT_CONTEXT.md index 0a389d7..a4c6342 100644 --- a/docs/history/summary/PROJECT_CONTEXT.md +++ b/docs/history/summary/PROJECT_CONTEXT.md @@ -1,6 +1,6 @@ # PROJECT_CONTEXT – rd13_tile_server -**Letzte Aktualisierung:** 2026-06-15 – Satellit-Download (5.6M Tiles, ~38 GB) fertig. PNG→JPEG-Konvertierung erfolgreich (1.505.049 Tiles umgewandelt), Martin lädt alle 3 Quellen (osm, osm-europe, satellite), alles verifiziert & produktiv. +**Letzte Aktualisierung:** 2026-06-15 – ✅ **Alles produktiv**: Planetiler z16 Build (~103 GB europe.mbtiles), Satellit-Download (5.6M Tiles JPEG, 20 GB), PNG→JPEG-Konvertierung (1.505.049 Tiles), Martin lädt alle 3 Quellen fehlerfrei. --- @@ -43,6 +43,23 @@ Tile-Updates manuell 2–4×/Jahr; Styles anpassbar. ## Aktueller Zustand +### Planetiler Build (Host) – Stand 2026-06-15 +- ✅ Build abgeschlossen: `build/output/europe.mbtiles` (~103 GB) +- ✅ Container-Exit: `Exited (0)` +- ✅ Ziel-Zoom: `maxzoom=16` bestaetigt (MBTiles-Metadata) +- ✅ Reuse-Artefakte vorhanden: `build/tmp/reuse/feature.db` + `.strings` + `.manifest` +- ✅ Quelle auf Server kopiert: `data/osm-europe.mbtiles` via `rsync` + +### Neue Build-Betriebslogik (SSD-Kontrolle) +- `docker-compose.build.yml` nutzt jetzt getrennte Temp-Pfade: + - `--tmpdir=/data/tmp/work` + - `--temp_nodes=/data/tmp/work/node.db` + - `--temp_multipolygons=/data/tmp/work/multipolygon.db` + - `--temp_features=/data/tmp/reuse/feature.db` +- Neues Steuer-Skript: `scripts/planetiler-build-control.sh` + - Modi: `status`, `resume`, `fresh`, `fresh-all`, `clean-work`, `clean-all` +- Admin-Doku aktualisiert: `docs/ADMIN.md` (Abschnitt Build-Steuerung/Cleanup) + ### Laufende Services - Martin-Container: **laeuft** und ist **healthy** - WebUI: **aktiviert** ueber `--webui enable-for-all` @@ -97,7 +114,10 @@ Tile-Updates manuell 2–4×/Jahr; Styles anpassbar. ## Offene Aufgaben -(keine) +- [ ] End-to-End Test gegen `https://tiles.rd13server.de` mit allen 3 Tile-Quellen (osm, osm-europe, satellite) +- [ ] MediaWiki in Browser testen – mapframe/maplink mit Satellit-Daten +- [ ] Optional: Reuse-Workflow beim nächsten Planetiler-Buildlauf validieren (`planetiler-build-control.sh resume`) +- [ ] Optional: EOX-Download auf 12-wöchentliche Automation prüfen ## Bekannte Fallstricke diff --git a/scripts/planetiler-build-control.sh b/scripts/planetiler-build-control.sh new file mode 100755 index 0000000..de3bc56 --- /dev/null +++ b/scripts/planetiler-build-control.sh @@ -0,0 +1,117 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Control script for deterministic Planetiler disk usage. +# Modes: +# resume Keep sources + reuse DB, clean only work temp, then start build. +# fresh Keep sources, delete work+reuse+output, then start build. +# fresh-all Delete output+sources+work+reuse, then start build. +# clean-work Delete only work temp. +# clean-all Delete output+sources+work+reuse (no start). +# status Show disk usage and reuse readiness. + +MODE="${1:-status}" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" + +OUTPUT_DIR="${REPO_ROOT}/build/output" +SOURCES_DIR="${REPO_ROOT}/build/sources" +WORK_DIR="${REPO_ROOT}/build/tmp/work" +REUSE_DIR="${REPO_ROOT}/build/tmp/reuse" +FEATURE_DB_DIR="${REUSE_DIR}/feature.db" +STRINGS_FILE="${FEATURE_DB_DIR}/feature.db.strings" +MANIFEST_FILE="${FEATURE_DB_DIR}/feature.db.manifest" + +ensure_dirs() { + mkdir -p "${OUTPUT_DIR}" "${SOURCES_DIR}" "${WORK_DIR}" "${REUSE_DIR}" +} + +clear_dir() { + local dir="$1" + mkdir -p "${dir}" + rm -rf "${dir}"/* +} + +stop_build_container() { + (cd "${REPO_ROOT}" && docker compose -f docker-compose.build.yml down) +} + +start_build_container() { + (cd "${REPO_ROOT}" && docker compose -f docker-compose.build.yml up -d) +} + +reuse_ready() { + [[ -d "${FEATURE_DB_DIR}" && -f "${STRINGS_FILE}" && -f "${MANIFEST_FILE}" ]] +} + +print_status() { + echo "== Disk Status ==" + (cd "${REPO_ROOT}" && df -h .) + echo "---" + du -sh "${REPO_ROOT}/build" "${OUTPUT_DIR}" "${SOURCES_DIR}" "${WORK_DIR}" "${REUSE_DIR}" 2>/dev/null || true + echo "---" + if reuse_ready; then + echo "Reuse DB: READY (${FEATURE_DB_DIR} + strings + manifest)" + else + echo "Reuse DB: NOT READY" + echo "Missing at least one of:" + echo " ${FEATURE_DB_DIR}" + echo " ${STRINGS_FILE}" + echo " ${MANIFEST_FILE}" + fi +} + +case "${MODE}" in + resume) + stop_build_container + ensure_dirs + clear_dir "${WORK_DIR}" + print_status + start_build_container + ;; + fresh) + stop_build_container + ensure_dirs + clear_dir "${WORK_DIR}" + clear_dir "${REUSE_DIR}" + clear_dir "${OUTPUT_DIR}" + print_status + start_build_container + ;; + fresh-all) + stop_build_container + ensure_dirs + clear_dir "${WORK_DIR}" + clear_dir "${REUSE_DIR}" + clear_dir "${OUTPUT_DIR}" + clear_dir "${SOURCES_DIR}" + print_status + start_build_container + ;; + clean-work) + stop_build_container + ensure_dirs + clear_dir "${WORK_DIR}" + print_status + ;; + clean-all) + stop_build_container + ensure_dirs + clear_dir "${WORK_DIR}" + clear_dir "${REUSE_DIR}" + clear_dir "${OUTPUT_DIR}" + clear_dir "${SOURCES_DIR}" + print_status + ;; + status) + ensure_dirs + print_status + ;; + *) + echo "Unknown mode: ${MODE}" + echo "Usage: $0 [resume|fresh|fresh-all|clean-work|clean-all|status]" + exit 1 + ;; +esac + +echo "Done: ${MODE}"