Retour à l'accueil

Registre d'artefacts NORA sur Rust sans DB

NORA — registre d'artefacts léger sur Rust prenant en charge 7 formats sans DB externes. Taille 34 MB, RAM 12 MB, proxy en amont et RBAC. Adapté au CI/CD dans des environnements isolés.

Créer un registre d'artefacts NORA sur Rust en 3 secondes
Advertisement 728x90

# NORA : Registre d'artefacts Rust minimaliste sans dépendances externes

Un développeur a créé NORA — un unique binaire Rust pour stocker des artefacts au format Docker v2/OCI, Maven, npm, PyPI, Cargo, Go et brut. Il ne fait que 34 Mo, consomme 12 Mo de RAM au repos et se passe totalement de bases de données ou de services externes. Les métadonnées sont stockées en fichiers JSON sur disque, avec une cohérence garantie par des renommages atomiques. Support natif du backend S3, métriques Prometheus, sondes de santé et docs Swagger.

Pourquoi abandonner Nexus, Artifactory et Harbor

Nexus OSS exige 4 Go de RAM pour son processus Java, et les migrations entre versions (Core/Community/Pro) sont un casse-tête à cause du passage d'OrientDB à PostgreSQL. Artifactory OSS se limite à Maven/Gradle/Ivy ; le support Docker et npm est payant. Harbor se focalise sur les conteneurs, reléguant Maven, npm et PyPI au second plan. Le registre GitLab a ses limites : artefacts OCI, cache buildx et images multi-architectures nécessitent des bidouilles.

Le temps passé à bricoler a dépassé celui nécessaire pour une solution maison.

Google AdInline article slot

Architecture sans base de données ni interface web d'admin

Tout est sur le système de fichiers : artefacts et métadonnées JSON côte à côte. Le catalogue se construit en parcourant les répertoires. Pas de migrations, de clustering ou de services externes — démarrage en 3 secondes.

nora (34 Mo, Rust, 450+ tests)
├── /v2/       — Registre Docker v2 + OCI (images, charts Helm)
├── /maven/    — Maven (JAR, WAR, POM)
├── /npm/      — npm (paquets Node.js)
├── /pypi/     — PyPI (paquets Python)
├── /cargo/    — Cargo (crates Rust, index sparse RFC 2789)
├── /go/       — Go Modules
├── /raw/      — Brut (n'importe quoi)
├── /metrics   — Prometheus
├── /health    — Sonde de vivacité K8s
├── /ready     — Sonde de disponibilité K8s
├── /api-docs  — Swagger
└── /data/     — Stockage (FS ou S3)

Configuration via config.toml ou variables d'environnement. Interface web en lecture seule pour parcourir, chercher et consulter les stats. Les modifications passent par Git avec audit CI/CD.

Formats supportés

  • Docker v2 + OCI : /v2/ — images, charts Helm, conformité totale à la spec.
  • Maven : /maven/ — JAR, WAR, POM avec proxy Central.
  • npm : /npm/ — paquets Node.js, index sparse.
  • PyPI : /pypi/ — paquets Python.
  • Cargo : /cargo/ — crates Rust selon RFC 2789.
  • Go : /go/ — modules avec proxy proxy.golang.org.
  • Brut : /raw/ — fichiers arbitraires.

Authentification et sécurité

  • Fichiers htpasswd pour l'authentification basique.
  • Jetons API avec RBAC (lecture/écriture/admin), révocation de jetons.
  • Accès lecture anonyme, TLS via reverse proxy (nginx/Traefik).

Extras :

Google AdInline article slot
  • Logs JSON structurés (méthode, chemin, statut, utilisateur).
  • Limitation de débit par endpoint.
  • Journal d'audit en JSONL.
  • GC : nora gc --dry-run pour les blobs Docker.
  • Sauvegarde/restauration : nora backup -o file.tar.gz.

Comparaison des performances

| Métrique | NORA | Nexus OSS | Artifactory |

|------------------|----------|-----------|-------------|

| Taille binaire | 34 Mo | 600+ Mo | 1+ Go |

Google AdInline article slot

| Démarrage froid | ~3 s | 30-60 s | 30-60 s |

| RAM | 12 Mo | 2-4 Go | 2-4 Go |

| Services ext. | 0 | H2/PG | PG/Tomcat |

| Formats | 7 | 20+ | 30+ |

Sous charge (2 cœurs, 4 Go RAM) : pull d'une image 268 Mo en 6 s, push en 19 s, pic RAM à 250 Mo.

Déploiement et utilisation

Démarrage rapide :

docker run -d \
  -p 8080:8080 \
  -v nora-data:/data \
  getnora/nora:0.5.0

Push 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

Proxy upstream : mise en cache auto depuis Docker Hub, npmjs, PyPI, Maven Central.

Réseaux isolés et miroirs

Pour les environnements isolés : nora mirror --format docker --packages "nginx:latest" --output bundle sur un nœud externe, transfert du bundle, puis nora restore --input bundle en interne. Vérifications d'intégrité SHA256.

Points clés

  • Unique binaire, sans DB : 34 Mo, 12 Mo RAM, stockage sur filesystem.
  • 7 formats : Docker/OCI, Maven, npm, PyPI, Cargo, Go, brut.
  • Proxy upstream + cache, jetons RBAC, logs d'audit.
  • Roadmap : GC en ligne, multi-nœuds, NuGet/RubyGems, OIDC.

— Editorial Team

Advertisement 728x90

Lire ensuite