#!/bin/bash # ============================================================================= # 企微IT智能服务台 — 蓝绿部署切换脚本 # ============================================================================= # 用法: # ./switch-blue-green.sh status # 查看当前环境 # ./switch-blue-green.sh to-blue # 切换到 Blue 环境 # ./switch-blue-green.sh to-green # 切换到 Green 环境 # ./switch-blue-green.sh deploy # 部署到 Green 环境(先构建再启动) # ./switch-blue-green.sh rollback # 回滚(切换到另一环境) # ============================================================================= set -e # 配置 COMPOSE_FILE="docker-compose.yml" COMPOSE_FILE_GREEN="docker-compose-green.yml" ACTIVE_FILE="/tmp/active_environment" ENV_FILE=".env" # 颜色 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } # 获取当前环境 get_active() { if [ -f "$ACTIVE_FILE" ]; then cat "$ACTIVE_FILE" else echo "blue" # 默认 blue fi } # 切换到指定环境 switch_to() { local env=$1 local current=$(get_active) if [ "$env" = "$current" ]; then log_warn "当前已是 $env 环境,无需切换" return fi # 切换 Nginx upstream log_info "切换 Nginx upstream 到 $env..." # 这里需要根据实际情况修改 Nginx 配置 # 简化版:直接通过端口切换 echo "$env" > "$ACTIVE_FILE" log_info "已切换到 $env 环境" } # 部署到 Green 环境 deploy_green() { log_info "开始部署到 Green 环境..." # 检查 docker-compose-green.yml 是否存在 if [ ! -f "$COMPOSE_FILE_GREEN" ]; then log_error "配置文件不存在: $COMPOSE_FILE_GREEN" exit 1 fi # 停止现有 Green 容器(如果存在) log_info "停止现有 Green 容器..." docker compose -f "$COMPOSE_FILE_GREEN" down 2>/dev/null || true # 构建并启动 log_info "构建 Green 环境镜像..." docker compose -f "$COMPOSE_FILE_GREEN" build log_info "启动 Green 环境服务..." docker compose -f "$COMPOSE_FILE_GREEN" up -d # 等待健康检查 log_info "等待服务就绪..." sleep 15 # 检查状态 if docker compose -f "$COMPOSE_FILE_GREEN" ps | grep -q "healthy"; then log_info "Green 环境部署成功!" else log_warn "部分服务可能未完全就绪,请手动检查" fi } # 查看状态 show_status() { local active=$(get_active) echo "" echo "========================================" echo " 蓝绿部署状态" echo "========================================" echo " 当前活动环境: $active" echo "" echo " Blue 环境: $(docker ps --filter name=wecom_it_backend --format '{{.Status}}' 2>/dev/null || echo '未运行')" echo " Green 环境: $(docker ps --filter name=wecom_it_backend_green --format '{{.Status}}' 2>/dev/null || echo '未运行')" echo "========================================" echo "" } # 主命令 case "${1:-status}" in status) show_status ;; to-blue) switch_to blue ;; to-green) switch_to green ;; deploy) deploy_green ;; rollback) current=$(get_active) if [ "$current" = "blue" ]; then switch_to green else switch_to blue fi ;; *) echo "用法: $0 {status|to-blue|to-green|deploy|rollback}" exit 1 ;; esac