name: Deploy Next.js to Baota (Standalone) on: push: branches: - soul-content # 你的分支名 jobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3 - name: Set up Node.js uses: actions/setup-node@v3 with: node-version: 22 - name: Install pnpm run: npm install -g pnpm - name: Install dependencies run: pnpm install - name: Build project (standalone mode) run: pnpm build env: NODE_ENV: production - name: Package standalone output run: | # 创建临时打包目录 mkdir -p /tmp/deploy_package # 复制 standalone 目录内容 cp -r .next/standalone/* /tmp/deploy_package/ # 复制 static 目录 mkdir -p /tmp/deploy_package/.next/static cp -r .next/static/* /tmp/deploy_package/.next/static/ # 复制 public 目录 cp -r public /tmp/deploy_package/ 2>/dev/null || true # 复制 PM2 配置文件 cp ecosystem.config.cjs /tmp/deploy_package/ # 打包 cd /tmp/deploy_package tar -czf /tmp/deploy.tar.gz . cd - - name: Deploy to server via SCP uses: appleboy/scp-action@master with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USERNAME }} key: ${{ secrets.SSH_PRIVATE_KEY }} source: "/tmp/deploy.tar.gz" target: "/tmp/" strip_components: 0 - name: Extract and restart on server uses: appleboy/ssh-action@master with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USERNAME }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd /www/wwwroot/soul # 备份当前版本(可选) if [ -d ".next" ]; then echo "备份当前版本..." tar -czf /tmp/soul_backup_$(date +%Y%m%d_%H%M%S).tar.gz .next public ecosystem.config.cjs server.js package.json 2>/dev/null || true fi # 清理旧文件(保留 node_modules 如果存在) rm -rf .next public ecosystem.config.cjs server.js package.json 2>/dev/null || true # 解压新版本 echo "解压新版本..." tar -xzf /tmp/deploy.tar.gz -C /www/wwwroot/soul # 验证关键文件 if [ ! -f "server.js" ]; then echo "错误: server.js 不存在,部署失败" exit 1 fi if [ ! -d ".next/static" ]; then echo "警告: .next/static 目录不存在" fi # 设置权限 chmod +x server.js 2>/dev/null || true # 重启 PM2 应用 echo "重启 PM2 应用..." pm2 restart soul || pm2 start ecosystem.config.cjs || pm2 start server.js --name soul --env production # 清理临时文件 rm -f /tmp/deploy.tar.gz echo "部署完成!" - name: Verify deployment uses: appleboy/ssh-action@master with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USERNAME }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | pm2 list pm2 logs soul --lines 10 --nostream || echo "无法获取日志"