From 8f6bf174d9bd0e936518613a4fe5ac017e770b1c Mon Sep 17 00:00:00 2001 From: jmj Date: Thu, 28 May 2026 22:48:20 +0900 Subject: [PATCH] =?UTF-8?q?fix(deploy):=20.env=20=EC=97=90=20.env.example?= =?UTF-8?q?=20=EC=8B=A0=EA=B7=9C=20=ED=82=A4=20=EC=9E=90=EB=8F=99=20sync?= =?UTF-8?q?=20=E2=80=94=20backend=20=EB=B6=80=ED=8C=85=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=20=EB=B0=A9=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 배경: PR #27 머지 후 self-hosted runner 가 자동 발화해 backend 컨테이너를 빌드/실행 했으나 Exit (1) 로 31시간 방치됨. 원인: - PR #27 이 .env.example 에 backend 비밀값 16개 (JWT_SECRET, ENCRYPTION_KEY, ...) 를 추가 - 원격 서버 .env 는 이미 존재 → 기존 워크플로우 'Ensure .env exists' 단계가 cp .env.example .env 를 skip → .env 에 새 키들 부재 - docker-compose 의 \${JWT_SECRET:-} 가 빈 문자열을 Spring 에 주입 (env 가 unset 이 아니라 set-but-empty 상태로 전달됨) - Spring SecurityProperties / GithubOAuthProperties 의 @NotBlank 검증 실패 수정: - Secret 주입 단계 직후, .env.example 에 있지만 .env 에 없는 키 목록을 추출해 default 값과 함께 .env 끝에 append (기존 값은 절대 덮어쓰지 않음) - "# ---- synced from .env.example by deploy-app.yml ----" 주석으로 구분 - awk 한 블럭 — 외부 의존성 없음 검증 (로컬 dry run): - 기존 .env (POSTGRES_PASSWORD=mysecret123, LLM_API_KEY=abc) 보존 - .env.example 에만 있던 JWT_SECRET, ENCRYPTION_KEY, NEW_KEY append 확인 오늘 원격 .env 는 이미 수동 복구되어 backend healthy. 본 PR 머지 이후로는 .env.example 신규 키 추가 시 자동 sync 되어 같은 사고 반복 없음. --- .github/workflows/deploy-app.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/deploy-app.yml b/.github/workflows/deploy-app.yml index 6f207f24..9193348d 100644 --- a/.github/workflows/deploy-app.yml +++ b/.github/workflows/deploy-app.yml @@ -62,6 +62,24 @@ jobs: fi chmod 600 .env + # .env.example 에 추가됐는데 .env 에 없는 키는 default 와 함께 append. + # 이 단계가 없으면 docker-compose 의 ${VAR:-} 가 빈 문자열을 주입해 Spring 의 + # @NotBlank 검증을 깨뜨림 (예: JWT_SECRET, ENCRYPTION_KEY 누락 → backend exit 1). + appended=$(mktemp) + awk -F= ' + NR==FNR && /^[A-Z_]+=/ { existing[$1] = 1; next } + /^[A-Z_]+=/ && !($1 in existing) { print } + ' .env .env.example > "$appended" + if [ -s "$appended" ]; then + echo " sync new keys from .env.example:" + cut -d= -f1 "$appended" | sed 's/^/ + /' + echo "" >> .env + echo "# ---- synced from .env.example by deploy-app.yml ----" >> .env + cat "$appended" >> .env + chmod 600 .env + fi + rm -f "$appended" + # 같은 키를 .env 에 upsert. 값이 비어있으면 skip (기존 값 유지). upsert_env() { local key="$1"