fix(ops): 加固部署/代理/迁移脚本,生产环境安全默认

由 OCR(open-codereview.ai,deepseek-v4-flash)审查驱动修复:
- serve-proxy:API_TARGET 生效、SPA 404 语义、流式静态文件、hop-by-hop/超时/断连/穿越防护
- migrate.sh:密码不进 argv/不泄漏 pm2、原子锁防重入、DML-only 事务说明、就绪诊断
- deploy.sh/CI:保护 .env、总是 npm ci(迁移依赖 devDeps)、健康检查、并发锁
- ecosystem/oxlint/.env.example:优雅停机、React 版本对齐、TRUST_PROXY 说明

Reviewed-by: OCR (open-codereview.ai)
This commit is contained in:
2026-08-09 21:29:22 +08:00
parent 9565a0f23c
commit 3bcad138a1
7 changed files with 476 additions and 57 deletions

View File

@@ -16,6 +16,10 @@ name: PM2 部署
on:
workflow_dispatch:
concurrency:
group: deploy
cancel-in-progress: false
jobs:
deploy:
runs-on: ubuntu-latest
@@ -37,7 +41,10 @@ jobs:
- name: 配置 SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key
# 单引号 EOF 防止 key 中的 $ / 反引号被 shell 插值YAML 会剥掉缩进bash 实际收到列首 EOF
cat > ~/.ssh/deploy_key <<'EOF'
${{ secrets.SSH_PRIVATE_KEY }}
EOF
chmod 600 ~/.ssh/deploy_key
cat >> ~/.ssh/config <<'EOF'
Host deploy-server
@@ -59,17 +66,20 @@ jobs:
--exclude='.turbo/' \
--exclude='.claude/' \
--exclude='.codegraph/' \
--exclude='.env*' \
--exclude='data.sql' \
--exclude='uploads/' \
./ deploy-server:${{ secrets.REMOTE_DIR }}/
- name: 安装依赖 → 迁移 → PM2 重载
run: |
ssh deploy-server "
set -e
cd ${{ secrets.REMOTE_DIR }}
mkdir -p logs
if [ ! -d node_modules ]; then
echo '首次部署,安装生产依赖...'
npm ci --omit=dev
fi
echo '安装依赖...'
# 注意migration:run 依赖 ts-node/tsconfig-pathsdevDependencies不能 --omit=dev
npm ci
echo '执行数据库迁移...'
npm run migration:run -w @gongxue/server
echo 'PM2 重载...'