Files
wiki/tasks/flightradar24/docs/PHASE2_STEP1_EXTERNAL_DATA.md
2026-04-20 11:40:01 +03:00

121 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Фаза 2, Шаг 1: Внешние источники данных — FR24 API + онлайн табло
## Статус
🔲 Не начат
## Цель
Развернуть отдельный контейнер для сбора данных из внешних источников:
1. **FR24 API** — исторические и live треки (как в прототипе noisemap)
2. **Онлайн табло** — расписание рейсов по аэропортам Москвы (SVO, DME, VKO, ZIA)
Данные сохранять в PostgreSQL в отдельной схеме `fr24_ext` — не пересекаться со схемой `fr24` (RTL-SDR ingest).
---
## Бизнес-требования
### BR-1: Сбор данных FR24 API
- Загружать треки рейсов над Московской областью через FR24 API
- Покрытие: bbox ~54.557.0°N, 35.540.5°E (Московская область)
- Исторические данные: последние 7 дней (при наличии кредитов)
- Live данные: обновление каждые 5 минут
- Хранить: icao24, callsign, координаты трека, высота, скорость, время
### BR-2: Сбор данных онлайн табло
- Аэропорты: SVO (Шереметьево), DME (Домодедово), VKO (Внуково), ZIA (Жуковский)
- Данные: номер рейса, авиакомпания, направление, время вылета/прилёта, статус
- Источник: Яндекс.Расписания API или открытые табло аэропортов
- Обновление: каждые 15 минут
- Хранить историю за 30 дней
### BR-3: Хранение
- Схема `fr24_ext` в существующей PostgreSQL БД
- Не влиять на схему `fr24` (RTL-SDR данные)
- Retention: треки FR24 — 30 дней, табло — 30 дней
---
## Технические требования
### Контейнер `fr24-external`
- Python 3.11-slim
- Отдельный сервис в docker-compose.yml
- Переменные окружения: FR24_API_KEY, YANDEX_RASP_API_KEY
- Два независимых воркера: fr24_worker и rasp_worker
- Логирование в /var/log/fr24/external.log
### Схема БД `fr24_ext`
```sql
-- Рейсы из FR24 API
fr24_ext.flights_ext (
flight_ext_id, source, fr24_id, icao24, callsign,
origin_iata, destination_iata, aircraft_type,
fetched_at, flight_date
)
-- Треки из FR24 API
fr24_ext.track_points_ext (
point_id, flight_ext_id, observed_at,
lat, lon, altitude_ft, speed_kt, heading_deg
)
-- Табло аэропортов
fr24_ext.schedule (
schedule_id, airport_iata, direction,
flight_number, airline_iata, aircraft_type,
scheduled_at, estimated_at, actual_at,
status, fetched_at
)
```
---
## ТЗ для Dev-агента
### Файлы для создания
```
tasks/flightradar24/ingest/external/
Dockerfile
main.py # точка входа, запускает оба воркера
fr24_worker.py # загрузка из FR24 API
rasp_worker.py # загрузка из Яндекс.Расписания
requirements.txt
tasks/flightradar24/db/init/003_schema_ext.sql # DDL схемы fr24_ext
```
### Обновить
- `tasks/flightradar24/compose/docker-compose.yml` — добавить сервис `external`
---
## Тест-кейсы
### TC-1: FR24 API подключение
- [ ] Контейнер стартует без ошибок
- [ ] FR24 API возвращает данные для bbox Москвы
- [ ] Треки сохраняются в `fr24_ext.track_points_ext`
### TC-2: Табло аэропортов
- [ ] Данные по SVO загружаются корректно
- [ ] Статусы рейсов обновляются при повторном запросе
- [ ] Дубликаты не создаются (upsert по flight_number + scheduled_at)
### TC-3: Изоляция схем
- [ ] Запросы к `fr24_ext` не влияют на `fr24`
- [ ] При падении external контейнера остальные работают
### TC-4: Retention
- [ ] Данные старше 30 дней удаляются автоматически
---
## Зависимости
- Существующая PostgreSQL (fr24-postgres)
- FR24_API_KEY в ~/.openclaw/.env
- YANDEX_RASP_API_KEY в ~/.openclaw/.env (или альтернативный источник табло)
## Оценка объёма
- ~500 рейсов/день над Москвой из FR24
- ~800 записей/день в табло (4 аэропорта × ~200 рейсов)
- Объём БД: ~50 MB/месяц