Эксплуатация

Запуск и остановка

Все команды выполняются из директории станции — там, где лежат docker-compose.yml и .env.

docker compose up -d      # запуск
docker compose down       # остановка
docker compose restart    # перезапуск

Обновление

docker compose pull
docker compose up -d

Тег latest-addons обновляется только на релизах. Чтобы закрепить конкретную версию, замените тег образа в docker-compose.yml на sonikspace/soniks-client:<версия> — версионные теги публикуются вместе с latest-addons.

Освободить диск от старых образов:

docker image prune -af

Определения спутников обновлять отдельно не нужно: контейнер забирает свежий sat-data bundle с портала при каждом старте и кэширует его на постоянном томе, см. Поддерживаемые спутники.

Логи

docker compose logs -f                  # всё разом
docker compose logs -f soniks-client    # только клиент
docker compose logs --since 1h soniks-client

Логи также пишутся в файл /var/lib/soniks-client/logs/client.log внутри контейнера — это именованный том, поэтому они переживают перезапуск и обновление образа. Ротация: 5 файлов по 5 МБ.

docker compose exec soniks-client tail -f /var/lib/soniks-client/logs/client.log

Уровни логирования настраиваются раздельно — приложение, скрипты, потоковый граф и планировщик, см. переменные LOG__*.

Что искать в логе

Нормальная работа выглядит так:

Строка

Значение

Сообщение о следующем наблюдении с временем

Расписание получено, проход запланирован.

Старт наблюдения, запуск satnogs-pre

Проход начался.

Строки от потокового графа

Идёт приём.

Отправка данных

Кадры уходят на портал прямо во время прохода.

Типовые проблемы:

Симптом

Причина

Клиент падает сразу после старта со списком STATION__*

Не заполнены обязательные параметры в .env.

Ошибка валидации pydantic с именем поля

Пустое значение у типизированной переменной — см. синтаксис .env.

NoCompatibleRxDeviceError

Частота прохода не попала ни в один диапазон OBSERVATION__SOAPY_RX_DEVICE.

Наблюдения планируются, но приёма нет

SDR не виден контейнеру: проверьте udev-правила и blacklist, см. Установку.

Файлы копятся в incomplete/

Портал недоступен или токен неверен. Повторная отправка идёт раз в 20 минут.

Здоровье станции

docker inspect --format '{{.State.Health.Status}}' soniks-client
docker compose exec soniks-client wget -qO- http://127.0.0.1:8080/healthz

Ответ показывает, жив ли планировщик, когда станция последний раз сверила расписание с порталом, сколько наблюдений ждёт в incomplete/, идёт ли проход и когда следующий.

unhealthy — это сигнал, а не автолечение: restart: unless-stopped перезапускает упавший контейнер, но не больной, Docker так не умеет. Первым делом смотреть логи. Станция, у которой обновился docker-compose.yml, но не обновился образ, тоже покажет unhealthy — старый образ /healthz не отдаёт; лечится docker compose pull.

Диагностика

Консоль контейнера:

docker compose exec -it soniks-client bash

Виден ли SDR:

docker compose exec soniks-client SoapySDRUtil --find

Если список пуст — проблема на уровне хоста (udev, blacklist, кабель), а не в конфигурации клиента.

Ручной прогон потокового графа без ожидания прохода — скрипт test-flowgraph.sh в контейнере. Это единственный способ проверить связку SDR + GNU Radio вне расписания.

Рабочие файлы наблюдений:

docker compose exec soniks-client ls -la \
  /var/lib/soniks-client/data/output /var/lib/soniks-client/data/incomplete

Каталог задан PATHS__BASE в compose. Это постоянный том, поэтому очередь incomplete/ с невыгруженными данными переживает перезапуск контейнера.

Запись IQ

Включается парой переменных, см. Конфигурацию. Дополнительно доступна постобработка дампа после прохода:

IQ_DUMP_RENAME=True       # переименовать в <файл>_<id>_<samplerate>.raw
IQ_DUMP_COMPRESS=True     # сжать zstd, исходник удалить

Скрипт переименования читает FLOWGRAPH__ENABLE_IQ_DUMP и FLOWGRAPH__IQ_DUMP_FILENAME — те же переменные, что включают саму запись, никаких дополнительных задавать не нужно.

Дополнительные декодеры

Все они отключены по умолчанию и включаются переменными уровня скриптов (см. справочник):

  • METEOR (METEOR_NORAD) — демодуляция METEOR 2-3 / 2-4 из файла IQ-дампа. Требует включённой записи IQ.

  • Обзор диапазона (BANDSCAN_ENABLE) — широкополосная запись между проходами. Нужен реальный примонтированный диск под BANDSCAN_DIR.

  • Реле GPIO (GPIO_ENABLE) — переключение МШУ и антенн через MCP2221 в зависимости от частоты прохода.

Что именно делает каждый — в Скриптах и декодерах.