Skip to main content
The control plane serves a JSON API on http://127.0.0.1:7878. Every path also works under /api/, which is what the dashboard uses.

Authentication

Send the token from /etc/russel/env as a bearer token on every request:
Over the network, reach the API through HTTPS or an SSH tunnel (TLS reverse proxy).

Endpoints

{id} is the service’s service.name.

Request bodies

POST /deploy
Any other field is rejected with 422. Ports, env, and runtime come from the Russelfile only. POST /vm/{id}/update: {"refresh": true} builds the latest commit; {} rebuilds the running one. repo_url and config_path switch to another source and imply refresh. All fields are optional. POST /vm/{id}/rollback: {"version": 3} for a specific deployment, or {} for the previous one. Starts the deployment’s recorded build again; add "rebuild": true to build its commit from source instead. Returns 409 when that deployment has neither.

Progress stream

/deploy, /update, and /rollback respond with one JSON object per line (NDJSON) while they work:
The last line is either Complete (with status deployed, unchanged, or rolled_back) or an error:
Read the stream as it arrives (curl -N). A proxy in front must not buffer it. If 4 deploys are already running, /deploy returns 503; retry later.

Status

GET /vm/{id}/status returns the service’s status (deployed, failed, stopped, …), runtime, host and app ports, uptime, the Traefik host name if it has one (route_host), and restarts since the last deploy (left out when zero).

Examples

russel secrets set is simpler for secrets and does the same thing.