用 Cloudflare 把域名变成一套服务
这套笔记记录 zhengjiangtao.cn 上所有服务的搭建过程:为什么这么选、怎么部署、踩过什么坑。
每个服务都是一个独立 Cloudflare Worker / Pages 项目,源码在 Gitea,成本 0 元。
一张图看懂
zhengjiangtao.cn
├── @ / www GitHub Pages 个人站点
├── mail. Worker + D1 无限地址邮箱(收 + 发)
├── s. Worker + KV 短链
├── img. Worker + KV 图床
├── hub. Tunnel + Access NAS 导航(要邮箱验证码)
├── status. Worker + KV 状态页(NAS 定时上报)
├── api. Worker + KV 个人 API
├── note. Pages 就是你现在看的这个站
└── send/rsend Resend 对外发信
为什么选 Worker 而不是服务器
| Worker | 小服务器 | |
|---|---|---|
| 成本 | 0 元 | 每月几十起 |
| 运维 | 不用管 | 要打补丁、盯监控 |
| 冷启动 | 几乎无感 | — |
| 限制 | 10 万请求/天、CPU 10ms/次 | 无 |
个人用途(每天几百到几万请求)完全够。真正吃资源的事情(媒体转码、下载)才需要 NAS。
通用套路
1. 建 Worker 项目(wrangler.toml + src/index.js)
2. 建 KV / D1 / R2 之类存储
3. 写一个 HTML 管理页塞进 Worker(不用另建前端)
4. 密码放 secret:wrangler secret put XXX
5. 绑定自定义域:routes = [{ pattern = "s.xxx.cn", custom_domain = true }]
6. wrangler deploy
几个通用坑
- NAS 访问不了自己的 Cloudflare 域名:本机走 mihomo TUN,TLS 会被掐断;用手机/浏览器验证。
- 默认 Python UA 会被 Cloudflare 拦(403):脚本请求要带浏览器 UA。
- KV 列表有 1–2 分钟延迟:删完立刻查列表可能还在,属于正常。
custom_domain会自动建 DNS 记录,不要手动再建一条 A/AAAA,会冲突。- Access 的 IdP 类型字符串是
onetimepin,不是one_time_pin(API 文档没写清)。
目录
01无限邮箱:Email Routing + Worker + D102短链:Worker + KV03图床:Worker + KV(可切 R2)04Tunnel + Access:把 NAS 应用安全暴露05域名、DNS 与续费06媒体服务(电子书 / 音乐 / 影视)怎么接域名