
Tunnel 做内网穿透、R2 存文件、Workers 跑后端逻辑、D1 当数据库——四个产品串起来,可以零成本搭一个完整的个人基础设施。不需要买 VPS,不需要公网 IP,不需要配 Nginx 反代,一个 Cloudflare 账号全搞定。
这张免费桌子有多大
先看 Cloudflare 免费套餐给的东西。这些不是”试用额度”——是持续免费的正式套餐。对于个人项目和中小站点来说,大多数场景根本碰不到上限:
| 产品 | 免费额度 | 能干什么 |
|---|---|---|
| CDN + DNS | 不限流量 | 全球加速 + DDoS 防护 |
| Tunnel | 完全免费 | 内网穿透,无需公网 IP |
| R2 存储 | 10 GB / 月 | 图床、静态资源、备份 |
| Workers | 10 万请求 / 天 | 短链、API 代理、表单处理 |
| D1 数据库 | 5 GB 存储 | 边缘 SQLite,和 Workers 原生集成 |
关键点:Tunnel 完全免费,不走流量计费。R2 和 D1 的免费额度对于个人项目几乎不可能用超。Workers 10 万/天对一个个人博客的短链服务绰绰有余——大部分个人项目的 Workers 日请求量在几百到几千之间。
项目一:零成本个人图床
用 R2 存图片,Workers 做上传 API,Tunnel 暴露本地管理面板。
浏览器上传 → Workers API(鉴权+写 R2) → R2 Bucket(存储)
外网访问 → img.yourdomain.com → R2 公开读取
Step 1:创建 R2 Bucket
CF 控制台 → R2 → Create Bucket → 命名为 my-images。默认就是公开可读。绑定自定义域名 img.yourdomain.com 后,每个文件自动获得一个 CDN 加速的 URL:
https://img.yourdomain.com/screenshots/2026/nginx-config.png
Step 2:Workers 上传接口
创建一个 Worker,10 行代码搞定文件上传:
export default {
async fetch(request, env) {
// 简单 token 鉴权
const token = request.headers.get('X-Upload-Token');
if (token !== env.UPLOAD_SECRET) {
return new Response('Unauthorized', { status: 401 });
}
if (request.method === 'PUT') {
const url = new URL(request.url);
const key = url.pathname.slice(1); // /screenshots/foo.png → key
await env.MY_BUCKET.put(key, request.body);
return new Response(`https://img.yourdomain.com/${key}`, { status: 201 });
}
return new Response('PUT to upload', { status: 405 });
}
}
Worker 里绑定 R2 bucket(MY_BUCKET)和设置环境变量 UPLOAD_SECRET 都在 CF 控制台完成,不需要改代码。绑定后 Worker 自动能读写 R2,比配 S3 SDK 省心得多。
Step 3:本地用 curl 上传
$ curl -X PUT
-H "X-Upload-Token: your-secret-token"
--data-binary @screenshot.png
https://upload.yourdomain.com/screenshots/nginx-config.png
# 返回:
https://img.yourdomain.com/screenshots/nginx-config.png
还可以集成到 macOS 的 Shortcuts 或 Raycast 里,截图 → 一键上传 → 自动复制 URL 到剪贴板。
项目二:短链服务
用 Workers + D1 做一个短链系统,核心逻辑 30 行:
export default {
async fetch(request, env) {
const url = new URL(request.url);
const slug = url.pathname.slice(1);
if (request.method === 'POST') {
// 创建短链
const { target } = await request.json();
const id = crypto.randomUUID().slice(0, 6);
await env.DB.prepare(
'INSERT INTO links (id, target) VALUES (?, ?)'
).bind(id, target).run();
return Response.json({ short: `https://s.yourdomain.com/${id}` });
}
// 重定向
const row = await env.DB.prepare(
'SELECT target FROM links WHERE id = ?'
).bind(slug).first();
if (row) return Response.redirect(row.target, 301);
return new Response('Not found', { status: 404 });
}
}
D1 建表只需要一条 SQL:
CREATE TABLE links (
id TEXT PRIMARY KEY,
target TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
D1 本质是 Cloudflare 全托管的 SQLite,和 Workers 跑在同一个边缘网络上,延迟极低,通常只有几毫秒。5GB 免费额度够存几百万条短链。
项目三:API 代理网关
很多海外 API(OpenAI、Claude、Stripe)对国内 IP 直接拒绝或限速。Workers 可以做一个轻量级代理:
export default {
async fetch(request) {
const url = new URL(request.url);
// 只代理 /api/ 前缀的请求
if (!url.pathname.startsWith('/api/')) {
return new Response('Not found', { status: 404 });
}
// 转发到真实 API
const target = 'https://api.openai.com' + url.pathname;
// 保留原始 Authorization header
const modified = new Request(target, {
method: request.method,
headers: request.headers,
body: request.body
});
return fetch(modified);
}
}
绑定到 api.yourdomain.com,代码里 fetch('https://api.openai.com/...') 改成 fetch('https://api.yourdomain.com/api/...')。Cloudflare 的全球网络帮你做中转,延迟通常比直连更低。
再加一个环境变量做 API key 白名单,防止被滥用:
const allowedKeys = env.ALLOWED_KEYS.split(',');
// 检查请求的 Authorization 是否在白名单里
const authHeader = request.headers.get('Authorization') || '';
const key = authHeader.replace('Bearer ', '');
if (!allowedKeys.includes(key)) {
return new Response('Unauthorized', { status: 401 });
}
项目四:Tunnel — 不买公网 IP 也能跑 Web 服务
家里或办公室的机器没有公网 IP?一台树莓派跑着本地服务想从外网访问?
Cloudflare Tunnel 解决的就是这个问题。
本地运行
cloudflared 进程 → 和 Cloudflare 边缘建立一条持久的 QUIC 隧道 → 外部请求经过 CF 网络 → 通过隧道转发到本地服务。
全程不需要开端口、不需要公网 IP、不需要 DDNS。
安装和配置:
# 安装 cloudflared
$ curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
-o /usr/local/bin/cloudflared && chmod +x /usr/local/bin/cloudflared
# 登录 CF
$ cloudflared tunnel login
# 浏览器弹窗授权 → 自动下载 cert.pem
# 创建隧道
$ cloudflared tunnel create my-tunnel
Created tunnel my-tunnel with id abc-def-123
# 配置 DNS — 让 tunnel.yourdomain.com 指向这条隧道
$ cloudflared tunnel route dns my-tunnel tunnel.yourdomain.com
# 跑起来 — 把本地 3000 端口暴露出去
$ cloudflared tunnel run --url http://localhost:3000 my-tunnel
推荐用 systemd service 守护进程(没错,就是上一节讲的那个):
[Unit]
Description=Cloudflare Tunnel
After=network.target
[Service]
ExecStart=/usr/local/bin/cloudflared tunnel run my-tunnel
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Tunnel 最常见的场景:
| 场景 | 之前 | 用 Tunnel 后 |
|---|---|---|
| 本地开发预览给客户看 | 部署到服务器或 ngrok | cloudflared tunnel --url localhost:3000 |
| NAS/树莓派内网穿透 | DDNS + 端口转发 + 担心运营商封端口 | cloudflared 常驻进程即可 |
| 不想暴露服务器真实 IP | CDN 只保护 HTTP 层 | Tunnel 完全不开端口,无 IP 暴露面 |
四个项目串联起来
最后看一下全景架构——把图床、短链、API 网关、Tunnel 串起来:
gkmix.com — 主站(CDN 加速)
img.gkmix.com — 图床(R2 公开读取)
s.gkmix.com — 短链(Workers + D1)
api.gkmix.com — API 代理(Workers)
dev.gkmix.com — 本地开发预览(Tunnel)
upload.gkmix.com — 图片上传接口(Workers)
所有这些子域都在 Cloudflare DNS 上配置,每个指向不同的产品,但都在同一个免费账户下。零成本,但架构上和一个付费的基础设施方案没有本质区别——多了一个 Workers/D1/Tunnel 的钱包而已。
什么时候该开始付费
免费套餐在以下情况下会不够用:
- Workers 日请求超过 10 万 → Workers Paid $5/月(1000 万请求/月)
- R2 存储超过 10 GB → $0.015/GB/月(超过部分按量计费)
- 需要 Workers 的 CPU 密集型计算(免费版 CPU 时间限 10ms/请求)
- 需要 20 个以上的免费 Workers 路由
但说实话——一个个人博客或小项目的图床、短链、API 代理加起来,日请求基本不超过四位数。
部署顺序建议
四个项目不用一次全搭。按优先级来:
第一天:Tunnel。如果你有本地服务想从外网访问,这是最立竿见影的——10 分钟装完 cloudflared 就能用。
第二天:R2 图床。替代 imgur 或七牛,自己有 CDN 加速的域名,图片链接永久可控。配合 macOS Shortcuts 或 Raycast 做一键上传,体验比任何第三方图床都好。
第三天:短链服务。如果你经常在社交媒体分享链接,一个自己的短链域名(比如 s.yourdomain.com/abc123)比 bit.ly 更可控。不依赖任何第三方服务,链接也不会哪天突然失效。
最后:API 代理。如果你的开发工作中需要频繁调用海外 API,Workers 代理能省掉每次配 VPN 的麻烦。
每个项目都独立——不需要先做完图床才能做短链。搭完一个就能用,想加再加。整套搭完大概三四个小时,之后基本零维护。
相关阅读:如果还没搭建 WordPress 站点,先看这篇 WordPress VPS 从零到一部署实录,裸机到 HTTPS 再到缓存,完整流程。
Cloudflare 免费套餐不是”试用”——它给的量对个人开发者是真的够用的。
关键不是它给了多少,是四个产品(Tunnel + R2 + Workers + D1)的组合。单独一个 R2 只是便宜的对象存储,四个串起来才是一个完整的个人基础设施:存储、计算、数据库、网络穿透,全在边缘,全是免费额度。
大多数个人项目根本不需要 VPS。一个 Cloudflare 账号加一个域名,这套架构跑一两年都不会触发付费。
相关阅读:这套免费基建适合轻量项目;要跑 WordPress 或常驻服务,还是得看 VPS 选购指南 与 WordPress VPS 部署实录。站搭起来之后的提速,看 四层缓存配置。




