Skip to content

statio.yaml

statio.yaml sits at the root of your repo and describes the containers of one deployment. The parser rejects any field outside this schema, along with YAML anchors, aliases, and a second document.

statio generates the compose file from this. A docker-compose.yml in your repo is ignored.

FieldTypeRequiredNotes
serviceslist of ServiceyesAt least one, at most 20. The server may set a lower max_services.
proxyProxynoColumn 0, never inside a service.
dnsDNSnoColumn 0, never inside a service.
FieldTypeNotes
namestringRequired. Matches ^[a-z][a-z0-9-]{0,30}$: lowercase, digits and dashes, first character a letter, 31 characters max. No underscores.
imagestringOmit it for your own app; the agent injects the verified digest. Set it for a dependency, pinned as repo:tag@sha256:…, from a registry on the server allowlist.
portslist of int or PortThe port your app listens on inside the container. statio allocates the host port. 20 per service max.
envlist of stringKey names only. Each matches ^[A-Z_][A-Z0-9_]{0,127}$.
env_inlinemap of string to stringNon-secret literals, committed. 4096 bytes per value.
healthHealthLoopback probe. A failure rolls the deploy back.
depends_onlist of stringNames of other services in this file.
volumeslist of VolumeDocker-managed named volumes. 20 per service max.
commandlist of stringExec form only. 100 items, 1024 bytes each.
restartstringCompose restart policy.

A bare integer sets the container port and lets statio pick the host port:

ports: [3000]

The long form takes the same fields explicitly:

FieldTypeNotes
containerintThe port inside the container.
hostintDefaults to container. statio owns the host side and publishes on 127.0.0.1 only.
protocolstringDefaults to tcp.
FieldTypeNotes
typestringProbe type.
pathstringMust start with /, 512 characters max.
portintDefaults to the service’s first port.
start_perioddurationDigits plus ms, s, or m.
intervaldurationSame format.
timeoutdurationSame format.
retriesintAttempts before the agent rolls back.
FieldTypeNotes
namestringMatches ^[a-z0-9][a-z0-9_-]{0,40}$. A Docker-managed volume name, never a host path.
pathstringMount point inside the container.
read_onlyboolDefaults to false.
FieldTypeNotes
domainstringRequired to enable the block. Must fall under a suffix the server allows.
upstreamstringForward host. The agent computes this itself; leave it unset.
upstream_portintForward port. The agent computes this itself; leave it unset.
schemestringDefaults to http.
websocketsboolDefaults to false.
http2boolDefaults to false.
hstsboolDefaults to false.
force_httpsboolDefaults to false.
FieldTypeNotes
domainstringRequired to enable the block. The agent writes an A record at your pinned public IP.

privileged, cap_add, network_mode, devices, sysctls, host bind mounts, and every other compose key outside this page. The parser rejects them, which is what stops a deploy from asking for host privileges. See how statio works.

services:
- name: api
ports: [3000]
env: [DATABASE_URL, JWT_SECRET]
env_inline: { NODE_ENV: production }
depends_on: [db]
health: { path: /health, retries: 5 }
- name: db
image: postgres:16@sha256:...
env: [POSTGRES_PASSWORD]
volumes:
- { name: pgdata, path: /var/lib/postgresql/data }
proxy: { domain: api.example.com }
dns: { domain: api.example.com }