Benutzer-Werkzeuge

Webseiten-Werkzeuge


nominatim

Dies ist eine alte Version des Dokuments!


Inhaltsverzeichnis

Siehe OpenStreetMap

Demo https://nominatim.openstreetmap.org/search?format=jsonv2&q=Stephansplatz

Setup

WSL

#!/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="/mnt/c/chroot/xampp/htdocs/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

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

Ubuntu 24.04

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"
nominatim.1774744447.txt.gz · Zuletzt geändert: 2026/03/29 01:34 von jango