# 314 인프라 설정 SSOT 원칙

**상위 원칙**: [0_VALUE Infrastructure SSOT Principle](../../../../0_VALUE/02_Governance/infrastructure-ssot-principle.md)

## 1. 목적
- 인프라 핵심 설정(IP, 포트, 업스트림, 공통 URL, 환경별 엔드포인트)을 단일 출처(Single Source of Truth)로 관리한다.
- 값 변경 1건이 다수 코드/설정/문서 수정을 유발하는 구조를 제거한다.

## 1.1 상위 원칙 관계
- 상위 공통 원칙의 SSOT는 `0_VALUE/02_Governance/infrastructure-ssot-principle.md`다.
- 본 문서는 robeing 운영 구조에 맞춘 구체화 문서다.
- 원칙 충돌 시 상위 원칙을 먼저 검토하고, 예외가 필요하면 사용자에게 먼저 보고한 뒤 본 문서에 예외를 남긴다.

## 2. 원칙
### 2.1 단일 출처
- 런타임 설정의 기준 파일은 `/home/admin/infra-config/runtime.env` 단일 파일로 한다.
- 민감 정보의 기준 파일은 `/home/admin/infra-config/secrets.env` 단일 파일로 한다.

### 2.2 분리 원칙
- `runtime.env`: 비민감 운영값만 포함한다.
  - 예: 내부 IP, 포트, 서비스 호스트, 모니터 URL, 기능 플래그
- `secrets.env`: 인증/암호/키 등 민감값만 포함한다.
  - 예: JWT secret, OAuth secret, DB password 포함 URL

### 2.3 참조 원칙
- 서비스 컨테이너는 `docker-compose.yml`의 `env_file`에서 위 2개 파일을 우선 참조한다.
- 서비스별 `.env`는 “임시 로컬 오버라이드” 용도로만 사용한다.
- 운영 기본값은 코드 하드코딩으로 두지 않는다.

### 2.4 네트워크 표현 원칙
- 컨테이너 간 통신은 서비스 DNS 이름을 우선 사용한다.
- 호스트 접근이 필요한 경우에만 `host.docker.internal` 또는 운영 표준 호스트 값을 사용한다.
- 고정 IP 직접 참조는 불가피한 경계 구간에서만 허용하고, 반드시 SSOT 변수로 선언한다.

### 2.5 보안 원칙
- `runtime.env`와 `secrets.env`는 git에 커밋하지 않는다.
- 권한 최소화:
  - `runtime.env` 640 이하
  - `secrets.env` 600
  - 디렉터리 권한 제한(예: 750)

### 2.6 문서 원칙
- 트러블슈팅 문서는 “사실/조치/검증”만 기록한다.
- 영구 규칙 변경은 본 원칙 문서에만 반영한다.
- 운영 주소 변경 시, 개별 문서에 직접 IP를 추가하지 말고 SSOT 변수명을 사용한다.

## 3. 적용 기준
- 신규 서비스: 최초 구성부터 본 원칙을 강제 적용한다.
- 기존 서비스: 장애 영향도가 높은 서비스부터 단계적으로 이전한다.
- 변경 검증: `docker compose config`, health check, 실제 API 경로 응답을 모두 통과해야 적용 완료로 본다.
