什么是Cloudflare R2
Cloudflare是一个著名的网络服务提供商,并且有越来越多的云服务👮市场,我之前在Netlify+Cloudflare配置网站以及Cloudflare Function添加JWT的文章中也介绍过,这里不在赘述。
那么R2是什么?
R2是Cloudflare提供的对象存储服务,跟亚马逊的S3、阿里云的OSS都是同一种服务,可以存储文件。
R2具备几个优势:
- 兼容AWS S3,可以使用aws的sdk
- 所有出站流量都是免费的
- 静态文件配合Cloudflare的缓存机制可以实现全球CDN
- 带有事件驱动(event-driven)机制,当文件被创建、修改、删除时,可以得到事件(再结合Queue, Worker来完成流程)
- 每月免费的存储容量有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来看一下,备份文件已经上传了