Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
64 lines
5.7 KiB
Markdown
64 lines
5.7 KiB
Markdown
# homelab-radio — Радио / SDR
|
|
|
|
Радио / SDR на Raspberry Pi (`radio.<domain>` → Pi:8090). HackRF слушает авиа- и прочие каналы через RTLSDR-Airband.
|
|
|
|
## Устройство (`sdr/`, на Pi — `/opt/pi/sdr/`)
|
|
|
|
| каталог | что | юнит |
|
|
|---|---|---|
|
|
| `radio/` | общий пакет (stdlib): все пути и env (`config.py`), каналы, записи и индексы дней, длительность mp3, json-хелперы | — |
|
|
| `web/` | страница радио: `server.py` (вход), `handler.py` (маршруты), `audio.py` (Range + прокси архива), `events.py` (SSE), `shares.py`, `sources.py`, `speaker.py`, `status.py`, `pages.py` собирает `templates/` + `static/` в самодостаточные страницы | `sdr-recordings` |
|
|
| `scanner/` | `gen_config.py` — `rtl_airband.conf` + `channels.json` из одной таблицы частот; `watchdog.sh` — перезапуск при мёртвом потоке HackRF | `sdr-scanner` (ExecStartPre), `sdr-scanner-watchdog` |
|
|
| `classify/` | голос/шум: `classify.py` (цикл), `audio.py` (DSP), `adsb.py` (снимок ADS-B к записи), `guard.py` (залипшие каналы) | `sdr-classify` |
|
|
| `discover/` | поиск активных частот через `hackrf_sweep` (останавливает сканер на время прохода) | `sdr-discover` |
|
|
| `archive/` | `archive.py` — старые дни на HDD сервера (rsync → сверка → удаление), `retention.sh` — чистка шума | `sdr-archive`, `sdr-retention` |
|
|
| `speaker/` | вывод новых голосовых записей на колонки Pi | `sdr-speaker` |
|
|
| `patches/` | локальный патч RTLSDR-Airband | — |
|
|
| `readsb/` | ADS-B (readsb) | — |
|
|
|
|
Ещё: `etc/` — `channels.json`/`rtl_airband.conf` и udev-правила (HackRF, хаб колонок), `systemd/` — юниты, `openwebrx/` — OpenWebRX
|
|
(compose + конфиги, без пользователей и настроек с координатами), `server/` — серверная часть: HTTP-архив записей
|
|
`homelab-sdr-archive` и блок Caddy (`radio.caddy`, хеш basic_auth вычищен).
|
|
Записи, состояние, ssh-ключ архива (`/etc/sdr-archive`) и пароль OpenWebRX — только на Pi.
|
|
|
|
## Откуда это
|
|
|
|
Копия живых файлов с сервера Homelab (и Pi), которую `publish-repos` (репо `homelab-infra`) снимает по манифесту и
|
|
заливает сюда. Источник истины для шаблонов — основной репозиторий на ноутбуке; это зеркало, чтобы ничего не потерялось.
|
|
|
|
**Чего здесь нет (и не должно быть):** секретов и личных настроек. Перед каждым коммитом скрипт заменяет известные
|
|
секретные значения на `@@SECRET@@`, хеши паролей на `@@BCRYPT_HASH@@`, внешние адреса на `@@PUBLIC_IP@@`/`@@VPN_HOST@@`,
|
|
домен на `example.com`, MAC и UUID на подставные, и не коммитит ничего, если находит ключи, токены или большие файлы.
|
|
Не публикуются: `site.json`, `devices.json`, `.env`, конфиги xray с ключами, `secrets/`, базы, данные и бэкапы `*.bak*`.
|
|
Поэтому файлы отсюда нельзя просто скопировать обратно на сервер — плейсхолдеры нужно заполнить.
|
|
|
|
## Что где
|
|
|
|
| в репозитории | на сервере |
|
|
|---|---|
|
|
| `sdr/` | `Pi: /opt/pi/sdr/` |
|
|
| `openwebrx/docker-compose.yml` | `Pi: /opt/pi/openwebrx/docker-compose.yml` |
|
|
| `openwebrx/etc/` | `Pi: /opt/pi/openwebrx/etc/` |
|
|
| `etc/sdr-scanner/` | `Pi: /etc/sdr-scanner/` |
|
|
| `etc/udev/90-hackrf-scanner-restart.rules` | `Pi: /etc/udev/rules.d/90-hackrf-scanner-restart.rules` |
|
|
| `etc/udev/70-speaker-hub.rules` | `Pi: /etc/udev/rules.d/70-speaker-hub.rules` |
|
|
| `systemd/sdr-archive.service` | `Pi: /etc/systemd/system/sdr-archive.service` |
|
|
| `systemd/sdr-archive.timer` | `Pi: /etc/systemd/system/sdr-archive.timer` |
|
|
| `systemd/sdr-classify.service` | `Pi: /etc/systemd/system/sdr-classify.service` |
|
|
| `systemd/sdr-discover.service` | `Pi: /etc/systemd/system/sdr-discover.service` |
|
|
| `systemd/sdr-discover.timer` | `Pi: /etc/systemd/system/sdr-discover.timer` |
|
|
| `systemd/sdr-live.service` | `Pi: /etc/systemd/system/sdr-live.service` |
|
|
| `systemd/sdr-recordings.service` | `Pi: /etc/systemd/system/sdr-recordings.service` |
|
|
| `systemd/sdr-recordings.service.d` | `Pi: /etc/systemd/system/sdr-recordings.service.d` |
|
|
| `systemd/sdr-retention.service` | `Pi: /etc/systemd/system/sdr-retention.service` |
|
|
| `systemd/sdr-retention.timer` | `Pi: /etc/systemd/system/sdr-retention.timer` |
|
|
| `systemd/sdr-scanner-watchdog.service` | `Pi: /etc/systemd/system/sdr-scanner-watchdog.service` |
|
|
| `systemd/sdr-scanner-watchdog.timer` | `Pi: /etc/systemd/system/sdr-scanner-watchdog.timer` |
|
|
| `systemd/sdr-scanner.service` | `Pi: /etc/systemd/system/sdr-scanner.service` |
|
|
| `systemd/sdr-scanner.service.d` | `Pi: /etc/systemd/system/sdr-scanner.service.d` |
|
|
| `systemd/sdr-speaker.service` | `Pi: /etc/systemd/system/sdr-speaker.service` |
|
|
| `systemd/sdr-speaker.service.d` | `Pi: /etc/systemd/system/sdr-speaker.service.d` |
|
|
| `server/sdr_archive_http.py` | `/opt/homelab/sdr-archive/sdr_archive_http.py` |
|
|
| `server/homelab-sdr-archive.service` | `/etc/systemd/system/homelab-sdr-archive.service` |
|
|
| `server/radio.caddy` | `блок radio.home.<domain> в Caddyfile` |
|