Конфигурация станции¶
Станция настраивается на портале: страница станции на sonik.space →
«Настройки станции». Приёмник, усиление, поправки частоты, поворотное
устройство, запись IQ и уровни логов — всё там, с пояснением у каждого поля.
В файле .env рядом с docker-compose.yml остаются только идентичность
станции и то, что портал не трогает. Полный список переменных с типами и
значениями по умолчанию — в справочнике.
Конфигурация с портала¶
Как это работает:
Станция при старте и раз в минуту забирает с портала документ состояния, а по живому каналу (MQTT через
sonik.space) получает его в момент сохранения формы.Каждое сохранение формы — новое поколение конфигурации. Станция применяет его между проходами, без перезапуска контейнера: если проход идёт, применение откладывается до его конца.
Перед применением станция открывает приёмник с новыми параметрами. Не открылся (нет такого устройства, неверная частота дискретизации) — конфигурация отклоняется, станция остаётся на прежней, а причина видна в форме: «поколение N отклонено: приёмник driver=… не найден».
В блоке «На станции сейчас» форма показывает фактические значения станции. Кнопка «Заполнить с станции» переносит их в поля — так станция, настроенная через
.env, переезжает на портал без перепечатывания.Станция сама находит подключённые приёмники (на старте, раз в час в простое и по кнопке «Пересканировать») и сообщает порталу, что каждый умеет: входы, диапазон усиления, частоты дискретизации. В форме у каждого найденного приёмника есть кнопка «Использовать» — она подставляет строку устройства, вход и границы усиления в поля. Так станция настраивается без знания строк SoapySDR.
Кнопка «Откалибровать усиление» просит станцию в окне без проходов прогнать свип по усилению на частотах антенн станции и измерить шумовую полку. Портал рисует график и предлагает усиление, на котором полка поднялась на
SDR__NOISE_LIFT_DBнад минимумом, — кнопка «Применить рекомендованное» ставит его в поле общего усиления. Ручки калибровки — разделSDRв переменных окружения.
Пока на портале ничего не сохранено, станция работает по .env как раньше.
После первого сохранения портал главный: значения из .env для управляемых
параметров становятся запасными — к ним станция возвращается, если параметр
убрать из формы.
Последний полученный документ станция хранит на постоянном томе
(PATHS__STATE_FILE), поэтому стартует на нём и без связи с порталом.
Обязательные параметры¶
Заполнить нужно два:
Переменная |
Что это |
|---|---|
|
Токен авторизации станции. Выдаётся на портале в настройках станции. |
|
Числовой идентификатор станции на портале. |
Координаты и высота (STATION__LATITUDE, STATION__LONGITUDE,
STATION__ELEVATION) необязательны: станция берёт их с портала — те, что
указаны на странице станции. Если задать их в .env, они имеют приоритет и,
как раньше, уходят на портал в запросе расписания.
Предупреждение
STATION__TOKEN — строка, и пустое значение проходит валидацию: в шаблоне
client/.env стоит именно STATION__TOKEN=. Клиент с ним поднимется как ни в
чём не бывало, но портал не примет ни один запрос — в логе будут ошибки
авторизации, а не понятное сообщение о незаполненной настройке.
Предупреждение
Токен станции — секрет. Не публикуйте .env и не прикладывайте его к issue
или в чат: по токену можно выдавать себя за вашу станцию.
Координаты используются для расчёта положения спутника и доплеровского сдвига. Ошибка в градусах вместо десятичных долей уводит расчёт на сотни километров — проверьте формат на странице станции.
Синтаксис .env¶
Файл читает pydantic-settings, поэтому есть неочевидные правила:
Разделитель уровней вложенности — двойное подчёркивание:
ANTENNA__ROTATOR__MODE,FLOWGRAPH__RX_SAMP_RATE.Пустое значение — это не «значение по умолчанию», а ошибка валидации для типизированного поля. Строка
FLOWGRAPH__PPM_ERROR=уронит клиент при старте. Если параметр не нужен — закомментируйте строку целиком (#) или удалите её.Строка без
=(напримерFLOWGRAPH__RX_BANDWIDTHв шаблоне) игнорируется — это способ оставить в файле напоминание о существовании параметра.Переменные окружения из
docker-compose.ymlимеют приоритет над.env.
Настройка SDR¶
Штатно — в форме на портале. Ниже те же параметры в виде переменных .env:
они действуют, пока на портале ничего не сохранено, и служат запасными
значениями после.
OBSERVATION__SOAPY_RX_DEVICE — строка драйвера SoapySDR.
Airspy:
OBSERVATION__SOAPY_RX_DEVICE=driver=airspy,biastee=true
FLOWGRAPH__RX_SAMP_RATE=3e6
FLOWGRAPH__GAIN_MODE=Settings Field
FLOWGRAPH__OTHER_SETTINGS=LNA=8,MIX=9,VGA=7
RTL-SDR:
OBSERVATION__SOAPY_RX_DEVICE=driver=rtl-sdr,biastee=true
FLOWGRAPH__RX_SAMP_RATE=2.048e6
FLOWGRAPH__RF_GAIN=25
Обратите внимание: у RTL-SDR усиление задаётся через FLOWGRAPH__RF_GAIN при
режиме GAIN_MODE=Overall (значение по умолчанию), а у Airspy — через
GAIN_MODE=Settings Field и покаскадные значения в OTHER_SETTINGS.
Задавать одновременно оба способа не нужно.
Несколько приёмников на одной станции¶
OBSERVATION__SOAPY_RX_DEVICE принимает не только одну строку драйвера, но и
список диапазонов вида <МГц_от>-<МГц_до>:<строка драйвера>, разделённых
пробелами. Приёмник выбирается под каждый проход по частоте, которую прислал
портал:
OBSERVATION__SOAPY_RX_DEVICE=130-160:driver=rtl-sdr 400-470:driver=airspy,biastee=true
Если ни один диапазон не подходит под частоту прохода, наблюдение
пропускается с NoCompatibleRxDeviceError в логе.
Запись IQ¶
Нужна для приёма METEOR 2-3 / 2-4 (их декодирует отдельный скрипт из потока IQ), а также если вы хотите сохранять сырой поток своих наблюдений:
FLOWGRAPH__ENABLE_IQ_DUMP=True
FLOWGRAPH__IQ_DUMP_FILENAME=/tmp/iq
Предупреждение
/tmp в контейнере — tmpfs, то есть ОЗУ. Для регулярной записи IQ примонтируйте
реальную директорию с диска и укажите её здесь, иначе станция упрётся в память.
Подробнее про переименование и сжатие дампов — в Эксплуатации.
Логирование¶
LOG__LEVEL=INFO # приложение
LOG__SCRIPT_LEVEL=INFO # вывод скриптов из scripts/
LOG__FLOWGRAPH_LEVEL=INFO # вывод потокового графа GNU Radio
SCHEDULER__LOG_LEVEL=WARNING # APScheduler, шумный на INFO
Проверка конфигурации¶
Готовый .env проверяется просто — запуском:
docker compose up -d && docker compose logs -f
Если в конфигурации ошибка, контейнер упадёт сразу, и в логе будет либо список
недостающих STATION__*, либо ошибка валидации pydantic с именем поля.