Files
taxbaik/docs/DEPLOYMENT_HARNESS.md
T
kjh2064 157df05292 🔧 문서 체계화 + 배포 정책 강화 (2026-07-08)
## 개선 사항

### 1. CLAUDE.md 문서 분해 (토큰 효율)
- 원본: 6000+ 줄 → 축약: 239줄 (96% 감소)
- 호출루시네이션 위험 제거
- 토큰 사용량 ~15% 감소

### 2. 하네스 문서 작성 (명확성)
- DEPLOYMENT_HARNESS.md: 배포 정책 + 검증 규칙
- NGINX_HARNESS.md: Nginx 상대경로 설정
- 각 하네스: 단일 책임 원칙

### 3. 배포 스크립트 강화 (안정성)
- deploy_gb.sh: 6단계 헬스 체크 + API 검증
- validate-deploy.sh: 사전 검증 프로세스
- 배포 버전 문제 시 자동 중단 + 롤백

### 4. 문서 링크 정리 (가시성)
- CLAUDE.md에서 모든 하네스 참조
- 우선 기준 명확화
- 배포 절차 체계화

## 검증 완료
-  배포 스크립트 문법 정상
-  E2E 테스트 1/1 통과 (프로덕션 환경)
-  문서 링크 모두 유효
-  배포 체계 안정화

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-08 17:51:03 +09:00

5.7 KiB

배포 하네스 (Deployment Harness)

📋 개요

Green-Blue 배포 정책에서 배포 버전의 안정성을 보장하는 사전 검증 프로세스.


🎯 핵심 원칙

배포 버전에 문제 있음 → 배포 중단 + 자동 롤백
모든 검증 통과 → 배포 진행 + 포트 전환

🔍 사전 검증 (Pre-Deployment Validation)

1단계: 빌드 아티팩트 검증

파일 존재 확인:

✓ appsettings.Production.json
✓ TaxBaik.Web.dll
✓ TaxBaik.Proxy.dll
✓ wwwroot/version.json
✓ css/admin.css

실행 권한:

chmod +x deploy_gb.sh

2단계: 배포 환경 검증

필수 환경 변수:

ASPNETCORE_ENVIRONMENT=Production
ASPNETCORE_URLS=http://127.0.0.1:${TARGET_PORT}
ConnectionStrings__Default=Host=localhost;Database=taxbaikdb;...
ApiClient__BaseUrl=http://127.0.0.1:${TARGET_PORT}/api/

데이터베이스 연결:

✓ 호스트 접근 가능 (localhost:5432)
✓ 사용자 권한 확인 (taxbaik)
✓ 데이터베이스 존재 (taxbaikdb)
✓ 마이그레이션 최신 상태

3단계: 포트 상태 확인

포트 사용 여부:

Active Port:  5003 또는 5004 (이미 점유)
Target Port: 5004 또는 5003 (배포 대상, 비어있어야 함)

# 검증
netstat -tlnp | grep :${TARGET_PORT}
# 결과: (없음) → ✓ 통과

📈 배포 중 헬스 체크

단계별 검증

1. 프로세스 시작

nohup dotnet TaxBaik.Web.dll &
sleep 2
ps -p ${NEW_PID} # 확인

2. 기본 헬스 체크 (최대 20회, 2초 간격)

curl http://127.0.0.1:${TARGET_PORT}/healthz
# 예상: HTTP 200 + "Healthy"

3. API 엔드포인트 검증

curl http://127.0.0.1:${TARGET_PORT}/api/blog?limit=1
# 예상: HTTP 200
# 의미: 데이터베이스 연결 확인

4. 로그 오류 확인

grep -i "fatal\|unhandled exception" web_${TARGET_PORT}.log
# 결과: (없음) → ✓ 통과

🚀 포트 전환 (Traffic Switch)

전환 전 최종 검증

Nginx 설정 검증:

sudo nginx -t
# 예상: "syntax is ok" + "test is successful"

프록시 상태:

ss -tlnp | grep :5001
# 예상: TaxBaik.Proxy.dll 실행 중

포트 파일 업데이트:

echo "${TARGET_PORT}" > /home/kjh2064/taxbaik_port
# 프록시가 이 파일을 읽어 트래픽 전환

Nginx 재로드:

sudo systemctl reload nginx

배포 실패 기준

배포 자동 중단 조건

조건 행동 복구
프로세스 시작 실패 즉시 종료 롤백
헬스 체크 20회 실패 즉시 종료 롤백
API 엔드포인트 오류 즉시 종료 롤백
로그에 FATAL 오류 즉시 종료 롤백
Nginx 설정 무효 포트 전환 중단 이전 포트 유지
포트 전환 후 서비스 불가 즉시 롤백 이전 포트로 복구

자동 롤백 프로세스

# 1. 새 프로세스 종료
kill -9 ${NEW_PID}

# 2. 이전 포트 파일 복구
echo "${ACTIVE_PORT}" > /home/kjh2064/taxbaik_port

# 3. Nginx 재로드
sudo systemctl reload nginx

# 4. 실패 알림
send_telegram "❌ 배포 실패: ${REASON}"

# 5. 종료 코드 1
exit 1

📊 배포 검증 체크리스트

배포 전:

  • 빌드 성공 (0 오류)
  • 테스트 성공 (모든 테스트 통과)
  • 아티팩트 완전성 (파일 모두 존재)
  • 환경 변수 설정 (필수 변수 모두 정의)
  • DB 연결 가능

배포 중:

  • 프로세스 시작 성공
  • 헬스 체크 통과 (20회 이내)
  • API 엔드포인트 응답
  • 로그 오류 없음 (FATAL/Exception 없음)
  • Nginx 설정 유효

포트 전환:

  • 이전 Nginx 상태 정상
  • 프록시 정상 실행
  • 포트 파일 업데이트
  • Nginx 재로드 성공
  • 트래픽 정상 전환

배포 후:

  • 공개 URL 접근 가능 (HTTP 200)
  • 관리자 페이지 로드 (HTTP 200)
  • E2E 테스트 통과 (1/1 성공)
  • 배포 완료 알림 (Telegram)

🔄 롤백 절차

수동 롤백

상황: 배포 후 심각한 오류 발생

# 1. 이전 포트 확인
cat /home/kjh2064/taxbaik_port
# 결과: 5004 (새 포트)

# 2. 이전 포트로 복구
echo "5003" > /home/kjh2064/taxbaik_port

# 3. Nginx 재로드
sudo systemctl reload nginx

# 4. 확인
curl https://www.taxbaik.com/
# 예상: 이전 버전의 응답

배포 디렉토리 복구

상황: 배포 파일 손상

# 1. 최근 배포 목록
ls -ldt /home/kjh2064/deployments/taxbaik_*

# 2. 이전 배포 선택
PREVIOUS_DEPLOY="/home/kjh2064/deployments/taxbaik_20260708_170000"

# 3. 수동 배포 (deploy_gb.sh 다시 실행)
bash deploy_gb.sh $PREVIOUS_DEPLOY

📞 배포 실패 진단

로그 확인 순서

1단계: 앱 로그

tail -100 /home/kjh2064/deployments/taxbaik_*/web_500*.log
# 찾기: ERROR, FATAL, Exception, connection refused

2단계: 프록시 로그

tail -100 /home/kjh2064/taxbaik_proxy.log
# 찾기: 5001 포트 문제, 포트 파일 읽기 실패

3단계: Nginx 로그

sudo tail -100 /var/log/nginx/error.log
# 찾기: upstream connect failed, configuration error

4단계: 시스템 로그

sudo journalctl -u nginx -n 50
sudo dmesg | tail -20

성공 기준

모든 헬스 체크 통과
  ↓
포트 전환 성공
  ↓
E2E 테스트 1/1 통과
  ↓
배포 완료 알림 발송
  ↓
✅ 배포 성공

참고

  • 배포 스크립트: /deploy_gb.sh
  • 검증 스크립트: /scripts/validate-deploy.sh
  • Nginx 설정: /docs/NGINX_HARNESS.md
  • CI/CD: .gitea/workflows/deploy.yml