From 1154887aab6401590174d44e53f0a19b7845c265 Mon Sep 17 00:00:00 2001 From: shunli Date: Tue, 28 Jul 2026 22:39:43 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95OCR=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=B8=8E=E9=83=A8=E7=BD=B2=E6=A0=B9=E6=94=B6?= =?UTF-8?q?=E6=95=9B=E6=96=B9=E6=A1=88=EF=BC=8807-28-travel-reimbursement-?= =?UTF-8?q?guide=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design.md | 9 +++++++ .../implement.md | 24 ++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/.trellis/tasks/07-28-travel-reimbursement-guide/design.md b/.trellis/tasks/07-28-travel-reimbursement-guide/design.md index ee0baaa8..af85ea76 100644 --- a/.trellis/tasks/07-28-travel-reimbursement-guide/design.md +++ b/.trellis/tasks/07-28-travel-reimbursement-guide/design.md @@ -15,6 +15,14 @@ - provider 从 `mock` 直接切换为 `tencent` 只能发生在服务开通、权限、计费状态和密钥均确认后。任一前置失败时保持禁止真实票据上传,不用 mock 代替真实能力。 - 计费只使用 `RecognizeGeneralInvoice` 对应的通用票据识别(高级版)每月 1,000 次专用免费包,不接独立火车票接口。生产固定中国大陆地域;控制台确认免费包已到账、后付费关闭,并配置费用或余额告警。免费包耗尽时服务失败关闭,应用记录额度类可解释终态,不自动付费续用。 +### 生产部署根收敛 + +- 生产只读核验发现,活动 Compose 的工作目录被错误设置成标准部署根下的 `deploy/trialrun` 子目录,导致仓库再次同步到自身子目录,形成重复的 `deploy/trialrun/deploy/trialrun`。活动 server、环境文件和四个 systemd 运维 timer 均已引用该嵌套拓扑,因此它不是可直接删除的闲置副本。 +- 本次发布把部署根收敛回 deploy 脚本约定的标准单层根。迁移窗口开始时先暂停相关 timer,将当前活动根原子改名为时间戳回退目录,再创建干净标准根;不在原目录上用 `rsync --delete` 就地清理,以免同时破坏活动配置与回退证据。 +- 从回退目录把生产环境文件复制到标准根的预期相对位置,保持所有者和 `0600` 权限,不读取、打印或经本地中转 Secret。数据库和附件继续使用部署根之外的既有宿主目录,不搬迁、不初始化、不重置。 +- 使用同一 Compose project 和已批准提交部署 server;数据库容器与数据卷保持原位,不创建 worker。部署后重新安装自动备份 daily/watchdog/drill-reminder 与 WARCH3 timer,使所有 WorkingDirectory、ExecStart 和环境文件引用只指向标准根。 +- 验收包括活动 Compose 工作目录不再重复、环境文件唯一受控、server `/ready` 和构建标识正确、provider 为 `tencent`、仅一个 job executor、四个 timer 启用且各自 dry/status 检查通过。旧根作为短期回退保留,本任务不删除;后续删除需在新备份成功且另行批准后执行。 + ## 腾讯 API 合同 - API:`RecognizeGeneralInvoice`,版本 `2018-11-19`,由当前腾讯 Node SDK 调用。 @@ -46,6 +54,7 @@ - adapter 聚焦测试、配置 smoke、腾讯调用或任一真实样票验证失败:停止开放真实票据,不继续制造 pending/retry 数据。 - 若新配置导致运行异常,恢复变更前环境文件的受控副本并重建同一 server;回退后不得使用 mock 处理真实票据。 +- 若标准根部署、timer 重装或健康检查失败,停止继续发布,将 Compose 工作目录和 systemd unit 恢复到时间戳回退根并重建原 server;数据库和附件目录不参与回退切换。 - 样票失败记录使用可解释状态和脱敏摘要,不直接修改数据库字段绕过状态机。 ## 历史凭证结论 diff --git a/.trellis/tasks/07-28-travel-reimbursement-guide/implement.md b/.trellis/tasks/07-28-travel-reimbursement-guide/implement.md index d99cdbd6..f5305a91 100644 --- a/.trellis/tasks/07-28-travel-reimbursement-guide/implement.md +++ b/.trellis/tasks/07-28-travel-reimbursement-guide/implement.md @@ -3,9 +3,10 @@ ## 1. 外部前置门禁 - [x] 用户确认采用 OA OCR 专用最小权限子用户密钥。 -- [ ] 用户在腾讯云侧创建或轮换该专用密钥。 -- [ ] 在实际账号确认通用票据识别(高级版)每月 1,000 次专用免费包已到账,生产使用中国大陆地域。 -- [ ] 在 OCR 控制台设置页确认后付费关闭,并配置费用或余额告警;额度耗尽时接受 OCR 失败关闭。 +- [x] 用户在腾讯云侧创建该专用子用户和密钥。 +- [x] 在实际账号确认通用票据识别(高级版)每月 1,000 次专用免费包已到账,生产配置使用中国大陆地域。 +- [x] 在 OCR 控制台设置页确认后付费关闭;额度耗尽时接受 OCR 失败关闭。 +- [ ] 配置费用或余额告警作为二次兜底。 - [ ] 确认腾讯 OCR 服务和 `ocr:RecognizeGeneralInvoice` 最小权限可用,不接独立火车票接口。 - [ ] 确认住宿电子普通发票和铁路电子客票各一份 PDF 样票的测试授权及仓库外受控位置;不得向 Codex 或聊天提供票据。 @@ -20,11 +21,22 @@ ## 3. 生产配置 -- [ ] 对当前生产环境文件制作受控、限权、短期回退副本,不输出内容。 -- [ ] 由用户在现场终端静默写入 `OCR_PROVIDER=tencent` 及专用凭证;地域沿用核验后的配置。 -- [ ] 脱敏检查 provider、凭证非空、环境文件权限和配置合同。 +- [x] 对当前生产环境文件制作受控、限权、短期回退副本,不输出内容。 +- [x] 由用户在现场终端静默写入 `OCR_PROVIDER=tencent` 及专用凭证;地域设置为中国大陆地域。 +- [x] 脱敏检查 provider、凭证非空、环境文件权限和配置合同。 - [ ] 仅重建实际执行 jobs 的 server,不启动独立 worker。 +### 3.1 生产部署根收敛 + +- [x] 只读确认活动 Compose、生产环境文件和四个运维 timer 均引用重复嵌套部署根。 +- [ ] 暂停相关 timer,将活动根原子改名为时间戳回退目录,并建立干净标准单层部署根。 +- [ ] 把生产环境文件在远端复制到标准相对位置,保持所有者和 `0600` 权限;不回显或经本地传输 Secret。 +- [ ] 使用 `DEPLOY_DATA_MODE=existing`、既有外置数据库/附件宿主目录和同一 Compose project 发布批准提交;不得初始化数据或创建 worker。 +- [ ] 重新安装 daily、watchdog、drill-reminder 和 WARCH3 timer,确认 unit 不再引用重复目录。 +- [ ] 验证 `/ready`、构建标识、单一 job executor、四个 timer 状态和一次受控备份/新鲜度检查;旧根仅保留作短期回退,不在本任务删除。 + +回退点:标准根发布或任一 timer 验收失败,恢复时间戳回退根及原 unit 引用并重建原 server;数据库和附件宿主目录不移动、不重置。 + 回退点:外部依赖 smoke 前若任一配置门禁失败,恢复变更前环境文件并重建 server;保持真实票据禁止上传。 ## 4. 生产与真实能力验证