auto-sync: 2026-04-20 23:40:01
This commit is contained in:
40
memory/2026-04-20.md
Normal file
40
memory/2026-04-20.md
Normal 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 тарифа
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user