

自建 Cloudflare R2 图床:免费、S3 兼容、全球加速
用 Cloudflare R2 搭建个人图床:10GB 免费额度、S3 兼容、自定义域名与边缘缓存,配合 PicGo 和 Obsidian 一键上传。
写文章要配图,图多了就要图床。Cloudflare R2 是我用过最省心的方案:免费额度 10GB 存储 + 每月百万次读写,S3 兼容、自定义域名、全球 CDN 缓存,个人博客完全够用。
为什么选 R2#
- 便宜:10GB 存储、100 万次读/月、100 万次写/月全免费,个人用量基本不超;
- 兼容:S3 API 协议,PicGo、rclone、各种工具开箱即用;
- 稳定:Cloudflare 全球节点,配合 Cache Rules 图片走边缘缓存,国内访问也快;
- 省心:不用维护服务器,不担心防盗链,对象存储天然抗流量攻击。
整体架构#
Obsidian 粘贴图片
→ 图片自动上传插件 → PicGo 本地服务(127.0.0.1:36677)
→ S3 上传器 → Cloudflare R2 Bucket
→ 返回 https://r2.你的域名/2026/08/<md5>.webp 写回笔记plaintext图片链接格式:https://r2.你的域名/YYYY/MM/<md5>.<扩展名>(按年月归档,md5 命名天然去重)。
配置步骤#
- 注册 Cloudflare 并开通 R2:dash.cloudflare.com → R2 → 创建 Bucket(如
my-images)。 - 绑定自定义域名:Bucket → Settings → Custom Domains → 添加
r2.你的域名,Cloudflare 自动建 CNAME 并签发证书,状态 Active 即可用。 - 创建 API Token:R2 → Manage R2 API Tokens → 权限选 Object Read & Write,范围限定该 Bucket。记下 Access Key ID 和 Secret(只显示一次,丢失可重建)。
- 配置 PicGo(桌面端图床工具):
- 安装插件
picgo-plugin-s3,图床设置选 Amazon S3; - 填:accessKeyID / secretAccessKey / bucketName / endpoint(
https://<account-id>.r2.cloudflarestorage.com)/ 上传路径{year}/{month}/{md5}.{extName}/ urlPrefixhttps://r2.你的域名; - 开启服务器模式(端口 36677)+ 开机自启。
- 安装插件
- 配置 Obsidian:装 Image auto upload 插件,上传器选 PicGo,粘贴图片即自动上传写回链接。
密钥只在你自己的电脑上,网站代码和仓库里永远只放公开链接。
缓存加速(可选但推荐)#
R2 自定义域名默认不缓存,每次访问都回源。在 Cloudflare → 缓存 → Cache Rules 加一条规则:URI 匹配 https://r2.你的域名/*.{png,jpg,jpeg,webp,gif,svg},边缘 TTL 30 天。之后图片首次访问回源,后续全部命中边缘缓存。
常见问题#
- 图片上传失败:检查 PicGo 是否运行、端口 36677、Token 是否过期(重建即可)、网络能否访问 Cloudflare;
- 换了图还是旧图:边缘缓存 30 天未过期,控制台清除缓存或 URL 加
?v=时间戳绕过; - 测试链接 403:用浏览器 UA 的请求测试(curl 带 UA 头),不要用无 UA 的脚本直连判断,会被 Cloudflare 当 bot 拦;
- 图片丢失:R2 对象永久保留,域名失效只换前缀(r2.dev 兜底域名保持开启)。
小结#
R2 图床 + PicGo + Obsidian 自动上传,一套下来半小时搞定,之后写文章贴图完全无感。如果以后流量大了,R2 按量计费也很便宜,随时可以平滑升级。