最近在折腾一个多租户接入的场景,分享一个开源项目:cf-saas-tenant-router,思路是拿 Cloudflare for SaaS 做多租户的统一入口,客户域名不用托管进 Cloudflare 就能接进来。
它是怎么工作的
客户的域名 NS 完全不用动,继续留在客户自己的 DNS 那里。客户只需要在自己的 DNS 里加一条 CNAME,指向 opt.<宿主域名>,流量就进了 Cloudflare 的边缘节点。Cloudflare for SaaS 的 Custom Hostname 会自动给客户域名签发证书,Worker 再按请求里的 Host 去 D1 的租户表查这个域名属于哪个租户,然后把请求分流转发到各自的上游,比如 tgproxy、cf-erp、cf-subcloud 这类服务。转发的时候还支持 Origin 改写、页面里域名的替换,WebSocket 也能直接透传过去。
也就是说,租户侧的接入成本就是一条 CNAME,剩下的证书、路由、转发都由这一套系统来处理。
管理面板有四个标签页
- 租户:租户的增删改查、启用和停用都在这里。
- 接入码:生成 8 位接入码发给客户,客户在宿主域名下的 /join 页面自助接入,码是一次性的,还能防重放。
- 自定义主机名:创建和删除 Custom Hostname,详情弹窗里会把客户需要加的全部 DNS 指令都列出来,照着抄就行。
- 优选:多路优选入口的管理和在线测速。
新客户接入大概 3 分钟
流程是这样的:先在面板生成接入码发给客户,客户打开宿主域名的 /join,输入接入码和自己的域名,按提示加 CNAME,再补一条验证用的 TXT,或者做 DCV 委派 CNAME,等证书和主机名都变成绿灯就能用了。如果证书一直卡在待验证,多半是客户域名、或者它上级域名的 CAA 记录没有授权对应的 CA,先查 CAA。
部署是模板化的
任何一个新的 Cloudflare 账号从零开始部署,代码不用改一行:本机一条 npm run init 命令就能装好,或者走 GitHub Actions 全自动部署,push 之后自动上线,建 D1、写密钥、建 DNS、设置 Fallback Origin 这些步骤都是自动的。一个仓库还能用 GitHub Environments 同时管多个 Cloudflare 账号,每个账号对应一个 Environment。
新账号先人工做好三件套
- 宿主域名的 NS 先托管进 Cloudflare;
- 在控制台启用 Cloudflare for SaaS,这个步骤要绑卡;
- Fallback Origin 要在控制台手填,API 不接受 Token 认证,自动化走不通。
另外两点经验:优选 IP 建议每周跑一次维护;全部配置都在 wrangler.jsonc 的 vars 段,代码里没有任何硬编码。密钥要走 wrangler secret,不要在 Dashboard 里建明文变量,否则下次部署会被清掉。