Repository navigation
v0.1.0
Первый релиз: шлюз АСУ ТП на 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с кодом результата.
- OPC UA — подключение прямо к адресу из конфига (без discovery), чтение пачками по 500 узлов,
- 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