Skip to main content
Configuration is split between public host settings, Kubernetes or Compose deployment values, and secret values. Keep secrets out of source control and inject them through the platform secret mechanism for your deployment target.

Target and assistant settings

The platform chart keeps target connectivity, assistant behavior, and target-specific installation settings separate: There is intentionally no generic agent section and no AgentV Helm section. Each name identifies one responsibility and one target scope. Production must set targetAgents.agentv.systemd.version to an exact semantic version and releaseBaseUrl to HTTPS. The public default is https://github.com/acornops/agentv/releases/download. An internal mirror must expose the identical v<version>/install-agentv.sh, archive, and checksum layout; mutable labels such as latest are rejected.

Public hosts

Replace example.com with domains you control. The public demo uses https://console.demo.acornops.dev and https://api.demo.acornops.dev. The platform route and the management console route are separate, but both default deployment paths proxy /api to the control plane. The management console uses its own origin for browser session flows so cookies stay same-origin. For Kubernetes, configure these with platform.publicUrl, platform.consoleUrl, exposure.ingress.apiHost, and exposure.ingress.consoleHost. For VM Compose, configure CONTROL_PLANE_BASE_URL, API_HOST, MANAGEMENT_CONSOLE_HOST, MANAGEMENT_CONSOLE_UPSTREAM, and CORS_ORIGIN. Keep TRUST_PROXY=1 when TLS and host headers are handled by the edge proxy.

Required secret keys

The Kubernetes chart defaults to an existing Secret named acornops-platform-secrets. These keys are required for the central platform: Optional secret-backend keys include: Generate unique values for every internal token and encryption key per environment.

Provider credentials

Provider API keys are not configured through OPENAI_API_KEY, ANTHROPIC_API_KEY, or GEMINI_API_KEY deployment variables. Configure them as write-only credentials:
  • per workspace in Workspace Settings → AI, or
  • as an optional platform default in Platform Settings → AI in the platform admin console.
A workspace credential takes precedence over a platform default. APIs and consoles expose only configured status and the effective source (workspace, platform_default, or none); they never return credential plaintext.

Provider routing and API surfaces

Platform operators can route provider traffic through API-compatible endpoints without changing workspace credentials: An empty value uses the provider SDK’s vendor endpoint. Provider SDK-specific environment variables are not part of the AcornOps configuration contract. OpenAI uses the Responses API by default. Select an API-compatible Chat Completions endpoint explicitly with:
  • components.llmGateway.openaiApiSurface=chat_completions on Kubernetes, or
  • LLM_PROVIDER_OPENAI_API_SURFACE=chat_completions with VM Compose.
The gateway never probes or falls back between surfaces. Chat Completions supports normalized text and custom function calls, but it does not support AcornOps provider-native tools or reasoning summaries. Configured Web Search remains visible but unavailable for ordinary target runs. Restore responses to roll back.

Git skill import hosts

Users import a skill by pasting one repository, folder, or SKILL.md URL. Configure the accepted GitHub and GitLab hosts with gitImports.hosts. The chart enables GitHub.com and GitLab.com by default. Setting this array replaces those defaults, so include every host that users should access.
The control plane matches the pasted URL against this allowlist, infers the provider, ref, and subpath, and stores a pinned Markdown snapshot. Requests are anonymous, so repositories must be publicly readable from the control-plane pod. For an internal host, add the destination to networkPolicies.extraEgress.controlPlane using its stable IP or CIDR and HTTPS port. Add organization CA trust when the host does not use a public certificate chain.

Automation runtime

See Automation runtime for rollout order and operational diagnostics. EXTERNAL_INTEGRATION_CLIENTS_JSON stores descriptors such as client id, provider, display name, enabled flag, lowercase SHA-256 token hash, and optional allowedCapabilities. Generate raw bearer tokens out of band and store only their hashes in this Secret value. Raw external integration client tokens do not authorize general control-plane API calls; they are accepted only by the external integration account-link, linked-user bot, and external webhook route connect/status endpoints. allowedCapabilities is an operator-side ceiling for that registered client. If you omit it, AcornOps uses the default external integration ceiling: read_workspace_data, create_sessions, and create_read_only_runs. Users still approve per-workspace grants when they link the external account. Add create_read_write_runs only when the client may request write-capable troubleshooting runs or active read-write/approval-gated Workflows; keep read_workspace_data and create_sessions because run creation depends on them. The same linked integration and client may decide approvals only for troubleshooting runs or Workflow executions it originated, and only after an explicit linked-user confirmation. Browser-created, other-link/client, scheduled, and system-triggered approvals remain denied.

Internal transport TLS

Kubernetes platform installs default to plaintext HTTP between internal platform services. To enable internal HTTPS/mTLS, set internalTransport.tls.enabled=true and provide Kubernetes Secret names under internalTransport.tls.ca.secretName and internalTransport.tls.certificates.*.secretName. The chart accepts only Secret names and key names. It does not accept raw PEM certificate or private key values. Public ingress stays on the control-plane HTTP service port; the chart adds a separate internal mTLS listener for callbacks, JWKS, and the built-in MCP bridge. Kubelet probes use dedicated health ports for services that require mTLS for application traffic. The built-in MCP bridge uses the same run-scoped JWT authorization as other execution-time LLM gateway calls. There is no separate built-in MCP service token to configure.

OIDC

The control plane owns OIDC login and callback handling:
  • Login entrypoint: GET /api/v1/auth/oidc/login?return_to=<management-console-url>
  • Callback entrypoint: GET /api/v1/auth/oidc/callback
  • Logout handoff: GET /api/v1/auth/oidc/logout/start
  • Post-logout callback: GET /api/v1/auth/oidc/logout/callback
For Kubernetes and VM Compose settings that derive the redirect URI from your console URL, register this redirect URI with your provider:
That URL is still served by the control plane through the console host’s /api proxy. If you override userAccess.oidc.redirectUri or OIDC_REDIRECT_URI, register the exact override value instead. Registering only https://api.example.com/api/v1/auth/oidc/callback will fail unless your deployment is configured to use that URL as the OIDC redirect URI. Register this exact post-logout redirect URI when your provider supports RP-initiated logout:
Common OIDC settings: OIDC_PROVIDER_NAME is a stable persisted identity namespace, not only a display label. Do not reuse the same value for an unrelated issuer. AcornOps matches returning identities by that provider namespace and the verified sub claim; it never attaches a previously unseen subject to an existing account based only on an email collision. Such users must sign in with the account’s existing method and explicitly connect SSO when that capability is available. Controlled fixtures and bootstrap deployments can explicitly prelink accounts with OIDC_PRELINKED_IDENTITIES_JSON. Reconciliation runs atomically before the server accepts traffic, is idempotent for the same mapping, and fails startup if an email or provider subject is already mapped differently. It does not weaken admission: every subsequent login is still evaluated against the configured admission policy. Never derive this configuration from email alone; obtain the exact sub from the provider’s administrative data. The former OIDC_REQUIRE_VERIFIED_EMAIL setting has been removed and is rejected at startup. Express that requirement with requireVerifiedEmail: true in the admission policy. Admission rules are combined with AND semantics. You can require a literal email_verified=true, allow exact email domains, and require claims using exists, equals, contains, or intersects. Claim paths are arrays, which keeps nested and namespaced claims unambiguous:
The control plane compares admission claims from the verified ID token and subject-bound UserInfo response without type coercion. A conflicting value fails closed. Admission runs before account creation, identity linking, or session creation. Logout deletes the current AcornOps session before redirecting to the provider. Other AcornOps browser sessions are not revoked. The provider may still treat RP-initiated logout as termination of its broader SSO session; that behavior is provider-dependent. If the provider has no usable end-session endpoint, AcornOps completes local logout and warns that the provider SSO session may remain active. In that case, the next login can authenticate without showing the provider login screen.

Password auth

Password login is enabled by default alongside OIDC, password reset is enabled by default for password-backed accounts, and self-service signup is disabled in production deployment configs. The management console reads GET /api/v1/auth/config and shows only the enabled login methods. Operators can:
  • disable password login with userAccess.password.enabled=false or PASSWORD_AUTH_ENABLED=false,
  • disable password reset with userAccess.password.resetEnabled=false or PASSWORD_RESET_ENABLED=false,
  • allow password in platformSettings.userSignInMethods.allowedMethods and defaultMethods, then manage the effective sign-in methods from the audited Platform Admin settings page. Self-service signup becomes available only when the password email-verification prerequisites are also ready.
Only enable self-service signup in private deployments where account creation has been reviewed. Password reset and self-service password signup use AcornOps auth email delivery. Configure SMTP delivery with email.deliveryMode=smtp, email.from, email.publicBaseUrl, and email.smtp.* Helm values, backed by SMTP_USERNAME and SMTP_PASSWORD in the platform Secret. Password reset defaults:
  • PASSWORD_RESET_TOKEN_TTL_SECONDS: 3600
  • PASSWORD_RESET_REQUEST_WINDOW_SECONDS: 300
Development environments may use EMAIL_DELIVERY_MODE=log. Production rejects log delivery unless EMAIL_DELIVERY_ALLOW_LOG_IN_PRODUCTION=true is set explicitly. When self-service signup is enabled, email verification is required by default. Only private deployments should disable verification with PASSWORD_SIGNUP_ALLOW_UNVERIFIED_EMAIL=true. Development deployments may expose a dev-login endpoint. Do not enable dev-login in production.

Browser sessions

Browser sessions have both an absolute max age and a sliding idle timeout. SESSION_MAX_AGE_SECONDS defaults to 604800 and controls the absolute session lifetime. SESSION_IDLE_TIMEOUT_SECONDS defaults to 86400 and refreshes on active authenticated requests until the absolute max age is reached. SESSION_TTL_SECONDS is still accepted as a legacy fallback for SESSION_MAX_AGE_SECONDS when the newer variable is unset. Keep SESSION_IDLE_TIMEOUT_SECONDS less than or equal to the effective max age.

LLM providers and run limits

The control plane sets default model policy and runtime budgets for runs: The LLM gateway enforces the run-scoped JWT minted by the control plane. It should not infer provider, model, or tool permissions from request body fields alone. Reasoning summaries are workspace opt-in and off by default for each workspace. When enabled in AI Settings, OpenAI, Anthropic, and Gemini may stream short provider-generated summaries while a response is being generated. AcornOps displays summaries only; it does not request or expose raw chain-of-thought, encrypted reasoning items, thinking signatures, or provider-internal reasoning state. Operators can set the deployment policy ceiling with: Summaries are saved in run event history when enabled, so users who reconnect or review a completed run see the same summary trail. Provider and model support varies, and summaries can increase provider latency or billable reasoning/output tokens.

Gateway auth readiness and limits

The LLM gateway validates run-scoped JWTs against the control plane’s JWKS endpoint. Keep JWKS readiness required in production so gateway pods do not accept runtime traffic before they have a fresh signing-key view.

Write confirmations

Write-capable AgentK and AgentV tools require confirmation by default. AgentV’s only built-in write is the separately gated restart_service. The deployment default is controlled by: Clusters can inherit the deployment default or set a per-cluster override. Required confirmations are enforced by the backend runtime before tool execution. Browser chat cards and bot surfaces only submit explicit approve or reject decisions. In the management console, per-cluster write confirmation policy is managed from Cluster Settings.

Workflow and evidence retention

Workflow execution duration, generated-document retention, and complete tool-result artifact limits are deployment-wide. Workflow definitions cannot override them. The Workflow options API returns each effective value as a singleton policy list. Legacy mutation fields remain accepted for compatibility but cannot override deployment configuration.

Audit logging lifecycle

Workspace audit logging is deployment-wide. There is no workspace-level or user-level override. Supported modes are:
  • read_write: persist read and write audit events.
  • write_only: persist only audit events classified as operation: "write".
  • disabled: persist no future workspace audit events.
Retention always runs for persisted rows, even when logging mode is disabled. Audit metadata remains sanitized before persistence, so raw tokens, secrets, message bodies, pod logs, auth headers, and full tool arguments are not stored.

Additional CA trust

Use an additive CA bundle when server-side components must reach OIDC, provider, webhook, MCP, registry, or other HTTPS endpoints signed by an organization-private CA. For Kubernetes, configure one namespace-local reference:
Use secretKeyRef instead when required by your distribution policy. A component-specific reference under components.controlPlane, components.executionEngine, or components.llmGateway replaces the global bundle for that component. For VM Compose, set ADDITIONAL_CA_BUNDLE_SOURCE_PATH to the host PEM bundle used by the trust overlay. Target connectors use their own settings described in Connect a Kubernetes cluster and Connect a Linux VM. Additional CA trust:
  • extends normal public roots,
  • keeps certificate and hostname verification enabled,
  • is separate from internal service mTLS,
  • does not enable verified TLS for Postgres or Redis unless their URLs request it,
  • does not configure container-runtime or OCI registry trust.
The selected Kubernetes resource must exist in the release namespace. Restart affected workloads after bundle changes and rotate roots with an old/new overlap.

MCP egress policy

Remote MCP servers can be installed at workspace scope for Agent and Workflow use, or at exact target scope for one Kubernetes cluster or VM. In production, the gateway should require HTTPS and block private, local, and reserved network targets unless you intentionally allow specific hosts. Use allow-lists for trusted internal MCP endpoints instead of broad private-network access. Remote MCP server publicHeaders are for non-secret metadata only. Credentials belong in secret-backed auth fields, and platform scope headers are reserved. MCP registry policy uses components.llmGateway.catalog. The Official MCP Registry is disabled by default and must be enabled explicitly. Configure internal registries through bootstrapSources, use secretKeyRef for registry credentials, and keep bootstrap routing set to direct. MCP installations select workspace-managed or individual credential ownership and require no deployment-level callback configuration. See MCP registries for complete examples and lifecycle behavior.

Webhooks

Webhook signing secrets are generated per subscription and returned only once at creation time. The control plane stores encrypted webhook secrets and signs deliveries with HMAC-SHA256. Webhook events and delivery jobs are durable in control-plane Postgres. Every control-plane replica can claim work with expiring database leases; Redis is not required for webhook delivery. Delivery remains at least once, so consumers must handle duplicates and verify signatures before processing payloads. The effective per-origin concurrency is the lower of the global worker concurrency and perOriginConcurrency. Claim leases account for the time a full same-origin batch may wait behind that effective limit. The control plane’s delivery deadline covers DNS resolution, connection setup, and the complete response body, so a stalled resolver or streaming peer cannot retain a delivery past its lease budget. Webhook delivery URLs must use HTTPS. Public destinations work by default. Private-address delivery requires an explicit hostname allowlist in addition to any packet-level egress rule: For a private Mattermost bot at mattermost-bot.internal, configure the application-level hostname exactly:
For local or VM Compose, use the equivalent JSON array:
An exact entry matches only that hostname. A leading *. entry matches subdomains, including deeper descendants, but not the bare suffix. The allowlist is additive: public destinations remain available. AcornOps still rejects HTTP, embedded credentials, IP-literal URLs, localhost, metadata services, hard-blocked reserved destinations, mixed allowed/disallowed DNS answers, and redirects. It validates DNS and pins an allowed address before connecting. There is no broad insecure-development webhook switch.