ec33aedd79
ci/woodpecker/push/woodpecker Pipeline failed
- Fix standalone path: dist/standalone/novalon-website/ - Update static files path: dist/static - Replace curl with wget in health checks (Alpine compatibility) - Add monitoring and optimization scripts - Configure external network for docker-compose This resolves the deployment failure caused by Next.js 16's new standalone output structure.
87 lines
2.4 KiB
Bash
87 lines
2.4 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 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
|