BackgroundTileServer
Прокси тайл-сервер для внешних картографических сервисов. Кэширует тайлы от OSM, Google, Яндекс, ESRI, CartoDB, 2ГИС в Redis, поддерживает горизонтальное масштабирование и мониторинг в реальном времени.
Архитектура
BackgroundTileServer состоит из 3 контейнеров:
- Nginx — reverse proxy, 5 ГБ дисковый кэш тайлов, WebSocket upgrade, gzip
- FastAPI — обработка запросов, проксирование к внешним провайдерам, Redis-кэш
- Redis — кэш тайлов, атомарные счётчики, реестр инстансов
Жизненный цикл запроса
GET /tiles/osm/z/x/yX-Cache: HITX-Tile-Cache: HIThttpx client
256×256 px
Двухуровневый кэш: Nginx (диск, 5 ГБ, 24 ч) → Redis (память, TTL настраивается). При повторном запросе тайл отдаётся из Nginx за <1 мс.
Провайдеры
| ID | Название | Zoom | Attribution |
|---|---|---|---|
osm | OpenStreetMap | 0–19 | © OpenStreetMap |
google-roadmap | Google Roadmap | 0–21 | |
google-satellite | Google Satellite | 0–21 | |
google-hybrid | Google Hybrid | 0–21 | |
google-terrain | Google Terrain | 0–21 | |
yandex-map | Яндекс Карта | 0–19 | © Яндекс |
yandex-satellite | Яндекс Спутник | 0–19 | © Яндекс |
yandex-hybrid | Яндекс Гибрид | 0–19 | © Яндекс |
2gis | 2ГИС | 0–18 | © 2ГИС |
esri-satellite | ESRI Satellite | 0–19 | © Esri |
carto-light | CartoDB Light | 0–20 | © CartoDB |
carto-dark | CartoDB Dark | 0–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 — Тайлы
Получить тайл
/tiles/{provider}/{z}/{x}/{y}
Возвращает тайл-изображение (PNG, JPEG) от выбранного провайдера.
| Параметр | Тип | Описание |
|---|---|---|
provider | string (path) | ID провайдера (osm, google-satellite, ...) |
z | int (path) | Zoom level |
x | int (path) | X-координата тайла |
y | int (path) | Y-координата тайла |
Заголовки ответа
| Заголовок | Значение |
|---|---|
X-Tile-Cache | HIT — из Redis, MISS — из upstream |
X-Cache-Status | HIT / MISS — Nginx proxy cache |
Cache-Control | public, 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);Список провайдеров
/providers
Возвращает список всех доступных провайдеров с метаданными.
[
{
"id": "osm",
"name": "OpenStreetMap",
"min_zoom": 0,
"max_zoom": 19,
"attribution": "© OpenStreetMap contributors"
},
...
]API — Мониторинг
Статистика (JSON)
/api/stats
Полная статистика: uptime, RPS, latency, Redis, провайдеры, клиенты, инстансы.
WebSocket мониторинг
/ws/stats
Пушит статистику каждые 2 секунды.
Health Check
/health
Возвращает {"status": "ok"}.
Кэширование
Redis кэш (L1)
Все тайлы кэшируются в Redis. TTL настраивается:
| Переменная | По умолчанию | Описание |
|---|---|---|
TILE_CACHE_TTL | 86400 (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_URL | redis://redis:6379/0 | Подключение к Redis |
TILE_CACHE_TTL | 86400 | TTL тайлов в Redis (сек) |
UPSTREAM_TIMEOUT | 15 | Таймаут запроса к upstream (сек) |
UPSTREAM_MAX_CONNECTIONS | 50 | Макс. соединений на провайдер |
HEARTBEAT_INTERVAL | 10 | Интервал heartbeat (сек) |
INSTANCE_TTL | 30 | TTL записи инстанса |
LOG_LEVEL | info | Уровень логирования |
Kubernetes
kubectl apply -f k8s/
Обработка ошибок
| Код | Когда |
|---|---|
200 | Успешный ответ |
404 | Неизвестный провайдер / тайл не найден на upstream |
422 | Некорректные параметры |
500 | Внутренняя ошибка |
Swagger / ReDoc
- Swagger UI —
/docs - ReDoc —
/redoc - OpenAPI JSON —
/openapi.json