# Архитектура RTL-SDR ingest-контура для FR24 / noisemap

## 1. Назначение
Этот документ описывает контейнерную архитектуру локального ADS-B контура на RTL-SDR внутри одной VM в PVE.

Цель контура:
- принимать ADS-B поток в real time
- хранить сырьё с retention 3 дня
- автоматически догонять пропуски после сбоя
- хранить данные в PostgreSQL/PostGIS
- отдавать данные в noisemap / карту

## 2. Ограничения среды
- 1 VM в PVE
- USB RTL-SDR проброшен в VM
- ресурсы VM ограничены:
  - CPU: до 6 vCPU
  - RAM: 10–12 GB
  - SSD: 80–100 GB max
- развёртывание через Docker Compose

## 3. Логическая схема

```text
RTL-SDR USB
   ↓
capture
   ↓
raw_packets / captures (PostgreSQL)
   ↓
preprocess
   ↓
flights / tracks / track_points / processing_state
   ↓
noise_results
   ↓
noisemap / UI / API
```

## 4. Контейнеры

### 4.1 `postgres`
**Назначение:** хранение всех данных проекта.

Содержит:
- `captures`
- `raw_packets`
- `aircraft`
- `flights`
- `track_points`
- `tracks`
- `processing_state`
- `noise_results`

Требования:
- PostgreSQL
- PostGIS enabled
- volume для данных
- регулярные backup/restore процедуры

### 4.2 `capture`
**Назначение:** приём ADS-B потока с RTL-SDR.

Функции:
- чтение USB-устройства
- получение live-потока
- запись сырья в PostgreSQL
- фиксация `captures`
- маркировка границ сессий приёма

Требования:
- лёгкий CPU footprint
- устойчивость к временной потере downstream
- healthcheck
- автоматический рестарт

### 4.3 `preprocess`
**Назначение:** нормализация и догоняющая обработка.

Функции:
- обработка live-потока
- разбор `raw_packets`
- построение `aircraft`
- построение `flights`
- построение `tracks` и `track_points`
- обновление `processing_state`
- recovery с overlap при сбоях

Требования:
- инкрементальная обработка
- дедупликация на границах overlap
- ограничение по памяти
- возможность догонять пропуски автоматически

### 4.4 `api` / `viewer`
**Назначение:** отдача данных для noisemap.

Функции:
- чтение обработанных данных из PostgreSQL
- отдача треков, точек и шумовых результатов
- фильтрация по периоду и зоне
- API для карты/визуализации

Требования:
- лёгкие запросы
- минимальная логика в рантайме
- кэширование только при реальной необходимости

### 4.5 `monitoring` (optional)
**Назначение:** наблюдение за здоровьем контура.

Функции:
- healthcheck контейнеров
- мониторинг задержки обработки
- мониторинг заполнения диска
- мониторинг статуса RTL-SDR
- алерты при деградации

## 5. Docker Compose структура
Минимальный compose должен поднимать:
- `postgres`
- `capture`
- `preprocess`
- `api`

Опционально:
- `monitoring`

### Сетевое правило
- контейнеры общаются внутри одной docker network
- наружу публикуется только `api` и, если нужно, `monitoring`
- `postgres` не публикуется наружу

## 6. Данные и потоки

### 6.1 Live flow
1. RTL-SDR → `capture`
2. `capture` пишет сырьё в `raw_packets`
3. `preprocess` читает сырьё
4. `preprocess` обновляет `flights`, `tracks`, `track_points`
5. `api` отдаёт данные на карту

### 6.2 Recovery flow
1. `preprocess` обнаруживает отставание
2. ищет недостающий диапазон в `raw_packets`
3. добирает пропущенные записи
4. обрабатывает с небольшим overlap
5. обновляет `processing_state`

## 7. Автозапуск и устойчивость
- контейнеры стартуют после reboot VM
- каждый контейнер имеет healthcheck
- сбой одного контейнера не должен валить всю VM
- `capture` должен уметь переживать временный разрыв downstream
- `preprocess` должен уметь догонять запись после восстановления

## 8. Производительность
С учётом ограничений VM:
- минимизировать число контейнеров и лишних сервисов
- не тащить тяжёлые брокеры очередей без необходимости
- не строить много промежуточных копий данных
- хранить сырьё коротко и чистить автоматически
- тяжёлые вычисления держать инкрементальными

## 9. Что должно быть детализировано дальше
Следующие документы/итерации должны закрыть:
- схему БД и индексы
- backup/restore
- мониторинг и алерты
- контракт между `preprocess` и `api`
- точный формат `raw_packets`
- стратегию партиционирования

## 10. Связь с проектом
Этот документ — техническая основа для:
- `tasks/flightradar24/PROJECT.md`
- `tasks/flightradar24/docs/RTL-SDR_TZ.md`

