docker 部署 minio 对象存储并用 rclone 同步

1. 什么是 minio?

minio 是一个开源的对象存储服务器,兼容 S3 协议。

官网:https://min.io/

官方在开源的基础上也提供云端 S3 服务,分为个人和企业,有不同的收费标准。

5ae0c978272b7ca6732817920adae0f5.png

1.1 自建对象存储的好处?

当然,本文写下来肯定不是让你去买 minio 的付费对象存储服务的,而是在我们自己的服务器 / Nas 上部署一个 minio 的 docker,来拥有一个我们自己的对象存储服务器!

对象存储服务器可以用来做图床、静态资源缓存,亦或者是直接当作一个网盘来使用。

自建的对象存储的好处是所有源文件我们都能亲手管理,且无需为付费的对象存储的奇怪的计价文档感到手足无措,也不需要担心有人恶意刷流把你一套房子给套走。

缺点就是,自建的稳定性和安全性肯定不如已有厂家提供的服务,且自购的服务器 / Nas 上传带宽一般都很低,文件一多,访问速度就很慢了。

对于我个人而言,自建 minio 的唯一作用,就是备份七牛云 / 阿里云对象存储中的文件。考虑到 2023 下半年,各大厂接连 boom 云服务,国外的谷歌还出现了云盘里面用户的数据回滚到几月前的恶性问题,这可是可能导致用户数据丢失的大问题啊!

所以,将数据在自己本地留一份总是安心一些。数据安全靠的是备份,不是云服务厂家给你提供的 99.99999% 可用性的一面之词。

如果你对数据备份这个话题感兴趣,可以看看我的另外一篇博客:谈谈如何进行有效数据备份,3+2+1,博客中谈到了如何进行有效的数据备份。

温馨提醒:如果你想在云服务器上安装 minio 来备份已有 S3 中的文件的话,最好是使用一个和已有 S3 不在同一个地域、非同一个服务商的云服务器,避免某些服务商云服务器和对象存储服务一起 boom 的情况……

2.docker 安装 minio

2.1 安装 docker

docker 安装的教程详见我的另外一篇博客

【Docker】deepin/centos 安装 docker | 慕雪的寒舍

2.2 安装 minio

2.2.1 docker run 命令

这里推荐使用由 VMware 维护的 minio docker 版本 bitnami/minio,更新很频繁。

镜像:hub.docker.com/r/bitnami/minio

首先我们先创建一个存放 minio 的数据的路径,并将这个路径的所属用户改成 1001,否则 minio 的 docker 会出现权限问题无法写入数据。

plaintext
1
2
3
mkdir minio_data
sudo chown 1001 minio_data
sudo chgrp 1001 minio_data

创建容器的命令如下,非常简单。

bash
1
2
3
4
5
6
7
8
9
docker run -it -d --name minio \
-p 9000:9000 \
-p 9001:9001 \
--restart=always \
-v ./minio_data:/bitnami/minio/data \
-e MINIO_ROOT_USER="minio_root" \
-e MINIO_ROOT_PASSWORD="minio_123456" \
-e TZ='Asia/Shanghai' \
bitnami/minio:latest

该创建容器操作基于如下 hash 的 docker 镜像(更新于 2023-12-12),创建容器的命令后续可能会有变动,请参考 docker-hub 中的官方文档

plaintext
1
bitnami/minio  latest    552af9bd3d6d   2 days ago     212MB

对这个 docker 命令进行解释:

  • -it -d,it 提供交互能力,d 代表后台运行
  • --restart=always,始终重启 docker(docker 服务重启后,镜像会自动启动)
  • -p 9000:9000,将 docker 内的 9000 端口(右侧)映射给宿主机(左侧)的 9000 端口,端口 9001 的映射同理。
    • 容器内 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' 设置时区为东八区(后续定时备份需要有正确时区)
  • 最后的 bitnami/minio:latest 代表我们需要创建 bitnami/minio 这个 docker 镜像的 latest 版本,如果本地没有这个镜像,则会自动去 docker-hub 拉取。

如果你卡在了 pull 镜像的步骤,请自行百度如何替换 docker 的镜像源

2.2.2 测试

如下是我在一个没有安装过 minio 的云服务上测试的结果,成功安装并启动 minio

plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root:~/docker]# docker run -it -d --name minio \
> -p 19000:9000 \
> -p 19001:9001 \
> --restart=always \
> -v /root/docker/minio:/bitnami/minio/data \
> -e MINIO_ROOT_USER="minio_root" \
> -e MINIO_ROOT_PASSWORD="minio_123456" \
> bitnami/minio:latest
Unable to find image 'bitnami/minio:latest' locally
latest: Pulling from bitnami/minio
ef5975039511: Pull complete
Digest: sha256:3bb81d101dea57a5382a2d01eda6991e75ce69669d2d49c4646d82721b7c258e
Status: Downloaded newer image for bitnami/minio:latest
afefbb9514de0f4a1c02b7f4212b1e05eee5ef342ed4ce27e03de10071914060

容器正常启动,处于 Running 状态,STATUS 正常!

plaintext
1
2
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 内端口一致)

2.2.3 docker run 启动容器后一直重启

2024.07.05 更新:有老哥反馈文章里面的 docker run 命令失效,我重新测试了一下,发现是我在 docker run 命令中默认提供的宿主机路径对小白不够友好(现在已经更新 docker run 命令了),问题记录如下。

在最开始的版本中,docker run 命令里面的路径映射写的是

plaintext
1
-v /minio/data:/bitnami/minio/data

这里就会出现一个问题,假设用户把 /minio/data 改成了./minio/data,让 docker 在当前执行命令的路径中创建映射文件夹,那么执行了 docker run 命令后,这个./minio/data 文件夹默认的所属用户是 root,这就会导致容器内的 minio 没有办法写入这个文件夹,权限不够!docker ps 能看到 minio 的容器状态是一直重启,使用 docker logs minio 能看到如下报错。

plaintext
1
/opt/bitnami/scripts/libminio.sh: line 364: /bitnami/minio/data/.root_user: Permission denied

当你使用 docker 时遇到类似的报错,且打印出来了一个目录,那么问题就极大概率是在文件路径的权限上了。所以我们需要将这个路径的权限改一下。假设你映射的路径是./minio/data,那么就使用如下命令修改目录权限。注意所属用户一定要修改成 1001 而不是 1000(实测修改为 1000 依旧会权限不足)

bash
1
2
sudo chown 1001 ./minio/data
sudo chgrp 1001 ./minio/data

修改了之后,删除原有 minio 的 docker,使用相同的命令重新创建一个,再次使用 docker logs minio 查看日志,这一次就没有报错了。

plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
❯ sudo docker logs minio
21:55:02.78 INFO ==>
21:55:02.78 INFO ==> Welcome to the Bitnami minio container
21:55:02.78 INFO ==> Subscribe to project updates by watching https://github.com/bitnami/containers
21:55:02.79 INFO ==> Submit issues and feature requests at https://github.com/bitnami/containers/issues
21:55:02.79 INFO ==> Upgrade to Tanzu Application Catalog for production environments to access custom-configured and pre-packaged software components. Gain enhanced features, including Software Bill of Materials (SBOM), CVE scan result reports, and VEX documents. To learn more, visit https://bitnami.com/enterprise
21:55:02.79 INFO ==>
21:55:02.79 INFO ==> ** Starting MinIO setup **
minio 21:55:02.85 INFO ==> Starting MinIO in background...
minio 21:55:07.89 INFO ==> Adding local Minio host to 'mc' configuration...
minio 21:55:08.02 INFO ==> Stopping MinIO...
21:55:08.08 INFO ==> ** MinIO setup finished! **

minio 21:55:08.10 INFO ==> ** Starting MinIO **

这个问题解决了之后,您应该就可以正常访问 minio 了。

image.png

docker run 的时候若遇到其他问题,欢迎在评论区留言。

2.3 web 管理

使用 http://IP:端口 打开 minio 的 9001 端口对应的宿主机端口,访问 minio 的 web 管理页面。输入刚刚创建容器时,在环境变量里面配置的用户名和密码进行登录,即可进入控制台。

image.png

minio 的界面比较简单,基本要做的操作只有两个,创建 bucket 存储桶,和 accesskey 用于 api 调用。

更高阶的配置项和操作我没有尝试过,请自行参考 minio 的文档或者其他教程。

2.3.1 创建 bucket

第一个界面就是大大的 Object Browser,在这里我们可以创建存储桶

image.png

点击创建 bucket,会进入如下配置项,除了 bucket 的名字,还有三个选项

  • Versioning:版本控制,开启后,该 bucket 将处于多版本模式下,文件会保留修改的历史记录。
  • Object Locking:避免文件被删除,需要支持保留和合法保留(这两个啥意思我不明白),该选项只能在 bucket 创建时打开。
  • Quota:限制容器中文件大小(总容量)

对于我的备份需求来说,这三个额外选项都不需要,直接创建就行了

image.png

创建之后,在 bucket 页面可以看到刚刚创建的 test 存储桶,这里会统计存储容量和文件数量

image-20231213232421462

2.3.2 创建 accessKey

accessKey 是用于操作 api 的 token 凭证。创建完毕后,他只会显示一次,后续将不会显示出来。

image.png

如果你不想创建太多个密钥,那就把这个密钥的文件下载下来,免得到时候不知道是什么了。点击右下角的 import 文件就可以下载,会下载一个 json 文件,内部包含密钥和其他一些相关信息

image.png

因为我这只是做个测试,一会就会把这个 minio 的 docker 删除,所以展示密钥无所谓。如果你是在生产环境下使用,请一定不要暴露你的密钥给任何人。

json
1
2
3
4
5
6
7
{
"url": "http://公网IP:19001/api/v1/service-account-credentials",
"accessKey": "aXpBxrUceV30Id6gOouG",
"secretKey": "dIWl9IFL05UtaI08PZfPXE66zPGu2zWrGFfSTaUm",
"api": "s3v4",
"path": "auto"
}

密钥创建完毕,就能在列表看到它。

image.png

3.rclone 备份

rclone 是一个全平台的命令行工具,其可以用于多种云端 / 本地存储之间的数据拷贝、同步、加密同步等功能。详见 rclone 官网:rclone.org

因为我的目标就是我的七牛云 bucket 里面的图床文件备份到本地,rclone 绝对是不二之选。

3.1 进入 docker 容器内终端

你可以选择在宿主机上安装 rclone,也可以选择直接在 minio 的容器内安装 rclone。

前排提醒:部分 nas 品牌的系统(比如群晖)已经提供了执行定时脚本的功能,这种情况下直接使用系统提供的定时任务来执行 rclone sync 即可,即直接在 nas 里面安装 rclone 和使用定时任务,不要在 minio 的 docker 里面安装 rclone。

如你选择了在宿主机上安装 rclone,则可以直接跳过本 3.1 步骤,阅读 3.2 及后续步骤。

docker 特权模式

注意,如果在 minio 的容器内安装 rclone,那么 minio 容器被删除后,rclone 和它的配置文件自然也不在了

且如果需要用 minio 的容器进行 crontab 定时任务,则必须用特权模式安装 minio 的 docker,在 minio 的 docker 创建命令里面加如下这条,设置特权模式(不需要定时任务可以不设置)。

plaintext
1
--privileged

在绿联 nas 的 docker 管理界面,创建 docker 的时候给定所有权限,也是一样的效果。(因为我不太了解这里具体每个权限的作用,干脆全给了)

image.png

image.png

ssh 连接宿主设备

不同 nas 机型进入 ssh 的方式不太一样,请参考你的 nas 或设备品牌搜索对应类型教程。

连接到宿主设备的 ssh 后,参考:以指定用户启动和进入 docker 容器 - langyong - 博客园 一文,使用如下 docker 命令进入 minio 的容器终端中。

bash
1
2
3
docker exec -it -u 用户名 容器名 /bin/bash
# 示例如下
docker exec -it -u root minio /bin/bash

如果你使用的是绿联、极空间这类不太方便进入 ssh 的 nas,可以在 nas 的 docker 管理页里面操作,如下图所示,选择 /bin/bash 后点击链接即可进入容器内终端。

image.png

3.2 下载安装 rclone

进入终端后,默认所在路径是 docker 容器的工作路径 /opt/bitnami/minio-client

为了避免影响容器运行,我们不要在工作路径里面做操作,请使用如下命令,创建一个新的 rclone 文件夹,进入 root 用户的家目录进行操作。

如果你是在宿主机上操作,也是一样的道理,为 rclone 单独创建一个文件夹,来存放它的软件包、配置文件、执行日志。

plaintext
1
2
mkdir /root/rclone
cd /root/rclone

如果是 docker 内操作,你可以在创建 minio 容器的时候,就把 /root/rclone 路径给映射到宿主机上,方便后续查看 rclone 备份的日志。

下载安装 rclone 的命令如下

bash
1
2
3
4
5
6
7
8
# 下载并解压
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

如果是在 minio 的 docker 内安装,是没有 unzip 命令的,需要安装一下。minio 的 docker 内也没有 sudo,将上述 rclone 安装命令中的 sudo 去掉就可以了。

plaintext
1
apt-get update && apt-get install -y unzip

完成安装命令后,执行一下 rclone,出现 rclone 命令的使用提示,那就是安装成功了!

plaintext
1
2
3
4
5
root@878a0dd03ec4:/root/rclone/rclone-v1.65.0-linux-amd64# rclone
Usage:
rclone [flags]
rclone [command]
...

3.3 rclone 对象存储配置

rclone 的官网上有不同云端存储协议和不同 S3 服务商的配置教程,跟着官方的来就可以了。

执行 rclone config 命令,工具会自动在 /.config/rclone/rclone.conf 下创建一个 config 文件,你可以根据官方的向导,在此处添加新的 remote;

plaintext
1
2
3
4
5
6
7
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 域名就可以看到。

image.png

请注意,七牛云 / 阿里云这类存储服务商,如果你有多个 bucket,且他们的地域不一样,则需要新增对应地域的配置项。可以通过修改 [] 里面的配置名进行区分。

plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[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 配置文件进行编辑。

plaintext
1
2
apt-get update && apt-get install -y nano
nano ~/.config/rclone/rclone.conf

linux 下的粘贴命令是 CTRL+SHIFT+VCTRL+INSERT,你可以在本地修改了配置文件后,通过 nano 编辑器,直接粘贴到 docker 容器内。编辑完毕后,使用 CTRL+X 退出 nano 的编辑模式,并按 Y 确认保存,随后直接回车,即完成编辑。

image.png

image.png

这个配置文件建议备份一个,免得每次都得重新弄。

3.4 rclone 基本命令

rclone copy

拷贝命令如下,配置名称是在 config 文件中 [] 里面的文字,桶名就是你的 S3 服务里面的对象存储桶,还可以在桶名后面用 / 来追加指定上传的路径。

plaintext
1
2
rclone copy 本地文件路径 配置名称:桶名
rclone copy 本地文件路径 配置名称:桶名/桶内目录

这里我在 docker 内创建了一个 test.txt 文件,尝试将其拷贝到 minio 里面。

plaintext
1
2
touch test.txt
rclone copy ./test.txt minio:1panel-bak

命令没有错误输出,即拷贝成功!

plaintext
1
2
3
root@878a0dd03ec4:/root/rclone# touch test.txt
root@878a0dd03ec4:/root/rclone# rclone copy ./test.txt minio:1panel-bak
root@878a0dd03ec4:/root/rclone#

image.png

尝试在拷贝的时候指定远端仓库内的路径

plaintext
1
rclone copy ./test.txt minio:qiniu-muxue-sy/test

成功指定,文件被上传到了 test 文件夹里面。

image.png

rclone sync

备份命令如下,可以在任意目的地(本地 - 远端,远端 - 本地,远端 - 远端)里面执行这个命令,左侧是源路径,右侧是目标。

plaintext
1
2
3
rclone sync 本地源文件路径  目的地配置名称:桶名 
rclone sync 源配置名称:桶名 目的地配置名称:桶名
rclone sync 源配置名称:桶名 目的地的本地文件路径

rclone sync 有两个常用的选项,刚开始使用的时候,建议带上 --dry-run 命令来确认自己的配置没有问题

  • -P 显示详细同步进度条
  • --dry-run 用作命令测试,不会真正的执行同步

指定 -P 命令后的进度输出如下,可以看到实时网速和文件数量 / 大小。

image.png

目前发现的问题是 minio 显示的文件总量和数据存储量会有一定滞后,刚开始我还以为是 rclone 没有跑完呢,sync 完毕过了几分钟 minio 里面才刷出正确的文件数量来。

3.5 cron 定时同步

前排提醒:部分 nas 品牌的系统(比如群晖)已经提供了执行定时脚本的功能,这种情况下直接使用系统提供的定时任务来执行 rclone sync 即可,无序安装其他服务。即直接在 nas 里面安装 rclone 和使用定时任务,不要在 minio 的 docker 里面安装 rclone 和 cron。

  • 群晖官网关于定时任务的说明: https://kb.synology.cn/zh-cn/DSM/help/DSM/AdminCenter/system_taskscheduler?version=6
  • 绿联 nas 的环境中已有 crontab,但我没有试过使用它。考虑到绿联这个 nas 的系统还是一点都不稳定,还是别动它的系统里面的东西了,不知道绿联官方有没有可能把定时任务加到控制页里面去吧(我估计是没戏,这个系统的限制太多了)。

如果你使用的是群晖、威联通等提供了执行定时任务的功能的 nas,请在 nas 内配置好 rclone 后,自行百度执行定时任务相关教程。

minio docker 内安装 cron 服务

下面介绍在 minio 的 docker 内 cron 服务的安装和使用。

在 minio 的 docker 里面直接安装 crontab 服务和 nano 文本编辑器

plaintext
1
2
apt-get update
apt-get install -y cron nano

但这还不够,cron 服务的运行还依赖于其他组件,需要一并安装。

plaintext
1
2
apt-get install -y rsyslog  postfix
service rsyslog start

安装 postfix 的时候会提示让你选择配置文件,键入 1 选择无配置就够了。

image.png

postfix 还需要额外配置,否则可能会遇到如下错误

plaintext
1
2
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

配置命令如下

plaintext
1
2
touch /etc/postfix/main.cf
mkfifo /var/spool/postfix/public/pickup

crontab 配置定时任务测试

安装完毕后,使用 crontab -e 看看是否能打开 crontab 的配置编辑页面,如果可以打开如下配置界面,则代表 cron 安装成功。

image.png

这个配置文件需要写入的格式如下,一行对应一个配置。

plaintext
1
五位cron表达式 需要执行的命令

cron 表达式可以用在线工具 crontab 执行时间计算 - 在线工具

先用如下的配置来检测 cron 服务是否能正常运行,以及是否能成功输出日志

plaintext
1
*/1 * * * * echo "$(date) This is a test command" >> /root/rclone/log.txt

该配置的含义是每分钟执行一次 echo 命令,打印当前时间和对应内容到 /root/rclone/log.txt 文件中。

修改了配置文件后,启动 cron 服务,测试我们的配置是否有效,cron 服务是否能正常运行。

plaintext
1
service cron start 

该命令执行效果如下

plaintext
1
2
root@878a0dd03ec4:/root/rclone# service cron start
Starting periodic command scheduler: cron.

等待数分钟,看看 cron 命令是否成功输出内容到指定文件里面了,有内容则代表配置和运行成功!默认情况下,使用 cron 执行的 echo 命令内的 date 采用了 UTC 时间的输出,但这并不影响我们的使用,给小时加 8 就能得到东八区的时间了。

plaintext
1
2
3
4
5
root@878a0dd03ec4:/root/rclone# cat /root/rclone/log.txt
Sat Dec 16 01:18:01 UTC 2023 This is a test command
Sat Dec 16 01:18:01 UTC 2023 This is a test command
Sat Dec 16 01:19:01 UTC 2023 This is a test command
Sat Dec 16 01:19:01 UTC 2023 This is a test command

在 syslog 里面也能看到 cron 的服务日志,该服务日志组件依赖于先前安装的 rsyslog

plaintext
1
cat /var/log/syslog

文件 /var/log/syslog 内部 cron 执行日志如下

plaintext
1
2
Dec 16 01:25:01 878a0dd03ec4 CRON[2059]: (root) CMD (echo "$(date) This is a test command" >> /root/rclone/log.txt)
Dec 16 01:25:01 878a0dd03ec4 CRON[2058]: (root) CMD (echo "$(date) This is a test command" >> /root/rclone/log.txt)

请注意,默认情况下,minio 的 docker 是没有时区配置的,请一定要在创建 docker 容器的时候,使用 TZ 环境变量来设置时区,否则 crontab 不会执行!
原因也很简单,cron 表达式有一个指定时间,比如每周一执行、几点执行,如果没有配置时区,cron 没有办法明确你的 cron 表达式到底应该什么时候跑,干脆就不跑了!

如果你的 docker 已经创建,不想重新创建,可以通过修改配置文件来设置时区,修改后重启 docker 容器即可。

plaintext
1
2
3
nano /etc/environment
# 在文件末尾写入如下内容
TZ='Asia/Shanghai'

crontab 配置定时 rclone sync

确认 cron 服务可用,就可以来配置 rclone sync 的自动执行命令了。

对于 rclone 的 sync 备份而言,写入如下内容即可;

plaintext
1
2
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 编辑。编辑完成后会有如下输出。

plaintext
1
2
3
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 的时候才会输出。如果这个文件里面什么都么有,就代表运行没有出错!

配置好了之后,使用如下命令重新启动 cron 服务

plaintext
1
service cron restart

用如下命令查看 cron 服务状态

plaintext
1
2
root@878a0dd03ec4:/root/rclone# service cron status
cron is running.

注意:使用 docker 内安装的 cron 并没有开机自启功能,如果你重启了 docker 模块或重启了宿主机,需要重新进入 minio 的 docker 内 bash 来重启 cron 服务

优化 cron 日志

为了让日志更加合理,可以在执行 rclone 命令之前,打印当前时间,这样可以知道 crontab 到底有没有正常执行定时任务。

打印时间的基本命令如下,echo 命令会将当前时间和相关的说明信息写入 test.txt 文件中

plaintext
1
echo "$(date) This is a test command" >> test.txt

执行效果如下,打印了时间和对应的日志信息

plaintext
1
2
3
root@878a0dd03ec4:/root/rclone# echo "$(date) This is a test command" >> test.txt
root@878a0dd03ec4:/root/rclone# cat test.txt
Sat Dec 16 09:36:06 CST 2023 This is a test command

再次提醒,minio 的 docker 内必须指定 TZ 环境变量,否则 crontab 不会执行!且 date 命令时区和东八区不符。

echo 打印的时候,可以临时指定 TZ 环境变量来打印不同时区的 date;

plaintext
1
echo "$(TZ='Asia/Shanghai' date) 这是东八区" >> test.txt

执行效果如下,因为我的 docker 内已经设置了 TZ 环境变量为东八区,所以不加这个 TZ 也是打印的东八区的时间。

plaintext
1
2
3
4
root@878a0dd03ec4:/root/rclone# echo "$(TZ='Asia/Shanghai' date) 这是东八区" >> test.txt
root@878a0dd03ec4:/root/rclone# cat test.txt
Sat Dec 16 09:36:06 CST 2023 This is a test command
Sat Dec 16 09:37:39 CST 2023 这是东八区

但是需要注意的是,使用 cron 命令执行的时候,它依旧会打印 UTC 时间,前文已经提到过了。

将原本的 crontab 命令改成如下形式(crontab -e 编辑配置文件),使用 && 来链接 echo 和 rclone 命令,这样在每次执行 rclone 之前都会有一个当前时间和 sync 的是什么内容的的输出,能让我们知道 crontab 是否正常执行。

plaintext
1
2
3
0 3 * * 1,5 echo "$(TZ='Asia/Shanghai' date) sync muxue-sy" >> /root/rclone/rclone.log && rclone sync qiniu-e1:muxue-sy  minio:qiniu-muxue-sy >> /root/rclone/rclone.log 2>&1

0 2 * * 1,5 echo "$(TZ='Asia/Shanghai' date) sync muxue-img" >> /root/rclone/rclone.log && rclone sync qiniu-e2:muxue-img minio:qiniu-muxue-img >> /root/rclone/rclone.log 2>&1

你可以修改 cron 表达式为 */1 * * * *,让 crontab 表达式立即执行一次,确认一下输出是否正确,以及 rclone 命令是否正常执行。

plaintext
1
*/1 * * * * echo "$(date) sync muxue-img" >> /root/rclone/rclone.log && rclone sync qiniu-e2:muxue-img  minio:qiniu-muxue-img >> /root/rclone/rclone.log 2>&1

我的测试结果如下,rclone sync 成功被 cron 执行(这个 ERROR 是因为我的 bucket 里面有个无效的文件,正常情况下应该不会有 ERROR)

plaintext
1
2
Sat Dec 16 01:45:01 UTC 2023 sync muxue-img
2023/12/16 01:45:02 ERROR : : Entry doesn't belong in directory "" (same as directory) - ignoring

测试结束后,记得还原配置项

每次修改配置文件后,都需要重启 cron 服务!

plaintext
1
2
3
root@878a0dd03ec4:/root/rclone# service cron restart
Restarting periodic command scheduler: cronStopping periodic command scheduler: cron.
Starting periodic command scheduler: cron.

centos8 安装 cron

在 centos8 中安装 cron 的命令不同

bash
1
yum install -y vixie-cron crontabs

启动 crontab 的相关命令如下

bash
1
2
3
4
systemctl start crond # 启动cron服务
systemctl enable crond # 设置开机自启
systemctl status crond # cron服务状态
systemctl restart crond # 重启cron

cron 配置的其余操作和上文相同,都是用 crontab -e 编辑配置文件。

因为我这个是一个云服务器的完整 centos 系统,所以也不需要安装 rsyslog postfix 这两个包。在 docker 里面安装的时候才需要;

The end

本文的教程结束,有问题欢迎在评论区提出。

因为 rclone 可以在 windows 主机上运行,所以你也可以直接用 rclone sync 命令把 S3 里面的文件下载到主机上来备份,这样就不需要用云服务器或者 nas 了。

数据无价,多一份备份,多一份安心!