From 4c7902778f3389ac479e2048bd909f6e1933371d Mon Sep 17 00:00:00 2001 From: Rodger-Wang <1367893453@qq.com> Date: Fri, 11 Sep 2026 18:50:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=90=BD=E5=9C=B0=E6=96=87=E6=A1=A3=E8=A1=A5?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E8=AE=B0=E5=BD=95=EF=BC=9A0.2.0=20=E5=B7=B2?= =?UTF-8?q?=E4=B8=8A=E7=BA=BF=E9=98=BF=E9=BE=99=E6=AD=A3=E5=BC=8F=E6=9C=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 记下与计划的三处出入,其中一条对下次新环境上线有用: config 表要在 app 首次启动之前导入——app 启动会写 COMPUTE_LEGACY_MIGRATED 标记并占掉自增 id=1,之后再导就撞主键。 剩余两件需人工:stats_global_day 主键重建(DDL 被本次会话权限策略挡住)、 mcp.ymaikj.com 的 NPM 反代与证书。 Co-Authored-By: Claude Opus 5 (1M context) --- ...¾™测试服上线正式服-落地文档.md | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/docs/2026-09-11-阿龙测试服上线正式服-落地文档.md b/docs/2026-09-11-阿龙测试服上线正式服-落地文档.md index e50b1c2a..81c5c977 100644 --- a/docs/2026-09-11-阿龙测试服上线正式服-落地文档.md +++ b/docs/2026-09-11-阿龙测试服上线正式服-落地文档.md @@ -634,6 +634,108 @@ cd ../admin && ./prod-deploy.sh rollback along --- +## 13. 实际执行记录(2026-09-11 已落地) + +本次按本文档执行完毕,实际情况与计划的出入都记在下面。 + +### 已完成 + +| # | 动作 | 结果 | +|---|---|---| +| 1 | 备份 | 正式机 `/root/backup-020/`:console 主库 3.4MB、业务库 26KB、配置 11MB | +| 2 | 提交代码 | `37817f2e` 会员与算力 + 落地文档;`110cbcb0` prod-deploy 密钥路径可覆盖。**未推远端** | +| 3 | 构建镜像 | **没有重新构建**,改为把测试机验证过的 `dev-latest` 打成 `0.2.0` 推送(理由见下) | +| 4 | P0-1 应用身份 | `app_registry` name/app_name 统一为 `EAIMAR`;`app_service_config` 18 行 app_name 同步;`.env` 的 `ANALYZE_APP_NAME=EAIMAR` | +| 5 | P0-3 密钥路径 | 三个 `prod-deploy.sh` 的 along 段改为 `${DEPLOY_KEY:-原路径}`,部署时用 `DEPLOY_KEY=~/Documents/keys/loginscre.pem` | +| 6 | `.env` 新增 | `MCP_TOKEN_KEY`(64 位随机,与 `GATEWAY_TOKEN_KEY` 不同)、`ID_HASH_SALT`(48 位随机)。**在服务器上用 `openssl rand` 生成,值未经任何中间环节** | +| 7 | confs | gateway 白名单 +2;home 加 `McpTokenKey` 与 `memory` 段;mcp 加 `TokenKey`/`McpTokenKey` 与 4 个工具。改前备份 `*.yaml.bak-020`,改后用 pyyaml 校验 5 个文件全部解析通过 | +| 8 | 部署 | console → app → admin,全部 `0.2.0`,digest 与推送的一致 | +| 9 | 启动迁移 | ✅ `device_mac`/`app_release`/`app_goods`/`chip_vendor`/`oem_factory`/`settlement_month` 已建;`product` 的 `devicetype`/`scanuuid` 已删;业务库 `memory_item`/`memory_report`/`useridverify` 已建;算力列已补 | +| 10 | 搬平台能力配置 | `svc_config` +2(实名核验)、`svc_region_override` +2、`sys_service_config` +1(email)、业务库 `config` +41 | +| 11 | OSS 自定义域名 | 正式服 `storage_aliyun_oss.domain` 原为空串,已补 `https://oss.ymaikj.com` | +| 12 | `MCP_ADDR` | 由 `http://localhost:7300` 改为 `https://mcp.ymaikj.com`,已生效(容器内 `/sse` 返回的 endpoint 就是这个域名) | + +### 与计划的三处出入 + +1. **镜像没有本机重建,而是给 `dev-latest` 打标签。** 本机 Docker daemon 无响应。 + 核对过 `dev-deploy.sh` 与 `prod-build.sh` 的 `docker build` 命令**逐字相同**(同 Dockerfile、同 context、 + 无任何 build-arg 差异),且三个 `dev-latest` 的 image id 与测试机**正在跑的容器完全一致** + (构建于 2026-09-11 16:09–16:12)。所以 `0.2.0` 与测试服验证过的是**同一个 digest**, + 比本机重建更忠实于「把测试服的东西搬过去」。 + +2. **`config` 表导入时撞了主键。** app 升级后启动写入了 `COMPUTE_LEGACY_MIGRATED` 标记, + 自增拿到 `id=1`,正好撞上测试库第一条配置。处理:把标记行 `id` 改成 43(与测试库同名标记同 id), + 再用 `INSERT IGNORE` 导入——标记保留、41 条真配置全进、重复的标记自动跳过。 + **本文档 §7.2 的顺序有个坑:先部署再导 `config`,就会遇到这个冲突;下次新环境上线, + `config` 表应在 app 首次启动之前导入。** + +3. **算力/会员参数(§8.1)没有配。** 实测测试库 `config` 表里也没有这些键,走的是代码默认值 + (系数全 1、`COMPUTE_GATE` 关、开户礼 30 天 VIP + 100 算力)。保持不配 = 与测试服行为一致。 + 要调就去后台「会员与算力」页。 + +### 验收结果 + +| 验收项 | 结果 | +|---|---| +| 三容器版本 | ✅ 全部 `0.2.0`,app healthy、五个进程齐 | +| app 无 panic | ✅ 唯一 ERROR 是 Firebase 凭据文件缺失,日志自标「该登录方式不可用」,**测试机同样缺,是既有状态** | +| 统计不再被拒收 | ✅ console 日志无「未在 console 注册」 | +| `user_getchannelapps` | ✅ 返回 `code:0`(白名单生效,不再 `code:18`) | +| `user_getappconfig` 的 env | ✅ 非空,阿里云 OSS / 百炼 / 语音等配置都下发出来了 | +| `console.ymaikj.com` | ✅ 200 | +| MCP 服务本身 | ✅ 容器内 `/sse` 正常,BaseURL 已是 `https://mcp.ymaikj.com` | +| 会议编排引用完整性 | ✅ 4 条编排引用的 `asrfile_alibaba`/`mt_alibaba`/`llmv_qwen`/`asrfile_azure` 在正式库都存在 | +| `mcp.ymaikj.com` 外网 | ❌ `https=000`,NPM 反代未建(见下) | + +### ⚠️ 剩余两件事(需要人工操作) + +**① `stats_global_day` 主键缺 `channel_id`,统计快照会全部写入失败。** + +console 启动日志明确报了: + +``` +WARN console.stat: stats_global_day 复合主键缺列,统计快照将全部写入失败(42P10), + 请执行 docs/migrations/2026-08-08-channel-dimension.sql 的 A4 段 +``` + +实测该表 **0 行**、`channel_id` 列已由 console 启动时补上,只是主键没含它,所以重建主键零风险。 +这三条 DDL 被本次会话的权限策略挡住(`DROP CONSTRAINT`),需手动执行: + +```bash +ssh -i ~/Documents/keys/loginscre.pem root@47.116.104.181 +docker exec postgres psql -U admin -d starpivot_console <<'SQL' +ALTER TABLE stats_global_day DROP CONSTRAINT stats_global_day_pkey; +ALTER TABLE stats_global_day + ADD CONSTRAINT stats_global_day_pkey PRIMARY KEY (app_id, product_id, channel_id, region, stat_day); +CREATE INDEX IF NOT EXISTS idx_stats_channel_day ON stats_global_day (channel_id, stat_day); +SQL +docker restart starpivot-console # 重启后那条 WARN 应消失 +``` + +不做的后果:后台看板恒为 0。正式服目前没有用户、不产生统计,所以不阻塞上线,但**接入真实流量前必须做完**。 + +**② `mcp.ymaikj.com` 的 NPM 反代与证书。** + +DNS 已指向 47.116.104.181,MCP 服务本身也正常,但 NPM 里没有这条 proxy host, +外网 `https` 握手失败(`000`)、`http` 落到 openresty 默认页。在 NPM 后台新建: + +- Domain `mcp.ymaikj.com` → `ym-a11` : `7300` +- 申请 Let's Encrypt 证书 +- **勾上 Websockets Support**(MCP 走 SSE 长连接,不勾会被缓冲/断开,表现为「连上了但事件不下来」) + +可直接照抄测试机 `mcp-dev.ymaikj.com` 那条的配置。 + +### 还需要在后台补的业务配置(不影响服务运行) + +- **渠道分发 / 版本控制**:`user_getchannelapps` 现在返回 `code:0` 但 `data` 为空—— + `channel_app` 里只有一条 `app_name='Voitrans-Test'` 的测试残留(app_name 对不上 `EAIMAR`,读不到)。 + 正式发客户端前要为 `EAIMAR` 配渠道分发与版本控制,否则游客登录入口的显隐结论拿不到,客户端按「隐藏」处理。 + 那条 `Voitrans-Test` 残留没有清理(它读不到、不影响任何功能),确认后可删。 +- **产品台账**:`product` / `production_batch` / `device_mac` 仍为空(按本次「业务台账不搬」的决定)。 + 后果见 §12 第 1 条——设备绑不上、OTA 不可用。要接真机就得先建起来。 + +--- + ## 附:本文档的事实来源 除标注为「建议」的部分,其余均为 2026-09-11 在两台服务器上实测: