Switch2OSM

Керуйте вашими мапами самі

Створення тайлового сервера вручну (18.04 LTS)

На цій сторінці міститься опис зі встановлення, розгортання та налаштування всього потрібного програмного забезпечення для роботи вашого тайлового сервера. Покрокові інструкції описують встановлення тайлового сервера на Ubuntu Linux 18.04 LTS (Bionic Beaver).

Встановлення програмного забезпечення

Тайловий сервер OpenStreetMap – це набір програмного забезпечення та бібліотек, які працюють разом генеруючи тайли. Як це трапляється доволі часто в OpenStreetMap, існує кілька різних шляхів для досягнення мети і майже кожен компонент має альтернативу, з власними недоліками та перевагами. Цей посібник описує найбільш стандартну версію, що схожа на те, що використовується головним тайловим сервером OpenStreetMap.

Тайловий сервер складається з п’яти головних частин: mod_tile, renderd, mapnik, osm2pgsql та база даних postgresql/postgis. Mod_tile – модуль сервера Apache, який обслуговує тайловий кеш та визначає які тайли потрібно перегенерувати, через їх відсутність у кеші або тому, що вони застаріли. Renderd визначає пріоритети в чергах різного штибу запитів для згладжування навантаження. Mapnik – бібліотека, яка відповідає безпосередньо за створення тайлів з черги, якою керує renderd.

Зауважте, що це керівництво було написане та протестоване з використанням нововстановленого сервера з операційною системою Ubuntu 18.04. Якщо у вас встановлені інші версії програмного забезпечення (можливо ви оновились з попередньої версії Ubuntu, або у вас під’єднані інші репозиторії PPA), можливо вам доведеться внести певні зміни.

Для того щоб створити всі ці компоненти, вам спочатку треба встановити наступні залежності:

sudo apt install libboost-all-dev git-core tar unzip wget bzip2 build-essential autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libtiff5-dev libicu-dev libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont lua5.1 liblua5.1-dev libgeotiff-epsg

Скажіть Так на запит системи про початок встановлення. Це триватиме доволі довго, тож у вас є час на філіжанку кави. Цей перелік містить різноманітні утиліти, наприклад, веб-сервер Apache, компілятор “carto”, що використовується для конвертації стилів Carto-CSS в зрозумілий для “mapnik” вигляд. Коли закінчиться встановлення цієї частини, встановіть наступний набір потрібних компонентів:

Встановлення postgresql / postgis

Ubuntu має спаковані версії postgis і postgresql, тож вони можуть бути легко встановлені з допомогою менеджера пакунків Ubuntu.

sudo apt-get install postgresql postgresql-contrib postgis postgresql-10-postgis-2.4 postgresql-10-postgis-scripts

Тут “postgresql” це сервер баз даних, який ми збираємось встановити для зберігання наших даних, а “postgis” додає йому підтримку роботи з геопросторовими даними. То ж знов, скажіть Так для встановлення.

Тепер вам треба створити базу даних з підтримкою postgis. Типові налаштування різноманітних програм очікують що база даних називатиметься gis, тож ми будемо дотримуватись цієї угоди в цім керівництві, хоча це й не обов’язково. Замініть тут, і далі нижче, renderaccount на ім’я користувача під яким буде відбуватись генерування тайлів за допомогою Mapnik.

sudo -u postgres -i
createuser renderaccount # скажіть так для superuser (хоча це також не обов’язково)
createdb -E UTF8 -O renderaccount gis

Поки ви працюєте як користувач “postgres”, встановіть PostGIS в базу даних PostgreSQL (знову, замініть renderaccount на вашого користувача нижче):

psql

(це призведе до появи “postgres=#” на початку рядка консолі)

\c gis

(у відповідь ви побачите: “You are now connected to database 'gis' as user 'postgres'
[“Тепер ви під’єднані до бази даних 'gis' як користувач 'postgres'”])

CREATE EXTENSION postgis;

(у відповідь ви побачите: CREATE EXTENSION)

CREATE EXTENSION hstore;

(у відповідь ви побачите: CREATE EXTENSION)

ALTER TABLE geometry_columns OWNER TO renderaccount;

(у відповідь ви побачите: ALTER TABLE)

ALTER TABLE spatial_ref_sys OWNER TO renderaccount;

(у відповідь ви побачите: ALTER TABLE)

\q

(це призведе до виходу з сесії psql та повернення назад у консоль Linux)

exit

(повернення назад до сесії користувача, в якій ми знаходились до виконання команди sudo -u postgres -i вище)

Якщо ви ще цього не зробили, створіть обліковий запис для вашого користувача, введіть пароль коли це буде запропоновано:

sudo useradd -m renderaccount
sudo passwd renderaccount

Знов, замініть renderaccount ім’ям користувача без адміністративних повноважень на ваш смак.

Встановлення osm2pgsql

Тепер нам треба встановити деяке програмне забезпечення з сирців. Перше, це “osm2pgsql”. Для імпорту та керування даними OpenStreetMap в базі даних існують різні інструменти. Ми будемо використовувати “osm2pgsql”, це найпопулярніший інструмент серед інших.

mkdir ~/src
cd ~/src
git clone git://github.com/openstreetmap/osm2pgsql.git
cd osm2pgsql

Механізм збирання, що використовується для osm2pgsql, трохи змінився з часом і нам доведеться встановити кілька залежностей:

sudo apt install make cmake g++ libboost-dev libboost-system-dev libboost-filesystem-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 liblua5.2-dev

Знов, скажіть Так для встановлення.

mkdir build && cd build
cmake ..

(в результаті ви маєте отримати повідомлення “build files have been written to”/”створені файли були записані в”)

make

(вивід має закінчуватись рядком “[100%] Built target osm2pgsql”/”[100%] Створення osm2pgsql”)

sudo make install

Mapnik

Далі, ми встановимо Mapnik. Ми будем використовувати типову версію з Ubuntu 18.04:

sudo apt-get install autoconf apache2-dev libtool libxml2-dev libbz2-dev libgeos-dev libgeos++-dev libproj-dev gdal-bin libmapnik-dev mapnik-utils python-mapnik

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

python
>>> import mapnik
>>>

Якщо python у відповідь видає тільки >>> без повідомлення про помилки, значить бібліотека Mapnik є доступною в Python. Вітаємо! Для виходу із сесії Python скористайтесь наступною командою:

>>> quit()

Встановлення mod_tile та renderd

Далі, ми встановимо mod_tile та renderd. “mod_tile” – модуль Apache, який обробляє запити на показ тайлів; “renderd” – фонова служба, яка відповідає за генерацію тайлів на запит “mod_tile”. Ми будемо використовувати гілку “switch2osm” з https://github.com/SomeoneElseOSM/mod_tile, яка в свою чергу базується на коді https://github.com/openstreetmap/mod_tile, але змінена таким чином, щоб працювати на Ubuntu 18.04, також вона містить пару інших змін потрібних для роботи зі стандартним сервером на Ubuntu на відміну від того, що використовується на тайлових серверах OpenStreetMap.

Компіляція mod_tile з сирців:

cd ~/src
git clone -b switch2osm git://github.com/SomeoneElseOSM/mod_tile.git
cd mod_tile
./autogen.sh

(виконання має закінчитись повідомленням “autoreconf: Leaving directory '.'”.)

./configure

(має закінчитись повідомленням “config.status: executing libtool commands”)

make

Зауважте, що деякі “попереджувальні” повідомлення будуть з’являтись на екрані. Проте все має закінчитись повідомленням “make[1]: Leaving directory ‘/home/renderaccount/src/mod_tile’”.

sudo make install

(має закінчитись повідомленням “make[1]: Leaving directory ‘/home/renderaccount/src/mod_tile’”)

sudo make install-mod_tile

(має закінчитись повідомленням “chmod 644 /usr/lib/apache2/modules/mod_tile.so”)

sudo ldconfig

(тут немає бути жодного повідомлення)

Налаштування стилів

Тепер, після того як все потрібне програмне забезпечення встановлене, вам треба завантажити та налаштувати стилі.

Стиль, який ми будемо використовувати, – це стиль який застосовується для створення “Стандартного” шару на сайті openstreetmap.org. Ми обрали його через гарну документацію і те, що він здатен працювати для будь-якої частини світу, навіть там де не використовується латинка. Але у нього є й певні недоліки – це компромісні рішення для того щоб працювати в глобальних масштабах, він дуже складний для розуміння та внесення змін, якщо вам доведеться їх вносити.

Код стилю “OpenStreetMap Carto” з веб-сайту openstreetmap.org знаходиться на GitHub – https://github.com/gravitystorm/openstreetmap-carto/ та також має власні інструкції зі встановлення – https://github.com/gravitystorm/openstreetmap-carto/blob/master/INSTALL.md. Про те, що потрібно зробити, ми розповімо тут.

Передбачається що ми розміщуємо стиль в теці ~/src домашньої директорії користувача “renderaccount” (або будь-якого іншого, якого ви створили до цього)

cd ~/src
git clone git://github.com/gravitystorm/openstreetmap-carto.git
cd openstreetmap-carto

Далі, встановимо потрібну версію компілятора “carto”. Це більш свіжа версія, ніж та що є в Ubuntu, тож нам потрібно зробити наступне:

sudo apt install npm nodejs
sudo npm install -g carto
carto -v

У відповідь ми маємо отримати інформацію про номер версії, яка має бути не менше ніж:

carto 1.1.0 (Carto map stylesheet compiler)

Після цього ми перетворимо проєкт carto у зрозумілий для Mapnik вигляд:

carto project.mml > mapnik.xml

Тепер у нас є стиль Mapnik XML – /home/renderaccount/src/openstreetmap-carto/mapnik.xml .

Завантаження даних

Для початку, завантажимо невеличку частину тестових даних. Серед різномаїття місць для отримання даних, оберемо “download.geofabrik.de”, що містить великий перелік різних варіантів для завантаження. Давайте візьмемо для прикладу Азербайджан (~19.2 Мб).

Перейдіть за посиланням http://download.geofabrik.de/asia/azerbaijan.html та зверніть увагу на дату “This file was last modified” (щось схоже на “2020-01-13T21:59:02Z”). Вона нам знадобиться потім, коли у нас виникне потреба оновити наші дані даними, які учасники OpenStreetMap додали з моменту нашого імпорту. Завантажимо дані:

mkdir ~/data
cd ~/data
wget http://download.geofabrik.de/asia/azerbaijan-latest.osm.pbf

Наступна команда допоможе вам перенести завантажені дані до вашої бази даних. На цьому етапі зросте навантаження на дискові операції через потребу перенесення значного обсягу інформації; імпорт всієї планети може тривати кілька годин, днів та навіть тижнів, в залежності від потужностей вашого серверного обладнання. Зрозуміло, що для невеликих частин даних імпорт відбувається значно швидше, можливо вам доведеться поекспериментувати зі значенням параметра -C, щоб вкластись у наявну оперативну пам’ять вашого сервера.

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

Давайте розберемось що означають всі ці параметри:

-d gis

База даних, з якою ми працюємо (типово використовується “gis”; тут треба вказати її явно).

--create

Завантажити дані в пусту базу даних, замість спроб додати їх до наявних.

--slim

osm2pgsql може використовувати різноманітні схеми таблиць; “slim” годиться для генерації тайлів.

-G

Визначає, яким чином будуть оброблятись мультиполігони.

--hstore

Дозволяє використовувати для генерації тайлів теґи, для яких немає окремих стовпців в базі даних.

--tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua

Визначає скрипт lua, який використовується для обробки теґів. Це простий спосіб обробки теґів OSM до того, як вони будуть використані в стилі, що спрощує логіку самого стилю.

-C 2500

Виділяє 2.5 Гб оперативної пам’яті для osm2pgsql на виконання імпорту. Якщо у вас менше оперативної пам’яті, спробуйте менше значення. Якщо процес імпорту буде знищений через нестачу оперативної пам’яті, спробуйте зменшити це число або використовуйте менший обсяг даних.

--number-processes 1

Використовувати одне ядро процесора. Якщо у вас багатоядерний процесор можете використовувати більшу кількість ядер.

-S ~/src/openstreetmap-carto/openstreetmap-carto.style

Створювати стовпці в базі даних використовуючи вказаний файл (в нашому випадку він нічим не відрізняється від стандартного “openstreetmap-carto”)

~/data/azerbaijan-latest.osm.pbf

Останній аргумент – це файл з даними для завантаження в базу.

Результатом роботи цієї команди має бути щось схоже на “Osm2pgsql took 238s overall”.

Завантаження Shapefile

Незважаючи на те, що більшість даних для створення мапи береться з файлу з даними OpenStreetMap, який ви завантажили раніше, деякі файли в форматі shapefile все ж такі потрібні для таких речей, наприклад, як кордони країн на великих масштабах. Для їх отримання та індексації зробіть:

cd ~/src/openstreetmap-carto/
scripts/get-shapefiles.py

Цей процес вимагає завантаження великої порції даних та триватиме деякий час. Після завершення ви маєте побачити “…script completed.”.

Шрифти

Назви місць по світу не завжди написані латиною. Для встановлення потрібних шрифтів зробіть наступне:

sudo apt-get install fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted ttf-unifont

Інструкція OpenStreetMap Carto також пропонує встановити шрифт “Noto Emoji Regular” з сирців. Він може згодитись для показу емодзі в назвах магазинів в Америці. Всі інші інтернаціональні шрифти, які, ймовірно, знадобляться (включаючи ті що майже не підтримуються), містяться у щойно встановленому списку.

Налаштування веб-сервера

Конфігурація renderd

Налаштування “renderd” знаходяться у файлі “/usr/local/etc/renderd.conf”. Відредагуємо його за допомогою текстового редактора, такого як nano:

sudo nano /usr/local/etc/renderd.conf

Нам потрібно змінити пару рядків. В розділі “renderd”:

num_threads=4

Якщо у вас десь 2 Гб оперативної пам’яті, можливо вам доведеться зменшити цей параметр до 2. Розділ “ajt” відповідає за “іменований стиль мапи” з назвою “ajt”. Ви можете мати більше ніж один такий розділ, якщо треба, за умови, що у них будуть різні URI. Рядок “XML” треба буде змінити на кшталт:

XML=/home/renderaccount/src/openstreetmap-carto/mapnik.xml

Звісно, потрібно буде замінити “renderaccount” на користувача, якого ви створили в системі до цього.

URI=/hot/

Цей параметр було обрано для того щоби було простіше використовувати ваші тайли замість шару Humanitarian з сайту OpenStreetMap.org. Ви можете вказати щось інше, але “/hot/” також годиться.

Конфігурація Apache

sudo mkdir /var/lib/mod_tile
sudo chown renderaccount /var/lib/mod_tile

sudo mkdir /var/run/renderd
sudo chown renderaccount /var/run/renderd

Тепер нам треба вказати Apache, що нам треба використовувати “mod_tile”, відкриємо nano (або інший редактор):

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

Додайте наступний рядок у файл:

LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so

збережіть його та виконайте команду:

sudo a2enconf mod_tile

У відповідь ви побачите, що вам треба перезапустити серіс apache командою “service apache2 reload” для активації нових налаштувань; але ми не будемо робити цього зараз.

Зараз нам треба підключити “renderd” до Apache. За допомогою nano (або іншого редактора):

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

Додайте наступне між рядками “ServerAdmin” та “DocumentRoot”:

LoadTileConfigFile /usr/local/etc/renderd.conf
ModTileRenderdSocketName /var/run/renderd/renderd.sock
# Час очікування, перш ніж відмовитись від генерації тайлу
ModTileRequestTimeout 0
# Час очікування, перш ніж відмовитись від генерації відсутнього тайлу
ModTileMissingRequestTimeout 30

І перезапустіть apache двічі:

sudo service apache2 reload
sudo service apache2 reload

(Є підозри, що Apache трохи “підтуплює” під час зміни налаштувань на ходу, тож на всяк випадок це треба зробити двічі).

Якщо ви перейдете в оглядачі на: http://ip.вашого.сервера/index.html, ви маєте побачити стандартну сторінку apache в Ubuntu – “It works!”.

(якщо ви не знаєте IP адресу призначену серверу, її можна дізнатись за допомогою команди “ifconfig” – якщо мережеві налаштування не надто складні, то це має буте щось типу “inet addr” відмінне від “127.0.0.1”). Якщо ви використовуєте сервер постачальника послуг хостингу, то, швидше за все, внутрішня адреса вашого сервера буде відрізнятися від зовнішньої адреси, яка була надана вам, але ця зовнішня IP-адреса вже буде надіслана вам, і, ймовірно, ви її використовуєте зараз для доступу до сервера.

Зауважте, що це лише сайт “http” (порт 80) – вам потрібно витратити трохи більше часу для налаштування Apache на використання https, але це виходить за межі цих інструкцій. Однак якщо ви використовуєте “Let’s Encrypt” для отримання сертифікатів, інструкція зі встановлення може також містити поради щодо налаштуваня сайту Apache для використання https.

Перший запуск renderd

Далі, нам треба запустити renderd щоб спробувати згенерувати кілька тайлів. Спочатку ми запустимо його так, щоб ми мали змогу відстежити появу помилок:

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

Ви можете побачити кілька попереджень, але не турбуйтеся про це. Головне, щоб не було помилок. В разі появи помилок, збережіть повний вивід, наприклад на pastebin, та зверніться по допомогу, наприклад, на help.openstreetmap.org (дайте посилання на pastebin – не включайте весь вивід до питання).

Відкрийте у себе в оглядачі посилання: http://ip.вашого.сервера/hot/0/0/0.png

Ви маєте побачити мапу світу у вашому оглядачі та кілька повідомлень в терміналі, включаючи “DEBUG: START TILE” та “DEBUG: DONE TILE”. Не звертайте уваги на повідомлення “DEBUG: Failed to read cmd on fd” – це не помилка. Якщо ви не побачили цього тайлу та отримали інші помилки, знов, збережіть вивід на pastebin та зверніться за допомогою, наприклад на help.openstreetmap.org.

Якщо все працює, натисніть Ctrl-C для зупинки процесу генерації тайлів.

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

Далі ми налаштуємо “renderd” для роботи в фоновому режимі. По-перше, змініть файл “~/src/mod_tile/debian/renderd.init” та вкажіть у “RUNASUSER” того користувача, якого ви створили до цього, замість “renderaccount”, потім скопіюйте його до теки system:

nano ~/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/

Файл “renderd.service” – це файл системної служби “systemd”. Версія зазначена тут використовує команди init. Щоб переконатись що команда запуску відпрацьовує, запустіть:

sudo /etc/init.d/renderd start

(маєте отримати відповідь – “[ ok ] Starting renderd (via systemctl): renderd.service”.)

Для автоматичного запуску кожного разу, ввімкніть renderd командою:

sudo systemctl enable renderd

Перегляд тайлів

Для того щоб побачити тайли, ми трохи змахлюємо користуючись файлом “sample_leaflet.html” з теки “extras” в mod_tile. Просто відкрийте цей файл у веб-оглядачі на комп’ютері де ви встановили тайловий сервер. Якщо це не можливо – ви встановили тайл-сервер на сервері де немає веб-оглядача, ви можете замінити “127.0.0.1” на IP адресу сервера, після чого скопіюйте його в “/var/www/html”.

Через ssh-з’єднання виконайте команду:

tail -f /var/log/syslog | grep " TILE "

(зверніть увагу на пробіли довкола “TILE”)

У відповідь ви отримуватимете по рядку кожного разу, коли буде приходити запит на показ тайлів, або буде закінчуватись їх створення.

Під час завантаження сторінки ви маєте побачити кілька запитів на показ тайлів. Віддаляйтесь поступово. Ви побачите, запити на нові тайли з’являтимуться у вашому ssh-з’єднанні. Деякі тайли на крупних масштабах вимагають багато часу на створення (кілька хвилин) першого разу, але після того як вони будуть створені, вони будуть доступні для показу миттєво.

Вітаємо! Тепер ви можете повернутись до розділу Використання тайлів для додавання мапи, що використовує ваш новий тайловий сервер.