Means:基于 .NET 10 打造的开源自部署 S3 兼容对象存储服务
引言对象存储已经成为现代云原生架构的基石。从 AWS S3 到 MinIOS3 兼容 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对象 CRUDPutObject / GetObject / HeadObject / DeleteObject / CopyObjectListObjectsV2支持 prefix / delimiter / continuation-token / max-keysMultipart Upload完整实现initiate → upload part → upload part copy → complete / abort / list parts / list uploadsVersioningBucket 版本控制、object versionId、delete marker、ListObjectVersionsObject Tagging支持 current version 和指定 versionIdLifecycle过期删除、非当前版本清理、未完成 Multipart 自动中止Bucket CORSCRUD 配置 OPTIONS preflightBucket Policy基础 Allow/Deny 策略Bucket Notification预留配置接口SigV4 预签名 URLGET / PUT / multipart UploadPartRange 读取支持 206 Partial Content非法 Range 返回 416协议兼容细节同时支持path-style与virtual-hosted-style地址解析统一返回 S3 风格XML 响应列表、错误、复制结果支持内容协商压缩br/gzipRange 请求下自动禁用压缩PutObject为原子写入语义元数据事务提交后对象对外可见Multipart Upload 严格遵循 S3 规范partNumber 1-10000最小 5 MiBETag 为md5(concat(part-md5-bytes))-part-count管理控制台内置基于React的 Web 管理控制台/api/consoleJSON API wwwroot提供 登录/登出/会话管理Cookie 鉴权 Bucket 管理创建、删除、对象浏览 Bucket Policy 可视化管理 预签名上传/下载链接生成 大文件分片上传默认 5 MiB 起启用 multipart16 MiB part3 并发 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 单节点多盘、SqliteFsSQLite filesystemlegacy/test元数据引擎MeansLogDb自研 WAL Snapshot 索引引擎前端React TypeScript Vite TailwindCSSSDKC# SDK、TypeScript SDKbrowser-safe、Node SDK可观测性Prometheus metrics OpenTelemetry tracingOTLP部署Docker / Docker Compose单节点 多节点实验拓扑客户端兼容AWS CLI、boto3、aws-sdk-js、rclone、mc许可证MIT自研存储后端 XlFsXlFs 是 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 10Node.js 20仅修改前端时需要源码启动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 存储docker compose up -d --build多节点实验拓扑docker compose -f compose.multinode.yaml up -d --build # 访问 http://localhost:5181 / 5182 / 5183S3 客户端接入默认 S3 凭证meansadmin/meansadmin-local-secret。可以直接使用 AWS CLI、rclone、mc 等标准 S3 客户端连接。五、开发路线图Means 正在快速迭代中以下是里程碑计划里程碑状态内容M3✅ 已完成Versioning LifecycleM1 进行中单机生产化 hardeningM2 进行中多副本分布式存储M4 计划中IAM/STS SSE 加密M5 计划中Replication Object LockM6 计划中纠删码EC 自动 repair/rebalanceM7 计划中S3 兼容矩阵全面稳定当前已完成的核心能力分布式存储内核节点注册/心跳/副本写入/修复队列、MeansLogDb 元数据引擎、Versioning、Lifecycle、Bucket CORS、Object Tagging、后台任务框架、多客户端兼容测试等。六、为什么选择 Meansvs. MinIO对比维度MinIO (Go)Means (.NET)技术栈Go 语言.NET 10 / C#开源协议AGPLv3MIT控制台功能丰富React 管理控制台SDK官方 SDK 多语言C# / TypeScript / Node.NET 集成需通过 HTTP/S3 SDK原生 .NET 集成定制门槛需熟悉 Go 生态对 .NET 团队零门槛适用场景✅ .NET 技术栈团队需要自部署对象存储✅ 希望拥有完全可控的存储源码MIT 协议✅ 需要在对象存储上做深度定制自定义认证、存储后端、审计✅ 边缘部署 / 私有云 / 混合云场景✅ 学习和研究 S3 协议实现的开发者结语Means 是 .NET 生态中一个非常有野心的开源项目——用 C# 实现一个完整的 S3 兼容对象存储。它不仅

相关新闻