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()\"'"
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"