# PM2 手动部署工作流 # 手动触发 → 构建 → rsync → 安装依赖 → 数据库迁移 → PM2 重载 # # 前置准备: # 1. 服务器 MySQL 已在运行 # 2. 服务器已安装 PM2: npm i -g pm2 # 3. Gitea 仓库 Settings → Secrets 配置: # - SSH_PRIVATE_KEY : 部署用 SSH 私钥 # - SSH_HOST : 服务器地址 # - SSH_USER : SSH 用户名 # - SSH_PORT : SSH 端口(默认 22,可选) # - REMOTE_DIR : 服务器项目目录,如 /opt/gongxue name: PM2 部署 on: workflow_dispatch: jobs: deploy: runs-on: ubuntu-latest steps: - name: 检出代码 uses: actions/checkout@v4 - name: 安装 Node.js uses: actions/setup-node@v4 with: node-version: '22' - name: 安装依赖 & 构建 run: | npm ci npm run build -w @gongxue/server npm run build -w @gongxue/admin - name: 配置 SSH run: | mkdir -p ~/.ssh echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key chmod 600 ~/.ssh/deploy_key cat >> ~/.ssh/config <<'EOF' Host deploy-server HostName ${{ secrets.SSH_HOST }} User ${{ secrets.SSH_USER }} Port ${{ secrets.SSH_PORT || '22' }} IdentityFile ~/.ssh/deploy_key StrictHostKeyChecking accept-new EOF - name: 同步代码到服务器 run: | rsync -avz --delete \ --exclude='node_modules' \ --exclude='.git' \ --exclude='*.db' \ --exclude='.DS_Store' \ --exclude='logs/' \ --exclude='.turbo/' \ --exclude='.claude/' \ --exclude='.codegraph/' \ ./ deploy-server:${{ secrets.REMOTE_DIR }}/ - name: 安装依赖 → 迁移 → PM2 重载 run: | ssh deploy-server " cd ${{ secrets.REMOTE_DIR }} mkdir -p logs if [ ! -d node_modules ]; then echo '首次部署,安装生产依赖...' npm ci --omit=dev fi echo '执行数据库迁移...' npm run migration:run -w @gongxue/server echo 'PM2 重载...' pm2 startOrReload ecosystem.config.cjs --update-env pm2 save echo '=== PM2 状态 ===' pm2 status "