最近需要给一台机器配个单机版的minio,遂记录下配置过程。
以前我写过一篇不是用docker安装的文章,但是那篇文章里面其实有些问题我没解决,这篇文章一并解决了。
在开始前,需要准备两个子域名并做好解析,一个用于api,一个用于console。
例如:minio.example.com(用于api)console.minio.example.com(用于console)
安装需要用到的软件:
apt -y update apt -y install curl nginx python3-certbot-nginx curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh
创建目录,新建docker-compose文件:
mkdir -p /opt/minio && cd /opt/minio && nano docker-compose.yml
写入如下配置:
version: '3.7' services: minio: image: quay.io/minio/minio container_name: minio restart: unless-stopped environment: - MINIO_DOMAIN=minio.example.com - MINIO_SERVER_URL=https://minio.example.com - MINIO_BROWSER_REDIRECT_URL=https://console.minio.example.com - MINIO_ROOT_USER=imlala - MINIO_ROOT_PASSWORD=yourpasswd ports: - "127.0.0.1:9000:9000" - "127.0.0.1:9090:9090" volumes: - ./data:/data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 command: server /data --console-address ":9090"
这里有几个非常容易混淆的环境变量,下面一个个详细解释下。
MINIO_DOMAIN,是用来启用dns style bucket功能的,也就是virtual hosted-style,注意这个变量后面填写的域名不要加https://。
MINIO_SERVER_URL其实就是指的api服务域名,在配置反向代理的情况下,务必要正确填写为反代服务器所用的域名。
MINIO_BROWSER_REDIRECT_URL指的是console的域名,在配置反向代理的情况下,也要填写为反代服务器所用的域名,同时不能与api服务用同相同的域名,用相同的域名会出各种各样的问题。
另外9000端口为api服务端口,9090为console端口。在配置反代的时候注意区分。
配置好了后启动即可:
docker compose up -d
下面来配置nginx反向代理。
反代api,新建nginx配置:
nano /etc/nginx/sites-available/minio
写入如下配置:
server { listen 80; server_name minio.example.com; ignore_invalid_headers off; client_max_body_size 0; proxy_buffering off; location / { 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 Host $http_host; proxy_connect_timeout 300; proxy_http_version 1.1; proxy_set_header Connection ""; chunked_transfer_encoding off; proxy_pass http://localhost:9000; } }
反代console,新建nginx配置:
nano /etc/nginx/sites-available/console-minio
写入如下配置:
server { listen 80; server_name console.minio.example.com; ignore_invalid_headers off; client_max_body_size 0; proxy_buffering off; location / { 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 Host $http_host; 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://localhost:9090; } }
启用新的配置:
ln -s /etc/nginx/sites-available/minio /etc/nginx/sites-enabled/minio ln -s /etc/nginx/sites-available/console-minio /etc/nginx/sites-enabled/console-minio
签发ssl证书:
certbot --nginx
现在可以打开控制台(console.minio.example.com)使用MINIO_ROOT_USER、MINIO_ROOT_PASSWORD来登录你的账号。
创建一个桶,假设这里我把桶名设置为imlala:
此时如果你需要用到dns bucket(virtual hosted-style)就再添加一个子域名解析到minio服务器。
例如:imlala.minio.example.com,解析名必须和桶名一致。
然后配置一个新的nginx反代:
nano /etc/nginx/sites-available/imlala-bucket
写入如下配置:
server { listen 80; server_name imlala.minio.example.com; ignore_invalid_headers off; client_max_body_size 0; proxy_buffering off; location / { 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 Host $http_host; proxy_connect_timeout 300; proxy_http_version 1.1; proxy_set_header Connection ""; chunked_transfer_encoding off; proxy_pass http://localhost:9000; } }
启用新的配置:
ln -s /etc/nginx/sites-available/imlala-bucket /etc/nginx/sites-enabled/imlala-bucket
签发ssl证书:
certbot --nginx
测试你的dns bucket,访问域名imlala.minio.example.com,如果正常的话应该能够看到类似下面的内容:
下面说一下最基本的权限设置,因为minio的权限配置很复杂,这里只说一下我个人日常使用的一些权限设置,如果你是自己一个人用,按照我这样配置就足够了。
还是用刚才创建的桶(imlala)来演示,如果你希望这个桶可以对外提供服务,首先需要把这个桶的匿名访问权限改为只读:
在perfix这里输入一个/则表示该桶下面的所有路径都是只读的:
注意这里一定不能给写权限,给写权限就意味着任何人都可以往这个桶上传文件。
然后现在还有一个问题是,虽然现在是只读的了,但是当用户直接访问你的桶域名(imlala.minio.example.com)会直接暴露出你桶下面的所有目录和文件名,等于是直接给你列目录了,这样也是不太好的。
我们可以通过配置具体的策略来关闭列目录,在你设置好匿名访问权限为只读后,刷新一下页面看到这个地方就会显示为custom:
编辑这个策略,看到里面默认的配置是:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "s3:GetBucketLocation", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::imlala" ] }, { "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::imlala/*" ] } ] }
只需删除”s3:ListBucket”即可关闭列目录,注意语法,删除”s3:ListBucket”也需要同时去掉上面”s3:GetBucketLocation”的逗号。
同时为安全起见,你应该在console创建一个新的普通用户,这个用户给一个读写权限即可:
然后用普通用户登录console,在这个普通用户下面创建Access Keys、Secret Key:
在配置其他程序使用桶的时候始终用普通用户下面的Access Keys、Secret Key即可。