Docker Compose
From the repo root:7331 inside the compose network and Caddy exposes HTTP/TLS. The compose file mounts a SQLite volume at /data and reads short-lived bearer grants from /data/tokens.json. If /data/tokens.json does not exist, the Gateway starts with an empty in-memory token set and denies token auth until you mount or write a token store.
Issue a local token grant:
Single Host
Usedeploy/reference/systemd/smithers-gateway.service for the Gateway process and deploy/reference/systemd/smithers-caddy.service for Caddy. Copy smithers-gateway.env.example to /etc/smithers/gateway.env, then set:
SMITHERS_GATEWAY_MODULE can export register(gateway) or a default function. Register workflows there.
Gateway Environment
| Variable | Default | Purpose |
|---|---|---|
PORT | 7331 | Gateway listen port inside the container or host. |
SMITHERS_DB_PATH | /data/smithers.db | SQLite database path made available to the gateway module for workflow storage. |
SMITHERS_TOKEN_STORE | /data/tokens.json | JSON token grant store used by token auth. |
SMITHERS_GATEWAY_MODULE | /workspace/gateway.mjs | Module that registers workflows on startup. |
SMITHERS_GATEWAY_HEARTBEAT_MS | 15000 | WebSocket heartbeat interval. |
SMITHERS_GATEWAY_EVENT_WINDOW | 10000 | Per-run replay window size (number of events) for streamRunEvents. |
SMITHERS_GATEWAY_HEADERS_TIMEOUT_MS | 30000 | Maximum time to receive complete HTTP headers. |
SMITHERS_GATEWAY_REQUEST_TIMEOUT_MS | 60000 | Maximum time to receive and parse a complete HTTP request, including body. |
Kubernetes
The minimal manifests indeploy/reference/k8s/ create:
- a
smithersnamespace - a single Gateway
Deployment - a
ConfigMap(smithers-gateway-config) supplying Gateway environment variables - a SQLite
PersistentVolumeClaim - a token
Secret - a
ServiceandIngress
deploy/reference/k8s/secret.example.yaml to set the bearer token and update the host in deploy/reference/k8s/ingress.yaml before applying:
Event Stream Reconnection
PassafterSeq with the last seen sequence number when reconnecting to a stream. The Gateway then:
- Replays any missed events still within the bounded per-run window.
- Emits a
GapResyncframe (fields:fromSeq,toSeq, run snapshot) if the window has truncated, then resumes with available events. - Sends
Heartbeatframes on a separate interval; these do not carry run events.
X-Smithers-API-Version: v1.