Virtual Registry 0.17.0

Released: 2026-08-25

Varnish version: 6.0.18r4

Artifact Firewall version: 0.5.1

Added

  • Added support for caching Conda artifacts, including the channel index, CEP-16 sharded repodata (conda 26+), and .conda / .tar.bz2 packages. The conda, mamba and micromamba clients are recognised.
  • Added remote_auth to virtual registries, letting operators configure a shared credential (username/password_env) that Orca attaches to outbound requests to the remote on the client’s behalf. Currently only implemented for OCI (Docker/container) registries, targeting the /token auth-token exchange. Inactive until remote_auth.policy is set: always replaces any credential the client sent (so pulls through that registry count against the configured account’s rate limit instead of the upstream’s shared anonymous quota), or if_anonymous, which only fills in when the client sent no credential of its own, leaving an existing one untouched. Not scope-aware, so give the configured credential read-only permissions upstream. Independent of auth_policy, except that it is not valid combined with auth_policy: drop.
  • Added retry_statuses to virtual registries, the response statuses from a remote that send the fetch to a remote it has not used yet. Valid values are 400-499 except 401 and 407, whose challenges have to reach the client. Set retry_statuses: [] to keep the first remote’s response instead. The retries spend the same max_retries budget as the 5xx and connection retries, so raise that varnishd parameter for a registry with more remotes than it allows.
  • Orca now serves the Go checksum database at /sumdb/<name>/..., so GOPROXY is the only setting a client needs and checksum verification keeps working where the go command has no route to sum.golang.org of its own. Only the two databases the go command ships with are proxied.

Changed

  • A registry with more than one remote now retries a 404 or a 429 against a remote the request has not been sent to yet, so an artifact only one of them holds is still served, and a remote that throttles is spent on one that does not. The client gets the response of the last remote asked. This is the new default for every such registry, configurable per registry with retry_statuses above.
  • A cluster node self-routing a request no longer repeats the sending node’s preflight authorization check against origin; it trusts that peer’s already-settled decision instead, verified via the existing cluster token. This removes a redundant round-trip to origin for every authorized cluster request.

Fixed

  • Fixed vcl.load timing out at a fixed 30 seconds regardless of cli_timeout. Supervisor’s command timeout is now derived from it.
  • Fixed manifest requests potentially being served from a cache entry shared across different authorized users, when the origin restricts what each user is allowed to see. Each authorized user now gets their own cache entry for manifests.
  • Fixed a remote’s 5xx being replaced by a synthetic 503 when the retry it triggered had no remote left to go to. The status and body the remote actually sent were discarded, which for a client parsing JSON turns an upstream outage into an unrelated parse error. The remote’s own response is now delivered, or a stale object where one exists.
  • Fixed the JFrog UI and OAuth flows having their redirects followed server-side, which consumed the session cookie bound to the 3xx and could break SSO. The opt-out those paths ask for never reached the code that follows redirects.
  • Fixed a fetch that followed a relative redirect being stuck with the remote that issued it, on registries with more than one remote. A 5xx, a failed connection, or a 404 at the redirected path kept asking that same remote for a path only it knew about. The retry now goes to another remote and asks for the URL the client sent.
  • Fixed digest-addressed OCI manifests and blobs being shared across repositories without a matching authorization check, so a client authorized for one image could be served cached content belonging to an image it has no access to. Preflight authorization is now scoped to the repository and the digest together.
  • Fixed preflight authorizations being shared between virtual registries for content-addressed artifacts, so a virtual registry that granted access spoke for every other virtual registry serving the same artifact. Each virtual registry’s access control is now enforced on its own.
  • Fixed tag-addressed OCI manifests being cached without regard to the media type the client asked for, so a client accepting only OCI types could be served a Docker-media-type manifest. Tagged manifests now vary on Accept. Manifests referenced by digest are unaffected.
  • Fixed Go module proxy @latest requests not being recognised as Go, so they were cached as an unknown resource type instead of as a mutable manifest.
  • Fixed Go modules published at major version 2 or above being classified as OCI, since their module path contains a /v2/ segment.

®Varnish Software, Wallingatan 12, 111 60 Stockholm, Organization nr. 556805-6203