commit 6cf9679c7f2ea12b3c65d1753ef4d3942545ae73 Author: gongzuo Date: Sat Aug 22 00:43:03 2026 +0800 fix(seat): restore encrypted note media loading diff --git a/docs/deploy.md b/docs/deploy.md index 36765c8..fce7aff 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -159,10 +159,16 @@ `Jenkinsfile.frontend` 和部署脚本。 ## 生产配置(application-prod.yml) -- `application-prod.yml`(**gitignore,含密钥**):MySQL 库 `im_v3`、Redis db1、腾讯云 COS 桶 `zg-1412177217`(南京)、安装包公开基地址 `storage.install-package-public-base=https://cos.omx100.com`、历史阿里云 OSS 桶 `hdfs-af`(公开域名 `oss.jqq4u0.com`)、OpenIM `127.0.0.1:10002`。`storage.type=cos`;真实 Key 仅保存在服务器外部配置,不入 Git。 -- ⚠️⚠️ **配置已改为「外部文件」放服务器 `/opt/imv3/application-prod.yml`(jar 外,2026-07-04 起)**。原因:该文件 gitignore,**Mac 克隆的仓库没有它**,若 `mvn package` 出的 jar 不含 prod 配置 → 部署后启动报 `Failed to configure a DataSource: 'url' not specified` **整个后端起不来**。现在 Spring 从 jar 同目录(`WorkingDirectory=/opt/imv3`)加载外部 `application-prod.yml`,**jar 内可不含它也能启动**。 +- `application-prod.yml`(**gitignore,含密钥**):MySQL 库 `im_v3`、Redis db1、腾讯云 COS 桶 `zg-1412177217`(南京)、普通媒体公开基地址 `storage.cos.public-base=https://zg-1412177217.cos.ap-nanjing.myqcloud.com`、安装包公开基地址 `storage.install-package-public-base=https://cos.omx100.com`、历史阿里云 OSS 桶 `hdfs-af`(公开域名 `oss.jqq4u0.com`)、OpenIM `127.0.0.1:10002`。`storage.type=cos`;真实 Key 仅保存在服务器外部配置,不入 Git。**两项 public base 用途不同,禁止把安装包 EdgeOne 域名复制到 `storage.cos.public-base`**,否则坐席 H5 无法跨域读取并解密普通媒体。 +- ⚠️⚠️ **配置使用服务器外部文件,不打入 jar**。测试服务从 + `/opt/imv3/application-prod.yml` 读取;生产容器从宿主机 + `/opt/zg/backend/config/application-prod.yml` 挂载到 `/app/config`。该文件含密钥且被 + gitignore,本地仓库没有生产副本;不得用本地文件覆盖生产配置,也不得只更新 srv137 + 就声称生产配置已上线。 - 该文件只覆盖 `spring.datasource/redis` + `im.openim` + `storage` + `mail.engagelab`;`im.livekit`、jwt 等在**基础 `application.yml`(已提交,jar 内自带)**。 -- **改了 prod 配置**要同步更新服务器上 `/opt/imv3/application-prod.yml`(`cat 本地文件 | ssh srv137 "cat > /opt/imv3/application-prod.yml"` 再 restart)。本地留一份在 `backend/src/main/resources/application-prod.yml`(gitignore)供本机跑。 +- 测试配置位于 `srv137:/opt/imv3/application-prod.yml`;生产配置位于 + `zgprod01/02/03:/opt/zg/backend/config/application-prod.yml`。修改生产配置必须先备份、 + 核验三台一致,再逐台重启 `zg-backend` 并等待健康检查恢复,禁止同时重启三台。 ## 阿里云 OSS 自定义域名证书 @@ -193,7 +199,10 @@ - **后管前端**: `frontend/`(Vue3,「众归管理平台」)。统一使用上文 Jenkins 流程发布;生产目标为 `zgprod01:/opt/zg/web/admin`,测试目标为 `srv137:/opt/imv3/web/admin`,nginx 无需重载。`app/`(H5/Vant)暂未部署未用; - C端在线客服=`seats-h5/`(部署 `/opt/imv3/web/seats`,只打公开 `/api/guest/seat`)。 + C端在线客服=`seats-h5/`,生产三节点均部署到 `/opt/zg/web/seats-h5`,测试才部署 + `/opt/imv3/web/seats`;坐席页只调用公开 `/api/guest/seat`。生产发布前必须提交并推送, + 然后按同一 commit 将 `seats-h5/index.html` 原子替换到三节点并逐一比对 SHA-256,最后 + 检查 `https://seats.zg2026.com/` 返回同一哈希。 ## Web 版(`desktop/`)部署 —— ⚠️ 无 CI,手动 build+scp > `desktop/` 目录名叫 desktop,**实际是浏览器 Web 版 IM 客户端**(基于 OpenIM 官方 `openimsdk/openim-electron-demo` 二次开发,React+Vite+antd)。有 CI 的是 Flutter `client/`,**Web 版没有 CI**,改动要手动构建部署。 diff --git a/docs/tencent-cos-cutover.md b/docs/tencent-cos-cutover.md index 23319e7..2e463d3 100644 --- a/docs/tencent-cos-cutover.md +++ b/docs/tencent-cos-cutover.md @@ -81,6 +81,27 @@ CAM 子账号并限定只能对 `zg-1412177217` 执行业务所需的对象读 3.8.825、iOS 3.8.818 版本记录及 iOS 安装清单已原地切换到该域名;旧 OSS 对象继续 保留用于回退。 +### 2026-08-22 坐席笔记图片跨域事故 + +生产三节点的 `storage.cos.public-base` 曾误配为安装包 EdgeOne 域名 +`cos.omx100.com`,导致新笔记媒体 URL 使用该域名。对象本身存在且 ZGM1 密文有效, +但 EdgeOne 响应缺少 `Access-Control-Allow-Origin`,坐席 H5 的 `fetch` 被浏览器拦截, +随后又把密文 URL 当图片展示,表现为少数笔记封面破图。 + +修复和后续约束: + +- 普通媒体固定使用 COS 默认域名 + `https://zg-1412177217.cos.ap-nanjing.myqcloud.com`;`cos.omx100.com` 只用于安装包和 + 节点清单等静态分发,不能填入 `storage.cos.public-base`。 +- EdgeOne 的 `cos.omx100.com` 静态资源规则必须设置响应头 + `Access-Control-Allow-Origin: *`,确保已经写入数据库和客户端缓存的历史 URL 仍可被 + Web 端读取。修改规则后用带 `Origin: https://seats.zg2026.com` 的真实对象请求验证。 +- 坐席 H5 对历史 `cos.omx100.com` 媒体 URL 映射到同 Key 的 COS 默认域名后再拉取、 + 解密,形成第二层兼容;不要在拉取失败后把已知 ZGM1 密文直接交给 ``。 +- 每次修改生产存储配置,都要分别检查 `storage.cos.public-base` 与 + `storage.install-package-public-base`,并在三节点滚动重启后验证坐席图片和安装包分段 + 下载,不能只检查上传成功。 + 香港 `build-apk-1412177217` 上传速度更快,但目前没有绑定自己的 HTTPS 自定义域名, 仍不能用于安装包公网分发。若以后启用,需重新完成证书、APK/IPA 下载、CI 地址改写 和版本接口四项验证,不能复用当前指向南京桶的 `cos.omx100.com`。 diff --git a/seats-h5/index.html b/seats-h5/index.html index 2dfb861..12fbf6f 100644 --- a/seats-h5/index.html +++ b/seats-h5/index.html @@ -589,7 +589,7 @@ $('recui').style.display='none'; if(recMR && recMR.state!=='inactive'){ try{ recMR.stop(); }catch(e){ onRecStop(); } } else { onRecStop(); } } - // 与 App MediaCrypto / 后端 MediaObfuscation 对齐:魔数 ZGM1 + 头部 64KB XOR。加密后 R2 存密文, + // 与 App MediaCrypto / 后端 MediaObfuscation 对齐:魔数 ZGM1 + 头部 64KB XOR。对象存储中保存密文, // App 播放(downloadAndDecryptToTemp)与 H5(/media 代理)均自动识别魔数解密。 var _obfKey=(function(){ var s='zg-media-obf-key-2026', a=[]; for(var i=0;i