#!/bin/bash # 智队中枢自动更新脚本 # 当 Gitea 仓库有新提交时自动部署 set -e # 配置 LOG_FILE="/var/log/pit-router-update.log" REPO_DIR="/www/wwwroot/pit-router" BACKUP_DIR="/www/wwwroot/pit-router-backups" # 日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # 创建备份 backup() { if [ -d "$REPO_DIR" ]; then mkdir -p "$BACKUP_DIR" BACKUP_NAME="pit-router-$(date '+%Y%m%d-%H%M%S').tar.gz" tar -czf "$BACKUP_DIR/$BACKUP_NAME" -C "$(dirname $REPO_DIR)" "$(basename $REPO_DIR)" 2>/dev/null || true log "备份创建: $BACKUP_NAME" # 只保留最近 5 个备份 cd "$BACKUP_DIR" ls -t | tail -n +6 | xargs rm -f 2>/dev/null || true cd "$REPO_DIR" fi } # 回滚函数 rollback() { log "⚠️ 开始回滚..." LATEST_BACKUP=$(ls -t "$BACKUP_DIR" | head -1) if [ -n "$LATEST_BACKUP" ]; then cd "$BACKUP_DIR" tar -xzf "$LATEST_BACKUP" -C "$(dirname $REPO_DIR)" cd "$REPO_DIR" docker-compose -f docker-compose.prod.yaml up -d log "✅ 回滚完成" else log "❌ 没有可用的备份" fi } # 主流程 main() { log "========== 🚀 开始自动更新 ==========" cd "$REPO_DIR" || exit 1 # 1. 创建备份 log "📦 创建备份..." backup # 2. 拉取最新代码 log "📥 拉取最新代码..." git fetch origin git reset --hard origin/main # 记录当前 commit COMMIT=$(git rev-parse --short HEAD) log "当前版本: $COMMIT" # 3. 停止旧容器 log "🛑 停止旧容器..." docker-compose -f docker-compose.prod.yaml down 2>/dev/null || true # 4. 构建新镜像 log "🔨 构建新镜像..." docker-compose -f docker-compose.prod.yaml build --no-cache 2>&1 | tail -5 # 5. 启动新容器 log "🚀 启动新容器..." docker-compose -f docker-compose.prod.yaml up -d # 6. 等待健康检查 log "⏳ 等待服务启动..." sleep 15 # 7. 健康检查 log "🏥 健康检查..." MAX_RETRIES=5 RETRY_COUNT=0 while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do if curl -sf http://localhost:1999/health > /dev/null 2>&1; then log "✅ 更新成功!服务运行正常" log "========== 🎉 更新完成 ==========" exit 0 fi RETRY_COUNT=$((RETRY_COUNT + 1)) log "重试 $RETRY_COUNT/$MAX_RETRIES..." sleep 5 done # 健康检查失败,回滚 log "❌ 健康检查失败!" rollback log "========== ⚠️ 更新失败,已回滚 ==========" exit 1 } # 执行 main "$@"