Skip to content

Server files and anchors

PathWritten byContents
/etc/statio/config.yamlstatio init server, statio init integrationsAgent config, mode 0600, owned by root. Read at boot.
/etc/statio/secrets/the init wizardsThe Tailscale OAuth client, the NPMplus login, the Cloudflare token. Permission-checked at startup.
/etc/statio/services/<app>/statio app add, statio app editOne manifest per accepted app. Read on every deploy.
/var/lib/statio/tsnetthe agentTailscale node state.
/var/lib/statio/ports.jsonthe agentThe host-port registry, one stable port per slot.
/run/statio/<svc>/the agentapp.env and interp.env on tmpfs, mode 0600. Cleared on reboot.
the audit logthe agentOne redacted JSONL record per deploy, read with statio logs.

The agent reads /etc/statio/config.yaml at boot only. After an edit or a wizard run, restart it:

Terminal window
sudo systemctl restart statio-agent

Manifests under /etc/statio/services/ are read per deploy, so statio app edit takes effect on the next push.

statio app add writes these. A deploy is compared against them and can never widen them.

AnchorMeaning
cosign signerOwner, repo, workflow file and branch. Whoever may deploy this app.
image repositoryCompared for equality against the payload’s repository.
registry allowlistWhere dependency images may come from.
proxy domain suffixWhich domains this app may claim on the reverse proxy.
dns domain suffixWhich domains this app may claim in DNS.
upstream allowlistWhich forward targets the proxy may use.
max_servicesA per-app cap below the wire limit of 20.
rollback policyWhat the agent does when health fails.

statio allocates one host port per accepted app from the range 41000 to 48999, records it in ports.json, and keeps it stable across deploys. Ports publish on 127.0.0.1.

A port held by a foreign process answers [port_conflict]. An exhausted range answers [port_exhausted]; free one with sudo statio app rm <app>.

statio init integrations writes these. Both blocks are optional and a deploy works without them.

BlockKeys
NPMplusadmin API URL, login email and password, data-plane mode (loopback or container), shared network name in container mode, insecure_skip_verify for the self-signed admin certificate on loopback
CloudflareAPI token scoped to Zone.DNS:Edit on one zone, the zone, the pinned public IP

The agent forces the DNS record type to A and its target to the pinned public IP, so no event repoints DNS elsewhere.