Released: 2026-09-10
Varnish version: 6.0.18r4
Artifact Firewall version: 0.6.0
cluster.storage_replicas, which shards persistent storage across the cluster instead of replicating it. A clustered node caches every object it serves in memory and persists it to disk as well, so a cluster of N nodes holds N copies on disk and its usable persistent cache is that of a single node. Setting storage_replicas: 1 keeps each object on disk only on the node that owns it, pooling the whole cluster’s disk into one cache; a higher count keeps that many copies, trading capacity back for redundancy. Unset it stays full replication. Requires the persistence addon and configured varnish.storage.stores..rpm packages and the checksum-named repodata files are cached for the immutable lifetime, repomd.xml revalidates, and where the firewall is enabled repomd.xml and primary.xml are filtered while a .rpm download is authorized per version. Filtering repomd.xml invalidates its signature, so the client needs repo_gpgcheck=0 (per-package gpgcheck=1 keeps working), or firewall.preserve_manifest: true to keep the upstream signature and give up metadata filtering.@v/list is filtered to the versions the ruleset allows, @latest, .info and .mod are gated on the version they resolve to, and a module zip is authorized per version. The checksum database is not a module resource and is untouched.repodata.json is filtered to the packages the ruleset allows, and a .conda or .tar.bz2 download is authorized per version. The two variants the firewall cannot filter, repodata.json.bz2 and CEP-16 sharded repodata, are refused so the client falls back to one it can.--version now carry the revision the binary was built from, as stamped by the Go toolchain, suffixed -dirty for a build off a modified tree. It is omitted when the build carries no stamp./package-reroute endpoint (virtual_registry.package_reroute.enabled, off by default): a network-redirect target for a forward proxy that intercepts outbound traffic to public package registries, such as a Zscaler ZIA rule mirroring JFrog’s Package Traffic Controller. It resolves the upstream host embedded in ?url= against every configured registry’s remotes and re-enters that registry’s normal pipeline..deb is the same build already published for the other Debian-family distributions; it is now uploaded to, and installed and upgraded under, ubuntu/resolute as well.name to a remote (virtual_registry.registries[].remotes[]) and a cluster peer (cluster.peers[]), used in the generated backend/director name instead of a positional index. Both share the same underlying config type, so the fix covers artifactory_dir_N and cluster_dir_N alike. Names are alphanumeric and hyphens only, and must be unique within their list; an unnamed remote or peer keeps the existing positional naming.remote_auth now applies to every package type, not just OCI (Docker/container) registries. For OCI it still targets the /token auth-token exchange; for everything else it is attached to the content request itself, in vcl_recv, and an injected request is classified as its own cache entry rather than preflighted, since the caller’s own credential is not what reaches the remote. That entry is shared by every injected caller and keyed without the credential, so rotating the secret in password_env leaves the cached objects in place instead of invalidating them. policy: always combined with auth_policy: preflight therefore skips the preflight check, which a startup warning now calls out. if_anonymous is unaffected: it still only fills in when the caller sent no credential of its own.INFO is reserved for state changes rather than a line before and another after each one. The license text and its signature are no longer written to the log when they change, and the container image no longer echoes the versions before startup, since the Supervisor reports them itself.virtual_registry.redirects.deny_unknown_hosts not being set. It fired on every configuration that left the option at its default, and writing the default out verbatim was the only way to silence it.varnish-supervisor package now installs a Varnish module, /usr/lib/varnish-plus/vmods/libvmod_vizier.so, which the generated VCL imports. Hex requests are now parsed inside that module. Every other ecosystem is unchanged, and caching behaviour behaves the same regardless of it is parsed by the VMOD. Remaining ecosystems will move across one at a time. A Varnish module is ABI-bound to the exact Varnish Enterprise build it was compiled against, so varnish-plus and varnish-supervisor must now be upgraded together. Upgrading varnish-plus alone leaves Varnish unable to load its VCL.map-stream-0.0.7.tgz came out as version stream-0.0.7. A rule scoped to a version range could deny a version it allows, or allow one it denies.supervisor.log_level and supervisor.log_output only taking effect for the config manager itself on reload. Every other component kept the settings it started with, and a change to log_output silenced them for the rest of the run, since the file they were still writing to had been closed. A reload and a SIGHUP now also wait for the records already on their way into the old file before closing it.acme.domains that swaps one domain for another, rather than adding or removing one, not reaching ACME. The reload applied, but no certificate was requested for the new domain until the Supervisor was restarted.ghcr.io layer pull fail with 400 Missing query parameters..pom files at a released version revalidating against the remote on every request, which cost a round trip per descriptor in a resolve. They are now cached for the immutable lifetime, while .pom files under a -SNAPSHOT version keep revalidating.varnish-supervisor RPM, which never ran. An install only logged a warning, but an upgrade failed the transaction and left both versions recorded as installed. Upgrading from 0.17.0 or earlier still trips on the old package’s own scriptlets: run the upgrade again, then drop the stale record with rpm -e --noscripts varnish-supervisor-<old version> and restart the service.prerm, which runs before anything in the new package does, so there is no state left to preserve.systemctl stop varnish-supervisor leaving the service in a failed state. Varnish was killed outright instead of being asked to stop, which also meant the shutdown_delay and shutdown_close parameters never took effect.varnishadm command was still in flight, which is most likely when the service is stopped shortly after it starts.