Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion backend/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,5 @@ services:

networks:
app-network:
external: true
name: fastapi-shared-network
driver: bridge
111 changes: 92 additions & 19 deletions backend/scripts/blue-green-deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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만 λ‹¨λ…μœΌλ‘œ μ‹œμž‘
Expand Down Expand Up @@ -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 ν™˜κ²½ ν—¬μŠ€μ²΄ν¬ μ‹€νŒ¨!"
Expand Down
Loading