if [ "${dry_run}" = true ]; then warn "[DRY RUN] Skipping network and container startup."; return; fi
info "Ensuring Docker network '${network_name}' exists..."; docker network create "${network_name}" >/dev/null 2>&1 || info "Network already exists."
info "Pulling latest Docker images..."; docker pull "${DEFAULT_BACKEND_REGISTRY}:${DEFAULT_BACKEND_VERSION}"; if [[ "${no_frontend}" != "true" ]]; then docker pull "${DEFAULT_FRONTEND_REGISTRY}:${DEFAULT_FRONTEND_VERSION}"; fi
-
local needs_preprocessing=false
for profile in "${PROFILE_ARR[@]}"; do
local pdata_dir="${work_dir}/${map_name}/${profile}-data"
- # Check if pre-processed data exists. If not, we need to run pre-processing.
if [ ! -f "${pdata_dir}/map.osrm" ]; then
needs_preprocessing=true
break
fi
done
-
if [[ "${needs_preprocessing}" == "true" ]]; then
info "Starting data preprocessing for missing profiles..."
for profile in "${PROFILE_ARR[@]}"; do
@@ -262,13 +258,103 @@ run_install() {
else
info "All profile data already exists, skipping preprocessing."
fi
-
info "Starting all services for instance '${map_name}'..."; docker compose -f "${COMPOSE_FILE}" up -d --remove-orphans
success "Installation for '${map_name}' completed!"; print_summary
}
-# ... (rest of the script is unchanged: update, remove, summary, main)
-run_update() { info "Starting update for instance '${map_name}', component '${sub_command}'"; if [ ! -f "${COMPOSE_FILE}" ]; then err "Instance '${map_name}' not found."; exit 1; fi; case "${sub_command}" in backend|frontend|all) info "Pulling latest images..."; docker pull "${DEFAULT_BACKEND_REGISTRY}:${DEFAULT_BACKEND_VERSION}"; if [[ "${sub_command}" != "backend" ]]; then docker pull "${DEFAULT_FRONTEND_REGISTRY}:${DEFAULT_FRONTEND_VERSION}"; fi; info "Recreating services..."; docker compose -f "${COMPOSE_FILE}" up -d --remove-orphans ;; map|profile) if [[ "${sub_command}" == "map" ]]; then download_map; fi; generate_profiles; info "Re-running preprocessing..."; for profile in "${PROFILE_ARR[@]}"; do local pdata_dir="${work_dir}/${map_name}/${profile}-data"; info "Preparing map file for profile '${profile}'..."; cp -vf "${MAP_PATH}" "${pdata_dir}/map.osm.pbf"; local service_name="osrm-preprocess-${map_name}-${profile}"; docker compose -f "${COMPOSE_FILE}" up --build --exit-code-from "${service_name}" "${service_name}" || err "Preprocessing failed for ${profile}"; docker compose -f "${COMPOSE_FILE}" rm -fsv "${service_name}" >/dev/null 2>&1 || true; done; info "Restarting services..."; docker compose -f "${COMPOSE_FILE}" up -d --remove-orphans ;; *) err "Invalid update component."; exit 1;; esac; success "Update for '${map_name}' completed."; }
-run_remove() { info "Starting removal of OSRM instance: '${map_name}'"; if [ ! -f "${COMPOSE_FILE}" ]; then warn "Instance '${map_name}' not found."; fi; if ask_confirm "This will STOP and REMOVE all containers for instance '${map_name}'. Are you sure?"; then if [ -f "${COMPOSE_FILE}" ]; then docker compose -f "${COMPOSE_FILE}" down -v || warn "Could not stop containers."; rm -f "${COMPOSE_FILE}"; fi; success "All containers for '${map_name}' have been removed."; if [[ "${do_purge}" == "true" ]]; then local instance_dir="${work_dir}/${map_name}"; if ask_confirm "PURGE ENABLED. This will DELETE '${instance_dir}'. IRREVERSIBLE. Proceed?"; then rm -rf "${instance_dir}"; success "Instance data for '${map_name}' has been purged."; fi; fi; else info "Removal aborted by user."; fi; }
prereqs_check(){ info "Running prerequisite checks...";local ok=0;if! command_exists docker;then err "Docker is not installed.";ok=1;fi;if! docker compose version >/dev/null 2>&1;then err "Docker Compose V2 plugin is not installed.";ok=1;fi;if! command_exists curl;then err "curl is not installed.";ok=1;fi;if[${ok}-ne 0 ];then err "Prerequisite checks failed.";exit 1;fi; success "All prerequisites are met.";}
info "Running prerequisite checks..."
SELINUX_LABEL=""; setup_selinux_flag(){if command_exists sestatus && sestatus 2>/dev/null | grep-qi"SELinux status:.*enabled";then SELINUX_LABEL=",z"; info "SELinux is enabled. Appending ',z' to volume mounts.";fi;}
local ok=0
ask_confirm(){local prompt="$1";if["${yes_all}"=true];then info "[auto-yes] ${prompt} -> yes";return 0;fi;while true;do printf"%s [y/N]: ""${prompt}";read-r yn;case"${yn}"in[Yy]*)return 0 ;;[Nn]*|"")return 1 ;;*)echo"Please answer y or n.";;esac;done;}
if! command_exists docker;then err "Docker is not installed.";ok=1;fi
if! docker compose version >/dev/null 2>&1;then err "Docker Compose V2 plugin is not installed.";ok=1;fi
if! command_exists curl;then err "curl is not installed.";ok=1;fi
local frontend_block="";if["${no_frontend}"!=true];then
local frontend_block="";if["${no_frontend}"!=true];then
if[-z"${mapbox_token}"];then
warn "Mapbox token not provided. The frontend map may not render. Use --mapbox-token <your_token>."
fi
local backend_urls="";local idx2=0
local backend_urls="";local idx2=0
for profile in"${PROFILE_ARR[@]}";do idx2=$((idx2+1));local host_port=$((backend_port + idx2 -1));local url="http://${backend_domain}:${host_port}${backend_path}/${api_version}/${profile}"; backend_urls+="${url},";done
for profile in"${PROFILE_ARR[@]}";do idx2=$((idx2+1));local host_port=$((backend_port + idx2 -1));local url="http://${backend_domain}:${host_port}${backend_path}/${api_version}/${profile}"; backend_urls+="${url},";done
backend_urls=${backend_urls%,}
backend_urls=${backend_urls%,}
...
@@ -266,6 +202,7 @@ generate_docker_compose() {
...
@@ -266,6 +202,7 @@ generate_docker_compose() {
restart: unless-stopped
restart: unless-stopped
environment:
environment:
- VITE_DEFAULT_BACKEND_URLS=${backend_urls}
- VITE_DEFAULT_BACKEND_URLS=${backend_urls}
- VITE_MAPBOX_ACCESS_TOKEN=${mapbox_token}
ports:
ports:
- \"${frontend_port}:9966\"
- \"${frontend_port}:9966\"
networks:
networks:
...
@@ -287,42 +224,64 @@ EOF
...
@@ -287,42 +224,64 @@ EOF
# -------------------------
# -------------------------
run_install(){
run_install(){
info "Starting OSRM installation for map instance: '${map_name}'"
info "Starting OSRM installation for map instance: '${map_name}'"
if[-f"${COMPOSE_FILE}"]&&! ask_confirm "Instance '${map_name}' may exist. Re-running will recreate containers. Continue?";then info "Installation aborted.";exit 0;fi
if[-f"${COMPOSE_FILE}"]&&! ask_confirm "Instance '${map_name}' may exist. Re-running will update config and recreate containers. Continue?";then info "Installation aborted.";exit 0;fi
local pdata_dir="${work_dir}/${map_name}/${profile}-data"
local pdata_dir="${work_dir}/${map_name}/${profile}-data"
info "Preparing map file for profile '${profile}'..."
if[!-f"${pdata_dir}/map.osrm"];then
cp -vf"${MAP_PATH}""${pdata_dir}/map.osm.pbf"
needs_preprocessing=true
break
fi
done
if[["${needs_preprocessing}"=="true"]];then
info "Starting data preprocessing for missing profiles..."
for profile in"${PROFILE_ARR[@]}";do
local pdata_dir="${work_dir}/${map_name}/${profile}-data"
if[-f"${pdata_dir}/map.osrm"];then
info "--- Skipping profile '${profile}', data already exists. ---"
continue
fi
info "Preparing map file for profile '${profile}'..."; cp -vf"${MAP_PATH}""${pdata_dir}/map.osm.pbf"
local service_name="osrm-preprocess-${map_name}-${profile}"
local service_name="osrm-preprocess-${map_name}-${profile}"
info "--- Processing profile: ${profile} ---"
info "--- Processing profile: ${profile} ---"
if docker compose -f"${COMPOSE_FILE}" up --build--exit-code-from"${service_name}""${service_name}";then
if docker compose -f"${COMPOSE_FILE}" up --build--exit-code-from"${service_name}""${service_name}";then
success "Preprocessing for '${profile}' completed."
success "Preprocessing for '${profile}' completed."
else
else
err "Preprocessing for '${profile}' FAILED. Check logs for details."
err "Preprocessing for '${profile}' FAILED. Check logs for details.";if! ask_confirm "Continue with other profiles?";then err "Aborting installation.";exit 1;fi