Files
novalon-website/scripts/deploy-production.sh
T
张翔 ec33aedd79
ci/woodpecker/push/woodpecker Pipeline failed
fix(docker): adapt Dockerfile.prod for Next.js 16 standalone output structure
- 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.
2026-03-30 09:04:51 +08:00

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