Benutzer-Werkzeuge

Webseiten-Werkzeuge


nominatim

Dies ist eine alte Version des Dokuments!


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

Proxmox Ubuntu 22.04 Template

#!/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'"

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