目前使用的小鸡基本都是便宜货,便宜货是没有自动备份的,所以需要自己想办法备份一下网站数据和配置文件什么的。
目前Wordpress是用插件自动备份的,其他用的是rclone和手动下载的方式,弊端比较明显,手动下载麻烦还容易忘记,而rclone的问题在于设置复杂,而且万一服务器上储存的凭据被窃取(虽然是小概率事件),那么整个网盘的文件都有危险,所以一直想自建一个备份服务,把所有文件都备份到一处,然后用rclone上传到网盘,这样只要在备份服务器配置rclone即可。
MinIO是一个开源的轻量级对象存储服务,兼容Amazon S3,之前从来没有用过对象存储,就尝试了一下,当作学习了。
安装MinIO Server
安装方式有多种,包括Kubernetes、Docker、二进制软件包等,我使用的是Docker,官方文档用的是Podman,不过我还是对Docker更加熟悉。
安装Docker并加入权限(以用户ubuntu为例)
$ sudo apt install docker.io
$ sudo usermod -aG docker ubuntu
之后重新连接ssh使得权限生效。
建立存储目录,这里以/data
为例
$ sudo mkdir /data
运行MinIO server(替换尖括号中的内容,后同)
$ docker run -d\
--name=minio \
--restart=unless-stopped \
-p 9000:9000 \
-p 9001:9001 \
-e TZ="Asia/Shanghai" \
-e MINIO_ROOT_USER=<USER> \
-e MINIO_ROOT_PASSWORD=<PASSWD> \
-v /data:/data \
minio/minio server /data --console-address ":9001"
浏览器访问9000端口,可以看到console,密码是上面命令设置的。
反向代理
此时MinIO server还只能用IP:端口访问,并且不支持https,这里使用Caddy反代,先写一个配置文件
$ sudo mkdir /etc/caddy
$ sudo vi /etc/caddy/Caddyfile
内容(这是最简配置,详细配置参见Caddy文档):
console.os.example.com {
reverse_proxy localhost:9001
}
os.example.com {
reverse_proxy localhost:9000
}
其中域名自己替换,记得解析好DNS,还有打开80和443端口。
运行Caddy,这里也使用Docker
$ docker run -d \
--name=caddy \
--net=host \
--restart=unless-stopped \
-v /etc/caddy:/etc/caddy \
-e TZ="Asia/Shanghai" \
caddy
然后访问https://console.os.example.com登录即可。
然后在console创建存储桶,创建用户(Identity - Users),设置权限,生成Access Key和Secret Key,我这里由于是备份目的,用户的权限设置是writeonly,即只能上传,同名文件会直接覆盖,不同名保留。这样即使某个服务器的凭据被窃取,也无法访问备份服务器的文件。
接下来是客户端的操作。
gobackup
gobackup是一个轻量级的备份工具,可以把文件、目录和数据库备份到本地目录、FTP、SCP、S3、OSS等,既然有方便的工具,就不自己写轮子了。
安装gobackup,创建配置文件
$ curl -sSL https://git.io/gobackup | bash
$ sudo vi ~/.goobackup/gobackup.yml
gobackup只需要一个配置文件即可,不需要像rclone那样使用浏览器授权,配置详见文档,下面是一个简单例子。需要注意的是,文档中配置文件的位置前后不一致,实测(1.1.1版本)/etc/gobackup/gobackup.yml
和/etc/gobackup.yml
都可能存在读不到的情况(但不能在所有服务器复现),表现是gobackup perform
无反应,原因未知,而
正常。另外,文档遗漏了endpoint这一项,只有region,即Amazon S3的区域名,这里因为使用的不是Amazon S3,需要使用endpoint。~/.gobackup/gobackup.yml
models:
# 方案名
config:
# 压缩
compress_with:
type: tgz
# 存储路径
store_with:
type: s3
bucket: <BUCKET>
endpoint: os.example.com
path: <PATH>
access_key_id: <ACCESS KEY>
secret_access_key: <SECRET KEY>
timeout: 300
# 数据库
databases:
# 文件或目录
archive:
includes:
- <PATH1>
- <PATH2>
excludes:
测试
$ gobackup perform
没有问题的话,建立crontab,例如每周一凌晨3点备份:
0 3 * * 1 /usr/local/bin/gobackup perform >> /home/ubuntu/script/gobackup.log
MinIO客户端
我觉得gobackup已经满足了我的需求并且更简单,当然如果你愿意使用官方客户端也可以,客户端的好处是可以随时用命令上传文件,而不需要写配置。
下载客户端,以Linux为例
$ wget https://dl.min.io/client/mc/release/linux-amd64/mc
$ chmod +x ./mc
$ sudo mv ./mc /usr/bin
连接服务器
$ mc config host add <ALIAS> <DOMAIN> <ACCESS KEY> <SECRET KEY>
之后即可传输文件,详细命令见文档。
备份脚本backup.sh(这个脚本对文件会多建一层目录,你可以加个判定,对文件把最后那个斜杠去掉,不过我懒_(:з」∠)_):
#!/bin/bash
for dir in `cat /home/ubuntu/script/backup.list`
do
/usr/bin/mc cp -r $dir/ <ALIAS>/<BUCKET>$dir
done
将需要备份的目录列表(绝对路径)写进/home/ubuntu/script/backup.list,然后用crontab执行backup.sh即可,例如每周一凌晨3点备份
0 3 * * 1 /home/ubuntu/backup.sh >> /home/ubuntu/backup.log
文章评论