#!/bin/bash # ============================================ # 丹阳公益婚恋服务平台 — 一键部署脚本 # ============================================ # 用法: # ./scripts/deploy.sh # 部署最新镜像 # ./scripts/deploy.sh v1.2.3 # 部署指定版本 # ./scripts/deploy.sh --rollback # 回滚到上一版本 # ============================================ set -euo pipefail VERSION="${1:-latest}" ACTION="${2:-deploy}" COMPOSE_FILE="${COMPOSE_FILE:-../infrastructure/docker-compose.prod.yml}" GIT_REPO="${GIT_REPO:-https://github.com/danyang-match/platform.git}" echo "============================================" echo " 丹阳公益婚恋服务平台 — 部署脚本" echo " 版本: ${VERSION} | 动作: ${ACTION}" echo "============================================" # 检查环境变量 if [ -z "${DOCKER_REGISTRY:-}" ]; then echo "警告: DOCKER_REGISTRY 未设置,将使用本地构建" fi # 进入基础设施目录 cd "$(dirname "$0")/.." case "${ACTION}" in deploy) echo "[1/4] 拉取最新代码..." if [ -d ".git" ]; then git fetch origin git checkout main || git checkout master git pull --ff-only fi echo "[2/4] 构建并启动服务..." # 设置版本号 export APP_VERSION="${VERSION}" docker compose -f "${COMPOSE_FILE}" up -d --build --pull always echo "[3/4] 等待服务健康检查..." sleep 10 docker compose -f "${COMPOSE_FILE}" ps | grep -E "backend|postgres|redis" || true echo "[4/4] 验证健康状态..." curl -sf "http://localhost/api/v1/health/live" && echo " ✅ 后端健康" || echo " ❌ 后端不健康" curl -sf "http://localhost/version" && echo " ✅ 版本信息" || echo " ❌ 版本接口失败" echo "" echo "✅ 部署完成!版本: ${VERSION}" echo " 访问地址: https://match.danyang.gov.cn/admin/" ;; rollback) echo "[1/2] 回滚到上一版本..." # 查找上一个 image tag PREV_VERSION=$(docker images --format '{{.Tag}}' danyang-match-backend 2>/dev/null | grep -v "^latest$" | sort -V | tail -2 | head -1) if [ -z "${PREV_VERSION}" ]; then echo "错误: 找不到可回滚的镜像版本" exit 1 fi echo " 回滚版本: ${PREV_VERSION}" export APP_VERSION="${PREV_VERSION}" docker compose -f "${COMPOSE_FILE}" up -d --no-build backend echo "[2/2] 验证回滚..." sleep 5 curl -sf "http://localhost/api/v1/health/live" && echo " ✅ 回滚成功" || echo " ❌ 回滚后不健康" ;; *) echo "用法: $0 [version] [deploy|rollback]" echo "示例:" echo " $0 v1.2.3 deploy" echo " $0 rollback" exit 1 ;; esac