From 824d07b685081161a21270990146395de1fa969f Mon Sep 17 00:00:00 2001 From: minsuhan1 Date: Wed, 24 Sep 2025 06:13:27 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=F0=9F=90=9B=20=EB=B0=B0=ED=8F=AC=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=20=EC=8A=A4=EC=9C=84=EC=B9=AD=20=EC=8B=9C=20?= =?UTF-8?q?nginx.conf=20=EC=97=85=EC=8A=A4=ED=8A=B8=EB=A6=BC=EC=97=90?= =?UTF-8?q?=EC=84=9C=EB=8F=84=20=EC=84=9C=EB=B2=84=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EC=8A=A4=EC=9C=84=EC=B9=AD=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/docker-compose.yml | 2 +- backend/scripts/blue-green-deploy.sh | 111 ++++++++++++++++++++++----- 2 files changed, 93 insertions(+), 20 deletions(-) diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml index 15d6518..bf91ef0 100644 --- a/backend/docker-compose.yml +++ b/backend/docker-compose.yml @@ -46,5 +46,5 @@ services: networks: app-network: - external: true name: fastapi-shared-network + driver: bridge diff --git a/backend/scripts/blue-green-deploy.sh b/backend/scripts/blue-green-deploy.sh index b3771b7..8856caf 100755 --- a/backend/scripts/blue-green-deploy.sh +++ b/backend/scripts/blue-green-deploy.sh @@ -65,11 +65,53 @@ health_check() { return 1 } +# Nginx 설정 업데이트 함수 +update_nginx_config() { + local active_color=$1 + local nginx_config="$REPOSITORY/nginx.conf" + local temp_config="$REPOSITORY/nginx.conf.temp" + + echo "🔧 Nginx 설정을 $active_color 환경으로 업데이트 중..." + + # 백업 생성 + cp "$nginx_config" "$nginx_config.backup" + + # 임시 파일로 복사 + cp "$nginx_config" "$temp_config" + + if [ "$active_color" = "blue" ]; then + # Blue 활성화, Green 비활성화 + sed -i 's/server fastapi-blue:8000.*$/server fastapi-blue:8000 max_fails=3 fail_timeout=30s; # Blue 환경/' "$temp_config" + sed -i 's/server fastapi-green:8000.*$/# server fastapi-green:8000 max_fails=3 fail_timeout=30s; # Green 환경 (비활성)/' "$temp_config" + else + # Green 활성화, Blue 비활성화 + sed -i 's/server fastapi-blue:8000.*$/# server fastapi-blue:8000 max_fails=3 fail_timeout=30s; # Blue 환경 (비활성)/' "$temp_config" + sed -i 's/.*server fastapi-green:8000.*$/server fastapi-green:8000 max_fails=3 fail_timeout=30s; # Green 환경/' "$temp_config" + fi + + # 편집된 파일을 원래 위치로 복사 + cp "$temp_config" "$nginx_config" + rm -f "$temp_config" + + echo "✅ Nginx 설정 업데이트 완료 ($active_color 활성)" +} + +# Nginx 재시작 함수 +restart_nginx() { + echo "🔄 Nginx 재시작 중..." + + if docker-compose -f docker-compose.yml restart nginx; then + echo "✅ Nginx 재시작 성공!" + sleep 3 # nginx가 완전히 시작될 때까지 대기 + return 0 + else + echo "❌ Nginx 재시작 실패!" + return 1 + fi +} + # Nginx 시작 함수 start_nginx_if_needed() { - # 공유 네트워크 생성 (이미 있으면 무시됨) - docker network create fastapi-shared-network 2>/dev/null || true - if ! docker ps | grep -q "nginx"; then echo "🌐 Nginx 로드 밸런서 시작..." # nginx만 단독으로 시작 @@ -111,23 +153,54 @@ if [ -n "$EXIST_AFTER" ]; then # 헬스체크 수행 if health_check $AFTER_COMPOSE_COLOR; then - echo "🔄 이전 $BEFORE_COMPOSE_COLOR 환경을 종료합니다..." - - # 이전 컨테이너 종료 - docker-compose -p ${DOCKER_APP_NAME}-${BEFORE_COMPOSE_COLOR} -f docker-compose.yml down 2>/dev/null || true - echo "✅ $BEFORE_COMPOSE_COLOR 환경이 종료되었습니다." + echo "🔄 Nginx 설정을 $AFTER_COMPOSE_COLOR 환경으로 전환..." - echo "" - echo "🎉 Blue/Green 배포 완료!" - echo "📊 배포 결과:" - echo " - 새로운 활성 환경: $AFTER_COMPOSE_COLOR" - echo " - 종료된 환경: $BEFORE_COMPOSE_COLOR" - echo " - 배포 시간: $(date)" - - # 최종 상태 확인 - echo "" - echo "🔍 최종 컨테이너 상태:" - docker-compose -p ${DOCKER_APP_NAME}-${AFTER_COMPOSE_COLOR} -f docker-compose.yml ps + # Nginx 설정 업데이트 + if update_nginx_config $AFTER_COMPOSE_COLOR && restart_nginx; then + echo "✅ Nginx 설정 전환 완료!" + + # 전환 후 최종 헬스체크 (nginx를 통한) + echo "🔍 Nginx를 통한 최종 헬스체크..." + if curl -f http://localhost:80/api/health > /dev/null 2>&1; then + echo "✅ Nginx를 통한 헬스체크 성공!" + else + echo "⚠️ Nginx를 통한 헬스체크 실패, 하지만 계속 진행..." + fi + + echo "🔄 이전 $BEFORE_COMPOSE_COLOR 환경을 종료합니다..." + + # 이전 컨테이너 종료 + docker-compose -p ${DOCKER_APP_NAME}-${BEFORE_COMPOSE_COLOR} -f docker-compose.yml down 2>/dev/null || true + echo "✅ $BEFORE_COMPOSE_COLOR 환경이 종료되었습니다." + + echo "" + echo "🎉 Blue/Green 배포 완료!" + echo "📊 배포 결과:" + echo " - 새로운 활성 환경: $AFTER_COMPOSE_COLOR" + echo " - 종료된 환경: $BEFORE_COMPOSE_COLOR" + echo " - 배포 시간: $(date)" + + # 최종 상태 확인 + echo "" + echo "🔍 최종 컨테이너 상태:" + docker-compose -p ${DOCKER_APP_NAME}-${AFTER_COMPOSE_COLOR} -f docker-compose.yml ps + else + echo "❌ Nginx 설정 전환 실패! 롤백 중..." + # Nginx 설정 롤백 + cp "$REPOSITORY/nginx.conf.backup" "$REPOSITORY/nginx.conf" 2>/dev/null || true + restart_nginx + + # 컨테이너도 롤백 + docker-compose -p ${DOCKER_APP_NAME}-${AFTER_COMPOSE_COLOR} -f docker-compose.yml down 2>/dev/null || true + + if [ "$BEFORE_COMPOSE_COLOR" != "none" ]; then + echo "🔄 이전 $BEFORE_COMPOSE_COLOR 환경을 복구합니다..." + docker-compose -p ${DOCKER_APP_NAME}-${BEFORE_COMPOSE_COLOR} -f docker-compose.yml up -d fastapi-${BEFORE_COMPOSE_COLOR} + fi + + echo "❌ 배포 실패! 롤백 완료." + exit 1 + fi else echo "❌ $AFTER_COMPOSE_COLOR 환경 헬스체크 실패!"