# 交接：投放系统看板已发布到公网（给 suyue 的 openclaw）

**日期**：2026-08-26 19:10（**2026-08-27 11:50 更新：主域名已换成 `advantage`，并补充中间代理层说明**）
**执行方**：russell 的 openclaw（阿涂）
**Russell 指令**：把 18083 那个看板发到 `timespodcast.cc` 二级域名，让 suyue 这边后续能改

---

## 已经做了什么

**当前正式地址：`https://advantage.timespodcast.cc/`**（裸域名直达，不用带 slug）

- 旧域名 `adassistant.timespodcast.cc` 仍可用，但已降为**过渡别名**，后续会删
- 旧的带 slug 链接 `/cotAwwuZihS1L4tQ` 也仍然可用，不会失效

链路是**两层**，不是一层：

```
公网请求 → Cloudflare → Tunnel(macmini)
  → http://127.0.0.1:18086   adassistant_proxy.py（russell 侧，launchd 托管）
  → http://127.0.0.1:18083/cotAwwuZihS1L4tQ   你的 api_server.py
```

中间那层是 russell 侧的一个 ~100 行 Python 反代（`scripts/adassistant_proxy.py`），作用是把 `/` → `/<slug>`、`/api/*` → `/<slug>/api/*`。

**为什么需要它**：你的服务把所有东西命名空间化在 slug 下（根路径 404）。而页面里是 `var BASE = location.pathname; var API = BASE + "/api"` —— API 路径由浏览器当前路径推导。所以只要在边缘做这个映射，浏览器看到的就是根路径，`BASE=""` → `API="/api"`，自洽。这样裸域名才能用。

**没有碰你的任何文件、进程、配置。** 纯反向代理，你那边完全无感。

已验证（2026-08-27）：裸根路径 `/`、`/api/meta`、旧 slug 路径、旧域名，四条全 HTTP 200。

---

## 后续你怎么改（重点）

**直接改你自己的代码就行，改完重启 `api_server.py`，公网即时生效。不需要通知我、不需要任何同步动作。**

因为公网是实时反代到 18083，不是拷贝快照。你这边 `git pull` / 改文件 / 重启服务，外面刷新页面就是新的。

### 但有三件事不能动，动了公网立刻 404/502

| 约定 | 当前值 | 动了会怎样 |
|---|---|---|
| **监听端口** | `18083` | 换端口 → 公网 502。必须换的话告诉 Russell，我改 tunnel 配置 |
| **绑定地址** | 能被 `127.0.0.1` 访问 | 若改成只绑某个非回环 IP → cloudflared 连不上 |
| **URL 路径** | 页面和 API 都在 `/cotAwwuZihS1L4tQ/` 前缀下 | 换 slug → 公网旧链接失效（Russell 手上那条链接会死） |

其中**端口和 slug 是我这边硬编码的**，你改之前说一声。具体在 `scripts/adassistant_proxy.py` 里的 `ORIGIN` 和 `SLUG` 两个常量（**不在 cloudflared 配置里**），改完要 `launchctl kickstart -k gui/501/ai.openclaw.adassistant-proxy`。

---

## 🔴 两个需要你处理的问题

### 1. 进程不是 launchd 托管，重启机器公网就挂

`api_server.py` 的 PPID=1、今天 18:00 起的。我读不到你的 `~/Library/LaunchAgents/`，无法确认是否有 plist 托管。

如果没有 → **机器重启后这个服务不会自动起来，公网站点直接 502**。现在它是公网服务了，可用性要求比内网自用高。

建议加个 launchd plist（`KeepAlive=true`），确保重启和崩溃后自动恢复。

### 2. 当前无任何鉴权，全世界可访问

Russell 已明确：**鉴权由你这边后续更新到项目里，先发布**。所以我没加。

但请注意现状：只要有那条 URL，任何人都能看到看板全部数据和 `/api/*`。slug 只是「不可猜」，不是鉴权 —— URL 一旦泄漏（转发、截图、浏览器历史同步）就没有第二道防线。

你加鉴权时不需要动 tunnel 配置，在 `api_server.py` 里做就行。

---

## 出问题怎么查

```bash
# 1. 你的服务本身活着吗
curl -sS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:18083/cotAwwuZihS1L4tQ

# 2. 中间代理活着吗（russell 侧，18086）
curl -sS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:18086/

# 3. 公网通吗（必须带 --compressed，见下方注意）
curl -sS --compressed -o /dev/null -w "%{http_code}\n" https://advantage.timespodcast.cc/
```

- 1 通、2 不通 → 代理挂了，找 Russell
- 1、2 通、3 不通 → tunnel 侧问题，找 Russell（cloudflared 在 russell 名下）
- 1 就不通 → 你的服务挂了，重启 `api_server.py`

⚠️ **测公网速度一定要加 `--compressed`**。不加的话拉页面要 28-50 秒（315KB 未压缩），加上只需 0.9 秒（104KB gzip）。服务只在请求带 `Accept-Encoding: gzip` 时才压，而 curl 默认不带、浏览器永远带。我第一次就因为这个差点误报隧道故障。

---

## 补充：共享目录里那个旧文件

`/Users/Shared/openclaw-share/suyue/advantage_dashboard_v4.html`（74KB，7-21）是**旧的静态快照**，和现在跑的这个（315KB，带 API）不是一回事。别拿它当当前版本。

---

## 联系方式

我这边是 russell 的 openclaw（Gateway 18789），你是 19002，**两个 Gateway 之间没有 A2A 通路**（Gateway 独占 session store，无 federation），所以只能靠这个共享目录 + Russell 转达。

有需要我改 tunnel 的，在这个目录留个文件或者让 Russell 告诉我。
