Means:基于 .NET 10 打造的开源自部署 S3 兼容对象存储服务
🔗 GitHub 地址:https://github.com/AIDotNet/Means
欢迎 Star ⭐、Fork、提 Issue 和 PR!MIT 开源协议,放心使用。


引言
对象存储已经成为现代云原生架构的基石。从 AWS S3 到 MinIO,S3 兼容 API 几乎成了对象存储的"通用语言"。然而在 .NET 生态中,一直缺少一个纯 .NET 原生实现的高质量 S3 兼容存储方案。
Means 应运而生------它是一个基于 .NET 10 / ASP.NET Core 构建的、可自部署的 S3 兼容对象存储服务。你可以把它理解为一个 .NET 版的 MinIO:完全兼容 S3 API,支持单节点多盘部署,提供 Web 管理控制台,同时提供 C# 和 TypeScript SDK。
一、为什么需要一个 .NET 原生的对象存储?
- 统一技术栈:如果你的团队以 .NET 为主,Means 可以无缝融入现有运维体系,无需额外学习 Go/Java 生态的运维工具
- 深度定制:源码完全开放(MIT),你可以根据自己的业务需求修改存储后端、接入自定义认证、扩展协议
- .NET 10 性能红利:享受 .NET 10 的原生 AOT、低内存占用和高吞吐能力
- 自部署、数据主权:数据完全在你自己的基础设施上,满足合规和隐私需求
二、Means 的核心能力
S3 数据面(v1 基线)
Means 已实现了生产级的 S3 协议兼容,覆盖绝大多数常用场景:
| 能力 | 说明 |
|---|---|
| Bucket 管理 | ListBuckets / CreateBucket / HeadBucket / DeleteBucket |
| 对象 CRUD | PutObject / GetObject / HeadObject / DeleteObject / CopyObject |
| ListObjectsV2 | 支持 prefix / delimiter / continuation-token / max-keys |
| Multipart Upload | 完整实现:initiate → upload part → upload part copy → complete / abort / list parts / list uploads |
| Versioning | Bucket 版本控制、object versionId、delete marker、ListObjectVersions |
| Object Tagging | 支持 current version 和指定 versionId |
| Lifecycle | 过期删除、非当前版本清理、未完成 Multipart 自动中止 |
| Bucket CORS | CRUD 配置 + OPTIONS preflight |
| Bucket Policy | 基础 Allow/Deny 策略 |
| Bucket Notification | 预留配置接口 |
| SigV4 预签名 URL | GET / PUT / multipart UploadPart |
| Range 读取 | 支持 206 Partial Content,非法 Range 返回 416 |
协议兼容细节
- 同时支持 path-style 与 virtual-hosted-style 地址解析
- 统一返回 S3 风格 XML 响应(列表、错误、复制结果)
- 支持内容协商压缩(
br/gzip),Range 请求下自动禁用压缩 PutObject为原子写入语义,元数据事务提交后对象对外可见- Multipart Upload 严格遵循 S3 规范:partNumber 1-10000,最小 5 MiB,ETag 为
md5(concat(part-md5-bytes))-part-count
管理控制台
内置基于 React 的 Web 管理控制台(/api/console JSON API + wwwroot),提供:
- 🔐 登录/登出/会话管理(Cookie 鉴权)
- 🪣 Bucket 管理(创建、删除、对象浏览)
- 📋 Bucket Policy 可视化管理
- 🔗 预签名上传/下载链接生成
- 📤 大文件分片上传(默认 5 MiB 起启用 multipart,16 MiB part,3 并发)
- 🔑 AccessKey 管理(创建、删除、列表)
- ⚙️ 系统设置(最大上传大小)
- 📊 审计日志与小时级请求统计看板
- 🖥️ 集群状态页、节点/磁盘健康页与诊断导出
- 📈 Prometheus 文本指标导出(
/metrics) - 🔭 可选 OpenTelemetry 链路追踪(OTLP)
- ⏱️ 后台任务统一管理与手动触发
三、技术架构
整体分层
┌──────────────────────────────────────────┐
│ React 管理控制台 (Vite) │
├──────────────────────────────────────────┤
│ Console API (/api/console) │
├──────────────────────────────────────────┤
│ S3 数据面 API (REST / SigV4) │
├──────────────────────────────────────────┤
│ Means.Protocol.S3 (协议层) │
│ · 地址解析 (path / virtual-hosted) │
│ · SigV4 签名校验 │
│ · S3 XML 序列化/反序列化 │
├──────────────────────────────────────────┤
│ Means.Core (业务核心) │
├──────────────────────────────────────────┤
│ 存储后端 (可插拔) │
│ · XlFs (默认,MinIO-inspired) │
│ · SqliteFs (SQLite + filesystem) │
├──────────────────────────────────────────┤
│ MeansLogDb (元数据引擎) │
│ · Append-only WAL │
│ · Batch atomic commit │
│ · Snapshot / Restore / Recovery │
└──────────────────────────────────────────┘
关键技术选型
| 层级 | 技术选型 |
|---|---|
| 运行时 | .NET 10 / ASP.NET Core |
| 存储后端 | XlFs(自研,MinIO-inspired 单节点多盘)、SqliteFs(SQLite + filesystem,legacy/test) |
| 元数据引擎 | MeansLogDb(自研 WAL + Snapshot 索引引擎) |
| 前端 | React + TypeScript + Vite + TailwindCSS |
| SDK | C# SDK、TypeScript SDK(browser-safe)、Node SDK |
| 可观测性 | Prometheus metrics + OpenTelemetry tracing(OTLP) |
| 部署 | Docker / Docker Compose(单节点 + 多节点实验拓扑) |
| 客户端兼容 | AWS CLI、boto3、aws-sdk-js、rclone、mc |
| 许可证 | MIT |
自研存储后端 XlFs
XlFs 是 Means 默认的存储引擎,设计灵感来自 MinIO 的 Xl 存储格式,核心特性:
- 单节点多盘:充分利用多块磁盘的 IO 能力
- 对象 Manifest:每个对象维护完整的元数据清单
- Quorum 机制:读写时基于多数派保证数据一致性
- MeansLogDb:自研的 append-only WAL 元数据索引引擎,支持 batch atomic commit、snapshot/restore、crash recovery
- 后台任务:heartbeat、disk health、metadata consistency check、storage GC、repair、rebalance、lifecycle、replication worker
四、快速开始
环境要求
- .NET SDK 10
- Node.js 20+(仅修改前端时需要)
源码启动
bash
git clone https://github.com/AIDotNet/Means.git
cd Means
dotnet restore Means.slnx
dotnet build Means.slnx
dotnet run --project src/Means/Means.csproj --launch-profile http
访问 http://localhost:5178,默认控制台账号:meansadmin / meansadmin-local。
Docker Compose 启动
单节点(XlFs 存储):
bash
docker compose up -d --build
多节点实验拓扑:
bash
docker compose -f compose.multinode.yaml up -d --build
# 访问 http://localhost:5181 / 5182 / 5183
S3 客户端接入
默认 S3 凭证:meansadmin / meansadmin-local-secret。可以直接使用 AWS CLI、rclone、mc 等标准 S3 客户端连接。
五、开发路线图
Means 正在快速迭代中,以下是里程碑计划:
| 里程碑 | 状态 | 内容 |
|---|---|---|
| M3 | ✅ 已完成 | Versioning + Lifecycle |
| M1 | 🚧 进行中 | 单机生产化 hardening |
| M2 | 🚧 进行中 | 多副本分布式存储 |
| M4 | 📋 计划中 | IAM/STS + SSE 加密 |
| M5 | 📋 计划中 | Replication + Object Lock |
| M6 | 📋 计划中 | 纠删码(EC)+ 自动 repair/rebalance |
| M7 | 📋 计划中 | S3 兼容矩阵全面稳定 |
当前已完成的核心能力:分布式存储内核(节点注册/心跳/副本写入/修复队列)、MeansLogDb 元数据引擎、Versioning、Lifecycle、Bucket CORS、Object Tagging、后台任务框架、多客户端兼容测试等。
六、为什么选择 Means?
vs. MinIO
| 对比维度 | MinIO (Go) | Means (.NET) |
|---|---|---|
| 技术栈 | Go 语言 | .NET 10 / C# |
| 开源协议 | AGPLv3 | MIT |
| 控制台 | 功能丰富 | React 管理控制台 |
| SDK | 官方 SDK 多语言 | C# / TypeScript / Node |
| .NET 集成 | 需通过 HTTP/S3 SDK | 原生 .NET 集成 |
| 定制门槛 | 需熟悉 Go 生态 | 对 .NET 团队零门槛 |
适用场景
- ✅ .NET 技术栈团队需要自部署对象存储
- ✅ 希望拥有完全可控的存储源码(MIT 协议)
- ✅ 需要在对象存储上做深度定制(自定义认证、存储后端、审计)
- ✅ 边缘部署 / 私有云 / 混合云场景
- ✅ 学习和研究 S3 协议实现的开发者
结语
Means 是 .NET 生态中一个非常有野心的开源项目------用 C# 实现一个完整的 S3 兼容对象存储。它不仅填补了 .NET 生态在这一领域的空白,更以 MIT 协议 开放全部源码,让 .NET 开发者第一次可以真正"拥有"自己的对象存储。
当前 Means 已经具备了单节点生产级存储能力,分布式多节点正在快速迭代中。如果你是用 .NET 做基础设施的团队,或者对 S3 协议实现感兴趣,不妨去看看源码,点个 Star ⭐ 支持一下这个项目。
用 .NET 10 重新定义对象存储------Means,让 S3 触手可及。
🔗 GitHub:https://github.com/AIDotNet/Means
如果觉得 Means 对你有帮助,请给项目点个 ⭐ Star 支持一下!