NORA: Minimalistisches Rust-Artifact-Registry ohne externe Abhängigkeiten
Ein Entwickler hat NORA entwickelt – eine einzelne Rust-Binärdatei zum Speichern von Artifacts in Docker v2/OCI, Maven, npm, PyPI, Cargo, Go und rohen Formaten. Mit nur 34 MB Größe, 12 MB RAM im Leerlauf und komplett ohne Datenbanken oder externe Dienste. Metadaten werden in JSON-Dateien auf der Festplatte gespeichert, Konsistenz durch atomare Umbenennungen gewährleistet. Out-of-the-Box-Unterstützung für S3-Backend, Prometheus-Metriken, Health-Checks und Swagger-Dokumentation.
Warum Nexus, Artifactory und Harbor abschaffen
Nexus OSS benötigt 4 GB RAM für seinen Java-Prozess, und Migrationen zwischen Versionen (Core/Community/Pro) sind ein Albtraum wegen des Wechsels von OrientDB zu PostgreSQL. Artifactory OSS beschränkt sich auf Maven/Gradle/Ivy; Docker- und npm-Unterstützung ist kostenpflichtig. Harbor fokussiert sich auf Container und vernachlässigt Maven, npm und PyPI. GitLab Registry hat Haken: OCI-Artifacts, buildx-Cache und Multi-Arch-Images erfordern Workarounds.
Zeit für Hacks überstieg den Aufwand für eine eigene Lösung.
No-DB, No-Web-Admin-Architektur
Alles liegt im Dateisystem: Artifacts und JSON-Metadaten nebeneinander. Der Katalog wird durch Durchsuchen der Verzeichnisse aufgebaut. Keine Migrationen, kein Clustering oder externe Dienste – startet in 3 Sekunden.
nora (34 MB, Rust, 450+ Tests)
├── /v2/ — Docker Registry v2 + OCI (Images, Helm-Charts)
├── /maven/ — Maven (JAR, WAR, POM)
├── /npm/ — npm (Node.js-Pakete)
├── /pypi/ — PyPI (Python-Pakete)
├── /cargo/ — Cargo (Rust-Crates, Sparse Index RFC 2789)
├── /go/ — Go Modules
├── /raw/ — Raw (beliebig)
├── /metrics — Prometheus
├── /health — K8s Liveness-Probe
├── /ready — K8s Readiness-Probe
├── /api-docs — Swagger
└── /data/ — Speicher (FS oder S3)
Konfiguration über config.toml oder Umgebungsvariablen. Read-only Web-UI zum Durchsuchen, Suchen und Anzeigen von Statistiken. Änderungen laufen über Git mit CI/CD-Audit.
Unterstützte Formate
- Docker v2 + OCI:
/v2/— Images, Helm-Charts, volle Spezifikationskonformität. - Maven:
/maven/— JAR, WAR, POM mit Proxy zu Central. - npm:
/npm/— Node.js-Pakete, Sparse Index. - PyPI:
/pypi/— Python-Pakete. - Cargo:
/cargo/— Rust-Crates gemäß RFC 2789. - Go:
/go/— Modules mit Proxy zu proxy.golang.org. - Raw:
/raw/— Beliebige Dateien.
Authentifizierung und Sicherheit
- htpasswd-Dateien für Basic Auth.
- API-Token mit RBAC (Lesen/Schreiben/Admin), Token-Widerruf.
- Anonymer Lesezugriff, TLS über Reverse Proxy (nginx/Traefik).
Extras:
- Strukturierte JSON-Logs (Methode, Pfad, Status, Benutzer).
- Rate Limiting pro Endpoint.
- Audit-Log in JSONL.
- GC:
nora gc --dry-runfür Docker-Blobs. - Backup/Wiederherstellung:
nora backup -o file.tar.gz.
Leistungsvergleich
| Metrik | NORA | Nexus OSS | Artifactory |
|------------------|----------|-----------|-------------|
| Binärgröße | 34 MB | 600+ MB | 1+ GB |
| Cold Start | ~3 Sek | 30-60 Sek| 30-60 Sek |
| RAM | 12 MB | 2-4 GB | 2-4 GB |
| Externe Dienste | 0 | H2/PG | PG/Tomcat |
| Formate | 7 | 20+ | 30+ |
Unter Last (2 Kerne, 4 GB RAM): Pull eines 268 MB Images in 6 Sek, Push in 19 Sek, RAM-Peak bei 250 MB.
Deployment und Nutzung
Schnellstart:
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
Upstream-Proxy: Automatische Zwischenspeicherung von Docker Hub, npmjs, PyPI, Maven Central.
Air-Gapped-Netzwerke und Mirroring
Für isolierte Umgebungen: nora mirror --format docker --packages "nginx:latest" --output bundle auf einem externen Knoten, Bundle übertragen, dann nora restore --input bundle intern. SHA256-Integritätsprüfungen.
Wichtige Erkenntnisse
- Einzelne Binärdatei, keine DB: 34 MB, 12 MB RAM, Dateisystem-Speicher.
- 7 Formate: Docker/OCI, Maven, npm, PyPI, Cargo, Go, Raw.
- Upstream-Proxy + Cache, RBAC-Token, Audit-Logs.
- Roadmap: Online-GC, Multi-Node, NuGet/RubyGems, OIDC.
— Editorial Team
Noch keine Kommentare.