# DroneDetector v2

Отдельный проектный контур (без миграции legacy), в котором:
- SDR-сканеры работают **на хосте** под `systemd`;
- `server_to_master` и `NN_server` работают в **Docker Compose**;
- весь runtime-конфиг хранится в **одном корневом `.env`**.

## 1. Быстрый старт

### Prerequisites
- Ubuntu/Debian (apt)
- NVIDIA GPU + установленный драйвер (`nvidia-smi` должен работать)
- Интернет для установки пакетов и сборки Docker-образов
- HackRF + GNU Radio стек (будет установлен через `install_all.sh`)

### Установка и запуск
```bash
cd /home/sibscience-4/from_ssh/DroneDetector
chmod +x install_all.sh
./install_all.sh
```

`install_all.sh`:
1. выполняет preflight;
2. ставит host non-python зависимости SDR;
3. настраивает Docker + NVIDIA runtime;
4. поднимает compose сервисы;
5. устанавливает/перезапускает `systemd` unit'ы;
6. проверяет статус, при ошибке печатает логи.

## 2. Матрица сервисов

### Host / systemd (SDR)
- `dronedetector-sdr-433.service` -> `src/main_433.py`
- `dronedetector-sdr-750.service` -> `src/main_750.py`
- `dronedetector-sdr-868.service` -> `src/main_868.py`
- `dronedetector-sdr-3300.service` -> `src/main_3300.py`
- `dronedetector-sdr-4500.service` -> `src/main_4500.py`
- `dronedetector-sdr-5200.service` -> `src/main_5200.py`
- `dronedetector-sdr-5800.service` -> `src/main_5800.py`
- `dronedetector-sdr-915.service` -> `orange_scripts/main_915.py`
- `dronedetector-sdr-1200.service` -> `orange_scripts/main_1200.py`
- `dronedetector-sdr-2400.service` -> `orange_scripts/main_2400.py`

### Docker Compose
- `dronedetector-server-to-master` -> `src/server_to_master.py`
- `dronedetector-nn-server` -> `NN_server/server.py`

Compose unit:
- `dronedetector-compose.service`

## 3. Конфигурация

Единственный источник runtime-конфига: `./.env`.

Все entrypoint'ы загружают root `.env` через `common/runtime.py` и валидируют обязательные переменные. При ошибке сервис падает сразу с понятным сообщением.

## 4. API (без изменения контрактов)

- NN_server: `POST /receive_data`
- server_to_master: `POST /process_data`

Форматы payload/ответов сохранены в текущей логике сервисов.

## 5. Диагностика

### systemd
```bash
systemctl status dronedetector-sdr-*.service
journalctl -u dronedetector-sdr-868.service -n 200 --no-pager
systemctl status dronedetector-compose.service
journalctl -u dronedetector-compose.service -n 200 --no-pager
```

### docker compose
```bash
docker compose -f deploy/docker/docker-compose.yml ps
docker compose -f deploy/docker/docker-compose.yml logs dronedetector-server-to-master
docker compose -f deploy/docker/docker-compose.yml logs dronedetector-nn-server
```

## 6. Host non-python dependencies

Устанавливаются `install_all.sh`:
- GNU Radio
- gr-osmosdr
- libhackrf/hackrf-tools (`hackrf` package)
- libusb
- udev-related runtime via distro packages

SDR precheck перед каждым unit запуском:
- наличие `hackrf_info`
- наличие `gnuradio-config-info`
- импорт `osmosdr`
- детект устройства HackRF

## 7. install_all.sh: параметры и поведение

Скрипт idempotent: повторный запуск допустим.

Что делает:
- preflight (OS, диск, `.env`, GPU)
- host deps
- `.venv-sdr` c `--system-site-packages`
- Docker Engine (если отсутствует)
- NVIDIA Container Toolkit
- `docker compose up -d --build`
- установка unit'ов в `/etc/systemd/system`
- verify + авто-логи при ошибке

## 8. Типовые ошибки `.env`

Примеры fail-fast сообщений:
- `[src/server_to_master.py] invalid .env configuration: ...`
- `[NN_server/server.py] no NN_* model entries configured`
- `[orange_scripts/compose_send_data_915.py] invalid .env configuration: ...`

Частые причины:
- пустое обязательное поле (`SERVER_PORT`, `lochost`, `hack_868` и т.д.)
- неверный тип (`SERVER_PORT=abc`)
- неправильный serial HackRF (не найден среди `lsusb -v -d 1d50:6089 | grep iSerial`)

## 9. Ручная приемка

1. `./install_all.sh` выполняется до конца.
2. `docker compose -f deploy/docker/docker-compose.yml up -d` поднимает оба контейнера.
3. Все `dronedetector-sdr-*` имеют `active (running)`.
4. Тестовый POST в `NN_server /receive_data` доходит до `server_to_master /process_data`.
5. Контур работает минимум 1 минуту без падений.


## 10. Ручной запуск сервисов (без пересборки)

### Docker-серверы
Запуск без пересборки:
```bash
docker compose -f deploy/docker/docker-compose.yml up -d
```

Пересборка только при изменении кода/зависимостей контейнеров:
```bash
docker compose -f deploy/docker/docker-compose.yml up -d --build
```

Остановка Docker-серверов:
```bash
docker compose -f deploy/docker/docker-compose.yml down
```

### Все SDR-сервисы (systemd)

```bash
sudo systemctl status dronedetector-sdr-433.service 
sudo systemctl status dronedetector-sdr-750.service  
sudo systemctl status dronedetector-sdr-868.service 
sudo systemctl status dronedetector-sdr-3300.service 
sudo systemctl status dronedetector-sdr-4500.service
sudo systemctl status dronedetector-sdr-5200.service  
sudo systemctl status dronedetector-sdr-5800.service 
sudo systemctl status dronedetector-sdr-915.service
sudo systemctl status dronedetector-sdr-1500.service
sudo systemctl status dronedetector-sdr-1200.service
sudo systemctl status dronedetector-sdr-2400.service
```

```bash
sudo systemctl stop dronedetector-sdr-433.service 
sudo systemctl stop dronedetector-sdr-750.service   
sudo systemctl stop dronedetector-sdr-3300.service 
sudo systemctl stop dronedetector-sdr-4500.service
sudo systemctl stop dronedetector-sdr-5200.service  
sudo systemctl stop dronedetector-sdr-5800.service 
sudo systemctl stop dronedetector-sdr-1200.service
sudo systemctl stop dronedetector-sdr-2400.service
sudo systemctl stop dronedetector-sdr-1500.service
sudo systemctl stop dronedetector-sdr-915.service
```




Проверка статуса всех SDR unitов:
```bash
sudo systemctl status dronedetector-sdr-*.service --no-pager
```

### Просмотр логов SDR
``` bash
# 50 последних 
sudo journalctl -u dronedetector-sdr-5800.service -n 50 --no-pager

# в реальном времени 
sudo journalctl -u dronedetector-sdr-5800.service -f

# c последней перезагрузки сервиса 
since="$(systemctl show -p ActiveEnterTimestamp --value dronedetector-sdr-5800.service)"
sudo journalctl -u dronedetector-sdr-5800.service --since "$since" --no-pager
```

### Просмотр логов от server-to-master   
``` bash
docker compose -f deploy/docker/docker-compose.yml logs --timestamps dronedetector-server-to-master | tail -n 50
```

### Прошивка хаков 
``` bash 
sudo hackrf_spiflash -w hackrf_one_usb.bin
```

### Wide_read_energy
``` bash
./.venv-sdr/bin/python read_energy_wide.py \
    --serial 0000000000000000a18c63dc2a83b813 \
    --sample-rate 20000000 \
    --base 6000 \
    --roof 5700 \
    --step 20
```

### Проверка тревоги 
``` bash
curl -X POST 'http://127.0.0.1:5010/process_data' \
    -H 'Content-Type: application/json' \
    -d '{"freq":"1200","amplitude":9}'
```

### Read_energy
``` bash 
.venv-sdr/bin/python read_energy.py 
```