Skip to main content
An overview of how the Lager platform components fit together — from CLI commands on your laptop to instruments connected to your DUT.

High-Level Overview

All three entry points — developer CLI commands, developer custom scripts, and CI runners — share the same execution infrastructure. They all reach the Lagerbox through Tailscale VPN and hit Flask on port 5000, which executes the uploaded script or impl module inside the Docker container with full access to lager.* hardware libraries.

Terminology


Lagerbox Internals

Port Summary


Optional Control Plane Integration

Lager boxes publish SSH keys from a key directory, /etc/lager/authorized_keys.d/, so an external control plane can provision access without a human typing SSH commands. Dropping a <name>.pub file there gets the key into the box account’s ~/.ssh/authorized_keys within about five seconds. Because /etc/lager is bind-mounted into the runtime container, a control plane can write that file from inside the container — which is how it bootstraps before it has any SSH access to the box at all. start_box.sh owns only the region of authorized_keys between its # BEGIN LAGER MANAGED KEYS and # END LAGER MANAGED KEYS markers, and rebuilds that region from the key directory on every pass. Two consequences worth knowing:
  • Deleting a .pub revokes the key. Nothing else does; editing authorized_keys by hand inside the marked region is undone on the next pass.
  • Keys installed by other means are untouched. lager ssh-setup, ssh-copy-id, and cloud-init all append outside the marked region, and are preserved verbatim. Any other system that manages this file must claim its own distinct marker pair — two managers sharing one pair would each rebuild the other’s region on every pass.
Lager itself does not require or run a control plane — this is a hook, not a dependency. Leaving the key directory absent or empty simply means no keys are published from it. Commercial control planes that build on this hook — for fleets that need org/RBAC/SSO, audit logging, and scheduling on top of Lager — are listed on the Professional Services directory.

Net Abstraction

A Net is the central abstraction that decouples CLI commands from physical hardware details.

Supported Net Types


Execution Flows

CLI Command Execution

Step-by-step data path for lager supply psu1 voltage 3.3 --yes:

Custom Script Execution (lager python)

The lager python command uploads a user-written Python script to the box for execution. It uses the same Flask :5000 execution path as CLI commands.
The script runs inside the Docker container with full access to lager.* hardware libraries, and output is streamed back in real time.

Physical Wiring

How instruments physically connect between the Lagerbox and the DUT:

Connection Types


GitHub Actions CI Integration

A CI runner is an ephemeral GitHub Actions VM that joins Tailscale and runs lager commands exactly like a developer would — no special CI-specific infrastructure is needed.

Required GitHub Secrets

Workflow Example