Project · build
jupiter-os
The NixOS configuration for every machine at home, in one repository.
- Kind
- build
- Tags
- nixos, homelab, zfs
jupiter-os is a declarative, ZFS-backed NixOS monorepo that describes the machines at home. The hosts are named after Jupiter’s moons.
Hosts
- europa is the NAS: ZFS, NFS, the network-boot files and a binary cache.
- callisto is the serving host, with the shared Postgres and MQTT broker and a builder. It has no root disk of its own and boots from an iSCSI volume on europa.
- amalthea, metis and thebe are kiosks. Each runs one fullscreen browser and nothing else.
- pallene is a rented builder outside the house.
How a change reaches a machine
GitHub Actions builds each host’s system closure and pushes it over the tailnet to the binary cache on europa, keeping the last three generations per host. A machine then pulls its own configuration:
nixos-rebuild switch --flake github:belikh/jupiter-os#<host>
Nothing is pushed to a host. callisto is the exception to switch, for the reason in nixos-rebuild switch hangs a host whose root is on iSCSI.
Secrets are encrypted with sops and age, one key per host, and are read when a configuration is activated and never while it is built.
Network boot has an ordering rule. europa serves the boot files, but they are built from callisto’s configuration and published only after callisto has switched, so building europa never drags in a build of callisto.
Rules
- Stock kernel, because of ZFS.
- No flake input without a registered host that uses it.
- Every host must evaluate on every commit.
- No global changes to build inputs: see A global doCheck = false overlay cost 2,244 rebuilds.
Arcade
europa also runs the pipeline behind the kiosks’ game libraries: it keeps the DAT files current, fetches and verifies ROM sets, scrapes metadata and serves the result through a small Go web application. Kiosks mount the output read-only.
Notes
Code
- design Code
- Linux companion agent Project
- IRIX 7 Project