Configuration
Boilerhouse binaries are configured via environment variables. Workload, pool, claim, and trigger behavior is configured via Custom Resources (see the respective guide pages).
Environment Variables
See the Environment Variables Reference for the complete list. The most important ones:
All Binaries
KUBECONFIG=/path/to/kubeconfig # required outside the cluster
K8S_NAMESPACE=boilerhouse # namespace for CRDs and Pods (default: boilerhouse)
LOG_LEVEL=info # debug | info | warn | errorWhen running as a Pod inside the cluster, KUBECONFIG is not needed — in-cluster service account credentials are used automatically.
API Server
PORT=3000 # listen port
LISTEN_HOST=127.0.0.1 # bind address
BOILERHOUSE_API_KEY=<string> # optional: enables Bearer-token auth
CORS_ORIGIN=http://localhost:5173 # comma-separated origins for CORSOperator
METRICS_PORT=9464 # Prometheus metrics port
HEALTH_PORT=8081 # health/readiness probe port
LEADER_ELECT=true # set to "false" to disable leader election
WORKLOADS_DIR=/path/to/workloads # required if using image.dockerfile buildsTrigger Gateway
# No extra config — the gateway reads its configuration from BoilerhouseTrigger CRsObservability
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318API Authentication
When BOILERHOUSE_API_KEY is set, all /api/v1/* routes except /api/v1/health and /api/v1/stats require a Bearer token:
curl http://localhost:3000/api/v1/workloads \
-H "Authorization: Bearer your-api-key"The /ws WebSocket endpoint is outside the auth middleware (the dashboard proxy doesn't forward the key). If you need to protect it, run the API behind a reverse proxy that enforces auth at the edge.
If BOILERHOUSE_API_KEY is not set, the API is unauthenticated (suitable for development only).
CORS
Configure allowed origins for the dashboard:
export CORS_ORIGIN=http://localhost:5173,https://dashboard.example.comComma-separated list. * is accepted as a wildcard. When unset, CORS headers are not sent.
Kubernetes Access
All three binaries use sigs.k8s.io/controller-runtime / ctrl.GetConfig() to find a kubeconfig. The lookup order is:
KUBECONFIGenvironment variable~/.kube/config- In-cluster service account (when running as a Pod)
For production, deploy the binaries as Pods with the boilerhouse-operator ServiceAccount bound to the boilerhouse-operator ClusterRole (see config/deploy/operator.yaml).
Workload Configuration
Workloads, pools, claims, and triggers are entirely configured through their Custom Resources:
- Workloads —
BoilerhouseWorkload - Pooling —
BoilerhousePool - Tenants & Claims —
BoilerhouseClaim - Triggers —
BoilerhouseTrigger
The operator does not auto-discover YAML files on disk (the TS version's WORKLOADS_DIR did this). Apply CRs with kubectl apply -f, or use the REST API to create them programmatically. WORKLOADS_DIR on the operator is used only for resolving image.dockerfile paths when building images.