NORA: minimalistický registr artefaktů v Rustu bez externích závislostí
Vývojář vytvořil NORA — jednotný binární soubor v Rustu pro ukládání artefaktů v formátech Docker v2/OCI, Maven, npm, PyPI, Cargo, Go a raw. Velikost 34 MB, spotřeba RAM 12 MB v idle režimu, bez databází nebo externích služeb. Metadata se ukládají v JSON souborech na disku, konzistence přes atomické přejmenování. Podpora S3 backendu, Prometheus metrik, health sond a Swagger dokumentace přímo v krabici.
Proč se vzdali Nexus, Artifactory a Harbor
Nexus OSS vyžaduje 4 GB RAM na Java proces, migrace mezi verzemi (Core/Community/Pro) jsou složité kvůli přechodu z OrientDB na PostgreSQL. Artifactory OSS je omezen na Maven/Gradle/Ivy, ostatní formáty (Docker, npm) — v placené verzi. Harbor se zaměřuje na kontejnery, ignoruje Maven/npm/PyPI. GitLab Registry funguje s omezeními: problémy s OCI artefakty, buildx cache a multiarchitekturou vyžadují obchvatné cesty.
Čas na provizorní řešení překročil úsilí na vytvoření vlastního řešení.
Architektura bez DB a webové administrace
Všechna data v souborovém systému: artefakty a metadata v JSON vedle sebe. Adresář se tvoří procházením složek. Žádné migrace, clustering nebo externí služby — start za 3 sekundy.
nora (34 MB, Rust, 450+ testů)
├── /v2/ — Docker Registry v2 + OCI (obrazy, Helm charts)
├── /maven/ — Maven (JAR, WAR, POM)
├── /npm/ — npm (Node.js balíčky)
├── /pypi/ — PyPI (Python balíčky)
├── /cargo/ — Cargo (Rust kráty, sparse index RFC 2789)
├── /go/ — Go Modules
├── /raw/ — Raw (cokoli)
├── /metrics — Prometheus
├── /health — K8s liveness probe
├── /ready — K8s readiness probe
├── /api-docs — Swagger
└── /data/ — úložiště (FS nebo S3)
Konfigurace přes config.toml nebo proměnné prostředí. Web UI read-only: prohlížení, vyhledávání, statistiky. Změny v git s auditováním přes CI/CD.
Podporované formáty
- Docker v2 + OCI:
/v2/— obrazy, Helm charts, plná compliance se specifikací. - Maven:
/maven/— JAR, WAR, POM s proxy z Central. - npm:
/npm/— Node.js balíčky, sparse index. - PyPI:
/pypi/— Python balíčky. - Cargo:
/cargo/— Rust kráty podle RFC 2789. - Go:
/go/— moduly s proxy z proxy.golang.org. - Raw:
/raw/— libovolné soubory.
Autentizace a bezpečnost
- htpasswd soubory pro základní autorizaci.
- API tokeny s RBAC (read/write/admin), odvolání tokenů.
- Anonymous read, TLS přes reverse proxy (nginx/Traefik).
Dále:
- Strukturované JSON logy (metoda, cesta, status, uživatel).
- Rate limiting podle endpointů.
- Audit log v JSONL.
- GC:
nora gc --dry-runpro Docker bloby. - Záloha/obnova:
nora backup -o file.tar.gz.
Srovnání výkonu
| Metrika | NORA | Nexus OSS | Artifactory |
|------------------|----------|-----------|-------------|
| Obraz | 34 MB | 600+ MB | 1+ GB |
| Studený start | ~3 s | 30-60 s | 30-60 s |
| RAM | 12 MB | 2-4 GB | 2-4 GB |
| Externí služby | 0 | H2/PG | PG/Tomcat |
| Formátů | 7 | 20+ | 30+ |
Pod zátěží (2 jádra, 4 GB RAM): pull 268 MB obrazu za 6 s, push za 19 s, RAM až 250 MB.
Nasazení a použití
Spuštění:
docker run -d \
-p 8080:8080 \
-v nora-data:/data \
getnora/nora:0.5.0
Docker push:
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
Proxy upstream: automatické cache z Docker Hub, npmjs, PyPI, Maven Central.
Uzavřený okruh a zrcadlení
Pro izolované sítě: nora mirror --format docker --packages "nginx:latest" --output bundle na externím uzlu, přenos bundle, nora restore --input bundle uvnitř. Kontrola integrity přes SHA256.
Co je důležité
- Jednotný binární soubor bez DB: 34 MB, 12 MB RAM, FS úložiště.
- 7 formátů: Docker/OCI, Maven, npm, PyPI, Cargo, Go, raw.
- Proxy upstream + cache, RBAC tokeny, audit logy.
- Plán: online GC, multi-node, NuGet/RubyGems, OIDC.
— Editorial Team
Zatím žádné komentáře.