The release mirror
Some hosting providers blackhole traffic to GitHub. A VayuPress install on such a
host saw every "Check for updates" end in dial tcp 140.82.121.5:443: i/o timeout
— DNS answered, the local firewall allowed outbound, and the route to GitHub was
simply dead. VayuPress's rule is that an operator without a shell is never stuck,
so the console works around it in three layers:
- The resilient transport (
internal/safefetch): every update check dials all of the host's resolved addresses for GitHub (IPv6 first, RFC 8305 order) and, if every one fails, re-resolves through DNS-over-HTTPS. - The endpoint chain (
internal/update/endpoints.go): GitHub → the official mirror → a metadata-only CDN listing. The panel shows a small "via mirror / via CDN" note so the operator can see which path answered. - The mirror (this document): https://updates.vayupress.com, a VayuPress install serving the releases it has downloaded and verified.
What the mirror is
Any VayuPress install can serve the mirror from one of its hosted domains:
VayuOS → the domain's page → Site administration → Release mirror. The
official one runs on updates.vayupress.com, which is the address every install
from 3.17.66 onwards falls back to (update.OfficialMirror).
Switched on, the install:
- syncs every hour (
releaseMirrorInterval,cmd/vayupress/release_mirror.go) with a conditional request, so an hour with no new release costs GitHub one304. Switching the mirror on, or pressing Sync now, starts a sync at once; - holds the newest stable release, the stable release before it (so an install that must roll back still finds files), and the newest pre-release when it is ahead of both. Older releases are removed from disk;
- verifies before it holds (
verifyMirroredRelease,internal/update/mirror.go). The binary must pass exactly what an install demands before it updates — checksum, Sigstore signature pinned to the release workflow onmain, the Ed25519 release-key signature, and a Linux executable image — through the same functionsApplyVerifiedcalls. Every other file must match the SHA-256 GitHub recorded for it, plus its own.sha256and signature where the release ships them. A release that fails any check is not held and not advertised; the reason is on the domain's page and inget_site; - answers three paths on that domain, from what it holds:
/api/github/repos/<owner>/<repo>/releases[/latest](GitHub's own JSON for the held releases),/download/github/<owner>/<repo>/releases/download/<tag>/<file>(the file), and/mirror/status.json(a public summary with no error text). Nothing is ever relayed to GitHub: an unknown repository, tag or file is a 404.
Everything else on the domain is served as before, so the domain's uploaded site
stays the page people see. The official page's source is in
deploy/updates-site/ and is published with the
build_site connector tool.
Guarantees, and what enforces each
| Guarantee | Mechanism |
|---|---|
| A tampering mirror cannot change what installs | ApplyVerified checks the Sigstore signature, release key and checksum on every download, wherever it came from |
| The mirror never advertises a release installs would refuse | verifyMirroredRelease runs the installer's own checks before a release is held |
| The mirror is not an open GitHub relay | Mirror.ServeHTTP answers only from state.json; no request reaches an outbound call |
| The updater is never shown a browser challenge | shieldBypass exempts the mirror paths on a mirror domain; the operator's country and address refusals still apply first |
| One client cannot take the uplink | per-client download budget (20 files an hour, IPv6 grouped by /64) and 8 concurrent transfers |
| A slow host can finish a 60 MB download | the mirror lifts the 30-second write deadline to 30 minutes for file transfers |
| A Tor Space leaks nothing | the mirror neither syncs nor answers in onion mode |
Pointing an install elsewhere
VAYU_UPDATE_MIRROR (environment) overrides the official mirror URL — for
example a mirror you serve from one of your own domains. Set it to off to
disable the mirror layer entirely (GitHub only).
Installs on 3.17.64 and 3.17.65
Those two releases fell back to https://updates.johal.in, a hostname that never
resolved. An install on either version that cannot reach GitHub gets no mirror;
it updates normally once it reaches GitHub once, and from 3.17.66 onwards it
falls back here.