Deploy a district-local hydramirror fleet so bodies download experience builds from a mirror close to them, falling back to the central mirror-a.experiencenet.com on miss. Reduces cross-region bandwidth, cuts install time on multi-gigabyte Perforce builds, and lets venues keep streaming if the central mirror degrades.
mirror-a.experiencenet.com is the only running hydramirror instance. Every body hits it directly.hydramirror_url_pattern: "https://{district}.hydramirror.experiencenet.com" is in hydraexperiencelibrary pipeline config.bxl1.hydramirror.experiencenet.com does not resolve (confirmed via pipeline health check: lookup ... no such host).hydramirror Go binary already exposes GET /api/v1/peer/files/... and HEAD /api/v1/peer/files/..., so peer-pull is designed in and just needs a configured origin.hydrabody currently uses build_url verbatim from the experience library. No host rewriting to a district-local mirror today.Deploy district mirror VMs. One hydramirror per active district (bxl1 first, additional districts as they come online). Start with a Hetzner cx23 in a location near the district. Provision via morpheus or existing infra pattern.
Origin + peer config. Each district mirror runs in peer mode with origin_url: https://mirror-a.experiencenet.com and its own admin token. Mirror-a remains the write-authoritative origin for uploads (only hydraperforcewatcher and hydrarelease PUT to it).
DNS. Add {district}.hydramirror.experiencenet.com A records for each deployed mirror. Hetzner DNS, same zone as the rest of experiencenet.com.
TLS. Autocert on each district mirror, same pattern as other services.
hydrabody URL rewrite. In the experience install code path, before calling downloadFile(build_url, ...), rewrite the hostname to {district}.hydramirror.experiencenet.com if the body's configured district is non-empty and the URL host matches mirror-a.experiencenet.com. Fall back to the original URL on a non-200 HEAD or DNS failure.
hydradistrict exposes district name to bodies. If bodies do not already receive their district from GET /api/v1/body/config, add it.
Health and observability. hydraexperiencelibrary pipeline health check already queries {district}.hydramirror.experiencenet.com/api/v1/health per district. Once district mirrors are up, that check flips from unreachable to healthy automatically.
Retention. District mirrors are caches. Decide a retention policy (e.g., LRU over disk limit), and document it. Start simple with disk-size-bounded LRU.
bxl1.hydramirror.experiencenet.com resolves and serves GET /api/v1/health.bxl1 installing a fresh experience downloads the zip from bxl1.hydramirror.experiencenet.com (confirmed in hydrabody.log).mirror-a install. Warm-cache install is strictly faster.bxl1 shows hydramirror: healthy with the district URL.bxl1.hydramirror goes offline, bodies fall back to mirror-a automatically. Streams keep working.