Skip to content

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 24 Sep 13:29
· 108 commits to main since this release

Первый релиз: шлюз АСУ ТП на Rust — замена Java-шлюза savushkin-dev/scada-gateway с теми же
внешними контрактами (controllers.yaml, топики и формат Kafka, статусы команд, env,
/actuator/health, метрики, схема БД), поэтому встаёт на его место без правок у монитора.

Добавлено

  • Опрос контроллеров, по задаче на контроллер с периодом по pollingRate:
    • OPC UA — подключение прямо к адресу из конфига (без discovery), чтение пачками по 500 узлов,
      пересоздание сессии при зависании;
    • Modbus TCP — FC03 блоками до 120 регистров; при исключении IllegalDataAddress блок делится
      пополам, пока не прочитается (план подстраивается под карту регистров ПЛК);
    • PAC driver-master в формате ptusa (баннер PAC accept, zlib, снимок t исполняется
      в Lua 5.1), запись через set_cmd с кодом результата.
  • Kafka: телеметрия scada.tags (ключ — путь канала, тело {value, quality, timestamp},
    timestamp — epoch-секунды с наносекундами), события, алармы, команды записи и результаты со
    статусами Java-шлюза; идемпотентный продюсер, который не блокирует опрос; команды читаются
    с конца топика, повторы отбрасываются.
  • PostgreSQL: схема, совместимая с Flyway-схемой Java-шлюза, и индексы для выборок;
    синхронизация тегов с controllers.yaml; журнал событий и (по флагу) история телеметрии
    пачками через очереди — база не на горячем пути.
  • HTTP: /actuator/health, /actuator/prometheus, REST журнала /api/* (всегда с LIMIT).
  • Кадры BAD при обрыве, события связи (одно сводное событие смены качества на цикл),
    heartbeat, остановка по SIGTERM, подкоманда healthcheck для контейнера.
  • Стенд в репозитории: PLC-симулятор (simulator/: OPC UA, Modbus, PAC, реплей архива
    BN1_MCA1), конфигурация станции (2517 каналов на трёх контроллерах), docker-compose.yml,
    эмулятор настоящего PAC (scripts/ptusa_emulator.sh).
  • Тесты: юнит (протоколы на фейковых серверах PAC и Modbus), сверка конфигов шлюза и
    симулятора, интеграционные против симулятора (каждый тег своим протоколом, запись),
    сквозной через Kafka и БД, обрыв и восстановление связи через TCP-прокси.
  • CI/CD: fmt, clippy, тесты, pytest симулятора, интеграционные (Kafka и Postgres —
    service-контейнеры), образ в GHCR, GitHub Release по тегу; cargo audit на каждый push и
    раз в неделю; Dependabot.

Безопасность

  • Lua-скрипт в ответе PAC исполняется в песочнице: без io/os/package и файлов, без загрузки
    байткода (load, loadstring, string.dump) и pcall; не больше 64 МБ памяти и 1 с на
    скрипт.
  • RUSTSEC-2023-0071 (rsa из async-opcua, исправленной версии нет) — в исключениях
    cargo audit: при политике OPC UA None RSA-расшифровки у клиента нет.

Отличия от Java-шлюза

  • Учитывается pollingRate (Java опрашивала раз в секунду при 2000 мс).
  • История telemetry по умолчанию выключена (было ~15 ГБ/сут), кадры BAD — включены.
  • Обрыв OPC UA обнаруживается за ~1 с (было 30 с); память 14–27 МБ (было 823 МБ),
    образ 137 МБ (было 646 МБ), старт до связи с контроллерами < 1 с (было 17,5 с).
  • Не перенесено: режим recordDevice/fields, JVM-метрики /actuator/metrics/*,
    политики безопасности OPC UA кроме None.

Образ: docker pull ghcr.io/euzireael/scada_rust:v0.1.0