Files
novalon-website/scripts/deploy-production.sh
T
张翔 bd87cdf0e6
ci/woodpecker/push/woodpecker Pipeline failed
fix(deploy): 修复生产环境容器启动失败问题
问题:
1. Dockerfile.prod目录结构错误
   - standalone路径不正确
   - static文件路径错误
2. docker-compose.server.yml网络配置问题
   - external网络可能不存在
3. 健康检查命令不可用
   - alpine镜像缺少wget

修复:
1. Dockerfile.prod
   - 正确复制standalone目录内容
   - 将static文件复制到.next/static/
   - 安装curl用于健康检查
2. docker-compose.server.yml
   - 移除external网络依赖
   - 使用curl进行健康检查
3. deploy-production.sh
   - 使用curl替代wget
   - 备份包含Dockerfile.prod和docker-compose.server.yml
2026-03-29 19:44:43 +08:00

87 lines
2.5 KiB
Bash

#!/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 Dockerfile.prod docker-compose.server.yml 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 curl -f http://localhost:3000/api/health >/dev/null 2>&1; 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 curl -f http://localhost:3000/api/health >/dev/null 2>&1; then
echo "✅ 回滚成功"
else
echo "❌ 回滚也失败了!"
fi
else
echo "⚠️ 没有找到备份文件,无法回滚"
fi
exit 1