dobrovolskiy.com
EN
← Заметки2026-08-30 · Дмитрий Добровольский

Свой стек OpenStreetMap для России и СНГ на VPS с 2 ГБ: PMTiles, Photon и API с учётом запросов

Как geo.ryta.online заменяет API Google/Яндекс Карт: 13 выгрузок Geofabrik в PostGIS через osm2pgsql, векторная основа ~10 ГБ в PMTiles как статический файл, индекс геокодера Photon, собранный вне сервера, и шлюз на Node/Express с ключами, квотами и платными тарифами.

geo.ryta.online — полный собственный гео-бэкенд для России и двенадцати соседей по СНГ: выгрузки OSM объединены и загружены в PostGIS, векторная основа ~10 ГБ в PMTiles раздаётся range-запросами, геокодер Photon с автодополнением на русском и английском и обратным геокодированием, плюс небольшой SaaS-шлюз с ключами API, дневными и месячными квотами и оплатой через Т-Банк. Уместилось на VPS с 2 ГБ памяти благодаря принципу «собирать тяжело, раздавать легко».

Зачем

Маркетплейс 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 ГБ. И заложил бы учёт квот с первого дня — он появился, когда у демо пошёл настоящий трафик, а это худший момент.

Вопросы

Почему PMTiles, а не тайл-сервер?

Архив PMTiles — один статический файл, который MapLibre читает range-запросами. Нет процесса тайл-сервера, нет рендеринга по запросу и нечего кэшировать — именно это позволяет VPS с 2 ГБ раздавать основу на целый регион.

Насколько хорош геокодер?

Photon поверх импорта Nominatim даёт прямой поиск с автодополнением на русском и английском и обратное геокодирование по России и двенадцати странам СНГ. Свои объекты, добавленные через цикл с JOSM, тоже находятся в поиске.

Можете развернуть это для моего проекта?

Да. Конвейер заскриптован; адаптация под ваш регион, добавление слоёв или подключение шлюза к вашему биллингу — почасовые сессии с расшаренным экраном.

Нужно что-то похожее?

Делаю это вживую на звонке в Zoom / Яндекс Телемост, вы смотрите на экран, таймер останавливается по вашему слову. Первые 15 минут бесплатно.

Ещё проекты

geo.ryta.online: собственный картографический APIСобственный стек OpenStreetMap для России/СНГ: векторные тайлы, геокодер Photon и API-шлюз с учетом запросов и платными тарифами