BackgroundTileServer

Прокси тайл-сервер для внешних картографических сервисов. Кэширует тайлы от OSM, Google, Яндекс, ESRI, CartoDB, 2ГИС в Redis, поддерживает горизонтальное масштабирование и мониторинг в реальном времени.

Полностью автономный сервис. Единственная зависимость — Redis (кэш). Не требует локальных файлов.

Архитектура

BackgroundTileServer состоит из 3 контейнеров:

🌐
Клиент
HTTP / WS
Nginx
:80
reverse proxy + tile cache
proxy
FastAPI
:8000
REST API + Web UI
cache / stats
Redis
:6379
tile cache + stats
🗺️
Upstream
OSM / Google / Яндекс / ...
  • Nginx — reverse proxy, 5 ГБ дисковый кэш тайлов, WebSocket upgrade, gzip
  • FastAPI — обработка запросов, проксирование к внешним провайдерам, Redis-кэш
  • Redis — кэш тайлов, атомарные счётчики, реестр инстансов

Жизненный цикл запроса

1
Запрос
GET /tiles/osm/z/x/y
2
Nginx Cache
Дисковый кэш
X-Cache: HIT
3
Redis Cache
In-memory
X-Tile-Cache: HIT
4
Upstream
OSM / Google / ...
httpx client
5
Ответ
PNG / JPEG
256×256 px

Двухуровневый кэш: Nginx (диск, 5 ГБ, 24 ч) → Redis (память, TTL настраивается). При повторном запросе тайл отдаётся из Nginx за <1 мс.

Провайдеры

IDНазваниеZoomAttribution
osmOpenStreetMap0–19© OpenStreetMap
google-roadmapGoogle Roadmap0–21© Google
google-satelliteGoogle Satellite0–21© Google
google-hybridGoogle Hybrid0–21© Google
google-terrainGoogle Terrain0–21© Google
yandex-mapЯндекс Карта0–19© Яндекс
yandex-satelliteЯндекс Спутник0–19© Яндекс
yandex-hybridЯндекс Гибрид0–19© Яндекс
2gis2ГИС0–18© 2ГИС
esri-satelliteESRI Satellite0–19© Esri
carto-lightCartoDB Light0–20© CartoDB
carto-darkCartoDB Dark0–20© CartoDB

Быстрый старт

# Клонировать и запустить
git clone <repo-url>
cd BackgroundTileServer

# Запустить
docker compose up -d --build

# Проверить
curl http://localhost:8083/health
curl http://localhost:8083/providers

После запуска доступны:

  • Просмотр — интерактивная карта с Leaflet
  • Мониторинг — дашборд состояния в реальном времени
  • Swagger — интерактивная API-документация

API — Тайлы

Получить тайл

GET /tiles/{provider}/{z}/{x}/{y}

Возвращает тайл-изображение (PNG, JPEG) от выбранного провайдера.

ПараметрТипОписание
providerstring (path)ID провайдера (osm, google-satellite, ...)
zint (path)Zoom level
xint (path)X-координата тайла
yint (path)Y-координата тайла

Заголовки ответа

ЗаголовокЗначение
X-Tile-CacheHIT — из Redis, MISS — из upstream
X-Cache-StatusHIT / MISS — Nginx proxy cache
Cache-Controlpublic, max-age=86400
curl -o tile.png "http://localhost:8083/tiles/osm/14/9876/5432"
const resp = await fetch('/tiles/google-satellite/14/9876/5432');
const blob = await resp.blob();
import httpx

resp = httpx.get("http://localhost:8083/tiles/osm/14/9876/5432")
with open("tile.png", "wb") as f:
    f.write(resp.content)

Leaflet интеграция

L.tileLayer('/tiles/osm/{z}/{x}/{y}', {
    minZoom: 0,
    maxZoom: 19,
}).addTo(map);

Список провайдеров

GET /providers

Возвращает список всех доступных провайдеров с метаданными.

[
  {
    "id": "osm",
    "name": "OpenStreetMap",
    "min_zoom": 0,
    "max_zoom": 19,
    "attribution": "© OpenStreetMap contributors"
  },
  ...
]

API — Мониторинг

Статистика (JSON)

GET /api/stats

Полная статистика: uptime, RPS, latency, Redis, провайдеры, клиенты, инстансы.

WebSocket мониторинг

WS /ws/stats

Пушит статистику каждые 2 секунды.

Health Check

GET /health

Возвращает {"status": "ok"}.

Кэширование

Redis кэш (L1)

Все тайлы кэшируются в Redis. TTL настраивается:

ПеременнаяПо умолчаниюОписание
TILE_CACHE_TTL86400 (24 ч)TTL тайлов

Ключи Redis: tile:{provider}:{z}:{x}:{y}

Nginx кэш (L2)

Nginx кэширует ответы /tiles/ на диске (до 5 ГБ, 24 ч).

Масштабирование

Горизонтальное масштабирование

docker compose up -d --scale app=4

Реестр инстансов

Каждый инстанс публикует heartbeat в Redis каждые 10 секунд.

Деплой

Docker Compose

docker compose up -d --build

Переменные окружения

ПеременнаяПо умолчаниюОписание
REDIS_URLredis://redis:6379/0Подключение к Redis
TILE_CACHE_TTL86400TTL тайлов в Redis (сек)
UPSTREAM_TIMEOUT15Таймаут запроса к upstream (сек)
UPSTREAM_MAX_CONNECTIONS50Макс. соединений на провайдер
HEARTBEAT_INTERVAL10Интервал heartbeat (сек)
INSTANCE_TTL30TTL записи инстанса
LOG_LEVELinfoУровень логирования

Kubernetes

kubectl apply -f k8s/

Обработка ошибок

КодКогда
200Успешный ответ
404Неизвестный провайдер / тайл не найден на upstream
422Некорректные параметры
500Внутренняя ошибка

Swagger / ReDoc