fix: 修复自动部署脚本
- 修正健康检查端口为 9000 - 增加等待时间到 30 秒 - 增加重试次数到 10 次 - 排除 venv 和 .git 目录的备份 - 只保留最近 3 个备份
This commit is contained in:
@@ -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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# 执行
|
# 执行
|
||||||
|
|||||||
Reference in New Issue
Block a user