Установка Nominatim в Docker

· 2 минуты на чтение

Качаем репозиторий с гитхаба

mkdir /home/user/nominatim
cd /home/user/nominatim
git clone https://github.com/merlinnot/nominatim-docker.git
cd /home/user/nominatim/nominatim-docker

Собираем образ контейнера Docker. Здесь следует пояснить: первые строки параметров объяснены в  первоисточнике, последние две строки параметров - это указание, откуда  качать исходный дамп OSM и откуда брать обновления к нему. Очень  рекомендую использовать SSD-диск, при работе с базой данных это станет  узким местом всей системы.

docker build . \
-t nominatim \
--build-arg PGSQL_VERSION=10 \
--build-arg POSTGIS_VERSION=2.5 \
--build-arg BUILD_THREADS=2 \
--build-arg BUILD_MEMORY=1GB \
--build-arg OSM2PGSQL_CACHE=1000 \
--build-arg RUNTIME_THREADS=4 \
--build-arg RUNTIME_MEMORY=2GB \
--build-arg PBF_URL=https://download.geofabrik.de/russia/ural-fed-district-latest.osm.pbf \
--build-arg REPLICATION_URL=https://download.geofabrik.de/russia/ural-fed-district-updates

Долго-долго ждем… Было сделано несколько попыток генерации образа:

  1. Успешно прошла только генерация образа для Урала. Генерация проводилась на виртуальной машине Virtualbox с гостевой системой CentOS 7 (1511) с оперативной памятью 2Gb. Размер образа для Урала получился около 10 Gb.
  2. Попытка запустить создание образа для России на живой машине (CentOS 7 (1511), 2Gb памяти и 500Gb места на диске, установлен docker-ce) провалилась с такой ошибкой:

Reading in file: /srv/nominatim/src/data.osm.pbf
Using PBF parser.
Processing: Node(322360k 329.3k/s) Way(0k 0.00k/s) Relation(0 0.00/s)COPY_END for planet_osm_nodes failed: ERROR: could not extend file «base/16386/19754.1»: wrote only 4096 of 8192 bytes at block 208840
HINT: Check free disk space. CONTEXT: COPY planet_osm_nodes, line 38636000
(Вероятно, требуется больше оперативной памяти для большого дампа России.)

В случае успешного импорта размер образа Docker будет занимать около 100 Gb.

Запуск настроенного контейнера с данными

Ключ -h нужен, чтобы передать в контейнер имя хоста, оно будет подставляться во все URL, генерируемые для загрузки страницы Nominatim. Если его не указать - то URL будут формироваться с использованием внутреннего имени хоста контейнера и страница будет грузиться некорректно.

docker run --name nominatim --restart=always -d -p 8088:80 -h 192.168.0.71:8088/nominatim nominatim:latest

Обновление данных в Nominatim

Судя по всему, нужно добавить в cron задачу обновления. Смотрим здесь: https://github.com/openstreetmap/Nominatim/issues/1143

Сначала нужно инициировать обновления в Nominatim:

# Зайти в консоль контейнера
sudo -u nominatim /srv/nominatim/Nominatim/build/utils/update.php --init-updates

Последовательность полного обновления:

# Зайти в консоль контейнера
sudo -u nominatim /srv/nominatim/Nominatim/build/utils/update.php --import-osmosis-all

Для автоматического обновления через cron добавьте в него такую команду (от пользователя nominatim):

sudo -u nominatim /srv/nominatim/Nominatim/build/utils/update.php --import-osmosis

Разное

Почему-то не подхватились параметры конфига из Dockerfile. Это приводит к  тому, что апдейт данных производится с дампа планеты, уходит много  трафика. Тогда правим файл  /srv/nominatim/Nominatim/build/settings/settings.php:

Правим файл /srv/nominatim/Nominatim/build/settings/settings.php

Изменяем:
@define('CONST_Replication_Url', 'https://download.geofabrik.de/russia/ural-fed-district-updates');
@define('CONST_Replication_Update_Interval', '86400');
@define('CONST_Replication_Recheck_Interval', '900');

Добавляем:
@define('CONST_Replication_MaxInterval', '86400');

Запуск импорта из командной строки хоста

Вот так можно запустить импорт вручную. Но лучше добавить команду импорта в cron.

docker exec -it nominatim sudo -u nominatim /srv/nominatim/Nominatim/build/utils/update.php --import-osmosis
docker exec -it nominatim sudo -u nominatim /srv/nominatim/Nominatim/build/utils/update.php --import-osmosis-all

Источники:
https://github.com/merlinnot/nominatim-docker
https://github.com/openstreetmap/Nominatim/issues/1143

Related Articles

Объединение дампов OSM

Качаем дампы, например отсюда: https://download.geofabrik.de/asia/kazakhstan-latest.osm.pbf https://download.geofabrik.de/russia/ural-fed-district-latest.osm.pbfКачаем

· 1 минута на чтение

Ограничение частоты запросов по API_KEY с использованием OpenResty и Docker

Предыдущий вариант ограничения был статичен, для внесения изменений в список API-KEY  требовался перезапуск Nginx. Нужно решение с динамическими ключами.  OpenResty

· 5 минуты на чтение

Установка и настройка движка Ghost в контейнере Docker.

Пробросил внешний порт 57443 на порт сервера 57443. Порт сервера слушает nginx. Конфиг nginx обеспечивает шифрование SSL, заворачивает HTTP трафик

· 1 минута на чтение

Установка и настройка своего тайл-сервера.

Внимание! Существует docker-версия тайл-сервера, поэтому можно сильно не погружаться в эту инструкцию. Технические требования (актуально в моем случае) Минимум ОЗУ:

· 9 минуты на чтение