diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index f9773ed..fd42e20 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -1,26 +1,20 @@ # PM2 手动部署工作流 -# 手动触发 → 构建前后端 → rsync 同步 → 服务器执行 PM2 重载 +# 手动触发 → 构建 → rsync → 安装依赖 → 数据库迁移 → PM2 重载 # # 前置准备: -# 1. 服务器需安装 PM2: npm i -g pm2 -# 2. 服务器需预先启动 MySQL -# 3. 在 Gitea 仓库 Settings → Secrets 中配置以下密钥: +# 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 +# - REMOTE_DIR : 服务器项目目录,如 /opt/gongxue name: PM2 部署 on: workflow_dispatch: - inputs: - skip_build: - description: '跳过构建(仅同步 + PM2 重载)' - required: false - type: boolean - default: false jobs: deploy: @@ -35,7 +29,6 @@ jobs: node-version: '22' - name: 安装依赖 & 构建 - if: ${{ !inputs.skip_build }} run: | npm ci npm run build -w @gongxue/server @@ -68,7 +61,7 @@ jobs: --exclude='.codegraph/' \ ./ deploy-server:${{ secrets.REMOTE_DIR }}/ - - name: 安装依赖 & 数据库迁移 + - name: 安装依赖 → 迁移 → PM2 重载 run: | ssh deploy-server " cd ${{ secrets.REMOTE_DIR }} @@ -78,15 +71,10 @@ jobs: npm ci --omit=dev fi echo '执行数据库迁移...' - npm run migration:run -w @gongxue/server || echo '迁移跳过(无变更或已是最新)' - " - - - name: PM2 重载 - run: | - ssh deploy-server " - cd ${{ secrets.REMOTE_DIR }} + npm run migration:run -w @gongxue/server + echo 'PM2 重载...' pm2 startOrReload ecosystem.config.cjs --update-env pm2 save - echo '=== PM2 进程状态 ===' + echo '=== PM2 状态 ===' pm2 status " diff --git a/deploy.sh b/deploy.sh index 4cea1f1..45a0e90 100755 --- a/deploy.sh +++ b/deploy.sh @@ -1,18 +1,19 @@ #!/usr/bin/env bash # 恭学教育 — PM2 部署脚本 # 用法: ./deploy.sh [ssh_host] +# 前提: 服务器 MySQL 已在运行,PM2 已安装 set -euo pipefail SSH_HOST="${1:-tencent}" REMOTE_DIR="/opt/gongxue" -echo "=== 1/5 本地构建后端 ===" +echo "=== 1/4 本地构建后端 ===" npm run build -w @gongxue/server -echo "=== 2/5 本地构建前端 ===" +echo "=== 2/4 本地构建前端 ===" npm run build -w @gongxue/admin -echo "=== 3/5 同步到 ${SSH_HOST} ===" +echo "=== 3/4 同步到 ${SSH_HOST} ===" rsync -avz --delete \ --exclude='node_modules' \ --exclude='.git' \ @@ -22,25 +23,17 @@ rsync -avz --delete \ --exclude='.turbo/' \ ./ "${SSH_HOST}:${REMOTE_DIR}/" -echo "=== 4/5 检查 MySQL + 安装依赖 ===" +echo "=== 4/4 安装依赖 → 迁移 → PM2 重载 ===" ssh "${SSH_HOST}" " cd ${REMOTE_DIR} mkdir -p logs - # 确保 MySQL 已启动(systemd 或手动启动) - if systemctl is-active --quiet mysqld 2>/dev/null || systemctl is-active --quiet mysql 2>/dev/null; then - echo 'MySQL 已运行' - else - echo '⚠ MySQL 未运行,请确保 MySQL 已启动' - fi if [ ! -d node_modules ]; then echo '首次部署,安装依赖...' npm ci --omit=dev fi -" - -echo "=== 5/5 PM2 重载 ===" -ssh "${SSH_HOST}" " - cd ${REMOTE_DIR} + echo '执行数据库迁移...' + npm run migration:run -w @gongxue/server + echo 'PM2 重载...' pm2 startOrReload ecosystem.config.cjs --update-env pm2 save pm2 status @@ -49,13 +42,3 @@ ssh "${SSH_HOST}" " echo "" echo "部署完成!" echo "访问: http://$(ssh "${SSH_HOST}" 'hostname -I 2>/dev/null | awk "{print \$1}" || curl -s ifconfig.me')" -echo "" -echo "══════ 首次部署/数据迁移 ══════" -echo "1) 上传旧数据库:" -echo " scp ~/Downloads/dorm_billing_*.sql.gz ${SSH_HOST}:${REMOTE_DIR}/" -echo "2) 服务器上执行:" -echo " ssh ${SSH_HOST}" -echo " cd ${REMOTE_DIR}" -echo " cp .env.example .env && vim .env # 改密码" -echo " sudo setcap 'cap_net_bind_service=+ep' \$(which node)" -echo " ./migrate.sh dorm_billing_*.sql.gz # 迁移旧数据"