홈으로 돌아가기

DB 없이 Rust 기반 NORA 아티팩트 레지스트리

NORA — 경량 Rust 아티팩트 레지스트리, 외부 DB 없이 7개 형식 지원. 크기 34 MB, RAM 12 MB, 업스트림 프록시 및 RBAC. 격리된 환경의 CI/CD에 적합.

3초 만에 Rust 기반 NORA 아티팩트 레지스트리 생성
Advertisement 728x90

# NORA: 외부 종속성 없는 초경량 Rust 아티팩트 레지스트리

개발자가 NORA를 만들었습니다. 단일 Rust 바이너리로 Docker v2/OCI, Maven, npm, PyPI, Cargo, Go, raw 형식의 아티팩트를 저장합니다. 크기는 겨우 34MB, 유휴 시 RAM 12MB만 사용하며 데이터베이스나 외부 서비스를 전혀 사용하지 않습니다. 메타데이터는 디스크의 JSON 파일에 저장되고, 원자적 이름 변경으로 일관성을 보장합니다. S3 백엔드, Prometheus 메트릭, 헬스체크, Swagger 문서가 기본 지원됩니다.

Nexus, Artifactory, Harbor를 버린 이유

Nexus OSS는 Java 프로세스에 4GB RAM을 요구하고, 버전 간 마이그레이션(Core/Community/Pro)이 OrientDB에서 PostgreSQL로 바뀌면서 골치 아픕니다. Artifactory OSS는 Maven/Gradle/Ivy에 국한되며 Docker와 npm 지원은 유료입니다. Harbor는 컨테이너에만 초점 맞춰 Maven, npm, PyPI를 소외시킵니다. GitLab Registry는 OCI 아티팩트, buildx 캐시, 멀티아키텍처 이미지를 위한 우회책이 필요합니다.

해킹에 쏟는 시간이 맞춤 솔루션 개발을 앞질렀습니다.

Google AdInline article slot

DB 없음, 웹 관리 UI 없음 아키텍처

모든 것이 파일시스템에 있습니다: 아티팩트와 JSON 메타데이터가 나란히. 카탈로그는 디렉토리를 순회하며 생성합니다. 마이그레이션, 클러스터링, 외부 서비스 없음—3초 만에 부팅.

nora (34 MB, Rust, 450+ 테스트)
├── /v2/       — Docker Registry v2 + OCI (이미지, Helm 차트)
├── /maven/    — Maven (JAR, WAR, POM)
├── /npm/      — npm (Node.js 패키지)
├── /pypi/     — PyPI (Python 패키지)
├── /cargo/    — Cargo (Rust 크레이트, sparse index RFC 2789)
├── /go/       — Go 모듈
├── /raw/      — Raw (임의 파일)
├── /metrics   — Prometheus
├── /health    — K8s liveness probe
├── /ready     — K8s readiness probe
├── /api-docs  — Swagger
└── /data/     — 스토리지 (FS 또는 S3)

config.toml 또는 환경 변수로 설정. 읽기 전용 웹 UI로 탐색, 검색, 통계 확인. 변경은 git과 CI/CD 감사로 처리.

지원 형식

  • Docker v2 + OCI: /v2/ — 이미지, Helm 차트, 완전한 스펙 준수.
  • Maven: /maven/ — JAR, WAR, POM + Central 프록시.
  • npm: /npm/ — Node.js 패키지, sparse 인덱스.
  • PyPI: /pypi/ — Python 패키지.
  • Cargo: /cargo/ — Rust 크레이트 (RFC 2789 기준).
  • Go: /go/ — 모듈 + proxy.golang.org 프록시.
  • Raw: /raw/ — 임의 파일.

인증 및 보안

  • htpasswd 파일로 기본 인증.
  • RBAC 토큰 (읽기/쓰기/관리), 토큰 취소.
  • 익명 읽기 액세스, 리버스 프록시(nginx/Traefik)로 TLS.

추가 기능:

Google AdInline article slot
  • 구조화된 JSON 로그 (메서드, 경로, 상태, 사용자).
  • 엔드포인트별 속도 제한.
  • JSONL 감사 로그.
  • GC: nora gc --dry-run으로 Docker 블롭 정리.
  • 백업/복원: nora backup -o file.tar.gz.

성능 비교

| 메트릭 | NORA | Nexus OSS | Artifactory |

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

| 바이너리 크기 | 34 MB | 600+ MB | 1+ GB |

Google AdInline article slot

| 콜드 스타트 | ~3초 | 30-60초 | 30-60초 |

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

| 외부 서비스 | 0 | H2/PG | PG/Tomcat |

| 지원 형식 | 7 | 20+ | 30+ |

부하 테스트 (2코어, 4GB RAM): 268MB 이미지 풀 6초, 푸시 19초, RAM 최대 250MB.

배포 및 사용

빠른 시작:

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

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

업스트림 프록시: Docker Hub, npmjs, PyPI, Maven Central 자동 캐싱.

격리 네트워크와 미러링

격리 환경용: 외부 노드에서 nora mirror --format docker --packages "nginx:latest" --output bundle 실행, 번들 전송 후 내부에서 nora restore --input bundle. SHA256 무결성 검사.

주요 요약

  • 단일 바이너리, DB 없음: 34MB, 12MB RAM, 파일시스템 스토리지.
  • 7개 형식: Docker/OCI, Maven, npm, PyPI, Cargo, Go, raw.
  • 업스트림 프록시 + 캐시, RBAC 토큰, 감사 로그.
  • 로드맵: 온라인 GC, 멀티노드, NuGet/RubyGems, OIDC.

— Editorial Team

Advertisement 728x90

다음 읽기