====== Установка и настройка OSRM ======
[[https://github.com/Project-OSRM/osrm-backend|GitHUB разработчика]]
===== Подготовка сервера =====
В данной статье рассматривается развертывание сервера **OSRM** с помощью Docker. Рассматривать варианты установки непосредственно на виртуальную машину или физический сервер я не буду, т.к не вижу в этом смысла.\\
Для развертывания сервиса не требуется ничего специфичного: устанавливаем **wget**, обновляем пакеты, устанавливаем нужное ядро (если требуется) и [[main:docker:install|устанавливаем докер]]. На этом подготовка сервера завершена.
===== Загрузка DockerImage =====
Для загрузки Docker-образа используем команду:
docker pull osrm/osrm-backend>
===== Загрузка карт =====
Карты берем [[http://download.geofabrik.de/asia.html|тут]].
wget -P /opt/osrm/data http://download.geofabrik.de/russia-latest.osm.pbf
Качаем файл с расширением **pbf**.\\
Я буду использовать директорию **/opt/osrm/data**.
===== Подготовка графов =====
После окончания процесса загрузки необходимо распаковать файл средствами **OSRM** и проиндексировать его. Это можно сделать 2мя способами. Тем, который указан в официальной документации и альтернативным. Я опишу оба (второй - мой авторский).
==== Способ первый (официальный) ====
* Распаковываем графы из базовой карты:
Обратите внимание, что на данном этапе серверу потребуется большое количество оперативной памяти (в моем случае более 10ГБ)!!!
docker run -t -v $(pwd):/data osrm/osrm-backend:latest osrm-extract -p /opt/car.lua /data/russia-latest.osm.pbf
Этот и последующие процессы могут занять значительное время, все зависит от объема скачанной карты.
Стоит обратить внимание, что **-v $(pwd):/data** делает доступным текущий каталог в контейнере докер, если вы находитесь в директории, где нет файла **.pbf**, или по каким-то иным причинам хотите указать другой каталог - замените **$(pwd)** на нужный вам каталог.
* Затем необходимо рекурсивно разбить граф на ячейки с помощью утилиты **osrm-partition** для этого используйте следующую команду:
docker run -t -v $(pwd):/data osrm/osrm-backend:latest osrm-partition /data/russia-latest.osrm
Обратите внимание, что команда применяется уже не к файлу **russia-latest.osm.pbf**, а к файлу **russia-latest.osrm**. Это очень важно!
* После разделения графа на ячейки используйте утилиту **osrm-customize** для расчета весов маршрутов:
docker run -t -v $(pwd):/data osrm/osrm-backend:latest osrm-customize /data/russia-latest.osrm
Для алгоритма CH этапы разделения **osrm-partition** и настройки **osrm-customize** заменяются добавлением кратчайших путей из иерархии алгоритма сжатия **osrm-contract**.
* Запуск контейнера осуществляется следующей командой:
docker run -t -i -p 5000:5000 -v $(pwd):/data -d osrm/osrm-backend osrm-routed — algorithm mld /data/russia-latest.osrm
Контейнер можно запустить самостоятельно без **Kubernetes** или **Docker-compose**
После всех проделанных манипуляций мы получим Docker-container, с работающим backend сервером OSRM.
==== Способ второй (собственный) ====
Способ описанный разработчиком конечно же работает, но он имеет один значительный минус, который мне не понравился, а так же у меня были вопросы и не все получалось сразу, поэтому я пошел своим путем. Для этого я зашел на [[https://github.com/Project-OSRM/osrm-backend#readme|github]] проекта и посмотрел что там в docker-file, который собирает образ. Это позволило мне разобраться что и где лежит внутри контейнера.\\
Так я узнал, что файлы графа хранятся в **/data**, а сами утилиты для работы с картой и построения графов в **/usr/local/bin/**. Отсюда можно сделать простой и логичный вывод - вовсе не обязательно плодить кучу мертвых контейнеров, которые потом лучше всего вычистить, можно все сделать в одном контейнере и потом просто удалить его.\\
Для реализации моего способа мы делаем следующее:
* Создаем контейнер, в который сможем зайти в **shell**:
docker run -it -v "${PWD}:/data" osrm/osrm-backend bash
* Оказавшись внутри контейнера переходим в каталог **/usr/local/bin/**
cd /usr/local/bin/
* Теперь выполняем команды последовательно:
- Распаковываем архив: osrm-extract -p /opt/car.lua /data/russia-latest.osm.pbf
И ждем окончания процесса.
- Разбираем карту на графы рекурсивно: osrm-partition /data/russia-latest.osrm
Снова ждем окончания.
- Настраиваем ячейки: osrm-customize /data/russia-latest.osrm
Дожидаемся окончания.
- Выходим из консоли контейнера: exit
- Удаляем ненужный теперь контейнер: docker rm
- Разворачиваем продактовый контейнер: docker run -t -i -p 5000:5000 -v $(pwd):/data -d osrm/osrm-backend osrm-routed — algorithm mld /data/russia-latest.osrm
На этом настройка завершена.