返回首页

Rust 上无数据库的 NORA 制品仓库

NORA — 轻量级 Rust 制品仓库支持 7 种格式,无外部 DB。大小 34 MB,RAM 12 MB,上游代理和 RBAC。适合隔离环境中的 CI/CD。

3 秒创建 Rust NORA 制品仓库
Advertisement 728x90

# 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 的时间超过构建自定义方案了。

Google AdInline article slot

无数据库、无 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。

额外功能:

Google AdInline article slot
  • 结构化 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 |

Google AdInline article slot

| 冷启动 | ~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

Advertisement 728x90

继续阅读