From cbf01137bb7801b965f870a1a4c53b3fddece015 Mon Sep 17 00:00:00 2001 From: Stream Date: Mon, 20 Apr 2026 23:40:01 +0300 Subject: [PATCH] auto-sync: 2026-04-20 23:40:01 --- memory/2026-04-20.md | 40 ++++++++++++++++++++++++++++ tasks/flightradar24/frontend/main.py | 14 +++++----- 2 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 memory/2026-04-20.md diff --git a/memory/2026-04-20.md b/memory/2026-04-20.md new file mode 100644 index 0000000..8699dda --- /dev/null +++ b/memory/2026-04-20.md @@ -0,0 +1,40 @@ +# 2026-04-20 — Дневник + +## Проект: FR24 / Noisemap — Фаза 2, Шаг 2 + +### БТ финализировано +- Файл: `tasks/flightradar24/docs/PHASE2_STEP2_DATA_MART.md` +- FR24 API: `Flight tracks`, 40 кредитов/рейс, только по команде, T-1, SVO/DME/VKO/ZIA +- FlightAware AeroAPI: только треки, ключ `7qMijd3b3gVudezng3eVhKtup8iKFr75` сохранён в `.env` как `FLIGHTAWARE_API_KEY` +- Витрина `fr24_mart`: приоритет RTL-SDR > FR24 > FlightAware, источник в каждой записи +- Шумовая модель: из прототипа, зоны 2/5/7/9 км (граница "Низкий" изменена 11→9 км) +- Отложено: цена FlightAware Standard, глубина исторической загрузки FR24 + +### FlightAware — тестирование ключа +- Ключ `7qMijd3b3gVudezng3eVhKtup8iKFr75` протестирован и работает +- Трек AFL245 (Сейшелы→Москва): 401 точка, 8+ часов, богатые метаданные +- Тариф Personal: 500 запросов/мес бесплатно = ~250 рейсов/мес (2 запроса на рейс) +- Бонус: фактические времена взлёта/посадки + задержки из `/flights/{ident}` +- Ключ сохранён в `.env` на VM как `FLIGHTAWARE_API_KEY` + +### Dev-агент — реализация (7м53с, 1.7M токенов) +Создано 21 файл, изменено 2: +- `db/init/005_schema_tracks.sql` — 8 таблиц (fr24_ext + fr24_mart) +- `ingest/tracks_fr24/` — воркер FR24 треков (порт 8001), throttling 6 сек/запрос +- `ingest/tracks_fa/` — воркер FlightAware треков (порт 8002) +- `ingest/mart/` — воркер витрины + шумовая модель, noise_grid по round(lat,2) +- `frontend/static/data_sources.html` + `data_sources.js` +- `docker-compose.yml` — 3 новых сервиса +- `frontend/main.py` — `/data-sources` + 5 API эндпоинтов + +### Деплой на VM (fr24, 192.168.2.67) +- DDL `005_schema_tracks.sql` применён через `docker exec fr24-postgres psql` +- Контейнеры `fr24-tracks-fr24` (8001), `fr24-tracks-fa` (8002), `fr24-mart` — собраны и запущены, все healthy +- Обнаружена ошибка в `main.py` (frontend): колонка `flight_date` vs `coverage_date` в `fr24_mart.source_coverage` +- Фикс задеплоен, api пересобран + +### Открытые задачи на завтра +- Проверить `/data-sources` страницу после фикса +- Запустить backfill Яндекса (21:00 UTC rate limit сброс) +- Проверить noise_model.py — граница "Низкий" 7-9 км (изменена сегодня) +- Уточнить цену FlightAware Standard тарифа diff --git a/tasks/flightradar24/frontend/main.py b/tasks/flightradar24/frontend/main.py index e6ddfb2..c60ad3e 100644 --- a/tasks/flightradar24/frontend/main.py +++ b/tasks/flightradar24/frontend/main.py @@ -646,12 +646,12 @@ def data_sources_page(): return send_from_directory("/app/static", "data_sources.html") -def _ds_where(args): +def _ds_where(args, date_col="coverage_date"): clauses, params = [], [] if args.get("date_from"): - clauses.append("flight_date >= %s"); params.append(args["date_from"]) + clauses.append(f"{date_col} >= %s"); params.append(args["date_from"]) if args.get("date_to"): - clauses.append("flight_date <= %s"); params.append(args["date_to"]) + clauses.append(f"{date_col} <= %s"); params.append(args["date_to"]) return (" AND ".join(clauses) if clauses else "1=1"), params @@ -693,7 +693,7 @@ def ds_coverage(): @app.get("/api/data-sources/quality") def ds_quality(): try: - where, params = _ds_where(request.args) + where, params = _ds_where(request.args, date_col="flight_date") q = query_one( f""" SELECT @@ -734,7 +734,7 @@ def ds_quality(): @app.get("/api/data-sources/top-airlines") def ds_top_airlines(): try: - where, params = _ds_where(request.args) + where, params = _ds_where(request.args, date_col="flight_date") rows = query( f""" SELECT airline_iata, COUNT(*) AS flight_count @@ -754,7 +754,7 @@ def ds_top_airlines(): @app.get("/api/data-sources/top-routes") def ds_top_routes(): try: - where, params = _ds_where(request.args) + where, params = _ds_where(request.args, date_col="flight_date") rows = query( f""" SELECT origin_iata, destination_iata, COUNT(*) AS flight_count @@ -776,7 +776,7 @@ def ds_top_routes(): @app.get("/api/data-sources/airport-load") def ds_airport_load(): try: - where, params = _ds_where(request.args) + where, params = _ds_where(request.args, date_col="flight_date") rows = query( f""" SELECT