diff --git a/README.md b/README.md index 065aae4..fca93b1 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,8 @@ podman compose run --rm importer /app/scripts/03_import_pois.sh podman compose run --rm importer /app/scripts/04_import_geocoding.sh # Step 5: Preprocess OSRM routing graphs — run on the HOST, not in the container -# (OSRM tools only exist inside the osrm/osrm-backend image) +# Builds a local ARM64 OSRM image on first run (~30-60 min), then preprocesses +# car/foot/bicycle profiles. Subsequent runs skip the image build. bash backend/scripts/05_import_routing_host.sh ~/dev/maps/data # Step 6: Register offline regions in the database @@ -145,6 +146,8 @@ podman compose up -d postgres **Exec format error on Pi** — The postgres image is built locally from `postgis.Dockerfile` using `arm64v8/postgres` as base. Run `podman compose build postgres` to rebuild it. +**OSRM exec format error** — `osrm/osrm-backend` is amd64-only. The project uses `osrm-arm64.Dockerfile` to build a native ARM64 image. Run `podman compose build osrm-driving` (builds once, shared by all three OSRM services) or let `05_import_routing_host.sh` build it automatically. + --- ## Attribution diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml index f4536e7..842fbcf 100644 --- a/backend/docker-compose.yml +++ b/backend/docker-compose.yml @@ -72,25 +72,40 @@ services: - "2322:2322" osrm-driving: - image: docker.io/osrm/osrm-backend:latest + build: + context: . + dockerfile: osrm-arm64.Dockerfile networks: - maps-net ports: - "5000:5000" + volumes: + - ../data/osrm/car:/data + command: osrm-routed --algorithm mld /data/region.osrm osrm-walking: - image: docker.io/osrm/osrm-backend:latest + build: + context: . + dockerfile: osrm-arm64.Dockerfile networks: - maps-net ports: - "5001:5000" + volumes: + - ../data/osrm/foot:/data + command: osrm-routed --algorithm mld /data/region.osrm osrm-cycling: - image: docker.io/osrm/osrm-backend:latest + build: + context: . + dockerfile: osrm-arm64.Dockerfile networks: - maps-net ports: - "5002:5000" + volumes: + - ../data/osrm/bicycle:/data + command: osrm-routed --algorithm mld /data/region.osrm importer: build: diff --git a/backend/osrm-arm64.Dockerfile b/backend/osrm-arm64.Dockerfile new file mode 100644 index 0000000..5ed8065 --- /dev/null +++ b/backend/osrm-arm64.Dockerfile @@ -0,0 +1,41 @@ +FROM docker.io/arm64v8/debian:bookworm AS builder + +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential cmake git pkg-config \ + libboost-all-dev libtbb-dev liblua5.4-dev \ + libxml2-dev libzip-dev libbz2-dev \ + && rm -rf /var/lib/apt/lists/* + +ARG OSRM_VERSION=v5.27.1 +RUN git clone --depth=1 --branch ${OSRM_VERSION} \ + https://github.com/Project-OSRM/osrm-backend.git /osrm + +RUN cd /osrm && mkdir build && cd build && \ + cmake .. -DCMAKE_BUILD_TYPE=Release && \ + make -j$(nproc) osrm-extract osrm-partition osrm-customize osrm-routed && \ + make install + +# ---- runtime ---- +FROM docker.io/arm64v8/debian:bookworm-slim + +RUN apt-get update && apt-get install -y --no-install-recommends \ + libboost-filesystem1.81.0 \ + libboost-iostreams1.81.0 \ + libboost-regex1.81.0 \ + libboost-date-time1.81.0 \ + libboost-thread1.81.0 \ + libboost-program-options1.81.0 \ + libtbb12 liblua5.4-0 libxml2 libzip4 libbz2-1.0 \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=builder /usr/local/bin/osrm-extract \ + /usr/local/bin/osrm-partition \ + /usr/local/bin/osrm-customize \ + /usr/local/bin/osrm-routed \ + /usr/local/bin/ + +# Lua profiles (car.lua, foot.lua, bicycle.lua, etc.) +COPY --from=builder /osrm/profiles/ /opt/ + +WORKDIR /data +EXPOSE 5000 diff --git a/backend/scripts/05_import_routing_host.sh b/backend/scripts/05_import_routing_host.sh index a1e0dcb..3c72025 100755 --- a/backend/scripts/05_import_routing_host.sh +++ b/backend/scripts/05_import_routing_host.sh @@ -1,13 +1,17 @@ #!/bin/bash # scripts/05_import_routing_host.sh # Run this directly on the Pi host (not inside the importer container). -# OSRM tools only exist inside the osrm/osrm-backend image. +# Builds a local ARM64 OSRM image if it doesn't exist, then preprocesses +# routing graphs for car, foot, and bicycle profiles. set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BACKEND_DIR="$(dirname "$SCRIPT_DIR")" DATA_DIR="${1:-$HOME/dev/maps/data}" OSRM_DIR="${DATA_DIR}/osrm" PBF_FILE="${DATA_DIR}/osm/region.osm.pbf" +OSRM_IMAGE="maps-osrm-arm64:latest" if [ ! -f "$PBF_FILE" ]; then echo "ERROR: PBF file not found at $PBF_FILE" @@ -15,6 +19,15 @@ if [ ! -f "$PBF_FILE" ]; then exit 1 fi +# Build the ARM64 OSRM image if not already present +if ! podman image exists "$OSRM_IMAGE"; then + echo "=== Building ARM64 OSRM image (one-time, ~30-60 min on Pi) ===" + podman build \ + -f "${BACKEND_DIR}/osrm-arm64.Dockerfile" \ + -t "$OSRM_IMAGE" \ + "$BACKEND_DIR" +fi + for PROFILE in car foot bicycle; do PROFILE_DIR="${OSRM_DIR}/${PROFILE}" mkdir -p "$PROFILE_DIR" @@ -24,17 +37,17 @@ for PROFILE in car foot bicycle; do podman run --rm \ -v "${PROFILE_DIR}:/data" \ - docker.io/osrm/osrm-backend:latest \ + "$OSRM_IMAGE" \ osrm-extract -p "/opt/${PROFILE}.lua" /data/region.osm.pbf podman run --rm \ -v "${PROFILE_DIR}:/data" \ - docker.io/osrm/osrm-backend:latest \ + "$OSRM_IMAGE" \ osrm-partition /data/region.osrm podman run --rm \ -v "${PROFILE_DIR}:/data" \ - docker.io/osrm/osrm-backend:latest \ + "$OSRM_IMAGE" \ osrm-customize /data/region.osrm echo "OSRM $PROFILE profile ready."