# Конфигурация станции Станция настраивается **на портале**: страница станции на `sonik.space` → «Настройки станции». Приёмник, усиление, поправки частоты, поворотное устройство, запись IQ и уровни логов — всё там, с пояснением у каждого поля. В файле `.env` рядом с `docker-compose.yml` остаются только идентичность станции и то, что портал не трогает. Полный список переменных с типами и значениями по умолчанию — в [справочнике](environment_variables.md). ## Конфигурация с портала Как это работает: 1. Станция при старте и раз в минуту забирает с портала документ состояния, а по живому каналу (MQTT через `sonik.space`) получает его в момент сохранения формы. 2. Каждое сохранение формы — новое **поколение** конфигурации. Станция применяет его между проходами, без перезапуска контейнера: если проход идёт, применение откладывается до его конца. 3. Перед применением станция **открывает приёмник** с новыми параметрами. Не открылся (нет такого устройства, неверная частота дискретизации) — конфигурация отклоняется, станция остаётся на прежней, а причина видна в форме: «поколение N отклонено: приёмник driver=… не найден». 4. В блоке «На станции сейчас» форма показывает фактические значения станции. Кнопка «Заполнить с станции» переносит их в поля — так станция, настроенная через `.env`, переезжает на портал без перепечатывания. 5. Станция сама **находит подключённые приёмники** (на старте, раз в час в простое и по кнопке «Пересканировать») и сообщает порталу, что каждый умеет: входы, диапазон усиления, частоты дискретизации. В форме у каждого найденного приёмника есть кнопка «Использовать» — она подставляет строку устройства, вход и границы усиления в поля. Так станция настраивается без знания строк SoapySDR. 6. Кнопка **«Откалибровать усиление»** просит станцию в окне без проходов прогнать свип по усилению на частотах антенн станции и измерить шумовую полку. Портал рисует график и предлагает усиление, на котором полка поднялась на `SDR__NOISE_LIFT_DB` над минимумом, — кнопка «Применить рекомендованное» ставит его в поле общего усиления. Ручки калибровки — раздел `SDR` в [переменных окружения](environment_variables.md). Пока на портале ничего не сохранено, станция работает по `.env` как раньше. После первого сохранения портал главный: значения из `.env` для управляемых параметров становятся запасными — к ним станция возвращается, если параметр убрать из формы. Последний полученный документ станция хранит на постоянном томе (`PATHS__STATE_FILE`), поэтому стартует на нём и без связи с порталом. ## Обязательные параметры Заполнить нужно два: | Переменная | Что это | |---|---| | `STATION__TOKEN` | Токен авторизации станции. Выдаётся на портале в настройках станции. | | `STATION__ID` | Числовой идентификатор станции на портале. | Координаты и высота (`STATION__LATITUDE`, `STATION__LONGITUDE`, `STATION__ELEVATION`) необязательны: станция берёт их с портала — те, что указаны на странице станции. Если задать их в `.env`, они имеют приоритет и, как раньше, уходят на портал в запросе расписания. ```{warning} `STATION__TOKEN` — строка, и **пустое значение проходит валидацию**: в шаблоне `client/.env` стоит именно `STATION__TOKEN=`. Клиент с ним поднимется как ни в чём не бывало, но портал не примет ни один запрос — в логе будут ошибки авторизации, а не понятное сообщение о незаполненной настройке. ``` ```{warning} Токен станции — секрет. Не публикуйте `.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:** ```ini 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:** ```ini 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`. Задавать одновременно оба способа не нужно. (multi-sdr)= ### Несколько приёмников на одной станции `OBSERVATION__SOAPY_RX_DEVICE` принимает не только одну строку драйвера, но и список диапазонов вида `<МГц_от>-<МГц_до>:<строка драйвера>`, разделённых пробелами. Приёмник выбирается под каждый проход по частоте, которую прислал портал: ```ini OBSERVATION__SOAPY_RX_DEVICE=130-160:driver=rtl-sdr 400-470:driver=airspy,biastee=true ``` Если ни один диапазон не подходит под частоту прохода, наблюдение пропускается с `NoCompatibleRxDeviceError` в логе. ## Запись IQ Нужна для приёма METEOR 2-3 / 2-4 (их декодирует отдельный скрипт из потока IQ), а также если вы хотите сохранять сырой поток своих наблюдений: ```ini FLOWGRAPH__ENABLE_IQ_DUMP=True FLOWGRAPH__IQ_DUMP_FILENAME=/tmp/iq ``` ```{warning} `/tmp` в контейнере — tmpfs, то есть ОЗУ. Для регулярной записи IQ примонтируйте реальную директорию с диска и укажите её здесь, иначе станция упрётся в память. ``` Подробнее про переименование и сжатие дампов — в [Эксплуатации](operations.md#запись-iq). ## Логирование ```ini LOG__LEVEL=INFO # приложение LOG__SCRIPT_LEVEL=INFO # вывод скриптов из scripts/ LOG__FLOWGRAPH_LEVEL=INFO # вывод потокового графа GNU Radio SCHEDULER__LOG_LEVEL=WARNING # APScheduler, шумный на INFO ``` ## Проверка конфигурации Готовый `.env` проверяется просто — запуском: ```bash docker compose up -d && docker compose logs -f ``` Если в конфигурации ошибка, контейнер упадёт сразу, и в логе будет либо список недостающих `STATION__*`, либо ошибка валидации pydantic с именем поля.