Setu

Your binaries. Your servers. One control panel.

Setu 0.1.2: aarch64 and Debian

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) and aarch64-unknown-linux-musl, built natively on GitHub's ubuntu-24.04-arm runner; one SHA256SUMS lists both; install.sh is attached unchanged.
  • install.sh picks the archive from uname -m (x86_64, aarch64/arm64); any other machine type fails with a clear message.
  • The manifest Target for apps already has aarch64-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 a validation error 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):

DistroPostgres 16 sourceCaddyNotes
Ubuntu 24.04distro packageofficial repo → release .deb fallbackas 0.1
Ubuntu 22.04PGDG apt repo (distro has 14)samenftables present
Debian 12PGDG apt repo (distro has 15)samesudo may be absent: installed
Debian 13distro 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.sh and scripts/verify-release.sh take an image (SETU_TEST_IMAGE, default a multi-arch ubuntu:24.04 base with systemd); CI runs test-install on Ubuntu 24.04, Ubuntu 22.04 and Debian 12 images (multi-arch ubuntu:22.04, debian:12 (without sudo preinstalled) and debian:13 bases 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.