docs: server-releases.md catches up with arm64 + rolling assets (#438)
The doc predated the arm64 pipeline and the installer: per-build releases now carry both arches, the rolling release carries latest-stable binaries + install.sh + the feed, its README is the synced self-hosting guide, and the manifest example shows the additive arm64_* fields. Also records the asset-CDN staleness gotcha we hit live.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 file changed,
+29
−8
docs/server-releases.md+29 −8
diff --git a/docs/server-releases.md b/docs/server-releases.md| index 6c5b1c5..d53339f 100644 |
| --- a/docs/server-releases.md |
| +++ b/docs/server-releases.md |
| @@ -16,14 +16,28 @@ app's Sparkle appcast uses, see `ios/release-mac.sh`): |
| - **One release per build**: tag `server-<ver>` (ver = the git short sha that |
| `deploy/build-linux.sh` stamps into the binary as `main.buildVersion`), |
| - carrying `lchat-linux-amd64` and its `.sha256`. |
| -- **One rolling release**: tag `server`, whose single asset `manifest.json` is |
| - the **feed** — re-uploaded with `--clobber` on every publish/promote, so its |
| - URL never changes: |
| - |
| - ``` |
| - https://github.com/elevenmessenger/releases/releases/download/server/manifest.json |
| - ``` |
| + carrying **both architectures** — `lchat-linux-amd64` and `lchat-linux-arm64`, |
| + each with its `.sha256`. |
| +- **One rolling release**: tag `server`, whose assets live at fixed URLs |
| + (re-uploaded with `--clobber`, so the URLs never change): |
| + - `manifest.json` — the **feed**, updated on every publish/promote: |
| + |
| + ``` |
| + https://github.com/elevenmessenger/releases/releases/download/server/manifest.json |
| + ``` |
| + - `lchat-linux-{amd64,arm64}` (+ `.sha256`) — copies of the current |
| + **stable** binaries, refreshed by `promote … stable`. These JSON-free URLs |
| + are what `deploy/install.sh` downloads. |
| + - `install.sh` — the self-hoster installer, refreshed on every publish. |
| +- **The releases repo README** is the public self-hosting guide — synced from |
| + `docs/self-hosting.md` on every publish (this source repo is private, so the |
| + downloads page doubles as the documentation). |
| + |
| +> Operator gotcha (learned live): GitHub's asset CDN can serve a |
| +> freshly-clobbered asset **stale for a few minutes**, and brand-new assets can |
| +> briefly 404 — different clients may even hit different cache nodes. An update |
| +> pass right after a publish may quietly no-op; the next hourly pass absorbs |
| +> it. Don't chase ghosts during that window. |
| ## Channels |
| @@ -57,6 +71,8 @@ Payload: |
| "edge": { "version": "a1b2c3d", |
| "url": "https://github.com/elevenmessenger/releases/releases/download/server-a1b2c3d/lchat-linux-amd64", |
| "sha256": "…64 hex…", "size": 123456, |
| + "arm64_url": "…/server-a1b2c3d/lchat-linux-arm64", |
| + "arm64_sha256": "…64 hex…", "arm64_size": 123456, |
| "notes": "one-liner", "published_at": "…" }, |
| "beta": { "…": "…" }, |
| "stable": { "…": "…" } |
| @@ -64,6 +80,11 @@ Payload: |
| } |
| ``` |
| +The flat `url`/`sha256` fields are the **amd64** binary — kept flat so every |
| +updater ever shipped can read them; `arm64_*` are additive and optional (an |
| +arm64 box facing a release without them skips it rather than installing the |
| +wrong architecture — `releaseEntry.forArch` in `release.go`). |
| + |
| ## Trust model |
| The updater downloads and *executes* native code, so the chain matters: |