Date: 2026-10-10 · Status: approved in conversation (owner) · Scope: platform reach only; no feature changes.
Intent
Let people install Setu on the two other places small servers live: 64-bit ARM (Hetzner Ampere, AWS Graviton, Oracle's free ARM tier, Raspberry Pi 4/5) and Debian 12/13 or Ubuntu 22.04 images. Nothing about how Setu works changes; the binary, the installer and the agent installer learn where they are.
1. Architectures
- Releases ship two static musl archives:
x86_64-unknown-linux-musl(as now) andaarch64-unknown-linux-musl, built natively on GitHub'subuntu-24.04-armrunner; oneSHA256SUMSlists both;install.shis attached unchanged. install.shpicks the archive fromuname -m(x86_64,aarch64/arm64); any other machine type fails with a clear message.- The manifest
Targetfor apps already hasaarch64-linux; the agent reports its arch at join (it does) and the control plane refuses to provision a manifest that lacks a binary for the server's arch with avalidationerror naming both (today it would fail later at install). - CI runs the Rust test suite on the ARM runner too; the e2e runs on ARM as a non-blocking job until it has passed three times, then becomes blocking (ledger the switch).
2. Distributions
Supported (installer and setu agent install detect /etc/os-release):
| Distro | Postgres 16 source | Caddy | Notes |
|---|---|---|---|
| Ubuntu 24.04 | distro package | official repo → release .deb fallback | as 0.1 |
| Ubuntu 22.04 | PGDG apt repo (distro has 14) | same | nftables present |
| Debian 12 | PGDG apt repo (distro has 15) | same | sudo may be absent: installed |
| Debian 13 | distro package (17 is fine; needs.postgres is a floor) | same |
Anything else: the installer prints "unsupported distribution <id> <version>; Setu supports Ubuntu 22.04/24.04 and Debian 12/13" and exits 2 unless --force-distro is given, in which case it proceeds with the Debian 12 plan and says so.
The PGDG repository is added the documented way (keyring downloaded over HTTPS and verified against a pinned SHA-256 recorded in the code, deb https://apt.postgresql.org/pub/repos/apt <codename>-pgdg main).
The agent's distro logic lives in one module (crates/agent/src/ distro.rs): parse os-release → Distro { id, version_id, codename } → PackagePlan { repos: Vec<AptRepo>, packages: Vec<&str>, postgres_major: u8 }, unit-tested per distro from fixture os-release files. install.sh mirrors the same table in bash (the installer runs before the binary exists), with a shell test that feeds it the same fixtures.
3. Tests
scripts/test-install.shandscripts/verify-release.shtake an image (SETU_TEST_IMAGE, default a multi-archubuntu:24.04base with systemd); CI runs test-install on Ubuntu 24.04, Ubuntu 22.04 and Debian 12 images (multi-archubuntu:22.04,debian:12(without sudo preinstalled) anddebian:13bases with systemd installed in the image, so the same images serve the ARM jobs).- The e2e keeps Ubuntu 24.04 on x86_64 as the blocking run; ARM as above.
4. Docs and release
INSTALL.md support matrix, README platform badge, CHANGELOG 0.1.2, RELEASING.md matrix note. Version 0.1.2, tag, CI release, then verify-release.sh on x86_64 Ubuntu 24.04 and Debian 12; the ARM install is verified by the ARM CI job (no ARM hardware here).
Out of scope: RPM distributions, macOS, Windows, a container image of Setu itself.