# 저장소 — 같은 파일을 세 공간에서 보기

- HOST physical은 실제 디스크 폴더, HOST logical은 사람이 보는 통합 창구입니다.
- CONTAINER 경로는 프로그램 내부 주소이며 PC가 바뀌어도 고정합니다.
- 두 호스트 경로는 복사본이 아닙니다. 어느 쪽에서 삭제해도 같은 파일이 없어집니다.
- update는 데이터 이동을 하지 않습니다. UUID/mount가 다르면 중단합니다.

## 1. 그림

```mermaid
flowchart LR
  P[HOST /backup/contextra/artifacts] -->|bind view| L[HOST /data/contextra/artifacts]
  P -->|Docker bind| C[CONTAINER /data/contextra/artifacts]
```

Docker mount 원본은 physical입니다. logical view가 없어도 root SSD로 대신 저장하는 구성을 만들지 않습니다.
평소 사람은 logical 경로를 사용하되 `storage show`가 정상인지 확인합니다.

```bash
sudo /opt/contextra/deployctl storage show
sudo /opt/contextra/deployctl storage prepare --apply
findmnt -T /backup/contextra/artifacts
```

## 2. 디스크가 안 보일 때

`/backup`이라는 폴더가 있어도 HDD가 mount되지 않았다면 실제 filesystem은 `/`일 수 있습니다.
최초 configure에서 기록한 mount target/type/UUID와 현재 값을 비교하여 `STORAGE_MOUNT_MISMATCH`로 차단합니다.
장치 이름 `/dev/sda1`만 맹신하지 않고 UUID가 있으면 UUID를 우선합니다.
처음부터 시스템 SSD에 저장할 때만 configure에서 `ROOT`를 명시 승인합니다.

## 3. 재부팅

v1은 `/etc/fstab`·systemd mount unit을 쓰지 않습니다. logical bind view는 재부팅 후 `storage prepare --apply`로 복원합니다.
실제 `/training`, `/backup` mount의 부팅 순서와 컨테이너 자동시작 전 검사 연계는 현장 담당자가 확인해야 합니다.
**deployctl 시작 전 검사만으로 실행 도중 디스크 분리나 자동 Docker restart까지 보호된다고 보지 않습니다.**

## 4. 저장 위치 변경

```bash
/opt/contextra/deployctl storage move artifacts /mnt/newdisk/contextra/artifacts
```

이 명령은 source/destination와 rsync 복사·checksum 비교 계획만 출력합니다.
관련 채널 Stop/reap, 모든 writer 정지 → 복사 → checksum 비교 결과0 → 새 configure → 재배포 순서입니다.
원본은 자동 삭제하지 않습니다. 운영 Event 자료의 수동 삭제는 원장과 어긋날 수 있습니다.
`.staging`과 최종 Event 공개 폴더는 같은 filesystem 안에 둡니다.

폴더 구분: artifacts=운영 Event, debug/snapshots·clips=진단, offline/inputs=원본, offline/results=시험 결과.
시각/파일명은 기존 Artifact 계약을 유지하며 deployment 도구가 다시 작성하지 않습니다.
