Skip to content

chore: 프로덕션 시크릿 GitHub Secrets 정본화 및 Sync Config 동기화 파이프라인 #79

Description

@itzjb

배경

프로덕션 앱 시크릿은 서버의 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에 반영된다.

Metadata

Metadata

Assignees

Labels

chore기타 작업

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions