MinIO 相关内容解析

MinIO 相关内容解析

对,你理解得基本正确。你说的应该是 MinIO ,它就是一个非常常见的对象存储(Object Storage)服务,可以用来存储文件。

简单来说:

MinIO ≈ 自己部署的"类似 Amazon S3 的文件对象存储服务"

1. MinIO 是干什么的?

比如你的后端系统需要保存:

text 复制代码
用户上传的头像
PDF
Word
Excel
图片
视频
音频
AI生成的文件
知识库文档
聊天附件

你可以直接存到服务器磁盘:

text 复制代码
/data/uploads/
    ├── a.pdf
    ├── b.jpg
    └── c.docx

但是大型项目通常不会让业务代码直接管理这些文件,而是使用对象存储:

text 复制代码
                ┌──────────────┐
                │   FastAPI    │
                │    后端      │
                └──────┬───────┘
                       │
                       │ 上传文件
                       ▼
                ┌──────────────┐
                │    MinIO     │
                │ Object Store │
                └──────┬───────┘
                       │
                       ▼
                ┌──────────────┐
                │    磁盘      │
                │ /data/minio  │
                └──────────────┘

2. MinIO 里面不是简单的"文件夹"

MinIO 使用的是 Bucket + Object 的概念。

例如:

text 复制代码
Bucket: manus-files

Objects:
    users/10001/avatar.jpg
    documents/test.pdf
    documents/report.docx
    images/abc.png

可以理解成:

text 复制代码
MinIO
│
├── manus-files       ← Bucket
│   ├── users/10001/avatar.jpg
│   ├── documents/test.pdf
│   └── images/abc.png
│
└── backup            ← Bucket
    ├── db/xxx.sql
    └── ...

虽然看起来像目录,但 users/10001/avatar.jpg 本质上是 Object Key。


3. 它和 PostgreSQL 是不同的东西

你最近正在配置的:

text 复制代码
PostgreSQL
Redis
FastAPI

如果再加入 MinIO,通常职责是:

服务 主要作用
PostgreSQL 存业务数据
Redis 缓存、队列、临时数据
MinIO 存文件
FastAPI 提供业务 API

例如用户上传一个 PDF:

text 复制代码
                    用户
                     │
                     │ 上传 PDF
                     ▼
                  FastAPI
                 /       \
                /         \
               ▼           ▼
        PostgreSQL       MinIO
        文件信息          PDF文件
        ─────────         ────────
        id                xxx.pdf
        filename          xxx.docx
        size
        minio_key

PostgreSQL 一般不直接存 PDF 二进制内容,而是保存文件的元数据,例如:

text 复制代码
id = 123
filename = "测试报告.pdf"
size = 1024000
object_key = "documents/123/test.pdf"

真正的 PDF 放在 MinIO。


4. MinIO 和阿里云 OSS / AWS S3 是什么关系?

它们属于同一类东西:

text 复制代码
对象存储
│
├── AWS S3
├── MinIO
├── 阿里云 OSS
├── 腾讯云 COS
├── 华为云 OBS
└── 七牛云 Kodo

其中 MinIO 最大的特点之一就是:

可以自己部署,不需要把文件交给云厂商。

例如你自己的服务器:

text 复制代码
192.168.8.221

可以部署:

text 复制代码
FastAPI       : 8000
PostgreSQL    : 5432
Redis         : 6379
MinIO API     : 9000
MinIO Console : 9001

然后:

text 复制代码
FastAPI
   │
   │ S3 API
   ▼
MinIO :9000
   │
   ▼
/data/minio/

5. MinIO 有两个常见端口

如果你用 Docker 部署,经常看到:

bash 复制代码
-p 9000:9000
-p 9001:9001

通常:

text 复制代码
9000 → MinIO S3 API
9001 → MinIO Web Console

也就是说:

text 复制代码
浏览器
   │
   ▼
http://服务器IP:9001
   │
   ▼
MinIO 管理界面

而程序一般访问:

text 复制代码
http://服务器IP:9000

6. 为什么 AI 项目特别喜欢 MinIO?

你现在做的 FastAPI + AI + 知识库/MCP/Manus 这类项目,非常容易用到 MinIO。

例如:

text 复制代码
用户上传
    │
    ├── PDF
    ├── Word
    ├── Excel
    ├── 图片
    ├── 音频
    └── 视频
         │
         ▼
       MinIO
         │
         ├── 原始文件
         │
         └── 文件URL/Object Key
                  │
                  ▼
              AI处理
             /       \
            ▼         ▼
         OCR/ASR     文档解析
                       │
                       ▼
                    向量数据库

所以如果你在看 MoocManus / Manus / FastAPI 项目的 Docker Compose,看到:

yaml 复制代码
minio:

一般就是在解决:

这个项目需要一个地方统一存放用户上传和系统生成的文件。


7. 一句话理解

你可以把它记成:

text 复制代码
PostgreSQL = 数据库
Redis      = 缓存
MinIO      = 文件仓库
FastAPI    = 后端服务

或者更准确一点:

MinIO 是一个兼容 S3 API 的高性能对象存储服务,适合自建,用来集中存储图片、文档、音视频、模型文件等非结构化数据。

有,而且 MinIO 非常适合用 Docker 部署 。如果你现在是在搭建类似你前面 PostgreSQL + Redis + FastAPI 的项目,可以直接把 MinIO 加进去。

1. 最简单的 Docker 部署

推荐先用这个方式测试:

bash 复制代码
docker run -d \
  --name minio \
  -p 9000:9000 \
  -p 9001:9001 \
  -e MINIO_ROOT_USER=minioadmin \
  -e MINIO_ROOT_PASSWORD=minioadmin123 \
  -v /data/minio:/data \
  minio/minio:latest \
  server /data --console-address ":9001"

这里:

text 复制代码
9000 → MinIO API
9001 → MinIO Web 管理界面
/data/minio → 宿主机实际存储文件的位置

启动后:

text 复制代码
MinIO API:
http://服务器IP:9000

MinIO Console:
http://服务器IP:9001

浏览器打开:

text 复制代码
http://服务器IP:9001

然后使用:

text 复制代码
用户名:minioadmin
密码:minioadmin123

2. 查看 MinIO 是否启动成功

bash 复制代码
docker ps | grep minio

查看日志:

bash 复制代码
docker logs -f minio

如果看到类似:

text 复制代码
API: http://0.0.0.0:9000
Console: http://0.0.0.0:9001

基本就启动成功了。


3. Docker Compose 部署

如果你的项目本身就是 Docker Compose,我更推荐这种。

yaml 复制代码
services:

  minio:
    image: minio/minio:latest
    container_name: manus-minio
    restart: unless-stopped

    ports:
      - "9000:9000"
      - "9001:9001"

    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin123

    volumes:
      - /data/minio:/data

    command: server /data --console-address ":9001"

然后:

bash 复制代码
docker compose up -d minio

查看:

bash 复制代码
docker compose ps

日志:

bash 复制代码
docker compose logs -f minio

停止:

bash 复制代码
docker compose stop minio

删除容器:

bash 复制代码
docker compose down

4. MinIO 最核心的概念

你需要记住三个东西:

text 复制代码
MinIO
  │
  └── Bucket
        │
        ├── Object
        ├── Object
        └── Object

例如创建一个:

text 复制代码
Bucket: manus-files

里面放:

text 复制代码
manus-files/
├── user/
│   └── 10001/
│       └── avatar.jpg
│
├── documents/
│   ├── test.pdf
│   └── report.docx
│
└── images/
    └── xxx.png

5. 使用 MinIO Web 管理界面

启动之后访问:

text 复制代码
http://服务器IP:9001

你可以在 Web 页面里面:

text 复制代码
Buckets
   ↓
Create Bucket
   ↓
manus-files

然后上传文件。

这是最简单的使用方式。


6. 命令行使用

MinIO 官方命令行工具叫:

text 复制代码
mc

也就是:

text 复制代码
MinIO Client

例如配置一个 MinIO:

bash 复制代码
mc alias set local http://127.0.0.1:9000 minioadmin minioadmin123

查看 Bucket:

bash 复制代码
mc ls local

创建 Bucket:

bash 复制代码
mc mb local/manus-files

查看:

bash 复制代码
mc ls local/manus-files

上传:

bash 复制代码
mc cp test.pdf local/manus-files/

下载:

bash 复制代码
mc cp local/manus-files/test.pdf ./

删除:

bash 复制代码
mc rm local/manus-files/test.pdf

7. Python + MinIO

这个对你目前的 FastAPI 项目尤其重要。

Python 可以使用:

bash 复制代码
pip install minio

然后:

python 复制代码
from minio import Minio

client = Minio(
    "127.0.0.1:9000",
    access_key="minioadmin",
    secret_key="minioadmin123",
    secure=False,
)

创建 Bucket:

python 复制代码
bucket_name = "manus-files"

if not client.bucket_exists(bucket_name):
    client.make_bucket(bucket_name)

上传文件:

python 复制代码
client.fput_object(
    bucket_name,
    "documents/test.pdf",
    "/tmp/test.pdf",
)

下载:

python 复制代码
client.fget_object(
    bucket_name,
    "documents/test.pdf",
    "/tmp/download.pdf",
)

8. FastAPI 中通常怎么用?

例如:

python 复制代码
from fastapi import FastAPI, UploadFile, File
from minio import Minio
import uuid

app = FastAPI()

minio_client = Minio(
    "minio:9000",  # Docker Compose 中使用服务名
    access_key="minioadmin",
    secret_key="minioadmin123",
    secure=False,
)

BUCKET = "manus-files"


@app.post("/upload")
async def upload(file: UploadFile = File(...)):

    object_name = f"uploads/{uuid.uuid4()}_{file.filename}"

    minio_client.put_object(
        BUCKET,
        object_name,
        file.file,
        length=-1,
        part_size=10 * 1024 * 1024,
    )

    return {
        "filename": file.filename,
        "object_name": object_name,
    }

这里有一个非常重要的区别。

如果:

text 复制代码
FastAPI 在宿主机运行

可能使用:

python 复制代码
127.0.0.1:9000

如果:

text 复制代码
FastAPI 和 MinIO 都在 Docker Compose

则应该使用:

python 复制代码
minio:9000

而不是:

python 复制代码
127.0.0.1:9000

因为 Docker Compose 内部通过:

text 复制代码
service name

进行容器间通信。


9. PostgreSQL + Redis + MinIO + FastAPI

你现在这个项目其实可以形成一个非常典型的架构:

text 复制代码
                    ┌──────────────┐
                    │    用户      │
                    └──────┬───────┘
                           │
                           ▼
                    ┌──────────────┐
                    │   FastAPI    │
                    │    :8000     │
                    └─────┬────────┘
                          │
             ┌────────────┼────────────┐
             │            │            │
             ▼            ▼            ▼
       ┌──────────┐ ┌──────────┐ ┌──────────┐
       │PostgreSQL│ │  Redis   │ │  MinIO   │
       │  :5432   │ │  :6379   │ │  :9000   │
       └──────────┘ └──────────┘ └──────────┘
                                      │
                                      ▼
                              文件 / 图片 / PDF

职责非常清晰:

text 复制代码
PostgreSQL
    ↓
用户、订单、任务、文件元数据等结构化数据

Redis
    ↓
缓存、队列、Session、临时数据

MinIO
    ↓
PDF、Word、Excel、图片、音频、视频等文件

FastAPI
    ↓
业务逻辑和 API

10. 一个实际项目的 .env

建议不要把密码直接写死在 docker-compose.yml

env 复制代码
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=your_strong_password
MINIO_BUCKET=manus-files

Compose:

yaml 复制代码
services:
  minio:
    image: minio/minio:latest
    container_name: manus-minio
    restart: unless-stopped

    ports:
      - "9000:9000"
      - "9001:9001"

    env_file:
      - .env

    volumes:
      - /data/minio:/data

    command: server /data --console-address ":9001"

然后:

bash 复制代码
docker compose up -d

⚠️ 一个生产环境注意点

如果只是本地开发/测试,上面的配置完全可以。

如果是正式生产环境,建议进一步考虑:

  • 不直接暴露 9000/9001 到公网
  • 使用 HTTPS
  • 设置强密码
  • 配置 Bucket 权限
  • 定期备份
  • 不要让应用使用 root Access Key
  • 根据需要配置反向代理

可以。结合你前面 MoocManus 的配置,我建议直接使用下面这份,包含 PostgreSQL + Redis + MinIO、数据持久化、健康检查,以及统一的网络配置。

完整 docker-compose.yml

yaml 复制代码
services:

  # =========================
  # PostgreSQL
  # =========================
  postgres:
    image: postgres:16
    container_name: manus-postgres
    restart: unless-stopped

    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: manus
      TZ: Asia/Shanghai

    ports:
      - "5432:5432"

    volumes:
      - manus_postgres_data:/var/lib/postgresql/data

    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres -d manus"]
      interval: 10s
      timeout: 5s
      retries: 5

    networks:
      - manus-network


  # =========================
  # Redis
  # =========================
  redis:
    image: redis:7
    container_name: manus-redis
    restart: unless-stopped

    command: redis-server --appendonly yes

    ports:
      - "6379:6379"

    volumes:
      - manus_redis_data:/data

    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

    networks:
      - manus-network


  # =========================
  # MinIO
  # =========================
  minio:
    image: minio/minio:latest
    container_name: manus-minio
    restart: unless-stopped

    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin123
      TZ: Asia/Shanghai

    ports:
      # MinIO S3 API
      - "9000:9000"

      # MinIO Web Console
      - "9001:9001"

    volumes:
      - manus_minio_data:/data

    command: server /data --console-address ":9001"

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 10s
      timeout: 5s
      retries: 5

    networks:
      - manus-network


# =========================
# 数据持久化
# =========================
volumes:

  manus_postgres_data:
    name: manus_postgres_data

  manus_redis_data:
    name: manus_redis_data

  manus_minio_data:
    name: manus_minio_data


# =========================
# Docker 网络
# =========================
networks:

  manus-network:
    name: manus-network
    driver: bridge

1. 保存文件

例如:

bash 复制代码
mkdir -p /data/manus
cd /data/manus

vim docker-compose.yml

把上面的内容保存进去。

然后启动:

bash 复制代码
docker compose up -d

查看:

bash 复制代码
docker compose ps

正常情况下应该看到:

text 复制代码
NAME              STATUS
manus-postgres    Up
manus-redis       Up
manus-minio       Up

2. 三个服务怎么连接

这是非常重要的一点。

因为三个容器都加入了:

yaml 复制代码
networks:
  - manus-network

所以容器之间可以直接使用 服务名通信。

PostgreSQL

在其他 Docker 容器中:

text 复制代码
postgresql+asyncpg://postgres:postgres@postgres:5432/manus

注意这里不是:

text 复制代码
localhost

而是:

text 复制代码
postgres

因为:

yaml 复制代码
postgres:

就是 PostgreSQL 的 Docker 服务名。


Redis

其他 Docker 容器连接:

text 复制代码
redis://redis:6379/0

这里:

text 复制代码
redis

就是 Redis 的服务名。


MinIO

其他 Docker 容器连接:

text 复制代码
http://minio:9000

例如 Python:

python 复制代码
from minio import Minio

client = Minio(
    "minio:9000",
    access_key="minioadmin",
    secret_key="minioadmin123",
    secure=False,
)

3. 如果 FastAPI 在宿主机运行

如果你的 FastAPI 不是 Docker 容器,而是直接:

bash 复制代码
uv run ...

或者:

bash 复制代码
python ...

那么连接地址应该改成:

PostgreSQL

text 复制代码
postgresql+asyncpg://postgres:postgres@127.0.0.1:5432/manus

Redis

text 复制代码
redis://127.0.0.1:6379/0

MinIO

text 复制代码
127.0.0.1:9000

所以可以简单记:

text 复制代码
FastAPI 在 Docker 内
    ↓
postgres:5432
redis:6379
minio:9000


FastAPI 在宿主机
    ↓
127.0.0.1:5432
127.0.0.1:6379
127.0.0.1:9000

4. PostgreSQL 测试

进入容器:

bash 复制代码
docker exec -it manus-postgres psql -U postgres -d manus

进入以后:

sql 复制代码
\l

查看数据库。

sql 复制代码
\dt

查看表。

退出:

sql 复制代码
\q

也可以直接:

bash 复制代码
docker exec manus-postgres pg_isready -U postgres -d manus

正常会看到:

text 复制代码
/var/run/postgresql:5432 - accepting connections

5. Redis 测试

直接:

bash 复制代码
docker exec -it manus-redis redis-cli

然后:

text 复制代码
PING

应该返回:

text 复制代码
PONG

测试写入:

text 复制代码
SET name manus

然后:

text 复制代码
GET name

返回:

text 复制代码
"manus"

退出:

text 复制代码
exit

6. MinIO 测试

浏览器访问:

text 复制代码
http://服务器IP:9001

登录:

text 复制代码
用户名:
minioadmin

密码:
minioadmin123

进入以后可以创建:

text 复制代码
manus-files

这样的 Bucket。

MinIO 的 API 地址是:

text 复制代码
http://服务器IP:9000

例如你的服务器是:

text 复制代码
192.168.8.221

那么:

text 复制代码
MinIO Console:
http://192.168.8.221:9001

MinIO API:
http://192.168.8.221:9000

7. 查看 Docker 数据卷

bash 复制代码
docker volume ls | grep manus

应该看到:

text 复制代码
manus_minio_data
manus_postgres_data
manus_redis_data

查看:

bash 复制代码
docker volume inspect manus_postgres_data

8. 停止和重新启动

停止:

bash 复制代码
docker compose stop

重新启动:

bash 复制代码
docker compose start

或者:

bash 复制代码
docker compose up -d

删除容器,但保留数据

bash 复制代码
docker compose down

然后再次:

bash 复制代码
docker compose up -d

数据依然存在。


⚠️ 不要随便执行这个

bash 复制代码
docker compose down -v

-v 会删除:

text 复制代码
manus_postgres_data
manus_redis_data
manus_minio_data

也就是可能把你的:

text 复制代码
PostgreSQL 数据
Redis 持久化数据
MinIO 文件

全部删掉。


9. 推荐你的 .env

正式一点,可以把密码独立出来:

env 复制代码
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=manus

MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadmin123

然后 Compose 改成:

yaml 复制代码
environment:
  POSTGRES_USER: ${POSTGRES_USER}
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
  POSTGRES_DB: ${POSTGRES_DB}

MinIO:

yaml 复制代码
environment:
  MINIO_ROOT_USER: ${MINIO_ROOT_USER}
  MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}

这样以后改密码不用修改 Compose 文件。


最终结构

你的项目可以整理成:

text 复制代码
/data/manus/
│
├── docker-compose.yml
├── .env
│
└── Docker
    │
    ├── manus-postgres
    │      └── manus_postgres_data
    │
    ├── manus-redis
    │      └── manus_redis_data
    │
    └── manus-minio
           └── manus_minio_data

然后你的 FastAPI 配置可以对应:

text 复制代码
PostgreSQL
postgresql+asyncpg://postgres:postgres@postgres:5432/manus

Redis
redis://redis:6379/0

MinIO
http://minio:9000

这套结构很适合你现在的 MoocManus + FastAPI + SQLAlchemy AsyncSession + Redis + 文件存储架构。

相关推荐
JIngles1232 天前
用 Dart 通过 S3 API 操作 MinIO:文件上传与下载 Demo
中间件·minio·存储
凤山老林10 天前
企业级文件服务中台:Spring Boot 集成 MinIO 实现分片存储、生命周期管理与多租户隔离
java·spring boot·后端·minio·文件服务
java_logo18 天前
Docker 部署 MinIO:轻松搭建 S3 兼容对象存储平台
运维·docker·容器·对象存储·minio·轩辕镜像·minio部署
成为你的宁宁21 天前
【MinIO 分布式集群运维实战:客户端MC、故障恢复、扩容、备份还原与Prometheus监控】
minio
时空无限1 个月前
minio 设置策略
minio
分布式存储与RustFS3 个月前
RustFS S3 Table 开源后,我重新梳理了一下 Iceberg 数据湖的选型思路
人工智能·开源·minio·dpu·rustfs·ai存储·s3 table
sg_knight4 个月前
负载均衡配置:使用 Nginx 反向代理 MinIO 集群的实战教程
运维·nginx·负载均衡·文件管理·minio·cos·oss
遇见火星4 个月前
MinIO使用笔记
笔记·minio
分布式存储与RustFS5 个月前
Helm在Kubernetes上部署RustFS生产环境指南
分布式·零基础·picgo·对象存储·minio·rustfs