Конфигурация станции

Станция настраивается на портале: страница станции на sonik.space → «Настройки станции». Приёмник, усиление, поправки частоты, поворотное устройство, запись IQ и уровни логов — всё там, с пояснением у каждого поля. В файле .env рядом с docker-compose.yml остаются только идентичность станции и то, что портал не трогает. Полный список переменных с типами и значениями по умолчанию — в справочнике.

Конфигурация с портала

Как это работает:

  1. Станция при старте и раз в минуту забирает с портала документ состояния, а по живому каналу (MQTT через sonik.space) получает его в момент сохранения формы.

  2. Каждое сохранение формы — новое поколение конфигурации. Станция применяет его между проходами, без перезапуска контейнера: если проход идёт, применение откладывается до его конца.

  3. Перед применением станция открывает приёмник с новыми параметрами. Не открылся (нет такого устройства, неверная частота дискретизации) — конфигурация отклоняется, станция остаётся на прежней, а причина видна в форме: «поколение N отклонено: приёмник driver=… не найден».

  4. В блоке «На станции сейчас» форма показывает фактические значения станции. Кнопка «Заполнить с станции» переносит их в поля — так станция, настроенная через .env, переезжает на портал без перепечатывания.

  5. Станция сама находит подключённые приёмники (на старте, раз в час в простое и по кнопке «Пересканировать») и сообщает порталу, что каждый умеет: входы, диапазон усиления, частоты дискретизации. В форме у каждого найденного приёмника есть кнопка «Использовать» — она подставляет строку устройства, вход и границы усиления в поля. Так станция настраивается без знания строк SoapySDR.

  6. Кнопка «Откалибровать усиление» просит станцию в окне без проходов прогнать свип по усилению на частотах антенн станции и измерить шумовую полку. Портал рисует график и предлагает усиление, на котором полка поднялась на SDR__NOISE_LIFT_DB над минимумом, — кнопка «Применить рекомендованное» ставит его в поле общего усиления. Ручки калибровки — раздел SDR в переменных окружения.

Пока на портале ничего не сохранено, станция работает по .env как раньше. После первого сохранения портал главный: значения из .env для управляемых параметров становятся запасными — к ним станция возвращается, если параметр убрать из формы.

Последний полученный документ станция хранит на постоянном томе (PATHS__STATE_FILE), поэтому стартует на нём и без связи с порталом.

Обязательные параметры

Заполнить нужно два:

Переменная

Что это

STATION__TOKEN

Токен авторизации станции. Выдаётся на портале в настройках станции.

STATION__ID

Числовой идентификатор станции на портале.

Координаты и высота (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 с именем поля.