Files
mnote/design/natfrp-migration-runbook.md
T
2026-01-15 20:54:21 +08:00

154 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 从 Cloudflare Tunnel 切换到 SakuraFrpNATFRP)操作指南
本文用于把当前的 Cloudflare Tunnel 替换为 SakuraFrpNATFRPHTTP/HTTPS 穿透,并保持域名不变(例如 `app.aichem.dpdns.org` 等),从而让远程浏览器与客户端都能通过固定域名访问本机服务。
参考文档(官方):`https://doc.natfrp.com/app/http.html`
---
## 0. 你需要先确认的前置条件
1. 你拥有 SakuraFrp 账号,并已开通/购买支持 **HTTP/HTTPS** 的穿透资源(隧道/节点)。
2. 你能管理 DNS(这里是 `*.aichem.dpdns.org`),可以新增/修改 CNAME 记录并等待生效。
3. 本机服务在本地能正常访问(端口以你实际为准):
- Web 前端:例如 `http://127.0.0.1:3000`
- 后端:例如 `http://127.0.0.1:8000`
- SupabaseKong 网关):例如 `http://127.0.0.1:54321`
- ONLYOFFICEWeb):例如 `http://127.0.0.1:8081`
> 注意:NATFRP 的“HTTP/HTTPS 隧道”通常只需要你填 **本地地址 + 本地端口 + 域名**;外部访问走 NATFRP 节点转发,不要求你在路由器上做端口映射。
---
## 1. 建议的域名与本地端口映射(按你的项目约定)
请把这些域名继续作为“唯一入口”,不要在客户端里写 `127.0.0.1`(避免远程客户端失败):
| 对外域名 | 作用 | 本地服务(示例) |
|---|---|---|
| `app.aichem.dpdns.org` | Web 前端(Next.js | `127.0.0.1:3000` |
| `backend.aichem.dpdns.org` | FastAPI 后端 | `127.0.0.1:8000` |
| `supabase.aichem.dpdns.org` | Supabase Kong | `127.0.0.1:54321` |
| `onlyoffice.aichem.dpdns.org` | ONLYOFFICEWeb | `127.0.0.1:8081` |
> 如果你本机端口不是这些值:以你实际运行的端口为准(只要域名保持不变,应用侧无需改动)。
---
## 2. 关闭 Cloudflare Tunnel(避免“同时生效”导致混乱)
目标:确保 `app/backend/supabase/onlyoffice` 这几个域名不再回源到 Cloudflare tunnel。
建议顺序:
1. 在 Cloudflare Zero Trust / Tunnel 面板中暂停或删除对应 Public Hostname 规则。
2. 在本机停止 `cloudflared`(如果你用的是服务方式/计划任务):
- Windows 服务:停止对应服务
- 或命令行启动的:关闭该进程窗口
3. 等待 12 分钟,确保 Cloudflare 侧不再回源。
---
## 3. 在 SakuraFrp 客户端 App 中创建(或导入)HTTP/HTTPS 隧道
### 3.1 为每个域名创建 1 条隧道
在 SakuraFrp 客户端 App(或其网页管理面板)里分别创建 4 条隧道(建议一个域名一条,便于排障):
- 类型:HTTP 或 HTTPS(建议优先 HTTPS
- 本地地址:`127.0.0.1`
- 本地端口:填你实际端口(参考上表)
- 绑定域名:填对应子域名(例如 `app.aichem.dpdns.org`
### 3.2 HTTPS 证书的两种做法(选其一)
做法 A(推荐):在 SakuraFrp 的隧道设置里启用/配置 HTTPS(如果支持自动证书或上传证书)。
做法 B:只用 HTTP 隧道,然后在你自己的反代层(例如 VPS 上的 Caddy/Nginx)终止 TLS,再转发到 NATFRP 的 HTTP 外网域名。
> 你当前使用的是 `https://app.aichem.dpdns.org`,因此最终必须能提供 HTTPS(要么由 NATFRP 提供,要么由你自己的反代层提供)。
---
## 4. 修改 DNS:把域名解析指向 SakuraFrp
核心思路:让 `app.aichem.dpdns.org` 等域名,解析到 NATFRP 提供的“外网域名/入口”。
常见做法(按 NATFRP 面板给出的信息填写):
-`app.aichem.dpdns.org` 设置 CNAME → NATFRP 给该隧道分配的外网域名
-`backend.aichem.dpdns.org` 设置 CNAME → 对应隧道外网域名
-`supabase.aichem.dpdns.org` 设置 CNAME → 对应隧道外网域名
-`onlyoffice.aichem.dpdns.org` 设置 CNAME → 对应隧道外网域名
建议:
- TTL 先设短一些(例如 60/120 秒)便于切换与回滚
- 修改后等待解析生效(可用 `nslookup` 或在线 DNS 工具验证)
---
## 5. 启动隧道并启动本机服务
1. 启动 SakuraFrp 客户端 App,确保 4 条隧道状态为“已连接/运行中”。
2. 启动本机服务:
- 前端(Next.js):监听 `127.0.0.1:3000`(或你的端口)
- 后端(FastAPI):监听 `127.0.0.1:8000`
- Supabase:确保 Kong 网关在 `127.0.0.1:54321`
- ONLYOFFICE:确保可通过 `http://127.0.0.1:8081` 打开
> 建议先确保“本机直连正常”,再用外网域名验证;不要一上来就只看外网,排障会非常痛苦。
---
## 6. 外网验证清单(强烈建议逐项验证)
下面命令建议在“非本机网络”(例如手机热点)执行,避免被 hosts/缓存误导:
```bash
curl -I https://app.aichem.dpdns.org/
curl -I https://app.aichem.dpdns.org/_next/static/chunks/ # 这里应当返回 200/403,而不是 404
curl -I https://backend.aichem.dpdns.org/health # 以你后端真实 health 路由为准
curl -I https://supabase.aichem.dpdns.org/auth/v1/health # Supabase GoTrue 健康检查
curl -I https://onlyoffice.aichem.dpdns.org/web-apps/apps/api/documents/api.js
```
如果 `/_next/static/...` 404,通常说明:
- 前端没跑起来;或
- 回源不是你预期的服务;或
- 你用的是 Next.js standalone,但 `.next/static` 没放到 server 期望位置。
---
## 7. 应用侧通常不需要改(但你应当检查这 3 件事)
在本项目的预期做法里,“域名是契约”,穿透只是把契约指到不同回源:
1. `wolai-frontend/public/mnote-env.json` 中的域名配置仍然使用:
- `supabaseUrl = https://supabase.aichem.dpdns.org`
- `backendUrl = https://backend.aichem.dpdns.org`
- `onlyofficeBaseUrlWeb = https://onlyoffice.aichem.dpdns.org`
- `onlyofficeBaseUrlDesktop = http://127.0.0.1:<本地onlyoffice端口>`(桌面端走本地)
2. 确保桌面端(Electron)不要再写死 `127.0.0.1` 作为“登录域名”,否则远程客户端必然失败。
3. Supabase 若涉及 OAuth 回调/邮件链接,域名变更会影响 redirect;但你这里“域名不变”,所以理论上不需要改 Supabase 配置。
---
## 8. 常见坑与处理建议
1. **WebSocket**Supabase realtime、ONLYOFFICE 都可能用到 WebSocket;如果某条隧道出现“能打开页面但实时断开”,优先检查 NATFRP 节点/隧道是否支持 WebSocket。
2. **超时/大文件**ONLYOFFICE 打开大文档/图片时可能超时;可在 NATFRP/反代层上调大超时、允许更大 body。
3. **缓存污染**:切换通道后浏览器可能缓存旧回源;建议强刷或无痕窗口验证。
4. **DNS 未生效**`nslookup app.aichem.dpdns.org` 看到的目标仍是旧值时,先别排应用,先把 DNS 跑通。
---
## 9. 回滚方案(出问题快速恢复)
1. 把 DNS CNAME 改回 Cloudflare Tunnel 的目标(或恢复 Cloudflare 的 Public Hostname 规则)。
2. 停掉 SakuraFrp 对应隧道(避免双通道造成回源混乱)。
3. 验证 `https://app.aichem.dpdns.org` 能回到 Cloudflare 路径。