154 lines
6.9 KiB
Markdown
154 lines
6.9 KiB
Markdown
# 从 Cloudflare Tunnel 切换到 SakuraFrp(NATFRP)操作指南
|
||
|
||
本文用于把当前的 Cloudflare Tunnel 替换为 SakuraFrp(NATFRP)HTTP/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`
|
||
- Supabase(Kong 网关):例如 `http://127.0.0.1:54321`
|
||
- ONLYOFFICE(Web):例如 `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` | ONLYOFFICE(Web) | `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. 等待 1~2 分钟,确保 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 路径。
|
||
|