NAS Docker-compose 方式私有化部署 minio,Nginx Proxy Manager 反向代理, 自建 S3 对象存储 (含两个坑的解决方案和思源笔记配置)

本贴最后更新于 275 天前,其中的信息可能已经天翻地覆

请注意文章时效(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。

10r07x401.webp

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  # 总是重启容器


运行容器:

docker-compose up -d

3.第三步,浏览器打开 minio 网址 http://IP:9090,如下,输入之前设置的账号密码进入。

10x1kz001.webp

4.第四步,新建用户

(1)创建用户(Create User)例:siyuan

111393g01.webp

(2)创建组(Create Group)并关联用户。例:vps 关联 siyuan

112vmul02.webp

114tiik01.webp

\保存

(3)服务帐户/创建访问密钥 Create Access Key

117s11a01.webp

118igj501.webp

将会下载一个 credentials.json 证书文件,打开后有密钥稍后配置思源笔记会用的。

5.第五步,创建桶(Create Bucket)。

1256p0101.webp

126q4kn01.webp

6.第六步,恭喜!可以上传文件了!。

1280v7w01.webp

7.第七步,创建地区。 点击左侧 settings--点击 region--在 server location 输入 cn,点 save。(意思地区是 cn)

129xu1j01.webp

网页顶部会提示重启生效,点击 Restart。等待小会,minio 重启完成,刷新网页即可。

12ayjz901.webp

至此 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。

12hokie01.webp

12i6gt801.webp

1189qm601.webp

# 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

思源笔记配置界面

w8gwk601.webp


【两个坑的解决方案】在回帖 2、3、4 楼

2 楼:坑一:Nginx Proxy Manager 无法反向代理

3 楼:坑二:(第 1 部分)共享文件外部域分享,显示为内部域 IP(127.0.0.1:端口)(大坑)

4 楼:坑二:(第 2 部分)反向代理后面的域名解析到 127.0.0.1


请切换到:传统回帖浏览模式

微信截图 20240319232033.png

倒序阅读

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    492 引用 • 926 回帖
  • MinIO
    6 引用 • 23 回帖
  • NAS
    19 引用 • 53 回帖 • 3 关注
  • S3
    7 引用 • 202 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • jsntwdj
    接主帖继续

    详解两个坑的解决方案

    坑一: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 服务端反向代理配置如下:

    z5synm01.webp

    注意:
    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 /lP* minio 是容器的名称转发端口 * 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 是容器内部端口

    如果不加这段代码,会出现如下情况(坑点,原因不明)

    会一直打圈,不能显示列表

    1 回复
    5 操作
    jsntwdj 在 2024-03-20 00:32:11 更新了该回帖
    jsntwdj 在 2024-03-19 23:15:35 更新了该回帖
    jsntwdj 在 2024-03-19 23:13:10 更新了该回帖
    jsntwdj 在 2024-03-19 23:04:46 更新了该回帖 jsntwdj 在 2024-03-19 22:56:58 更新了该回帖
  • jsntwdj

    坑二:(第 1 部分)


    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  # 总是重启容器
    
    
    

    (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 写道 public.crt
    2022/03/09 14:10:58 写道 private.key
    如图:

    解释一下 ip 和域名:

    127.0.0.1 主机环回地址
    192.168.30.2 主机 IP
    172.18.0.22 容器内 IP
    api.example.com 服务域名
    s3.example.com 管理域我
    Minio 主机名

    复制 public.crt private.key 到 主机的./config 映射目录下

    4 操作
    jsntwdj 在 2024-03-21 16:54:23 更新了该回帖
    jsntwdj 在 2024-03-19 23:10:19 更新了该回帖
    jsntwdj 在 2024-03-19 23:07:33 更新了该回帖
    jsntwdj 在 2024-03-19 23:00:21 更新了该回帖
  • jsntwdj
    接坑二(1):

    坑二:(第 2 部分)

    反向代理后面的域名解析到 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  # 总是重启容器
    
    
    
    运行容器:
    docker-compose up -d
    

    完美解决

    ------------完毕------------

    2 操作
    jsntwdj 在 2024-03-21 16:57:31 更新了该回帖
    jsntwdj 在 2024-03-19 23:09:20 更新了该回帖
  • 前群晖用户路过,记得群晖的设置里自带反向代理功能的,可以不用 NPM,就没有那个坑

    2 回复
  • jsntwdj

    是的,群晖自带的反向代理,没有这个问题,但是 ssl 证书,三个月换一次,太麻烦,还是 npm 自动续签,比较方便。

  • jsntwdj 1 赞同

    NAS 上 docker 布署,还是可以参考一下

  • qydxyx

    昨天试了一下,同步确实很快,比阿里云的香港 s3 好多了!反代那一步我用 caddy 代替 nginx proxy manager,直接一条 reverse_proxy http://ip:9080 就搞定了,目前用起来没有什么问题。非常感谢!

    1 回复
  • 您用过 lucky 吗?有没有 lucky 的反代方案?

请输入回帖内容 ...