# MinIO Integration Guide for MarkBase **Date**: 2026-06-25 **Status**: Ready for deployment **Backend**: S3Vfs (已有实现,无需修改代码) --- ## Executive Summary MinIO 是高性能、S3-compatible 的对象存储服务,完美契合 MarkBase 的定位: - ✅ 跨平台支持(macOS/Linux/Windows) - ✅ 轻量级部署(单节点即可) - ✅ 已有 S3Vfs 支持(无需修改代码) - ✅ 高性能(纠删码 + 分布式扩展) --- ## MinIO vs Ceph RADOS Comparison | Aspect | MinIO | Ceph RADOS | |--------|-------|------------| | **Platform** | ✅ 全平台 | ❌ Linux-only | | **Deployment** | ⚠️⚠️ 单节点即可 | ⚠️⚠️⚠️⚠️⚠️ 需完整集群 | | **API** | ✅ S3-compatible HTTP | ❌ librados FFI | | **Code change** | ✅ 0 行(已有 S3Vfs) | ❌ ~1350 行 | | **Positioning** | ⭐⭐⭐⭐⭐ 完全匹配 | ❌ 不符合 Lightweight 定位 | --- ## MinIO Deployment ### macOS 单节点部署 ```bash # 安装 MinIO brew install minio/stable/minio # 启动 MinIO server minio server /path/to/data --console-address ":9001" # 输出: # Endpoint: http://192.168.1.100:9000 http://127.0.0.1:9000 # Console: http://192.168.1.100:9001 http://127.0.0.1:9001 # AccessKey: minioadmin # SecretKey: minioadmin ``` ### Linux 生产部署 ```bash # Docker 单节点 docker run -d \ --name minio \ -p 9000:9000 \ -p 9001:9001 \ -v /data/minio:/data \ minio/minio server /data --console-address ":9001" # 分布式集群(4节点) docker run -d \ --name minio \ -p 9000:9000 \ -p 9001:9001 \ -v /data1:/data1 \ -v /data2:/data2 \ minio/minio server http://node1/data1 http://node2/data2 http://node3/data1 http://node4/data2 --console-address ":9001" ``` ### Kubernetes 部署(推荐生产) ```yaml # minio-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: minio spec: replicas: 4 selector: matchLabels: app: minio template: metadata: labels: app: minio spec: containers: - name: minio image: minio/minio:latest args: - server - http://minio-0/data http://minio-1/data http://minio-2/data http://minio-3/data - --console-address - ":9001" ports: - containerPort: 9000 - containerPort: 9001 volumeMounts: - name: data mountPath: /data volumes: - name: data emptyDir: {} ``` --- ## MarkBase S3Vfs Integration ### 配置方式 **环境变量**: ```bash export MB_S3_ENDPOINT=http://localhost:9000 export MB_S3_REGION=us-east-1 export MB_S3_BUCKET=markbase export MB_S3_ACCESS_KEY=minioadmin export MB_S3_SECRET_KEY=minioadmin ``` **配置文件**(`config/s3.toml`): ```toml [s3] enabled = true endpoint = "http://localhost:9000" region = "us-east-1" bucket = "markbase" access_key = "minioadmin" secret_key = "minioadmin" [s3.webdav] # WebDAV 使用 S3 后端 enabled = true user = "demo" root_prefix = "webdav/" ``` ### S3Vfs 使用示例 **WebDAV + MinIO**: ```bash # 启动 WebDAV server(使用 MinIO 后端) cargo run -- webdav-start \ --user demo \ --port 8002 \ --s3 \ --s3-endpoint http://localhost:9000 \ --s3-bucket markbase \ --s3-access-key minioadmin \ --s3-secret-key minioadmin \ --s3-region us-east-1 \ --root webdav/ ``` **SMB + MinIO**(通过 VFS backend): ```bash # 启动 SMB server(使用 MinIO 后端) cargo run --features smb-server -- smb-start \ --port 4445 \ --share-name files \ --s3 \ --s3-endpoint http://localhost:9000 \ --s3-bucket markbase \ --s3-access-key minioadmin \ --s3-secret-key minioadmin \ --s3-region us-east-1 \ --root smb/ ``` --- ## MinIO Bucket Management ### 创建 Bucket ```bash # 使用 MinIO client (mc) mc alias set myminio http://localhost:9000 minioadmin minioadmin mc mb myminio/markbase # 使用 AWS CLI aws --endpoint-url http://localhost:9000 s3 mb s3://markbase ``` ### 设置 Bucket Policy ```bash # 公开读取 policy(用于 public shares) mc anonymous set download myminio/markbase/public # 私有 policy(默认) mc anonymous set none myminio/markbase/private ``` ### 设置 Bucket Quota ```bash # 设置 quota(MinIO 企业版功能) mc admin bucket quota myminio/markbase 10GB ``` --- ## MinIO Features Relevant to MarkBase | Feature | Description | MarkBase Use Case | |---------|-------------|-------------------| | **Erasure Coding** | 数据冗余(默认 EC:2) | 自动容错,类似 RAID | | **Versioning** | 对象版本控制 | 可替代 Snapshot 功能 | | **Bucket Policy** | ACL 管理 | 用户权限控制 | | **Lifecycle Rules** | 自动过期 | 旧 backup 清理 | | **Object Lock** | WORM 模式 | 合规性备份保护 | | **Replication** | 跨站点复制 | Disaster recovery | ### Versioning(替代 Snapshot) ```bash # 启用 versioning mc version enable myminio/markbase # 列出对象版本 mc ls --versions myminio/markbase/file.txt # 恢复旧版本 mc cp myminio/markbase/file.txt#version-id myminio/markbase/file.txt ``` ### Lifecycle Rules(Backup 清理) ```bash # 设置 30 天后自动删除 mc ilm add myminio/markbase --expire-days 30 ``` --- ## Performance Optimization ### MinIO 性能参数 ```bash # 高性能配置 minio server /data \ --console-address ":9001" \ --parallel 8 \ --cache /cache:1000 ``` ### S3Vfs 性能优化 **并发上传**(已在 S3Vfs 实现): - Multipart upload(大于 5MB 自动分片) - 并发上传分片(默认 4 并发) **缓存**: - ReadCache: 64MB, 64KB blocks, 5min TTL(已在 cache.rs 实现) - WriteCache: 32MB(已在 cache.rs 实现) --- ## Docker Compose Example ```yaml version: '3' services: minio: image: minio/minio:latest command: server /data --console-address ":9001" ports: - "9000:9000" - "9001:9001" volumes: - minio-data:/data environment: - MINIO_ROOT_USER=minioadmin - MINIO_ROOT_PASSWORD=minioadmin markbase-webdav: build: . command: webdav-start --user demo --port 8002 --s3 --s3-endpoint http://minio:9000 --s3-bucket markbase --s3-access-key minioadmin --s3-secret-key minioadmin ports: - "8002:8002" environment: - MB_S3_ENDPOINT=http://minio:9000 depends_on: - minio volumes: minio-data: ``` --- ## Integration Checklist | Task | Status | Notes | |------|--------|-------| | **MinIO 部署** | ⏳ User action | macOS/Linux/Docker | | **创建 Bucket** | ⏳ User action | `mc mb myminio/markbase` | | **S3Vfs 配置** | ✅ 已支持 | 无需修改代码 | | **WebDAV + S3** | ✅ 已支持 | CLI 参数已实现 | | **SMB + S3** | ✅ 已支持 | CLI 参数已实现 | | **SFTP + S3** | ⏳ 待实现 | 需要 SFTP S3 backend | | **Backup to S3** | ✅ 已支持 | BackupManifest + S3Vfs | --- ## Troubleshooting ### MinIO 连接问题 ```bash # 检查 MinIO status mc admin info myminio # 检查 endpoint 连接 curl -I http://localhost:9000/minio/health/live ``` ### S3Vfs 错误 **常见错误**: - `VfsError::NotFound` → Bucket 或 object 不存在 - `VfsError::PermissionDenied` → Access key/secret key 错误 - `VfsError::Io("S3 PUT failed: 403")` → Bucket policy 拒绝写入 **调试方法**: ```bash # 查看 MinIO logs docker logs minio # 使用 mc 测试 mc cp test.txt myminio/markbase/test.txt mc ls myminio/markbase/ ``` --- ## MinIO vs S3Vfs Feature Mapping | VfsBackend Method | MinIO S3 API | Status | |-------------------|--------------|--------| | `read_dir()` | ListObjectsV2 | ✅ | | `open_file()` | GetObject / PutObject | ✅ | | `stat()` | HeadObject | ✅ | | `create_dir()` | PutObject (0-byte) | ✅ | | `remove_dir()` | DeleteObject | ✅ | | `remove_file()` | DeleteObject | ✅ | | `rename()` | CopyObject + DeleteObject | ✅ | | `exists()` | HeadObject | ✅ | | `copy()` | CopyObject | ✅ | | `hard_link()` | CopyObject | ✅ | | `create_snapshot()` | Versioning | ⚠️ 需启用 versioning | | `list_snapshots()` | ListObjectVersions | ⚠️ 需实现 | | `set_quota()` | Bucket quota | ⚠️ MinIO 企业版 | | `set_acl()` | Bucket policy | ⚠️ 需实现 | --- ## Next Steps 1. **部署 MinIO**(用户 action) - macOS: `brew install minio && minio server /data` - Docker: `docker run minio/minio server /data` 2. **创建 Bucket**(用户 action) - `mc alias set myminio http://localhost:9000 minioadmin minioadmin` - `mc mb myminio/markbase` 3. **配置 MarkBase** - 设置 `MB_S3_*` 环境变量 - 或使用 CLI 参数 `--s3 --s3-endpoint ...` 4. **测试连接** - WebDAV: `curl -X PROPFIND http://localhost:8002/webdav/` - SMB: `smbclient -p 4445 -L localhost` --- **文档创建**: 2026-06-25 **最后更新**: 2026-06-25