Перейти к содержанию

Раздел 2. Описание операций технологического процесса

2.1. Окружения и развёртывание

Ландшафт BOX5-DIT-MGSN включает три контура: DEV, TEST и PROD. DEV используется для разработки и первичной проверки изменений исполнителем, TEST - для проверки поставки перед переносом в промышленную эксплуатацию, PROD - для рабочего контура заказчика. Контуры должны иметь согласованный состав доменов, образов и конфигурационных параметров, влияющих на бизнес-логику. Различия ограничиваются назначением контура, количеством подключённых камер, топологией узлов и способом интеграции с ПК-КОТ: в TEST используется сокращённый набор камер и заглушка интеграции, в PROD - полный промышленный набор камер и штатное подключение к ПК-КОТ.

Подробный состав подсистем приведён в приложениях С2 и С4. В настоящем разделе фиксируется операционный порядок развёртывания и обслуживания окружений.

Единая deployment-схема с размещением узлов, доменов, контейнерных групп, хранилищ, брокеров сообщений, песочницы Node-RED и внешних подключений приведена в И3, подразделе 1.2. В И2 эта схема не дублируется: технологические операции ниже выполняются относительно указанной в И3 схемы размещения. Физическая сетевая топология площадки заказчика, включая VLAN, маршрутизацию, межсетевые экраны и внешние балансировщики, находится в зоне ответственности заказчика и в настоящем документе намеренно не описывается.

flowchart LR distr["Дистрибутив
Docker-образы, CODE, конфигурация"] dev["DEV
10.114.47.6
разработка, 1 машина"] test["TEST
10.114.47.2
1 мастер + 2 вычислительные ноды"] prod["PROD
10.97.145.147
1 мастер + 11 вычислительных нод"] pkkotStub["Заглушка ПК-КОТ"] pkkot["ПК-КОТ"] distr --> dev dev -->|"перенос поставки"| test test -->|"проверка доработок и регресс"| prod pkkotStub -.-> test pkkot --> prod

Исходный Mermaid-код схемы: И2-MER-002. 2.1. Окружения и развёртывание.

Окружение Назначение Состав компонентов Отличия от PROD Ограничения
DEV Разработка и первичная проверка изменений исполнителем до подготовки поставки на TEST. Одна машина 10.114.47.6; роли db, rest, inference и служебные функции могут совмещаться на одном сервере. Не является промышленным профилем; используется для разработки и первичной проверки, а не для проверки заказчиком. Промышленные данные не используются; результаты DEV переносятся дальше только в составе подготовленной поставки.
TEST Проверка доработок разработчика, регрессионная проверка сценариев, предварительная проверка обновлений конфигурации и моделей перед переносом в PROD. Docker Swarm: 1 мастер-нода и 2 вычислительные ноды; мастер-нода доступна по 10.114.47.2; домены решения соответствуют PROD: ui-rest, statistics, inference, extended-inference, severstal, data-storage, kafka-domain, elk-log, node-red-sandbox; PostgreSQL, ClickHouse, Redis, MinIO/DTS; Guardant-лицензирование; NRI/медиасерверы. Сокращённое количество камер; вместо промышленной интеграции с ПК-КОТ используется заглушка или локальный тестовый источник данных. Не является источником промышленных данных; результаты проверок не переносятся в PROD без отдельного решения администратора; тестовые файлы, видео и ключи не должны смешиваться с PROD-данными.
PROD Промышленная эксплуатация BOX5-DIT-MGSN, обработка полного набора камер, передача статусов и событий в ПК-КОТ. Docker Swarm: 1 мастер-нода ctd-sova-cpu02.severstal.severstalgroup.com, адрес 10.97.145.147, и 11 вычислительных GPU-нод; полный состав доменов решения, штатные интеграции с ПК-КОТ, CSVN/VMS, АСУ ТП, хранилищами и сервисами отчётности; распределение сервисов по ролям db, rest, inference, а для ноды песочницы - nr_sandbox, flows_manager, events_validator. Базовое окружение, относительно которого DEV и TEST считаются подготовительными контурами. Изменения выполняются только после проверки на TEST; требуется активная лицензия Guardant; регламентные операции выполняются с учётом производственного окна и резервного копирования.

2.2. Процедура развёртывания

Изменения проходят последовательность DEV -> TEST -> PROD. Развёртывание PROD выполняется после успешной проверки той же версии дистрибутива на TEST. Для TEST применяется та же последовательность, но с тестовым набором камер и параметрами заглушки ПК-КОТ. Целевой TEST-контур разворачивается как кластер из одной мастер-ноды и двух вычислительных нод, PROD - как кластер из одной мастер-ноды и 11 вычислительных GPU-нод.

2.2.1. Проверка предварительных условий

До установки дистрибутива администратор проверяет состав системного ПО и состояние узлов.

Компонент Минимальная версия Где требуется Контроль
Ubuntu Server или Astra Linux Ubuntu 22.04 / Astra 1.7 Все целевые серверы cat /etc/os-release
Docker Engine 24 Все целевые серверы docker version
Docker Compose 2.64 Все целевые серверы docker compose version или docker-compose version
NVIDIA driver 560 Вычислительные ноды с GPU nvidia-smi
NVIDIA Container Toolkit Совместимая с установленным Docker Вычислительные ноды с GPU cat /etc/docker/daemon.json
pyyaml 6.0.1 Мастер-нода python3 -c "import yaml; print(yaml.__version__)"

На всех узлах должны быть установлены утилиты: ca-certificates, curl, gnupg, tmux, vim, nano, autossh, htop, tcpdump, lsb-release, nload, nmap, ffmpeg, ncdu, jq, dnsutils, net-tools, python3.

На вычислительных нодах с GPU файл /etc/docker/daemon.json должен задавать NVIDIA runtime как runtime по умолчанию:

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    },
    "live-restore": false,
    "storage-driver": "overlay2",
    "log-opts": {
        "max-file": "10",
        "max-size": "100m"
    }
}

После установки драйверов на вычислительных нодах отключается переход в сон и гибернацию:

sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

На мастер-ноде и вычислительных нодах с GPU должен быть отключён swap, если это требуется эксплуатационным профилем площадки. Для узлов, где запускаются медиасервер и инференс, также должны быть подготовлены tmpfs-каталоги, используемые межпроцессным обменом и HLS-данными:

tmpfs   /mnt/ram0    tmpfs   rw,nodev,nosuid,size=1G           0  0
tmpfs   /tsm_tmpfs   tmpfs   rw,nodev,nosuid,size=16G,mode=0777 0  0

2.2.2. Подготовка дистрибутива и каталогов данных

На исходном сервере подготовить архив Docker-образов:

docker save $(docker images --format '{{.Repository}}:{{.Tag}}') \
  | gzip > /data/update/dockerimg.tgz

Если команда завершается с ошибкой из-за нетегированных образов, перед повторной подготовкой архива удалить неиспользуемые Docker-объекты командой docker system prune по согласованию с ответственным администратором.

Каталог с основными конфигурационными файлами переносится на мастер-ноду:

sudo rsync -avzh /home/esik/CODE esik@<master_node>:/home/esik/

Архив dockerimg.tgz должен быть перенесён на все ноды кластера и загружен:

docker load -i /data/update/dockerimg.tgz

Значение COMPOSE_DATA_SWARM_PATH в файле ~/CODE/box3/utils/swarm/swarm.sh должно совпадать на всех целевых серверах. Базовое значение для поставки:

COMPOSE_DATA_SWARM_PATH="/data/compose-data2"

На каждой ноде кластера создать каталоги данных приложения:

#!/usr/bin/env bash

COMPOSE_DATA_SWARM_PATH="/data/compose-data2"

mkdir -p "${COMPOSE_DATA_SWARM_PATH}/backups/st-access/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/backups/st-auth/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/asset-storage/assets/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/inference/logs/events-storage/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/inference/logs/mediaserver/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/inference/logs/nri_inference/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/inference/logs/report-video-extractor/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/inference/monitoring-redis-data/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/inference/video-events-cropped/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/inference/video-storage/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/inference/events-storage/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/inference/inf-load-balancer/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/inference/load-balancer-redis-data/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/inference/inference_ipc/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/inference_ipc/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/converted/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/models-registry/models/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/lite-scenario-storage/lite-scenarios/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/scenario-storage/scenarios/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/report-pdf-xlsx-generator/reports/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/translations-store/translations/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/kafka3.4/kafka-data/config/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/kafka3.4/kafka-data/data/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/data-storage/minio_data/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/vc_videos/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/facecloud/person-storage/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/severstal/archive-videos/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/severstal/pgdata-asset-storage/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/severstal/pgdata-asutp/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/severstal/pgdata-lite-scenario-storage/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/severstal/pgdata-models-registry/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/severstal/pgdata-postgres-pk-kot/pgdata/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/severstal/pgdata-scenario-storage/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/severstal/pgdata-severstal-integration/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/severstal/pgdata-translations-store/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/statistics/event-ex-clickhouse-data/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/statistics/event-statistic-clickhouse-data/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/statistics/event-storage-click-house-data/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/statistics/pgdata-camera-storage/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/statistics/pgdata-comments/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/statistics/pgdata-event-storage/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/statistics/pgdata-object-visit-zone-counter/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/statistics/pgdata-report-email/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/statistics/pgdata-report-pdf-xlsx-generator/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/statistics/st-access-postgres/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/statistics/st-audit/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/statistics/st-auth-postgres/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/statistics/st-virt-cam-video-upload/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/ui-rest/logs/nginx"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/ui-rest/react/build/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/elk-log/grafana/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/elk-log/loki/"
mkdir -p "${COMPOSE_DATA_SWARM_PATH}/elk-log/prometheus/data/"

2.2.3. Настройка песочницы и моделей

На вычислительную ноду, где разворачивается песочница Node-RED, перенести данные песочницы:

rsync -avzh /data/sandbox-compose-data esik@<gpu_node>:/data/

На все вычислительные ноды перенести каталог моделей:

rsync -avzh /data/models esik@<gpu_node>:/data/
sudo chown -R 1000:1000 /data/models
sudo chown -R 1000:1000 /data/sandbox-compose-data

В каталоге ~/CODE/node-red-sandbox задать пути к данным, моделям и ассетам:

cd ~/CODE/node-red-sandbox/
sed -i 's|^COMPOSE_DATA_DIR=.*|COMPOSE_DATA_DIR=/data/sandbox-compose-data/|' .env
sed -i 's|^MLFLOW_MODELS_PATH=.*|MLFLOW_MODELS_PATH=/data/models|' .env
sed -i 's|^NRI_ASSETS_HOST_DIR=.*|NRI_ASSETS_HOST_DIR=/data/sandbox-compose-data/nri-assets|' .env

Архив sandbox-compose-data.tgz распаковать в каталог COMPOSE_DATA_DIR, а архив nri-models.tgz - в каталог MLFLOW_MODELS_PATH.

Если порт песочницы отличается от 80, задать NGINX_HOST_PORT и изменить порт в конфигурации nginx песочницы. Порт песочницы должен отличаться от порта web-интерфейса BOX5-DIT-MGSN:

cd ~/CODE/node-red-sandbox/
sed -i 's/^NGINX_HOST_PORT=.*/NGINX_HOST_PORT=<PORT>/' .env
sed -i 's/listen 80;/listen <PORT>;/' nginx/nginx.conf

В конфигурации песочницы задать адрес, по которому пользовательский интерфейс обращается к Node-RED:

cd ~/CODE/box3/node-red-sandbox/
sed -i 's/^REACT_APP_HOST_NAME=.*/REACT_APP_HOST_NAME=<IP>:<PORT>/' .env

Для интеграции песочницы с BOX5-DIT-MGSN задать URL загрузки сценариев на мастер-ноду:

cd ~/CODE/box3/node-red-sandbox/
sed -i 's|^BOX_POST_SCENARIOS_URL=.*|BOX_POST_SCENARIOS_URL="http://<master_ip>/api/severstal/severstal-lite-scenario-storage/upload-scenarios/"|' .env

В файле ~/CODE/box3/ui-rest/ui-config/config.json указать адрес iframe песочницы:

"SCENARIOS_FRAME_URL": "http://<sandbox_ip>:<PORT>/"

После изменения адресов проверить оставшиеся упоминания старого IP:

grep -inR <old_ip> ~/CODE/box3

2.2.4. Лицензия и параметры инференса

На мастер-ноде установить сервис лицензирования Guardant:

cd grdcontrol-3.25/
sudo ./install.sh
sudo systemctl restart grdcontrol.service

Серийный номер лицензии и тип активации фиксируются в корневом файле ~/CODE/box3/.env. Если поставка домена inference использует отдельный файл ~/CODE/box3/inference/.env, значения должны быть синхронизированы и в нём:

LICENSE_KEY_SERIAL=<key>
ACTIVATION_TYPE=offline

На вычислительных нодах количество потоков инференса должно соответствовать количеству GPU. Для сервера с восемью GPU:

LIST_GPU='[0,1,2,3,4,5,6,7]'
INFERENCE_COUNT=8

В закрытом контуре используется оффлайн-активация через HTTP API контейнера guardant-control-center на порту 19191.

  1. Остановить кластер:
cd ~/CODE/box3/
./utils/swarm/swarm.sh stop
  1. Перезапустить runtime лицензирования с очисткой локального состояния:
sudo systemctl stop grdcontrol.service
sudo rm -Rvf /var/guardant/
sudo systemctl start grdcontrol.service
  1. Запустить только сервис лицензирования:
cd ~/CODE/box3/inference
docker network create my-network-name-inference
docker compose up -d inf-guardant-control-center
  1. Сформировать файл запроса активации:
mkdir -p /tmp/activation
curl http://localhost:19191/get_request \
  | jq -r '.request' > /tmp/activation/request.request
  1. Передать request.request для оффлайн-активации. Полученный файл request.license положить в каталог /tmp/activation.
  2. Загрузить ответ активации:
jq -Rs '{response: .}' /tmp/activation/request.license \
  | curl -X POST http://localhost:19191/set_response \
      --header "Content-Type:application/json" \
      --data @-
  1. Проверить успешную активацию:
docker logs inf-guardant-control-center | grep Activated
  1. Остановить временно запущенный сервис лицензирования и удалить временную сеть:
cd ~/CODE/box3/inference
docker compose down
docker network rm my-network-name-inference

2.2.5. Инициализация кластера и назначение ролей

На мастер-ноде инициализировать Docker Swarm:

docker swarm init --advertise-addr <IP-адрес_мастер-ноды>

Если у сервера один подходящий сетевой адрес, допускается выполнить docker swarm init без явного --advertise-addr.

Команду docker swarm join, выведенную Docker, выполнить на каждой вычислительной ноде. После подключения проверить состав кластера:

docker node ls

Для размещения сервисов узлам назначаются роли через Docker labels.

Роль Назначение Количество в кластере
db Размещение баз данных и stateful-хранилищ 1
rest Размещение backend-сервисов и gateway-компонентов 1
inference Размещение медиасерверов, NRI-инференса и GPU-сервисов 1 или более
nr_sandbox Размещение песочницы Node-RED 1 вычислительная нода
flows_manager Распределение моделей по вычислительным нодам 1 вычислительная нода с песочницей
events_validator Валидация событий песочницы 1 вычислительная нода с песочницей

Назначение роли выполняется командой:

docker node update --label-add <роль>=true <node_id>

Распределение ролей:

Тип сервера db rest inference nr_sandbox flows_manager events_validator
Master server с GPU + + + При размещении песочницы При размещении песочницы При размещении песочницы
Master server без GPU + +
Вычислительная нода с песочницей + + + +
Остальные вычислительные ноды с GPU +

Примеры назначения ролей:

docker node update --label-add db=true <master_node_id>
docker node update --label-add rest=true <master_node_id>
docker node update --label-add inference=true <gpu_node_id>
docker node update --label-add nr_sandbox=true <sandbox_node_id>
docker node update --label-add flows_manager=true <sandbox_node_id>
docker node update --label-add events_validator=true <sandbox_node_id>

Проверка назначенных ролей:

docker node ls -q | xargs docker node inspect \
  -f '{{ .ID }} [{{ .Description.Hostname }}]: {{ .Spec.Labels }}'

2.2.6. Запуск, остановка и контроль развёртывания

Основные команды выполняются на мастер-ноде из каталога ~/CODE/box3.

Действие Команда
Запуск кластера cd ~/CODE/box3 && ./utils/swarm/swarm.sh start
Остановка кластера cd ~/CODE/box3 && ./utils/swarm/swarm.sh stop
Перезапуск кластера cd ~/CODE/box3 && ./utils/swarm/swarm.sh stop && ./utils/swarm/swarm.sh start
Просмотр нод docker node ls
Просмотр сервисов docker service ls
Просмотр задач на ноде docker node ps --no-trunc <node_hostname>

Ожидаемый результат после запуска: все ноды имеют статус Ready/Active, а в docker service ls для штатных сервисов значение REPLICAS соответствует формату x/x. Для DEV, где роли совмещены на одной машине, аналогичная проверка выполняется командами docker compose ls, docker ps и docker logs по соответствующим доменам.

Песочница Node-RED запускается на выбранной вычислительной ноде:

cd ~/CODE/node-red-sandbox
docker compose up -d

После запуска песочницы выполнить конвертацию всех моделей внутри контейнера NRI:

docker exec -it $(docker ps | grep nr-sbx-nri | awk '{print $1}' | head -n1) bash
python3 -m nri.mlflow.tools.convert_all_models --models_filter_path /models/sel-models.csv
exit

Затем на одной из вычислительных нод зайти в контейнер инференса и выгрузить модели в хранилище моделей:

docker exec -it $(docker ps | grep inf-nri-inference | awk '{print $1}' | head -n1) bash
python -m nri.mlflow.tools.push_models_to_vlflow --models_filter_path /models/sel-models.csv
exit

Если после конвертации требуется распространить обновлённые модели вручную, на целевых вычислительных нодах предварительно сохранить старую директорию, а затем скопировать обновлённый /data/models с ноды-источника и назначить права:

sudo mv /data/models /data/models.old
rsync -a /data/models username@swarm-nodeX:/data/
sudo chown -R 1000:1000 /data/models

2.2.7. Настройка автозапуска

На мастер-ноде создать файл /etc/systemd/system/box-restart.service:

[Unit]
Description=Service for restarting box after boot
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash -c "mkdir -p /tmp/inference_ipc && ./utils/swarm/swarm.sh stop && ./utils/swarm/swarm.sh start"
User=<user>
WorkingDirectory=/home/<user>/CODE/box3

[Install]
WantedBy=multi-user.target

На вычислительной ноде создать файл /etc/systemd/system/box-restart.service:

[Unit]
Description=Service for restarting box after boot
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=mkdir -p /tmp/inference_ipc

[Install]
WantedBy=multi-user.target

После создания файла включить службу:

sudo systemctl enable box-restart.service

2.3. Файловый обмен (процедурная часть)

Подраздел описывает процедурный файловый обмен: передачу дистрибутивов, конфигурационных файлов, файлов лицензии, загружаемых видеозаписей, отчётов и служебных артефактов. Форматы API, схемы внешних систем и состав таблиц описываются в документах ПА и В7; здесь фиксируются действия администратора.

2.3.1. Способы передачи файлов

Тип файлов Способ передачи Получатель/хранилище Примечание
Дистрибутив решения, dockerimg.tgz, каталог CODE SSH/SFTP, scp или rsync на все ноды для образов и на мастер-ноду для CODE Рабочий каталог администратора, затем /home/<user>/CODE; архив образов - в согласованный каталог загрузки на каждой ноде Перед обработкой проверяются размер, контрольная сумма и принадлежность дистрибутива нужному окружению.
Запрос и ответ оффлайн-активации Guardant SSH/SFTP; формирование через curl к localhost:19191 /tmp/activation на время активации, затем защищённый архив администратора Файлы лицензии не размещаются в Git и не передаются через общие каталоги.
Данные песочницы и модели, sandbox-compose-data.tgz, nri-models.tgz, /data/models rsync на вычислительные ноды; распаковка в каталоги, заданные в .env песочницы /data/sandbox-compose-data, /data/models, volume песочницы Node-RED После передачи обязательно назначить владельца 1000:1000 и проверить пути COMPOSE_DATA_DIR, MLFLOW_MODELS_PATH, NRI_ASSETS_HOST_DIR.
Загруженные видеозаписи и виртуальные камеры Web UI или HTTP multipart upload через gateway st-virt-cam-video-upload, st-camera-storage, MinIO/DTS, медиасервер Используется для проверки и анализа заранее подготовленных видеофайлов.
Сценарии, модели, ассеты, launch-артефакты Web UI/API домена severstal, внутренний S3/MinIO и DTS svr-scenario-storage, svr-models-registry, svr-asset-storage, MinIO Ручное копирование в контейнеры не является штатной процедурой.
Отчёты и выгрузки Web UI/API сервисов статистики и отчётности st-report-pdf-xlsx-generator, MinIO/DTS, файловые каталоги отчётов Готовые файлы выгружаются пользователем или администратором через интерфейс/маршрут API.

Обмен с ПК-КОТ не считается файловым обменом: в PROD используются PostgreSQL read-only и HTTP push статусов, а в TEST - заглушка интеграции. Для процедурной проверки TEST достаточно убедиться, что сервисы svr-postgres-pk-kot и svr-severstal-integration работают с изолированным тестовым источником и не обращаются к промышленному ПК-КОТ.

2.3.2. Форматы, каталоги и контроль целостности

Если в эксплуатационном регламенте площадки выделены отдельные каталоги incoming, work, archive и error, их абсолютные пути фиксируются в локальном журнале работ администратора. В поставке BOX5-DIT-MGSN штатные сервисы используют каталоги и объектные хранилища, приведённые ниже; ручная подмена файлов внутри контейнеров не является штатным файловым обменом.

Поток обмена Формат файлов Правила именования Расписание / инициатор
Дистрибутив и Docker-образы dockerimg.tgz - gzip-архив результата docker save; каталог CODE с compose-файлами, доменными .env и конфигурацией поставки. Имя архива образов - dockerimg.tgz; каталог поставки сохраняется как CODE или с суффиксом версии/даты в архиве администратора. Для каждой передачи фиксируются окружение, версия поставки и контрольная сумма. Перед первичной установкой, обновлением или восстановлением; инициатор - администратор поставки.
Оффлайн-активация Guardant Текстовые файлы запроса и ответа активации: request.request, request.license. Имена файлов при выполнении процедуры не изменяются; при архивировании допускается добавлять дату, окружение и серийный номер без раскрытия чувствительных параметров. При первичной активации, переносе на новый сервер или восстановлении состояния лицензии.
Данные песочницы и модели sandbox-compose-data.tgz, nri-models.tgz, каталог /data/models, CSV-фильтр моделей sel-models.csv, артефакты моделей в форматах registry/MinIO. Имена архивов поставки сохраняются; старый каталог моделей перед заменой сохраняется как /data/models.old или в архиве площадки. При установке, обновлении моделей, изменении GPU-профиля и восстановлении песочницы.
Сценарии, flows и ассеты flows.json, JSON-настройки сценариев, multipart-поля flow_file / flows_info, ZIP-архивы моделей, model_info.json, coco_categories.json, бинарные ассеты. Имена сценариев, версий и файлов назначаются UI/API доменов severstal и inference; ручные имена не должны обходить реестр сценариев и моделей. По действию администратора/инженера в UI/API, при публикации из Node-RED Sandbox и при обновлении моделей.
Загруженные видеозаписи и виртуальные камеры HTTP multipart/form-data; штатный синхронный upload принимает mp4 и mov; совместимый путь загрузки может перекодировать неподдерживаемые видео в MP4/H.264. Исходное имя сохраняется в метаданных; рабочее имя и привязку к виртуальной камере назначает сервис st-virt-cam-video-upload. По запросу пользователя или администратора через UI/API; периодического расписания нет.
Отчёты и пользовательские выгрузки PDF/XLSX/CSV и связанные бинарные объекты, выдаваемые через UI/API и MinIO/DTS. Имя формируется отчётным сервисом или пользователем при скачивании; при архивировании фиксируются дата формирования, пользователь/заявка и окружение. По запросу пользователя, расписанию отчётности или регламентной проверке.
Поток обмена Входящий каталог / точка приёма Рабочее хранилище Архив Ошибка / карантин Контроль целостности
Дистрибутив и Docker-образы /data/update/dockerimg.tgz на каждой ноде; ~/CODE на мастер-ноде. Docker image store после docker load; рабочий каталог ~/CODE/box3. Защищённый архив администратора и резервная копия ~/CODE, например /data/backups/sova-<date>/. Неполный файл удаляется или изолируется с суффиксом .part / .bad; docker load не выполняется до успешной проверки. Размер файла, sha256sum, успешный docker load, наличие ожидаемых тегов в docker images.
Оффлайн-активация Guardant /tmp/activation/request.request, /tmp/activation/request.license на сервере активации. Guardant runtime и состояние inf-guardant-control-center. Ограниченный по доступу архив администратора; файлы не помещаются в Git и общие каталоги. Неиспользуемый или устаревший request-файл удаляется; при смене сервера формируется новый запрос. HTTP-ответы API Guardant, логи guardant-control-center, подтверждение активной лицензии.
Данные песочницы и модели /data/sandbox-compose-data, /data/models, архивы sandbox-compose-data.tgz и nri-models.tgz. COMPOSE_DATA_DIR, MLFLOW_MODELS_PATH, NRI_ASSETS_HOST_DIR, volume песочницы Node-RED и локальные каталоги моделей на GPU-нодах. /data/models.old, резервная копия /data/sandbox-compose-data и архив площадки. Частично распакованный архив изолируется; повторное использование каталога допускается только после сверки контрольных сумм и владельца файлов. sha256sum / gzip -t для архивов, владелец 1000:1000, наличие sel-models.csv, успешная конвертация convert_all_models.
Сценарии, flows и ассеты UI/API svr-scenario-storage, svr-lite-scenario-storage, svr-models-registry, svr-asset-storage; публикация из Node-RED Sandbox. PostgreSQL домена severstal, MinIO/DTS, svr-models-registry, /data/models после выгрузки/конвертации. Архив сценариев и моделей средствами UI/API; резервная копия доменных БД и MinIO. Ошибочная публикация не должна становиться активной версией; артефакты изолируются через UI/API, повтор выполняется после проверки версии. Успешный ответ API, видимость сценария/модели в UI, корректный статус версии, запуск сценария в inf-nri-inference.
Загруженные видеозаписи и виртуальные камеры Web UI / gateway /api/statistics/virt-cam-video-upload/ и совместимые upload-маршруты. st-virt-cam-video-upload, PostgreSQL-метаданные, каталог видео, смонтированный в /videos, MinIO/DTS и медиасервер после привязки. Штатное хранение в BOX5-DIT-MGSN и резервная копия COMPOSE_DATA; отдельный архив создаётся только по регламенту площадки. Сервис помечает необработанные записи как неготовые и переобрабатывает их при старте; при ручной передаче неготовый файл удаляется или загружается повторно через UI/API. Ответ upload API, успешная перекодировка, статус is_ready, доступность файла через UI/API, привязка к виртуальной камере.
Отчёты и пользовательские выгрузки UI/API отчётных сервисов. st-report-pdf-xlsx-generator, MinIO/DTS, каталоги отчётов в COMPOSE_DATA. Штатное хранилище отчётов и резервная копия данных; внешняя выгрузка хранится по регламенту заказчика. Ошибочный или неполный отчёт формируется заново; частичные файлы не передаются пользователю как результат. HTTP-статус скачивания, ненулевой размер файла, открытие PDF/XLSX/CSV, отсутствие ошибок в логах отчётного сервиса.

Для всех потоков действуют общие правила:

  1. Не смешивать файлы DEV/TEST/PROD в одном рабочем каталоге.
  2. Не начинать обработку файла до завершения передачи и проверки контрольной суммы, если контрольная сумма предусмотрена паспортом поставки или журналом работ.
  3. Для файлов, создаваемых через UI/API, источником истины является статус операции в сервисе и запись в БД/MinIO, а не наличие файла на файловой системе контейнера.
  4. При повторной передаче сначала изолировать неполный файл или неготовую версию, затем повторить минимальную неуспешную операцию.
  5. Не публиковать в документации и общих каналах содержимое .env, лицензий, токенов, приватных URL и файлов с персональными или промышленными данными.

2.3.3. Обработка ошибок

Ситуация Действие администратора Контроль
Файл дистрибутива передан не полностью Повторить передачу файла; не выполнять docker load и не заменять рабочий CODE до совпадения размера и контрольной суммы. ls -lh, sha256sum, журнал передачи.
Ошибка загрузки Docker-образов Проверить целостность архива, наличие свободного места, версию Docker; повторить docker load. docker images, df -h, вывод docker load.
Ошибка оффлайн-активации Повторно сформировать request.request, проверить запущенный grdcontrol.service, доступность контейнера guardant-control-center и корректность LICENSE_KEY_SERIAL. curl http://localhost:19191/get_request, docker logs <guardant_container>.
Ошибка загрузки видеофайла или ассета Проверить доступность ui-rest, st-virt-cam-video-upload, ds-minio, ds-data-temporary-storage, свободное место и размер файла. После устранения причины повторить загрузку через штатный интерфейс. docker logs, docker ps, df -h, состояние записи в UI/API.
Ошибка передачи статуса в ПК-КОТ в PROD Проверить доступность внешнего endpoint, параметры PK_KOT_*, журналы svr-severstal-integration и очередь повторных отправок. Логи контейнера, статус события в BOX5-DIT-MGSN, ответ внешнего сервиса.

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

2.3.4. Архивирование

Файлы, относящиеся к развёртыванию и файловому обмену, архивируются по правилу: сначала фиксируется исходный файл и контрольная сумма, затем выполняется обработка, после успешной проверки результат переносится в архив окружения.

Объект архивирования Когда архивировать Срок/место хранения
Дистрибутивы, dockerimg.tgz, каталог исходной поставки До начала развёртывания и после успешной установки В защищённом архиве администратора окружения; путь задаётся эксплуатационным регламентом площадки.
Файлы Guardant request.request и request.license После завершения активации В ограниченном по доступу каталоге архива; в Git и общие хранилища не помещаются.
Конфигурационные файлы ~/CODE и .env Перед изменением и после успешного развёртывания В резервной копии окружения вместе с датой и версией поставки.
Каталоги моделей и песочницы Перед заменой моделей или данных песочницы Локальная резервная копия, например /data/models.old, и архив площадки при необходимости.
Отчётные файлы, видеофрагменты и пользовательские выгрузки После формирования бизнес-процессом В штатных хранилищах BOX5-DIT-MGSN: MinIO/DTS, каталоги отчётов и доменные базы данных.

2.3.5. Повторная обработка файлового обмена

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

Повторная обработка не используется для повторного прогона производственных видеопотоков, пересчёта уже сохранённых событий, ручного изменения MinIO/DTS или восстановления повреждённых БД. Такие случаи относятся к восстановлению данных и разбору инцидентов по документам И3 и И2, раздел 3.

Когда применять Что повторять Предварительное условие Контроль после повтора
Файл дистрибутива, dockerimg.tgz, архив моделей или песочницы передан не полностью Повторную передачу через scp/rsync/SFTP Удалён или переименован неполный файл, достаточно свободного места Размер и sha256sum совпадают с паспортом поставки.
docker load завершился ошибкой из-за повреждённого архива, нехватки места или сбоя Docker docker load -i dockerimg.tgz после устранения причины Архив проверен, свободное место восстановлено, старые частичные операции не используются как источник истины Нужные теги видны в docker images, повторная загрузка не меняет ожидаемый состав образов.
Исправлялась конфигурация поставки Применение исправленного CODE/.env и перезапуск контура Перед изменением сохранена текущая конфигурация, исправление проверено на TEST или согласовано для PROD Контур стартует, docker service ls/docker ps без деградации, web API отвечает.
Оффлайн-активация Guardant не принята или изменился сервер/ключ/runtime Формирование нового request.request и загрузку нового request.license Старый запрос не используется, если изменилось состояние сервера или Guardant runtime В логах guardant-control-center подтверждена активация.
Пользовательский видеофайл, ассет или отчёт не был сохранён через UI/API Повторную загрузку или формирование через штатный UI/API Устранены ошибки gateway, MinIO/DTS, лимитов размера и свободного места Объект виден в UI/API и доступен через штатный маршрут скачивания/просмотра.

Общий порядок повторной обработки:

  1. Установить и устранить первопричину ошибки.
  2. Зафиксировать исходную ошибку и выбранное действие в журнале работ.
  3. Удалить или изолировать частично переданный файл, если его нельзя достоверно проверить контрольной суммой.
  4. Повторить только минимальную неуспешную операцию, а не весь регламент развёртывания.
  5. Выполнить контроль из таблицы и продолжать работы только при успешном результате.

Для конфигурации после повторного применения исправленного CODE/.env выполнить перезапуск:

cd ~/CODE/box3
./utils/swarm/swarm.sh stop
./utils/swarm/swarm.sh start

Если повторная обработка второй раз завершается той же ошибкой, дальнейшие повторы прекращаются. Администратор сохраняет артефакты проверки, состояние контейнеров и логи, затем переходит к процедуре восстановления или эскалации.

2.3.6. Мониторинг поступления файлов

Процедурный контроль файлового обмена выполняется на уровне сервисов и хранилищ:

Контроль Команда/действие Ожидаемый результат
Наличие работающих сервисов файлового обмена docker service ls или docker ps ds-minio, ds-data-temporary-storage, st-virt-cam-video-upload, svr-asset-storage, svr-scenario-storage находятся в состоянии Running.
Логи загрузки видео и ассетов docker logs <container_name> --tail 200 Нет повторяющихся ошибок записи, доступа к MinIO/DTS или превышения лимитов размера.
Свободное место df -h, ncdu <каталог_данных> На файловых системах данных достаточно места для загрузок, отчётов, видео и резервных копий.
Состояние объектного хранилища Проверка контейнера ds-minio и доменного gateway Файлы доступны через штатные маршруты, ошибки 5xx отсутствуют.
Поступление событий и статусов UI/API статистики, логи st-event-storage и svr-severstal-integration Загруженные файлы связаны с камерами/событиями, статусы доходят до потребителей или остаются в очереди повторной отправки.

2.4. Регламенты обслуживания

Регламентные операции выполняются в обязательной последовательности: изменения первично проверяются на DEV, затем поставка проверяется на TEST, после успешного результата и создания резервной копии планируется окно PROD. Операции, влияющие на промышленный контур, выполняются администратором с фиксацией версии поставки, времени начала и окончания работ, результата проверок и выявленных отклонений.

Операция Периодичность Обязательность Очередность выполнения
Проверка состояния нод и сервисов Ежедневно; дополнительно после перезапуска или обновления Обязательно для TEST и PROD; для DEV - при активных работах и подготовке поставки docker node ls -> docker service ls/docker ps -> проверка деградировавших реплик -> анализ логов проблемных сервисов.
Проверка GPU и NVIDIA runtime Ежедневно на вычислительных нодах; перед обновлением инференса Обязательно для узлов с GPU nvidia-smi -> проверка /etc/docker/daemon.json -> перезапуск затронутого домена при необходимости.
Контроль свободного места Ежедневно для PROD, не реже одного раза в неделю для TEST Обязательно df -h -> анализ крупных каталогов ncdu -> очистка временных файлов и устаревших архивов по регламенту.
Проверка файлового обмена Ежедневно для PROD; при тестах загрузки для TEST Обязательно для потоков, задействованных в эксплуатации Проверка сервисов MinIO/DTS -> проверка загрузок/отчётов -> анализ ошибок st-virt-cam-video-upload, svr-asset-storage, svr-severstal-integration.
Резервное копирование конфигурации и данных Перед каждым обновлением; далее по регламенту площадки Обязательно для PROD; рекомендуется для TEST перед значимыми изменениями Создать резервную копию ~/CODE, доменных БД и файловых хранилищ -> проверить наличие архива -> только после этого менять версию или параметры.
Проверка лицензии Guardant После установки, после переноса на новый сервер, при ошибках запуска инференса Обязательно Проверить grdcontrol.service -> проверить guardant-control-center -> при необходимости выполнить оффлайн-активацию.
Проверка моделей песочницы и инференса После переноса моделей, обновления весов или изменения GPU-профиля Обязательно для вычислительных нод Проверить /data/models -> выполнить конвертацию в контейнере песочницы -> выгрузить модели в хранилище -> проверить запуск inf-nri-inference.
Обновление версии решения По плану релиза или по заявке на исправление Обязательно сначала DEV и TEST Проверить изменения на DEV -> развернуть на TEST -> выполнить регресс -> оформить результат -> создать резервную копию PROD -> развернуть PROD -> выполнить контрольные проверки.
Проверка интеграции с ПК-КОТ Для TEST при проверке заглушки; для PROD после обновлений и при изменении интеграции Обязательно для PROD В TEST проверить стендовую заглушку -> в PROD проверить чтение справочников и отправку статусов -> сверить журналы svr-severstal-integration.
Проверка автозапуска После настройки systemd и после плановой перезагрузки Обязательно systemctl is-enabled box-restart.service -> перезагрузка в согласованное окно -> проверка запуска сервисов.

2.4.1. Чек-лист после установки или обновления

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

Проверка Команда Ожидаемый результат
Доступность нод кластера docker node ls У всех нод STATUS=Ready, AVAILABILITY=Active; у мастер-ноды указан Leader.
Запуск сервисов и версии образов docker service ls Все штатные реплики запущены в формате x/x; образы соответствуют инструкции установленного обновления.
Ошибки задач на ноде docker node ps --no-trunc <node_hostname> Задачи находятся в Running, поле ERROR пустое.
NVIDIA driver на вычислительной ноде nvidia-smi Команда выполняется без ошибок, GPU видны, для рабочего контура есть активные процессы.
NVIDIA Container Toolkit cat /etc/docker/daemon.json Указан "default-runtime": "nvidia" и runtime nvidia-container-runtime.
Лейблы нод docker node ls -q \| xargs docker node inspect -f '{{ .ID }} [{{ .Description.Hostname }}]: {{ .Spec.Labels }}' На мастер-ноде назначены db и rest; на вычислительных нодах - inference; на ноде песочницы дополнительно nr_sandbox, flows_manager, events_validator.
Web-интерфейс curl localhost Возвращается HTML приложения без ошибки HTTP-запроса.
Nginx UI docker logs bx_ui-nginx.1.<service_id> \| head -n 20 В логах есть успешные запросы со статусом 200, ошибки запуска отсутствуют.
Конвертация моделей python3 -m nri.mlflow.tools.convert_all_models --models_filter_path /models/sel-models.csv внутри контейнера песочницы Конвертация завершается без ошибок; при ручном распространении обновлённый /data/models скопирован на все вычислительные ноды и имеет владельца 1000:1000.

После выполнения регламентных операций администратор фиксирует:

  • окружение и версию поставки;
  • список выполненных команд и проверок без раскрытия чувствительной информации;
  • результат проверки web-интерфейса и основных сервисов;
  • выявленные отклонения и решение о повторной обработке, откате или переносе изменений в PROD.