Contents
前言
在我上一篇文章中(家庭数据中心系列 chevereto图床多节点定时自动同步教程)提到,在打造了由目前自建图床chevereto的主站点(位于家庭数据中心)+备用站点(位于家庭数据中心)+同城灾备站点(位于腾讯云服务器)组成的"同城双中心"、"本地云+公有云的混合云"结构之后(同时实现了图片实时同步+定时数据库自动导入),我还想要打造chevereto图床的异地容灾站点,以便最终进化为终极形态:"两地三中心"。
经过仔细思量以后,决定就选用cloudflare R2对象存储来实现,原因是因为"10g的免费存储空间"以及其"不限流量"的特性(再对比下腾讯云COS的出网流量费用,不比不知道,一比吓一跳~),加上本身我也准备使用cloudflare pages上部署的基于Hexo的静态博客,来实现wordpress博客主站点的异地容灾方案,cloudflare pages + cloudflare R2,刚好是绝配好不好?那就这么定了!
不过我现在已有的chevereto的同步方案底层支撑技术是syncthing,这个就不适用于将我本地的图片同步到cloudflare R2,所以必须引入新的解决方案:rclone。
使用rclone和cloudflare R2打造异地容灾图床
rclone简介
其实在以前的文章中,我在对比网上已有的同步方案时就提到过rclone(参见:docker系列 使用docker基于syncthing实现多点文件夹同步之详细教程),也简要介绍过其优势:
不过那时在"文件夹数据同步"这个明确场景中syncthing更符合我的需求。而现在,在面对"将本地chevereto图片文件夹里的图片同步到cloudflare R2中"这个场景时,rclone就是最佳选择了。
其实在这种图床方案的迁移中,一个很关键的问题是图片地址的兼容性。举例说明:前面那张图片的真实地址为https://image.tangwudi.com/images/2024/05/21/202405211354063.png
,其相对路径地址为:images/2024/05/21/202405211354063.png
,而chevereto里面图片的存储路径刚好是这样:
所以chevereto图床的存放还是很讲规矩的,那么,在迁移图床的时候,如果迁移目的地最终也能实现图片相同地址的输出,那么迁移就算是成功了,COS类型的方案刚好可以实现这一点,只将chevereto图床里images整个目录全部复制到R2的桶下即可。
使用rclone批量上传chevereto图床文件到R2
前置准备工作:创建R2存储桶
由于后面在配置rclone的时候,需要使用到R2的Accesskey和SecretKey,所以需要先创建R2存储桶(需要先开通R2,要用到信用卡绑定,这一步并不会产生费用)。
安装rclone
首先在macos上安装rclone,可以使用brew方式安装:
brew install rclone
也可以直接在rclone官网下载适合自己的包,官网链接如下:https://rclone.org/downloads/:
注:采用直接下载的方式,解压缩后直接运行rclone执行文件即可。
初始化rclone
将rclone路径添加到当前账号的环境变量中(采用brew方式安装的应该不需要):
vim ~/.bash_profile #编辑当前账号的环境变量
根据rclone的实际路径修改,我是把rclone解压缩后的文件夹放到了应用程序文件夹里,所以将其路径添加到PATH最后:
PATH=/bin:/usr/bin:/usr/local/bin:/Applications/rclone:
保存退出以后,使用如下命令重新载入环境变量:
source ~/.bash_profile
运行以下命令进行rclone的初始化:
rclone config
注:选择y的话会进入高级选项,几十个,其实只有第一个是需要设置的,将存储桶的acl改为public-read:
其他选项一路回车使用默认值即可。最终配置如下:
其实上述
rclone config
的所有操作目的是生成"rclone.conf"的配置文件,所以我们其实也可以直接新建一个配置文件然后直接编辑其内容,macos里rclone的配置文件路径为:
/Users/your-username/.config/rclone/rclone.conf
我直接把配置文件内容贴出来,大家可以直接使用:
[images-bed]
type = s3
provider = Cloudflare
access_key_id = xxxxxxxxxxx #改为自己access_key_id
secret_access_key = xxxxxxxxxx #改为自己的secret_access_key
region = auto
endpoint = https://xxxxx.r2.cloudflarestorage.com #改为自己的endpoint
bucket_acl = public-read
description = cloudflare R2
使用rclone将chevereto图床图片批量上传到R2
1、使用rclone tree
命令验证是否能正常访问R2上的images-bed桶:
rclone tree images-bed:images-bed #根据自己实际设置进行修改
2、使用
rclone copy
命令将本地chevereto图床的图片上传到R2上的images-bed桶:
rclone copy -P -v /Volumes/data/docker/chevereto/data/images images-bed:images-bed/images
注:上面命令的-P
参数是以500毫秒为单位显示传输进度(默认一分钟),-v
参数后面跟的是我的chevereto里images目录的实际路径,最后的images-bed:images-bed/images
是指前面定义的R2远程存储(images-bed):上创建的桶(images-bed)上的images目录,通过这种格式,就可以实现我们前面提到的输出路径一致的效果。
等上传完成:
3、再次使用
rclone tree
命令进行确认:cloudflare R2上配置自定义域
图片完成上传后,默认R2上的"images-bed"桶是无法访问的,如下图:
这时需要给R2上的"images-bed"桶配置自定义域:
已经生效了,我们用试验来证明,把任意一张图片使用原本的链接打开:
把上图红框中的原本的域名换成
r2image.tangwudi.com
然后重新回车打开:成功。如果要用R2完全替代我的chevereto图床,只需要删除原有的
image.tangwudi.com
的解析,然后把R2上images-bed的自定义域改为image.tangwudi.com
即可。
另:rclone还有其他很多功能,包括把远程存储挂载到本地等,我就不一一介绍了,主要是我自己也没啥需求,大家有兴趣可以自行研究一下,网上也有很多相关教程。
后话
rclone本身只是一个简简单单的一次性执行程序,如果要实现基于设置条件的自动执行,比如开机自动执行、定时自动执行等,需要依靠外部操作来配合,比如操作系统本身提供的功能,如:开机自启动、计划任务等。
一般来说,使用rclone最常用的方式是开机运行和定期运行备份,在macos系统上只需要使用自带的launchctl或者crontab配合rclone即可实现,其他操作系统都有各自的实现方式,不过,我的需求是一旦chevereto的图片文件夹有变化(有新增图片),rclone就自动同步到R2上,否则难道每次我新增了图片,还要手动运行rclone一次不成,那也太low了,所以研究了下,发现fsnotify似乎可以做到,不过那个又要专门写一篇文章来研究了,这次就到这里吧,暂时我也只能用很low的方式:有新增图片以后手动运行rclone上传新图片。
另:我准备把图床改到R2试试,以前总觉得图片打开有点慢(主要是缓存的图片无法享受优选IP的待遇),看这下改到R2之后效果如何,毕竟创建桶的时候有个位置自动的默认选项,也不知道有没有用。
如果没信用卡的话,可以尝试储存换成Backblaze(B2),B2不需要绑定付款方式,也是免费10GB,而且B2到CF的流量是不计费的,所以可以B2上套CF代理缓存,反正图床嘛,CF那边缓存拉到最大,也不太容易触发B和C类操作的收费额度。
我考虑过,不过有个问题在于,如果是B2的存储加CF的缓存,还是无法解决CF缓存free版不支持优选IP的问题,那就和我现在chevereto本地图床+CF缓存的方案没太大区别了,只是把图床从本地转到了云上而已。如果我直接使用R2,有个自动选择最近位置的选项:”R2 会根据您的位置自动将您的存储桶放在最近的可用区域”,我觉得这个可能有用,所以现在就是,我关了缓存,直接访问R2,图片打开速度的确比以前快了。B、C类操作门槛还是比较高的,应该不会触发吧~~。
是,用B2+CF的话,基本就是单纯将本地图床上云
我看了下,今天我是把图床全部上传到R2,A类操作才13000多,以后就是每隔几天更新几张图,1个月100万的A类请求额度根本用不完。除非是经常频繁更新图片,比如企业级网站,一般个人博客之类R2的免费额度完全够用了。