diff --git a/spug/deploy-docker-compose.sh b/spug/deploy-docker-compose.sh index b3fca52..e6523e5 100644 --- a/spug/deploy-docker-compose.sh +++ b/spug/deploy-docker-compose.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Spug Docker Compose 自动部署脚本 +# Spug Docker Compose 自动部署脚本 - 直接粘贴到 Spug 执行 # 用途:使用 docker-compose 快速部署医院绩效考核系统 set -e @@ -26,104 +26,88 @@ export FRONTEND_PORT="${FRONTEND_PORT:-80}" export DOCKER_TAG="${DOCKER_TAG}" # 日志配置 -LOG_FILE="${LOG_FILE:-/var/log/spug/deploy-docker-compose.log}" -mkdir -p /var/log/spug 2>/dev/null || true +LOG_FILE="/tmp/spug-deploy-$(date +%Y%m%d_%H%M%S).log" -# ==================== 工具函数 ==================== -log() { - local level=$1 - shift - local timestamp=$(date '+%Y-%m-%d %H:%M:%S') - echo "[${timestamp}] [${level}] $*" | tee -a "${LOG_FILE}" -} +echo "========================================" +echo "Spug Docker Compose 自动部署开始" +echo "项目目录:${PROJECT_DIR}" +echo "Git 分支:${GIT_BRANCH}" +echo "========================================" -info() { log "INFO" "$@"; } -error() { log "ERROR" "$@"; } -success() { log "SUCCESS" "$@"; } +# ================= Step 1: 更新代码 ================= +echo "========== 更新代码 ==========" +cd "${PROJECT_DIR}" -# ==================== 主流程 ==================== -main() { - info "========================================" - info "Spug Docker Compose 自动部署开始" - info "项目目录:${PROJECT_DIR}" - info "Git 分支:${GIT_BRANCH}" - info "========================================" - - # 进入项目目录 - cd "${PROJECT_DIR}" - - # 更新代码 - info "========== 更新代码 ==========" - if [ ! -d ".git" ]; then - info "首次部署,克隆仓库..." - git clone "${GIT_REPO}" . - git checkout "${GIT_BRANCH}" +if [ ! -d ".git" ]; then + echo "首次部署,克隆仓库..." + git clone "${GIT_REPO}" . + git checkout "${GIT_BRANCH}" +else + echo "更新现有代码..." + git fetch origin "${GIT_BRANCH}" + git reset --hard "origin/${GIT_BRANCH}" + git clean -fd +fi + +commit_hash=$(git rev-parse --short HEAD) +commit_msg=$(git log -1 --pretty=format:"%s") +echo "✅ 代码更新完成,当前版本:${commit_hash} - ${commit_msg}" + +# ================= Step 2: 停止旧容器 ================= +echo "========== 停止旧服务 ==========" +if docker-compose ps &>/dev/null; then + docker-compose down || true + echo "✅ 旧服务已停止" +else + echo "未发现运行中的服务" +fi + +# ================= Step 3: 构建 Docker 镜像 ================= +echo "========== 构建 Docker 镜像 ==========" +docker-compose build --no-cache +echo "✅ Docker 镜像构建完成" + +# ================= Step 4: 启动新容器 ================= +echo "========== 启动新容器 ==========" +docker-compose up -d +echo "✅ 容器启动成功" + +# ================= Step 5: 等待并健康检查 ================= +echo "========== 执行健康检查 ==========" +echo "等待服务启动..." +sleep 15 + +max_attempts=10 +attempt=1 + +while [ $attempt -le $max_attempts ]; do + if curl -f -s "http://localhost:${BACKEND_PORT}/api/v1/health" > /dev/null 2>&1; then + echo "✅ 后端 API 健康检查通过" + break else - info "更新现有代码..." - git fetch origin "${GIT_BRANCH}" - git reset --hard "origin/${GIT_BRANCH}" - git clean -fd - fi - - commit_hash=$(git rev-parse --short HEAD) - commit_msg=$(git log -1 --pretty=format:"%s") - success "✓ 代码更新完成,当前版本:${commit_hash} - ${commit_msg}" - - # 停止旧容器 - info "========== 停止旧服务 ==========" - if docker-compose ps &>/dev/null; then - docker-compose down || true - success "✓ 旧服务已停止" - else - info "未发现运行中的服务" - fi - - # 构建镜像 - info "========== 构建 Docker 镜像 ==========" - docker-compose build --no-cache - - # 启动服务 - info "========== 启动服务 ==========" - docker-compose up -d - - # 等待服务启动 - info "等待服务启动..." - sleep 15 - - # 健康检查 - info "========== 执行健康检查 ==========" - max_attempts=10 - attempt=1 - - while [ $attempt -le $max_attempts ]; do - if curl -f -s "http://localhost:${BACKEND_PORT}/api/v1/health" > /dev/null 2>&1; then - success "✓ 后端 API 健康检查通过" - break - else - if [ $attempt -eq $max_attempts ]; then - error "✗ 后端 API 健康检查失败" - docker-compose logs backend - exit 1 - fi - info "后端服务未就绪,等待... (${attempt}/${max_attempts})" - sleep 5 - attempt=$((attempt + 1)) + if [ $attempt -eq $max_attempts ]; then + echo "❌ 后端 API 健康检查失败" + echo "最近日志如下:" + docker-compose logs backend | tail -n 50 + exit 1 fi - done - - # 查看状态 - info "========== 服务状态 ==========" - docker-compose ps - - # 清理旧镜像 - info "========== 清理旧镜像 ==========" - docker image prune -f - - info "========================================" - success "🎉 Docker Compose 部署成功完成!" - info "后端地址:http://localhost:${BACKEND_PORT}" - info "前端地址:http://localhost:${FRONTEND_PORT}" - info "========================================" -} + echo "后端服务未就绪,等待... (${attempt}/${max_attempts})" + sleep 5 + attempt=$((attempt + 1)) + fi +done -main "$@" +# ================= Step 6: 查看状态 ================= +echo "========== 服务状态 ==========" +docker-compose ps + +# ================= Step 7: 清理 ================= +echo "========== 清理旧镜像 ==========" +docker image prune -f +echo "✅ 清理完成" + +echo "========================================" +echo "🎉 Docker Compose 部署成功完成!" +echo "后端地址:http://localhost:${BACKEND_PORT}" +echo "前端地址:http://localhost:${FRONTEND_PORT}" +echo "========================================"