Commit 7118f9bf by luoqi

docs: finalize verified production index and clinic preparation

parent 584f7e9c
Pipeline #3739 failed in 0 seconds
# FridayAI 生产部署准备与实施 # FridayAI 生产部署准备与实施
> 2026-10-10 生产准备;已准备索引任务和独立密钥草稿,尚未发布生产应用、建 AI 库或修改运行配置。范围:现有 PAC + FridayAI + 独立企微中转;只接已有 5i5ya 数据,不开通 Friday SaaS,不启用宿主自动回写。 > 2026-10-10 生产准备;已建成三个索引、补齐 66 条诊所名称并准备独立密钥草稿,尚未发布生产应用、建 AI 库或修改运行配置。范围:现有 PAC + FridayAI + 独立企微中转;只接已有 5i5ya 数据,不开通 Friday SaaS,不启用宿主自动回写。
## 1. 当前生产与测试的差异 ## 1. 当前生产与测试的差异
| 项目 | 生产核查结果 / 本次处理 | | 项目 | 生产核查结果 / 本次处理 |
| --- | --- | | --- | --- |
| 应用机 | `ssh pac-friday`,`47.99.62.30:3335`,源码 `/data/pac`,`main` | | 应用机 | `ssh pac-friday`,`47.99.62.30:3335`,源码 `/data/pac`,`main` |
| 代码 | 服务器 `d9a9fda`;准备基线 `main@3b81549`,其文件内容与已验证 `test@3cd4acf` 相同。正式发布重新确认 SHA | | 代码 | 服务器 `d9a9fda`;准备基线 `main@ad25aed`,其文件内容与已验证 `test@938dff5` 相同。正式发布重新确认 SHA |
| 已运行 | `pac-pac-service-1`、`pac-pac-web-1`、`pac-pac-docs-1`;尚无 AI/中转容器 | | 已运行 | `pac-pac-service-1`、`pac-pac-web-1`、`pac-pac-docs-1`;尚无 AI/中转容器 |
| 网络 | 已有 `pac_default`;生产由独立网关访问应用机私网,测试由应用机本地 Nginx 转发 | | 网络 | 已有 `pac_default`;生产由独立网关访问应用机私网,测试由应用机本地 Nginx 转发 |
| 数据库 | 现有 RDS PostgreSQL **18.3**;端点 `fridaypac.pg.rds.aliyuncs.com:5432`。现有 `pac` 库,无 `friday_ai` 库 | | 数据库 | 现有 RDS PostgreSQL **18.3**;端点 `fridaypac.pg.rds.aliyuncs.com:5432`。现有 `pac` 库,无 `friday_ai` 库 |
| 字符集、时区 | PAC:UTF8、`LC_COLLATE=C`、`LC_CTYPE=en_US.utf8`;本次查询会话时区 `Asia/Shanghai`。AI 新库使用相同字符集/排序规则,单独设 UTC;不改 PAC 库和 RDS 全局时区 | | 字符集、时区 | PAC:UTF8、`LC_COLLATE=C`、`LC_CTYPE=en_US.utf8`;本次查询会话时区 `Asia/Shanghai`。AI 新库使用相同字符集/排序规则,单独设 UTC;不改 PAC 库和 RDS 全局时区 |
| 数据 | 唯一宿主 `jvs-dw`(5i5ya),启用;抽样患者及 manifest 均为 `tenantId=ruier-grp`。不重复首灌,不创建 `friday-market` | | 数据 | 唯一宿主 `jvs-dw`(5i5ya),启用;抽样患者及 manifest 均为 `tenantId=ruier-grp`。不重复首灌,不创建 `friday-market` |
| PAC 前置 | 未设置 `PAC_READ_SECRET`;缺 7 条迁移(含本次移除派生表);`clinic_names` 当前为空 | | PAC 前置 | 未设置 `PAC_READ_SECRET`;缺 7 条迁移(含本次移除派生表);三个大表索引已预建,`clinic_names` 已补齐 66 条 |
| 资源快照 | 约 15.4 GiB RAM、11.7 GiB 可用;`/data` 可用 151 GiB。PAC 后端当时约 2.82 GiB / 8 GiB 上限;不代表摄入/重算高峰 | | 资源快照 | 约 15.4 GiB RAM、11.7 GiB 可用;`/data` 可用 151 GiB。PAC 后端当时约 2.82 GiB / 8 GiB 上限;不代表摄入/重算高峰 |
| RDS 规模 | 统计估算约 122 万患者、4,732 万事实、4,722 万事务;连接当时 42 / 820。未执行全表计数 | | RDS 规模 | 统计估算约 122 万患者、4,732 万事实、4,722 万事务;连接当时 42 / 820。未执行全表计数 |
| 基础工具 | Compose 2.32.4,满足 raw env / override 要求;主机未发现 `psql`、`nginx`、`jq`。Node/pnpm 随镜像提供,不需要安装到主机 | | 基础工具 | Compose 2.32.4,满足 raw env / override 要求;主机未发现 `psql`、`nginx`、`jq`。Node/pnpm 随镜像提供,不需要安装到主机 |
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
| 运维:域名 | 确认 AI 生产域名与回调域名,例如 `fai.friday.tech`、`relay.friday.tech`(仅建议,尚未确认);DNS、HTTPS 证书、网关配置权限 | | 运维:域名 | 确认 AI 生产域名与回调域名,例如 `fai.friday.tech`、`relay.friday.tech`(仅建议,尚未确认);DNS、HTTPS 证书、网关配置权限 |
| 运维:网络 | 网关到应用机私网 IP 的 3103 / 3104 / 3106;仅允许网关来源,禁止公网直连。核对真实代理层数;确保应用机容器可访问 RDS、ECom、OSS、模型服务 | | 运维:网络 | 网关到应用机私网 IP 的 3103 / 3104 / 3106;仅允许网关来源,禁止公网直连。核对真实代理层数;确保应用机容器可访问 RDS、ECom、OSS、模型服务 |
| 运维:RDS | 在现有实例建独立 `friday_ai` 库和专用账号;当前 `pac` 用户没有 CREATEDB / CREATEROLE 权限。由有权限人员操作,不复用 PAC 数据库账号 | | 运维:RDS | 在现有实例建独立 `friday_ai` 库和专用账号;当前 `pac` 用户没有 CREATEDB / CREATEROLE 权限。由有权限人员操作,不复用 PAC 数据库账号 |
| 运维:备份 | PAC 发布前可恢复的 RDS 备份;AI 上线后同样纳入自动备份和恢复演练。确认大表建索引所需 RDS 磁盘、IOPS 余量与低峰窗口(本次没有云控制台权限核查) | | 运维:备份 | PAC 发布前可恢复的 RDS 备份;AI 上线后同样纳入自动备份和恢复演练。三个大表索引已经建好;仍需确认上线后的 RDS 磁盘、IOPS 余量与发布窗口(本次没有云控制台权限核查) |
| 业务 / ECom | 生产 API 地址、accessId、accessSecret、回调出口 IP、生产回调 URL 登记;确认凭据/回调能与测试隔离,不能把现有测试回调直接改成生产 | | 业务 / ECom | 生产 API 地址、accessId、accessSecret、回调出口 IP、生产回调 URL 登记;确认凭据/回调能与测试隔离,不能把现有测试回调直接改成生产 |
| 业务 / ECom | 首个验收企微号、收费/设备额度及归属企业;不能与本地/测试同时托管同一号,不能在重试时重复申请设备 | | 业务 / ECom | 首个验收企微号、收费/设备额度及归属企业;不能与本地/测试同时托管同一号,不能在重试时重复申请设备 |
| 运维:OSS | 生产 region、私有 bucket、RAM 凭据;允许必要读写及签名下载,前缀 `friday-ai-prod`。不复制测试附件和密钥 | | 运维:OSS | 生产 region、私有 bucket、RAM 凭据;允许必要读写及签名下载,前缀 `friday-ai-prod`。不复制测试附件和密钥 |
...@@ -178,7 +178,7 @@ INGRESS_ECOM_IPS=<供应商确认的生产出口IP,逗号分隔> ...@@ -178,7 +178,7 @@ INGRESS_ECOM_IPS=<供应商确认的生产出口IP,逗号分隔>
- `20261008170000_fact_host_tenant_statistics` - `20261008170000_fact_host_tenant_statistics`
- `20261009160000_remove_unused_patient_step_latest` - `20261009160000_remove_unused_patient_step_latest`
其中 3 条为热表 `CREATE INDEX CONCURRENTLY`,第 6 条含 ANALYZE。已单独启动索引准备任务,发布前按下述命令确认全部有效;提前创建索引不登记 Prisma 迁移,发布时同名 `IF NOT EXISTS` 会跳过创建并正常登记。需要 RDS 额外磁盘和 IO;索引耗时与应用停服时长分开记录。迁移先执行,成功后才替换 PAC 容器。选择低峰并确认无大批量摄入/重算;不要为了 AI 上线手动全量重算画像或召回。 其中 3 条为热表 `CREATE INDEX CONCURRENTLY`,第 6 条含 ANALYZE。2026-10-10 01:55 已完成全部索引预建并独立验证;发布前按下述命令复核全部有效;提前创建索引不登记 Prisma 迁移,发布时同名 `IF NOT EXISTS` 会跳过创建并正常登记。索引已占用约 2.73 GiB,无需再次构建;正式迁移还会执行其余 DDL 及统计采样,仍需发布窗口。迁移先执行,成功后才替换 PAC 容器。选择低峰并确认无大批量摄入/重算;不要为了 AI 上线手动全量重算画像或召回。
```bash ```bash
cd /data/pac cd /data/pac
...@@ -189,17 +189,18 @@ curl -fsS --max-time 5 http://127.0.0.1:3101/health ...@@ -189,17 +189,18 @@ curl -fsS --max-time 5 http://127.0.0.1:3101/health
迁移失败立刻停止发布。若并发索引中断,先检查 `pg_index.indisvalid` 和失败迁移;不得仅因索引同名存在就标记 applied,不使用 `migrate reset`,不盲目循环重试。 迁移失败立刻停止发布。若并发索引中断,先检查 `pg_index.indisvalid` 和失败迁移;不得仅因索引同名存在就标记 applied,不使用 `migrate reset`,不盲目循环重试。
5i5ya 诊所字典已于 2026-10-10 补齐,共 66 条,无需重复执行。日后需要刷新名称时,可单独运行:
```bash ```bash
# 生产 clinic_names 当前为空;从现有 DW 派生字典,不重新摄入患者。
docker exec pac-pac-service-1 node dist/cli/refresh-clinic-names.cli.js \ docker exec pac-pac-service-1 node dist/cli/refresh-clinic-names.cli.js \
--dir=./data/jvs-dw --host=jvs-dw --dir=./data/jvs-dw --host=jvs-dw
``` ```
检查字典得到实际诊所名。未使用的治疗步骤汇总表、查询接口及回填 CLI 已撤掉并合入 main,不需要回填或重新首灌 5i5ya。旧建表迁移保留,新迁移删除派生表;生产当前尚未建此表,按顺序迁移会创建后删除空表,不会扫描患者事实。若部署前状态发生变化、该表已有数据,先备份该表并在构建完成后停止旧 PAC 后端,再迁移和启动新版。 未使用的治疗步骤汇总表、查询接口及回填 CLI 已撤掉并合入 main,不需要回填或重新首灌 5i5ya。旧建表迁移保留,新迁移删除派生表;生产当前尚未建此表,按顺序迁移会创建后删除空表,不会扫描患者事实。若部署前状态发生变化、该表已有数据,先备份该表并在构建完成后停止旧 PAC 后端,再迁移和启动新版。
## 7. 发布前索引检查 ## 7. 发布前索引检查
生产后台记录在 `/data/pac-ops/readiness-20261010/`。只看 `index-exit-code=0` 还不够,检查日志及数据库当前有效性: 已完成的生产准备记录在 `/data/pac-ops/readiness-20261010/`,索引与收尾任务均正常退出。只看 `index-exit-code=0` 还不够,检查日志及数据库当前有效性:
```bash ```bash
cat /data/pac-ops/readiness-20261010/index-exit-code cat /data/pac-ops/readiness-20261010/index-exit-code
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
- 生产发布脚本、远端网关端口覆盖、独立中转部署和配置预检。 - 生产发布脚本、远端网关端口覆盖、独立中转部署和配置预检。
- 服务器健康/队列巡检、cron 与日志轮转模板;不依赖开发电脑。 - 服务器健康/队列巡检、cron 与日志轮转模板;不依赖开发电脑。
- 生产专用 JWT 私钥、读取密钥、中转密钥、数据库应用密码及 env 草稿,位于应用机 `/data/pac-ops/readiness-20261010/config/`,尚未激活。 - 生产专用 JWT 私钥、读取密钥、中转密钥、数据库应用密码及 env 草稿,位于应用机 `/data/pac-ops/readiness-20261010/config/`,尚未激活。
- PAC 索引后台准备任务;最终结果必须以准备记录、退出码和数据库有效性检查为准。 - PAC 三个大表索引已于 2026-10-10 01:55 建成并验证有效,合计约 2.73 GiB;5i5ya 诊所名称字典已补齐 66 条。正式发布仍需运行七条迁移登记,已建索引会跳过重复创建。
- 未使用的治疗步骤汇总功能已移除,不需要回填或全量重算患者。 - 未使用的治疗步骤汇总功能已移除,不需要回填或全量重算患者。
## 请运维处理 ## 请运维处理
......
...@@ -20,7 +20,21 @@ ...@@ -20,7 +20,21 @@
首次尝试在 00:20 开始;00:23 连续两次 PAC 健康检查超过五秒,任务按保护逻辑取消。核查同一时段有 00:15 启动的 `incremental_bundle` 正在摄入,不能仅据此归因于索引。随后健康恢复。已确认并删除本次创建的无效索引,未触碰既有索引,首次日志保留在 `attempt-1/`。 首次尝试在 00:20 开始;00:23 连续两次 PAC 健康检查超过五秒,任务按保护逻辑取消。核查同一时段有 00:15 启动的 `incremental_bundle` 正在摄入,不能仅据此归因于索引。随后健康恢复。已确认并删除本次创建的无效索引,未触碰既有索引,首次日志保留在 `attempt-1/`。
调整后不仅看 PostgreSQL 长查询,还检查 `sync_logs`:摄入期间和完成后的 15 分钟不启动;之后需要连续六次健康/空闲采样。每次只建一个,`CONCURRENTLY`,维护内存 64 MB、并行维护 worker 0、锁超时 5 秒、语句超时 45 分钟。最多等待六小时;健康连续失败会取消并停止,不自动循环重试。任务仍需以最终日志和索引有效性查询确认。 调整后不仅看 PostgreSQL 长查询,还检查 `sync_logs`:摄入期间和完成后的 15 分钟不启动;之后需要连续六次健康/空闲采样。每次只建一个,`CONCURRENTLY`,维护内存 64 MB、并行维护 worker 0、锁超时 5 秒、语句超时 45 分钟。最多等待六小时;健康连续失败会取消并停止,不自动循环重试。任务已正常结束,退出码 0;下列结果已通过独立数据库查询复核。
### 最终结果(北京时间 2026-10-10)
| 索引 | 开始 | 完成 | 大小 |
| --- | --- | --- | --- |
| `patient_transactions_patient_id_clinic_id_idx` | 01:40:03 | 01:43:59 | 424 MB |
| `patient_facts_host_id_tenant_id_type_occurred_at_idx` | 01:46:29 | 01:49:40 | 1866 MB |
| `patient_facts_host_id_tenant_id_type_planned_for_idx` | 01:52:10 | 01:55:10 | 505 MB |
- 三个索引均 `indisvalid=true`、`indisready=true`;列顺序、表及 btree 定义与迁移一致。大小合计约 2.73 GiB。
- `index-exit-code=0`、`finalize-exit-code=0`;01:55:21 完成全部服务器准备动作,02:00 左右独立复核通过。
- 已调用现有 CLI 从 5i5ya 数仓补齐 `jvs-dw.clinic_names`,共 66 条;旧值备份 `clinic-names.before.json`(600 权限),执行日志 `clinic-names-refresh.log`。
- PAC `/health` 返回 `status=ok`。API/Web 运行镜像 ID、启动时间与操作前相同,生产源码仍为 `d9a9fda`,PAC `.env` 内容未变;未发布生产 AI/中转。
- 索引预建没有登记任何待发布迁移,也没有改摄入调度、全局时区或患者事实。首次取消的无效索引已经清理并重新成功建立,无失败残留。
提前创建不修改 `_prisma_migrations`。正式发布仍按顺序运行七条迁移:三个索引已有效时跳过重复创建;未启用派生表按历史迁移创建后由新迁移删除,不回填事实。 提前创建不修改 `_prisma_migrations`。正式发布仍按顺序运行七条迁移:三个索引已有效时跳过重复创建;未启用派生表按历史迁移创建后由新迁移删除,不回填事实。
...@@ -42,3 +56,5 @@ ...@@ -42,3 +56,5 @@
## 运维交付 ## 运维交付
按 [生产部署](../friday-ai-production-deployment.md) 实施。需要运维执行的 SQL、网关、cron、日志轮转模板在 `deploy/production/`。待提供:生产域名/证书,专用数据库账号,ECom/OSS/模型生产配置,告警接收人,首个集团/管理员/诊所/席位信息。无需交付 RDS 管理账号。 按 [生产部署](../friday-ai-production-deployment.md) 实施。需要运维执行的 SQL、网关、cron、日志轮转模板在 `deploy/production/`。待提供:生产域名/证书,专用数据库账号,ECom/OSS/模型生产配置,告警接收人,首个集团/管理员/诊所/席位信息。无需交付 RDS 管理账号。
生产准备工具已验证后合入 main `ad25aed`、test `938dff5`;本次收尾仅更新完成记录及运维步骤,不更改应用代码。临时索引/字典任务已退出,收尾自动化在文档同步完成后停用。
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment