All use cases

2× Mac mini + 2× Pi + 1× x86 box · cross-arch + cross-OS

Mixed Studio Cluster

Mac minis + Pis + maybe one x86 box. One registry, every architecture.

First deploy: ~1 hour from cold start

Why pick this shape

  • Use the hardware you already have. Old desktop in the basement is a perfectly fine x86 worker.
  • Apple Silicon for the dev-feeling control plane, Pis for cheap 24/7 services, x86 for amd64-only workloads.
  • lib/cluster/buildx.sh produces multi-arch images so the right variant lands on each host.

Registry skeleton

Copy, replace IPs and ssh_user, point CADDY_REGISTRY_PATH at it.

hosts:
  mini1:
    ip: 192.168.1.10
    arch: arm64-apple
    roles: [infrastructure, vault, mlx_backends]
  mini2:
    ip: 192.168.1.11
    arch: arm64-apple
    roles: [databases, mlx_inference]
  pi1:
    ip: 192.168.1.51
    arch: arm64-linux
    roles: [workflows]
  pi2:
    arch: arm64-linux
    roles: [app_services]
  nuc1:
    ip: 192.168.1.20
    arch: amd64-linux
    roles: [amd64_workloads]

Bringing it up

./portoser registry validate                  # checks every arch field
./portoser cluster setup-buildx
./portoser cluster build --all
./portoser deploy mini1 dnsmasq caddy vault
./portoser cluster deploy --all
./portoser cluster health --watch

Common gotchas

  • Hard-coded `--platform=linux/amd64` in a Dockerfile breaks arm64 nodes silently.
  • Vendor images that are amd64-only must pin to your amd64 host or run under emulation.
  • native works on both macOS (launchctl) and Linux (systemctl) via lib/platform/detector.sh.

Read the full Mixed Architecture walkthrough

Deeper version with more code, more gotchas, and links to operations docs.

Read in docs