# Шаг 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/месяц