# Фаза 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/ — трек рейса (из 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