배경
프로덕션 앱 시크릿은 서버의 server-secrets.env 파일에만 존재하고, 변경은 수동 SSH 편집으로 이뤄진다. 이 구조에서 "파일을 재작성하면서 기존 항목을 빠뜨리는" 유실 사고가 실제로 발생했다(TURN 자격증명·유튜브 스트림 키, 2026-08-02 — TURN은 장기간 무동작으로 이어짐). 또한 현행 파일에는 키 35개 중 진짜 시크릿이 약 10개뿐이고, 12개 이상이 server.env와 중복되어(compose env_file 로드 순서상 secrets가 이김) 실효값 추적이 어렵다.
작업
- 앱 시크릿 정본을 GitHub Secrets(
PROD_* 10종)로 이동 — "시크릿 교체 = Secret 갱신 + Sync Config 워크플로 실행"으로 절차 일원화
deploy/render-secrets.sh 신규: stdin 본문을 키 화이트리스트·형식 검증(필수 키 누락 시 무손상 중단) → 활성 세션 게이트 → 원자 교체(+.bak 백업) → 재시작 → 헬스 실패 시 복원
deploy/receive-deploy.sh: forced command에 sync-config [--dry-run] [--no-restart] verb 추가 (기존 deploy 동작 불변)
.github/workflows/sync-config.yml 신규: workflow_dispatch 전용, 본문은 SSH stdin으로만 전달(러너 로그 미출력), deploy와 동일 concurrency 그룹으로 직렬화
deploy/README.md: Secret↔env 키 매핑 표, 운영 절차, 서버 설치 절차 문서화
- 머지 후: 서버 설치(sudoers 1줄), 시크릿/비시크릿 정규화 마이그레이션(중복 제거·비시크릿 이관), dry-run→실전환 검증, 운영 문서 갱신
검증
- forced command 허용 외 입력 전부
DENIED 실사격 (기존 구축 시 관례 재현)
- 렌더 검증 케이스: 필수 키 누락 / 허용 외 키 / 형식 위반 → 전부 기존 파일 무손상 중단
- dry-run → 실동기화 →
/health·로그인·프리플라이트 기능 확인, 기존 deploy 경로 회귀 확인
- 공개 러너 로그에 시크릿 값 평문 0건
상세 설계 문서는 로컬 관리 문서로 유지한다(/docs/는 공개 레포 제외 대상). 운영에 필요한 절차·매핑은 deploy/README.md에 반영된다.
배경
프로덕션 앱 시크릿은 서버의
server-secrets.env파일에만 존재하고, 변경은 수동 SSH 편집으로 이뤄진다. 이 구조에서 "파일을 재작성하면서 기존 항목을 빠뜨리는" 유실 사고가 실제로 발생했다(TURN 자격증명·유튜브 스트림 키, 2026-08-02 — TURN은 장기간 무동작으로 이어짐). 또한 현행 파일에는 키 35개 중 진짜 시크릿이 약 10개뿐이고, 12개 이상이server.env와 중복되어(composeenv_file로드 순서상 secrets가 이김) 실효값 추적이 어렵다.작업
PROD_*10종)로 이동 — "시크릿 교체 = Secret 갱신 + Sync Config 워크플로 실행"으로 절차 일원화deploy/render-secrets.sh신규: stdin 본문을 키 화이트리스트·형식 검증(필수 키 누락 시 무손상 중단) → 활성 세션 게이트 → 원자 교체(+.bak백업) → 재시작 → 헬스 실패 시 복원deploy/receive-deploy.sh: forced command에sync-config [--dry-run] [--no-restart]verb 추가 (기존deploy동작 불변).github/workflows/sync-config.yml신규:workflow_dispatch전용, 본문은 SSH stdin으로만 전달(러너 로그 미출력), deploy와 동일 concurrency 그룹으로 직렬화deploy/README.md: Secret↔env 키 매핑 표, 운영 절차, 서버 설치 절차 문서화검증
DENIED실사격 (기존 구축 시 관례 재현)/health·로그인·프리플라이트 기능 확인, 기존deploy경로 회귀 확인상세 설계 문서는 로컬 관리 문서로 유지한다(
/docs/는 공개 레포 제외 대상). 운영에 필요한 절차·매핑은deploy/README.md에 반영된다.