请注意文章时效(2024-03-17)
【Minio是什么】
Minio是一款兼容Amazon S3 API的高性能的对象存储服务器。如:aws的s3存储、阿里云的OSS、腾讯的COS等都属于S3协议的存储(也就是说:有了minio,可以弃用各种收费的对象存储和CDN等)。
【NAS部署Minio适用人群】
同时拥有一台云服务器以及一台有带公网IP的NAS用户。
【为什么NAS部署Minio】
云服务器带宽太低,空间不够,用来做穿透太鸡肋。本地NAS是7*24小时开机,空间足够大,但没有80和443端口。那么我们可以将网站部署在云服务器上,然后把对象存储建立在本地NAS上。网站访问速度将大大提高,本地NAS也存储了关键数据。
【适合适用minio的网站或应用】
wordpress博客,memos笔记,思源笔记,chevereto图床,兰空图床,alist网盘等一切支持部署s3兼容对象存储的应用。
安装教程:(在群晖DSM7.0系统下搭建)
1.第一步,新建、映射两个文件夹,config和data,我的路径:/volume1/docker/minio。
2.第二步,新建docker-compose.yml,运行容器
docker-compose.yml内容如下:
version: "3.7"
services:
minio:
image: minio/minio
container_name: minio
command: server --address ":9000" --console-address ":9090" /data # 指定服务端口和管理端口
ports:
- 9080:9000 # :前面的自行定义,服务端口:API: http://IP:9080
- 9090:9090 # :前面的自行定义,管理端口:http://IP:9090
volumes:
- ./data:/data # 数据目录
- ./config:/root/.minio # TLS 密钥和证书存放在 .config/certs
environment:
- MINIO_ROOT_USER=admin # 用户名,自行修改
- MINIO_ROOT_PASSWORD=password # root密码,自行修改
restart: unless-stopped # 总是重启容器
networks: #网络设置
- app_net # 网络名称
networks:
app_net:
external: true
运行容器:
docker-compose up -d
3.第三步,浏览器打开minio网址http://IP:9090,如下,输入之前设置的账号密码进入。
4.第四步,新建用户
(1)创建用户(Create User)例:siyuan
(2)创建组(Create Group)并关联用户。例:vps 关联siyuan
\保存
(3)服务帐户/创建访问密钥 Create Access Key
将会下载一个credentials.json证书文件,打开后有密钥稍后配置思源笔记会用的。
5.第五步,创建桶(Create Bucket)。
6.第六步,恭喜!可以上传文件了!。
7.第七步,创建地区。 点击左侧settings--点击region--在server location输入cn,点save。(意思地区是cn)
网页顶部会提示重启生效,点击Restart。等待小会,minio重启完成,刷新网页即可。
至此minio所有的配置已经完成。你的数据如下:
Endpoint: http://域名:9080
地区region:cn
access key:在第四步创建的
secret key:在第四步创建的
存储桶Bucket:blog(第五步创建的名字,例:siyuan)
Url前缀:http://域名:9090/siyuan #siyuan 是创建桶的名称,你可以自行定义
部署完成后,minio不需要登录,保持docker容器开着就行。如果要给不同应用不同的存储桶,只需额外创建对应存储桶就行(第五步),其他数据不需要变。
需要注意的是,如果你需要部署对象存储的网站是https,需要在Nginx Proxy Manager里将9080端口进行反代,并进行端口映射。例如端口映射到99,那你的endpoint就变成了https://域名:99,同理url就变成了https://域名:99/siyuan。
# Allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# Disable buffering
proxy_buffering off;
proxy_request_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://minio:9000;
}
你需要配置对象存储的网站,例如博客,图床。填入以上数据即可。
附:官方文档:https://www.minio.org.cn/docs/minio/kubernetes/upstream/index.html
思源笔记配置界面
详解两个坑的解决方案
1、Nginx Proxy Manager 无法反向代理
官网Issues上这类问题很多:https://github.com/NginxProxyManager/nginx-proxy-manager/issues?q=minio
具体解方法:详见官方文档:https://www.minio.org.cn/docs/minio/linux/integrations/setup-nginx-proxy-with-minio.html
(1)api服务端反向代理配置如下:
注意:
Scheme* 要改成 https 如果没有放置TLS证书请用http
Forward Hostname / IP* minio 是容器的名称
Forward Port * 99 是容器的内部端口,注意区分,不是映射到主机的端口9080
# Allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# Disable buffering
proxy_buffering off;
proxy_request_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass https://minio:99;
}
注意:
https://minio:99 # 要改成 https (如果没有放置TLS证书请用http),99 是容器内部端口
管理端服务端反向代理配置如下:
注意:
Scheme* 要改成 https 如果没有放置TLS证书请用http
Forward Hostname / IP* minio 是容器的名称
Forward Port * 9090 是容器的内部端口
复制下列代码:
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
# This is necessary to pass the correct IP to be hashed
real_ip_header X-Real-IP;
proxy_connect_timeout 300;
# To support websockets in MinIO versions released after January 2023
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Some environments may encounter CORS errors (Kubernetes + Nginx Ingress)
# Uncomment the following line to set the Origin request to an empty string
# proxy_set_header Origin '';
chunked_transfer_encoding off;
proxy_pass https://minio:9090;
}
注意:
https://minio:9090 # 要改成 https(如果没有放置TLS证书请用http) ,9090 是容器内部端口
如果不加这段代码,会出现如下情况(坑点,原因不明)
会一直打圈,不能显示列表
2、共享文件外部域分享,显示为内部域ip(127.0.0.1:端口) (大坑)
经阅读官方文档:https://www.minio.org.cn/docs/minio/linux/integrations/setup-nginx-proxy-with-minio.html
对于个人的私有化布署,不太友好,官方文档也没说清楚
(1)需要设置两个变量:
您还必须为MinIO部署设置以下环境变量:
将 MINIO_SERVER_URL 设置为MinIO服务器的代理主机FQDN( https://minio.example.net )
将 MINIO_BROWSER_REDIRECT_URL 设置为代理主机的 FQDN (https://example.net/minio/ui)
(2)修改 docker-compose.yml内容如下:
version: "3.7"
services:
minio:
image: minio/minio
container_name: minio
command: server --address ":9000" --console-address ":9090" /data # 指定服务端口和管理端口
ports:
- 9080:9000 # :前面的自行定义,服务端口:API: http://IP:9080
- 9090:9090 # :前面的自行定义,管理端口:http://IP:9090
volumes:
- ./data:/data # 数据目录
- ./config:/root/.minio # TLS 密钥和证书存放在 ./config/certs
environment:
- MINIO_ROOT_USER=admin # 用户名,自行修改
- MINIO_ROOT_PASSWORD=password # 密码,自行修改
- MINIO_SERVER_URL=https://api.example.com:99 # 自行修改成自已的域名# 反向代理的服务域名,用于文件分享外部url,":99" 是反向代理后公网访问端口
- MINIO_BROWSER_REDIRECT_URL=https://s3.example.com:99 # 自行修改成自已的域名# 反向代理的登录域名,":99" 是反向代理后公网访问端口
restart: unless-stopped # 总是重启容器
networks: #网络设置
- app_net # 网络名称
networks:
app_net:
external: true
(3)运行容器:
docker-compose up -d
(4)无法登录管理页面
(5)找原因
官网Issues上这类问题很多
大多数并没有给我带来帮助:https://github.com/minio/minio/issues?q=MINIO_ROOT_USER
有一篇提问提到这个问题:
minio启动后,会主动验证~ MINIO_SERVER_URL=https://api.example.com:99 ~的可通性
面临两个问题:
A.反向代理后方,无证书
B.反向代理后方,内部如何域名解析到127.0.0.1
对于个人单机单点的私有化布署,不太友好,官方文档也没说清楚
最终还是在官方文档上找到了方法
先解决证书问题:
官方文档详见:https://www.minio.org.cn/docs/minio/linux/operations/network-encryption.html
使用 MinIO 的 certgen 工具来生成自签名的TLS证书的方法,详见:https://www.cnblogs.com/hahaha111122222/p/15984957.html
下载地址:https://github.com/minio/certgen/releases/tag/v0.0.2
下载certgen-windows-amd64.exe 放到任意文件夹,例如:.\desktop\1
certgen -ca -host "主机IP,minio容器运行IP,两个域名,hostname"
实际执行的生成证书的命令:
./certgen-windows-amd64.exe -ca -host "127.0.0.1,192.168.30.2,172.18.0.22,api.example.com,s3.example.com,minio"
显示:
2022/03/09 14:10:58 wrote public.crt
2022/03/09 14:10:58 wrote private.key
如图:
解释一下ip和域名:
127.0.0.1 主机环回地址
192.168.30.2 主机ip
172.18.0.22 容器内ip
api.example.com 服务域名
s3.example.com 管理域我
minio hostname
复制public.crt private.key 到 主机的./config 映射目录下
反向代理后面的域名解析到127.0.0.1
可以在docker-compose中增加dns记录解决
extra_hosts:
api.example.com : 127.0.0.1 # 自行修改服务域名
s3.example.com : 127.0.0.1 # 自行修改服务域名
解决容器内部无法访问到99端口的问题
家庭网络环境中,路由器会转发端口
例如:
A路由器外部公网端口:99 #运营商限制不能使用80 没办法只能用99代替
B反向代理端口:80/443
C主机端口:9080 # 详见docker-compose 的配置
D容器内部端口:9000
访问的传递是 A->B->C->D
在容器内部,无法使用99端口
这就需要将容器服务端口与外部端口统一使用 “:99”
综上修改后的docker-compos.yml如下:
version: "3.7"
services:
minio:
image: minio/minio
container_name: minio
command: server --address ":99" --console-address ":9090" /data # 指定服务端口和管理端口
ports:
- 9080:99 # :前面的自行定义,服务端口:API: http://IP:9080
- 9090:9090 # :前面的自行定义,管理端口:http://IP:9090
extra_hosts:
api.example.com : 127.0.0.1 # 自行修改服务域名
s3.example.com : 127.0.0.1 # 自行修改服务域名
volumes:
- ./data:/data # 数据目录
- ./config:/root/.minio # TLS 密钥和证书存放在 ./config/certs
environment:
- MINIO_ROOT_USER=admin # 用户名,自行修改
- MINIO_ROOT_PASSWORD=password # 密码,自行修改
- MINIO_SERVER_URL=https://api.example.com:99 # 自行修改成自已的域名# 反向代理的服务域名,用于文件分享外部url,":99" 是反向代理后公网访问端口
- MINIO_BROWSER_REDIRECT_URL=https://s3.example.com:99 # 自行修改成自已的域名# 反向代理的登录域名,":99" 是反向代理后公网访问端口
- MINIO_STS_DURATION=168h # 文件分享外部url 最大时长 7天,超过7天无效,永久分享的方法:Buckets(存储块)Access Policy设为 public,链接文件名后面“?及以后的代码”删除。比较危险,通过Buckets路径,可以看到所有文件的目录。
restart: unless-stopped # 总是重启容器
networks: #网络设置
- app_net # 网络名称
networks:
app_net:
external: true
运行容器:
docker-compose up -d
完美解决
------------完毕------------
评论 (0)