为了解决部分组件的数据存储问题,最近在测试环境部署了一套MinIO,同时小小的踩坑了一下mc命令。在这里记录一下踩坑过程。
核心目标有:
- 启动容器并设置账号密码、挂载数据到本地
- MinIO内部使用HTTP,通过Nginx向外暴露HTTPS
- 配置MinIO的分享链接的域名(自动创建的Share URL)
- 配置允许LDAP用户登录MinIO
Docker镜像
在DockerHub上搜索MinIO,出现在前排的都是bitnami/minio和elestio/minio等也算是官方的镜像,但是原味的镜像minio/minio却不在前面,不是很理解为什么。这里给出原味的minio的链接:https://hub.docker.com/r/minio/minio
启动容器
官方手册参考:
https://min.io/docs/minio/container/index.html#procedure
建议使用配置文件夹的方式导入一份配置文件,通过环境变量指向该配置文件,避免后期修改配置文件时需要重新创建容器。
创建config/config.env
#管理员用户名密码
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=********
#反向代理向外暴露的链接(Nginx对外暴露的Console地址)
MINIO_BROWSER_REDIRECT_URL=https://example.com:12345/minio/ui
#容器内的数据文件夹
MINIO_VOLUMES="/mnt/data"
使用配置文件启动命令,也可在命令中修改内部的端口号
sudo docker run -itd \
-p 12819:9000-p 25619:9001 \
--name minio --restart=always \
-e "MINIO_CONFIG_ENV_FILE=/mnt/config/config.env" \
-v /path/to/data:/mnt/data -v /path/to/config:mnt/config \
minio/minio server -address ":9000" --console-address ":9001"
这里的存在两个端口,一个是web页面(Console)的服务端口9001,一个是对象存储(MinIO)的API接口9000,这里可以直接用不同的端口启动,但是一定要区分清楚容器内网的端口是否发生转换,因为mc命令和Console是默认连接http://127.0.0.1:9000
这个链接,使用容器内mc命令时需要重新登录(后面会讲)
这里有个坑,如果在启动时指定了uid,会导致容器启动后进入内运行mc
命令时没有权限创建文件,而且无法提权。需要在容器启动前处理好容器内外目录的挂载权限。报错信息如下:
mc: <ERROR> Unable to save new mc config. mkdir /.mc: permission denied.
修改服务端口
服务启动时的端口需要在启动Docker时的命令行参数中设置,只配置环境变量是无效的!环境变量仅影响服务在运行时,外显的URL信息,不会直接影响服务的运行端口。尤其当需要代理服务实现端口转换或者路径组合时,这个区别尤为重要。
修改启动命令实现服务端口的修改。
server -address ":12819" --console-address ":25619"
此时在mc alias list
中连接的S3后端服务(如local)就应该使用http(s)://<hostname>:12819
来配置了(强调端口,不限制协议和域名)
先通过docker进入容器内的命令行
docker exec -it minio bash
查询所有配置的对象存储桶。
sh-4.4# mc alias list
gcs
URL : https://storage.googleapis.com
AccessKey : YOUR-ACCESS-KEY-HERE
SecretKey : YOUR-SECRET-KEY-HERE
API : S3v2
Path : dns
local
URL : http://localhost:9000
AccessKey :
SecretKey :
API :
Path : auto
play
URL : https://play.min.io
AccessKey : Q3AM3UQ867SPQ
SecretKey : zuf+tfteSlswRu7BJ86wekitnifILb
API : S3v4
Path : auto
s3
URL : https://s3.amazonaws.com
AccessKey : YOUR-ACCESS-KEY-HERE
SecretKey : YOUR-SECRET-KEY-HERE
API : S3v4
Path : dns
这里的local理论上就是本机的MinIO,但是需要删除并重新添加后才不会出现mc: xxxxxxxx. Access Denied
mc alias remove local
mc alias set local http://localhost:12819 admin <password>
修改后mc alias list
被修改为如下内容
gcs
URL : https://storage.googleapis.com
AccessKey : YOUR-ACCESS-KEY-HERE
SecretKey : YOUR-SECRET-KEY-HERE
API : S3v2
Path : dns
local
URL : http://localhost:12819
AccessKey : admin
SecretKey : <password>
API : s3v4
Path : auto
play
URL : https://play.min.io
AccessKey : Q3AM3UQ867SPQQA43P2F
SecretKey : zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
API : S3v4
Path : auto
s3
URL : https://s3.amazonaws.com
AccessKey : YOUR-ACCESS-KEY-HERE
SecretKey : YOUR-SECRET-KEY-HERE
API : S3v4
Path : dns
此处配置错误会导致Console访问MinIO时报错:
mc: <ERROR> Unable to list user. Get "http://localhost:9000/minio/admin/v3/list-users": dial tcp 127.0.0.1:9000: connect: connection refused.
然后就可以正常使用mc命令操作本地的MinIO,教程里的myminio其实就是local。
配置Console前端Share分享链接域名
为了修改在前端Console中配置的URL信息,避免在分享链接中使用localhost等内网域名。(此处使用的域名可以和mc alias list
中使用的不同)配置文件中添加:
MINIO_BROWSER_REDIRECT_URL=https://example.com:12345/minio/ui
MINIO_BROWSER_REDIRECT_URL会影响前端代理的访问路径,可以通过加后缀的方式在同一个域名下做代理路由,例如加/minio/ui/
后缀。
Nginx配置
server{
listen 12345; # 根据需要调整端口
xxxxxx
# 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://endpoint.com:12819; # MinIO的API后端端口
}
location /minio/ui/ {
rewrite ^/minio/ui/(.*) /$1 break;
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;
real_ip_header X-Real-IP;
proxy_connect_timeout 300;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
chunked_transfer_encoding off;
proxy_pass http://endpoint.com:25619; # Console前端端口
}
xxxxxx
}
之后就可通过http(s)://example.com:12345/minio/ui 直接访问前端界面了。Nginx会使用http的方式与MinIO通信,MinIO此时不会要求请求必须是TLS连接。TLS证书的部署可以转移至Nginx中完成。
文档参考:https://min.io/docs/minio/linux/integrations/setup-nginx-proxy-with-minio.html
LDAP服务连接
注意,使用LDAP后会导致管理页面内用户和组页面不可见,除了admin用户,其他登录请求将都会查询LDAP服务。
在管理页面配置LDAP服务器信息,如果服务器有TLS证书,请勿开启 Insecure 会导致链接报错。
查询域要根据不同LDAP服务器配置,这里给出我的组织结构供参考
User DN Search Base: dc=wolfbolin,dc=com
User DN Search Filter: (cn=%s)
Group Search Base DN: ou=people,dc=wolfbolin,dc=com
Group Search Filter: (memberUid=%s)
给LDAP用户添加全局管理员权限(consoleAdmin)
系统在初始化的时候已经创建了consoleAdmin、readonly、readwrite等权限,可以直接使用。也可以创建更复杂的策略后再赋给指定的用户。
mc idp ldap policy attach local consoleAdmin --user='cn=wolflin,ou=people,dc=wolfbolin,dc=com'
然后就可以使用用户名(wolflin)和密码直接登录MinIO面板或者调用API了。