Orchestrator
The SteelEagle Orchestrator (the steele CLI, backed by a steeld daemon) manages the lifecycle of every SteelEagle service — the GCS, the backend containers, one or more vehicles, and the Aviary simulator — from a single tool, instead of opening a separate terminal for each component as described in the rest of the Quickstart. It is entirely optional: any service can still be started manually as shown elsewhere in these docs.
In the SteelEagle repo, the orchestrator lives at ~/steeleagle/orchestration.
Prerequisites
- Install uv.
- If you plan to manage and run the backend SteelEagle services, follow the Quickstart to install Docker, CUDA/NVIDIA drivers, and the NVIDIA container toolkit.
If Docker and CUDA are already present on the system, only the setup wizard below needs to be run.
- Run the setup wizard to generate the configuration files for the backend.
Once the setup wizard is complete, the rest of the Quickstart guide can be skipped in favor of the sections below.
Tool Installation
To install the orchestration CLI for the current user (referred to below as "steele"), use uv:
cd ~/steeleagle/orchestration
uv tool install . -e
To install the CLI system-wide (requires sudo privilege):
cd ~/steeleagle/orchestration
sudo UV_TOOL_DIR="/usr/local/share/uv/tools" UV_TOOL_BIN_DIR="/usr/local/bin" uv tool install -e .
Service Configuration
The orchestrator.yaml file lists the services that the daemon should manage and the paths to those services. Modify this file to remove any services that don't need to be managed (e.g. set sim, gcs, and backend to managed: false if you only plan to run the vehicle on this system) and to set the paths to those services. By default, the configuration assumes the main SteelEagle repository is at ~/steeleagle and the Roost repository is at ~/roost. If these repositories were cloned to other locations, update orchestrator.yaml accordingly.
If you plan to install the daemon as a system-wide service (i.e. running as root), the paths to the services should be absolute, lest they point at /root after user expansion instead of the user's home directory.
services:
# Aviary Simulator (from git.cmusatyalab.org/steeleagle/roost)
sim:
managed: true
type: process
command: [
"uv",
"run",
"--directory",
"~/roost/aviary/src/steeleagle_aviary",
"simulator.py",
]
# React/FastAPI Ground Control System
gcs:
managed: true
type: process
command: [
"uv",
"run",
"--directory",
"~/steeleagle/gcs/react/backend",
"main.py",
]
# Backend containers including swarm controller and cognitive engines
backend:
managed: true
type: compose
compose_files: ["~/steeleagle/backend/server/docker-compose.yml"]
environment: ["~/steeleagle/backend/server/.env"]
# Vehicle (kernel, driver, mission) instances
vehicle:
managed: true
type: pool
command: [
"uv",
"run",
"--directory",
"~/steeleagle/vehicle",
"launch.py",
]
Install as a systemd service
The orchestrator daemon can be installed as a systemd service, either system-wide (with root permission) or at the user level. The CLI can be used to install the systemd unit file.
At user-level:
steele daemon install --user
System-wide (sudo required):
sudo steele daemon install
Use the --dry-run flag to view the unit file that would be written without making any changes.
Start the CLI daemon
Using systemd
If the orchestrator has been installed as a systemd unit, it can be started using systemctl:
# if installed at user level
systemctl --user start steeld
# system-wide service
sudo systemctl start steeld
Manually
If the orchestrator is not installed as a service, it can be launched manually:
steele daemon --config /path/to/orchestrator.yaml
This command is blocking, so it needs to be run in a separate terminal, or pushed into the background (with &).
Install zero or more drivers
The driver subcommand lists or installs available SteelEagle drivers. If no additional drivers are installed, only simulated Aviary drones can be launched.
steele driver list
And to install (e.g. the Parrot ANAFI drivers):
steele driver install parrot-base
steele driver install parrot-anafi
The parrot-anafi driver depends on the parrot-base driver, so both need to be installed.
Install/build GCS
The gcs install command installs nvm/npm and builds the React frontend for the GCS. A separate build command can be run if changes are ever made to the frontend.
steele gcs install
List SteelEagle services
steele services
Service Status
To see the status of all services, use ps. The --details flag shows a breakdown of individual container/process status information:
steele ps
steele ps --details
Starting/stopping/restarting/logging services
Each service has its own subcommand with 4 main functions: start, stop, restart, and logs. For instance, to start all 4 services (which includes one simulated Aviary drone):
steele gcs start
steele sim start
steele backend start
steele vehicle start --name test1 --config test1.config.toml --internal test1.internal.toml --headless
The backend will download container images needed to satisfy what is specified in the docker-compose.yml file, which may take quite a while. Once the images are cached, starting the backend will be quicker.
If using a simulated vehicle from Aviary, the sim must be started before the vehicle or it will fail to connect.
Logs can be retrieved for a particular service. The -f flag follows the logs while -n limits the number of lines returned.
steele gcs logs -f
steele vehicle logs test1 -n 100