====== Установка и настройка 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 На этом настройка завершена.