# NORA:零依赖的极简 Rust 构件仓库
一位开发者打造了 NORA——一个单一的 Rust 可执行文件,用于存储 Docker v2/OCI、Maven、npm、PyPI、Cargo、Go 和原始格式的构件。它体积仅 34 MB,空闲时仅用 12 MB 内存,完全摒弃数据库和外部服务。元数据以 JSON 文件形式存储在磁盘上,通过原子重命名确保一致性。开箱即用支持 S3 后端、Prometheus 监控、健康检查和 Swagger 文档。
为什么抛弃 Nexus、Artifactory 和 Harbor
Nexus OSS 的 Java 进程需要 4 GB 内存,版本迁移(Core/Community/Pro)是个噩梦,因为从 OrientDB 切换到 PostgreSQL。Artifactory OSS 只支持 Maven/Gradle/Ivy;Docker 和 npm 支持需付费。Harbor 专注容器,忽略 Maven、npm 和 PyPI。GitLab Registry 有诸多限制:OCI 构件、buildx 缓存和多架构镜像都需要变通方案。
搞这些 hack 的时间超过构建自定义方案了。
无数据库、无 Web 管理面板架构
一切都放在文件系统:构件和 JSON 元数据并存。目录遍历即可构建索引。没有迁移、集群或外部服务——3 秒启动。
nora (34 MB, Rust, 450+ 测试)
├── /v2/ — Docker Registry v2 + OCI (镜像、Helm 图表)
├── /maven/ — Maven (JAR、WAR、POM)
├── /npm/ — npm (Node.js 包)
├── /pypi/ — PyPI (Python 包)
├── /cargo/ — Cargo (Rust crate,支持稀疏索引 RFC 2789)
├── /go/ — Go 模块
├── /raw/ — 原始文件 (任意内容)
├── /metrics — Prometheus
├── /health — K8s 存活探针
├── /ready — K8s 就绪探针
├── /api-docs — Swagger
└── /data/ — 存储 (文件系统或 S3)
通过 config.toml 或环境变量配置。只读 Web UI 用于浏览、搜索和统计。变更通过 Git + CI/CD 审计。
支持的格式
- Docker v2 + OCI:
/v2/— 镜像、Helm 图表,完全符合规范。 - Maven:
/maven/— JAR、WAR、POM,支持 Central 代理。 - npm:
/npm/— Node.js 包,支持稀疏索引。 - PyPI:
/pypi/— Python 包。 - Cargo:
/cargo/— Rust crate,按 RFC 2789。 - Go:
/go/— 模块,支持 proxy.golang.org 代理。 - Raw:
/raw/— 任意文件。
认证与安全
- htpasswd 文件用于基本认证。
- API 令牌支持 RBAC (读/写/管理),支持令牌吊销。
- 匿名读访问,通过反向代理 (nginx/Traefik) 启用 TLS。
额外功能:
- 结构化 JSON 日志 (方法、路径、状态、用户)。
- 按端点限流。
- JSONL 审计日志。
- GC:
nora gc --dry-run用于 Docker blob。 - 备份/恢复:
nora backup -o file.tar.gz。
性能对比
| 指标 | NORA | Nexus OSS | Artifactory |
|------------------|----------|-----------|-------------|
| 二进制大小 | 34 MB | 600+ MB | 1+ GB |
| 冷启动 | ~3 秒 | 30-60 秒 | 30-60 秒 |
| 内存 | 12 MB | 2-4 GB | 2-4 GB |
| 外部服务 | 0 | H2/PG | PG/Tomcat |
| 支持格式 | 7 | 20+ | 30+ |
负载测试 (2 核, 4 GB 内存):拉取 268 MB 镜像 6 秒,推送 19 秒,内存峰值 250 MB。
部署与使用
快速启动:
docker run -d \
-p 8080:8080 \
-v nora-data:/data \
getnora/nora:0.5.0
Docker 推送:
docker login localhost:8080 -u admin
docker tag myapp:latest localhost:8080/myapp:latest
docker push localhost:8080/myapp:latest
npm:
npm config set registry http://localhost:8080/npm/
npm publish
上游代理:自动缓存 Docker Hub、npmjs、PyPI、Maven Central。
离线网络与镜像
针对隔离环境:在外部节点运行 nora mirror --format docker --packages "nginx:latest" --output bundle,传输 bundle,然后内部运行 nora restore --input bundle。SHA256 完整性校验。
核心要点
- 单一二进制、无数据库:34 MB,12 MB 内存,文件系统存储。
- 7 种格式:Docker/OCI、Maven、npm、PyPI、Cargo、Go、原始。
- 上游代理 + 缓存、RBAC 令牌、审计日志。
- 路线图:在线 GC、多节点、NuGet/RubyGems、OIDC。
— Editorial Team
暂无评论。