Зачем
Маркетплейс RYTA кладёт каждый груз, машину и единицу техники на карту и целый день геокодирует адреса. Сторонние картографические API в регионе либо платные за запрос, либо с лимитами, либо политически хрупкие. Собственный стек на весь СНГ вышел дешевле любого из них — при условии, что он работает на том железе, что уже было: VPS с 2 ГБ памяти.
Собирать тяжело, раздавать легко
Всё дорогое происходит на сборочной машине; VPS только раздаёт файлы и отвечает на маленькие запросы.
Основа карты. Тринадцать PBF-выгрузок Geofabrik (Россия и двенадцать соседей) объединяются osmium, грузятся в PostGIS через osm2pgsql — в архитектурных заметках есть расчёт размеров: кэш osm2pgsql против flat-nodes и множители по диску — и рендерятся в векторную основу через Planetiler/tippecanoe. Результат — один файл PMTiles около 10 ГБ. Он раздаётся как статический файл с HTTP range-запросами: ни процесса тайл-сервера, ни кэша, который надо греть; MapLibre GL читает его напрямую.
Геокодирование. Индекс Photon собирается вне сервера из импорта Nominatim и копируется: около 5,5 ГБ на диске и ~2 ГБ кучи под OpenSearch — единственный компонент, которому память действительно нужна. Даёт прямой поиск с автодополнением на русском и английском и обратное геокодирование.
Живые тайлы по необходимости. Для меняющихся слоёв pg-map отдаёт MVT-тайлы прямо из PostGIS через ST_AsMVT; есть конфигурация тайл-сервера Martin и настройка kepler.gl v3 поверх pg_featureserv без токена Mapbox.
Шлюз: ключи, квоты, деньги
Шлюз на Node/Express выставляет всё это как маленький SaaS. Две области ключей — rgk_* для геокодирования и rmk_* для карт — с дневными и месячными квотами и HTTP 429 при превышении, дашборд использования, админка и публичная демо-версия без ключа. Регистрация без пароля: пользователь подтверждает номер звонком на 8-800, виртуальная АТС Ростелекома подтверждает его подписанным вебхуком. Тарифы Free, Starter и Business оплачиваются через Т-Банк.
Правка карты своими руками
edit-osm — инструмент на Flask: рисуешь прямоугольник на своей карте, вырезаешь его osmium, правишь в JOSM через Remote Control, вливаешь обратно и пересобираешь основу. Свои объекты появляются и на тайлах, и в поиске. Есть и эксперимент с полной базой OSM API (cgimap) для приватного процесса редактирования.
Инструменты и развёртывание
geo-demo — стенд на MapLibre со статистикой времени ответа Photon, OSM-тегами каждого результата, обратным геокодированием по клику и инспектором объектов векторных тайлов. Две цели развёртывания — VPS с уже существующим Photon и основной сервер с приватным реестром — управляются PowerShell-скриптами с режимом dry-run и блоками хостов Caddy. Около 7 600 строк своего кода без учёта сторонних компонентов.
Что сделал бы иначе
Определил бы схему тайлов до первого прогона Planetiler: смена атрибутов потом означает перерендер 10 ГБ. И заложил бы учёт квот с первого дня — он появился, когда у демо пошёл настоящий трафик, а это худший момент.