FerroRepo
Rust-native 通用制品仓库
一个 Rust-native 通用制品仓库,以单个自包含二进制文件运行,并支持 Sonatype Nexus Repository 3 和 JFrog Artifactory 的 wire protocol,因此现有 Maven、npm、pip、cargo、docker 和 helm 客户端无需修改即可使用。无需 JVM,也无需运维外部数据库(嵌入式 SQLite + 本地卷或对象存储),启动时间远低于一秒。
经典 Nexus 或 Artifactory 部署在提供单个制品前,就需要 JVM、数 GB heap 和外部数据库;FerroRepo 的单二进制模式用一个加固二进制文件替代这些组件,并以自包含 AMI 交付。v0.1.0 完整接入 18 种包协议中的 12 种,并带有 in-tree 一致性测试 — Maven、npm、OCI / Docker Registry v2、PyPI(PEP 503 系列)、Cargo(sparse index)、Go module proxy、Raw/Generic、NuGet v3、RubyGems、Helm(classic + OCI)、APT 和 YUM/DNF — 另外提供 Nexus REST v1 和 Artifactory 兼容的管理接口。存储采用分层(hot/warm/cold)并带内容寻址去重,支持可插拔的 S3 / GCS / Azure / MinIO blob 后端。默认启用认证:允许匿名读取,但所有写入和管理操作都需要已认证主体。
面临挑战
传统的制品仓库如 Sonatype Nexus Repository 3 和 JFrog Artifactory 在服务单个制品之前,就需要 JVM、数 GB 的堆内存以及外部数据库才能运行。它们启动缓慢且带来了切实的运维开销。团队需要一个更轻量、更易于运行的仓库,同时保持现有的 Maven、npm、pip、cargo、docker 和 helm 工具链不变。
工作原理
- 1
启动单个自包含二进制文件
FerroRepo 作为单个进程运行,无需 JVM 和外部数据库,将元数据持久化到嵌入式 SQLite,并将 blob 持久化到本地卷或对象存储。它在小型实例上启动时间远低于 1 秒,并作为一个加固的、自包含的 AMI 交付。
- 2
现有客户端无需修改即可指向它
FerroRepo 支持 Nexus Repository 3 和 Artifactory 的在线(on-the-wire)HTTP 协议,因此 Maven、npm、pip、cargo、docker、helm 和 apt/yum 客户端无需修改配置即可直接指向它。v0.1.0 已完全接入 18 种协议中的 12 种,并附带内置(in-tree)的一致性测试。
- 3
分层存储并对 blob 进行重复数据删除
存储采用分层设计(热/温/冷),并通过内容寻址进行 blob 重复数据删除。利用 object_store,blob 后端可在 S3 / GCS / Azure / MinIO 之间进行插拔替换。默认开启身份验证 —— 允许匿名读取,但所有写入和管理操作都需要具有正确权限范围的已验证主体。
产品亮点
Nexus 3 + Artifactory wire-compatible — 现有构建工具(Maven / npm / pip / cargo / docker / helm)无需修改即可使用。
单一二进制文件,无需 JVM 和外部 DB;亚秒级启动,支持 SQLite + 可插拔 S3 / GCS / Azure / MinIO blob 存储。
18 种协议中已有 12 种接入并带一致性测试;默认启用 auth(匿名读,认证写)。
包含内容
- 基于 Amazon Linux 2023 的自包含 AMI(Graviton / arm64,运行在 t4g、c7g、m7g 和 r7g 类实例上)
- 无需 JVM 和外部数据库的单二进制文件服务器(嵌入式 SQLite 存储元数据,本地卷或对象存储存放 blob,启动时间低于 1 秒)
- 完全接入了 18 种协议中的 12 种(Maven、npm、OCI / Docker Registry v2、PyPI (PEP 503 家族)、Cargo 稀疏索引(sparse index)、Go 模块代理(module proxy)、Raw/Generic、NuGet v3、RubyGems 紧凑索引(Compact Index)、Helm classic + OCI、APT、YUM/DNF),外加兼容 Nexus REST v1 和 Artifactory 的管理界面
- 分层的热/温/冷存储,带内容寻址的 blob 重复数据删除
- 通过 object_store 可插拔替换的 S3 / GCS / Azure / MinIO blob 后端
- 默认开启身份验证(允许匿名读取;所有写入和管理操作均需身份验证;支持内置用户或 OIDC 联合身份验证;在首次启动时为每个实例生成唯一的随机管理员密码)
- 来自 abyo software 的支持([email protected],一个工作日内首次响应;通过 Private Offer 提供的 Enterprise 级别包含 24/7 SLA,且针对 Critical 严重级问题提供 1 小时响应)
适用场景
希望将 Nexus 或 Artifactory 替换为无需 JVM 和外部数据库即可运行的单二进制文件的团队
需要一个能够让现有的 Maven、npm、pip、cargo、docker 和 helm 客户端保持配置不变即可运行的、网络协议兼容(wire-compatible)的制品仓库
适用于 CI/CD 管道的快速启动、低开销单节点包注册表
运行一个适合公共镜像的存储库,允许匿名读取,同时通过身份验证保护写入
常见问题
支持哪些包生态系统?
v0.1.0 已完全接入 18 种协议中的 12 种,并附带 in-tree 一致性测试:Maven、npm、OCI / Docker Registry v2、PyPI(PEP 503 系列)、Cargo(sparse index)、Go module proxy、Raw/Generic、NuGet v3、RubyGems(Compact Index)、Helm(classic + OCI)、APT 和 YUM/DNF。其余 6 种(Conan、Conda、CRAN、Hex、CocoaPods、Bazel)已声明在规划范围内,目前返回 501。老实说,这些未实现的协议目前还无法工作。
真的不需要 JVM,也不需要外部数据库吗?
是的。FerroRepo 作为无 JVM 的单进程运行,将元数据持久化到嵌入式 SQLite 数据库中,并将 blob 持久化到本地卷或对象存储中。无需运行任何外部数据库。传统的 Nexus 或 Artifactory 在提供单个制品之前需要 JVM、数 GB 的堆内存以及外部数据库,而 FerroRepo 用一个经过加固的单二进制文件取而代之,在小型实例上启动时间远低于 1 秒。
存储是如何组织的?
存储采用热/温/冷分层,并通过内容寻址进行 blob 重复数据删除。blob 后端可以通过 object_store 插拔切换 S3 / GCS / Azure / MinIO,而元数据则保存在嵌入式 SQLite 中。
身份验证是如何工作的?
身份验证默认开启,采用默认安全的策略。允许匿名读取,而所有写入和管理操作都需要具有正确范围的已认证主体。支持内置用户或与外部 OIDC 发行商联合,并在首次启动时生成实例唯一的随机管理员密码 — 绝不使用默认或共享密码。
它可以跨多个节点扩展吗?
目前不行。支持的拓扑是单节点(单二进制),使用 SQLite 元数据以及 S3 上的 blob 层。水平扩展的多节点 / Postgres 元数据拓扑已在路线图中,目前尚不支持。老实说,目前不提供多节点配置。
计费模式
按小时收取软件费用 + EC2(t4g / c7g / m7g / r7g 级,Arm)。按实例类型计量。