Featured image of post MinIO部署与PicGo

MinIO部署与PicGo

  前些天听人推荐MinIO后尝试了下,发现比那几个用PHP写的图床流畅、好用。虽然不能像图床那样可以直观展示,但它用途更广、性能更强。

MinIO公网单服务器部署

MinIO compose部署

  我的VPS环境是Debian 12,有root权限,采用docker compose的部署方式。其实官网对于各平台、各种部署方式有着详细的文档和视频教程,但英语确实让不少人望而却步。我在这贴下链接:MinIO docker部署,并给出我的compose.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
services:
  minio:
    image: quay.io/minio/minio
    container_name: minio
    ports:
      - 9000:9000 # 可自定义端口映射,如10000:9000
      - 9001:9001 # 可自定义端口映射,如10001:9001
    command: server /data --console-address ":9001"
    environment:
      - MINIO_ROOT_USER=${MINIO_ROOT_USER}
      - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD}
      - MINIO_BROWSER_REDIRECT_URL=${MINIO_BROWSER_REDIRECT_URL}
    volumes:
      - /path/to/your/minio/data:/data # 挂载于本地指定目录
    restart: unless-stopped

compose.yaml文件夹下新建个.env,这些环境变量用于配置MinIO WebUI的管理员账号和登录面板地址:

1
2
3
MINIO_ROOT_USER=abc # 自定义管理员名称
MINIO_ROOT_PASSWORD='abcd12345678' # 使用单引号包裹,防止因密码中有特殊符号产生问题
MINIO_BROWSER_REDIRECT_URL=https://minio.example.com/minio/ui # 面板地址有两种方式,我采用的是方式一,后文细说。

Nginx反代配置

  官网上对于Nginx反代的详细配置:MinIO Nginx反代。对于MinIO API和MinIO Console控制台有两种反代方式:

  1. API与Console使用同一域名,但路径上有区别,即API:https://minio.example.com,Console:https://minio.example.com/minio/ui
  2. API与Console采用两个不同的域名,即API:https://minio.example.com,Console:https://console.example.com

  我使用的是第一种方式,/etc/nginx/conf.d下的minio.conf:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
upstream minio_s3 {
  server 127.0.0.1:9000; # 映射出的端口号,单服务器,未配置负载均衡
}

upstream minio_console {
  server 127.0.0.1:9001; # 映射出的端口号,单服务器,未配置负载均衡
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name minio.example.com;

  # 证书ssl配置
  ssl_certificate /path/to/your/cert.pem; #证书位置
  ssl_certificate_key /path/to/your/key.pem; #私钥位置
  ssl_session_timeout 12h;
  ssl_session_cache shared:MozSSL:10m;
  ssl_session_tickets off;
  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_prefer_server_ciphers off;

  # 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 1000m;
  # Disable buffering
  proxy_buffering off;
  proxy_request_buffering off;

  location / { # 根路径,用于MinIO API
     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_s3; # 负载均衡配置
  }

  location /minio/ui/ { # 子路径,用于MinIO WebUI
     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;

     # 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 http://minio_console; # 负载均衡配置
  }
}

额外贴下我的/etc/nginx/nginx.conf(通用配置):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
user www-data;
worker_processes auto;

pid /run/nginx.pid;

include /etc/nginx/modules-enabled/*.conf;


events {
    worker_connections 1024;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 819200;
    proxy_headers_hash_max_size 819200;
    proxy_headers_hash_bucket_size 256;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    gzip on;


    # 各个域名单独控制
    include /etc/nginx/conf.d/*.conf;

    # HTTP
    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name _;

        # 精确匹配 Let's Encrypt 验证路径
        location /.well-known/acme-challenge/ {
            root /var/www/html;
        }

    # 其他所有请求强制HTTPS
        location / {
            return 301 https://$host$request_uri;
        }
    }

    # HTTPS 处理未配置域名的 HTTPS 请求
    server {
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;
        server_name _;

        # 方案1:拒绝握手(需Nginx 1.19.4+)
        ssl_reject_handshake on;

        # 方案2:返回444
        # ssl_certificate /path/to/your/cert.pem; #证书位置
        # ssl_certificate_key /path/to/your/key.pem; #私钥位置

        # return 444;
    }
}

MinIO Bucket配置

  Bucket翻译成桶,桶里什么都能装,所以我们要创建桶并设置好桶的规则。

Bucket的创建

  1. 创建一个Bucket,名称随意
  2. 下面的三个选项按需开启,默认都不开启。

Bucket的Policy设置

  1. 将该public桶的规则设置为所有人只读。
  2. 这样设置后,该public桶里的所有内容将只允许其他人查看,不允许其他人写入、删除等。

普通账户与Access Key

  强烈不建议使用管理员账户或继承自管理员账户权限的Access Key进行对象管理,改用普通账户。

普通账户的Policy设置

  1. 新建名为picgo-policy的policy
  2. 各项参数的作用,详见MinIO S3 Policy Action,Policy配置如下:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObject",
                "s3:Get*",
                "s3:HeadBucket",
                "s3:ListBucket",
                "s3:Put*"
            ],
            "Resource": [
                "arn:aws:s3:::public",
                "arn:aws:s3:::public/*"
            ]
        }
    ]
}

新建账户与赋权

  1. 新建名为picgo的用户,设置密码,并将该用户的Policy设置为刚才创建的picgo-policy

普通账户的Access Key

  1. Access Key的权限默认继承自当前账户的Policy,因此我们要生成一个来自picgo用户的Access Key,记好key和secret。

PicGo设置MinIO

  1. PicGo添加MinIO插件不再赘述。
  2. 导入picgo的Access Key
  3. 然后就可以通过PicGo上传图片到自建的MinIO图床里了。如果上传到public的子目录,记得添加基础目录,还可以设置自定义域名和基础路径。

补充

  1. MinIO目前不支持在某个Bucket的Policy里直接指定某用户的权限,只允许设置匿名账户,详见此处。官方推荐的做法是通过不同账户或Access Key的Policy来设置不同的权限,也就是我上文使用的做法。
  2. 域名挂靠在Cloudflare上并打开CF的CDN后,PicGo里用API上传会失败,提示认证错误,等有空我排查下是什么原因。
使用 Hugo 构建
主题 StackJimmy 设计
访问量 访客数