getnora-io/nora

GitHub: getnora-io/nora

一个支持Docker、Maven、npm、PyPI、Cargo、Go等多种格式的轻量级私有制品仓库,单二进制文件运行、零依赖、内存占用低。

Stars: 36 | Forks: 3

# NORA **随您成长的制品仓库。** 从 `docker run` 开始,扩展到企业级。 ``` docker run -d -p 4000:4000 -v nora-data:/data ghcr.io/getnora-io/nora:latest ``` 打开 [http://localhost:4000/ui/](http://localhost:4000/ui/) — 您的仓库已就绪。

NORA Dashboard

## 为什么选择 NORA - **零配置** — 单一 32 MB 可执行文件,无需数据库,无依赖。`docker run` 即可运行。 - **生产环境验证** — Docker (+ Helm OCI)、Maven、npm、PyPI、Cargo、Go、Raw。在实际的 CI/CD 环境中使用,包括 ArgoCD、Buildx 缓存和气隙环境。 - **默认安全** — [OpenSSF Scorecard](https://scorecard.dev/viewer/?uri=github.com/getnora-io/nora)、签名发布、SBOM、模糊测试、460+ 测试。 [![Release](https://img.shields.io/github/v/release/getnora-io/nora)](https://github.com/getnora-io/nora/releases) [![Image Size](https://img.shields.io/badge/image-32%20MB-blue)](https://github.com/getnora-io/nora/pkgs/container/nora) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) **32 MB** 可执行文件 | **< 100 MB** 内存 | **3s** 启动 | **7** 个仓库 ## 支持的仓库 | 仓库 | 挂载点 | 上游代理 | 认证 | |----------|------------|----------------|------| | Docker Registry v2 | `/v2/` | Docker Hub、GHCR、任意 OCI、Helm OCI | ✓ | | Maven | `/maven2/` | Maven Central、自定义 | 仅代理 | | npm | `/npm/` | npmjs.org、自定义 | ✓ | | Cargo | `/cargo/` | — | ✓ | | PyPI | `/simple/` | pypi.org、自定义 | ✓ | | Go Modules | `/go/` | proxy.golang.org、自定义 | ✓ | | Raw 文件 | `/raw/` | — | ✓ | ## 快速开始 ### Docker(推荐) ``` docker run -d -p 4000:4000 -v nora-data:/data ghcr.io/getnora-io/nora:latest ``` ### 二进制文件 ``` curl -fsSL https://github.com/getnora-io/nora/releases/latest/download/nora-linux-amd64 -o nora chmod +x nora && ./nora ``` ### 从源码构建 ``` cargo install nora-registry nora ``` ## 使用方法 ### Docker 镜像 ``` docker tag myapp:latest localhost:4000/myapp:latest docker push localhost:4000/myapp:latest docker pull localhost:4000/myapp:latest ``` ### Maven ``` nora http://localhost:4000/maven2/ ``` ### npm ``` npm config set registry http://localhost:4000/npm/ npm publish ``` ### Go 模块 ``` GOPROXY=http://localhost:4000/go go get golang.org/x/text@latest ``` ## 功能特性 - **Web UI** — 带有搜索、浏览、国际化的仪表板(支持 EN/RU) - **代理与缓存** — 透明代理上游仓库并支持本地缓存 - **镜像 CLI** — 用于气隙环境的离线同步功能(`nora mirror`) - **备份与恢复** — `nora backup` / `nora restore` - **迁移** — `nora migrate --from local --to s3` - **S3 存储** — MinIO、AWS S3、任意 S3 兼容后端 - **Prometheus 指标** — `/metrics` 端点 - **健康检查** — `/health`、`/ready` 用于 Kubernetes 探针 - **Swagger UI** — `/api-docs` 用于 API 探索 - **速率限制** — 可配置的按端点速率限制 - **FSTEC 构建** — 每次发布均包含 Astra Linux SE 和 RED OS 镜像 ## 认证 NORA 支持 Basic Auth(htpasswd)和可撤销的 API 令牌,并提供 RBAC。 ``` # 创建 htpasswd 文件 htpasswd -cbB users.htpasswd admin yourpassword # 启用认证启动 docker run -d -p 4000:4000 \ -v nora-data:/data \ -v ./users.htpasswd:/data/users.htpasswd \ -e NORA_AUTH_ENABLED=true \ ghcr.io/getnora-io/nora:latest ``` | 角色 | 拉取/读取 | 推送/写入 | 删除/管理 | |------|-----------|------------|--------------| | `read` | 是 | 否 | 否 | | `write` | 是 | 是 | 否 | | `admin` | 是 | 是 | 是 | 请参阅[认证指南](https://getnora.dev/configuration/authentication/)了解令牌管理、Docker 登录和 CI/CD 集成。 ## 配置 ### 环境变量 | 变量 | 默认值 | 描述 | |----------|---------|-------------| | `NORA_HOST` | 127.0.0.1 | 绑定地址 | | `NORA_PORT` | 4000 | 端口 | | `NORA_STORAGE_MODE` | local | `local` 或 `s3` | | `NORA_AUTH_ENABLED` | false | 启用认证 | | `NORA_DOCKER_UPSTREAMS` | `https://registry-1.docker.io` | Docker 上游(`url|user:pass,...`) | | `NORA_LOG_LEVEL` | info | 日志级别:trace、debug、info、warn、error | | `NORA_LOG_FORMAT` | text | 日志格式:`text`(人类可读)或 `json`(结构化) | | `NORA_PUBLIC_URL` | — | 用于重写制品链接的公共 URL | 请参阅[完整配置参考](https://getnora.dev/configuration/settings/)了解所有选项。 ### config.toml ``` [server] host = "0.0.0.0" port = 4000 [storage] mode = "local" path = "data/storage" [auth] enabled = false htpasswd_file = "users.htpasswd" [docker] proxy_timeout = 60 [[docker.upstreams]] url = "https://registry-1.docker.io" [go] proxy = "https://proxy.golang.org" ``` ## CLI 命令 ``` nora # Start server nora serve # Start server (explicit) nora backup -o backup.tar.gz nora restore -i backup.tar.gz nora migrate --from local --to s3 nora mirror # Sync packages for offline use ``` ## 端点 | URL | 描述 | |-----|-------------| | `/ui/` | Web UI | | `/api-docs` | Swagger UI | | `/health` | 健康检查 | | `/ready` | 就绪探针 | | `/metrics` | Prometheus 指标 | | `/v2/` | Docker 仓库 | | `/maven2/` | Maven | | `/npm/` | npm | | `/cargo/` | Cargo | | `/simple/` | PyPI | | `/go/` | Go 模块 | ## TLS / HTTPS NORA 提供纯 HTTP 服务。请使用反向代理来处理 TLS: ``` registry.example.com { reverse_proxy localhost:4000 } ``` 请参阅 [TLS / HTTPS 指南](https://getnora.dev/configuration/tls/)了解 Nginx、Traefik 和自定义 CA 的配置。 ## 性能 | 指标 | NORA | Nexus | JFrog | |--------|------|-------|-------| | 启动时间 | < 3s | 30-60s | 30-60s | | 内存占用 | < 100 MB | 2-4 GB | 2-4 GB | | 镜像大小 | 32 MB | 600+ MB | 1+ GB | [查看 NORA 与其他仓库的对比](https://getnora.dev) ## 路线图 - **镜像 CLI** — 用于气隙环境的离线同步 - **OIDC / 工作负载身份** — GitHub Actions、GitLab CI 的无密钥认证 - **在线垃圾回收** — 无需仓库停机的非阻塞清理 - **保留策略** — 声明式规则:保留最近 N 个标签、删除超过 X 天的镜像 - **镜像签名** — cosign 验证和策略执行 请参阅 [CHANGELOG.md](CHANGELOG.md) 了解发布历史。 ## 安全与信任 [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/getnora-io/nora/badge)](https://scorecard.dev/viewer/?uri=github.com/getnora-io/nora) [![CII Best Practices](https://www.bestpractices.dev/projects/12207/badge)](https://www.bestpractices.dev/projects/12207) [![Coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/devitway/0f0538f1ed16d5d9951e4f2d3f79b699/raw/nora-coverage.json)](https://github.com/getnora-io/nora/actions/workflows/ci.yml) [![CI](https://img.shields.io/github/actions/workflow/status/getnora-io/nora/ci.yml?label=CI)](https://github.com/getnora-io/nora/actions) - **签名发布** — 每次发布均使用 [cosign](
标签:ArgoCD, artifact registry, Cargo 仓库, Docker Registry, Go Modules, Helm Chart, LangChain, Maven 仓库, NIDS, npm 私有仓库, OCI 镜像, PyPI 私有仓库, SOC Prime, 制品仓库, 包管理, 单二进制, 可视化界面, 容器化, 容器镜像仓库, 开发工具, 私有仓库, 请求拦截, 轻量级, 通知系统, 镜像缓存, 零依赖