# ct 현장 준비와 수동 재부팅 전 검증

기록: 2026-09-30 17:43:10 KST / ltb1021 / test / work-session.
수정 전 HEAD: `bc93be6fc42e9c2bb5196b980b015ba2e81a7869`.
상태: `PREBOOT_READY · ACTUAL REBOOT WAIT · FIELD ACTIVATION WAIT`.

## 적용

- 연결 버전 저장 뒤 파일을 다시 읽고 저장된 값을 출력한다. 저장 전 auto 출력으로 인한 혼동을 없앴다.
- 발급 응답의 `error.details.reason`은 CERTIFICATE 단계의 고정 allowlist만 전달한다.
  원문 message, 경로, 임의 reason, 비밀번호·token은 출력하지 않는다.
- stage 결과 기록과 ct 오류 안내까지 reason을 연결했다. Web signer 미설정/서명 실패에는
  Web 점검과 기존 stage/session 보존을 안내하며 cancel·버전증가·새 CA로 우회하지 않는다.
- 프로필 직접 편집 안내와 준비/성공 버전 표시의 핵심 한국어 문구를 보완했다. 전체 번역은 아니다.
- 현장 공개 CA를 기존 백업에서 별도 field private 파일로 복사했다. 공개 CA/유효기간/chain 검증 PASS.
- 현장 계정은 사용자가 명시한 값과 이전 검증이 일치하는 변경 없는 보호 저장값을 읽어
  field 전용 파일로 분리 저장했다. 비밀번호를 코드/argv/문서/로그로 재출력하지 않았다.
  office 계정·CA·세션, selected profile, NIC와 실행 transaction은 변경하지 않았다.
- private directory는 si 소유700, 계정 파일600이며 si 읽기 확인. 현장 Web 로그인은 하지 않았다.

## 부팅 확인

- Docker와 Contextra systemd unit enabled. Runtime unit은 Docker와 데이터 bind mount 뒤에 기동한다.
- 컨테이너별 restart 정책은 기존 no 유지. mount/transaction 보호를 우회하는 always를 추가하지 않았다.
- maintenance guard와 데이터 mount guard PASS, 미완료 field/apply/network pending 없음.
- `/backup`과 `/training`은 UUID 기반 fstab에서 부팅 때 생성되는 mount unit이다.
  최초 정적 `systemd-analyze verify`는 generator 경로를 보지 않아 backup.mount 없음으로 실패했다.
  실제 generated unit 경로를 포함한 재검사는 PASS. fstab/unit 내용은 변경하지 않았다.
- NIC 준비 대기는 기존60초를 유지한다. DHCP 주소가 실행 설정과 달라지면 기동 보호가 중단하는 것이 정상이다.
  60초 뒤에도 주소가 없거나 다른 주소면 콘솔에서 확인하고 수동 복구한다. 무제한 재시작하지 않는다.
- Web 일시 장애는 기존 Auth의 제한된 간격 backoff를 유지하고, 인증/계약/TLS 오류는 수동 대응한다.
  Web이 실제로 다시 WSS를 연결하는지는 사용자 재부팅 시험으로 확인한다.
- 회사망 ARP는 kernel 임시 예외 그대로이며 재부팅 후 소실된다. 영구 등록이나 현장 복제는 하지 않았다.

## 검증 범위

1. Python3.12 recovery 표적26건 PASS. 저장 후 값/비밀값 차단/phase 범위/결과 기록/오류 안내 포함.
2. manifest 표적4건 PASS, source-only67파일 검증 PASS. 전체 회귀·새 image build 없음.
3. 현장 도구5파일 exact 이전 hash 대조·console lock·백업 후 교체, 설치 hash readback PASS.
4. 실행 active/site/inflight/Compose/unit/NIC/office 자료 지문 및5개 컨테이너 ID/image/running 상태 보존.
5. 설치본 parser fixture, version status, ARP status, field 계정·CA 읽기 PASS. fixture는 실제 실패 요청이 아니다.
6. 실제 WSS connected/auth error없음. 새 로그인/서비스 재시작/카메라 조작/실제 재부팅0회.

설치 백업은 `/var/lib/contextra-maintenance/field/install-preboot-20260930T174257/`이다.
이전 파일은 `.before`, 대상 경로/지문은 `before.json`, 결과는 `receipt.json`에 있다.
복구 필요 시 후속 변경 여부를 대조해 해당 도구만 복구한다. 인증/DB/자료를 일괄 되돌리지 않는다.

## 다음 사용자 단계

- 물리 콘솔 또는 si 터미널에서 `sudo reboot`. 강제 전원 차단이 아닌 정상 재부팅이다.
- 다시 로그인되면 `ct start`부터 실행하지 않는다. `ct status`, `ct auth status`로 자동 기동을 관측한다.
- SSH가 안 되면 콘솔의 `ip -4 -br addr`로 DHCP 주소를 확인한다. 주소가 바뀌면 보존한 안내에 따라 대응한다.
- 서비스는 기동됐는데 회사 Web 연결만 실패하면 `ct net arp status`로 확인하고,
  해당 회사 Web에 대해 독립 검증된 MAC만 명시적으로 임시 설정한다. 이 결과는 순수 자동복구와 구분한다.
- 이후 WSS/모델/Redis·카메라1개 수동 Start/Stop. 실제 field 전환과 PDF는 별도 요청을 기다린다.

원자료: `/tmp/codex/ltb1021/2026-09-30_icerti-preboot_r01/`.
영구 보존: `/data/codex-artifacts/contextra/field-maintenance/2026/2026-09-30_ct-preboot_r01/`.
이전 ct-reuse-preservation_r01은 덮어쓰지 않는다. 새 묶음에 side 포트 수정과 이번 변경을 함께 보존한다.
