Means:基于 .NET 10 打造的开源自部署 S3 兼容对象存储服务

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-stylevirtual-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 支持一下!