Featured image of post 自动化流程把Cloudflare R2作为文件备份服务器

自动化流程把Cloudflare R2作为文件备份服务器

什么是Cloudflare R2

Cloudflare是一个著名的网络服务提供商,并且有越来越多的云服务👮市场,我之前在Netlify+Cloudflare配置网站以及Cloudflare Function添加JWT的文章中也介绍过,这里不在赘述。

那么R2是什么?

R2是Cloudflare提供的对象存储服务,跟亚马逊的S3、阿里云的OSS都是同一种服务,可以存储文件。

R2具备几个优势:

  1. 兼容AWS S3,可以使用aws的sdk
  2. 所有出站流量都是免费的
  3. 静态文件配合Cloudflare的缓存机制可以实现全球CDN
  4. 带有事件驱动(event-driven)机制,当文件被创建、修改、删除时,可以得到事件(再结合Queue, Worker来完成流程)
  5. 每月免费的存储容量有10G,超过10G后,每GB费用0.015美元,价格低廉

github上有人把R2当作图床,这个也是比较好用的,但是必须要注意的是,

最好挂载在自己的域名下面,这样可以在Caching功能下开始服务器端缓存,就相当于使用Cloudflare的CDN来serve,提高文件的访问可达性和速度

把R2当作文件备份服务器

我的需求并不代表普遍的需求,但是可以提供一种思路。

我有一个小网站用sqlite数据库驱动的,数据库文件并不大,但是我需要定期备份到一个可靠的文件备份服务器上。

我之前使用rclone备份工具来备份重要数据到Google Drive上,rclone是一个网盘拷贝工具,但google Drive的账号授权流程比较复杂(见我之前的文章),这使得很多人包括技术人员都不想再重复一遍(我自己也是)

创建一个Bucket

创建一个Cloudflare API Token

选择创建API Token的模版

在列出的permission中,只保留绿色打勾的即可,Account选择为全部账号

好,确定之后,我们会得到一个API TOKEN,从网页上复制下来之后,请妥善保管,因为只显示一次,我们后面还要用的

文件上传的脚本

R2的操作接口有wrangler也SDK,为了简化上传文件的流程,我使用wrangler命令行工具来实现,但是我不想安装一套nodejs在我的机器上,所以我使用了一个docker镜像来安装wrangler,然后通过运行docker里的wrangler来上传文件。

准备一个本地镜像

写一个Dockerfile文件内容如下:

FROM node:alpine

RUN npm install wrangler -g

本地编译镜像,如果需要请自行增加sudo在命令前

docker build . -t cloudflare-wrangler:latest

Cloudflare的wrangler运行时需要授权,有两种方法,一种是通过wrangler login 启动OAuth认证,需要通过浏览器才能完成,不适合docker环境,第二种是通过环境变量CLOUDFLARE_API_TOKEN来完成认证,我使用这种方法。

上传文件的脚本如下:

#!/bin/sh

filesrc="/home/shared/code"
tar_file="$(date '+%Y%m%d-%H%M%S').tar.gz"
cd $filesrc
tar -czf ./data/$tar_file ./db

docker run --rm \
-v $filesrc/data:/data \
-e CLOUDFLARE_API_TOKEN=XXXXXXXX \
cloudflare-wrangler:latest \
npx wrangler r2 object put codebook-db-backup/$tar_file --file /data/$tar_file

注意CLOUDFLARE_API_TOKEN换成刚才创建的API TOKEN

自动定时运行脚本

使用cron job来定时除法备份脚本

crontab -e

脚本内容如下

0 14 * * * /home/shared/code/run_wrangler.sh >> /home/shared/code/run_wrangler.log

表示每天UTC时间14点运行一次

再回到R2来看一下,备份文件已经上传了

By 大可出奇迹