#!/bin/bash set -e DEPLOY_DIR="/home/novalon/docker-app/novalon-website" BACKUP_DIR="/home/novalon/backups/novalon-website" TIMESTAMP=$(date +%Y%m%d_%H%M%S) echo "==========================================" echo "Novalon Website 部署脚本" echo "时间: $(date)" echo "==========================================" cd $DEPLOY_DIR echo "" echo "=== Step 1: 备份当前版本 ===" mkdir -p $BACKUP_DIR if [ -d "dist" ]; then tar -czf $BACKUP_DIR/dist_$TIMESTAMP.tar.gz dist public package.json package-lock.json 2>/dev/null || echo "备份完成(部分文件可能不存在)" echo "✅ 备份已保存到: $BACKUP_DIR/dist_$TIMESTAMP.tar.gz" else echo "⚠️ 没有找到dist目录,跳过备份" fi echo "" echo "=== Step 2: 构建Docker镜像 ===" docker build -t novalon-website:$TIMESTAMP -t novalon-website:latest -f Dockerfile.prod . echo "✅ 镜像构建完成: novalon-website:$TIMESTAMP" echo "" echo "=== Step 3: 停止旧容器 ===" if docker ps -a | grep -q novalon-website; then docker-compose down echo "✅ 旧容器已停止" else echo "⚠️ 没有找到旧容器" fi echo "" echo "=== Step 4: 启动新容器 ===" docker-compose up -d echo "✅ 新容器已启动" echo "" echo "=== Step 5: 等待服务启动 ===" sleep 10 echo "" echo "=== Step 6: 健康检查 ===" for i in {1..30}; do if wget -q --spider http://localhost:3000/api/health 2>/dev/null; then echo "✅ 健康检查通过!" echo "" echo "=== Step 7: 清理旧镜像 ===" docker image prune -f docker images novalon-website --format "{{.ID}} {{.CreatedAt}}" | tail -n +4 | awk '{print $1}' | xargs -r docker rmi -f 2>/dev/null || true echo "" echo "==========================================" echo "✅ 部署成功!" echo "版本: $TIMESTAMP" echo "时间: $(date)" echo "==========================================" exit 0 fi echo "等待服务就绪... ($i/30)" sleep 2 done echo "" echo "❌ 健康检查失败,开始回滚..." if [ -f "$BACKUP_DIR/dist_$TIMESTAMP.tar.gz" ]; then tar -xzf $BACKUP_DIR/dist_$TIMESTAMP.tar.gz -C $DEPLOY_DIR docker-compose down docker-compose up -d sleep 10 if wget -q --spider http://localhost:3000/api/health 2>/dev/null; then echo "✅ 回滚成功" else echo "❌ 回滚也失败了!" fi else echo "⚠️ 没有找到备份文件,无法回滚" fi exit 1