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.
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:
- Logs JSON estructurados (método, ruta, estado, usuario).
- Limitación de tasa por endpoint.
- Log de auditoría en JSONL.
- GC:
nora gc --dry-runpara 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 |
| 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
Aún no hay comentarios.