stado serve
Invocation
stado serve [OPTIONS]Purpose
Run this host's Stado components in one supervised process
Required inputs and options
| Input or option | Contract |
|---|---|
--gpu-type <GPU_TYPE> | GPU type (auto-detected if --target/--auto absent) [default: ""] |
--target <TARGET> | Pull the target's accelerator and policy from the registry by name |
--auto | Look up self in registry by hostname; no manual config |
--idle-shutdown | Exit and retire an ephemeral cloud VM when no eligible work remains |
--kind <KIND> | Consumer label: local, gcp, azure, aws, or vast [default: local] |
--vast-auto-list | List idle capacity on Vast.ai using its existing Skarbiec grant |
--vast-price-gpu <VAST_PRICE_GPU> | Per-GPU-hour rental price in USD. Required when the Vast bridge runs; no price is built in |
--vast-max-duration-s <VAST_MAX_DURATION_S> | Maximum rental length in seconds; zero leaves it open-ended. Required when the Vast bridge runs |
--vast-idle-window-s <VAST_IDLE_WINDOW_S> | Seconds Stado must be idle before the Vast bridge lists this host. Required when the bridge runs |
--poll-seconds <POLL_SECONDS> | Seconds between queue polls when a poll started nothing. Required to run the worker; nothing in Stado chooses it |
--worker | Run a persistent local worker; other host roles do not imply one |
--standalone | This device belongs to no fleet registry: the worker runs without a registry target, against the configured local queue. It cannot be combined with roles that need one (a resolver, release reconciliation, a worker --target or --auto). An ephemeral cloud machine runs its worker this way, with its provider's --kind and --idle-shutdown |
--failure-fixer-interval-seconds <FAILURE_FIXER_INTERVAL_SECONDS> | Dispatch unhandled failed jobs inside this process at the declared cadence |
--failure-fixer-command-pattern <FAILURE_FIXER_COMMAND_PATTERN> | Preserve the failure fixer's command substring filter |
--resolver | Run this host's declared service resolver inside the host process |
--coordinator <COORDINATOR> | Exact coordinator entry to run here; add --api to expose its API listener |
--control-plane <CONTROL_PLANE> | Preserve a bundled local or cloud scheduling loop inside this process [possible values: local, cloud] |
--control-plane-interval-seconds <CONTROL_PLANE_INTERVAL_SECONDS> | Scheduling cadence from the existing bundled control-plane declaration |
--api | Serve the configured API without claiming a coordinator role |
--bind <BIND> | API bind address, using the existing dashboard configuration when omitted |
--port <PORT> | API port, using the existing dashboard configuration when omitted |
--enrollment-only | Serve ONLY GET /join.sh, GET /api/fleet/invite/key and POST /api/fleet/join; answer 404 to every other path and method. Publish this listener through a tunnel, never the full API |
--inherited-listener | Serve the listening TCP socket this process was given as its standard input instead of binding one. The parent that bound the socket keeps the port reserved until this listener serves it. Refused with --bind or --port |
--api-storage <API_STORAGE> | JSON primary/backup endpoints for the API, independent of worker storage |
--api-local-store <PATH> | The local root the API serves, independent of the storage the other roles use: `--api-storage` for a local primary, spelled as a path so a unit file can carry it (a unit argument cannot hold the JSON's quotes) |
--release-interval-seconds <RELEASE_INTERVAL_SECONDS> | Enable release reconciliation at this declared cadence |
--health-interval-seconds <HEALTH_INTERVAL_SECONDS> | Enable host-health publication at this declared cadence |
--product-sync-interval-seconds <PRODUCT_SYNC_INTERVAL_SECONDS> | Reconcile installed product surfaces against canonical origin/main at this declared cadence, inside this process |
--product-sync-surface <PRODUCT_SYNC_SURFACE> | A surface `stado product sync --surface` reconciles on that cadence; repeat for each declared surface, in the order they run |
--forward-destination <FORWARD_DESTINATION> | Existing reverse-forward SSH destination (user@host); both ends stay loopback |
--forward-remote-port <FORWARD_REMOTE_PORT> | Remote loopback port of the existing reverse listener |
--forward-local-port <FORWARD_LOCAL_PORT> | Local loopback port reached by that listener |
--forward-interval-seconds <FORWARD_INTERVAL_SECONDS> | Reconcile the reverse listener at its own declared cadence |
--edge-caddy <EDGE_CADDY> | Run the web edge's reverse proxy, this program, inside this process |
--edge-caddyfile <EDGE_CADDYFILE> | The Caddyfile `stado web edge` delivers to this host; watched and reloaded |
--precheck-runner <ROOT> | Run the GitHub pre-check runner installed at this root inside this process: its launcher starts under passwordless sudo and drops to the runner's own account |
--release-loop-root <DIR> | Keep the delivery queue of the product checkouts under this directory inside this process: a pass at start and on every branch move. It queues and builds nothing; `stado release newest` delivers the queue |
--public-status-bind <HOST:PORT> | Serve the public status page on this `host:port` inside this process (`stado public-status serve`): the host apart from the products it reports on that answers the status hostname |
--watchdog | Collect workstation diagnostics inside this host process |
--watchdog-bucket <WATCHDOG_BUCKET> | Diagnostics destination; the declared queue bucket (WC_BUCKET) when omitted, and the role is refused when neither names one |
--watchdog-interval-seconds <WATCHDOG_INTERVAL_SECONDS> | Seconds between workstation diagnostics collections; required with --watchdog |
Output and state effect
It performs the operation described above and emits its operator result on standard output or standard error. Any state change is limited to the resources and records named by the purpose and options on this page.
Refusals
- Required when the Vast bridge runs; no price is built in
- Required when the Vast bridge runs
- Seconds Stado must be idle before the Vast bridge lists this host.
- Required when the bridge runs
- Required to run the worker; nothing in Stado chooses it
- It cannot be combined with roles that need one (a resolver, release reconciliation, a worker --target or --auto).
- Refused with --bind or --port
- The local root the API serves, independent of the storage the other roles use: `--api-storage` for a local primary, spelled as a path so a unit file can carry it (a unit argument cannot hold the JSON's quotes)
- Diagnostics destination; the declared queue bucket (WC_BUCKET) when omitted, and the role is refused when neither names one
- Seconds between workstation diagnostics collections; required with --watchdog
- Before dispatch, Stado refuses a missing required token shown in the invocation, an unknown option, or a value outside a listed value set; argument-usage failures exit with code 2.