#!/bin/bash set -e DEPLOY_HOME="/home/kjh2064" PORT_FILE="$DEPLOY_HOME/taxbaik_port" TIMESTAMP=$(date +%Y%m%d_%H%M%S) echo "===== 🚀 TaxBaik Green/Blue Deployment Script =====" # 1. Determine active port ACTIVE_PORT=5003 if [ -f "$PORT_FILE" ]; then ACTIVE_PORT=$(cat "$PORT_FILE" | tr -d '[:space:]') fi # 2. Determine target port TARGET_PORT=5003 if [ "$ACTIVE_PORT" -eq 5003 ]; then TARGET_PORT=5004 else TARGET_PORT=5003 fi echo "Active Port: $ACTIVE_PORT" echo "Target Port: $TARGET_PORT" # 3. New deploy dir is passed as first argument DEPLOY_DIR="$1" if [ -z "$DEPLOY_DIR" ]; then echo "Error: Deployment directory argument required" exit 1 fi echo "Deploy Directory: $DEPLOY_DIR" # 4. Start the new app on the target port echo "=== Starting New App on Port $TARGET_PORT ===" cd "$DEPLOY_DIR" export ASPNETCORE_ENVIRONMENT=Production export ASPNETCORE_URLS="http://127.0.0.1:$TARGET_PORT" # Run dotnet process nohup /usr/bin/dotnet TaxBaik.Web.dll > "web_${TARGET_PORT}.log" 2>&1 & NEW_PID=$! sleep 2 # Verify process is running if ! ps -p $NEW_PID > /dev/null; then echo "❌ Failed to start dotnet process on port $TARGET_PORT" exit 1 fi # 5. Health Check Loop echo "=== Health Checking Port $TARGET_PORT ===" ATTEMPTS=20 SUCCESS=false for i in $(seq 1 $ATTEMPTS); do STATUS=$(curl -sf -o /dev/null -w '%{http_code}' "http://127.0.0.1:${TARGET_PORT}/taxbaik/healthz" 2>/dev/null || echo "000") if [ "$STATUS" = "200" ]; then echo "✓ Health check passed on port $TARGET_PORT (Attempt $i/$ATTEMPTS)" SUCCESS=true break fi echo " Waiting for health check... ($i/$ATTEMPTS, Status: $STATUS)" sleep 2 done if [ "$SUCCESS" = "false" ]; then echo "❌ Health check failed. Rolling back..." kill -9 $NEW_PID || true exit 1 fi # 6. Switch Traffic echo "=== Switching Traffic to Port $TARGET_PORT ===" echo "$TARGET_PORT" > "$PORT_FILE" echo "✓ Traffic routed to $TARGET_PORT" # 7. Terminate Old App echo "=== Stopping Old App on Port $ACTIVE_PORT ===" # Find PID listening on ACTIVE_PORT OLD_PID=$(ss -tlnp | grep ":$ACTIVE_PORT " | grep -oP 'pid=\K\d+' | head -n1) if [ -n "$OLD_PID" ]; then echo "Killing old process PID: $OLD_PID" kill -15 $OLD_PID || kill -9 $OLD_PID echo "✓ Old process terminated" else echo "No old process found on port $ACTIVE_PORT" fi # 8. Cleanup old deployment directories (Keep last 5) echo "=== Cleaning Up Old Deployments ===" ls -1dt $DEPLOY_HOME/deployments/taxbaik_* 2>/dev/null | tail -n +6 | xargs rm -rf 2>/dev/null || true echo "✓ Cleanup completed" echo "===== ✅ Green/Blue Deployment Completed Successfully ====="