Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5.7 KiB
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 |