feat: improve mindspace asset handling and local runtime paths

This commit is contained in:
john
2026-06-28 12:18:26 +08:00
parent 4a9bc710f1
commit ea19ffb5fa
36 changed files with 867 additions and 100 deletions
+2 -2
View File
@@ -13,7 +13,7 @@
| Plaza 运行目录 | `/root/tkmind_go/ui/plaza` |
| 数据真身 | 在 `103`MindSpace、users、data 等),见 [103/105 升级记录](103-105-upgrade-runbook-2026-06-26.md) |
本地开发仓库是 `/Users/john/PycharmProjects/test/test-memind`;生产 runtime 发布目标是 `103`
本地开发仓库是 `/Users/john/Project/Memind`;生产 runtime 发布目标是 `103`
**105 上的文件是部署产物,不是编辑源。**
## 禁止事项
@@ -75,7 +75,7 @@ scripts/wechat-mp-menu.mjs
```bash
# 1. 本地改 scripts/wechat-mp-menu.mjs
cd /Users/john/PycharmProjects/test/test-memind
cd /Users/john/Project/Memind
# 编辑 MENU → 本地验证 → git commit
# 2. 随 Portal/H5 走正式发布到 103(或当前文档规定的目标机)
+2 -2
View File
@@ -9,7 +9,7 @@
### 一键本地构建 + 验证
```bash
cd /Users/john/PycharmProjects/test/test-memind
cd /Users/john/Project/Memind
# 本地构建镜像 + 启动容器 + 健康检查
bash scripts/verify-goosed-docker.sh local
@@ -44,7 +44,7 @@ docker system df
#### 2. 本地构建镜像
```bash
cd /Users/john/PycharmProjects/test/test-memind
cd /Users/john/Project/Memind
# 方式 A:直接从 Dockerfile 构建(首次较慢)
docker build -f tkmind_go/Dockerfile.goosed -t tkmind/goosed:local tkmind_go/
+3 -3
View File
@@ -47,7 +47,7 @@ docker build --version
### Git 配置确认
```bash
cd /Users/john/PycharmProjects/test/test-memind
cd /Users/john/Project/Memind
# 确认 origin 指向 git.tkmind.cn
git remote -v
@@ -92,7 +92,7 @@ git push -u origin main # 确保推送
### 方式 A:使用验证脚本(推荐)
```bash
cd /Users/john/PycharmProjects/test/test-memind
cd /Users/john/Project/Memind
# 一键构建 + 启动 + 验证
bash scripts/verify-goosed-docker.sh local
@@ -107,7 +107,7 @@ bash scripts/verify-goosed-docker.sh local
### 方式 B:手工 docker build(更细致控制)
```bash
cd /Users/john/PycharmProjects/test/test-memind
cd /Users/john/Project/Memind
# 构建镜像
docker build -f tkmind_go/Dockerfile.goosed \
+2 -2
View File
@@ -50,7 +50,7 @@ Step 4: 镜像交付
### Step 1:提交文件到 git.tkmind.cn
```bash
cd /Users/john/PycharmProjects/test/test-memind
cd /Users/john/Project/Memind
# 查看修改
git status
@@ -82,7 +82,7 @@ git push origin main
```bash
# 进入项目目录
cd /Users/john/PycharmProjects/test/test-memind
cd /Users/john/Project/Memind
# 一键构建 + 验证
bash scripts/verify-goosed-docker.sh local
+184
View File
@@ -0,0 +1,184 @@
# ImgProxy 103 生产部署说明
> 目标:把 `imgproxy` 部署到 `103 / Studio`,保持和当前本机开发一致的签名配置、端口约定、数据根语义与 URL 生成方式。
## 先说结论
可以做到“行为一模一样”,但**不应该追求把本机 `/Users/john/...` 绝对路径逐字照搬到另一台机器**。
当前代码真正依赖的是这几件事:
1. `IMGPROXY_BASE_URL`
2. `IMGPROXY_SIGNING_KEY`
3. `IMGPROXY_SIGNING_SALT`
4. `MINDSPACE_STORAGE_ROOT`
5. `imgproxy` 能从 `local://<storage_key>` 读到真实文件
也就是说,生产上要保持的是:
- 同一套签名 key / salt
- 同一个存储根语义
- 同一个监听端口 `127.0.0.1:20081`
- 同一个公网域名入口 `https://img.tkmind.cn`
而不是把开发机 `localhost` 或别的绝对路径硬搬过去。
## 当前仓库里的真实前提
103 当前真实持久目录已经固定为:
- `H5_USERS_ROOT=/Users/john/Project/Memind/users`
- `MINDSPACE_STORAGE_ROOT=/Users/john/Project/Memind/data/mindspace`
- `MEMIND_SHARED_PUBLISH_ROOT=/Users/john/Project/Memind/MindSpace`
代码生成 `imgproxy` URL 时,传进去的是 `asset.storage_key`,例如:
```text
users/<userId>/temp/<file>.upload
```
`imgproxy-signer.mjs` 会把它转成:
```text
local://users/<userId>/temp/<file>.upload
```
所以生产 `imgproxy` 只需要把本地文件系统根指到:
```text
/Users/john/Project/Memind/data/mindspace
```
这样 `local://users/...` 就能正确落到:
```text
/Users/john/Project/Memind/data/mindspace/users/...
```
## 推荐的 103 配置
### 1. Portal `.env`
103 Portal 运行环境里建议保持:
```env
MINDSPACE_STORAGE_ROOT=/Users/john/Project/Memind/data/mindspace
IMGPROXY_BASE_URL=https://img.tkmind.cn
IMGPROXY_SIGNING_KEY=<与当前开发一致>
IMGPROXY_SIGNING_SALT=<与当前开发一致>
```
说明:
- `IMGPROXY_BASE_URL` 在生产不能再用 `http://localhost:20081`,因为最终生成给页面和聊天的 URL 应该是公网可访问域名。
- `IMGPROXY_SIGNING_KEY` / `IMGPROXY_SIGNING_SALT` 必须和当前代码生成器一致,否则已发布页面与聊天里的图片链接会全部失效。
### 2. ImgProxy 进程
建议在 `103 / Studio` 本机监听:
```text
127.0.0.1:20081
```
并使用:
```text
IMGPROXY_LOCAL_FILESYSTEM_ROOT=/Users/john/Project/Memind/data/mindspace
IMGPROXY_KEY=<同 IMGPROXY_SIGNING_KEY>
IMGPROXY_SALT=<同 IMGPROXY_SIGNING_SALT>
```
仓库已补安装脚本:
```bash
bash scripts/install-imgproxy-prod.sh
```
它会:
1. 检查 Homebrew `imgproxy`
2. 读取当前 `.env`
3. 生成 `~/Library/LaunchAgents/cn.tkmind.imgproxy.plist`
4. 以 LaunchAgent 方式启动 `imgproxy`
5. 监听 `127.0.0.1:20081`
## 为什么这已经算“同路径”
如果你的要求是“和本机当前项目路径一致”,那 103 其实已经满足:
```text
/Users/john/Project/Memind/data/mindspace
```
这正是当前 103 的正式持久目录。
如果你的要求是“和你本地 Mac 开发时完全一样的 `IMGPROXY_BASE_URL=http://localhost:20081`”,那生产不该这么做,因为:
1. 页面生成后要给外部用户访问
2. 聊天里插图也要给前端访问
3. `localhost` 只对 103 自己有效,不对用户浏览器有效
所以这里唯一应该改的是 `BASE_URL`,不是签名和存储路径。
## `img.tkmind.cn` 入口怎么接
推荐链路:
```text
用户 -> img.tkmind.cn -> 103 Caddy -> 127.0.0.1:20081 imgproxy
```
注意一个当前限制:
- 仓库里虽然有 `/api/mindspace/v1/authorize-image`
- 但现有 `imgproxy-signer.mjs` 生成的 URL **没有附带 `asset_id` query**
- 因此 `forward_auth` 目前没有足够信息做“按资产鉴权”
所以在当前代码下,`img.tkmind.cn` 这层**先不要假装已经接好了 `forward_auth`**。
现阶段更准确的说法是:
- 已具备 `imgproxy` 签名和反代条件
- 但若要做“按资产授权”的反代鉴权,还需要先扩展 URL 方案,把 `asset_id` 或等价标识带进请求
## 建议发布顺序
1. 本地 commit 当前分支
2. 发布 Portal runtime 到 103
3. 在 103 更新 `.env``IMGPROXY_BASE_URL=https://img.tkmind.cn`
4. 在 103 执行 `bash scripts/install-imgproxy-prod.sh`
5. 验证 `curl -i http://127.0.0.1:20081/health`
6. 再接 `img.tkmind.cn` 的 Caddy 入口
7. 用一条真实 MindSpace 图片 URL 验证页面和聊天渲染
## 最小验收
### 103 本机
```bash
curl -i http://127.0.0.1:20081/health
launchctl list | grep cn.tkmind.imgproxy
tail -n 50 ~/Library/Logs/imgproxy.log
```
### Portal URL 生成
启动后的 Portal 日志里应继续看到:
```text
[Publication] imgproxy signer initialized
[TKMindProxy] imgproxy signer initialized
```
### 业务验收
至少验证三条:
1. MindSpace 公开页图片能显示
2. 聊天消息里引用的图片能显示
3. 旧的 `/api/mindspace/v1/assets/.../download` 公开图链不再作为首选发布路径
## 风险提示
当前 `g2-lb.Caddyfile` 里关于 `img.tkmind.cn` 的注释历史上把入口位置写成了 `105`,这已经不符合现在的真实架构。
真实运行位应当以 `103 / Studio` 为准。
+2 -2
View File
@@ -2,7 +2,7 @@
> 这是本机本地开发文档,只处理当前工作区里的源码联调,不做任何生产同步。
> `pnpm dev` 不再启动 Plaza;如果需要联动 Plaza,请显式运行 `pnpm dev:all`,或者单独运行 `pnpm dev:plaza` / `pnpm start:plaza`。
> Plaza 专用脚本的源码默认指向同级仓库 `../test-memindplaza/app/plaza`;如你的目录不同,请用 `PLAZA_APP_DIR` 覆盖。
> Plaza 专用脚本的源码默认指向同级仓库 `../memind_plaza`;如你的目录不同,请用 `PLAZA_APP_DIR` 覆盖。
> 生产 / 测试 / 预览隔离仍单独看 [生产 / 测试 / 预览隔离规程](./service-isolation-runbook.md)。
`pnpm dev` 启动后,用 **127.0.0.1 + 端口** 访问本仓库自己的服务:
@@ -38,7 +38,7 @@ pnpm dev:all
| `OPS_PORT` | 3002 | Ops SPA |
| `ADMIN_PORT` | 8082 | memind_adm |
| `H5_PUBLIC_BASE_URL` | http://127.0.0.1:5173 | 公开链接基址 |
| `PLAZA_APP_DIR` | ../test-memindplaza/app/plaza | Plaza 专用脚本的源码路径(`pnpm dev:plaza` / `pnpm start:plaza` / `pnpm dev:all` |
| `PLAZA_APP_DIR` | ../memind_plaza | Plaza 专用脚本的源码路径(`pnpm dev:plaza` / `pnpm start:plaza` / `pnpm dev:all` |
Plaza 本地开发说明见 [plaza-local.md](./plaza-local.md)。生产发布、同步与回滚不要在这里处理,统一看 [生产更新发布指南](./release-deploy.md)。
@@ -1,7 +1,7 @@
# Memind 打通 AI Mind 项目评估报告
日期:2026-06-24
范围:`/Users/john/PycharmProjects/test/test-memind``/Users/john/PycharmProjects/ai_mind`
范围:`/Users/john/Project/Memind``/Users/john/PycharmProjects/ai_mind`
状态:只读评估结论整理,后续可继续深化方案与实施拆解
## 1. 结论
@@ -359,4 +359,3 @@ Memind 当前 `/sessions/:id/reply` 链路已有:
- 列出 MVP 验收用例
完成这些后,再进入代码实现会更稳。
+8 -8
View File
@@ -11,11 +11,11 @@
| 生产 | `/Users/john/Project/Memind` | `g2.tkmind.cn` 当前在线服务(阿里云解析 → 105 → 本机 Mac) | `8081` |
| 生产 Plaza | `/Users/john/Project/Memind` + Plaza | `plaza.tkmind.cn` 当前在线服务 | `3001` |
| 生产入口 | `/Users/john/Project/Memind/scripts/g2-lb.Caddyfile` | 105 转发入口 / 反代配置 | `8090` |
| 测试 Portal | `/Users/john/PycharmProjects/test/test-memind` | 开发预览 API / Portal | `18081` |
| 测试 Vite | `/Users/john/PycharmProjects/test/test-memind` | 开发预览前端 | `15173` |
| 测试 Admin | `/Users/john/PycharmProjects/test/test-memind` | 开发预览后台 | `18082` |
| 测试 Plaza | `/Users/john/PycharmProjects/test/test-memind` | 开发预览 Plaza | `13001` |
| 测试 Ops | `/Users/john/PycharmProjects/test/test-memind` | 开发预览 Ops | `13002` |
| 测试 Portal | `/Users/john/Project/Memind` | 开发预览 API / Portal | `18081` |
| 测试 Vite | `/Users/john/Project/Memind` | 开发预览前端 | `15173` |
| 测试 Admin | `/Users/john/Project/Memind` | 开发预览后台 | `18082` |
| 测试 Plaza | `/Users/john/Project/Memind` | 开发预览 Plaza | `13001` |
| 测试 Ops | `/Users/john/Project/Memind` | 开发预览 Ops | `13002` |
硬规则:
@@ -64,7 +64,7 @@ g2.tkmind.cn 生产请求
| 项目目录 | 记忆含义 |
|----------|----------|
| `/Users/john/Project/Memind` | 生产项目的开发记忆 |
| `/Users/john/PycharmProjects/test/test-memind` | 测试项目的开发记忆 |
| `/Users/john/Project/Memind` | 测试项目的开发记忆 |
| 测试 Goose 项目目录(按本机实际路径填写) | 测试 Goose 的开发记忆 |
硬规则:
@@ -110,7 +110,7 @@ scripts/install-prod-services.sh
优先在测试目录进行:
```bash
cd /Users/john/PycharmProjects/test/test-memind
cd /Users/john/Project/Memind
```
启动前先确认生产还在:
@@ -146,7 +146,7 @@ pnpm dev
如果只改前端样式,优先只启动 Vite:
```bash
cd /Users/john/PycharmProjects/test/test-memind
cd /Users/john/Project/Memind
VITE_PORT=15173 \
H5_PUBLIC_BASE_URL=http://127.0.0.1:15173 \
VITE_MINDSPACE_BASE=http://127.0.0.1:15173 \