Virtual Registry 0.16.0

Released: 2026-08-04

Varnish version: 6.0.18r3

Artifact Firewall version: 0.4.0

Added

  • Added auth_policy option to virtual registries, letting operators skip or actively strip preflight authorization checks on backends that already permit anonymous access. preflight (default) keeps today’s behavior of verifying every request via a HEAD check; ignore skips the check and shares cache with anonymous requests while still forwarding Authorization unchanged to the backend; drop strips Authorization before it ever reaches the backend.
  • Added auth_token_ttl to virtual registries (default 60s). Orca now caches OCI auth tokens per credential and scope for this window and hands the same bearer token back, keeping the downstream authorization cache key stable so already-cached images keep serving while the upstream registry or its token endpoint is unreachable (the cached token and preflight are revived for up to 1 week). Set auth_token_ttl: 0 to disable and pass token requests straight through. Only active when the Authentication feature is licensed.
  • Improved support for caching Cargo (Rust) artifacts served over the sparse registry protocol. This includes the registry config.json, the package index, and .crate downloads.
  • Added support for caching Hex (Erlang/Elixir) artifacts, including package metadata, tarballs and doc tarballs, both against repo.hex.pm directly and through a JFrog Artifactory Hex repository. Firewall rules are enforced on the tarball download rather than by filtering the package metadata, which Hex signs and clients verify.
  • Added runtime config reload. Config changes are now applied automatically when the files change on disk (supervisor.config_watch, enabled by default with a 15 second interval) or on demand with SIGHUP, and when the change affects the generated VCL, Varnish switches to it atomically without restarting, so the cache survives. Settings that require a restart are refused and leave the running config in place, and under Kubernetes the ConfigMap has to be mounted as a directory rather than with subPath, which is never updated in place.
  • Added cluster.extra_tokens, a list of additional tokens accepted from peers alongside cluster.token. This lets a cluster token be rotated with a rolling redeploy (stage the new token in extra_tokens, promote it to token, then retire the old value) instead of a coordinated restart of every node at once.

Changed

  • Maven firewall rules are now enforced on the artifact download (.jar, .war, .aar, .zip) instead of on the .pom, which now streams through whatever the verdict. A build blocked on a pinned version fails when it fetches the artifact rather than when it reads the descriptor, and a denied version no longer breaks the resolution of builds that never fetch it.

Fixed

  • Fixed Maven artifact downloads never matching a firewall rule when the registry is fronted behind an Artifactory repository path prefix, which was absorbed into the groupId.
  • Fixed a registry with a single remote never retrying a fetch that failed before the remote answered, so a connection the remote had already dropped reached the client as a 503. The retry now reuses the remote once when no untried remote is left.
  • Fixed OCI pushes failing against a remote registry that serves on a non-default port. The upload session URL handed back to the client kept the remote’s port without its host, so the client had nowhere to send the blob.
  • Fixed Git LFS batch responses not being rewritten for all clients and origins, so object downloads could bypass the cache. Note that LFS objects are fetched via /redirectz, so with redirects.deny_unknown_hosts enabled the origin’s object host must be listed in redirects.extra_known_hosts.
  • Fixed Git LFS object downloads returning 404 in a clustered deployment.
  • Fixed artifacts fetched through a presigned download URL being cached per signature rather than per object.
  • Fixed the OCI blob HEAD existence check being cached by digest alone, so a push could skip uploading a layer another repository already cached (unknown blob). HEAD is now keyed by repository; GET stays digest-only and shared.
  • Fixed the repo-scoped HEAD fix above not surviving a cluster hop, where a self-routed request normalizes to GET on the wire and could collapse back to a digest-only key. A manifest HEAD could also return Content-Length: 0 on the forwarded leg. The original request method now survives the hop and any retry to origin.
  • Fixed the rendering of a remote’s dns_ttl option, which produced VCL that failed to compile.
  • Fixed the error returned when redirects.deny_unknown_hosts blocks a transparent redirect target. Clients now receive the intended 502 redirect target host not allowed instead of a generic 503.
  • Fixed port conflict validation reporting conflicts for address combinations that can coexist on the same port, and missing conflicts for some combinations that cannot.
  • Cache PyPI PEP 658 metadata sidecars (<file>.metadata), which previously bypassed the cache.
  • Cache the NuGet vulnerability data files (vulnerability.base.json and vulnerability.update.json), which previously bypassed the cache.
  • Fixed the NuGet client User-Agent matching patterns.
  • Added OCI client User-Agent matching patterns.
  • Fixed OCI clients intermittently failing to authenticate against a clustered deployment, where a 401 challenge could carry a relative WWW-Authenticate realm instead of the absolute URL the token specification requires.

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