# gadm 由 105 入口转发到 Studio

`gadm.tkmind.cn` 的生产链路和 Plaza 一样，都是 `105 入口 -> Studio 生产机`。
这里的后端服务名是 `memind_adm`，代码入口在本仓库的 `admin-server.mjs`。
根路径 `/` 默认进入 `gadm` 的管理页，也就是 `ops` 前端里的 `/admin` 段。

## 角色拆分

```text
浏览器 / 内部管理人员
    ↓
105 公网入口（gadm.tkmind.cn）
    ↓  nginx / 反代
Studio / 本机生产机
    ├─ ops 前台（/ops/，Vite 开发服务）
    └─ memind_adm :8082（admin-server.mjs）
        ├─ /healthz
        ├─ /admin-api/*
        └─ /api/ops/v1/*
```

`memind_adm` 只负责后端管理 API，不直接托管大部分前台页面。
`ops/` 里的后台 SPA 是独立页面，生产上由 `gadm.tkmind.cn/` 先跳转到 `/ops/admin/`，再由 105 反代回 Studio。

## 本地开发

```bash
pnpm dev:adm
```

默认监听 `http://127.0.0.1:8082`。

常见本地访问地址：

| 服务 | 地址 |
|------|------|
| memind_adm | http://127.0.0.1:8082 |
| ops 后台 | http://127.0.0.1:3002/ops/ |

## 测试机同步

如果要同步到测试目录，`memind_adm` 对应的是：

- 源码目录：`/Users/john/PycharmProjects/test/test-memind`
- 测试镜像目录：`/Users/john/PycharmProjects/test/test-memindadm`

同步脚本：

```bash
bash scripts/deploy-to-test-host.sh --only-adm
```

如果你要同步三套目录，也可以直接：

```bash
bash scripts/deploy-to-test-host.sh
```

## 生产发布流程

生产上，`gadm.tkmind.cn` 解析到 105，105 负责把：

- `/` 重定向到 `/ops/admin/`
- `/ops/` 反代到 Studio 上的 ops 页面
- `/admin-api/` 和 `/api/ops/v1/` 反代到 Studio 上的 `memind_adm`

### 0. 本地改动确认

推荐从本地开发目录发布到 Studio：

```bash
cd /Users/john/PycharmProjects/test/test-memind
git status --short
```

如果你改的是 `admin-server.mjs`、`admin-routes.mjs`、`admin-*.mjs` 或 `ops/`，记得先本地自测。

### 1. 本地启动 / 自测

```bash
pnpm dev:adm
```

默认监听 `http://127.0.0.1:8082`，启动后先看：

```bash
curl -s http://127.0.0.1:8082/healthz
```

### 2. 同步到测试机

```bash
bash scripts/deploy-to-test-host.sh --only-adm
```

测试镜像目录是 `/Users/john/PycharmProjects/test/test-memindadm`。

### 3. Studio 生产机启动 / 重启

在 Studio 机器上，`memind_adm` 最终都应该由同一个入口启动：

```bash
cd /Users/john/Project/Memind
node admin-server.mjs
```

如果你们在 Studio 上用了 launchd / pm2 / systemd，就让守护脚最终执行上面这条命令。

常见的生产检查：

```bash
curl -s http://127.0.0.1:8082/healthz
curl -s http://127.0.0.1:8082/admin-api/summary
```

### 4. 105 入口反代

105 上的 nginx 应该把 `gadm.tkmind.cn` 回源到 Studio 的 `memind_adm :8082`。

如果你要确认 nginx 当前配置，优先看：

```bash
ssh ssh105 'nginx -t && systemctl reload nginx'
ssh ssh105 'sed -n "1,220p" /etc/nginx/conf.d/gadm.tkmind.cn.conf'
```

上线后优先验证：

```bash
curl -I https://gadm.tkmind.cn/
curl -I https://gadm.tkmind.cn/ops/admin/
curl -s -D - -o /dev/null https://gadm.tkmind.cn/admin-api/summary
curl -s https://gadm.tkmind.cn/healthz
```

## 故障排查顺序

如果 `gadm.tkmind.cn` 挂了，按这个顺序查：

1. Studio 上 `http://127.0.0.1:8082/healthz` 是否正常
2. Studio 上 `memind_adm` 是否还在运行
3. 105 上 nginx 是否把 `gadm.tkmind.cn` 转发到了 Studio
4. `ADMIN_CONSOLES`、`ADMIN_API_ALLOWED_HOSTS`、`OPS_API_ALLOWED_HOSTS` 是否限制过严
5. `ops/` 是否还在用正确的 `'/admin-api'` 代理地址

## 相关文件

- [`admin-server.mjs`](/Users/john/PycharmProjects/test/test-memind/admin-server.mjs)
- [`scripts/deploy-to-test-host.sh`](/Users/john/PycharmProjects/test/test-memind/scripts/deploy-to-test-host.sh)
- [`scripts/local-test-proxy.mjs`](/Users/john/PycharmProjects/test/test-memind/scripts/local-test-proxy.mjs)
