Зачем? Это странно...


Нет, не странно! Google Maps — это, наверно, самый потрясающий сервис, который мы получаем бесплатно [в обмен на свои персональные данные].

Я пользуюсь им почти каждый день, он невероятно полезен для ориентирования на местности.

Но что, если бы нам вообще не нужен был Google?

OpenStreetMap бесплатно предоставляет всему миру данные карт, собранные при помощи краудсорсинга. Но я не имею в виду, что можно просто воспользоваться OSM. Эта организация предоставляет данные, однако политика использования стимулирует пользователей не полагаться на её серверы при личном пользовании, а брать на себя ответственность за хостинг. И глядя на этот проект, я понимаю, почему. Его аппаратные требования не для слабонервных.

Оборудование


У меня есть игровой PC, который чаще всего простаивает без дела. В последнее время мы с подругой предпочитаем играть на диване в кооперативные игры на Switch, а не на PC в разных комнатах. Я подумал, что можно воспользоваться этим довольно мощным десктопом и превратить его в сервер карт.

Внутри этого десктопа находится следующая начинка:

  • Процессор Intel i7 gen 10700kf
  • 32 ГБ ОЗУ
  • NVMe SSD на 1 ТБ
  • GPU GTX 2070
  • Блок питания на 750 Вт

Примерно два года назад я купил его за $1270.

Чтобы отвечать высоким требованиям к серверу карт для всего мира, я дополнительно купил 128 ГБ ОЗУ и поставил их вместо 32 ГБ. Так общая стоимость оборудования увеличилась до $1670.

Это довольно высокая цена для самостоятельного хостинга, однако стоит отметить, что требования приблизительно пропорциональны географическим границам данных. Если вы захотите самостоятельно хостить сервис карт для меньшего региона (европейской страны или нескольких штатов США), то это возможно сделать на гораздо более скромном компьютере.

В конечном итоге, я пошёл на компромисс и снизил свои ожидания, решив хостить данные карт только Северной Америки.

Требования


Что нужно, чтобы конкурировать с Google Maps? По-моему, есть три основных требования:

  • «Скользящая» карта, которую можно интерактивно перетаскивать и менять её масштаб
  • Возможность прокладывания маршрутов от точки к точке
  • Возможность поиска мест

Эти задачи можно решить примерно тремя сервисами:

  • сервер тайлов (строго говоря, здесь задействуется несколько сервисов)
  • сервис прокладывания маршрутов valhalla
  • сервис геокодирования nominatim

Реализация


Для реализации я создал репозиторий github, чтобы сгруппировать эти базовые сервисы и запускать их при помощи docker-compose.

Репозиторий находится здесь.

Соединить вместе эти докеризованные сервисы в одном docker-compose оказалось на удивление просто.

В README этих сервисов рекомендуется перед запуском контейнеров создать отдельный том docker. Это полезно, потому что импортирование может занять очень много времени (для данных всей планеты — несколько дней).

Изначально я попытался импортировать весь файл planet.osm.pbf, который сейчас весит 66 ГБ. Однако импортирование постоянно завершалось сбоями, поэтому я ограничил масштаб своего проекта только данными Северной Америки.

Если в ближайшее время мне понадобится поехать за границу, я просто буду пользоваться Google Maps.

Данные Северной Америки занимают в сжатом формате protobuf всего 12 ГБ, поэтому я смог запустить для них все три сервиса.

Примечательно, что сервисы извлекают эти данные в гораздо более расширенном (но удобном для чтения) формате.

Чтобы понять, сколько в итоге занято места на диске, я выполнил следующую команду:

docker system df -v

По её выводу стало понятно, почему я не могу импортировать всю планету.

VOLUME NAME      LINKS     SIZE
nominatim-data   1         291.9GB
osm-data         2         337.8GB
osm-tiles        1         203.3MB
valhalla-data    2         37.6GB

Даже при меньшем объёме извлечённых данных эти сервисы уже заняли большую часть моего SSD на 1 ТБ (суммарно 667 ГБ). Если считать, что занимаемое пространство увеличивается пропорционально, то на всю планету мне бы понадобилось примерно 3,7 ТБ на накопителе. Не говоря уже о том, что требования к ОЗУ тоже увеличиваются.

Webapp


Также я внёс некоторые изменения в веб-приложение Valhalla, чтобы дополнить layout для мобильных устройств более отзывчивым UI. Эти изменения даже добавили в основной репозиторий! Open source — замечательная вещь.

Также я изменил используемые бэкенд-сервисы, чтобы не нагружать официальные серверы OSM и вместо этого делать запросы к инстансам в моём хостинге.

Это демо можно найти здесь: https://map-demo.wcedmisten.dev.

Скриншоты демо


Прокладывание маршрутов:


Изохроны:


Конфигурирование сервера


Чтобы передавать трафик за пределы моей локальной сети, нужно настроить дополнительные конфигурации.

Включаем DDNS


Поскольку Интернет-провайдер не предоставляет мне статический IP-адрес, пришлось воспользоваться клиентом Dynamic Domain Name Service, обновляющим мои записи DNS так, чтобы они указывали на текущий IP-адрес моего роутера. Так как адрес не статический, провайдер время от времени сбрасывает выделенный мне IP-адрес. Я воспользовался ddclient. Он обеспечивает меньшую надёжность по сравнению со статическим IP, однако для моего сервера, используемого для хобби-разработок, её вполне достаточно.

Nginx


Чтобы обслуживать трафик в различных поддоменах наподобие maps.wcedmisten.dev, я настроил Nginx, передающий трафик каждому поддомену в нужный порт, сконфигурированный в docker-compose.yml. Также я использовал команду certbot для автоматической генерации сертификата из LetsEncrypt для каждого поддомена и обновления конфигурации Nginx. Эта часть тоже оказалась довольно беспроблемной.

Вот как эта часть /etc/nginx/sites-available/default выглядела до выполнения certbot, добавившего дополнительную конфигурацию для обработки https.

server {
    server_name maps.wcedmisten.dev;
    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8080;
        proxy_redirect off;
    }
}

server {
    server_name valhalla.wcedmisten.dev;
    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8002;
        proxy_redirect off;
    }
}

Переадресация портов


Наконец, чтобы получать внешний трафик из подключенного к моему компьютеру (и конкретно к Nginx) Интернета, мне нужно было настроить в роутере переадресацию портов. Интерфейс администратора Netgear отображает каждое подключенное к сети устройство, поэтому мне достаточно было перенаправить на компьютер порты 80 (HTTP) и (443). Эта операция оказалась намного проще, чем я ожидал.

Сравнение затрат


Для создания приблизительной альтернативы Google Maps требуется много памяти, однако, строго говоря, это вполне возможно на оборудовании потребительского уровня и с приличным доходом пользователя.

Затраты на Google Maps API


На момент написания статьи Google Maps каждый месяц позволяет бесплатно пользоваться Maps API на первые $200. Также сервис позволяет неограниченно пользоваться встроенным Google Maps API, отображающим на сайте интерактивную карту. Однако эти условия исключительно для использования в вебе. Стоимость для iOS/Android составляет $7/1000 запросов.

API прокладывания маршрутов (не включая данные трафика) стоит $5/1000 запросов.

API геокодирования тоже стоит $5/1000 запросов.

По грубым прикидкам мы можем предположить, что каждый посетитель, пользующийся веб-приложением, в среднем ищет два места (геокодирование),
загружает встроенную карту и выполняет запрос на построение маршрута. Это значит, что на каждые 1000 посетителей тратится $15 от кредитов API.

Иными словами, бесплатный тариф может поддерживать примерно 13 тысяч посетителей в месяц, если предположить, что каждый посетитель пользуется приложением минимально. После завершения бесплатных кредитов каждый посетитель будет стоить нам $0,015.

Затраты на самостоятельный хостинг


  • Доменное имя: $1,43/месяц
  • Счёт Интернет-провайдера: $69,99/месяц
  • PC: $1670 (единовременно)
  • Итого: $1670 единовременно + $71,42/месяц

Если предположить, что длительность амортизации покупки составляет два года (именно столько у меня был компьютер), то:

  • Итого: ($1670/24) + $71,42 = $141,00/месяц

«Самостоятельный хостинг» в облаке


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

Дроплет DigitalOcean (оптимизация по памяти):

  • 128 ГБ ОЗУ, 16 vCPU, SSD на 1170 ГБ — $832,00/месяц
  • Итого — $832,00/месяц

Инстанс AWS r6a.4xlarge EC2:

  • 128 ГБ ОЗУ, 16 vCPU — $653,18/месяц
  • SSD на 1 ТБ — $82,24/месяц
  • Итого — $735,42/месяц

Инстанс Azure D32as v5 VM:

  • 128 ГБ ОЗУ, 32 vCPU — $1004,48/месяц
  • SSD на 1 ТБ — $122,88/месяц
  • Итого — $1127,36/месяц

Сравнение самостоятельного хостинга и Google Maps API


Кажется очевидным, что с точки зрения чистых затрат самостоятельный хостинг на моём оборудовании намного дешевле, чем использование облачных ресурсов. Разумеется, сравнение не вполне точное. В комплекте с облаком идёт множество вещей, которые не может обеспечить машина, работающая у меня в комнате: резервные копии, экспертиза в ИТ, поддержка в случае аварийных ситуаций, служба помощи и так далее. Но поскольку это хобби, для меня компромисс вполне приемлем. Я всё равно пытаюсь научиться чему-то новому, так что это становится почти выигрышем.

Но как насчёт Google Maps API? Бесплатных кредитов Google достаточно, чтобы обслужить 13 тысяч посетителей в месяц! Это большой объём трафика. Когда же имеет смысл организовывать собственный хостинг на моём «железе»?

13 тысяч.

Выше мы говорили, что после превышения бесплатного тарифа каждый посетитель будет стоить $0,015 за Google API. А если считать, что самостоятельный хостинг стоит $141,00/месяц, то чтобы быть равными по показателям, нам нужно 141,00/0,015 = 9400 дополнительных посетителей.

Суммарно 9400 + 13000 = 22400 посетителей в месяц.

22400 в месяц — это примерно 747 в день, или по одному пользователю раз в две минуты.

Я вполне уверен, что моя машина сможет справиться с таким объёмом трафика.

Проблема сравнения этих чисел такая же, как и при сравнении затрат на самостоятельный хостинг с затратами на облако. Нюанс заключается в той ценности, которую даёт сервис Google Maps: экспертиза, масштабируемость и проприетарные данные карт.

Но мне кажется, для подобных хобби-проектов самостоятельный хостинг вполне имеет смысл.

Даже при профессиональном использовании стоит всё подсчитать. Благодаря docker установка этих сервисов существенно упрощается, пусть и занимает какое-то время. Здесь мы также предполагаем очень несущественную API-нагрузку на карту. Если предположить, что пользование сервисами карт будет более активным, выигрыш может возникнуть даже ещё раньше. Особенно в случае приложения, требующего пакетной обработки больших массивов данных.

Комментарии (20)


  1. Medeyko
    00.00.0000 00:00
    +6

    Ключевое с хостингом OSM у себя - это свобода и независимость. У вас пропадает риск произвола со стороны вендора или иностранных регуляторов.


  1. Grumpy
    00.00.0000 00:00
    +5

    Для того, чтобы развлекаться дома слишком жирные требования. Как то в позапрошлом году я игрался с tileserver-gl векторные тайлы всего мира весят что то около 100gb. И вся эта радость работала на raspbery pi 4, не то что работала а летала. Ну разве что тайлы лежали не на sd карте, а на usb ssd. Все это прекрасно отображало весь мир вплоть до номеров домов в мелких населенных пунктах, но прокладывания маршрутов понятное дело не было.
    Вот бы туда маршруты прикрутить было бы вообще шоколадно. В то же время все это по сути уже реализовано в organic maps, маршруты, легковесность, вот бы это в браузере что то подобное получить при схожих (невысоких) системных требованиях.


    1. freeExec
      00.00.0000 00:00
      +2

      Это которые бесплатно раздаются и были созданы в 2017 году? Ну да, если актуальность данных не играет роли, можно и их раздавать с разбери.
      А вот сможет ли она потянуть базу и создавать тайлы на лету и при том ещё раз в минуту обновлять данные из планеты ОСМ это вопрос.


      1. sshikov
        00.00.0000 00:00
        +2

        >раз в минуту обновлять данные из планеты ОСМ это вопрос.
        А зачем? Ну вот покажите хоть один реальный кейс, когда надо раз в минуту? Я бы сказал, что большинству достаточно будет раз в неделю. В сутки — уже даже слишком хорошо. С такой периодичностью достаточно обновлять скажем маршруты и расписания транспорта, если вы их показываете и используете.

        P.S. Если что, я не возражаю против того, что данные 2017 года безнадежно устарели, и что задача обновления данных весьма тяжелая, а как раз раздача готовых тайлов — самое простое наверное из всей этой комплексной задачи.


        1. freeExec
          00.00.0000 00:00
          +1

          Раз в минуты позволит распределить нагрузку по времени. Можно конечно и раз в неделю, если простой на 30 минут не страшен.
          Просто отдать на запрос готовый тайл, но кто его приготовит, ведь это 99% трудозатрат?


          1. sshikov
            00.00.0000 00:00
            +1

            >Можно конечно и раз в неделю, если простой на 30 минут не страшен.
            Я скорее про то, что никого из пользователей как правило не волнует, что данные устарели на неделю. То есть, вы в принципе можете распределить нагрузку так, чтобы 30 минут на обработку всего мира были размазаны на ту же неделю. Причем обычно хорошо известно, какие данные нам нужнее (тот город и страна, где у нас потребители), их можно обновить быстрее. остальное — потом.


            1. freeExec
              00.00.0000 00:00
              +1

              Понятно что зависит от задачи. Но в общем случае это волнует. Вот можно посмотреть динамику выкатки яндексом изменений НЯК на общую карту. Первые наверное лет 8 это было 2 недели. Потому это сократили до недели. И сейчас пришли к 4 дням.

              А технологии обновления по частям нет. Либо у тебя это в принципе разные базы, либо обновляешь всё.


      1. Grumpy
        00.00.0000 00:00

        Есть и посвежее https://archive.org/details/osm-vector-mbtiles-z0-z14-2022-07-25
        Я сомневаюсь насчет легальности использования в коммерческих целях, но дома в локалочке поиграть вполне.


  1. fire64
    00.00.0000 00:00
    +3

    Спасибо за статью, узнал много интересного, а именно:

    Автор живёт в Северной Америке и редко покидает ее пределы. У автора текста есть девушка, которая живёт с ним. В доме минимум две комнаты, в каждой из которых есть компьютер, при этом у автора, компьютер навороченный.

    А ещё у него есть диван, на котором он развлекается со своей девушкой, как минимум играя с ней в Switch.

    Ну а если по статье, то действительно сервисы OpenStreetMap очень прожорливые. Я бы рекомендовал удалить 80% данных, которые не используются для построения тайлов и прокладки маршрутизации, впрочем для маршрутизации можно использовать сторонние бесплатные API.


    1. igor_suhorukov
      00.00.0000 00:00

      Именно, для аналитики по всему миру хватает даже обычного ноутбука


    1. semio
      00.00.0000 00:00

      А какие есть сторонние бесплатные API для маршрутов?


      1. igor_suhorukov
        00.00.0000 00:00

        На официальной вики проекта указаны пакеты построения маршрутов


  1. Akr0n
    00.00.0000 00:00
    +3

    Я один такой, что проживая в РФ, никогда не использовал Google Maps для навигации? В основном 2GIS, потом OSM, на крайний случай Яндекс. Из Google беру только космоснимки, да и то, через сторонние сервисы.


    1. micronull
      00.00.0000 00:00

      Нет. У гугла отвратительные карты и порой приводят к смертям (гуглите как в Сибири замёрзли молодые люди которые решили поехать по навигатору гугла).


      1. korzunin
        00.00.0000 00:00
        +13

        погуглил.

        -50

        кроссовки, демисезонная куртка, спортивная шапка и кепка.

        резина летняя

        но да, к смерти привел конечно навигатор гугла.


      1. JediPhilosopher
        00.00.0000 00:00
        +2

        Таких историй с любыми картами навалом. Помню в Австралии что-то такое было с картами Apple, когда их только запустили. Они вели зачем-то популярный маршрут напрямик через нацпарк, представляющий из себя тыщу километров пустыни без заправок, поселений и сотовой связи, и заехав туда было очень легко не выехать. В итоге пришлось ставить полицейских на въезде и разворачивать тех, кто пытался туда заехать по навигатору.


      1. Moskus
        00.00.0000 00:00
        +1

        У Гугла (и не только) действительно полно территорий с отвратительными картами, но говорить, что они "приводят к смертям" - это валить с абсолютно больной головы на почти здоровую.


      1. Gor40
        00.00.0000 00:00

        Лет 15 назад дальнобойщик один ехал транзитом через наш район. По бумажной карте. Решил срезать путь в одном месте. Потом несколько километров ехал задом. Ибо дорогу на карте нарисовали, а по факту дорога где-то в середине резко обрывается. Деньги кончились. До сих пор там хороший асфальт лежит. По дороге никто не ездит. Некуда ехать.


  1. alexkuzko
    00.00.0000 00:00
    +3

    Кстати, в сравнениях стоимости облаков упущен очень жирный момент: трафик. Например, у DO будет включен (несколько Тб), а вот у Амазона будет составлять существенную часть стоимости сверх стоимости ресурсов (и в целом на больших нагрузках там много чего есть). В ажуре будет примерно тоже самое.

    И в обратную сторону: если приобретать т.н. зарезервированные машинки или спотовые, то можно существенно сэкономить, грубо половину стоимости.

    Но в целом если уж на то пошло, надо просто... Арендовать что-то вроде hetzner, ovh, и т.п. и всё влезет, и ещё будет дешевле самостоятельного хостинга ..


  1. Avadon
    00.00.0000 00:00

    Смотря для чего поднимать копию Google Maps. Если поиграться или аналитика - ок. А в коммерческом плане без данных о пробках и инвестиций в обновление данных (новые адреса, POI, обновление графа) конкурентоспособность под вопросом.