Раздел 3. Указания по восстановлению¶
3.1. Сохранение и восстановление данных¶
Восстановление BOX5-DIT-MGSN выполняется из заранее сохранённых копий конфигурации, данных, моделей и дистрибутива. Для целостного файлового восстановления резервная копия создаётся в технологическое окно: сначала фиксируется версия поставки, затем останавливаются сервисы, копируются данные и только после проверки архива сервисы запускаются снова.
сервис, нода, данные, лицензия, модели"] stop["Остановить затронутый контур"] restore["Восстановить CODE, данные,
модели, лицензирование"] start["Запустить swarm и песочницу"] checks["Выполнить контрольный чек-лист"] ok{"Проверки успешны?"} work["Передать контур в эксплуатацию"] escalate["Эскалация и повторное восстановление"] detect --> scope --> stop --> restore --> start --> checks --> ok ok -->|"да"| work ok -->|"нет"| escalate --> scope
Исходный Mermaid-код схемы: И2-MER-003. 3.1. Сохранение и восстановление данных.
3.1.1. Состав резервной копии¶
| Объект | Что сохранять | Когда сохранять | Примечание |
|---|---|---|---|
| Дистрибутив и Docker-образы | Архив dockerimg.tgz, каталог исходной поставки, сведения о версии поставки |
До установки, перед обновлением, после успешной установки | Архив образов должен быть доступен для загрузки на все ноды командой docker load. |
| Конфигурация решения | ~/CODE, включая box3, node-red-sandbox, ui-rest/ui-config/config.json, .env-файлы без публикации чувствительной информации |
Перед каждым изменением конфигурации и перед обновлением | В общие каналы и документацию не включаются пароли, токены и полные значения чувствительных переменных. |
| Данные swarm-контура | Каталог, заданный COMPOSE_DATA_SWARM_PATH, типовое значение /data/compose-data2 |
По регламенту площадки и перед обновлением | Включает PostgreSQL/ClickHouse/Redis/MinIO-данные, логи, сценарии, отчёты, видеофрагменты и служебные каталоги. |
| Данные песочницы | /data/sandbox-compose-data, архив sandbox-compose-data.tgz при поставке |
Перед заменой песочницы, перед обновлением сценариев и моделей | После восстановления требуется владелец 1000:1000 и проверка COMPOSE_DATA_DIR. |
| Модели | /data/models, архив nri-models.tgz при поставке, файл фильтра /models/sel-models.csv внутри контейнеров |
Перед заменой весов, после конвертации моделей, перед обновлением инференса | Перед ручной заменой старый каталог сохраняется как /data/models.old. |
| Лицензирование | Серийный номер LICENSE_KEY_SERIAL, тип активации, файлы оффлайн-активации request.request и request.license, состояние Guardant runtime при наличии регламента площадки |
После активации и при переносе на новый сервер | Файлы лицензии хранятся в ограниченном архиве администратора; в Git не помещаются. |
| Автозапуск | /etc/systemd/system/box-restart.service на мастер-ноде и вычислительных нодах |
После настройки systemd и перед заменой сервера | Нужен для восстановления автозапуска после перезагрузки. |
3.1.2. Порядок сохранения¶
- Зафиксировать окружение, дату, версию поставки и список нод:
docker node ls
docker service ls
- На мастер-ноде остановить кластер:
cd ~/CODE/box3
./utils/swarm/swarm.sh stop
- На ноде песочницы остановить Node-RED sandbox, если он участвует в резервном копировании:
cd ~/CODE/node-red-sandbox
docker compose down
- Сохранить конфигурацию и данные в архив площадки. Пример команд:
mkdir -p /data/backups/sova-$(date +%F)
rsync -a --numeric-ids ~/CODE /data/backups/sova-$(date +%F)/
rsync -a --numeric-ids /data/compose-data2 /data/backups/sova-$(date +%F)/
rsync -a --numeric-ids /data/sandbox-compose-data /data/backups/sova-$(date +%F)/
rsync -a --numeric-ids /data/models /data/backups/sova-$(date +%F)/
sudo cp /etc/systemd/system/box-restart.service /data/backups/sova-$(date +%F)/ || true
- Проверить наличие архива, свободное место и контрольные суммы:
df -h
du -sh /data/backups/sova-$(date +%F)
find /data/backups/sova-$(date +%F) -type f -print0 | xargs -0 sha256sum \
> /data/backups/sova-$(date +%F).sha256
- Запустить кластер и песочницу:
cd ~/CODE/box3 && ./utils/swarm/swarm.sh start
cd ~/CODE/node-red-sandbox && docker compose up -d
- Выполнить контроль после запуска:
docker node ls,docker service ls,curl localhost,nvidia-smiна вычислительных нодах.
3.1.3. Порядок восстановления из резервной копии¶
Восстановление выполняется от меньшей области к большей. Если потерян один сервис, сначала проверяется возможность восстановления домена и его данных. При потере ноды или диска выполняется полное восстановление узла.
- Подготовить целевой сервер: установить системное ПО, Docker, Docker Compose, NVIDIA driver и NVIDIA Container Toolkit в версиях, указанных в разделе 2, пункте 2.2.1.
- На вычислительных нодах восстановить
/etc/docker/daemon.json, отключить sleep/hibernate и проверитьnvidia-smi. - Загрузить Docker-образы на каждую ноду:
docker load -i /data/update/dockerimg.tgz
- Восстановить
~/CODE, каталогCOMPOSE_DATA_SWARM_PATH, данные песочницы и модели из резервной копии:
rsync -a --numeric-ids /data/backups/<backup_id>/CODE/ ~/CODE/
sudo rsync -a --numeric-ids /data/backups/<backup_id>/compose-data2/ /data/compose-data2/
sudo rsync -a --numeric-ids /data/backups/<backup_id>/sandbox-compose-data/ /data/sandbox-compose-data/
sudo rsync -a --numeric-ids /data/backups/<backup_id>/models/ /data/models/
sudo chown -R 1000:1000 /data/models /data/sandbox-compose-data
- Проверить в
~/CODE/box3/utils/swarm/swarm.sh, чтоCOMPOSE_DATA_SWARM_PATHуказывает на восстановленный каталог/data/compose-data2. - Проверить настройки песочницы в
~/CODE/node-red-sandbox/.env:COMPOSE_DATA_DIR,MLFLOW_MODELS_PATH,NRI_ASSETS_HOST_DIR,NGINX_HOST_PORT. В~/CODE/box3/ui-rest/ui-config/config.jsonпроверитьSCENARIOS_FRAME_URL. - Восстановить или повторно выполнить оффлайн-активацию Guardant. Если
сервер или состояние
/var/guardantизменились, старый request-файл не используется: сформировать новый запрос черезcurl http://localhost:19191/get_requestи загрузить новый ответ активации по процедуре раздела 2, пункта 2.2.4. - Инициализировать или восстановить Docker Swarm:
docker swarm init --advertise-addr <IP-адрес_мастер-ноды>
docker swarm join --token <token> <master_ip>:2377
- Назначить лейблы нод
db,rest,inference, а для ноды песочницы такжеnr_sandbox,flows_manager,events_validator. -
Запустить кластер и песочницу:
cd ~/CODE/box3 && ./utils/swarm/swarm.sh start cd ~/CODE/node-red-sandbox && docker compose up -d -
При восстановлении моделей выполнить проверочную конвертацию и выгрузку моделей в хранилище:
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 -
Выполнить контрольный чек-лист раздела 2, пункта 2.4.1.
3.1.4. Контроль успешности восстановления¶
| Проверка | Команда | Норма |
|---|---|---|
| Состояние swarm | docker node ls |
Все ноды Ready и Active; мастер-нода в состоянии Leader. |
| Реплики сервисов | docker service ls |
Для штатных сервисов REPLICAS соответствует x/x. |
| Ошибки задач | docker node ps --no-trunc <node_hostname> |
Поле ERROR пустое, задачи находятся в Running. |
| Web-интерфейс | curl localhost |
Возвращается HTML приложения без ошибки HTTP-запроса. |
| Nginx | docker logs bx_ui-nginx.1.<service_id> \| head -n 20 |
В логах есть запросы со статусом 200, ошибок старта нет. |
| GPU | nvidia-smi |
GPU доступны, драйвер работает без ошибок. |
| NVIDIA runtime | cat /etc/docker/daemon.json |
Указан "default-runtime": "nvidia". |
| Лицензия | docker logs inf-guardant-control-center \| grep Activated |
В лицензированном контуре активация подтверждена. |
| Модели | Конвертация convert_all_models внутри песочницы |
Конвертация завершается без ошибок. |
3.2. Действия при сбоях¶
При сбоях администратор действует по принципу локализации: сначала определить границы отказа, затем остановить только затронутый контур, восстановить данные или конфигурацию и выполнить чек-лист. Ручное изменение файлов внутри контейнеров не считается штатным способом восстановления, так как изменения теряются при пересоздании контейнеров.
3.2.1. Первичная диагностика¶
- Проверить состояние нод и сервисов:
docker node ls
docker service ls
docker node ps --no-trunc <node_hostname>
- Проверить свободное место и крупные каталоги:
df -h
ncdu /data
- Проверить web-доступ и nginx:
curl localhost
docker logs bx_ui-nginx.1.<service_id> --tail 200
- На вычислительных нодах проверить GPU и runtime:
nvidia-smi
cat /etc/docker/daemon.json
- Проверить лейблы нод:
docker node ls -q | xargs docker node inspect \
-f '{{ .ID }} [{{ .Description.Hostname }}]: {{ .Spec.Labels }}'
3.2.2. Типовые сбои и действия администратора¶
| Сбой | Признаки | Действия | Контроль после восстановления |
|---|---|---|---|
| Нода недоступна в swarm | В docker node ls нода не Ready или AVAILABILITY не Active |
Проверить сеть и Docker daemon на ноде; при потере сервера подготовить замену, выполнить docker swarm join, восстановить данные и назначить прежние лейблы. |
docker node ls, docker node ps --no-trunc <node_hostname>. |
| Реплика сервиса не запускается | В docker service ls значение REPLICAS меньше требуемого; в docker node ps есть ERROR |
Посмотреть docker service ps <service> --no-trunc и docker logs; проверить наличие образа, env-конфигурацию, доступность volume и свободное место; после исправления выполнить запуск через ./utils/swarm/swarm.sh start или перезапуск затронутого домена штатным скриптом. |
Реплики x/x, поле ERROR пустое. |
| Ошибка загрузки Docker-образов | docker load завершается ошибкой, нужный image tag отсутствует |
Проверить целостность dockerimg.tgz, место на диске, повторить передачу архива; если архив собирался из исходного сервера с нетегированными образами, предварительно выполнить согласованный docker system prune на исходном сервере и пересобрать архив. |
docker images, повторный docker load. |
| Ошибка NVIDIA driver или runtime | nvidia-smi не видит GPU; сервисы инференса не получают GPU |
Проверить драйвер не ниже требуемой версии, nvidia-container-toolkit, /etc/docker/daemon.json; перезапустить Docker в технологическое окно и затем сервисы инференса. |
nvidia-smi, cat /etc/docker/daemon.json, запуск inf-nri-inference. |
| Ошибка лицензирования Guardant | Инференс или guardant-сервис стартует с ошибками лицензии; нет подтверждения Activated |
Проверить grdcontrol.service, LICENSE_KEY_SERIAL, порт 19191; при переносе сервера или очистке /var/guardant выполнить новую оффлайн-активацию. |
systemctl status grdcontrol.service, docker logs inf-guardant-control-center. |
| Web-интерфейс недоступен | curl localhost возвращает ошибку; в браузере нет UI |
Проверить ui-rest, bx_ui-nginx, свободное место, upstream-сервисы; сверить SCENARIOS_FRAME_URL, если недоступна только песочница. |
curl localhost, логи nginx со статусом 200. |
| Повреждение или потеря данных | Ошибки PostgreSQL/ClickHouse/MinIO/Redis, отсутствуют сценарии, отчёты или файлы | Остановить кластер, восстановить соответствующий каталог из резервной копии в /data/compose-data2, сохранить владельцев и права, запустить кластер. Для MinIO и БД не смешивать части разных резервных копий без отдельного решения администратора. |
Запуск сервисов, выборочная проверка сценариев, отчётов и событий через UI/API. |
| Нехватка места | df -h показывает заполнение раздела; сервисы пишут ошибки записи |
Остановить операции загрузки, удалить только согласованные временные файлы и устаревшие архивы, при необходимости расширить диск; не удалять каталоги БД, MinIO и моделей без резервной копии. | df -h, отсутствие ошибок записи в логах. |
| Песочница Node-RED недоступна | Не открывается iframe, не запускаются sandbox-сессии, ошибки nr-sbx-* |
Проверить docker compose ps в ~/CODE/node-red-sandbox, .env с COMPOSE_DATA_DIR, MLFLOW_MODELS_PATH, NRI_ASSETS_HOST_DIR, NGINX_HOST_PORT; восстановить /data/sandbox-compose-data и права 1000:1000. |
docker compose ps, открытие песочницы, успешный запуск конвертации модели. |
| Модели не конвертируются или не подхватываются инференсом | Ошибки convert_all_models, push_models_to_vlflow, запуск сценариев без нужной модели |
Проверить /data/models, файл фильтра sel-models.csv, права 1000:1000; при необходимости восстановить модели из архива, выполнить конвертацию в песочнице и выгрузку в хранилище моделей. |
Успешная конвертация и запуск inf-nri-inference. |
| Сбой автозапуска после перезагрузки | После reboot кластер или /tmp/inference_ipc не восстановлены |
Проверить /etc/systemd/system/box-restart.service, systemctl is-enabled box-restart.service, рабочий каталог и пользователя в unit-файле; восстановить unit из резервной копии и выполнить sudo systemctl enable box-restart.service. |
После плановой перезагрузки сервисы поднимаются, /tmp/inference_ipc создан. |
3.2.3. Восстановление после полной потери ноды¶
- Установить ОС и системные зависимости по требованиям раздела 2.
- Восстановить Docker, Docker Compose, NVIDIA driver и NVIDIA Container Toolkit, если нода вычислительная.
- Загрузить
dockerimg.tgz, восстановить/data/compose-data2,/data/modelsи при необходимости/data/sandbox-compose-data. - На мастер-ноде получить актуальную команду присоединения:
docker swarm join-token worker
- Присоединить заменённую ноду к swarm, назначить прежние лейблы и запустить кластер.
- Проверить задачи на восстановленной ноде:
docker node ps --no-trunc <node_hostname>
3.2.4. Эскалация¶
Администратор эскалирует сбой ответственному DevOps/VizorLabs, если:
- восстановление из последней резервной копии не запускает сервисы;
- потеряны или повреждены данные БД/MinIO без актуальной резервной копии;
- Guardant не принимает оффлайн-ответ или не поднимает порт
19191; - ошибка затрагивает интеграцию с ПК-КОТ в PROD;
- повторный запуск моделей или конвертация завершаются одинаковой ошибкой.
В обращении фиксируются окружение, время сбоя, выполненные команды, состояние
docker node ls, docker service ls, проблемные строки логов и версия
поставки. Чувствительная информация, включая полные .env-файлы, пароли,
токены и лицензии, в обращение не включается.