Содержание

OSM Tile Server Ubuntu 24.04

Введение

Установка производиться на устройство

Все ниже написанное относиться к Ubuntu Server 24.04 (Noble Numbat) и протестированы в августе 2024 года.

Общая теория

Tile Server OSM представляет собой набор программ и библиотек, которые работают вместе для создания тайлового (плиточного) сервера. Он состоит из 5 основных компонентов:

Postgresql/postgis - базы данных. Mod_tile — это модуль apache, который обслуживает кэшированные тайлы и решает, какие тайлы нуждаются в повторном рендеринге — либо потому, что они еще не кэшированы, либо потому, что они устарели. Mapnik — это программная библиотека, которая осуществляет реальный рендеринг с использованием открытого рендеринга.
Предполагается, что вы запускаете все от пользователя без регистрации root через «sudo». Имя пользователя без root, повторяемое по умолчанию, — «alisa». Если вы указываете иного пользователя, то вам необходимо будет заменить во всех командах на свое имя и добавить его в группу пользователей, которые могут использовать sudo для получения root-прав. Из вашей обычной учетной записи пользователя без регистрации root.

Обновление программного обеспечения

Устанавливаем и обновляем Ubuntu Всегда полезно обновлять программное обеспечение сервера перед выполнением какой-либо серьезной работы на сервере. Войдите на сервер через SSH и выполните следующую команду.

sudo apt --yes update; sudo apt --yes upgrade -y

Установка необходимых библиотек

Итак, приступим:

sudo apt --yes install screen locate git tar unzip wget bzip2 lua5.1 gdal-bin npm node-carto net-tools curl

Процесс достаточно продолжительный и можно попить кофейку…
Установка необязытельных, но рекомендованных openstreetmap-carto элементов

sudo apt --yes install ca-certificates gnupg build-essential clang nodejs fonts-hanazono fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted

Установка postgresql/postgis

В Ubuntu есть предварительно упакованные версии как postgis, так и postgresql, поэтому их можно просто установить через диспетчер пакетов Ubuntu. Проверим подходящую версию на странице пакета postgresql в Ubuntu

sudo apt --yes install postgresql postgresql-contrib postgis postgresql-16-postgis-3 postgresql-16-postgis-3-scripts


Здесь «postgresql» — это база данных, в которой мы собираемся хранить данные карты, а «postgis» добавляет к ней дополнительную графическую поддержку. У команды apt параметр –yes отвечает за автоматические подстановки подтверждения ДА при установке. Проверим список установленных пакетов postgres

dpkg -l | grep postgres



Примечание! Для полного удаления воспользуйтесь командой

sudo apt-get --purge --yes remove postgresql postgresql-doc postgresql-common postgresql-16  postgresql-client  postgresql-client-16 postgresql-client-common postgresql-common  postgresql-contrib postgresql-contrib-16 postgresql-postgis-scripts postgresql-16-postgis-3-scripts  

Перезапускаем postgresql

sudo /etc/init.d/postgresql restart

Проверим статус работы postgresql

sudo /etc/init.d/postgresql status

Создаем базу данных postgis. По умолчанию в различных программах предполагается, что база данных называется gis, и тут мы будем использовать то же соглашение, хотя это и не обязательно. Замените свое имя пользователя вместо alisa, где это используется ниже. Это должно быть имя пользователя, которое будет отображать карты с помощью Mapnik.

sudo -u postgres -i

createuser alisa 

если ошибки нет, то продолжаем установку

Если Ошибка


перезапускаем postgresql

/etc/init.d/postgresql restart


добавляем пользователя

createuser alisa


проверяем

pg_isready


ответ «/var/run/postgresql:5432 - accepting connections»

Продолжаем установку

createdb -E UTF8 -O alisa gis


Продолжая работать как пользователь «postgres», настройте PostGIS в б PostgreSQL (опять же, меняя alisa на свое имя пользователя ниже):

psql


(ответ «postgres=#»)

\c gis


(ответ: “You are now connected to database ‘gis’ as user ‘postgres’”.)

CREATE EXTENSION postgis;
CREATE EXTENSION hstore;
ALTER TABLE geometry_columns OWNER TO alisa;
ALTER TABLE spatial_ref_sys OWNER TO alisa;


ответ:
CREATE EXTENSION
CREATE EXTENSION
ALTER TABLE
ALTER TABLE

\q


(выход из psql и приглашение к Linux)

exit


(это вернет нас к пользователю, которым мы были до того, как сделали «sudo -u postgres -i» выше)
Если вы еще не создали пользователя, создайте пользователя Unix и для этого пользователя, выбрав пароль при появлении запроса:

sudo useradd -m alisa

sudo passwd alisa


Опять же, выше замените “alisa” на имя пользователя без регистрации root, которого вы выбрали.

Установка osm2pgsql

Далее мы установим osm2pgsql:

sudo apt --yes install osm2pgsql


Ошибок обычно быть не должно

Mapnik и python3

Далее мы установим Mapnik python3, используя версию по умолчанию в Ubuntu 24.04:

sudo apt --yes install mapnik-utils python3-mapnik python3-psycopg2 python3-yaml 


Проверим правильность установки Mapnik:

python3

import mapnik


(Ответ: »> и без ошибок, то библиотека Mapnik была найдена Python.)

quit()


выход

Установка Apache, mod_tile и render

Установка пакетов

В репозитории Ubuntu по умолчанию нет пакетов mod_tileи renderd, но мы можем установить их из OSM PPA.

sudo apt install software-properties-common
sudo add-apt-repository ppa:osmadmins/ppa

Нажмем [ENTER] для продолжения. Установим веб-сервер Apache. Конфигурационный файл renderd будет создан в /etc/apache2/conf-available/renderd.conf

sudo apt --yes install apache2 apache2-dev  libapache2-mod-tile renderd 

Включим mod-tile модуль.

sudo a2enmod tile

если установили из репозитория, то компиляцию пропускаем

Скомпилируем исходный код mod_tile

Создадим в домашнем каталоге папку src

mkdir ~/src

cd ~/src

sudo apt update && sudo apt --yes upgrade

sudo apt --no-install-recommends --yes install \
  apache2 \
  apache2-dev \
  cmake \
  curl \
  g++ \
  gcc \
  git \
  libcairo2-dev \
  libcurl4-openssl-dev \
  libglib2.0-dev \
  libiniparser-dev \
  libmapnik-dev \
  libmemcached-dev \
  librados-dev

export CMAKE_BUILD_PARALLEL_LEVEL=$(nproc)
rm -rf /tmp/mod_tile_src /tmp/mod_tile_build
mkdir /tmp/mod_tile_src /tmp/mod_tile_build
cd /tmp/mod_tile_src
git clone --depth 1 https://github.com/openstreetmap/mod_tile.git .
cd /tmp/mod_tile_build
cmake -B . -S /tmp/mod_tile_src \
  -DCMAKE_BUILD_TYPE:STRING=Release \
  -DCMAKE_INSTALL_LOCALSTATEDIR:PATH=/var \
  -DCMAKE_INSTALL_PREFIX:PATH=/usr \
  -DCMAKE_INSTALL_RUNSTATEDIR:PATH=/run \
  -DCMAKE_INSTALL_SYSCONFDIR:PATH=/etc \
  -DENABLE_TESTS:BOOL=ON
cmake --build .
ctest
sudo cmake --install . --strip

a2enmod tile

sudo apache2ctl start

sudo service apache2 reload

sudo systemctl status apache2

Конфигурация таблицы стилей

Создадим, если ранее этого не делали каталог src в домашней директории

mkdir ~/src

Перейдем в каталог src

cd ~/src


клонируем репозитарий

git clone https://github.com/gravitystorm/openstreetmap-carto


переходим в каталог openstreetmap-carto

cd openstreetmap-carto


установку подходящей версию компилятора «carto» пропустим, т.к. это сделали на первоночальном этапе загрузки необходимых пакетов.

sudo apt install npm


размер примерно в 600mb, т.ч. перекур
Скомпилируем «carto»

sudo npm install -g carto

вывод на экран
Тут разработчики просят профинансировать работу с пакетом openstreetmap-carto

npm fund

Далее применяем заплатку, если видим «npm audit fix –force», иначе пропускаем этот раздел и переходим к проверки версии «carto»

npm audit fix --force

npm i --package-lock-only

npm audit fix --force

npm audit fix


Проверим версию пакета «carto»

carto -v


Это должно ответить номером версии, которая должна быть не меньше: 1.2.0

преобразуем проект carto во что-то, понятное Mapnik:

carto project.mml > mapnik.xml


Теперь у вас есть таблица стиля Mapnik XML в /home/alisa/src/openstreetmap-carto/mapnik.xml.
Примечание: все предепреждения
Warning: style/admin.mss:22:18 Styles do not match layer selector #admin-low-zoom.
Warning: style/admin.mss:18:6 Styles do not match layer selector #admin-low-zoom.
Игнорируем

Загрузка данных

в домашнем каталоге создаем папку data

mkdir ~/data


и переходим в эту папку

cd ~/data


на странице загрузки http://download.geofabrik.de/ выбираем нужную нам карту для и копируем с кнопки ее ссылку, процесс не быстрый, идем гулять пол часика с собачкой…
У кого собачки нет, том может для примера загрузить карту Азербайджана размером 32Mb…

wget https://download.geofabrik.de/asia/azerbaijan-latest.osm.pbf

Следующая команда вставит загруженные ранее данные OpenStreetMap в базу данных. Этот шаг очень интенсивно использует дисковый ввод-вывод; импорт всей планеты может занять много часов, дней или недель в зависимости от аппаратного обеспечения.

cd ~/data
osm2pgsql -d gis --create --slim  -G --hstore --tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua -C 4000 --number-processes 2 -S ~/src/openstreetmap-carto/openstreetmap-carto.style ~/data/azerbaijan-latest.osm.pbf

Обратите внимание на параметр -c (–create) при импорте через osm2pgsql. С этим параметром удалится вся существующая информация с таблиц.

osm2pgsql -d gis --append --slim  -G --hstore --tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua -C 4000 --number-processes 2 -S ~/src/openstreetmap-carto/openstreetmap-carto.style ~/data/russia-latest.osm.pbf

Если вам необходимо сделать импорт ещё нескольких стран, то вместо -c указывайте параметр -a (–append).
Командные опции:


Команда загрузки должна завершится чем-то вроде «Osm2pgsql в целом занял 34583 секунд».

Создание индексов

переходим в папку openstreetmap-carto

cd ~/src/openstreetmap-carto/

psql -d gis -f indexes.sql

Загрузка Shape-файла

cd ~/src/openstreetmap-carto/

scripts/get-external-data.py

Шрифты

переходим в каталог openstreetmap-carto в папке src

cd ~/src/openstreetmap-carto/


и собственно загружаем шрифты

scripts/get-fonts.sh


процесс занял 6 минут

Настройка веб-сервера

визуализация

Отрываем с помощью текстового редактора nano файл конфигурации для «render» — «sudo nano /etc/renderd.conf»

sudo nano /etc/renderd.conf

Добавляем в конец файла нижеприведенные строки

[ajt]
URI=/hot/
TILEDIR=/var/lib/mod_tile
XML=/home/alisa/src/openstreetmap-carto/mapnik.xml
HOST=localhost
TILESIZE=256
MAXZOOM=20

Настройка Apache

создаем папку mod_tile

sudo mkdir /var/lib/mod_tile


задаем права пользователя для этой папки

sudo chown alisa /var/lib/mod_tile


создаем папку renderd, если не создавали ранее

sudo mkdir /var/run/renderd


задаем права пользователя для этой папки

sudo chown alisa /var/run/renderd


сообщаем Apache о «mod_tile» редактируя файл mod_tile.conf добавляя следующую строку LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so

sudo nano /etc/apache2/conf-available/mod_tile.conf


выполняем команду для включения конфигурации mod_tile.

sudo a2enconf mod_tile

sudo systemctl reload apache2

sudo nano /etc/apache2/sites-available/000-default.conf

LoadTileConfigFile /etc/renderd.conf
ModTileRenderdSocketName /var/run/renderd/renderd.sock
# Timeout before giving up for a tile to be rendered
ModTileRequestTimeout 0
# Timeout before giving up for a tile to be rendered that is otherwise missing
ModTileMissingRequestTimeout 30


Проверим месторасположение файлов /etc/renderd.conf

и /var/run/renderd/renderd.sock

sudo service apache2 start

sudo service apache2 reload


Перечень команд работы с сервисом рендер


Перезапустим и провеим статус сервиса

sudo systemctl daemon-reload
sudo systemctl enable renderd
sudo systemctl restart renderd
sudo systemctl status renderd

«Настройки конфигов»
sudo nano /etc/renderd.conf
sudo -u 'alisa' renderd -f -c /etc/renderd.conf
sudo renderd -f -c /etc/renderd.conf
sudo renderd -f


renderd.service
systemctl start renderd.service
systemctl enable renderd.service
systemctl status renderd.service
systemctl status

sudo systemctl start renderd
sudo systemctl restart renderd
sudo systemctl enable renderd
sudo systemctl status renderd
sudo systemctl stop renderd
sudo systemctl daemon-reload

sudo service renderd start

sudo chown alisa /run/renderd/ -R
sudo chown alisa /var/cache/renderd/tiles/ -R



sudo apt install renderd


sudo chown alisa /home/alisa/src/openstreetmap-carto/ -R
sudo chown alisa /home/alisa/src/openstreetmap-carto/mapnik.xml



sudo nano /etc/renderd.conf
[ajt]
URI=/hot/
TILEDIR=/var/lib/mod_tile
XML=/home/alisa/src/openstreetmap-carto/mapnik.xml
HOST=localhost
TILESIZE=256
MAXZOOM=20

sudo nano /etc/apache2/conf-available/mod_tile.conf
LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so

sudo nano /etc/apache2/sites-available/000-default.conf
LoadTileConfigFile /etc/renderd.conf
ModTileRenderdSocketName /var/run/renderd/renderd.sock
# Timeout before giving up for a tile to be rendered
ModTileRequestTimeout 0
# Timeout before giving up for a tile to be rendered that is otherwise missing
ModTileMissingRequestTimeout 30

sudo nano ~/src/mod_tile/debian/renderd.init

sudo nano /usr/lib/systemd/system/renderd.service

[Unit]
Description=Renderd
After=network.target auditd.service

[Service]
Type=forking
ExecStart=/etc/init.d/renderd start
ExecReload=/etc/init.d/renderd restart
ExecStop=/etc/init.d/renderd stop
Environment=G_MESSAGES_DEBUG=all

[Install]
WantedBy=multi-user.target



[Unit]
Description=Daemon that renders map tiles using mapnik
Documentation=man:renderd
After=network.target auditd.service

[Service]
ExecStart=/usr/bin/renderd -f
User=alisa

[Install]
WantedBy=multi-user.target

Запуск рендера в первый раз

запустим renderd, чтобы попытаться отрендерить некоторые плитки. Сначала мы запустим его на переднем плане, чтобы видеть любые ошибки по мере их возникновения:

sudo -u 'alisa' renderd -f -c /usr/local/etc/renderd.conf

systemctl stop renderd
renderd -f -c /usr/local/etc/renderd.conf

sudo mkdir /var/run/renderd


задаем права пользователя для этой папки

sudo chown alisa /var/run/renderd


Запуск рендера в фоновом режиме

Далее мы настроим «рендеринг» для работы в фоновом режиме. Отредактируем файл «~/src/mod_tile/debian/renderd.init», чтобы «RUNASUSER» был установлен для учетной записи без имени root, который мы использовали ранее, например «alisa», и скопируем его в системный каталог. откроем файл в редакторе

vi ~/src/mod_tile/debian/renderd.init

sudo cp ~/src/mod_tile/debian/renderd.init /etc/init.d/renderd

sudo chmod u+x /etc/init.d/renderd

sudo cp ~/src/mod_tile/debian/renderd.service /lib/systemd/system/

sudo /etc/init.d/renderd start

sudo systemctl enable renderd

Просмотр тайлов (плиток)

для просмотра плитки, используйте html-файл «sample_leaflet.html» в папке «extra» mod_tile или загрузите zip архив с этим файлом внизу страницы. Просто откройте его в веб-браузере на машине, где вы установили тайловый сервер. Если это невозможно, потому что вы устанавливаете на сервер без локального веб-браузера, вы можете отредактировать его, заменив «127.0.0.1» IP-адресом сервера и скопировав его ниже «/var/www/html». Мы запускаем его по сети с указанием IP-адреса виртуального сервера NAS Synology (192.168.1.31)

Пример загрузки карты

О 32ядрах и 1tb ssd * 3шт в raid5

Загрузка всей карты с https://planet.openstreetmap.org/pbf/planet-latest.osm.pbf ограниченна пропускной способностью провайдера 12Mb/s - 5 часов. С соседнего сервера по внутренней сети 188Mb/s - 7 минут ограничение в скорости hdd соседнего сервера. Использование парсера PBF Россия в парсере Node при этих же настройка 516,5k/s, заняла 2 часа, то же самое на Synology DS 720+
(Intel Celeron J4125 4*2,70 GHz / 2gb ddr4 + 8gb ddr4 / 2*1tb ssd) показала загрузку процессора в среднем 30-50% при выделенной виртуальной памяти в 8gb, которая занята соответственно на 85% от общего объема в 10gb. Реально используется только 12% озу от выделенных 128Gb, при общем объеме в 256Gb При этом процессор от 9% до 17% Трудятся только ssd

Файлы для загрузки

Карты OSM

Ссылки и литература

Создание тайлового сервера вручную (20.04 LTS)
Ubuntu 20.04 LTS: пользовательская документация
OSM2PGSQL: импортер данных OSM в базу данных PostgreSQL/PostGIS
PostgreSQL: база данных с открытым исходным кодом
Mapnik: отрисовка основного Slippy Map слоя для OSM
OSM Carto: стиль стандартного слоя листов OSM
Mod_tile: передача кэшированных тайлов
Leaflet — библиотека JS для интерактивных карт.
Synology Open Street Map Server
https://github.com/openstreetmap/mod_tile/blob/master/docs/build/building_on_ubuntu.md
https://switch2osm.org/serving-tiles/manually-building-a-tile-server-ubuntu-24-04-lts/
https://www.linuxbabe.com/linux-server/osm-openstreetmap-tile-server-ubuntu-22-04
https://ircama.github.io/osm-carto-tutorials/kosmtik-ubuntu-setup/
https://www.linuxbabe.com/debian/openstreetmap-osm-tile-server-debian-12-bookworm
https://github.com/openstreetmap/mod_tile