LittleFox

  • 博客
  • 收藏
  • 关于
  • 订阅本站
LittleFox
Simple & Naïve
  1. 首页
  2. 挨踢
  3. 正文

自建对象存储服务MinIO进行文件备份

2022年11月30日 422点热度 0人点赞 0条评论

目前使用的小鸡基本都是便宜货,便宜货是没有自动备份的,所以需要自己想办法备份一下网站数据和配置文件什么的。

目前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无反应,原因未知,而~/.gobackup/gobackup.yml正常。另外,文档遗漏了endpoint这一项,只有region,即Amazon S3的区域名,这里因为使用的不是Amazon S3,需要使用endpoint。

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

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: gobackup MinIO VPS
最后更新:2022年12月21日

Fox

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

公告

由于主题和插件冲突,暂时关闭了评论的第三方登录功能。

分类
  • 挨踢 / 45篇
  • 日常 / 2篇
  • 随想 / 8篇
  • 默认分类 / 1篇

COPYRIGHT © 2023 littlefox.me. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang