NORA 1.1.0
A feature release over 1.0.1: the last two hosted-only formats (rpm/deb) gain pull-through proxy + offline mirror, retention now covers rpm/deb/raw, OIDC namespace scoping gets per-rule granularity, a geo/policy-blocked upstream becomes observable, plus a batch of proxy, health and storage fixes.
Added
- Pull-through proxy and offline mirror for rpm and deb — the last two hosted-only formats gain the proxy mode every other format has. A repository name maps to a single upstream (
[rpm.proxies]/[deb.proxies], string or{ url, auth }); a proxied repo is read-only, upstream metadata is served verbatim withinmetadata_ttl, packages are cached immutably, and a down upstream serves the stale cache withx-nora-stale: true.nora mirror rpm --repo <name>/nora mirror deb --repo <name>pre-fetch a whole repo through the proxy so dnf/apt work air-gapped. (#864) - Retention over rpm, deb, and raw — the three formats retention previously skipped. rpm/deb versions are grouped per
{repo}/{arch}/{package}(structured deb per distribution × component), raw per depth-2 path prefix; touched indexes are rebuilt and re-signed under the publish lock. New optionalname_globtargets groups within a registry. (#848) - Per-rule namespace scope for OIDC role rules, plus intra-segment
*wildcards innamespace_scope— arole_rulesentry can narrow the provider scope (a write must satisfy both; a rule can't widen past the provider ceiling), and patterns now support*within a path segment. (#854, #861) - A geo/policy-blocked upstream is now observable — a proxied upstream 4xx carrying a policy/geo block signature (
x-amzn-waf-reason) emits awarnlog and anora_upstream_policy_blocked_total{registry,reason}metric, instead of being silently indistinguishable from a genuine not-found. The 404 relay and the circuit breaker are unchanged (a policy block isn't an availability failure). (#881)
Fixed
- Scoped npm packages round-trip on S3 / object_store backends —
encode_object_key's@→%40was double-encoded to%2540byobject_store::path::Path, so a scoped package's packument regenerated empty (npm install→ENOVERSIONS) even though the version files were stored correctly. Reproduced on MinIO, SeaweedFS, RustFS and Garage; the local-filesystem backend was unaffected. Publish also now fails closed if the just-published version isn't visible in the regenerated packument. (#878) - Ansible collections with more than 100 versions install through the proxy — galaxy_ng's host-relative pagination links are now rewritten under the
/ansiblemount, so page 2+ no longer 404s (e.g.community.docker, 148 versions). (#875) - Docker serves locally-pushed manifests without upstream revalidation (#868), and
registries.enableback-propagates to the per-registry flags so an enable-set no longer leaves rpm/deb returning 404 (#863). - Health: cached object-store reachability self-expires if the refresh loop stalls (#874);
/healthand/readyno longer probe object storage (#869). - Cargo sparse index advertises
auth-requiredon private deployments so cargo authenticates index/download requests (#857); retention and GC schedulers run once at boot instead of waiting a full interval (#859, #860).
Thanks 🤝
- Joe Grund (@jgrund) — the rpm/deb pull-through proxy + offline mirror, retention across rpm/deb/raw, per-rule OIDC namespace scoping, the health and cargo/docker fixes, and more.
- @bas2k — the Ansible >100-version pagination fix (#875).
Install
# x86_64
curl -LO https://github.com/getnora-io/nora/releases/download/v1.1.0/nora-linux-amd64
chmod +x nora-linux-amd64 && sudo mv nora-linux-amd64 /usr/local/bin/nora
# ARM64 (Apple Silicon, Graviton, Ampere)
curl -LO https://github.com/getnora-io/nora/releases/download/v1.1.0/nora-linux-arm64
chmod +x nora-linux-arm64 && sudo mv nora-linux-arm64 /usr/local/bin/noraDocker
docker pull getnora/nora:1.1.0Helm
helm repo add nora https://getnora-io.github.io/helm-charts
helm repo update
helm install nora nora/nora # chart 0.4.4, appVersion 1.1.0Full changelog: v1.0.1...v1.1.0