diff --git a/auto-update.sh b/auto-update.sh index debbd32..cfd13a4 100755 --- a/auto-update.sh +++ b/auto-update.sh @@ -8,6 +8,9 @@ set -e LOG_FILE="/var/log/pit-router-update.log" REPO_DIR="/www/wwwroot/pit-router" BACKUP_DIR="/www/wwwroot/pit-router-backups" +HEALTH_PORT=9000 +HEALTH_RETRIES=10 +HEALTH_INTERVAL=10 # 日志函数 log() { @@ -19,12 +22,18 @@ 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 + # 只备份关键配置,不备份 venv + tar -czf "$BACKUP_DIR/$BACKUP_NAME" \ + --exclude='venv' \ + --exclude='__pycache__' \ + --exclude='*.pyc' \ + --exclude='.git' \ + -C "$(dirname $REPO_DIR)" "$(basename $REPO_DIR)" 2>/dev/null || true log "备份创建: $BACKUP_NAME" - # 只保留最近 5 个备份 + # 只保留最近 3 个备份 cd "$BACKUP_DIR" - ls -t | tail -n +6 | xargs rm -f 2>/dev/null || true + ls -t | tail -n +4 | xargs rm -f 2>/dev/null || true cd "$REPO_DIR" fi } @@ -34,16 +43,38 @@ rollback() { log "⚠️ 开始回滚..." LATEST_BACKUP=$(ls -t "$BACKUP_DIR" | head -1) if [ -n "$LATEST_BACKUP" ]; then + # 先停止当前容器 + docker-compose down 2>/dev/null || true + + # 解压备份(只恢复配置文件) cd "$BACKUP_DIR" - tar -xzf "$LATEST_BACKUP" -C "$(dirname $REPO_DIR)" + tar -xzf "$LATEST_BACKUP" -C "$(dirname $REPO_DIR)" --overwrite 2>/dev/null || true cd "$REPO_DIR" - docker-compose -f docker-compose.prod.yaml up -d + + # 重新构建并启动 + docker-compose build --no-cache 2>&1 | tail -3 + docker-compose up -d + log "✅ 回滚完成" else log "❌ 没有可用的备份" fi } +# 健康检查 +health_check() { + local count=0 + while [ $count -lt $HEALTH_RETRIES ]; do + if curl -sf http://localhost:$HEALTH_PORT/health > /dev/null 2>&1; then + return 0 + fi + count=$((count + 1)) + log "健康检查重试 $count/$HEALTH_RETRIES..." + sleep $HEALTH_INTERVAL + done + return 1 +} + # 主流程 main() { log "========== 🚀 开始自动更新 ==========" @@ -65,42 +96,32 @@ main() { # 3. 停止旧容器 log "🛑 停止旧容器..." - docker-compose -f docker-compose.prod.yaml down 2>/dev/null || true + docker-compose down 2>/dev/null || true # 4. 构建新镜像 log "🔨 构建新镜像..." - docker-compose -f docker-compose.prod.yaml build --no-cache 2>&1 | tail -5 + docker-compose build --no-cache 2>&1 | tail -5 # 5. 启动新容器 log "🚀 启动新容器..." - docker-compose -f docker-compose.prod.yaml up -d + docker-compose up -d - # 6. 等待健康检查 + # 6. 等待服务启动 log "⏳ 等待服务启动..." - sleep 15 + sleep 30 # 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 + if health_check; then + log "✅ 更新成功!服务运行正常" + log "========== 🎉 更新完成 ==========" + exit 0 + else + log "❌ 健康检查失败!" + rollback + log "========== ⚠️ 更新失败,已回滚 ==========" + exit 1 + fi } # 执行