# 아이서티 Provider 운영·보관

기준: 2026-09-28, `ICERTI-STORAGE-01` / `CROWD-02`, source `0f172d94`.
실제 완료 상태는 profile validation 및 현장 `state/active.json`을 함께 확인한다.

## 현재 군중 패치와 재개

현장 transaction은 `crowd-20260928-r02`다. Analytics는
`contextra-analytics:icerti-crowd-0f172d94-20260928-r01`, sidecar는
`contextra-sidecar:icerti-crowd-0f172d94-20260928-r02`다. 네 모델/SDK/native는 이전 현장 검증본을 유지한다.
군중 Event/cooldown과 Gateway의 CROWD 미디어 경로를 반영했다. 생성된 Nginx 설정 검사도 통과했다.
신규 기능은 [CROWD_EVENTS](../scenarios/CROWD_EVENTS.ko.md)를 따른다. 누락 필수값을 보충하지 않는다.
sidecar source layer는 실행 UID10001의 읽기 권한을 보존해야 한다. 이번 recipe는 COPY --chown=10001:10001을 사용한다.
기존 mount overlay가 Gateway template를 덮지 않도록 새 full overlay를 마지막 계층으로 연결했다.

복합 A13 단일30초: Redis 평균 Pose9.89/Fire9.92/Crowd9.94FPS, 최저9.67/9.80/9.83FPS.
Crowd 자연 Event3건의 두 미디어와 HTTP200 전송을 확인했다. 실제 브라우저 수용은 후속이다.
시험 설정을 CAS 복귀한 뒤 기존 optional Fire 정규화 잔여를 guarded 원본 복원으로 제거했다.
Gateway 복구 직후 Web의31~38번 Start가 재유입돼 한 번 회수하고 Gateway를 중지 대기로 두었다.
최종44stopped/child0/4모델READY이며 analytics/sidecar/DB/Redis는 실행 중이다.
그 후 수신된 Web 설정은 사용자 변경으로 보존했다. 다음 수동 확인 전 Web 자동Start 대상을 정리한다.
Gateway 재개는 active transaction의 exact Compose로 ai-gateway만 기동하거나 해당 컨테이너를 수동 Start한다.
전체 systemd start는 이미 active일 때 no-op일 수 있으므로 Gateway 재기동을 대신한다고 가정하지 않는다.
[현장 검증](../profiles/ltb1021/topics/runtime-lifecycle/validation/20260928T162800+0900-validation-icerti-crowd-a13.md).
별도 폐쇄망 준비는 변경하지 않았다. 후속 준비세트는 최신 active/accepted receipt의 image와 overlay를 사용한다.

## 실행·재개

- 설치 root: `/workspace/contextra/runtime`, 통합 data root: `/workspace/contextra/data`.
- systemd: `contextra-runtime.service`. 5개 bind mount와 Docker 준비 뒤 전용 guard가 UUID와 samefile을 검증한다.
- `/training` 또는 `/backup`이 빠지거나 통합 view가 다르면 기동하지 않는다. 루트 디스크로 대체 저장하지 않는다.
- container 내부 `/opt/contextra/models/triton`, `/data/contextra/*`와 Docker 저장소는 그대로다.
- Compose project, PostgreSQL named volume, 기존 Redis anonymous volume을 exact 이름으로 보존한다.
- `runtime/deployctl`은 새 deploy-tools를 사용한다. 증분 배포 상태에서 일반 deploy/rollback은 검토 Gate를 유지한다.
- 실제 서버 reboot는 시험하지 않는다. 전용 mount enable/guard 및 서비스 stop/start로 검증한다.
- 자동 카메라 Start/rollback은 하지 않는다. maintenance 뒤 Web에서 사용자가 필요한 카메라를 Start한다.

## 현재 실행 계약

- 단일/복합 모두 provider별 process·독립 Decode·직접 Redis sender, B 선형 경로.
- freshness OFF, 입력 최신화 ON, 완료 queue 1초/32, Event cooldown 10초, 공통 Stream 300.
- Medium/Pose/Fire/Crowd: 현장 GPU/TensorRT 변환 engine version8, min/opt/max 1/8/8, max/preferred batch8, instance8.
- 실제 channel 요청/mux batch1. Medium/Pose/Fire576, Crowd512 및 기존 tensor/precision 계약 유지.
- model repository: `/training/contextra/models/releases/provider-b8-20260927-r01`.
- 모델 예측/Frame identity/순서/fencing/Stop, 인증·Redis ACL·Event 목적지는 변경하지 않는다.
- `CONTEXTRA_TEST_NO_CAPTURE=false`, Artifact/HTTP/학습 On, 상세 계측 Off.
- 시나리오 서버 기본값은 test와 정합화한다. 현장 카메라별 명시 저장값은 우선 보존한다.

## 실제·통합 경로와 정리

| 용도 | 실제 저장 root | 통합 bind view | 상한 / 정리 목표 |
|---|---|---|---|
| 모델 | `/training/contextra/models` | `/workspace/contextra/data/models` | Event/학습 정리 대상 아님 |
| Event | `/backup/contextra/artifacts` | `/workspace/contextra/data/artifacts` | 4TB / 3.6TB |
| 학습 | `/backup/contextra/training` | `/workspace/contextra/data/training` | 2TB / 1.8TB |

TB/GB는 10진이다. Event와 학습은 독립 상한이며 6TB 가변 공유 pool이 아니다.
두 기능 모두 filesystem 최소 여유 100GB를 admission 기준으로 보호한다.
Event는 학습 최대 예약 402653184 bytes, 학습은 Event 최대 예약 8589934592 bytes를 추가 headroom으로 계산한다.
이는 타 기능 진행 작업의 보수적 상한이며, 비대상 프로세스의 디스크 쓰기를 제한하는 filesystem quota는 아니다.

Event 정리는 terminal Artifact와 terminal delivery, reservation0, claim 없음인 보호 해제 묶음만 오래된 순서로 처리한다.
원장의 EventID/전송 이력/public payload는 보존하고 별도 `media_retention_state`로 DELETING/DELETED/BLOCKED를 기록한다.
완료 미디어 삭제는 회수 불가능하다. `/root/data_cleanup.sh`의 카메라 폴더 통째 삭제 cron 한 건은 대체 정책 검증 뒤 비활성화한다.
원본 스크립트와 다른 cron은 보존한다. 시간/개수 budget으로 정리를 분할하고 중단된 DELETING은 다음 maintenance에서 재개한다.

학습 정리는 index와 owner marker가 일치하는 READY 묶음만 지운다. 작성 중·소유 불명·symlink·Event 자료는 보호한다.
임시 압축 자료/DB/예약도 용량 판단에 포함한다. 안전한 정리나 여유 확보가 안 되면 신규 저장을 거절한다.
Event는 기존 admission failure 진단, 학습은 저장 skip을 남기며 정상 저장/전송으로 위장하지 않는다.

## 설정 변경

- Event env: `CONTEXTRA_ARTIFACT_CAP_BYTES=4000000000000`, `CONTEXTRA_ARTIFACT_MIN_FREE_BYTES=100000000000`,
  `CONTEXTRA_ARTIFACT_RESUME_FREE_BYTES=100000000000`, `CONTEXTRA_ARTIFACT_RETENTION_ENABLED=true`.
- 승인된 환경 변경은 현장 private Compose 공급원과 sealed transaction/active receipt를 함께 갱신한다.
  임시 `docker exec export`만으로 지속 설정을 변경하지 않는다.
- 학습은 인증된 `/internal/secure-control/training/settings` GET/PATCH CAS를 사용한다.
  `expected_revision`, `changes` 계약을 지키며 token은 로그에 남기지 않는다.
- 학습 지속값: enabled=true, minimum_persons=8, interval_seconds=900, width=1280, height=720,
  max_bytes=2000000000000, min_free_bytes=100000000000.
- person 기준은 활성 사람 시나리오의 score 조건 합집합이며 ROI/Tracking/시간 윈도우는 제외한다.
  Pose NMS와 같은 객체 중복 방지는 유지한다. Crowd/Fire는 학습 대상이 아니다.
- raw.jpg는 1280x720 비율 보존 무표시 이미지이며 원본 해상도 보존본이 아니다.
  overlay.jpg/metadata.json은 예비 라벨이며 정답이 아니다. `CONTEXTRA_TRAINING_MODEL_VERSION=8`을 명시한다.

## 보호와 검증 범위

Event 클립/썸네일은 해당 Event 시나리오 ROI만 표시하며 debug_roi를 존중한다.
원본 파일을 새 렌더링으로 덮어쓰거나 과거 Event를 재전송하지 않는다.
격리 학습 시험은 별도 deployment evidence root에서만 실행하며 운영 상한을 낮춰 기존 자료를 시험 삭제하지 않는다.
기능 canary/모델 READY는 전체16채널 처리량이나 Web 소비 수용을 의미하지 않는다.
장시간 안정성 및 별도 고부하 장애 재현은 후속 승인 범위다.

## 현장 기준선과 시험 재사용

2026-09-27의 [A/C 측정 SOT](../profiles/ltb1021/topics/runtime-lifecycle/validation/20260927T231521+0900-validation-icerti-ac-scale.md)를 참고한다.
Pose A와 복합 A는 camera30~45의1~16채널, C는 사용자 요청으로 복합16 한 번만 측정했다.
평균>=9.5FPS/최저채널>=9.0FPS의 참고 기준은 Pose16/복합13까지 충족했다.
이는 짧은 AI 측정이며 미디어 무손실 저장·브라우저 표시·장시간 정원을 보증하지 않는다.

- 보존 helper/SOT: `/backup/contextra/deployment-inbox/icerti-ac-scale-20260927-r01/`.
- 임시 옵션은 새 Start에만 사용하고 실제 `state/active.json`의 transaction을 운영 공급원으로 사용한다.
  과거 측정 당시 `provider-20260927-r03`를 현재 공급원으로 되돌리지 않는다.
- 시험 helper의 artifact admission rejection 계속 정책은 정상 상한 거절만 기록하고 진행한다.
  실제 capture 오류·crash·회수 실패 보호와 운영 상한을 제거하지 않는다.
- 재시험 전 actual image/설정/채널을 확인하고 별도 승인을 받는다. 완료 단계를 자동 재실행하지 않는다.
- 기존 helper의 private 백업에는 인증/설정이 있으므로 공개 자료로 복사하지 않는다.
- 종료 상태는 C=false/상세계측Off/입력계측0초, 원래 카메라 설정 복귀,44stopped/WSSconnected다.
  사용자가 Web에서 필요한 카메라를 수동 Start하며 자동 재Start하지 않는다.
