windows部署minio,实现内网S3同步思源。

1. 什么是minio?

关于minio和S3同步的介绍,可以看本站的这篇文章:【docker】部署minio对象存储并用rclone同步

思源笔记支持S3同步,且比起webdav,始终更加推荐S3协议来同步思源笔记。

本文的内容适用于如下场景:

  1. 我只想在内网的其他机器上同步思源笔记。比如我只是想有一个快捷的方式能把PC写的笔记同步到手机APP上,在手机上基本只作电脑不在身旁时的临时阅读使用。
  2. 我对同步的实时性要求不高,每天回家之后可以执行一次同步让手机的文档更新即可。

在这个场景中,用户的需求并不是需要跨多个网络的云端同步,只是想用同步做一个中转站,能把数据从PC快捷导入到手机上而已。某种意义上说,我就是这类用户。

由于对同步的实时性要求不高,完全可以通过在windows主机上自建minio的方式来实现内网的思源笔记S3同步,这样就不需要去购买云端的S3服务了。

即便在这个场景下,云端S3的资费并不高,但这笔钱还是可以省下来嘛。

minio的官网上,就贴出了在windows下部署minio的命令,还有更详细的部署教程。注意要选择的是非Enterprise的这个栏目,Enterprise的是企业专业版,需要购买授权。

image.png

本文将用一个win10的虚拟机带大家走一遍这个安装流程,毕竟我之前也没部署过windows下的。

在部署了之后,我会切换到宿主机(模拟内网中的另外一台机器)和手机app,尝试用思源笔记进行同步操作,以确认该方案的可行性。

使用的思源笔记版本为v3.1.3

2. 开整

把官方的命令copy过来,试试运行。

1
2
3
4
PS> Invoke-WebRequest -Uri "https://dl.min.io/server/minio/release/windows-amd64/minio.exe" -OutFile "C:\minio.exe"
PS> setx MINIO_ROOT_USER admin
PS> setx MINIO_ROOT_PASSWORD password
PS> C:\minio.exe server F:\Data --console-address ":9001"

注意,第一个命令是用来下载文件的,你可以直接在官网也没点击download下载minio.exe,这样就可以不用命令行了。edge会提示你“通常不会保留minio.exe”,点击更多选项里面的仍然保留即可。

image.png

这里我将其放到桌面的minio文件夹里面,然后用powershell命令行进入这个文件夹

image.png

备注:win10自带的powershell界面简陋,建议去微软商店下载最新版本的windows terminal终端工具,更好看。

image.png

win10在系统搜索栏里面搜索powershell,将其打开,输入如下命令进入桌面的minio文件夹。

1
cd C:\Users\用户名\Desktop\minio

进入桌面的minio文件夹了以后,执行官方给出的三个命令,前两个命令是用来设置初试的管理员用户和密码的。第三个命令是启动minio服务端,这里我修改了原本给出的启动命令里面的F盘,那个是minio的文件保存目录,我将其修改成了和minio.exe同级目录中的data文件夹。

1
2
3
4
cd C:\Users\用户名\Desktop\minio
setx MINIO_ROOT_USER muxue
setx MINIO_ROOT_PASSWORD 123456
.\minio.exe server .\data --console-address ":9001"

键入启动命令后,会弹出防火墙提示,点击允许访问即可。

image.png

到这里,其实minio服务端就已经启动了。可以用http://192.168.154.131:9001放问控制台界面。

但是,启动命令的输出最下方有一个警告

1
WARN: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables

警告说默认的账户和密码并没有被修改,推荐使用MINIO_ROOT_USERMINIO_ROOT_PASSWORD环境变量将其修改。这说明刚刚我执行过的两个setx命令并没有生效,即便命令的提示是“指定值已经保存”。我猜测是因为powershell没有用管理员身份执行,尝试用管理员身份重新启动一个powershell,再次执行如上命令。

果然,用管理员身份启动powershell,执行了setx命令后,重新启动minio,报错变成了下面这个:

1
2
3
4
FATAL Unable to validate credentials inherited from the shell environment: Invalid credentials
> Please provide correct credentials
HINT:
MINIO_ROOT_USER length should be at least 3, and MINIO_ROOT_PASSWORD length at least 8 characters

这个报错的含义是,用户名至少3个字符,用户密码至少8个字符,而刚刚我只设置了6个字符的密码,需要重新修改一下密码。

1
2
3
4
cd C:\Users\用户名\Desktop\minio
setx MINIO_ROOT_USER muxue
setx MINIO_ROOT_PASSWORD 12345678
.\minio.exe server .\data --console-address ":9001"

这一次命令执行就没有问题了,我们成功设置了用户名和密码。在minio文件夹里面也出现了data子文件夹。

image.png

这里显示了两个URL路径:

  • 一个是9000端口(API端口,思源S3同步需要使用这个端口)。
  • 另外一个是9001端口(WEB管理页面端口,登录和创建Bucket需要使用这个端口)。

浏览器打开9001端口,进入minio的web界面,登录。

image.png

进入主页面了之后,分别在Bucket目录下创建一个存储桶,在Access Keys栏目下创建一个用户密钥。这部分操作和【docker】部署minio对象存储并用rclone同步里面提到过的完全一致。

image.png

点击Buckets里面的Create Bucket,填写一个名字,下面的三个选项都不需要选,对于思源同步来说这三个选项没有作用。然后点击右下角的Create Bucket按钮创建这个桶。

image.png

Access Keys也是如此,创建一个,填写一下name即可。这里的Expriy是过期时间,不填写就是永不过期。点击Create创建,将AK和SK记录下来。

image.png

image.png

现在我们就创建好了思源同步需要的所有东西了,可以去思源客户端里面填写了。

3. 思源PC客户端填写密钥

填写方式如下图所示:

  • Endpoint填minio的API9000端口号的地址;
  • AK和SK填刚刚粘贴的;
  • Bucket填存储桶的名字;
  • Region默认是us-east-1
  • Addressing改成Path-style
  • TLS Verfiy改成Skip跳过,因为我们没有配置证书;

image.png

到这里就配置成功了,点击思源的云按钮,上传一次数据看看。没有问题,上传成功了。

image.png

在minio控制台的bucket一栏也能看到最新的数据。

image.png

在桌面上的minio文件夹data目录中也有对应文件。

image.png

到这里,我们的配置就成功了!

4. 第二台设备配置思源同步

第二台设备中只需要能访问minio的控制台,那他就可以访问minio的API端口。

用另外一台设备(宿主机)打开局域网IP地址的时候,会发现是502,这代表我们的请求被windows的防火墙拦截了。可以参考本站的【win】windows开启特定端口防火墙教程开启防火墙。配置的时候,入站、出站规则都须同时配置,协议选择tcp,可以只允许9000API端口,也可以把9000和9001都允许了。

image.png

不过,我发现我的宿主机还是没有办法访问虚拟机,就连ping都是不通的。

1
2
3
4
5
正在 Ping 192.168.154.131 具有 32 字节的数据:
请求超时。

192.168.154.131 的 Ping 统计信息:
数据包: 已发送 = 1,已接收 = 0,丢失 = 1 (100% 丢失),

发现在虚拟机防火墙的入站规则中,ICMP(ping需要这个)默认是被禁用的。右键它们将其设置为启用。

image.png

现在就可以被ping通了

1
2
3
4
5
6
7
8
9
10
正在 Ping 192.168.154.131 具有 32 字节的数据:
来自 192.168.154.131 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.154.131 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.154.131 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.154.131 的回复: 字节=32 时间<1ms TTL=128

192.168.154.131 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms

不过,我还是没有办法访问minio的web页面。原因未知,不是防火墙问题。在宿主机上使用curl命令会得到如下输出,这是minio服务端发回的响应,这代表我们的宿主机已经可以访问到虚拟机的minio了,但是因为其他的原因导致控制台加载不出来。

1
2
PS> curl http://192.168.154.131:9001/
<!doctype html><html lang="en"><head><meta charset="utf-8"/><base href="/"/><meta content="width=device-width,initial-scale=1" name="viewport"/><meta content="#081C42" media="(prefers-color-scheme: light)" name="theme-color"/><meta content="#081C42" media="(prefers-color-scheme: dark)" name="theme-color"/><meta content="MinIO Console" name="description"/><meta name="minio-license" content="agpl" /><link href="./styles/root-styles.css" rel="stylesheet"/><link href="./apple-icon-180x180.png" rel="apple-touch-icon" sizes="180x180"/><link href="./favicon-32x32.png" rel="icon" sizes="32x32" type="image/png"/><link href="./favicon-96x96.png" rel="icon" sizes="96x96" type="image/png"/><link href="./favicon-16x16.png" rel="icon" sizes="16x16" type="image/png"/><link href="./manifest.json" rel="manifest"/><link color="#3a4e54" href="./safari-pinned-tab.svg" rel="mask-icon"/><title>MinIO Console</title><script defer="defer" src="./static/js/main.41754270.js"></script><link href="./static/css/main.e60e4760.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"><div id="preload"><img src="./images/background.svg"/> <img src="./images/background-wave-orig2.svg"/></div><div id="loader-block"><img src="./Loader.svg"/></div></div></body></html>

不过这不是问题,使用和虚拟机里面一样的S3配置,已经可以成功下载资料啦!右上角的工作空间名字和虚拟机内不一样,足以证明在另外一台电脑上配置成功了。

image.png

5. 模拟手机app同步

手机app我用模拟器装一个,也能实现同步!

image.png

6. minio开机自启

现在就剩下最后一个问题了,即把minio配置为开机自启,避免每次都得手动启动服务器程序。首先将如下内容写入一个minio_server.bat里面。

1
2
3
setx MINIO_ROOT_USER muxue
setx MINIO_ROOT_PASSWORD 12345678
C:\Users\用户名\Desktop\minio\minio.exe server C:\Users\用户名\Desktop\minio\data --console-address ":9001"

然后创建一个.vbs文件,写入如下内容,这样可以在启动bat的时候隐藏控制台。

1
2
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "C:\Users\用户名\Desktop\minio\minio_server.bat", 0, False

将这个.vbs文件放入C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp里面,这个文件夹内的文件都会被开机自启。

image.png

在任务管理器的启动里面,也能看到这个新增的vbs文件

image.png

重启虚拟机,看看是否能自动启动minio服务端。

image.png

没有问题,自动启动成功。而且账户和密码都是正确的,数据也正常。

image.png

7. 搞定

有啥问题,欢迎评论区留言交流!