Volver al inicio

Registro de artefactos NORA en Rust sin DB

NORA — registro de artefactos ligero en Rust soporta 7 formatos sin DBs externas. Tamaño 34 MB, RAM 12 MB, proxy upstream y RBAC. Adecuado para CI/CD en entornos aislados.

Crea registro de artefactos NORA en Rust en 3 segundos
Advertisement 728x90

NORA: Registro minimalista de artefactos en Rust sin dependencias externas

Un desarrollador creó NORA: un único ejecutable en Rust para almacenar artefactos en formatos Docker v2/OCI, Maven, npm, PyPI, Cargo, Go y raw. Pesa solo 34 MB, usa 12 MB de RAM en reposo y prescinde por completo de bases de datos o servicios externos. Los metadatos se guardan en archivos JSON en disco, con consistencia garantizada mediante renombrados atómicos. Soporte nativo para backend S3, métricas de Prometheus, chequeos de salud y documentación Swagger.

Por qué abandonar Nexus, Artifactory y Harbor

Nexus OSS requiere 4 GB de RAM para su proceso Java, y las migraciones entre versiones (Core/Community/Pro) son un dolor de cabeza por el cambio de OrientDB a PostgreSQL. Artifactory OSS se limita a Maven/Gradle/Ivy; el soporte para Docker y npm es de pago. Harbor se centra en contenedores, dejando de lado Maven, npm y PyPI. El Registro de GitLab tiene limitaciones: artefactos OCI, caché de buildx e imágenes multi-arquitectura necesitan parches.

El tiempo invertido en soluciones caseras superó al de construir una personalizada.

Google AdInline article slot

Arquitectura sin base de datos ni panel web

Todo en el sistema de archivos: artefactos y metadatos JSON uno al lado del otro. El catálogo se genera recorriendo directorios. Sin migraciones, clústeres ni servicios externos: arranca en 3 segundos.

nora (34 MB, Rust, +450 pruebas)
├── /v2/       — Registro Docker v2 + OCI (imágenes, charts de Helm)
├── /maven/    — Maven (JAR, WAR, POM)
├── /npm/      — npm (paquetes Node.js)
├── /pypi/     — PyPI (paquetes Python)
├── /cargo/    — Cargo (crates de Rust, índice sparse RFC 2789)
├── /go/       — Go Modules
├── /raw/      — Raw (cualquier cosa)
├── /metrics   — Prometheus
├── /health    — Probe de vitalidad para K8s
├── /ready     — Probe de preparación para K8s
├── /api-docs  — Swagger
└── /data/     — Almacenamiento (FS o S3)

Configuración vía config.toml o variables de entorno. Interfaz web de solo lectura para navegar, buscar y ver estadísticas. Los cambios se gestionan con git y auditoría CI/CD.

Formatos soportados

  • Docker v2 + OCI: /v2/ — imágenes, charts de Helm, cumplimiento total de especificaciones.
  • Maven: /maven/ — JAR, WAR, POM con proxy a Central.
  • npm: /npm/ — paquetes Node.js, índice sparse.
  • PyPI: /pypi/ — paquetes Python.
  • Cargo: /cargo/ — crates de Rust según RFC 2789.
  • Go: /go/ — módulos con proxy a proxy.golang.org.
  • Raw: /raw/ — archivos arbitrarios.

Autenticación y seguridad

  • Archivos htpasswd para autenticación básica.
  • Tokens de API con RBAC (lectura/escritura/admin), revocación de tokens.
  • Acceso de lectura anónimo, TLS vía proxy inverso (nginx/Traefik).

Extras:

Google AdInline article slot
  • Logs JSON estructurados (método, ruta, estado, usuario).
  • Limitación de tasa por endpoint.
  • Log de auditoría en JSONL.
  • GC: nora gc --dry-run para blobs de Docker.
  • Backup/restore: nora backup -o file.tar.gz.

Comparativa de rendimiento

| Métrica | NORA | Nexus OSS | Artifactory |

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

| Tamaño binario | 34 MB | 600+ MB | 1+ GB |

Google AdInline article slot

| Arranque en frío | ~3 seg | 30-60 seg| 30-60 seg |

| RAM | 12 MB | 2-4 GB | 2-4 GB |

| Servicios externos | 0 | H2/PG | PG/Tomcat |

| Formatos | 7 | 20+ | 30+ |

Bajo carga (2 núcleos, 4 GB RAM): pull de imagen 268 MB en 6 seg, push en 19 seg, pico de RAM en 250 MB.

Despliegue y uso

Arranque rápido:

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

Push de 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: caché automática desde Docker Hub, npmjs, PyPI, Maven Central.

Redes aisladas y espejado

Para entornos aislados: nora mirror --format docker --packages "nginx:latest" --output bundle en un nodo externo, transferir bundle, luego nora restore --input bundle dentro. Verificaciones de integridad SHA256.

Lecciones clave

  • Un solo binario, sin BD: 34 MB, 12 MB RAM, almacenamiento en filesystem.
  • 7 formatos: Docker/OCI, Maven, npm, PyPI, Cargo, Go, raw.
  • Proxy upstream + caché, tokens RBAC, logs de auditoría.
  • Hoja de ruta: GC online, multi-nodo, NuGet/RubyGems, OIDC.

— Editorial Team

Advertisement 728x90

Leer después