# Фаза 2, Шаг 3: Перенос и доработка визуала noisemap на VM-FR24

## Статус
🔲 Не начат (зависит от Шага 2)

## Цель
Перенести прототип noisemap (сейчас работает на mva154) на VM-FR24, адаптировать его для работы с новой витриной данных `fr24_mart` и доработать UI под новые возможности.

---

## Бизнес-требования

### BR-1: Перенос прототипа
- Прототип noisemap переносится с mva154 на VM-FR24
- Работает как отдельный контейнер в том же docker-compose стеке
- Доступен по тому же пути `/noisemap/` через nginx reverse proxy

### BR-2: Адаптация под витрину данных
- Источник данных: `fr24_mart` вместо CSV/JSON файлов
- Слой плотности пролётов — из `fr24_mart.noise_grid`
- Треки рейсов — из `fr24_mart.track_points_unified`
- Информация о рейсе — из `fr24_mart.flights_unified`
- Слайдер по дням — работает с реальными датами из БД

### BR-3: Новые возможности UI
- Фильтр по источнику данных: RTL-SDR / FR24 API / все
- Индикатор покрытия: % рейсов с треком для выбранного дня
- Попап рейса: показывать авиакомпанию, маршрут, тип ВС, источник данных
- Live режим: автообновление карты каждые 60 сек (данные из RTL-SDR)

### BR-4: Шумовая карта
- Слой шума строится из `fr24_mart.noise_grid`
- Цветовая шкала: зелёный (тихо) → жёлтый → красный (шумно)
- Легенда с единицами (условные единицы шума)
- Возможность переключения между "плотность пролётов" и "уровень шума"

---

## Технические требования

### Контейнер `fr24-noisemap`
- Flask + OpenLayers (как в прототипе)
- Подключение к PostgreSQL (fr24_mart схема)
- Порт: 5556 (как в прототипе на mva154)
- Nginx proxy: `/noisemap/` → `fr24-noisemap:5556`

### API endpoints (новые/изменённые)
```
GET /api/dates              — список дат с данными
GET /api/density?date=      — шумовая сетка за дату (из noise_grid)
GET /api/flights?date=      — список рейсов за дату (из flights_unified)
GET /api/track/<flight_id>  — трек рейса (из track_points_unified)
GET /api/live               — live борты (из fr24.track_points, последние 60 мин)
GET /api/coverage?date=     — метрики покрытия источников
```

### Nginx конфигурация
- Добавить location `/noisemap/` в существующий nginx на VM-FR24
- Или развернуть nginx как отдельный контейнер если его нет

---

## ТЗ для Dev-агента

### Файлы для создания/изменения
```
tasks/flightradar24/noisemap/
  Dockerfile
  app.py           # Flask приложение (адаптация прототипа)
  requirements.txt
  static/
    index.html     # UI (адаптация прототипа)
    app.js         # логика карты
    style.css
tasks/flightradar24/compose/docker-compose.yml  # добавить сервис noisemap + nginx
tasks/flightradar24/compose/nginx.conf          # конфигурация nginx
```

### Что взять из прототипа
- `tasks/flightradar24/prototype/app.py` — базовая структура Flask
- `tasks/flightradar24/prototype/static/` — UI компоненты
- `tasks/flightradar24/prototype/docs/NOISE_MODEL.md` — модель шума

---

## Тест-кейсы

### TC-1: Базовая работоспособность
- [ ] Контейнер стартует без ошибок
- [ ] Карта открывается по `/noisemap/`
- [ ] Слайдер по дням работает

### TC-2: Данные из витрины
- [ ] Слой плотности загружается из `fr24_mart.noise_grid`
- [ ] Треки рейсов отображаются из `fr24_mart.track_points_unified`
- [ ] Попап рейса показывает авиакомпанию и маршрут

### TC-3: Фильтры
- [ ] Фильтр по источнику (RTL-SDR / FR24 / все) работает
- [ ] Индикатор покрытия обновляется при смене даты

### TC-4: Live режим
- [ ] Live борты обновляются каждые 60 сек
- [ ] При отсутствии RTL-SDR данных — graceful degradation

### TC-5: Производительность
- [ ] Загрузка слоя плотности < 2 сек
- [ ] Загрузка треков за день < 3 сек

### TC-6: Перенос с mva154
- [ ] Старый прототип на mva154 продолжает работать (не ломаем)
- [ ] Новый инстанс на VM-FR24 работает независимо

---

## Зависимости
- Шаг 2 (витрина fr24_mart должна быть заполнена)
- Прототип noisemap (tasks/flightradar24/prototype/)
- Nginx на VM-FR24 (или новый контейнер)

## Риски
- Прототип использует OpenLayers — нужно проверить совместимость с новым API
- Модель шума в прототипе заточена под FR24 данные — нужна адаптация под RTL-SDR
