家庭数据中心系列 使用rclone和cloudflare R2打造chevereto的异地容灾图床
本文最后更新于 186 天前,其中的信息可能已经有所发展或是发生改变,如有失效可到评论区留言。

前言

在我上一篇文章中(家庭数据中心系列 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实现多点文件夹同步之详细教程),也简要介绍过其优势:

image.png

不过那时在"文件夹数据同步"这个明确场景中syncthing更符合我的需求。而现在,在面对"将本地chevereto图片文件夹里的图片同步到cloudflare R2中"这个场景时,rclone就是最佳选择了。


其实在这种图床方案的迁移中,一个很关键的问题是图片地址的兼容性。举例说明:前面那张图片的真实地址为https://image.tangwudi.com/images/2024/05/21/202405211354063.png,其相对路径地址为:images/2024/05/21/202405211354063.png,而chevereto里面图片的存储路径刚好是这样:

image.png

所以chevereto图床的存放还是很讲规矩的,那么,在迁移图床的时候,如果迁移目的地最终也能实现图片相同地址的输出,那么迁移就算是成功了,COS类型的方案刚好可以实现这一点,只将chevereto图床里images整个目录全部复制到R2的桶下即可。


使用rclone批量上传chevereto图床文件到R2

前置准备工作:创建R2存储桶

由于后面在配置rclone的时候,需要使用到R2的Accesskey和SecretKey,所以需要先创建R2存储桶(需要先开通R2,要用到信用卡绑定,这一步并不会产生费用)。

image.png

image.png

image.png

image.png

image.png

image.png

安装rclone

首先在macos上安装rclone,可以使用brew方式安装:

brew install rclone

也可以直接在rclone官网下载适合自己的包,官网链接如下:https://rclone.org/downloads/

image.png

注:采用直接下载的方式,解压缩后直接运行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

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

注:选择y的话会进入高级选项,几十个,其实只有第一个是需要设置的,将存储桶的acl改为public-read:
image.png

其他选项一路回车使用默认值即可。最终配置如下:
image.png

image.png

其实上述rclone config的所有操作目的是生成"rclone.conf"的配置文件,所以我们其实也可以直接新建一个配置文件然后直接编辑其内容,macos里rclone的配置文件路径为:

/Users/your-username/.config/rclone/rclone.conf

image.png

我直接把配置文件内容贴出来,大家可以直接使用:

[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 #根据自己实际设置进行修改

image.png

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目录,通过这种格式,就可以实现我们前面提到的输出路径一致的效果。
等上传完成:

image.png

image.png

3、再次使用rclone tree 命令进行确认:
image.png

cloudflare R2上配置自定义域

图片完成上传后,默认R2上的"images-bed"桶是无法访问的,如下图:

image.png

这时需要给R2上的"images-bed"桶配置自定义域:
image.png

image.png

image.png

image.png

已经生效了,我们用试验来证明,把任意一张图片使用原本的链接打开:
image.png

把上图红框中的原本的域名换成r2image.tangwudi.com然后重新回车打开:
image.png

成功。如果要用R2完全替代我的chevereto图床,只需要删除原有的image.tangwudi.com的解析,然后把R2上images-bed的自定义域改为image.tangwudi.com即可。

另:rclone还有其他很多功能,包括把远程存储挂载到本地等,我就不一一介绍了,主要是我自己也没啥需求,大家有兴趣可以自行研究一下,网上也有很多相关教程。

image.png

后话

rclone本身只是一个简简单单的一次性执行程序,如果要实现基于设置条件的自动执行,比如开机自动执行、定时自动执行等,需要依靠外部操作来配合,比如操作系统本身提供的功能,如:开机自启动、计划任务等。

一般来说,使用rclone最常用的方式是开机运行和定期运行备份,在macos系统上只需要使用自带的launchctl或者crontab配合rclone即可实现,其他操作系统都有各自的实现方式,不过,我的需求是一旦chevereto的图片文件夹有变化(有新增图片),rclone就自动同步到R2上,否则难道每次我新增了图片,还要手动运行rclone一次不成,那也太low了,所以研究了下,发现fsnotify似乎可以做到,不过那个又要专门写一篇文章来研究了,这次就到这里吧,暂时我也只能用很low的方式:有新增图片以后手动运行rclone上传新图片。

另:我准备把图床改到R2试试,以前总觉得图片打开有点慢(主要是缓存的图片无法享受优选IP的待遇),看这下改到R2之后效果如何,毕竟创建桶的时候有个位置自动的默认选项,也不知道有没有用。

博客内容均系原创,转载请注明出处!更多博客文章,可以移步至网站地图了解。博客的RSS地址为:https://blog.tangwudi.com/feed,欢迎订阅;如有需要,可以加入Telegram群一起讨论问题。

评论

  1. Windows Chrome 125.0.0.0
    8 月前
    2024-5-22 14:43:32

    如果没信用卡的话,可以尝试储存换成Backblaze(B2),B2不需要绑定付款方式,也是免费10GB,而且B2到CF的流量是不计费的,所以可以B2上套CF代理缓存,反正图床嘛,CF那边缓存拉到最大,也不太容易触发B和C类操作的收费额度。

    • 博主
      秋风于渭水
      Macintosh Chrome 124.0.0.0
      8 月前
      2024-5-22 16:36:14

      我考虑过,不过有个问题在于,如果是B2的存储加CF的缓存,还是无法解决CF缓存free版不支持优选IP的问题,那就和我现在chevereto本地图床+CF缓存的方案没太大区别了,只是把图床从本地转到了云上而已。如果我直接使用R2,有个自动选择最近位置的选项:”R2 会根据您的位置自动将您的存储桶放在最近的可用区域”,我觉得这个可能有用,所以现在就是,我关了缓存,直接访问R2,图片打开速度的确比以前快了。B、C类操作门槛还是比较高的,应该不会触发吧~~。

      • tangwudi
        Windows Chrome 125.0.0.0
        8 月前
        2024-5-22 17:45:15

        是,用B2+CF的话,基本就是单纯将本地图床上云

        • 博主
          秋风于渭水
          Macintosh Chrome 124.0.0.0
          8 月前
          2024-5-22 20:47:27

          我看了下,今天我是把图床全部上传到R2,A类操作才13000多,以后就是每隔几天更新几张图,1个月100万的A类请求额度根本用不完。除非是经常频繁更新图片,比如企业级网站,一般个人博客之类R2的免费额度完全够用了。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
       

本站已禁用鼠标右键和各种快捷键,代码块内容可以直接在右上角点击复制按钮进行复制

zh_CN