auto-sync: 2026-04-20 23:40:01

This commit is contained in:
Stream
2026-04-20 23:40:01 +03:00
parent 1ad89ff1bd
commit cbf01137bb
2 changed files with 47 additions and 7 deletions

40
memory/2026-04-20.md Normal file
View File

@@ -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 тарифа

View File

@@ -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