Browse Source

落地文档补执行记录:0.2.0 已上线阿龙正式服

记下与计划的三处出入,其中一条对下次新环境上线有用:
config 表要在 app 首次启动之前导入——app 启动会写
COMPUTE_LEGACY_MIGRATED 标记并占掉自增 id=1,之后再导就撞主键。

剩余两件需人工:stats_global_day 主键重建(DDL 被本次会话权限策略挡住)、
mcp.ymaikj.com 的 NPM 反代与证书。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
main
Rodger-Wang 4 weeks ago
parent
commit
4c7902778f
  1. 102
      docs/2026-09-11-阿龙测试服上线正式服-落地文档.md

102
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 在两台服务器上实测: 除标注为「建议」的部分,其余均为 2026-09-11 在两台服务器上实测:

Loading…
Cancel
Save