# Прототип Enduro Trails на mva154

**Статус:** active  
**Приоритет:** high  
**Проект:** proj_enduro_trails

---

## Задача

Настроить и развить прототип на mva154 для проверки концепции Enduro Trails.

---

## ✅ Выполнено

### Фаза 1 — Базовый прототип (2026-05-02)

- [x] PBF парсинг ЦФО + Чувашия → Spatialite (1 141 926 треков, 14 882 POI)
- [x] `parse.py` — bbox-колонки, индекс `idx_trails_bbox`, `lon`/`lat` для poi
- [x] `app.py` — MVT тайлы через FastAPI, `length_m`/`mtb_scale` в props, SQL bbox-фильтр, валидация z/x/y
- [x] `index.html` + `app.js` + `app.css` — MapLibre GL JS фронт
- [x] `requirements.txt` — `mapbox-vector-tile==2.2.0`
- [x] `Dockerfile` + `docker-compose.yml`
- [x] `scripts/smoke_check.py`
- [x] Задеплоено на `82.22.50.71:5558`, smoke checks прошли

### Оптимизация (2026-05-03)

- [x] LRU-кэш тайлов (512 тайлов в памяти, gzip)
- [x] Упрощение геометрии по зуму (Shapely simplify, адаптивный tolerance)
- [x] Фильтр треков по длине на низких зумах (z8: ≥500м, z9: ≥200м)
- [x] 4 uvicorn workers — параллельная обработка запросов MapLibre
- [x] Dockerfile пересобран — контейнер стартует мгновенно без apt/pip
- [x] Nginx location `/enduro/` → HTTPS через `openclaw.mva154.duckdns.org`
- [x] Все пути в фронте относительные — работает и через nginx, и по прямому IP

### UI/UX (2026-05-03)

- [x] Кнопка 🧭 компас (север/свободный режим)
- [x] Кнопка 📍 геолокация с пульсирующим маркером
- [x] Тропы (path/footway/bridleway) — красный пунктир (#cc0000)
- [x] Асфальт скрыт (visibility: none, opacity: 0)
- [x] Легенда: Lev1-2 / Lev3-5 / Тропа (компактно, без асфальта)
- [x] Раскраска: Lev1-2 жёлтый (#FFD700), Lev3-5 красный (#FF4400), одинаковая толщина
- [x] Подложка: raster-saturation -0.4, raster-contrast 0.25, raster-brightness-max 0.9
- [x] Попапы: name, surface, tracktype, length_m, mtb_scale

### Фаза 2 — Роутинг + Поиск + Линейка (2026-05-03)

- [x] OSRM граф собран с кастомным `enduro.lua` профилем (3 попытки, с 6 GB swap)
- [x] Swap добавлен: `/home/slin/swapfile3` (4 GB), итого 6 GB
- [x] OSRM роутер запущен: контейнер `osrm-osrm-routed-1`, порт `5559`
- [x] API endpoint `/api/route` в `app.py` (httpx → OSRM)
- [x] Фронт роутинга: кнопка 🗺️, маркеры A/B, карточка с дистанцией и временем
- [x] Поиск (Nominatim): строка в хедере, debounce 400ms, limit 6, countrycodes=ru, flyTo
- [x] Линейка 📏: кружки точно на координатах (anchor:center), плашки над ними (offset [0,-20]), крестик с stopPropagation, haversine расстояние

---

## 🔄 В работе

### OSRM пересборка (3-я итерация, запущена 2026-05-03 ~21:00 UTC)

**Проблема:** маршрут шёл по Ленинградскому шоссе вместо грунтовок.  
**Причина:** `weight_name = 'duration'` → OSRM оптимизирует по времени, асфальт быстрее.  
**Решение:**
- `weight_name = 'routability'`
- `forward_rate = penalty` (penalty/метр, не делённый на скорость)
- Штрафы: track=1, tertiary=15, secondary=25, primary=40, trunk=60, motorway=999

**Проверить после сборки:** маршрут Хоругвино → Дятлово должен идти по грунтовкам, не по Ленинградке.

---

## ⏳ Бэклог

### Фаза 3 — Умный маршрут
- [ ] Промежуточные точки (перетаскиваемые waypoints)
- [ ] Статистика маршрута: % асфальт / lev1-2 / lev3-5 / тропа
- [ ] Скачать GPX

### Фаза 4 — Флажки/метки
- [ ] Расстановка именованных меток на карте
- [ ] Сохранение в localStorage

### Фаза 5 — Редизайн
- [ ] Тёмная тема, эндуро-стиль
- [ ] Адаптив под мобилку

### Фаза 6 — SRTM рельеф
- [ ] "Горка" — макс набор высоты
- [ ] Профиль высот на маршруте

### Фаза 7 — PWA + офлайн
- [ ] Service Worker
- [ ] Офлайн MBTiles
- [ ] GPS-трекинг

### Фаза 8 — Народные треки
- [ ] Источники: OSM Traces, Wikiloc, Komoot, 4x4travel.ru, Enduroad.ru
- [ ] Отдельный слой `community_tracks`
- [ ] Фильтрация по типу активности (мото / вело / джип / пеший)

---

## Технические детали

### Файловая структура на сервере

```
/home/slin/enduro-trails/
├── prototype/          ← код контейнера (= workspace/tasks/enduro-trails/prototype/)
│   ├── app.py
│   ├── Dockerfile
│   ├── docker-compose.yml
│   ├── requirements.txt
│   └── static/
│       ├── index.html
│       ├── app.js
│       ├── app.css
│       └── style.json
├── data/
│   ├── centralfederal.sqlite   (431 MB, БД треков)
│   ├── enduro.osm.pbf          (PBF для OSRM)
│   └── enduro.osrm.*           (граф OSRM)
└── osrm/
    ├── enduro.lua              (кастомный профиль)
    └── docker-compose.yml      (OSRM роутер)
```

### Деплой

```bash
# Обновить статику и пересобрать контейнер
cd /home/slin/enduro-trails/prototype
docker compose up -d --build
```

### OSRM пересборка

```bash
cd /home/slin/enduro-trails/osrm
docker compose run --rm osrm-prepare
docker compose up -d
```

### Проверка OSRM

```bash
curl "http://localhost:5559/route/v1/driving/36.8,56.1;36.9,56.2?overview=full&geometries=geojson"
```

---

*Ссылка на онтологию: `task_enduro_prototype`*
