Skip to content

Commit c8e2b2e

Browse files
committed
chore(task): archive 05-13-rathole-config-examples-maintenance
1 parent 8c72b5a commit c8e2b2e

5 files changed

Lines changed: 251 additions & 0 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"_example": "Fill with {\"file\": \"<path>\", \"reason\": \"<why>\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"_example": "Fill with {\"file\": \"<path>\", \"reason\": \"<why>\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."}
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
# brainstorm: rathole 配置示例与维护脚本
2+
3+
## Goal
4+
5+
`config/network/tailscale` 下补充 rathole 配置示例文档与维护脚本,让实际使用者可以复制示例生成本地 `.local` 配置,并以裸二进制 + PM2 的方式完成启动、停止、查看配置、日志等维护操作,同时避免真实私有配置被提交到 Git。
6+
7+
## What I already know
8+
9+
* 用户希望增加一些 rathole 配置示例文档,位置倾向于 `config/network/tailscale`
10+
* 用户希望提供维护脚本,示例命名为 `start.ps1`
11+
* 实际使用预计采用 `.local` 结尾的配置文件,避免提交到 Git。
12+
* 仓库已有 `config/network/tailscale/derp` 模块,包含 `README.md``compose.yaml``.env.example``.env.local``start.ps1``.gitignore` 等维护模式。
13+
* 根目录 `.gitignore` 已忽略 `*.local.json``.env.local``*.env.local`
14+
* DERP 的 `start.ps1` 已有 Pester 测试 `tests/TailscaleDerpStart.Tests.ps1`,配置模板也有 `tests/TailscaleDerpComposeTemplate.Tests.ps1` 覆盖。
15+
* rathole 官方配置使用 TOML,常见拆分为 server/client 两个配置文件;真实 token 应留在 `.local.toml`
16+
* 用户担心容器比裸二进制占用更多资源,因此倾向裸二进制运行;PM2 可以作为进程管理器。
17+
* PM2 官方文档支持直接管理可执行二进制,ecosystem 配置可声明 `script``args`、日志和重启策略。
18+
* 仓库已有 `ai/coding/window-warmer/window-warmer.pm2.config.cjs` 作为 PM2 管理示例。
19+
* 用户选择 PM2 配置拆成 server/client 两份,避免一份配置里同时声明两端造成误启动。
20+
* 用户希望覆盖“公网白名单转发”场景:目标服务只允许某台公网服务器 IP 访问时,可在该公网服务器运行 rathole client,通过 rathole server 暴露的端口把流量转发到白名单目标服务,相当于四层反向代理/出口代理。
21+
22+
## Assumptions (temporary)
23+
24+
* rathole 示例会作为一个新的目录加入,例如 `config/network/rathole`
25+
* 共享文件应使用 `.example.*` 或 README 形式入库,真实配置使用 `.local.*` 并通过目录级 `.gitignore` 防误提交。
26+
* 维护脚本优先沿用现有 PowerShell `start.ps1` 风格,底层调用 PM2 管理 rathole 裸二进制。
27+
28+
## Open Questions
29+
30+
* 无。
31+
32+
## Requirements (evolving)
33+
34+
*`config/network/tailscale` 下新增 rathole 配置示例与说明。
35+
* 提供 `.local` 私有配置约定,并确保真实配置默认不会提交。
36+
* 提供维护脚本,降低启动、停止、日志、配置检查等操作成本。
37+
* 共享示例优先使用 `server.example.toml``client.example.toml`,真实配置优先使用 `server.local.toml``client.local.toml`
38+
* 公网白名单转发示例单独提供 `whitelist-proxy.example.toml`,避免基础 client 示例过载。
39+
* MVP 以裸二进制 + PM2 为主线,README 可简要说明 Docker Compose 只是备选方式。
40+
* 提供拆分的 PM2 ecosystem 示例,分别维护 rathole server 与 client 进程、配置路径、日志路径与基础重启策略。
41+
* `start.ps1` MVP 优先封装 PM2 常用动作,例如 `start``stop``restart``logs``status``delete``save``config``help`
42+
* README 和配置示例需要覆盖公网白名单转发场景,并说明 rathole 是 TCP/UDP 四层转发,不提供 HTTP Host、路径、TLS 终止等七层反向代理能力。
43+
44+
## Acceptance Criteria (evolving)
45+
46+
* [x] 仓库包含可复制的 rathole server/client 示例配置,且示例不包含真实密钥。
47+
* [x] README 说明 `.local` 配置文件的复制与维护流程。
48+
* [x] README 说明裸二进制 + PM2 是推荐日常运行方式,并交代 Docker Compose 作为备选的取舍。
49+
* [x] 维护脚本支持常用 PM2 维护动作,并能通过 dry-run 或测试验证关键命令生成逻辑。
50+
* [x] PM2 ecosystem 示例引用 `.local.toml` 配置路径,并避免写入真实 token。
51+
* [x] PM2 ecosystem 示例拆分 server/client 两份,使用者可以按机器角色选择启动。
52+
* [x] 示例文档包含公网白名单转发用法,并明确它是端口级四层转发。
53+
* [x] 仓库包含可复制的 `whitelist-proxy.example.toml`,用于公网 IP 白名单转发场景。
54+
* [x] Git 忽略规则覆盖真实 `.local` 配置文件。
55+
56+
## Test Scope Note
57+
58+
配置示例、PM2 ecosystem 和 README 属于配置/文档类产物,不编写专门 Pester 内容断言,也不要求为文档和配置文件保留单独测试;测试聚焦 `start.ps1` 的命令生成与维护逻辑。
59+
60+
## Definition of Done (team quality bar)
61+
62+
* Tests added/updated (unit/integration where appropriate)
63+
* Lint / typecheck / CI green
64+
* Docs/notes updated if behavior changes
65+
* Rollout/rollback considered if risky
66+
67+
## Out of Scope (explicit)
68+
69+
* 暂不变更现有 DERP 配置与脚本行为。
70+
* 暂不提交任何真实 rathole token、域名、端口或私有路径。
71+
* 暂不实现完整 Docker Compose 生命周期脚本。
72+
* 暂不实现 systemd 或 Windows Service 安装器。
73+
74+
## Technical Notes
75+
76+
* 已检查 `config/network/tailscale/derp` 现有结构,可作为 rathole 目录结构和脚本风格参考。
77+
* 已检查根目录 `.gitignore`,全局已有部分 `.local` 忽略规则,但 rathole 目录仍建议提供局部 `.gitignore` 以表达意图。
78+
* 相关测试线索:`tests/TailscaleDerpStart.Tests.ps1``tests/TailscaleDerpComposeTemplate.Tests.ps1`
79+
* 已检查仓库 PM2 示例与文档,相关路径包括 `ai/coding/window-warmer/README.md``ai/coding/window-warmer/window-warmer.pm2.config.cjs``docs/cheatsheet/node/pm2.md`
80+
81+
## Research References
82+
83+
* [`research/rathole-config-and-maintenance.md`](research/rathole-config-and-maintenance.md) — rathole 使用 TOML server/client 配置,推荐裸二进制 + PM2 作为主线,Compose 仅作为备选说明。
84+
85+
## Research Notes
86+
87+
### Feasible approaches here
88+
89+
**Approach A: Docker Compose 优先**
90+
91+
* How it works: 新增 `compose.yaml`,挂载 `server.local.toml` / `client.local.toml``start.ps1` 封装 compose 操作。
92+
* Pros: 与现有 DERP 目录模式一致,测试简单,维护动作稳定。
93+
* Cons: 用户担心容器比裸二进制占用更多资源,不符合当前偏好。
94+
95+
**Approach B: 裸二进制 + PM2 优先(当前推荐)**
96+
97+
* How it works: 提供 TOML 示例、PM2 ecosystem 示例与 `start.ps1`,由 PM2 管理 rathole 二进制进程。
98+
* Pros: 贴近 rathole 本体,资源占用更低;PM2 提供日志、重启和开机恢复能力。
99+
* Cons: 需要运行环境已安装 rathole 与 PM2。
100+
101+
**Approach C: systemd 优先**
102+
103+
* How it works: 提供 systemd unit 示例,用系统服务管理 rathole。
104+
* Pros: Linux 服务器最原生,开机自启和权限边界清晰。
105+
* Cons: 跨平台性弱,脚本复杂度高于 PM2 MVP。
106+
107+
## Decision (ADR-lite)
108+
109+
**Context**: rathole 可通过容器或裸二进制运行;用户倾向降低常驻资源占用,并接受使用 PM2 做进程管理。
110+
111+
**Decision**: MVP 采用裸二进制 + PM2 主线。文档说明 Compose 只是备选方式,维护脚本优先封装 PM2 动作。
112+
113+
**Consequences**: 第一版需要用户自行安装 rathole 与 PM2,但避免容器层开销;脚本测试聚焦 PM2 命令生成与维护逻辑,`.local.toml` 保护和 README 可操作性通过文档约定维护。后续如要更贴近 Linux 生产部署,可扩展 systemd 示例或安装器。
114+
115+
**Decision**: 公网白名单转发示例单独放入 `whitelist-proxy.example.toml`
116+
117+
**Consequences**: 基础 client 示例保持简单,白名单转发场景具备独立可复制模板;README 需要解释它与基础 client 示例的关系。
118+
119+
## Use Cases
120+
121+
### 公网白名单转发
122+
123+
目标服务只允许某台公网服务器 IP 访问时,可以把这台公网服务器作为 rathole client 所在机器,由它主动访问白名单目标服务;另一台入口机器运行 rathole server 并暴露访问端口。访问入口机器端口的 TCP/UDP 流量会经 rathole 隧道转到公网白名单服务器,再由该服务器访问目标服务。
124+
125+
注意:该模式是端口级四层转发,适合数据库、SSH、HTTP API 的固定端口透传;如果需要按域名、路径、Header、证书终止做路由,应继续使用 Nginx/Caddy/Traefik 等七层反向代理。
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# rathole 配置与维护脚本调研
2+
3+
## 背景
4+
5+
用户希望在 `config/network/tailscale` 下增加 rathole 配置示例文档,并提供维护脚本。真实配置预计使用 `.local` 后缀,避免提交到 Git。
6+
7+
## 资料来源
8+
9+
* Context7 查询 `rathole` 未命中 rathole 本体,结果偏到无关库,因此没有采用。
10+
* rathole 官方仓库 README:`https://github.com/rathole-org/rathole`
11+
* rathole 官方 examples:`https://github.com/rathole-org/rathole/tree/main/examples`
12+
13+
## rathole 配置约定
14+
15+
* rathole 使用 TOML 配置,常见形态为 `server.toml``client.toml`
16+
* 当配置文件只包含 `[server]``[client]` 其中之一时,rathole 会自动判断运行模式;只有把 server/client 合并到同一个文件时才需要 `--server``--client`
17+
* 服务端常见字段:
18+
* `[server]`
19+
* `bind_addr`
20+
* `[server.services.<name>]`
21+
* `token`
22+
* `bind_addr`
23+
* 客户端常见字段:
24+
* `[client]`
25+
* `remote_addr`
26+
* `[client.services.<name>]`
27+
* `token`
28+
* `local_addr`
29+
* token 属于敏感配置,示例应使用占位值,真实 token 放入 `.local.toml`
30+
31+
## 公网白名单转发场景
32+
33+
* rathole 的 server 负责在入口侧监听公开端口,client 负责连接 server 并把流量转发到 `local_addr`
34+
* 当某个第三方服务只允许固定公网 IP 访问时,可以把 rathole client 部署在这台被白名单允许的公网服务器上,并把 `local_addr` 指向第三方服务地址。
35+
* 外部使用者访问 rathole server 暴露的端口后,流量会通过隧道进入白名单公网服务器,再由该服务器访问第三方服务;第三方服务看到的来源 IP 是白名单公网服务器。
36+
* 该模式是 TCP/UDP 四层端口转发,不是 HTTP 七层反向代理;不负责 Host、路径、Header 路由或 TLS 终止。
37+
* 用户选择单独提供 `whitelist-proxy.example.toml`,避免基础 client 示例包含过多场景分支。
38+
39+
## PM2 维护调研
40+
41+
* Context7 命中 PM2 官方库 `/unitech/pm2`
42+
* PM2 支持直接启动可执行二进制:`pm2 start ./binary-app`
43+
* PM2 ecosystem 配置支持 `script``args``cwd`、日志文件、`autorestart``max_restarts``restart_delay` 等字段,适合管理 rathole 这种长驻单二进制进程。
44+
* 仓库已有 `ai/coding/window-warmer/window-warmer.pm2.config.cjs` 与 README 的 PM2 管理示例,可复用“配置文件 + start/logs/restart/stop/save/startup 文档”的表达方式。
45+
46+
## 维护方式选项
47+
48+
### 方案 A:Docker Compose 优先
49+
50+
* 目录提供 `compose.yaml`,挂载 `server.local.toml``client.local.toml`
51+
* `start.ps1` 参考 DERP 模板封装 `docker compose`
52+
* `up`
53+
* `down`
54+
* `restart`
55+
* `logs`
56+
* `ps`
57+
* `pull`
58+
* `config`
59+
* 优点:和现有 `config/network/tailscale/derp/start.ps1` 一致;测试可以复用 dry-run 与 compose 参数生成思路。
60+
* 缺点:相比裸二进制多一层容器隔离,用户明确更倾向低开销运行方式。
61+
62+
### 方案 B:裸二进制 + PM2 优先(推荐)
63+
64+
* 提供 `server.example.toml``client.example.toml`、拆分的 PM2 ecosystem 示例和 `start.ps1` 包装。
65+
* `start.ps1` 优先封装 PM2 常用动作:
66+
* `start`
67+
* `stop`
68+
* `restart`
69+
* `logs`
70+
* `status`
71+
* `delete`
72+
* `save`
73+
* `config`
74+
* 优点:贴近 rathole 本体,避免容器额外开销;PM2 负责后台运行、日志和重启策略,仓库已有 PM2 管理文档可参考。
75+
* 缺点:运行机器需要安装 rathole 与 PM2;Linux production 场景下 systemd 可能更原生,但不作为本次 MVP。
76+
77+
### 方案 C:文档覆盖两者,脚本只覆盖 PM2
78+
79+
* README 简要说明 Docker Compose 也可以运行,但本仓库脚本与示例主线转向裸二进制 + PM2。
80+
* 优点:满足用户低资源偏好,同时保留容器化备选说明。
81+
* 缺点:第一版不提供 Compose 生命周期脚本。
82+
83+
## 映射到当前仓库
84+
85+
* 当前 `config/network/tailscale/derp` 已提供 compose + `.env.local` + `start.ps1` 模式,可参考 `start.ps1` 的函数注释、dry-run 和测试方式,但 rathole 不直接沿用 Compose 主线。
86+
* 仓库已有 PM2 示例:`ai/coding/window-warmer/window-warmer.pm2.config.cjs`
87+
* 根目录 `.gitignore` 已忽略 `*.local.json``.env.local``*.env.local`,但尚未覆盖 `*.local.toml`
88+
* rathole 真实配置建议命名为:
89+
* `server.local.toml`
90+
* `client.local.toml`
91+
* 共享示例建议命名为:
92+
* `server.example.toml`
93+
* `client.example.toml`
94+
* `whitelist-proxy.example.toml`
95+
96+
## 推荐
97+
98+
采用方案 C:文档主线为裸二进制 + PM2,脚本 MVP 只覆盖 PM2 常用维护动作;PM2 配置拆成 server/client 两份;README 简要保留 Compose 备选说明。这样满足用户对资源占用的偏好,同时借 PM2 获得后台运行、日志和重启管理能力,并避免同一机器误启动不需要的一端。
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"id": "rathole-config-examples-maintenance",
3+
"name": "rathole-config-examples-maintenance",
4+
"title": "brainstorm: rathole 配置示例与维护脚本",
5+
"description": "",
6+
"status": "completed",
7+
"dev_type": null,
8+
"scope": null,
9+
"package": null,
10+
"priority": "P2",
11+
"creator": "mudssky",
12+
"assignee": "mudssky",
13+
"createdAt": "2026-05-13",
14+
"completedAt": "2026-05-13",
15+
"branch": null,
16+
"base_branch": "master",
17+
"worktree_path": null,
18+
"commit": null,
19+
"pr_url": null,
20+
"subtasks": [],
21+
"children": [],
22+
"parent": null,
23+
"relatedFiles": [],
24+
"notes": "",
25+
"meta": {}
26+
}

0 commit comments

Comments
 (0)