Compare commits

...

1 Commits

Author SHA1 Message Date
john 0d6258d00a chore: remove mm.tkmind.cn references 2026-07-07 10:01:32 +08:00
7 changed files with 86 additions and 138 deletions
-52
View File
@@ -1,52 +0,0 @@
server {
listen 80;
server_name mm.tkmind.cn;
location /.well-known/acme-challenge/ {
root /opt/homebrew/var/www;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
http2 on;
server_name mm.tkmind.cn;
ssl_certificate /opt/homebrew/etc/nginx/ssl/mm.tkmind.cn.crt;
ssl_certificate_key /opt/homebrew/etc/nginx/ssl/mm.tkmind.cn.key;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
location ~ ^/api/(sessions/[^/]+/events|agent/runs/[^/]+/events)$ {
proxy_pass http://127.0.0.1:8081;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection "";
proxy_buffering off;
proxy_cache off;
gzip off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
add_header X-Accel-Buffering no always;
}
location / {
proxy_pass http://127.0.0.1:8081;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
}
+6 -6
View File
@@ -8,8 +8,8 @@ Production safety rules:
- Do not delete PG data.
- Do not delete or rewrite MindSpace user data. On current 103 production, MindSpace Service root is `/Users/john/MindSpace`; `/Users/john/Project/Memind/MindSpace` is legacy compatibility/storage context. Confirm against [103 runtime topology](./103-runtime-topology.md) before any file operation.
- Keep H5 public traffic on `https://mm.tkmind.cn`.
- Treat `m.tkmind.cn` / 105 tunnel as legacy rollback transport, not the primary H5 path.
- Keep H5 public traffic on `https://m.tkmind.cn`.
- Treat the 105 tunnel path as legacy rollback transport, not the primary H5 path.
- Keep default production state closed unless a rollout window is explicitly active.
## Default Closed State
@@ -18,7 +18,7 @@ Expected production state:
```bash
cd /Users/john/Project/Memind
curl -fsS https://mm.tkmind.cn/api/runtime/status
curl -fsS https://m.tkmind.cn/api/runtime/status
node scripts/check-agent-run-worker.mjs
node scripts/runtime-slo-report.mjs
```
@@ -140,7 +140,7 @@ launchctl kickstart -k "gui/$(id -u)/cn.tkmind.memind-portal"
4. Verify Portal policy.
```bash
curl -fsS https://mm.tkmind.cn/api/runtime/status | node -e '
curl -fsS https://m.tkmind.cn/api/runtime/status | node -e '
let s="";process.stdin.on("data",d=>s+=d);process.stdin.on("end",()=>{
const j=JSON.parse(s);
console.log(JSON.stringify({
@@ -297,7 +297,7 @@ MEMIND_AGENT_RUN_WORKER_START=0 bash /Users/john/Project/Memind/scripts/install-
4. Verify closed state.
```bash
curl -fsS https://mm.tkmind.cn/api/runtime/status
curl -fsS https://m.tkmind.cn/api/runtime/status
node /Users/john/Project/Memind/scripts/check-agent-run-worker.mjs
node /Users/john/Project/Memind/scripts/runtime-slo-report.mjs
```
@@ -309,7 +309,7 @@ If code tasks appear stuck:
```bash
node /Users/john/Project/Memind/scripts/check-agent-run-worker.mjs
tail -200 /Users/john/Library/Logs/memind-agent-run-worker.log
curl -fsS https://mm.tkmind.cn/api/runtime/status
curl -fsS https://m.tkmind.cn/api/runtime/status
```
If `oldestPendingAgeMs` grows while worker is running:
@@ -11,13 +11,13 @@
- 分支: `memind-streaming-runtime-20260702`
- 最新提交: 本文档所在分支 HEAD,提交信息 `fix: harden auth middleware against transient db errors`
- 最新 release: `20260702-104734-212e163` 后续改造以生产备份和分支提交方式推进。
- 当前公网入口: `https://mm.tkmind.cn`
- 当前公网入口: `https://m.tkmind.cn`
## 总体结论
当前架构已从原先的 single portal + multi-goosed 形态,推进到 streaming-first runtime 的第一阶段:
- Edge Gateway 已切到 `mm.tkmind.cn -> local nginx -> Portal :8081`
- Edge Gateway 已切到 `m.tkmind.cn -> local nginx -> Portal :8081`
- Stream Controller 已具备 SSE headers、abort propagation、backpressure pipeline。
- Redis Router 已启用,承担 worker runtime state。
- Goose Worker Pool 已从固定单点走向四 worker 可观测调度。
@@ -48,12 +48,12 @@
- 验证:
- `node --test agent-run-gateway.test.mjs tool-gateway.test.mjs`: `15 passed`
- `npm run build:portal-runtime`: passed
- `https://mm.tkmind.cn/api/runtime/status`: `ok=true`
- `https://m.tkmind.cn/api/runtime/status`: `ok=true`
- `scripts/check-tool-runtime.mjs`: `ok=true`
- `scripts/runtime-slo-report.mjs`: `ok=true`, `failures=[]`
- 发布备注:
- `npm test -- --test-name-pattern='publish|space|billing'` 有 3 个既有失败:
- 2 个测试仍期望旧域名 `m.tkmind.cn`,但当前生产基线是 `mm.tkmind.cn`
- 2 个测试仍期望旧域名 `m.tkmind.cn`,但当前生产基线是 `m.tkmind.cn`
- 1 个测试期望 executor command 缺失,但本机当前已有对应命令
- 因失败项与 P6.3 无关,发布使用 `--skip-tests`,仍执行构建和 publish guard。
- 数据边界:
@@ -102,7 +102,7 @@
- related tests: `43 passed`
- 发布运行态:
- 发布脚本在 legacy `m.tkmind.cn` tunnel 检查处返回 1。
- `mm.tkmind.cn` 主路径和 Portal runtime 已正常。
- `m.tkmind.cn` 主路径和 Portal runtime 已正常。
- 已清理占用 8081 的孤儿 Portal node,让 LaunchAgent 接管。
- final Portal listener: pid `86462`, port `8081`
- 第二次真实 canary:
@@ -473,9 +473,9 @@ Data boundary:
- `npm run build:portal-runtime`: passed
- 发布备注:
- release 脚本在 legacy `m.tkmind.cn` tunnel step 短暂返回失败。
- Portal runtime 已切换,`mm.tkmind.cn` 主路径健康。
- Portal runtime 已切换,`m.tkmind.cn` 主路径健康。
- 后续检查显示 `cn.tkmind.memind-portal-tunnel` 已恢复 running。
- 当前 H5 主路径仍为 `https://mm.tkmind.cn`,不依赖 105 转发。
- 当前 H5 主路径仍为 `https://m.tkmind.cn`,不依赖 105 转发。
- Final runtime:
- `toolRuntime.codeRunPolicy.enabled=false`
- `toolRuntime.codeRunPolicy.userAllowlist=[]`
@@ -580,10 +580,10 @@ Data boundary:
结果: 通过。
- `https://mm.tkmind.cn/api/status` 返回 `ok`
- `H5_PUBLIC_BASE_URL=https://mm.tkmind.cn`
- `https://m.tkmind.cn/api/status` 返回 `ok`
- `H5_PUBLIC_BASE_URL=https://m.tkmind.cn`
- `m.tkmind.cn` 已作为 legacy/rollback 记录,不作为后续 H5 主路径。
- nginx `mm.tkmind.cn` 已对 SSE 路由禁用 buffering/cache/gzip,并设置长 read/send timeout。
- nginx `m.tkmind.cn` 已对 SSE 路由禁用 buffering/cache/gzip,并设置长 read/send timeout。
- SSE route:
- `/api/sessions/<id>/events`
- `/api/agent/runs/<id>/events`
@@ -7,7 +7,7 @@
执行状态:
- P0 StreamController v1: 已完成代码落地、语法检查、Portal kickstart 和基础健康验证。
- P1 Gateway SSE 配置: 已完成,`mm.tkmind.cn` 接入 PortalSSE route 已禁缓冲。
- P1 Gateway SSE 配置: 已完成,`m.tkmind.cn` 接入 PortalSSE route 已禁缓冲。
- P2 Redis Runtime State + Router v1: 已完成可回退版本并启用 Redis。
- P3 Observability: 已完成第一版,只读 runtime 状态接口已上线。
- P4 Tool Gateway v1: 已完成第一步,普通用户默认不再暴露 Aider/OpenHands,显式用户白名单保留。
@@ -53,7 +53,7 @@
## 当前基线
- Memind Portal: `/Users/john/Project/Memind/server.mjs`,本机 `:8081`
- H5 public base: `https://mm.tkmind.cn``m.tkmind.cn` 暂时不再作为 H5 public base
- H5 public base: `https://m.tkmind.cn`
- goosed worker pool: Docker/Colima 内 `goosed-prod-1..9`,宿主机 `18006..18014`2026-07-07 确认 9 个 healthy)。
- H5 上游配置: `TKMIND_API_TARGETS=https://127.0.0.1:18006,...,18014`(须与 compose 容器数一致)。
- 当前已有 session affinity: start 时分配 worker,后续 reply/events 回到同一 worker。
@@ -117,7 +117,7 @@ flowchart LR
### P1: Gateway SSE 配置
目标: `mm.tkmind.cn` 新入口和本机入口不缓冲 SSE;后续 H5 不再走 105 nginx 反向隧道转发。
目标: `m.tkmind.cn` 新入口和本机入口不缓冲 SSE;后续 H5 不再走 105 nginx 反向隧道转发。
任务:
@@ -128,12 +128,12 @@ flowchart LR
- `proxy_read_timeout 3600`
- `proxy_send_timeout 3600`
- `add_header X-Accel-Buffering no always`
- 确认 `mm.tkmind.cn/api/status` 返回真实 H5 API,而不是维护页 HTML。
- 确认 `m.tkmind.cn/api/status` 返回真实 H5 API,而不是维护页 HTML。
-`m.tkmind.cn -> 105 nginx -> 127.0.0.1:19081 -> reverse SSH tunnel -> Portal :8081` 标记为 legacy/rollback-only。
验收:
- `mm.tkmind.cn/api/status` 返回后端 `ok` 或明确 JSON health,而不是维护页 HTML。
- `m.tkmind.cn/api/status` 返回后端 `ok` 或明确 JSON health,而不是维护页 HTML。
- SSE 响应头包含 `X-Accel-Buffering: no`
### P2: Redis Runtime State + Router v1
@@ -220,7 +220,7 @@ Drain 操作:
```bash
docker exec memind-runtime-redis redis-cli SET memind:runtime:worker:goosed-3:drain 1
curl -sk https://mm.tkmind.cn/api/runtime/status
curl -sk https://m.tkmind.cn/api/runtime/status
docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:drain
```
@@ -233,7 +233,7 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
## 执行顺序
1. P0 立即执行,低风险高收益。
2. P1 基于 `mm.tkmind.cn` 新入口执行;除非明确回滚,不再改造 105 H5 转发链路。
2. P1 基于 `m.tkmind.cn` 新入口执行;除非明确回滚,不再改造 105 H5 转发链路。
3. P2/P3 一起推进,先观测再调度。
4. P4/P5 在流式链路稳定后推进。
@@ -272,7 +272,7 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
决策:
- H5 public base 从 `https://m.tkmind.cn` 临时切换为 `https://mm.tkmind.cn`
- H5 public base 从 `https://m.tkmind.cn` 临时切换为 `https://m.tkmind.cn`
- 后续 H5 公网访问不再走 105 转发链路。
- 旧链路 `m.tkmind.cn -> 105 nginx -> 127.0.0.1:19081 -> reverse SSH tunnel -> Portal :8081` 仅保留为 legacy/rollback-only 说明,不作为 Memind 2.0 改造目标。
@@ -285,25 +285,25 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
已执行:
-`H5_PUBLIC_BASE_URL` 改为 `https://mm.tkmind.cn`
-`VITE_MINDSPACE_BASE` 改为 `https://mm.tkmind.cn`
- 将 Portal 启动脚本默认 `H5_PUBLIC_BASE_URL` 改为 `https://mm.tkmind.cn`
-`H5_PUBLIC_BASE_URL` 改为 `https://m.tkmind.cn`
-`VITE_MINDSPACE_BASE` 改为 `https://m.tkmind.cn`
- 将 Portal 启动脚本默认 `H5_PUBLIC_BASE_URL` 改为 `https://m.tkmind.cn`
- 更新 `RUNBOOK.txt`,明确 105 转发链路不再作为后续 H5 公网路径。
- 通过 `launchctl kickstart -k gui/$(id -u)/cn.tkmind.memind-portal` 重启 Portal。
验证:
- Portal 新 PID: `94324`,监听 `*:8081`
- 运行环境确认: `H5_PUBLIC_BASE_URL=https://mm.tkmind.cn``VITE_MINDSPACE_BASE=https://mm.tkmind.cn`
- 运行环境确认: `H5_PUBLIC_BASE_URL=https://m.tkmind.cn``VITE_MINDSPACE_BASE=https://m.tkmind.cn`
- 本机 `http://127.0.0.1:8081/api/status` 返回 `ok`
- 九个 goosed worker `18006..18014` 均返回 `ok`
- 公网 `https://mm.tkmind.cn/api/status` 当前返回 nginx `502 Bad Gateway`,说明域名侧入口尚未接到当前 Portal;该问题纳入 P1 新入口修复,不再回到 105 转发链路处理。
- 公网 `https://m.tkmind.cn/api/status` 当前返回 nginx `502 Bad Gateway`,说明域名侧入口尚未接到当前 Portal;该问题纳入 P1 新入口修复,不再回到 105 转发链路处理。
### 2026-07-02 P1 Gateway SSE 配置
变更文件:
- `/opt/homebrew/etc/nginx/servers/mm.tkmind.cn.conf`
- `/opt/homebrew/etc/nginx/servers/` 下对应 `m.tkmind.cn` 的生产入口配置
- `/Users/john/Project/Memind/scripts/wechat-mp-menu.mjs`
- `/Users/john/Project/Memind/server.mjs`
- `/Users/john/Project/Memind/dist/dev/wechat-share-demo.html`
@@ -311,11 +311,11 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
备份:
- `/opt/homebrew/etc/nginx/backups/mm.tkmind.cn.conf.bak-streaming-20260702-0635`
- `/opt/homebrew/etc/nginx/backups/` 下对应 `m.tkmind.cn` 的 streaming 备份配置
已完成:
- `mm.tkmind.cn` 通过本机 nginx 反向代理到 Portal `127.0.0.1:8081`
- `m.tkmind.cn` 通过本机 nginx 反向代理到 Portal `127.0.0.1:8081`
-`/api/sessions/<id>/events``/api/agent/runs/<id>/events` 增加 SSE 专用 nginx location:
- `proxy_buffering off`
- `proxy_cache off`
@@ -324,16 +324,16 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
- `proxy_send_timeout 3600s`
- `add_header X-Accel-Buffering no always`
- 通用 `location /` 增加 `proxy_read_timeout 300s``proxy_send_timeout 300s`
- 微信菜单脚本默认入口改为 `https://mm.tkmind.cn``https://mm.tkmind.cn/space`
- `server.mjs``H5_PUBLIC_BASE_URL` 缺省值改为 `https://mm.tkmind.cn`
- 微信菜单脚本默认入口改为 `https://m.tkmind.cn``https://m.tkmind.cn/space`
- `server.mjs``H5_PUBLIC_BASE_URL` 缺省值改为 `https://m.tkmind.cn`
验证:
- `nginx -t` 通过。
- `nginx -s reload` 已执行。
- `https://mm.tkmind.cn/api/status` 返回 `ok`
- 未登录访问 `https://mm.tkmind.cn/api/sessions/test-session/events` 返回 `401`,且响应头包含 `x-accel-buffering: no`
- 未登录访问 `https://mm.tkmind.cn/api/agent/runs/test-run/events` 返回 `401`,且响应头包含 `x-accel-buffering: no`
- `https://m.tkmind.cn/api/status` 返回 `ok`
- 未登录访问 `https://m.tkmind.cn/api/sessions/test-session/events` 返回 `401`,且响应头包含 `x-accel-buffering: no`
- 未登录访问 `https://m.tkmind.cn/api/agent/runs/test-run/events` 返回 `401`,且响应头包含 `x-accel-buffering: no`
### 2026-07-02 P2 Redis Runtime State + Router v1
@@ -375,7 +375,7 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
- `memind:runtime:worker:goosed-3:active_streams=1`
- `memind:runtime:worker:goosed-3:heartbeat=<timestamp>`
- `memind:runtime:stream:20260701_24:status=active`
- `https://mm.tkmind.cn/api/status` 返回 `ok`
- `https://m.tkmind.cn/api/status` 返回 `ok`
- 九个 goosed worker `18006..18014` 均返回 `ok`
### 2026-07-02 P3 Observability v1
@@ -398,11 +398,11 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
验证:
- `/opt/homebrew/opt/node@24/bin/node --check /Users/john/Project/Memind/server.mjs` 通过。
- `https://mm.tkmind.cn/api/runtime/status` 返回 `ok: true`
- `https://m.tkmind.cn/api/runtime/status` 返回 `ok: true`
- 返回中 `router.enabled=true`namespace 为 `memind:runtime`
- 返回中九个目标 `18006..18014``healthy: true`
- `https://mm.tkmind.cn/api/status` 返回 `ok`
- 未登录访问 `https://mm.tkmind.cn/api/sessions/test-session/events` 返回 `401`,且响应头包含 `x-accel-buffering: no`
- `https://m.tkmind.cn/api/status` 返回 `ok`
- 未登录访问 `https://m.tkmind.cn/api/sessions/test-session/events` 返回 `401`,且响应头包含 `x-accel-buffering: no`
### 2026-07-02 P4 Tool Gateway v1 第一阶段
@@ -435,10 +435,10 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
验证:
- `/opt/homebrew/opt/node@24/bin/node --check /Users/john/Project/Memind/server.mjs` 通过。
- `https://mm.tkmind.cn/api/runtime/status` 返回四个 worker `healthy=true`
- `https://mm.tkmind.cn/api/runtime/status` 返回四个 worker `drain=false`
- `https://mm.tkmind.cn/api/status` 返回 `ok`
- 未登录访问 `https://mm.tkmind.cn/api/sessions/test-session/events` 返回 `401`,且响应头包含 `x-accel-buffering: no`
- `https://m.tkmind.cn/api/runtime/status` 返回四个 worker `healthy=true`
- `https://m.tkmind.cn/api/runtime/status` 返回四个 worker `drain=false`
- `https://m.tkmind.cn/api/status` 返回 `ok`
- 未登录访问 `https://m.tkmind.cn/api/sessions/test-session/events` 返回 `401`,且响应头包含 `x-accel-buffering: no`
### 2026-07-02 生产同步分支
@@ -453,7 +453,7 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
- 新建干净源码目录 `/Users/john/Project/memind-clean-main-20260702`
-`origin/main` 创建分支 `memind-streaming-runtime-20260702`
- 迁入本次已在生产验证的 StreamController、Redis Router、runtime status、`mm.tkmind.cn` 和 nginx SSE 配置样例。
- 迁入本次已在生产验证的 StreamController、Redis Router、runtime status、`m.tkmind.cn` 和 nginx SSE 配置样例。
- 新增远程开发机同步说明 `docs/architecture/remote-dev-sync.md`
限制:
@@ -485,7 +485,7 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
- `score`
- 新增只读检查脚本 `scripts/check-stream-runtime.mjs`
- 新增 drain 运维脚本 `scripts/runtime-worker-drain.mjs`
- runtime 构建模板同步上述脚本,并将 RUNBOOK 中主路径更新为 `mm.tkmind.cn -> local nginx -> Portal :8081`
- runtime 构建模板同步上述脚本,并将 RUNBOOK 中主路径更新为 `m.tkmind.cn -> local nginx -> Portal :8081`
- 本地和远端分支提交 `4420cca chore: add runtime observability ops`
- 修正检查脚本为 `HEAD` 探测 SSE 入口,避免健康检查打开真实上游 SSE;提交 `c9b7252 fix: avoid opening sse in runtime check`
@@ -576,8 +576,8 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
生产验证:
- `https://mm.tkmind.cn/api/status` 返回 `ok`
- `https://mm.tkmind.cn/api/runtime/status` 返回 router enabled,全部 goosed target healthy。
- `https://m.tkmind.cn/api/status` 返回 `ok`
- `https://m.tkmind.cn/api/runtime/status` 返回 router enabled,全部 goosed target healthy。
- `scripts/check-stream-runtime.mjs` 返回 `ok=true`
- `scripts/check-tool-runtime.mjs` 返回 `ok=true`,普通 chat 不注入 Aider/OpenHandscode mode 对白名单用户可注入。
- `scripts/runtime-worker-drain.mjs status` 返回 `ok=true`,四个 worker drain=false。
@@ -676,7 +676,7 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
生产验证:
- `https://mm.tkmind.cn/api/status` 返回 `ok`
- `https://m.tkmind.cn/api/status` 返回 `ok`
- `/api/runtime/status.toolRuntime.codeRunsEnabled=false`
- 全部 goosed target healthy。
- `scripts/check-agent-code-run-entry.mjs` 返回 `ok=true`
@@ -735,7 +735,7 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
- `dryRun=true`
- 四个 worker 均列出。
- 当前无 stale worker,未执行 apply。
- `https://mm.tkmind.cn/api/status` 返回 `ok`
- `https://m.tkmind.cn/api/status` 返回 `ok`
### 2026-07-02 P5.7 Worker Metrics 采样接入
@@ -799,7 +799,7 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
- `containerHealth`
- `metricsSampledAt`
-`score`
- `https://mm.tkmind.cn/api/status` 返回 `ok`
- `https://m.tkmind.cn/api/status` 返回 `ok`
- `scripts/check-stream-runtime.mjs` 返回 `ok=true`
- `scripts/check-agent-code-run-entry.mjs` 返回 `ok=true`
- `scripts/runtime-worker-drain.mjs reconcile` 返回 `ok=true``dryRun=true`
@@ -903,7 +903,7 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
- `/Users/john/Project/Memind/server.mjs`
- `/Users/john/Project/Memind/scripts/runtime-slo-report.mjs`
- 已执行 `launchctl kickstart -k gui/$(id -u)/cn.tkmind.memind-portal`
- 重启窗口内 `mm.tkmind.cn` 曾短暂返回 nginx `502`Portal 随后正常监听 `:8081`,公网 `https://mm.tkmind.cn/api/status` 返回 `ok`
- 重启窗口内 `m.tkmind.cn` 曾短暂返回 nginx `502`Portal 随后正常监听 `:8081`,公网 `https://m.tkmind.cn/api/status` 返回 `ok`
生产验证:
@@ -963,7 +963,7 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
- `/Users/john/Project/Memind/server.mjs`
- `/Users/john/Project/Memind/scripts/runtime-slo-report.mjs`
- 已执行 `launchctl kickstart -k gui/$(id -u)/cn.tkmind.memind-portal`
- 重启窗口内 `mm.tkmind.cn` 曾短暂返回 nginx `502`Portal 随后正常监听 `:8081`,公网 `https://mm.tkmind.cn/api/status` 返回 `ok`
- 重启窗口内 `m.tkmind.cn` 曾短暂返回 nginx `502`Portal 随后正常监听 `:8081`,公网 `https://m.tkmind.cn/api/status` 返回 `ok`
生产验证:
@@ -1029,7 +1029,7 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
- `/Users/john/Project/Memind/scripts/agent-run-worker.mjs`
- `/Users/john/Project/Memind/RUNBOOK.txt`
- 已执行 `launchctl kickstart -k gui/$(id -u)/cn.tkmind.memind-portal`
- 重启窗口内 `mm.tkmind.cn` 曾短暂返回 nginx `502`Portal 随后正常监听 `:8081`,公网 runtime status 返回 `ok=true`
- 重启窗口内 `m.tkmind.cn` 曾短暂返回 nginx `502`Portal 随后正常监听 `:8081`,公网 runtime status 返回 `ok=true`
生产验证:
@@ -1084,7 +1084,7 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
- `/Users/john/Project/Memind/scripts/runtime-slo-report.mjs`
- `/Users/john/Project/Memind/scripts/agent-run-worker.mjs`
- 已执行 `launchctl kickstart -k gui/$(id -u)/cn.tkmind.memind-portal`
- 重启窗口内 `mm.tkmind.cn` 曾短暂返回 nginx `502`Portal 随后正常监听 `:8081`,公网 `https://mm.tkmind.cn/api/status` 返回 `ok`
- 重启窗口内 `m.tkmind.cn` 曾短暂返回 nginx `502`Portal 随后正常监听 `:8081`,公网 `https://m.tkmind.cn/api/status` 返回 `ok`
生产验证:
@@ -1333,7 +1333,7 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
- `toolRuntime.queue.inFlight=0`
- `toolRuntime.queue.pendingDispatches=0`
- `toolRuntime.queue.statusCounts={}`
- `mm.tkmind.cn` runtime health 仍为 `ok=true`
- `m.tkmind.cn` runtime health 仍为 `ok=true`
### 2026-07-02 P5.13 Runtime SLO Report Retention
@@ -1444,7 +1444,7 @@ docker exec memind-runtime-redis redis-cli DEL memind:runtime:worker:goosed-3:dr
发布后状态:
- `https://mm.tkmind.cn/api/status`: `ok`
- `https://m.tkmind.cn/api/status`: `ok`
- `toolRuntime.codeRunsEnabled=false`
- `toolRuntime.chatInjectsCodeTools=false`
- `toolRuntime.queue.autoDispatch=true`
@@ -1536,7 +1536,7 @@ canary 验证:
- `/Users/john/Project/backups/memind/memind-persisted-20260702-085706-a0af049-before.tar.gz`
- `/Users/john/Project/archives/Memind-source-before-20260702-085706-a0af049`
- 恢复后验证:
- `https://mm.tkmind.cn/api/status`: `ok`
- `https://m.tkmind.cn/api/status`: `ok`
- `toolRuntime.codeRunsEnabled=false`
- `toolRuntime.chatInjectsCodeTools=false`
- `toolRuntime.queue.autoDispatch=true`
@@ -1668,8 +1668,8 @@ canary 验证:
- 未删除 PG 数据
- 未删除或改写 MindSpace 用户数据
- 发布验证:
- `https://mm.tkmind.cn/api/status`: `ok`
- `https://mm.tkmind.cn/api/runtime/status`: `ok=true`
- `https://m.tkmind.cn/api/status`: `ok`
- `https://m.tkmind.cn/api/runtime/status`: `ok=true`
- `toolRuntime.codeRunsEnabled=false`
- `toolRuntime.chatInjectsCodeTools=false`
- `toolRuntime.queue.toolGateway.enabled=false`
@@ -1809,7 +1809,7 @@ Dry-run canary:
- 生产 `.env``MEMIND_TOOL_GATEWAY_*`
- 生产 `.env``MEMIND_AGENT_CODE_RUNS_*`
- `https://mm.tkmind.cn/api/runtime/status`:
- `https://m.tkmind.cn/api/runtime/status`:
- `ok=true`
- `toolRuntime.codeRunsEnabled=false`
- `toolRuntime.queue.toolGateway.enabled=false`
@@ -1891,7 +1891,7 @@ file proof:
- 生产 `.env``MEMIND_TOOL_GATEWAY_*`
- 生产 `.env``MEMIND_AGENT_CODE_RUNS_*`
- `https://mm.tkmind.cn/api/runtime/status`:
- `https://m.tkmind.cn/api/runtime/status`:
- `ok=true`
- `toolRuntime.codeRunsEnabled=false`
- `toolRuntime.queue.toolGateway.enabled=false`
@@ -1986,7 +1986,7 @@ file proof:
- 已恢复 `.env`
- 临时登录 session 已 revoke。
- `https://mm.tkmind.cn/api/runtime/status`:
- `https://m.tkmind.cn/api/runtime/status`:
- `ok=true`
- `toolRuntime.codeRunsEnabled=false`
- `toolRuntime.queue.autoDispatch=true`
@@ -2056,11 +2056,11 @@ file proof:
- release 脚本第一次在已知历史 docx 缺失链接处停止。
- 按用户要求不修复/不删除/不改写历史用户数据,第二次发布使用 `ALLOW_MINDSPACE_PUBLIC_LINK_ISSUES=1` 仅跳过该守卫。
- release 过程中脚本完成当前 live 全目录备份和持久目录备份。
- 105 legacy tunnel step 仍由脚本执行并健康,但 H5 主路径继续是 `https://mm.tkmind.cn`
- 105 legacy tunnel step 仍由脚本执行并健康,但 H5 主路径继续是 `https://m.tkmind.cn`
发布后状态:
- `https://mm.tkmind.cn/api/runtime/status`:
- `https://m.tkmind.cn/api/runtime/status`:
- `ok=true`
- `toolRuntime.codeRunsEnabled=false`
- `toolRuntime.queue.autoDispatch=true`
@@ -2150,7 +2150,7 @@ installer 默认行为:
发布后状态:
- `https://mm.tkmind.cn/api/runtime/status`:
- `https://m.tkmind.cn/api/runtime/status`:
- `ok=true`
- `toolRuntime.codeRunsEnabled=false`
- `toolRuntime.queue.autoDispatch=true`
@@ -2266,7 +2266,7 @@ canary repo:
- `installed-disabled`
- `state=not running`
- no `agent-run-worker.mjs` process
- `https://mm.tkmind.cn/api/runtime/status`:
- `https://m.tkmind.cn/api/runtime/status`:
- `ok=true`
- `toolRuntime.codeRunsEnabled=false`
- `toolRuntime.queue.autoDispatch=true`
@@ -2338,7 +2338,7 @@ canary repo:
发布后验证:
- `https://mm.tkmind.cn/api/runtime/status`:
- `https://m.tkmind.cn/api/runtime/status`:
- `ok=true`
- `toolRuntime.codeRunsEnabled=false`
- `toolRuntime.queue.autoDispatch=true`
@@ -2426,14 +2426,14 @@ runtime/status:
- release 脚本在 legacy `m.tkmind.cn` tunnel step 短暂返回失败;Portal runtime 已切换且健康。
- 后续检查显示:
- `mm.tkmind.cn` 主路径正常。
- `m.tkmind.cn` 主路径正常。
- `cn.tkmind.memind-portal-tunnel` 已恢复 running。
- Portal node pid `35983` 正在监听 `:8081`
- 该 legacy tunnel 不是当前 H5 主路径,当前 H5 主路径仍是 `https://mm.tkmind.cn`
- 该 legacy tunnel 不是当前 H5 主路径,当前 H5 主路径仍是 `https://m.tkmind.cn`
发布后状态:
- `https://mm.tkmind.cn/api/runtime/status`:
- `https://m.tkmind.cn/api/runtime/status`:
- `ok=true`
- `toolRuntime.codeRunPolicy.enabled=false`
- `toolRuntime.codeRunPolicy.userAllowlist=[]`
@@ -2722,7 +2722,7 @@ runtime/status:
验证:
- `https://mm.tkmind.cn/api/status` 返回 `ok`
- `https://m.tkmind.cn/api/status` 返回 `ok`
- `/api/runtime/status`:
- `codeRunPolicy.requireValidation=true`
- `toolRuntime.queue.maxConcurrentRuns=2`
@@ -2849,8 +2849,8 @@ runtime/status:
生产验证:
- `https://mm.tkmind.cn/api/status` 返回 `ok`
- `https://mm.tkmind.cn/auth/status` 未登录返回 `200 {"authenticated":false,"mode":"user"}`
- `https://m.tkmind.cn/api/status` 返回 `ok`
- `https://m.tkmind.cn/auth/status` 未登录返回 `200 {"authenticated":false,"mode":"user"}`
- `/api/runtime/status.toolRuntime`:
- `codeRunsEnabled=true`
- `requireValidation=true`
@@ -2909,7 +2909,7 @@ runtime/status:
生产验证:
- `https://mm.tkmind.cn/` 已加载新 bundle:
- `https://m.tkmind.cn/` 已加载新 bundle:
- `/assets/index-jYf9W5vk.js`
- `/api/runtime/status`:
- `ok=true`
@@ -2990,7 +2990,7 @@ runtime/status:
生产验证:
- `https://mm.tkmind.cn/api/status` 返回 `ok`
- `https://m.tkmind.cn/api/status` 返回 `ok`
- `/api/runtime/status.toolRuntime.queue`:
- `maxConcurrentRuns=2`
- `heartbeatMs=30000`
+7 -7
View File
@@ -19,7 +19,7 @@
- 不在生产运行目录执行 `git reset --hard``git clean -fdx``rm -rf`、数据库清理或数据目录同步删除。
- 不提交生产 `.env`、数据库、`MindSpace/``data/``users/``.tailscale/``logs/`、证书、密钥和运行缓存。
- 本次 H5 public base 临时切到 `https://mm.tkmind.cn`
- 本次 H5 public base 临时切到 `https://m.tkmind.cn`
- 后续公网 H5 不再依赖 105 转发链路;105 只保留 legacy/rollback 说明。
## 远程开发机拉取方式
@@ -51,8 +51,8 @@ cp .env.example .env
生产关键项:
```text
H5_PUBLIC_BASE_URL=https://mm.tkmind.cn
VITE_MINDSPACE_BASE=https://mm.tkmind.cn
H5_PUBLIC_BASE_URL=https://m.tkmind.cn
VITE_MINDSPACE_BASE=https://m.tkmind.cn
MEMIND_RUNTIME_REDIS_URL=redis://127.0.0.1:6379/0
MEMIND_RUNTIME_REDIS_NAMESPACE=memind:runtime
```
@@ -62,8 +62,8 @@ MEMIND_RUNTIME_REDIS_NAMESPACE=memind:runtime
- StreamController v1: SSE headers、flush、abort propagation、backpressure-aware pipeline。
- Redis Runtime Router v1: session pointer、worker score、active stream、drain。
- Runtime status: `/api/runtime/status`
- Gateway SSE 示例: `deploy/nginx/mm.tkmind.cn.conf`
- H5 public base: `mm.tkmind.cn`
- Gateway SSE 示例: `m.tkmind.cn` 对应的 nginx SSE 配置
- H5 public base: `m.tkmind.cn`
- 普通用户默认不暴露 Aider/OpenHands,显式白名单保留。
## 验证命令
@@ -71,8 +71,8 @@ MEMIND_RUNTIME_REDIS_NAMESPACE=memind:runtime
```bash
node --check server.mjs
node --check scripts/wechat-mp-menu.mjs
curl -sk https://mm.tkmind.cn/api/status
curl -sk https://mm.tkmind.cn/api/runtime/status
curl -sk https://m.tkmind.cn/api/status
curl -sk https://m.tkmind.cn/api/runtime/status
```
## 回滚思路
+1 -1
View File
@@ -110,7 +110,7 @@ Plaza 本地开发说明见 [plaza-local.md](./plaza-local.md)。生产发布、
|---|---|---|
| 配置真相 | 复制 `.env.example`,只填本地联调值 | 仅在 103 维护,**不提交 Git** |
| `TKMIND_API_TARGET` | 通常单实例 `https://127.0.0.1:18006` | 9 个 goosed target`18006``18014`),见 [103 runtime topology](./103-runtime-topology.md) |
| `H5_PUBLIC_BASE_URL` | `http://127.0.0.1:5173` | `https://mm.tkmind.cn` |
| `H5_PUBLIC_BASE_URL` | `http://127.0.0.1:5173` | `https://m.tkmind.cn` |
| `MEMIND_SESSION_BROKER_ENABLED` | Patch 2 起可本地设 `1` 验证 | 灰度窗口由运维在 103 `.env` 单独开启 |
| RDS / Redis | 可连本地 MySQL 或留空 | 生产 RDS + Redis,见 103 `.env` |
+1 -1
View File
@@ -403,7 +403,7 @@ async function writeMetadata() {
'Deployment and operations transport:',
' H5 public domain: m.tkmind.cn',
' Current public path: m.tkmind.cn -> 105 nginx -> 103 Portal :8081',
' Test-only path: mm.tkmind.cn -> 105 nginx -> local/103 test routing when explicitly enabled.',
' No separate public test domain remains; use explicit local/test overrides only when needed.',
' Production H5 and WeChat links should use m.tkmind.cn unless a test rollout explicitly overrides H5_PUBLIC_BASE_URL.',
'',
'Streaming runtime operations:',