A bare-metal fleet-orchestration home lab. A custom Python Fleet Manager on Temporal drives the full node lifecycle: plug in a wiped NUC → MAAS provisions it → Slurm runs burn-in tests → OpenStack deploys a workload → on signal, reprovision with a different workload.
This repo is both the build guide (sequential phase docs) and the code for each phase as it's built.
docs/— the phased build plan (see below).packages/— the Fleet Manager app as separate distributions:core(domain, adapters, workflows, store),api(FastAPI + UI),worker(Temporal activities + worker),stubs(in-memory backends),powershim(smart-plug power driver).charts/— Helm charts:fleet-manager(the app),fleet-temporal(wraps the upstream Temporal chart),fleet-keda,fleet-slurm,fleet-powershim, and a sharedpostgressubchart.docker/— Dockerfiles pluscompose.ymlto run the whole stack locally without k3d.infrastructure/k3d/— repeatable local cluster:setup.py(Temporal + KEDA),deploy.py(build + install the app),teardown.py.
Fastest path — the whole stack locally with stub backends (no real hardware needed):
docker compose -f docker/compose.yml up --buildOpen the Fleet Manager UI at http://localhost:8088 and the Temporal Web UI at
http://localhost:8233. The UI's /sim page injects fake machines so you can watch
the onboarding workflows drive a machine through its lifecycle.
To run on a local k3d cluster instead (Temporal + KEDA + the app):
python3 infrastructure/k3d/setup.py # create cluster, install Temporal + KEDA
python3 infrastructure/k3d/deploy.py --build # build images + install the app chartTear down the cluster with python3 infrastructure/k3d/teardown.py.
Each doc is one phase; they're meant to be followed in order, and each phase ends in something independently demoable.
MIT.