Dies ist eine alte Version des Dokuments!
Siehe OpenStreetMap
Demo https://nominatim.openstreetmap.org/search?format=jsonv2&q=Stephansplatz
#!/usr/bin/env bash set -euo pipefail NOM_USER="nominatim" WEB_DB_USER="www-data" NOM_HOME="/srv/nominatim" NOM_VENV="/srv/nominatim-venv" NOM_PROJECT_DIR="/srv/nominatim/project" NOM_PBF_DOWNLOAD="https://download.geofabrik.de/europe/austria-latest.osm.pbf" NOM_PBF_FILE="/home/austria.osm.pbf" IMPORT_THREADS="4" IMPORT_OSM2PGSQL_CACHE="1024" PG_VERSION="16" if [[ "$(id -u)" -ne 0 ]]; then echo "Run this script as root." exit 1 fi if [[ -n "${NOM_PBF_DOWNLOAD}" ]]; then echo "Downloading ${NOM_PBF_DOWNLOAD} to ${NOM_PBF_FILE}" curl -L "$NOM_PBF_DOWNLOAD" -o "$NOM_PBF_FILE" fi if [[ ! -f "${NOM_PBF_FILE}" ]]; then echo "PBF not found: ${NOM_PBF_FILE}" exit 1 fi export DEBIAN_FRONTEND=noninteractive echo "[1/7] Installing packages..." apt-get update apt-get install -y \ postgresql postgresql-contrib postgresql-server-dev-all \ postgis postgresql-${PG_VERSION}-postgis-3 \ osm2pgsql osmium-tool \ build-essential cmake pkg-config git curl wget unzip sudo \ libboost-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libicu-dev \ python3 python3-pip python3-venv python3-dev echo "[2/7] Starting PostgreSQL..." service postgresql start echo "[3/7] Resetting DB roles..." sudo -u postgres dropdb --if-exists nominatim sudo -u postgres dropuser --if-exists "${NOM_USER}" || true sudo -u postgres dropuser --if-exists "${WEB_DB_USER}" || true sudo -u postgres createuser -s "${NOM_USER}" sudo -u postgres createuser "${WEB_DB_USER}" echo "[4/7] Creating Linux user and directories..." id -u "${NOM_USER}" >/dev/null 2>&1 || useradd --system --create-home --home-dir "${NOM_HOME}" --shell /bin/bash "${NOM_USER}" mkdir -p "${NOM_HOME}" "${NOM_PROJECT_DIR}" rm -rf "${NOM_VENV}" python3 -m venv "${NOM_VENV}" chown -R "${NOM_USER}:${NOM_USER}" "${NOM_HOME}" "${NOM_PROJECT_DIR}" "${NOM_VENV}" echo "[5/7] Installing Python packages..." sudo -u "${NOM_USER}" "${NOM_VENV}/bin/pip" install --upgrade pip wheel setuptools sudo -u "${NOM_USER}" "${NOM_VENV}/bin/pip" install \ nominatim-db nominatim-api falcon uvicorn gunicorn osmium echo "[6/7] Writing project environment..." cat > "${NOM_PROJECT_DIR}/.env" <<EOF NOMINATIM_DEFAULT_LANGUAGE=de,en EOF chown "${NOM_USER}:${NOM_USER}" "${NOM_PROJECT_DIR}/.env" chmod 640 "${NOM_PROJECT_DIR}/.env" echo "[7/7] Importing Austria..." sudo -u "${NOM_USER}" "${NOM_VENV}/bin/nominatim" import \ --project-dir "${NOM_PROJECT_DIR}" \ --osm-file "${NOM_PBF_FILE}" \ --threads "${IMPORT_THREADS}" \ --osm2pgsql-cache "${IMPORT_OSM2PGSQL_CACHE}" echo echo "Import finished." echo echo "Start API with:" echo "sudo -u ${NOM_USER} bash -lc 'cd ${NOM_PROJECT_DIR} && ${NOM_VENV}/bin/gunicorn -b 127.0.0.1:8080 -w 2 -k uvicorn.workers.UvicornWorker \"nominatim_api.server.falcon.server:run_wsgi()\"'"
#!/usr/bin/env bash set -euo pipefail # ========================= # Config # ========================= NOM_USER="nominatim" WEB_USER="www-data" NOM_HOME="/srv/nominatim" NOM_VENV="/srv/nominatim-venv" NOM_PROJECT_DIR="/srv/nominatim/project" NOM_PBF_DOWNLOAD="https://download.geofabrik.de/europe/austria-latest.osm.pbf" NOM_PBF_FILE="/home/austria.osm.pbf" PG_VERSION="16" IMPORT_THREADS="4" IMPORT_OSM2PGSQL_CACHE="1024" # Build settings OSM2PGSQL_GIT_DIR="/usr/local/src/osm2pgsql" OSM2PGSQL_BUILD_DIR="/usr/local/src/osm2pgsql-build" # Optional: flatnode speeds up import for larger datasets and must be kept for later updates. # Leave empty to disable. NOM_FLATNODE_FILE="" # ========================= # Helpers # ========================= log() { echo echo "==> $*" } require_root() { if [[ "$(id -u)" -ne 0 ]]; then echo "Run this script as root." exit 1 fi } cleanup_old_repo_file() { # Avoid duplicate PGDG definitions from previous attempts. rm -f /etc/apt/sources.list.d/pgdg.list rm -f /etc/apt/sources.list.d/pgdg.sources } # ========================= # Start # ========================= require_root export DEBIAN_FRONTEND=noninteractive log "Preparing dedicated user" if ! id -u "${NOM_USER}" >/dev/null 2>&1; then useradd --system --create-home --home-dir "${NOM_HOME}" --shell /bin/bash "${NOM_USER}" fi mkdir -p "${NOM_HOME}" "${NOM_PROJECT_DIR}" chown -R "${NOM_USER}:${NOM_USER}" "${NOM_HOME}" if [[ -n "${NOM_PBF_DOWNLOAD}" && ! -f "${NOM_PBF_FILE}" ]]; then log "Downloading PBF" curl -fL --retry 3 --retry-delay 5 "${NOM_PBF_DOWNLOAD}" -o "${NOM_PBF_FILE}" fi if [[ ! -f "${NOM_PBF_FILE}" ]]; then echo "PBF not found: ${NOM_PBF_FILE}" exit 1 fi log "Installing base packages" apt-get update apt-get install -y \ ca-certificates curl wget gnupg lsb-release unzip sudo \ software-properties-common apt-transport-https \ build-essential cmake pkg-config git \ libboost-dev libexpat1-dev zlib1g-dev libbz2-dev \ libpq-dev libicu-dev libxml2-dev libprotobuf-c-dev protobuf-c-compiler \ lua5.3 liblua5.3-dev \ python3 python3-pip python3-venv python3-dev \ postgresql-common log "Configuring PostgreSQL PGDG repository" cleanup_old_repo_file install -d /usr/share/postgresql-common/pgdg curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc \ -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc . /etc/os-release echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt ${VERSION_CODENAME}-pgdg main" \ > /etc/apt/sources.list.d/pgdg.list log "Installing PostgreSQL ${PG_VERSION}, PostGIS and runtime packages" apt-get update apt-get install -y \ "postgresql-${PG_VERSION}" \ "postgresql-client-${PG_VERSION}" \ "postgresql-server-dev-${PG_VERSION}" \ "postgresql-${PG_VERSION}-postgis-3" \ postgis log "Starting PostgreSQL" service postgresql start log "Building osm2pgsql from source" rm -rf "${OSM2PGSQL_GIT_DIR}" "${OSM2PGSQL_BUILD_DIR}" git clone --depth 1 https://github.com/osm2pgsql-dev/osm2pgsql.git "${OSM2PGSQL_GIT_DIR}" mkdir -p "${OSM2PGSQL_BUILD_DIR}" cd "${OSM2PGSQL_BUILD_DIR}" cmake "${OSM2PGSQL_GIT_DIR}" make -j"$(nproc)" make install ldconfig log "Checking osm2pgsql version" osm2pgsql --version || true log "Preparing Python virtual environment" rm -rf "${NOM_VENV}" python3 -m venv "${NOM_VENV}" chown -R "${NOM_USER}:${NOM_USER}" "${NOM_VENV}" sudo -u "${NOM_USER}" "${NOM_VENV}/bin/pip" install --upgrade pip wheel setuptools sudo -u "${NOM_USER}" "${NOM_VENV}/bin/pip" install --no-cache-dir "psycopg[binary]" sudo -u "${NOM_USER}" "${NOM_VENV}/bin/pip" install --no-cache-dir \ nominatim-db nominatim-api falcon uvicorn gunicorn log "Writing project configuration" cat > "${NOM_PROJECT_DIR}/.env" <<EOF NOMINATIM_DEFAULT_LANGUAGE=de,en EOF if [[ -n "${NOM_FLATNODE_FILE}" ]]; then cat >> "${NOM_PROJECT_DIR}/.env" <<EOF NOMINATIM_FLATNODE_FILE=${NOM_FLATNODE_FILE} EOF fi chown "${NOM_USER}:${NOM_USER}" "${NOM_PROJECT_DIR}/.env" chmod 640 "${NOM_PROJECT_DIR}/.env" log "Resetting database roles and database" sudo -u postgres psql -v ON_ERROR_STOP=1 <<EOF DO \$\$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = '${NOM_USER}') THEN CREATE ROLE ${NOM_USER} LOGIN SUPERUSER; END IF; END \$\$; DO \$\$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = '${WEB_USER}') THEN CREATE ROLE ${WEB_USER} LOGIN; END IF; END \$\$; EOF sudo -u postgres dropdb --if-exists nominatim || true log "Running Nominatim import" sudo -u "${NOM_USER}" bash -lc " cd '${NOM_PROJECT_DIR}' '${NOM_VENV}/bin/nominatim' import \ --project-dir '${NOM_PROJECT_DIR}' \ --osm-file '${NOM_PBF_FILE}' \ --threads '${IMPORT_THREADS}' \ --osm2pgsql-cache '${IMPORT_OSM2PGSQL_CACHE}' " log "Writing systemd service" cat > /etc/systemd/system/nominatim.socket <<EOF [Unit] Description=Gunicorn socket for Nominatim [Socket] ListenStream=/run/nominatim.sock SocketUser=${WEB_USER} [Install] WantedBy=multi-user.target EOF cat > /etc/systemd/system/nominatim.service <<EOF [Unit] Description=Nominatim running as a gunicorn application After=network.target Requires=nominatim.socket [Service] Type=simple User=${WEB_USER} Group=${WEB_USER} WorkingDirectory=${NOM_PROJECT_DIR} Environment=PYTHONPATH=${NOM_VENV}/lib/python3.10/site-packages ExecStart=${NOM_VENV}/bin/gunicorn -b unix:/run/nominatim.sock -w 4 -k uvicorn.workers.UvicornWorker "nominatim_api.server.falcon.server:run_wsgi()" ExecReload=/bin/kill -s HUP \$MAINPID PrivateTmp=true TimeoutStopSec=5 KillMode=mixed [Install] WantedBy=multi-user.target EOF log "Enabling service" systemctl daemon-reload systemctl enable --now nominatim.socket echo echo "Done." echo echo "Useful commands:" echo " systemctl status nominatim.socket" echo " systemctl start nominatim.service" echo " journalctl -u nominatim.service -f" echo echo "Manual API test:" echo " curl --unix-socket /run/nominatim.sock 'http://localhost/search?q=Wien&format=jsonv2'"
Untested
docker run -it \ -e PBF_URL=https://download.geofabrik.de/europe/austria-latest.osm.pbf \ -e REPLICATION_URL=https://download.geofabrik.de/europe/austria-updates \ -e IMPORT_STYLE=full \ -p 8080:8080 \ --name nominatim-at \ -v nominatim-data:/var/lib/postgresql/16/main \ mediagis/nominatim:5.2
Untested
#!/usr/bin/env bash set -euo pipefail # ============================================================ # Nominatim 5.2 + Austria import on Ubuntu 24.04 # ============================================================ # ---- configurable values ---- NOM_USER="nominatim" NOM_HOME="/srv/nominatim" NOM_VENV="/srv/nominatim-venv" NOM_DATA_DIR="/srv/nominatim/data" NOM_PROJECT_DIR="/srv/nominatim/project" NOM_PBF_URL="https://download.geofabrik.de/europe/austria-latest.osm.pbf" NOM_PBF_FILE="${NOM_DATA_DIR}/austria-latest.osm.pbf" # Geofabrik Austria updates NOM_REPL_URL="https://download.geofabrik.de/europe/austria-updates" # API bind NOM_BIND_ADDR="0.0.0.0" NOM_BIND_PORT="8080" # Optional flatnode file: speeds/lower memory for bigger imports; for Austria optional. USE_FLATNODE="false" FLATNODE_FILE="${NOM_DATA_DIR}/flatnode.file" # Tune this to your RAM. 1-4G are sensible for Austria on smaller boxes. IMPORT_THREADS="$(nproc)" IMPORT_OSM2PGSQL_CACHE="2048" # PostgreSQL version installed by Ubuntu 24.04 PG_VERSION="16" # ---- sanity ---- if [[ "$(id -u)" -ne 0 ]]; then echo "Run as root." exit 1 fi export DEBIAN_FRONTEND=noninteractive echo "[1/10] Installing OS packages..." apt-get update apt-get install -y \ postgresql postgresql-contrib postgresql-server-dev-all \ postgis postgresql-${PG_VERSION}-postgis-3 \ osm2pgsql osmium-tool \ build-essential cmake pkg-config git curl wget unzip \ libboost-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libicu-dev \ python3 python3-pip python3-venv python3-dev \ apache2 php-fpm echo "[2/10] Creating service user and directories..." id -u "${NOM_USER}" >/dev/null 2>&1 || useradd --system --create-home --home-dir "${NOM_HOME}" --shell /bin/bash "${NOM_USER}" mkdir -p "${NOM_HOME}" "${NOM_VENV}" "${NOM_DATA_DIR}" "${NOM_PROJECT_DIR}" chown -R "${NOM_USER}:${NOM_USER}" "${NOM_HOME}" "${NOM_DATA_DIR}" "${NOM_PROJECT_DIR}" chmod 755 "${NOM_HOME}" "${NOM_PROJECT_DIR}" echo "[3/10] Creating Python virtual environment..." python3 -m venv "${NOM_VENV}" "${NOM_VENV}/bin/pip" install --upgrade pip wheel setuptools "${NOM_VENV}/bin/pip" install nominatim-db nominatim-api osmium gunicorn echo "[4/10] Writing project environment..." cat > "${NOM_PROJECT_DIR}/.env" <<EOF # Nominatim project settings NOMINATIM_DATABASE_DSN=pgsql:dbname=nominatim NOMINATIM_REPLICATION_URL=${NOM_REPL_URL} NOMINATIM_REPLICATION_UPDATE_INTERVAL=86400 NOMINATIM_REPLICATION_RECHECK_INTERVAL=900 NOMINATIM_DEFAULT_LANGUAGE=de,en EOF chown "${NOM_USER}:${NOM_USER}" "${NOM_PROJECT_DIR}/.env" chmod 640 "${NOM_PROJECT_DIR}/.env" echo "[5/10] PostgreSQL tuning and setup..." systemctl enable postgresql systemctl restart postgresql PGCONF="/etc/postgresql/${PG_VERSION}/main/postgresql.conf" # Backup once if [[ ! -f "${PGCONF}.bak-nominatim" ]]; then cp "${PGCONF}" "${PGCONF}.bak-nominatim" fi # Conservative tuning for an Austria-only host. Adjust if you know your RAM. sed -ri "s/^#?shared_buffers\s*=.*/shared_buffers = 2GB/" "${PGCONF}" sed -ri "s/^#?maintenance_work_mem\s*=.*/maintenance_work_mem = 2GB/" "${PGCONF}" sed -ri "s/^#?work_mem\s*=.*/work_mem = 32MB/" "${PGCONF}" sed -ri "s/^#?max_wal_size\s*=.*/max_wal_size = 2GB/" "${PGCONF}" sed -ri "s/^#?checkpoint_timeout\s*=.*/checkpoint_timeout = 60min/" "${PGCONF}" # Append settings if missing grep -q "^synchronous_commit = off" "${PGCONF}" || echo "synchronous_commit = off" >> "${PGCONF}" grep -q "^checkpoint_completion_target = 0.9" "${PGCONF}" || echo "checkpoint_completion_target = 0.9" >> "${PGCONF}" grep -q "^random_page_cost = 1.0" "${PGCONF}" || echo "random_page_cost = 1.0" >> "${PGCONF}" systemctl restart postgresql # Create postgres user matching service user for peer auth. sudo -u postgres psql -tAc "SELECT 1 FROM pg_roles WHERE rolname='${NOM_USER}'" | grep -q 1 || \ sudo -u postgres createuser -s "${NOM_USER}" sudo -u postgres psql -tAc "SELECT 1 FROM pg_database WHERE datname='nominatim'" | grep -q 1 || \ sudo -u postgres createdb -O "${NOM_USER}" nominatim sudo -u postgres psql -d nominatim -c "CREATE EXTENSION IF NOT EXISTS postgis;" sudo -u postgres psql -d nominatim -c "CREATE EXTENSION IF NOT EXISTS hstore;" echo "[6/10] Downloading Austria extract..." if [[ ! -f "${NOM_PBF_FILE}" ]]; then wget -O "${NOM_PBF_FILE}" "${NOM_PBF_URL}" fi chown "${NOM_USER}:${NOM_USER}" "${NOM_PBF_FILE}" echo "[7/10] Importing Austria data..." IMPORT_CMD=( "${NOM_VENV}/bin/nominatim" import --project-dir "${NOM_PROJECT_DIR}" --osm-file "${NOM_PBF_FILE}" --threads "${IMPORT_THREADS}" --osm2pgsql-cache "${IMPORT_OSM2PGSQL_CACHE}" ) if [[ "${USE_FLATNODE}" == "true" ]]; then IMPORT_CMD+=( --flatnode-file "${FLATNODE_FILE}" ) fi sudo -u "${NOM_USER}" "${IMPORT_CMD[@]}" echo "[8/10] Initializing replication..." sudo -u "${NOM_USER}" "${NOM_VENV}/bin/nominatim" replication --project-dir "${NOM_PROJECT_DIR}" --init echo "[9/10] Creating API service..." cat > /etc/systemd/system/nominatim-api.service <<EOF [Unit] Description=Nominatim API After=network.target postgresql.service Wants=postgresql.service [Service] Type=simple User=${NOM_USER} Group=${NOM_USER} WorkingDirectory=${NOM_PROJECT_DIR} Environment=PATH=${NOM_VENV}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ExecStart=${NOM_VENV}/bin/gunicorn -b ${NOM_BIND_ADDR}:${NOM_BIND_PORT} nominatim_api.server.falcon.server:run_wsgi Restart=always RestartSec=5 [Install] WantedBy=multi-user.target EOF echo "[10/10] Creating replication service..." cat > /etc/systemd/system/nominatim-replication.service <<EOF [Unit] Description=Nominatim Replication Updater After=network.target postgresql.service Wants=postgresql.service [Service] Type=simple User=${NOM_USER} Group=${NOM_USER} WorkingDirectory=${NOM_PROJECT_DIR} Environment=PATH=${NOM_VENV}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ExecStart=${NOM_VENV}/bin/nominatim replication --project-dir ${NOM_PROJECT_DIR} Restart=always RestartSec=30 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable nominatim-api.service systemctl enable nominatim-replication.service systemctl start nominatim-api.service systemctl start nominatim-replication.service echo echo "Done." echo "API should be reachable at:" echo " http://${NOM_BIND_ADDR}:${NOM_BIND_PORT}/search?q=Stephansplatz%20Wien&format=jsonv2" echo echo "Useful commands:" echo " systemctl status nominatim-api" echo " systemctl status nominatim-replication" echo " journalctl -u nominatim-api -f" echo " journalctl -u nominatim-replication -f"