从零开始搭建你的免费图床系统(Cloudflare R2 + WebP Cloud + 图床工具)

文章来源自:从零开始搭建你的免费图床系统(Cloudflare R2 + WebP Cloud + PicGo) · Pseudoyu

背景

陆陆续续两三年了,建立博客至今也有诸多文章了,有一个问题就是图片如果放在本地显示会很慢,特别是放在服务器,如果没有cdn的话,就没有如今的效果,我现在的模式就是hexo(github page+公益cdn),后话了,先回到这这里,由于图片一多,造成发送图片源位置移动的话,还要重新找,特别是我在hexo里static下的img文件夹,本身markdown显示的都是相对路径,管理起来很麻烦,如今我了解到图床的概念,不但可以统一进行管理,还能减少博客仓库的体积,提升网站速度,(虽然我现在依然保持着,源图和文档在一起,源图片直接上传到github,毕竟上传到别人服务器的数据,就怕突然有一天倒闭了,就没了,所以我依然有着备份原图片在本地的习惯),所以我接下来讲的,只是适用于,不那么重要的项目

阿里云OSS+Picgo

阿里云oss,我个人使用来说,很方便,速度很快,结合图床来使用也是很方便的,就是唯一的缺点就是大多都是按量付费,如果内容一多,对于本身就是非盈利性的我来说,就很不妥当,通过picgo或兰空图床进行上传图片到阿里云oss,访问速度也很快,针对国内用户的访问速度明显提升(费用:存储加公网访问流量费用

还有一个办法就是设置反向代理,你需要购买一台同区域的esc,保持和你存储桶是一个区域的,这样经过的流量就是内网流量,不会计费,但是会计算存储费用

图床搭建说明

Cloudflare R2 + WebP Cloud + 图床工具 的方案尽管牵扯到了多个组件和平台,但所有操作都在 Free Plan 中,也是我最终选定的方案,下面将从零开始介绍如何搭建这个免费图床系统。

Cloudflare R2

R2 是 Cloudflare 推出的免费对象存储服务,需要免费注册一个 Cloudflare 账号才能使用,注册登录后,点击左侧边栏的 R2 访问服务,但需要注意的是开通 R2 服务需要绑定信用卡(国内外主流信用卡皆可),但并不会扣费,主要是为了验证用户身份使用。但是我最近发现他有了paypal验证方式,有了paypal,可以直接绑定国内储蓄卡,就可以通过R2验证的银行卡验证了

image-20250212151333273

创建存储桶

开通 R2 服务后,点击右上角「创建存储桶」按钮进行创建。

image-20250212151607908

进入创建配置界面后,需要填写存储桶(Bucket)名称,建议有一些辨识度,后续在配置上传时会用到。

位置则选择「自动」,但可以额外多配置一个位置提示,由于我后续还将使用「WebP Cloud」服务的美西机房进行图片代理优化,所以在此处选择的是「北美洲西部(WNAM)」,根据需求选其他区域也可以,但 Cloudflare 并不保证一定会分配到所指定的区域。

image-20250212151725856

进入设置

image-20250212152030774

首先我们需要打开「R2.dev 子域」,这是为了后续访问图片时需要的公网地址,点击「允许访问」,并按照提示输入「allow」即可开启。

image-20250212152203901

完成后会显示一个以 r2.dev 结尾的公网网址,即我们后续访问图片的网址。

自定义图床域名(可选)

但是分配的网址比较长,不易于记忆,我们可以通过「自定义域」来绑定我们的专属域名,点击「连接域」按钮,填入想要访问的域名

image-20250212152355336

然后在你域名服务商那添加dns解析,由于我是将域名托管到了cloudflare,直接自动添加解析了

image-20250212152448801

效果就是这样了

image-20250212152555125

image-20250212152616008

配置存储桶访问api

当我们回到对象页面,上传一张测试图片

image-20250212155704337

就有链接可以进行访问了

image-20250212155745302

但是如果每次都打开cloudflare手动上传图片的话都会很麻烦。R2 提供了 S3 兼容的 API,可以方便地使用一些客户端/命令行工具进行上传、删除等操作。

image-20250212160118209

image-20250212160150594

image-20250212160306528

这时候就会有api令牌信息,这里的内容只会出现一次,可以记下来,但是不要给别人哦

image-20250212160435719

至此,我们需要在 Cloudflare R2 上配置的部分就完成了,接下来我们需要配置图床工具吧。

PicGo(可选,无需服务器)

PicGo 是一个用于快速上传并获取图片 URL 的工具软件,有着较为丰富的插件生态,支持多种图床服务,其 GitHub 仓库为「GitHub - Molunerfinn/PicGo」,可以下载对应平台客户端使用。

配置 R2 图床

PicGo 本体并不包括 S3 图床,但可以通过「GitHub - wayjam/picgo-plugin-s3」插件来支持。

windows下的稳定版2.3.1会出现搜索不到插件的情况,下载里面的beta版本就行了

Bug: 插件设置页无法搜索到插件 · Issue #1297 · Molunerfinn/PicGo

我只能安装1.0.2的,第一个安装不了,无关紧要

image-20250212160806906

然后填写信息

image-20250212161619415

这里有几项配置需要尤其注意。

  • 应用密钥 ID,填写 R2 API 中的 Access Key ID(访问密钥 ID)
  • 应用密钥,填写 R2 API 中的 Secret Access Key(机密访问密钥)
  • 桶名,填写 R2 中创建的 Bucket 名称,如我上文的 blog-r2
  • 文件路径,上传到 R2 中的文件路径,我选择使用 {fileName}.{extName} 来保留原文件的文件名和扩展名。
  • 自定义节点,填写 R2 API 中的「为 S3 客户端使用管辖权地特定的终结点」,即 xxx.r2.cloudflarestorage.com 格式的 S3 Endpoint
  • 自定义域名,填写上文生成的 xxx.r2.dev 格式的域名或自定义域名,如我配置的 image.qianyisky.cn

image-20250212162350766

其他配置保持默认即可,确认参数无误后点击「确定」与「设置为默认图床」即可。

图片上传

image-20250212162515699

完成上述配置后,我们就可以在「上传区」直接拖入文件进行图片上传了,如上传后显示无误则为配置成功,生成的链接会自动在系统剪贴板中,直接在需要的地方粘贴即可。

根据你想要的链接格式,我这里是markdown,就选择markdown格式,然后在相册里复制链接,在markdown文档看看

image-20250212162638990

image-20250212162708601

Lsky Pro图床(可选,需要服务器)

官网:Lsky Pro+ - 属于您自己的云上相册。

部署教程:Lsky Pro图床 | 严千屹博客

我这里就展示自己搭建好lsky pro图床进行演示了

创建存储策略

image-20250212163327404

image-20250212163547700

确认即可

图片上传

设置上传图片的限制大小为10M

image-20250212164032388

image-20250212164200929

点击保存即可

image-20250212164344718

image-20250212164600963

两者路径修改位置

image-20250212164651932

这就是统一管理的方便性

这是lsky pro设置上传路径的位置

image-20250212164754562

这是PicGo设置上传路径的位置

image-20250212165842910

再去测试上传看看

image-20250212165247121

效果

image-20250212170129233

当然你可以在设置里选择这两个

image-20250212170221106

image-20250212170422951

image-20250212170625037

WebP Cloud 图片优化

至此我们已经完成了整个图床的搭建、配置和上传,但通常我们本地截图或是相机拍摄的图片体积较大,对于访客来说加载时间会较长,并不直接适合互联网发布。

根据从零开始搭建你的免费图床系统(Cloudflare R2 + WebP Cloud + PicGo) · Pseudoyu写到WebP Cloud的方法

它可以实现图片的压缩,加快页面显示的速度

image-20250212171017681

简单来说这是一个类 CDN 的图片代理 SaaS 服务,可以在几乎不改变画质的情况下大幅缩小图片体积,加快整体站点加载速度。发展到现在除了图片体积减少外,还提供了缓存、添加水印、图片滤镜等更多实用的功能,并提供了自定义 Header 等配置选项。

配置webp cloud

首先通过 GitHub 授权登录 WebP Cloud 平台。

image-20250212171123527

image-20250212171355857

回到主页,点击创建代理

image-20250212171450450

  • 为了优化国内访问,我「Proxy Region」选择的是美西「Hillsboro, OR」区域
  • 「Proxy Name」填写一个自定义名称即可
  • 「Proxy Origin URL」,比较重要,需要填写上文我们配置好的 R2 自定义域名,如我填写的是 image.qianyisky.cn,如果没配置自定义域名则填写 R2 提供的 xxx.r2.dev 格式的域名

image-20250212171624454

之后点击你创建的代理,将代理地址更新到存储策略的配置里

PicGo配置

image-20250212171949706

Lsky Pro配置

image-20250212172255953

再进行上传图片的测试

image-20250212172515404

就是我们通过图床工具上传的图片上传了之后,就可以通过这个WebP Cloud Services提供的代理节点进行访问

如果觉得默认代理地址不好看,可以进行设置自定义域名

image-20250212172818032

image-20250212172832000

image-20250212173135188

最后确认,等待十分钟这样子,点击刷新按钮,就会更新代理地址了,然后点击启用

image-20250212173324239

image-20250212173345988

这时候你就可以去修改之前的图床工具的代理地址了

https://images.qianyisky.cn/PicGo/test.png

WebP Cloud 用量

免费用户每天有 3000 Free Quota,即能够代理 3000 次图片访问请求,并提供 200M 的图片缓存,对于一般用户来说完全够用,如有一些流量较大的特定时期也可以购买额外 Quota,价格很便宜。

如超过了 Quota,访问则会被 301 转发到源站图片地址,不经 WebP Cloud 服务压缩,但依然可用;超过 200M 的缓存则会按照 LRU 算法清理,所以依然能够保障一些高频请求的图片能够有较好的访问体验。

总结

以上就是Pseudoyu的图床系统搭建方案,如果你的项目是在国内的服务器上,用这个方法勉强够用哦,基本都是免费订阅的

那么接下来就要讲到安全这几块了

以下内容来自使用 WebP Cloud 与 Cloudflare WAF 为你的图床添加隐私和版权保护 · Pseudoyu

可以看看作者的一个图片被盗用的经历,就可以知道隐私保护的重要性

使用 WebP Cloud 与 Cloudflare WAF 为你的图床添加隐私和版权保护

在使用 WebP Cloud 的过程中,Pseudoyu发现它还提供了自定义 Proxy User Agent、水印等功能,于是萌生了一个想法,是不是可以通过 WebP Cloud 对Pseudoyu的图床源站链接进行保护,使 WebP Cloud 的代理链接成为访问我所有图片的唯一入口,并统一添加Pseudoyu的专属版权水印。

本文是对这一实践的记录,也算是图床搭建番外篇了。

需求分析

image-20250212175038678

理论上两个地址都可以进行访问到我图床里的图片,但是前者是代理后经过处理的图,后者是直接访问cloudflare R2的原图

隐私保护

事实上我们通过手机、数码相机等设备拍摄的照片都会携带 EXIF(EXchangeable Image File Format) 信息,通常会包含拍摄设备、时间和地点等敏感信息,我们可以通过一些技术方式手动去除这些元数据,但操作十分繁琐且容易遗漏。

Pseudoyu查阅了一下 WebP Cloud 的文档,发现它果然提供自动擦除 EXIF 信息的功能,无须额外配置操作,但其实访客依然可以可以通过 Cloudflare R2 暴露出的源站信息访问到原图,为了避免这一点,我们需要限制用户只能通过 WebP Cloud 代理链接进行请求,访问 Cloudflare R2 源站链接时获取不到任何有用信息。

版权保护

这是作者图片被盗用的经历

image-20250212180156079

实现方案

需求清晰了,其实主要分为两部分:

  1. 让用户只能通过 WebP Cloud 代理链接访问到我的图片,禁止直接访问原图链接
  2. 在 WebP Cloud 代理层面为所有的图片统一自动添加自己的版权水印,无须手动操作

以下是我的实现方案与详细步骤。

WebP 自定义 User Agent + Cloudflare WAF

WebP Cloud 配置

当我们访问互联网上的网页或图片链接时,请求通常会包含一个 User Agent 字段,一般包含浏览器版本等信息,网站可针对不同的 User Agent 进行一些特定逻辑处理。

WebP Cloud 默认会使用 WebP Cloud Services/1.0 作为值,也就是不论用户访问图片时使用的是什么终端设备和浏览器,请求到 Cloudflare R2 时都会被统一为 WebP Cloud 定义的 User Agent 值,而这个值又是用户可以自定义的。

image-20250212180323061

因此,我们登录 WebP Cloud 的控制台,将「Proxy User Agent」字段设置为一个自定义值,如 ABC.com/1.0

随后更新代理

Cloudflare WAF 配置

WAF(Web Application Firewall) 是 Cloudflare 提供的一个防火墙服务,可以自定义规则来限制特定请求以保护网站安全,登录 Cloudflare 后在左侧边栏点击「网站」,点击进入需要保护的域名,选择侧边栏「安全性」 - 「WAF」即可免费使用(注:不是最外层的账户级 WAF),免费账户可设定五个自定义规则。

image-20250212180818002

image-20250212180925777

点击右侧的「编辑表达式」,填入以下规则:

1
(http.user_agent ne "ABC.com/1.0") and (http.host eq "image.qianyisky.cn")

image-20250212181107490

其他默认,然后点击保存

方便理解:

1.代理链接的User Agent会包含在网络请求里,也就是设置了ABC.com/1.0A钥匙

2.cloudflare WAF:设置了只有A钥匙才可以访问

3.一般用户浏览网页的User Agent是这样的

1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36

也就是说没有A钥匙,是访问不了的

4.所以在代理链接设置了A钥匙,那么他会把访问原地址的流量请求加入A钥匙,达到访问的目的,如果没有A钥匙直接访问原地址就会出现如下图

image-20250212181942387

所以完成配置后,当我们再次访问原地址image.qianyisky.cn的时候就会被拦截,例如:

原地址:https://image.qianyisky.cn/PicGo/test.png

代理地址:https://images.qianyisky.cn/PicGo/test.png

完美实现了我们的需求。

设置水印

我这里就设置了一个灰色的水印

image-20250212182258376

image-20250212182308863

设置好后保存

image-20250212182443427

由于,刚设置,只会对新上传的图片添加水印,如果你要之前上传的图片都要打上水印,你就要清除缓存,最后重新访问图片就会有水印了

image-20250212182549468

缓存的规则:目前所有代理都会有 200.00 MiB 缓存,如果超出这个限制,我们将使用“最近最少使用”(LRU)算法进行驱逐,也就是说,最少请求的内容将从缓存中驱逐。

代理地址:https://images.qianyisky.cn/PicGo/test.png

image-20250212182812682

特别声明
千屹博客旗下的所有文章,是通过本人课堂学习和课外自学所精心整理的知识巨著
难免会有出错的地方
如果细心的你发现了小失误,可以在下方评论区告诉我,或者私信我!
非常感谢大家的热烈支持!