- Built-in defaults.
- The optional YAML file named by
OC_CONFIG_FILE. OC_*environment variables.
Minimal configuration
_FILE, for example OC_AI_API_KEY.
Use direct values for local development and mounted files for production when practical.
Never set both forms of one secret. Remove the bootstrap input after initial setup.
Configuration file
SetOC_CONFIG_FILE to load product-oriented YAML. Plaintext secrets are not accepted in
YAML; reference mounted files instead:
relay.spkiPins (an array), ai.contextWindow, ai.maxOutputTokens,
investigations.workers, and investigations.maxPendingPerOrganization (integers).
session.lifetime is a Go duration such as 12h.
Relative secret paths in YAML are resolved from the configuration file’s directory.
_FILE environment paths remain process-relative. An environment list setting such as
OC_RELAY_SPKI_PINS replaces the entire YAML list.
Applying changes
Configuration and secret files are read once at startup. A file update does not reload a running process. For Compose, recreate the control plane withdocker compose -f deploy/compose/compose.yaml up -d --force-recreate control-plane.
For Helm, ordinary values change the Deployment and trigger rollout. After updating an
existing Secret, run kubectl rollout restart deployment/<release>-opencluster, then
kubectl rollout status deployment/<release>-opencluster. Confirm /readyz and a bounded
Investigation before considering the change complete.
Set OC_LOG_LEVEL to debug, info, warn, or error; the default is info.
Use OC_OTLP_ENDPOINT when exporting traces to a collector.
Local authentication is always available. OIDC is enabled when its issuer, client ID, and
client secret are all configured; a partial OIDC configuration stops startup. Relay is
optional and listens separately from HTTP;
customer Relays initiate outbound connections and pin the configured control-plane key.
OC_SESSION_LIFETIME_SECONDS is deployment-owned and defaults to 43,200 seconds.
Organizations start with 90 days of audit retention and can configure it independently;
browser credential lifetime remains deployment-owned.
Model provider
OSS v0.1 supports deployment-level Anthropic or Z.AI credentials. SetOC_AI_PROVIDER
to anthropic or zai, set OC_AI_MODEL to an exact model identifier accepted by that
provider, and set OC_AI_API_KEY_FILE to the mounted credential file. Organization-level
BYOK is not part of the OSS v0.1 contract.
OpenCluster supplies the exact context and maximum output limits for the shipped model IDs:
claude-sonnet-5, claude-opus-5, claude-haiku-4-5-20251001, and glm-4.7.
Advanced: custom models
For a custom provider model ID, set bothOC_AI_CONTEXT_WINDOW_SIZE and
OC_AI_MAX_OUTPUT_SIZE. These advanced overrides may lower a shipped model’s limits but
cannot exceed its published capacity.
Restart the control plane, wait for /readyz, and run one bounded Investigation. Startup
proves that the file is readable; only a completed Investigation proves that the selected
provider and model satisfy the structured result contract. For authentication, quota,
rate-limit, or unsupported-model errors, correct the provider account or model and start
a new Investigation.
OpenCluster sends bounded Investigation context, Tool summaries, and the structured
result contract. It does not persist or expose model chain-of-thought. Review the
security model and the provider’s retention, regional processing,
and training terms before production use.
Environment reference
The OSS binary uses one mounted AI deployment for every Organization.
Back up retained installation data before replacing a pre-release deployment. This baseline
requires a fresh application database and does not import retained data from an older schema.
The shared HTTP server allows 10 seconds for headers, 30 seconds to read a request,
30 seconds to write a response, and 60 seconds for an idle connection. Restart after a
change, then verify
/healthz, /readyz, sign-in, Organization access, Integration
verification, and one bounded Investigation.
Webhook admission limits
Each control-plane process allows a shared burst of 600 webhook requests and restores 10 requests per second before authentication. This protects both alert and Slack intake; changing an Integration identifier or forwarding header does not create fresh capacity. During overload, alert webhooks receive503 and Slack receives 429; both include
Retry-After.
The budget is process-wide and multiplies across replicas. Integration identifiers and
credentials do not create separate in-memory quotas.
The metrics endpoint exposes oc.webhooks.requests by surface and bounded result,
oc.webhooks.alert_events for newly committed Alert Events, and
oc.webhooks.slack_ack_duration for Slack acknowledgement latency.
OC_MAX_PENDING_INVESTIGATIONS_PER_ORGANIZATION separately bounds the durable pending
Investigation queue; its default is 100. Automatic alert Investigations, manual
Investigations, and Conversation turns share this Organization-wide capacity across
replicas. Claimed Investigations no longer consume pending capacity.
When a model provider is configured, an alert delivery that opens new Incidents must fit all their
automatic Investigations. If the current backlog cannot fit them, the whole delivery is
refused with 503 and Retry-After; a delivery needing more slots than the configured
limit receives permanent 400. Without a model provider, alert intake records Incident state
without reserving Investigation capacity.