# R4 部署预检记录(2026-05-10) **文档状态**:R4 只读预检证据。 **执行范围**:`issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv` 的 R4。 **结论**:`BLOCKED`。远端服务健康、迁移状态和 Caddy 基础状态正常,但远端运行时代码未能核对到本轮 release candidate,R5 不能开始。 ## 1. 边界 - 本轮未部署。 - 本轮未修改远端 `.env`。 - 本轮未执行 migration、seed、备份创建、服务重启或生产数据写入。 - 本轮未读取、打印、提交真实密码、JWT secret、企业微信 secret、腾讯 OCR secret 或数据库连接串明文。 - 企业微信真机、公网真实账号登录和真实 OCR 样票验证仍属于 R5;本轮只停留在 readiness 检查。 ## 2. 版本口径 | 项目 | 结果 | | --- | --- | | 部署准备最新提交 | `2bab4e5 R3 完成权限直连审计` | | 业务运行时代码基线 | `537e608 A8 完成首轮主线总回归门禁` | | `537e608..2bab4e5` 差异 | 仅包含测试、文档和 Issue CSV;不包含业务运行时代码变更 | | 远端目录 | `/opt/hyb-oa-trialrun` 存在 | | 远端版本来源 | 远端不是 git 工作树,无法用 `git rev-parse` 直接确认版本 | 关键运行时文件哈希抽查结果: | 文件 | 结论 | | --- | --- | | `server/src/services/workspaceSettings.js` | `BLOCKED`:远端与 `537e608/2bab4e5` 不一致 | | `client/src/components/navigation/NavLinks.tsx` | `BLOCKED`:远端与 `537e608/2bab4e5` 不一致 | | `server/src/routes/workflow.js` | `BLOCKED`:远端与 `537e608/2bab4e5` 不一致 | | `server/src/routes/reimbursements.js` | 一致 | | `server/src/routes/invoicePool.js` | 一致 | | `server/src/routes/wecomAuth.js` | 一致 | | `server/src/routes/leave.js` | 一致 | | `server/src/routes/purchaseRequests.js` | 一致 | | `server/src/routes/contractsRegistry.js` | 一致 | | `server/src/routes/projects.js` | 一致 | 判定:远端当前可运行,但不能宣称已经是本轮 release candidate。由于不一致文件覆盖审批中心和权限导航护栏,按 R4 规则必须停止在预检阶段,先拆部署版本同步治理 Issue。 ## 3. 本地只读检查 | 检查项 | 结果 | | --- | --- | | `git status --short` | R4 开始前干净 | | `git log --oneline -5` | 最新提交为 `2bab4e5`,其后为 `60adbcf`、`537e608`、`a18d477`、`d6ee25f` | | `node deploy/trialrun/validate-env-contract.js` | PASS;检查服务 `server/worker/init`,`config.js` env 键数 121,`.env.example` env 键数 135 | | `node scripts/qa/check-live-smoke-env.mjs` | public `/ready` 为 200;企业微信 config 为 ready;`liveSmokeReady=false`;`liveOcrReady=false` | | live smoke 缺项 | 缺 `LIVE_SMOKE_ADMIN_IDENTIFIER/PASSWORD`、`LIVE_SMOKE_EMPLOYEE_IDENTIFIER/PASSWORD`、OCR live 登录或样票环境变量 | | `node scripts/qa/check-public-bundle-copy.mjs https://oa.hyinda.com` | scanned=54,focused=4,findings=0 | | Issue CSV 校验 | 通过 | | 公网 `/ready` | 200,`data.ok=true` | | 公网企业微信 config | 200;响应字段不包含 `secret`;`enabled/entryEnabled/oauthEnabled=true` | ## 4. 远端只读检查 | 检查项 | 结果 | | --- | --- | | SSH 用户 | `deploy@118.89.77.218` 可连接 | | 服务器 | `VM-0-13-debian` | | 部署目录 | `/opt/hyb-oa-trialrun` 存在 | | git 工作树 | `no`;当前部署方式仍按 rsync 文件树判断 | | compose 文件 | `deploy/trialrun/docker-compose.yml` 存在 | | env 文件 | `deploy/trialrun/.env` 存在 | | compose 工具 | `docker-compose 1.29.2` | | 容器状态 | `hyb-oa-trialrun-server` Up;`hyb-oa-trialrun-db` Up 且 healthy | | 远端本机 `/ready` | `http://127.0.0.1:3000/ready` 返回 200 | | Prisma migrate status | 46 migrations found;`Database schema is up to date!` | | 备份目录 | `deploy/trialrun/backups` 存在 | | 最近备份 | 2026-05-06 有 DB dump 和 storage tar;2026-05-05 有 DB dump、storage tar 和 feature flags CSV | | 文件存储目录 | `deploy/trialrun/data/storage` 存在 | | 最近 server 日志摘要 | 抽样只看到 `/ready` 和企业微信 config 探活请求;未见迁移 drift 或服务启动失败摘要 | 远端环境变量只做存在性、布尔值和非空长度检查,未打印 secret 明文: | 范围 | 结果 | | --- | --- | | 基础域名与安全 | `APP_ORIGIN=https://oa.hyinda.com`,`COOKIE_SECURE=true`,`PUBLIC_SECURITY_HARDENING_ENABLED=true` | | 运行与存储 | `OCR_PROVIDER=tencent`,`STORAGE_DRIVER=local`,`JOB_DRIVER=pgboss`,`SERVE_CLIENT_DIST=true` | | 企业微信 | `WECOM_ENABLED/WECOM_ENTRY_ENABLED/WECOM_OAUTH_ENABLED=true`;`WECOM_CORP_ID/WECOM_AGENT_ID/WECOM_AGENT_SECRET` 非空 | | OCR | `TENCENT_SECRET_ID/TENCENT_SECRET_KEY/TENCENT_OCR_REGION` 非空 | | 核心 secret | `JWT_SECRET/POSTGRES_PASSWORD/DATABASE_URL/FIELD_ENCRYPTION_KEY` 非空 | ## 5. Caddy 只读检查 | 检查项 | 结果 | | --- | --- | | SSH 用户 | `root@118.89.77.218` 可连接 | | Caddy systemd | `active` 且 `enabled` | | Caddy 配置校验 | `Valid configuration` | | OA 站点块 | `/etc/caddy/Caddyfile` 包含 `oa.hyinda.com` | | 反代目标 | `/etc/caddy/Caddyfile` 包含 `reverse_proxy 127.0.0.1:3000` | | 443 监听 | `caddy` 正在监听 `*:443` | ## 6. R4 判定 R4 未通过,保持 `DOING/TODO/TODO`,原因是远端运行时代码与本轮 release candidate 不一致,且远端不是 git 工作树,无法用提交号直接证明当前运行版本。 不一致不应在 R4 内通过远端手工修补解决。建议下一步先审批并执行部署版本同步治理: - 确认同步目标仍为 `2bab4e5`,运行时代码基线仍为 `537e608`。 - 部署前复核备份和回滚路径。 - 使用既有 `deploy/trialrun/deploy.sh` 或批准后的等效流程同步远端文件树、构建并执行部署脚本内置 smoke。 - 部署后重新执行 R4 只读预检;通过后才进入 R5 live smoke。 ## 7. SKIP 与禁止项 - `SKIP`:真实公网账号登录,原因是缺 `LIVE_SMOKE_*`。 - `SKIP`:真实 OCR 样票,原因是缺 OCR live 文件或目录环境变量。 - `SKIP`:企业微信手机真机,原因是 R5 才执行。 - 禁止在 R4 内继续部署、重启、迁移、修改 `.env` 或写生产数据。 ## 8. D1-D2 后续复核(2026-05-10) 执行合同:`issues/2026-05-10_13-20-38-deployment-version-sync-governance.csv`。 | 项目 | 结果 | | --- | --- | | D1 版本差异复核 | `DONE`:`537e608..2bab4e5` 仍仅包含测试、文档和 Issue CSV,不包含业务运行时代码变更 | | D1 远端哈希复核 | 与 R4 一致:`workspaceSettings.js`、`NavLinks.tsx`、`workflow.js` 未对齐,其余抽查运行时文件一致 | | D1 结论 | 同步目标仍固定为 `2bab4e5`;业务运行时代码基线仍为 `537e608`;不采用远端手工补丁 | | D2 备份目录 | 远端 `deploy/trialrun/backups` 存在 | | D2 最近备份 | 2026-05-10 13:43 已创建 `hyb-oa-db-20260510_134340.dump`(2691566 bytes)和 `hyb-oa-storage-20260510_134341.tar.gz`(2610057 bytes) | | D2 回滚路径 | runbook 已包含 DB/storage 备份、恢复、仅代码回滚和 DB 回滚步骤 | | D2 结论 | `DONE`:部署前新近备份已创建;D3 受控同步 release candidate 仍需用户单独批准 | D3 受控同步 release candidate 仍未执行。R5 live smoke 仍保持 `TODO/SKIP`。