# Setu 0.1.2: aarch64 and Debian

Published 2026-10-21 · Canonical: https://setucp.com/docs/specs/10-10-setu-0-1-2-design

---

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`):

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.
