Качаем репозиторий с гитхаба
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
Долго-долго ждем… Было сделано несколько попыток генерации образа:
- Успешно прошла только генерация образа для Урала. Генерация проводилась на виртуальной машине Virtualbox с гостевой системой CentOS 7 (1511) с оперативной памятью 2Gb. Размер образа для Урала получился около 10 Gb.
- Попытка запустить создание образа для России на живой машине (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