diff --git a/deploy.sh b/deploy.sh index a4753ff..30c2938 100755 --- a/deploy.sh +++ b/deploy.sh @@ -36,6 +36,7 @@ LOG_LINES=50; VIEW_STATUS=false; POST_DEPLOY_LOGS=false; INIT_ENV=false DEPLOY_SERVICE=false; BACKUP_PATH="" # ---------- 选项解析 ---------- +BG_TARGET="" # blue 或 green(仅 production 有效) while [[ $# -gt 0 ]]; do case "$1" in --dry-run) DRY_RUN=true ;; @@ -51,20 +52,23 @@ while [[ $# -gt 0 ]]; do --post-logs) POST_DEPLOY_LOGS=true ;; --init-env) INIT_ENV=true ;; --deploy-service) DEPLOY_SERVICE=true ;; + --target) BG_TARGET="${2:-}"; shift ;; --help|-h) echo "用法: $0 [development|production] [options]" + echo "" echo "选项:" - echo " --dry-run 预览模式" - echo " --yes, -y 跳过确认" - echo " --skip-tests 跳过部署后测试" - echo " --rollback 回滚到指定备份" - echo " --backup-list 列出可用备份" - echo " --logs [N] 查看后端日志(默认50行)" - echo " --tail [N] 实时跟踪日志" - echo " --status 查看服务状态" - echo " --post-logs 部署后显示日志" - echo " --init-env 初始化 systemd service 模板" - echo " --deploy-service 上传 systemd service 文件到服务器" + echo " --dry-run 预览模式" + echo " --yes, -y 跳过确认" + echo " --skip-tests 跳过部署后测试" + echo " --target blue|green 蓝绿部署目标(仅 production)" + echo " --rollback 回滚到指定备份" + echo " --backup-list 列出可用备份" + echo " --logs [N] 查看后端日志(默认50行)" + echo " --tail [N] 实时跟踪日志" + echo " --status 查看服务状态" + echo " --post-logs 部署后显示日志" + echo " --init-env 初始化 systemd service 模板" + echo " --deploy-service 上传 systemd service 文件到服务器" exit 0 ;; *) if [[ "$1" == "development" || "$1" == "production" ]]; then @@ -75,6 +79,15 @@ while [[ $# -gt 0 ]]; do esac; shift done +# ---------- 蓝绿目标检测 ---------- +if [ "${APP_ENV}" = "production" ] && [ -n "$BG_TARGET" ]; then + case "$BG_TARGET" in + blue) BG_PORT="4433"; BG_DIR="rust_backend_blue"; BG_SVC="rust-backend-blue.service" ;; + green) BG_PORT="4434"; BG_DIR="rust_backend_green"; BG_SVC="rust-backend-green.service" ;; + *) echo "错误: --target 只能是 blue 或 green"; exit 1 ;; + esac +fi + # ---------- 环境配置 ---------- case "${APP_ENV}" in development) @@ -86,12 +99,18 @@ case "${APP_ENV}" in DB_NAME="milkydata_dev" DB_USER="milkydata" ;; production) - REMOTE_DIR="/root/rust/rust_backend" - SERVICE_NAME="rust-backend.service" + if [ -n "$BG_TARGET" ]; then + REMOTE_DIR="/root/rust/${BG_DIR}" + SERVICE_NAME="${BG_SVC}" + BACKEND_PORT="${BG_PORT}" + else + REMOTE_DIR="/root/rust/rust_backend" + SERVICE_NAME="rust-backend.service" + BACKEND_PORT="4433" + fi TEST_DOMAIN="https://xmclassmate.top" - BACKEND_PORT="4433" DB_CONTAINER="1Panel-postgresql-FtMo" - DB_NAME="milkydata_dev" + DB_NAME="milkydata" DB_USER="milkydata" ;; esac @@ -132,7 +151,14 @@ if run_tests; then log_to_file "DEPLOY success" send_webhook "success" "部署完成" echo ""; log_info "========== 部署完成!==========" - echo -e " Git: ${GIT_VERSION}"; echo -e " 环境: ${APP_ENV}"; echo "" + echo -e " Git: ${GIT_VERSION}"; echo -e " 环境: ${APP_ENV}" + if [ -n "$BG_TARGET" ]; then + echo -e " 目标: ${BG_TARGET} (:${BG_PORT})" + echo -e "" + echo -e " ${YELLOW}切换命令:${NC}" + echo -e " ./scripts/switch-env.sh --switch ${BG_TARGET}" + fi + echo "" [ "$POST_DEPLOY_LOGS" = true ] && { echo ""; view_logs; } else log_error "========== 部署失败,已自动回滚 ==========" diff --git a/deploy/rust-backend-blue.service b/deploy/rust-backend-blue.service index 692b677..287e002 100644 --- a/deploy/rust-backend-blue.service +++ b/deploy/rust-backend-blue.service @@ -7,8 +7,8 @@ Wants=network.target Type=simple User=root Group=root -WorkingDirectory=/root/rust/rust_backend -ExecStart=/root/rust/rust_backend/rust-backend +WorkingDirectory=/root/rust/rust_backend_blue +ExecStart=/root/rust/rust_backend_blue/rust-backend Restart=always RestartSec=5 StandardOutput=journal @@ -31,7 +31,7 @@ NoNewPrivileges=yes PrivateTmp=yes ProtectSystem=strict ProtectHome=read-only -ReadWritePaths=/root/rust/rust_backend +ReadWritePaths=/root/rust/rust_backend_blue SyslogIdentifier=rust-backend-blue diff --git a/deploy/rust-backend-green.service b/deploy/rust-backend-green.service index 455ecb9..395bd5b 100644 --- a/deploy/rust-backend-green.service +++ b/deploy/rust-backend-green.service @@ -7,8 +7,8 @@ Wants=network.target Type=simple User=root Group=root -WorkingDirectory=/root/rust/rust_backend -ExecStart=/root/rust/rust_backend/rust-backend +WorkingDirectory=/root/rust/rust_backend_green +ExecStart=/root/rust/rust_backend_green/rust-backend Restart=always RestartSec=5 StandardOutput=journal @@ -31,7 +31,7 @@ NoNewPrivileges=yes PrivateTmp=yes ProtectSystem=strict ProtectHome=read-only -ReadWritePaths=/root/rust/rust_backend +ReadWritePaths=/root/rust/rust_backend_green SyslogIdentifier=rust-backend-green