# MinIO 对象存储配置指南

## 文件结构

```
backend/infrastructure/minio/
├── docker-compose.yml      # MinIO Docker 配置
├── deploy.sh               # 部署管理脚本
├── .env.example            # 环境变量示例
├── README.md               # 使用文档
├── docs/
│   └── setup-guide.md      # 本文档
└── nginx/
    ├── minio.szaiai.com.conf   # Nginx 反向代理配置
    └── install.sh              # Nginx 配置安装脚本
```

## 功能特性

### 1. MinIO 服务

| 端口 | 用途 |
|------|------|
| 9000 | S3 API |
| 9001 | Web Console |

自动初始化默认存储桶：
- `avatars` - 用户头像 (公开读取)
- `documents` - 用户文档 (私有)
- `resources` - 应用资源 (公开读取)
- `backups` - 备份文件 (私有)

### 2. deploy.sh 命令

| 命令 | 说明 |
|------|------|
| `./deploy.sh up` | 启动服务 |
| `./deploy.sh down` | 停止服务 |
| `./deploy.sh restart` | 重启服务 |
| `./deploy.sh status` | 查看状态 |
| `./deploy.sh health` | 健康检查 |
| `./deploy.sh logs` | 查看日志 |
| `./deploy.sh logs -f` | 实时日志 |
| `./deploy.sh create-bucket <name>` | 创建存储桶 |
| `./deploy.sh list-buckets` | 列出存储桶 |
| `./deploy.sh info` | 服务器信息 |
| `./deploy.sh backup` | 备份配置 |

### 3. Nginx 配置

用于与 Kong 部署在同一服务器 (Server A: 192.168.1.100)

| 域名 | 用途 |
|------|------|
| `minio.szaiai.com` | S3 API 端点 |
| `console.minio.szaiai.com` | 管理控制台 |
| `cdn.szaiai.com` | 静态资源 CDN (带缓存) |

## 部署步骤

### 步骤 1: 配置环境变量

```bash
cd backend/infrastructure/minio

# 复制环境变量模板
cp .env.example .env

# 编辑配置文件，修改 MINIO_ROOT_PASSWORD
vim .env
```

**必须修改的配置：**
```env
MINIO_ROOT_PASSWORD=your_secure_password_here
```

### 步骤 2: 创建数据目录

```bash
# 创建数据存储目录
sudo mkdir -p /data/minio

# 设置权限 (MinIO 容器使用 UID 1000)
sudo chown -R 1000:1000 /data/minio
```

### 步骤 3: 启动服务

```bash
./deploy.sh up
```

### 步骤 4: 验证服务

```bash
# 查看运行状态
./deploy.sh status

# 健康检查
./deploy.sh health

# 列出存储桶
./deploy.sh list-buckets
```

### 步骤 5: 安装 Nginx 反向代理 (可选)

> **何时需要 Nginx？**
> - 需要通过域名访问 (如 minio.szaiai.com)
> - 需要 HTTPS 加密
> - 需要 CDN 缓存静态资源
>
> 如果仅内网直接访问 MinIO (通过 IP:9000/9001)，可跳过此步骤。

```bash
cd nginx

# 第一步：安装 Nginx 配置文件
sudo ./install.sh

# 第二步：配置 SSL 证书 (需要先完成第一步)
sudo ./install.sh --ssl
```

## 网络拓扑

```
┌─────────────────────────────────────────────────────────────────────────────┐
│ Server A (192.168.1.100) - Gateway & Storage                                │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  Internet                                                                   │
│      │                                                                      │
│      ▼                                                                      │
│  ┌─────────────┐                                                            │
│  │   Nginx     │ :80/:443                                                   │
│  │  (SSL终止)  │                                                            │
│  └──────┬──────┘                                                            │
│         │                                                                   │
│    ┌────┴────┬──────────────┐                                               │
│    │         │              │                                               │
│    ▼         ▼              ▼                                               │
│ ┌──────┐ ┌──────┐    ┌───────────┐                                          │
│ │ Kong │ │MinIO │    │  MinIO    │                                          │
│ │:8000 │ │:9000 │    │  Console  │                                          │
│ └──────┘ │(API) │    │  :9001    │                                          │
│          └──┬───┘    └───────────┘                                          │
│             │                                                               │
│             ▼                                                               │
│     ┌───────────────┐                                                       │
│     │  /data/minio  │                                                       │
│     │   (Volume)    │                                                       │
│     └───────────────┘                                                       │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
```

## 后端服务集成

在后端服务的 `.env` 中添加以下配置：

```env
# MinIO Configuration
MINIO_ENDPOINT=192.168.1.100
MINIO_PORT=9000
MINIO_USE_SSL=false
MINIO_ACCESS_KEY=admin
MINIO_SECRET_KEY=your_minio_password
MINIO_BUCKET_AVATARS=avatars
MINIO_BUCKET_DOCUMENTS=documents
MINIO_PUBLIC_URL=https://cdn.szaiai.com
```

## 常见问题

### Q: MinIO 无法启动？

```bash
# 检查日志
./deploy.sh logs

# 检查数据目录权限
ls -la /data/minio
sudo chown -R 1000:1000 /data/minio
```

### Q: 无法连接到 MinIO？

```bash
# 检查端口是否监听
netstat -tlnp | grep 9000

# 检查防火墙
sudo ufw status
sudo ufw allow 9000
sudo ufw allow 9001
```

### Q: 上传文件失败？

```bash
# 检查磁盘空间
df -h /data/minio

# 检查存储桶是否存在
./deploy.sh list-buckets
```
