- 由 虚拟的现实创建于12月 26, 2023 需要 5 分钟阅读时间
什么是 minio?
minio 是一个开源的对象存储服务器,兼容 S3 协议。
官方在开源的基础上也提供云端 S3 服务,分为个人和企业,有不同的收费标准。
自建对象存储的好处?
对象存储服务器可以用来做图床、静态资源缓存,亦或者是直接当作一个网盘来使用。
自建的对象存储的好处是所有源文件我们都能亲手管理,且无需为付费的对象存储的奇怪的计价文档感到手足无措,也不需要担心有人恶意刷流把你一套房子给套走。
缺点就是,自建的稳定性肯定不如已有厂家提供的服务,且自购的服务器 / Nas 上传带宽一般都很低,文件一多,访问速度就很慢了。
对于我个人而言,自建 minio 的唯一作用,就是备份七牛云 / 阿里云对象存储中的文件。考虑到 2023 下半年,各大厂接连 boom 云服务,国外的谷歌还出现了云盘里面用户的数据回滚到几月前的恶性问题,这可是可能导致用户数据丢失的大问题啊!
所以,将数据在自己本地留一份总是安心一些。数据安全靠的是备份,不是云服务厂家给你提供的 99.99999% 可用性的一面之词。
docker 安装 minio
安装 docker
安装 minio
这里推荐使用由 VMware 维护的 minio docker 版本 bitnami/minio,更新很频繁。
hub.docker.com/r/bitnami/minio
创建容器的命令如下,非常简单
sudo docker run -it --name minio -p 9000:9000 -p 9001:9001 -v /data/minio:/bitnami/minio/data \ -e MINIO_ROOT_USER="minio" -e MINIO_ROOT_PASSWORD="minio_123456" -e TZ='Asia/Shanghai' \ bitnami/minio:latest
该创建容器操作基于如下 hash 的 docker 镜像(更新于 2023-12-12),创建容器的命令后续可能会有变动,请参考 docker-hub 中的官方文档。
对这个 docker 命令进行解释
- 容器内 9000 端口是 minio 的 api 端口(用于 S3 协议操作)
- 容器内 9001 端口是 minio 的 web 管理界面端口
- -v /minio/data:/bitnami/minio/data,将 docker 内 /bitnami/minio/data 路径映射给主机 /minio/data 路径,主机上的路径(左侧)请自行修改;这个路径是 bucket 和 minio 配置文件的存储路径。
- 两个 -e 设置的是环境变量,分别设置的是 minio 管理员的账户和管理员的密码。请注意,在这里配置了管理员用户名和密码后,进入 minio 管理系统的密码无法被修改。如果你的 minio 服务需要暴露在公网上,请一定要设置一个高强度的密码!
- -e TZ='Asia/Shanghai' 设置时区为东八区(后续定时备份需要有正确时区)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES afefbb9514de bitnami/minio:latest "/opt/bitnami/script…" 3 minutes ago Up 3 minutes 0.0.0.0:19000->9000/tcp, :::19000->9000/tcp, 0.0.0.0:19001->9001/tcp, :::19001->9001/tcp minio
这样还不够,请在后续创建了 bucket 并上传测试文件后,查看本地映射的路径中是否有对应文件夹和文件,避免路径映射失败!(如果路径没有成功映射到本地,那么你当前创建的 minio 被删除之后,文件就很难找回来了)
顺带一提,在我这边测试发现,如果你错误使用浏览器访问了 9000 这个 api 端口,会被自动重定向到 9001 web 管理页面端口(前提是映射的宿主机端口和 docker 内端口一致)
/opt/bitnami/scripts/libminio.sh: line 364: /bitnami/minio/data/.root_user: Permission denied
sudo chown -R 1001:1001 /data/minio
web 管理
使用 http://IP:端口 打开 minio 的 9001 端口对应的宿主机端口,访问 minio 的 web 管理页面。输入刚刚创建容器时,在环境变量里面配置的用户名和密码进行登录,即可进入控制台。
minio 的界面比较简单,基本要做的操作只有两个,创建 bucket 存储桶,和 accesskey 用于 api 调用。
创建 bucket
第一个界面就是大大的 Object Browser,在这里我们可以创建存储桶
点击创建 bucket,会进入如下配置项,除了 bucket 的名字,还有三个选项
- Versioning:版本控制,开启后,该 bucket 将处于多版本模式下,文件会保留修改的历史记录。
- Object Locking:避免文件被删除,需要支持保留和合法保留(这两个啥意思我不明白),该选项只能在 bucket 创建时打开。
- Quota:限制容器中文件大小(总容量)
创建之后,在 bucket 页面可以看到刚刚创建的 lfang-minio 存储桶,这里会统计存储容量和文件数量
创建 accessKey
accessKey 是用于操作 api 的 token 凭证。创建完毕后,他只会显示一次,后续将不会显示出来。
如果你不想创建太多个密钥,那就把这个密钥的文件下载下来,免得到时候不知道是什么了。点击右下角的 import 文件就可以下载,会下载一个 json 文件,内部包含密钥和其他一些相关信息
因为我这只是做个测试,一会就会把这个 minio 的 docker 删除,所以展示密钥无所谓。如果你是在生产环境下使用,请一定不要暴露你的密钥给任何人。
{ "url": "http://公网IP:19001/api/v1/service-account-credentials", "accessKey": "aXpBxrUceV30Id6gOouG", "secretKey": "dIWl9IFL05UtaI08PZfPXE66zPGu2zWrGFfSTaUm", "api": "s3v4", "path": "auto" }
密钥创建完毕,就能在列表看到它。
rclone 备份
rclone 是一个全平台的命令行工具,其可以用于多种云端 / 本地存储之间的数据拷贝、同步、加密同步等功能。详见 rclone 官网:rclone.org
因为我的目标就是我的七牛云 bucket 里面的图床文件备份到本地,rclone 绝对是不二之选。
进入 docker 容器内终端
你可以选择在宿主机上安装 rclone,也可以选择直接在 minio 的容器内安装 rclone。
docker 特权模式
注意,如果在 minio 的容器内安装 rclone,那么 minio 容器被删除后,rclone 和它的配置文件自然也不在了。
且如果需要用 minio 的容器进行 crontab 定时任务,则必须用特权模式安装 minio 的 docker,在 minio 的 docker 创建命令里面加如下这条,设置特权模式(不需要定时任务可以不设置)。
--privileged
ssh 连接宿主设备
连接到宿主设备的 ssh 后,使用如下 docker 命令进入 minio 的容器终端中。
docker exec -it -u 用户名 容器名 /bin/bash
下载安装 rclone
进入终端后,默认所在路径是 docker 容器的工作路径 /opt/bitnami/minio-client。
为了避免影响容器运行,我们不要在工作路径里面做操作,请使用如下命令,创建一个新的 rclone 文件夹,进入 root 用户的家目录进行操作。
如果你是在宿主机上操作,也是一样的道理,为 rclone 单独创建一个文件夹,来存放它的软件包、配置文件、执行日志。
mkdir /root/rclone cd /root/rclone
如果是 docker 内操作,你可以在创建 minio 容器的时候,就把 /root/rclone 路径给映射到宿主机上,方便后续查看 rclone 备份的日志。
下载安装 rclone 的命令如下
curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip unzip rclone-current-linux-amd64.zip cd rclone-*-linux-amd64 sudo cp rclone /usr/bin/ sudo chown root:root /usr/bin/rclone sudo chmod 755 /usr/bin/rclone apt-get update && apt-get install -y unzip
minio 的 docker 内没有 unzip 命令,需要安装一下
minio 的 docker 内也没有 sudo,将上述安装命令中的 sudo 去掉就可以了。
完成安装命令后,执行一下 rclone,出现 rclone 命令的使用提示,那就是安装成功了!
root@878a0dd03ec4:/root/rclone/rclone-v1.65.0-linux-amd64# rclone Usage: rclone [flags] rclone [command] ...
rclone 对象存储配置
rclone 的官网上有不同云端存储协议和不同 S3 服务商的配置教程,跟着官方的来就可以了。
执行 rclone config 命令,工具会自动在 /.config/rclone/rclone.conf 下创建一个 config 文件,你可以根据官方的向导,在此处添加新的 remote;
root@878a0dd03ec4:/root/rclone/rclone-v1.65.0-linux-amd64# rclone config 2023/12/14 04:38:44 NOTICE: Config file "/.config/rclone/rclone.conf" not found - using defaults No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> q
下面给出 minio 和七牛云的配置文件,你可以直接修改这个配置文件中的内容为你的配置,然后写入 /.config/rclone/rclone.conf 即可。
其中 minio 的 region 在 minio 的控制台里面可以修改,如果你没有修改过,默认使用的是 us-east-1。因为 rclone 是直接在 minio 的 docker 里面执行的,所以 endpoint 只需要写成 127.0.0.1 和 minio 的 api 端口 9000 就可以了。
如果你的 minio 在公网或者其他设备上,请修改对应的 IP 地址和端口。七牛云的 region 和 endpoint 在七牛云 bucket 页面找到 S3 域名就可以看到。
请注意,七牛云 / 阿里云这类存储服务商,如果你有多个 bucket,且他们的地域不一样,则需要新增对应地域的配置项。通过修改 [] 里面的配置名进行区分。
[minio] type = s3 provider = Minio env_auth = false access_key_id = 控制台获取的key_id secret_access_key = 控制台获取的secret_key region = us-east-1 endpoint = http://127.0.0.1:9000 location_constraint = server_side_encryption = [qiniu] type = s3 provider = Qiniu access_key_id = 七牛云控制台获取key_id secret_access_key = 七牛云控制台获取secret_key region = cn-east-1 endpoint = s3-cn-east-1.qiniucs.com location_constraint = cn-east-1 acl = private storage_class = STANDARD
执行如下命令,安装 nano 编辑器,然后使用 nano 编辑器打开 rclone 配置文件进行编辑。
apt-get update && apt-get install -y nano nano /.config/rclone/rclone.conf
linux 下的粘贴命令是 CTRL+SHIFT+V 或 CTRL+INSERT,你可以在本地修改了配置文件后,通过 nano 编辑器,直接粘贴到 docker 容器内。编辑完毕后,使用 CTRL+X 退出 nano 的编辑模式,并按 Y 确认保存,随后直接回车,即完成编辑。
这个配置文件建议备份一个,免得每次都得重新弄
rclone 基本命令
- copy。拷贝命令如下,配置名称是在 config 文件中 [] 里面的文字,桶名就是你的 S3 服务里面的对象存储桶,还可以在桶名后面用 / 来追加指定上传的路径。
- rclone copy 本地文件路径 配置名称:桶名
- rclone copy 本地文件路径 配置名称:桶名/桶内目录
这里我在 docker 内创建了一个 test.txt 文件,尝试将其拷贝到 minio 里面。
touch test.txt rclone copy ./test.txt minio:1panel-bak
命令没有错误输出,即拷贝成功!
root@878a0dd03ec4:/root/rclone# touch test.txt root@878a0dd03ec4:/root/rclone# rclone copy ./test.txt minio:1panel-bak root@878a0dd03ec4:/root/rclone#
尝试在拷贝的时候指定远端仓库内的路径
rclone copy ./test.txt minio:qiniu-muxue-sy/test
成功指定,文件被上传到了 test 文件夹里面。
- sync。备份命令如下,可以在任意目的地(本地 - 远端,远端 - 本地,远端 - 远端)里面执行这个命令,左侧是源路径,右侧是目标。
- rclone sync 本地源文件路径 目的地配置名称:桶名
- rclone sync 源配置名称:桶名 目的地配置名称:桶名
- rclone sync 源配置名称:桶名 目的地的本地文件路径
rclone sync 有两个常用的选项,刚开始使用的时候,建议带上 --dry-run 命令来确认自己的配置没有问题
- -P 显示详细同步进度条
- --dry-run 用作命令测试,不会真正的执行同步
指定 -P 命令后的进度输出如下,可以看到实时网速和文件数量 / 大小。
目前发现的问题是 minio 显示的文件总量和数据存储量会有一定滞后,刚开始我还以为是 rclone 没有跑完呢,sync 完毕过了几分钟 minio 里面才刷出正确的文件数量来。
cron 定时同步
minio docker 内安装 cron 服务
下面介绍在 minio 的 docker 内 cron 服务的安装和使用。
在 minio 的 docker 里面直接安装 crontab 服务和 nano 文本编辑器
apt-get update apt-get install -y cron nano apt-get install -y rsyslog postfix service rsyslog start
但这还不够,cron 服务的运行还依赖于其他组件,需要一并安装。
安装 postfix 的时候会提示让你选择配置文件,键入 1 选择无配置就够了。
postfix 还需要额外配置,否则可能会遇到如下错误
Dec 16 01:07:01 878a0dd03ec4 postfix/sendmail[1859]: fatal: open /etc/postfix/main.cf: No such file or directory
Dec 16 01:12:02 878a0dd03ec4 postfix/postdrop[1912]: warning: unable to look up public/pickup: No such file or directory
配置命令如下
touch /etc/postfix/main.cf mkfifo /var/spool/postfix/public/pickup
crontab 配置定时任务测试
安装完毕后,使用 crontab -e 看看是否能打开 crontab 的配置编辑页面,如果可以打开如下配置界面,则代表 cron 安装成功。
- 使用参考4101-Linux 常用指令
crontab 配置定时 rclone sync
确认 cron 服务可用,就可以来配置 rclone sync 的自动执行命令了。
对于 rclone 的 sync 备份而言,写入如下内容即可;
0 3 * * 1,5 rclone sync qiniu-e1:muxue-sy minio:qiniu-muxue-sy >> /root/rclone/rclone.log 2>&1 0 2 * * 1,5 rclone sync qiniu-e2:muxue-img minio:qiniu-muxue-img >> /root/rclone/rclone.log 2>&1
解析如下
- 0 3 * * 1,5 代表每周一和周五的凌晨 3 点执行一次
- 0 2 * * 1,5 代表每周一和周五的凌晨 2 点执行一次
- >> /root/rclone/rclone.log 2>&1 代表将 rclone 命令的输出结果写入到 /root/rclone/rclone.log 文件中。
写入完毕后,CTRL+X 关闭 nano 编辑模式,按 Y 和回车即完成 nano 编辑。编辑完成后会有如下输出。
root@878a0dd03ec4:/root/rclone# crontab -e no crontab for root - using an empty one crontab: installing new crontab
后续 crontab 执行的命令结果都会输入到 /root/rclone/rclone.log 日志文件中。rclone 命令只有在出现 ERROR 的时候才会输出。如果这个文件里面什么都么有,就代表运行没有出错!
- 无标签