Benutzer-Werkzeuge

Webseiten-Werkzeuge


osrm

Dies ist eine alte Version des Dokuments!


Open Source Routing Machine.

#!/usr/bin/env bash
set -euo pipefail
 
OSRM_DIR="/opt/osrm-austria"
DATA_DIR="${OSRM_DIR}/data"
PROFILE_DIR="${OSRM_DIR}/profiles"
SERVICE_FILE="/etc/systemd/system/osrm-austria.service"
PBF_URL="https://download.geofabrik.de/europe/austria-latest.osm.pbf"
PBF_FILE="${DATA_DIR}/austria-latest.osm.pbf"
CONTAINER_IMAGE="ghcr.io/project-osrm/osrm-backend:latest"
PORT="5000"
 
log() {
    echo "[+] $1"
}
 
require_root() {
    if [[ "${EUID}" -ne 0 ]]; then
        echo "Bitte als root oder mit sudo ausführen."
        exit 1
    fi
}
 
install_packages() {
    log "Installiere Basis-Pakete..."
    apt-get update
    apt-get install -y \
        ca-certificates \
        curl \
        gnupg \
        lsb-release \
        wget \
        systemd
}
 
install_docker() {
    if command -v docker >/dev/null 2>&1; then
        log "Docker ist bereits installiert."
        return
    fi
 
    log "Installiere Docker..."
    install -m 0755 -d /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    chmod a+r /etc/apt/keyrings/docker.asc
 
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
      https://download.docker.com/linux/ubuntu \
      $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
      > /etc/apt/sources.list.d/docker.list
 
    apt-get update
    apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
 
    systemctl enable docker
    systemctl start docker
}
 
prepare_dirs() {
    log "Erzeuge Verzeichnisse..."
    mkdir -p "${DATA_DIR}"
    mkdir -p "${PROFILE_DIR}"
}
 
download_data() {
    if [[ -f "${PBF_FILE}" ]]; then
        log "PBF-Datei existiert bereits: ${PBF_FILE}"
    else
        log "Lade Österreich-OSM-Daten herunter..."
        wget -O "${PBF_FILE}" "${PBF_URL}"
    fi
}
 
download_profile() {
    local profile_file="${PROFILE_DIR}/foot.lua"
 
    if [[ -f "${profile_file}" ]]; then
        log "Profil existiert bereits: ${profile_file}"
        return
    fi
 
    log "Lade OSRM foot.lua Profil..."
    wget -O "${profile_file}" \
        "https://raw.githubusercontent.com/Project-OSRM/osrm-backend/master/profiles/foot.lua"
}
 
build_osrm_data() {
    log "Entferne alte OSRM-Artefakte..."
    rm -f "${DATA_DIR}/austria-latest.osrm"*
    rm -f "${DATA_DIR}/austria-latest.osrm.datasource_names"
    rm -f "${DATA_DIR}/austria-latest.osrm.names"
    rm -f "${DATA_DIR}/austria-latest.osrm.timestamp"
 
    log "Starte osrm-extract mit foot.lua ..."
    docker run --rm \
        -t \
        -v "${DATA_DIR}:/data" \
        -v "${PROFILE_DIR}:/profiles" \
        "${CONTAINER_IMAGE}" \
        osrm-extract \
        -p /profiles/foot.lua \
        /data/austria-latest.osm.pbf
 
    log "Starte osrm-partition ..."
    docker run --rm \
        -t \
        -v "${DATA_DIR}:/data" \
        "${CONTAINER_IMAGE}" \
        osrm-partition \
        /data/austria-latest.osrm
 
    log "Starte osrm-customize ..."
    docker run --rm \
        -t \
        -v "${DATA_DIR}:/data" \
        "${CONTAINER_IMAGE}" \
        osrm-customize \
        /data/austria-latest.osrm
}
 
create_service() {
    log "Erzeuge systemd-Service ${SERVICE_FILE} ..."
 
    cat > "${SERVICE_FILE}" <<EOF
[Unit]
Description=OSRM Austria Walking Server
After=docker.service network-online.target
Requires=docker.service
Wants=network-online.target
 
[Service]
Type=simple
Restart=always
RestartSec=5
ExecStartPre=-/usr/bin/docker rm -f osrm-austria
ExecStart=/usr/bin/docker run --name osrm-austria -p ${PORT}:5000 -t -i -v ${DATA_DIR}:/data ${CONTAINER_IMAGE} osrm-routed --algorithm mld /data/austria-latest.osrm
ExecStop=/usr/bin/docker stop osrm-austria
 
[Install]
WantedBy=multi-user.target
EOF
 
    systemctl daemon-reload
    systemctl enable osrm-austria.service
    systemctl restart osrm-austria.service
}
 
show_result() {
    log "Fertig."
    echo
    echo "Test lokal:"
    echo "curl 'http://127.0.0.1:${PORT}/route/v1/walking/16.3725,48.2082;16.3738,48.2100?overview=false'"
    echo
    echo "Service-Status:"
    echo "systemctl status osrm-austria.service"
    echo
    echo "Logs:"
    echo "journalctl -u osrm-austria.service -f"
}
 
main() {
    require_root
    install_packages
    install_docker
    prepare_dirs
    download_data
    download_profile
    build_osrm_data
    create_service
    show_result
}
 
main "$@"
osrm.1774346340.txt.gz · Zuletzt geändert: 2026/03/24 10:59 von jango