fix: 修复自动部署脚本

- 修正健康检查端口为 9000
- 增加等待时间到 30 秒
- 增加重试次数到 10 次
- 排除 venv 和 .git 目录的备份
- 只保留最近 3 个备份
This commit is contained in:
2026-03-15 08:16:53 +08:00
parent 899914d0a0
commit b1f430aa3b

View File

@@ -8,6 +8,9 @@ set -e
LOG_FILE="/var/log/pit-router-update.log" LOG_FILE="/var/log/pit-router-update.log"
REPO_DIR="/www/wwwroot/pit-router" REPO_DIR="/www/wwwroot/pit-router"
BACKUP_DIR="/www/wwwroot/pit-router-backups" BACKUP_DIR="/www/wwwroot/pit-router-backups"
HEALTH_PORT=9000
HEALTH_RETRIES=10
HEALTH_INTERVAL=10
# 日志函数 # 日志函数
log() { log() {
@@ -19,12 +22,18 @@ backup() {
if [ -d "$REPO_DIR" ]; then if [ -d "$REPO_DIR" ]; then
mkdir -p "$BACKUP_DIR" mkdir -p "$BACKUP_DIR"
BACKUP_NAME="pit-router-$(date '+%Y%m%d-%H%M%S').tar.gz" 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" log "备份创建: $BACKUP_NAME"
# 只保留最近 5 个备份 # 只保留最近 3 个备份
cd "$BACKUP_DIR" 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" cd "$REPO_DIR"
fi fi
} }
@@ -34,16 +43,38 @@ rollback() {
log "⚠️ 开始回滚..." log "⚠️ 开始回滚..."
LATEST_BACKUP=$(ls -t "$BACKUP_DIR" | head -1) LATEST_BACKUP=$(ls -t "$BACKUP_DIR" | head -1)
if [ -n "$LATEST_BACKUP" ]; then if [ -n "$LATEST_BACKUP" ]; then
# 先停止当前容器
docker-compose down 2>/dev/null || true
# 解压备份(只恢复配置文件)
cd "$BACKUP_DIR" 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" 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 "✅ 回滚完成" log "✅ 回滚完成"
else else
log "❌ 没有可用的备份" log "❌ 没有可用的备份"
fi 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() { main() {
log "========== 🚀 开始自动更新 ==========" log "========== 🚀 开始自动更新 =========="
@@ -65,42 +96,32 @@ main() {
# 3. 停止旧容器 # 3. 停止旧容器
log "🛑 停止旧容器..." log "🛑 停止旧容器..."
docker-compose -f docker-compose.prod.yaml down 2>/dev/null || true docker-compose down 2>/dev/null || true
# 4. 构建新镜像 # 4. 构建新镜像
log "🔨 构建新镜像..." 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. 启动新容器 # 5. 启动新容器
log "🚀 启动新容器..." log "🚀 启动新容器..."
docker-compose -f docker-compose.prod.yaml up -d docker-compose up -d
# 6. 等待健康检查 # 6. 等待服务启动
log "⏳ 等待服务启动..." log "⏳ 等待服务启动..."
sleep 15 sleep 30
# 7. 健康检查 # 7. 健康检查
log "🏥 健康检查..." log "🏥 健康检查..."
MAX_RETRIES=5 if health_check; then
RETRY_COUNT=0 log "✅ 更新成功!服务运行正常"
log "========== 🎉 更新完成 =========="
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do exit 0
if curl -sf http://localhost:1999/health > /dev/null 2>&1; then else
log "✅ 更新成功!服务运行正常" log "❌ 健康检查失败!"
log "========== 🎉 更新完成 ==========" rollback
exit 0 log "========== ⚠️ 更新失败,已回滚 =========="
fi exit 1
fi
RETRY_COUNT=$((RETRY_COUNT + 1))
log "重试 $RETRY_COUNT/$MAX_RETRIES..."
sleep 5
done
# 健康检查失败,回滚
log "❌ 健康检查失败!"
rollback
log "========== ⚠️ 更新失败,已回滚 =========="
exit 1
} }
# 执行 # 执行