121 lines
4.8 KiB
Markdown
121 lines
4.8 KiB
Markdown
# Шаг 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.5–57.0°N, 35.5–40.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/месяц
|