Bare-metal netboot appliance: catalog + fetch + NBD + PXE + TFTP + operator TUI in one container
Project description
pixie
Bare-metal netboot appliance in one container. Catalog + fetch + NBD serving + PXE plan renderer + TFTP + operator UI, on one FastAPI process with one state.db and one admin password.
Pixie folds into a single service what bty (operator UI + machine
registry + PXE plan renderer + Rich TUI), nbdmux (NBD-export
multiplexer + netboot artifact serve), and a hard-fork of withcache
(catalog + fetch + blob store) implement as three separate FastAPI
services. bty, nbdmux, and withcache continue as their own projects;
pixie is a sibling appliance that starts from a merged design. See
PLAN.md for the design rationale, locked decisions, and roadmap.
Run
The reference deploy is a single podman-compose stack under
--network=host. The pixie-lab CLI (installed with the package)
generates the compose file, the envvars template, and a per-deploy
README:
pixie-lab init /opt/pixie
"$EDITOR" /opt/pixie/envvars.example # set PIXIE_HOST_ADDR + PIXIE_ADMIN_PASSWORD
mv /opt/pixie/envvars.example /opt/pixie/envvars
cd /opt/pixie
podman compose --env-file envvars up -d
pixie-lab deploy fills in an admin password + host address + waits
for /healthz in one shot, useful for a fresh lab machine.
Log in at http://:8080/. First landing after login is a dashboard summarising machines, catalog, and NBD-serving state; the top nav has Machines, Catalog, Events, and Settings.
Operator workflow
- Point catalog import at a
catalog.tomlURL on/ui/catalog. Entries land staged (rows only, no bytes yet). - Click Fetch on a row to download it. The status pill ticks
through downloading -> decompressing -> unpacking with a
bytes / totalcounter so you see progress live. - Power-cycle a target with pixie in its DHCP next-server chain.
A first contact shows up on
/ui/machineswith the defaultipxe-exitboot mode. Open the row to bind a mode + image. pixie-inventoryprompts the live env to POST an inventory blob; the target's disks + NICs + memory show up on the machine detail page.- Flash modes (
pixie-flash-once,pixie-flash-always) require a target disk serial that came in on the inventory. The binding form disables Save until that prerequisite is met.
State
Everything writable lives under PIXIE_DATA_DIR (default
/var/lib/pixie). state.db holds catalog rows, machine rows,
event log, settings, and NBD-export records. blobs/<sha>/blob
holds fetched disk images. artifacts/<sha>/{vmlinuz,initrd, manifest.json} holds unpacked netboot bundles. live-env/ holds
the pixie live env kernel + initrd + squashfs the netboot-pc bake
produced.
Both admin password and display timezone / strftime pattern have
env-var overrides plus DB overrides via /ui/settings; env wins
so a compose deploy pins behaviour deterministically.
Development
uv sync
uv run pytest
uv run ruff check src tests
uv run mypy src
The integration tests spin real QEMU VMs behind a real pixie
container to exercise the PXE bootstrap + ramboot chains. They are
gated behind a marker so plain pytest skips them.
License
pixie is licensed under GPL-3.0-only. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pixie_lab-0.1.0.tar.gz.
File metadata
- Download URL: pixie_lab-0.1.0.tar.gz
- Upload date:
- Size: 1.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f5a3facf4b7522e8ba6b46abd162443bdcb64cc91be52c9a51685a9ab75feabd
|
|
| MD5 |
b4228c02b91184845c17fc41cd4cf205
|
|
| BLAKE2b-256 |
4641cd906127792da094f0b51385f90a5542bbbb09fdbe02607d0fa7ce9177e9
|
Provenance
The following attestation bundles were made for pixie_lab-0.1.0.tar.gz:
Publisher:
cicd.yaml on safl/pixie
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pixie_lab-0.1.0.tar.gz -
Subject digest:
f5a3facf4b7522e8ba6b46abd162443bdcb64cc91be52c9a51685a9ab75feabd - Sigstore transparency entry: 2195141994
- Sigstore integration time:
-
Permalink:
safl/pixie@965648a4095d68c8a13b58be675201d24346158c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/safl
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
cicd.yaml@965648a4095d68c8a13b58be675201d24346158c -
Trigger Event:
push
-
Statement type:
File details
Details for the file pixie_lab-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pixie_lab-0.1.0-py3-none-any.whl
- Upload date:
- Size: 656.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
32a40b9d26b950bc6a9b95f2dba50ef21cdd00bf4aedb4368bd00fff5ecb3b78
|
|
| MD5 |
e0260d2548a6f372f26af7b620d91f4c
|
|
| BLAKE2b-256 |
49f04bcd2d3f6f3b3692568bb2f680fe14f410b6c491093fcb845bc31a1b9717
|
Provenance
The following attestation bundles were made for pixie_lab-0.1.0-py3-none-any.whl:
Publisher:
cicd.yaml on safl/pixie
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pixie_lab-0.1.0-py3-none-any.whl -
Subject digest:
32a40b9d26b950bc6a9b95f2dba50ef21cdd00bf4aedb4368bd00fff5ecb3b78 - Sigstore transparency entry: 2195142000
- Sigstore integration time:
-
Permalink:
safl/pixie@965648a4095d68c8a13b58be675201d24346158c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/safl
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
cicd.yaml@965648a4095d68c8a13b58be675201d24346158c -
Trigger Event:
push
-
Statement type: