diff --git a/ct/headers/valhalla b/ct/headers/valhalla new file mode 100644 index 000000000..1e3f114b9 --- /dev/null +++ b/ct/headers/valhalla @@ -0,0 +1,6 @@ + _ __ ____ ____ +| | / /___ _/ / /_ ____ _/ / /___ _ +| | / / __ `/ / __ \/ __ `/ / / __ `/ +| |/ / /_/ / / / / / /_/ / / / /_/ / +|___/\__,_/_/_/ /_/\__,_/_/_/\__,_/ + diff --git a/ct/valhalla.sh b/ct/valhalla.sh new file mode 100644 index 000000000..064c86d02 --- /dev/null +++ b/ct/valhalla.sh @@ -0,0 +1,104 @@ +#!/usr/bin/env bash +_CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main" +_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func" +source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func") +# Copyright (c) 2021-2026 community-scripts ORG +# Author: CrazyWolf13 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/valhalla/valhalla + +APP="Valhalla" +var_tags="${var_tags:-mapping;routing}" +var_cpu="${var_cpu:-4}" +var_ram="${var_ram:-8192}" +var_disk="${var_disk:-24}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +#var_arm64="${var_arm64:-no}" # unset = ask the user; set yes/no only when verified +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -f /etc/systemd/system/valhalla.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "prime_server" "kevinkreiser/prime_server"; then + RELEASE="$CHECK_UPDATE_RELEASE" + + msg_info "Stopping Service" + systemctl stop valhalla + msg_ok "Stopped Service" + + msg_info "Building prime_server ${RELEASE} (Patience)" + rm -rf /tmp/prime_server + git clone --recurse-submodules --depth 1 --branch "$RELEASE" https://github.com/kevinkreiser/prime_server /tmp/prime_server + cd /tmp/prime_server + $STD ./autogen.sh + $STD ./configure + $STD make -j"$(nproc)" + $STD make install + cd / + rm -rf /tmp/prime_server + ldconfig + echo "${RELEASE#v}" >"$HOME/.prime_server" + msg_ok "Built prime_server ${RELEASE}" + + msg_info "Starting Service" + systemctl start valhalla + msg_ok "Started Service" + fi + + if check_for_gh_release "valhalla" "valhalla/valhalla"; then + RELEASE="$CHECK_UPDATE_RELEASE" + + msg_info "Stopping Service" + systemctl stop valhalla + msg_ok "Stopped Service" + + msg_info "Fetching Valhalla ${RELEASE} (Patience)" + rm -rf /opt/valhalla + git clone --recurse-submodules --depth 1 --branch "$RELEASE" https://github.com/valhalla/valhalla.git /opt/valhalla + msg_ok "Fetched Valhalla ${RELEASE}" + + msg_info "Compiling Valhalla ${RELEASE} (this takes 20-45+ minutes, be patient)" + MEM_MB=$(awk '/MemTotal/{print int($2/1024)}' /proc/meminfo) + BUILD_JOBS=$((MEM_MB / 2000)) + [[ $BUILD_JOBS -lt 1 ]] && BUILD_JOBS=1 + [[ $BUILD_JOBS -gt $(nproc) ]] && BUILD_JOBS=$(nproc) + cd /opt/valhalla + $STD cmake -B build -DCMAKE_BUILD_TYPE=Release -DENABLE_PYTHON_BINDINGS=OFF -DENABLE_TESTS=OFF -DENABLE_SINGLE_FILES_WERROR=OFF + $STD cmake --build build -- -j"$BUILD_JOBS" + $STD cmake --install build + ldconfig + echo "${RELEASE#v}" >"$HOME/.valhalla" + msg_ok "Compiled Valhalla ${RELEASE}" + + msg_info "Starting Service" + systemctl start valhalla + msg_ok "Started Service" + fi + + msg_ok "Updated Successfully!\n" + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:8002/status${CL}" +echo -e "${INFO}${YW}No routing tiles are built yet. Build them for your region with:${CL}" +echo -e "${TAB}${BGN}/opt/valhalla_data/build-tiles.sh https://download.geofabrik.de//-latest.osm.pbf${CL}" diff --git a/install/valhalla-install.sh b/install/valhalla-install.sh new file mode 100644 index 000000000..ccf3754b9 --- /dev/null +++ b/install/valhalla-install.sh @@ -0,0 +1,187 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: CrazyWolf13 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/valhalla/valhalla + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt install -y \ + autoconf \ + automake \ + ccache \ + clang \ + clang-tidy \ + coreutils \ + cmake \ + g++ \ + gcc \ + git \ + jq \ + lcov \ + libboost-all-dev \ + libcurl4-openssl-dev \ + libczmq-dev \ + libgdal-dev \ + libgeos++-dev \ + libgeos-dev \ + libluajit-5.1-dev \ + liblz4-dev \ + libprotobuf-dev \ + libspatialite-dev \ + libsqlite3-dev \ + libsqlite3-mod-spatialite \ + libtool \ + libzmq3-dev \ + lld \ + locales \ + luajit \ + make \ + osmium-tool \ + parallel \ + pkgconf \ + protobuf-compiler \ + python3-all-dev \ + python3-shapely \ + python3-requests \ + python3-pip \ + spatialite-bin \ + unzip \ + zlib1g-dev +msg_ok "Installed Dependencies" + +PRIME_SERVER_RELEASE=$(get_latest_github_release "kevinkreiser/prime_server" "false") +msg_info "Building prime_server ${PRIME_SERVER_RELEASE} (Patience)" +git clone --recurse-submodules --depth 1 --branch "$PRIME_SERVER_RELEASE" https://github.com/kevinkreiser/prime_server /tmp/prime_server +cd /tmp/prime_server +$STD ./autogen.sh +$STD ./configure +$STD make -j"$(nproc)" +$STD make install +cd / +rm -rf /tmp/prime_server +echo "${PRIME_SERVER_RELEASE#v}" >"$HOME/.prime_server" +msg_ok "Built prime_server" + +RELEASE=$(get_latest_github_release "valhalla/valhalla" "false") +msg_info "Cloning Valhalla ${RELEASE} (Patience)" +mkdir -p /opt/valhalla +git clone --recurse-submodules --depth 1 --branch "$RELEASE" https://github.com/valhalla/valhalla.git /opt/valhalla +msg_ok "Cloned Valhalla ${RELEASE}" + +msg_info "Compiling Valhalla ${RELEASE} (this takes 20-45+ minutes, be patient)" +MEM_MB=$(awk '/MemTotal/{print int($2/1024)}' /proc/meminfo) +BUILD_JOBS=$((MEM_MB / 2000)) +[[ $BUILD_JOBS -lt 1 ]] && BUILD_JOBS=1 +[[ $BUILD_JOBS -gt $(nproc) ]] && BUILD_JOBS=$(nproc) +cd /opt/valhalla +$STD cmake -B build -DCMAKE_BUILD_TYPE=Release -DENABLE_PYTHON_BINDINGS=OFF -DENABLE_TESTS=OFF -DENABLE_SINGLE_FILES_WERROR=OFF +$STD cmake --build build -- -j"$BUILD_JOBS" +$STD cmake --install build +ldconfig +echo "${RELEASE#v}" >"$HOME/.valhalla" +msg_ok "Compiled Valhalla ${RELEASE}" + +msg_info "Configuring Valhalla" +useradd --system --no-create-home --shell /usr/sbin/nologin valhalla 2>/dev/null || true +mkdir -p /opt/valhalla_data/{valhalla_tiles,pbf} +THREADS=$(nproc) +valhalla_build_config \ + --mjolnir-tile-dir /opt/valhalla_data/valhalla_tiles \ + --mjolnir-tile-extract /opt/valhalla_data/valhalla_tiles.tar \ + --mjolnir-admin /opt/valhalla_data/admins.sqlite \ + --mjolnir-timezone /opt/valhalla_data/timezones.sqlite \ + --mjolnir-concurrency "$THREADS" \ + >/opt/valhalla_data/valhalla.json + +cat <<'EOF' >/opt/valhalla_data/build-tiles.sh +#!/usr/bin/env bash +# (Re)builds Valhalla routing tiles from one or more OSM extracts. +# Usage: build-tiles.sh [ ...] +# Example: build-tiles.sh https://download.geofabrik.de/europe/germany-latest.osm.pbf +set -euo pipefail +export PATH="/usr/local/bin:/usr/local/sbin:$PATH" +if [[ $# -eq 0 ]]; then + echo "Usage: $0 [ ...]" >&2 + exit 1 +fi + +DATA_DIR=/opt/valhalla_data +CONFIG="$DATA_DIR/valhalla.json" +mkdir -p "$DATA_DIR/pbf" + +FILES=() +for src in "$@"; do + if [[ "$src" == http://* || "$src" == https://* ]]; then + fname="$DATA_DIR/pbf/$(basename "$src")" + echo "Downloading $src" + curl -fL --progress-bar -o "$fname" "$src" + else + fname="$src" + fi + FILES+=("$fname") +done + +systemctl stop valhalla + +echo "Building admin database" +valhalla_build_admins --config "$CONFIG" "${FILES[@]}" + +echo "Building timezone database" +valhalla_build_timezones >"$DATA_DIR/timezones.sqlite" + +echo "Building initial tile graph" +valhalla_build_tiles -c "$CONFIG" -e build "${FILES[@]}" + +echo "Enhancing tile graph" +valhalla_build_tiles -c "$CONFIG" -s enhance "${FILES[@]}" + +echo "Packing tiles into a single extract" +valhalla_build_extract -c "$CONFIG" -v + +chown -R valhalla:valhalla "$DATA_DIR" +systemctl start valhalla +echo "Done. Tiles are in $DATA_DIR/valhalla_tiles (and packed at $DATA_DIR/valhalla_tiles.tar)." +EOF +chmod +x /opt/valhalla_data/build-tiles.sh +chown -R valhalla:valhalla /opt/valhalla_data +msg_ok "Configured Valhalla" + +msg_info "Creating Service" +cat </etc/systemd/system/valhalla.service +[Unit] +Description=Valhalla Routing Engine +After=network.target + +[Service] +Type=simple +User=valhalla +Group=valhalla +WorkingDirectory=/opt/valhalla_data +ExecStart=/usr/local/bin/valhalla_service /opt/valhalla_data/valhalla.json ${THREADS} +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now valhalla +msg_ok "Created Service" + +if [[ -n "${VALHALLA_PBF_URLS:-}" ]]; then + msg_info "Building Initial Tiles from VALHALLA_PBF_URLS (this can take a long time)" + $STD /opt/valhalla_data/build-tiles.sh $VALHALLA_PBF_URLS + msg_ok "Built Initial Tiles" +fi + +motd_ssh +customize +cleanup_lxc