Docker部署单节点MinIO(Nginx TLS反向代理+LDAP账户接入)

为了解决部分组件的数据存储问题,最近在测试环境部署了一套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

(推荐)https://min.io/docs/minio/container/operations/install-deploy-manage/deploy-minio-single-node-single-drive.html

建议使用配置文件夹的方式导入一份配置文件,通过环境变量指向该配置文件,避免后期修改配置文件时需要重新创建容器。

创建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了。

You may also like...

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注