EQTY LabDocs

Control Plane Configuration

Chart values, environment variables, and startup validation for the Control Plane.

View as Markdown

The Control Plane is configured through the gateway-stack values of the platform chart, under gateway-stack.controlPlane. This page describes the chart values operators set, the environment variables the service reads outside the chart, and the checks it runs at startup.

Required Configuration Areas

  • Gateway database connection, the same PostgreSQL database the LLM Gateway uses.
  • Registration token secret and issuer, plus agent registration turned on in the LLM Gateway with a credential signer. Once registration is on, the chart gives the gateway the same secret and issuer, so it accepts the tokens the Control Plane mints. Without it, the gateway answers a valid token with 404 registration_unavailable. Outside the chart, set LLM_GATEWAY_AGENT_REGISTRATION_ENABLED, LLM_GATEWAY_REGISTRATION_TOKEN_SECRET, LLM_GATEWAY_REGISTRATION_TOKEN_ISSUER, and LLM_GATEWAY_CREDENTIAL_SIGNER_SEED on the gateway.
  • Authentication with Auth Service bearer mode, so Guardian users and API keys are accepted.
  • Guardian adapter connections to Auth Service and Integrity Service, for the project-scoped routes Guardian uses.
  • Plugin artifact storage, plugin signer keys, and the plugin secrets key, before publishing plugins.

Chart Values

The platform chart already turns on the Guardian adapter and bearer authentication in Auth Service mode, and points the adapter at the release’s Auth Service and Integrity Service. Set authentication on yourself: with bearer authentication on and authentication off, the Control Plane refuses to start.

yaml
gateway-stack:
  enabled: true
  llmGateway:
    registration:
      enabled: true
      credentialSigner:
        existingSecret: "guardian-gateway-credential-signer" # holds seed
  controlPlane:
    apiBasePath: "/api"
    auth:
      enabled: true
      existingSecret: "guardian-control-plane-auth" # holds registrationTokenSecret
  ingress:
    enabled: true
    controlPlanePath: "/api"
    hosts:
      controlPlane: "control-plane.example.com"
ValueDefaultNotes
apiBasePathnoneSet it to match ingress.controlPlanePath, /api in the standard deployment.
auth.enabledfalseMust be true in the platform chart.
auth.existingSecret / auth.registrationTokenSecretchange-meA Secret with the registration token secret, or the secret inline. The chart refuses to render while it is change-me.
auth.registrationTokenIssuercontrol-plane
auth.allowedEmailDomainsnone; any domain
auth.bearer.enabled / auth.bearer.modetrue / auth_service in the platformSet by the platform chart.
adapter.enabledtrue in the platformSet by the platform chart.
adapter.authServiceBaseURL, integrityBaseURLthe release’s servicesOverride only when a service runs elsewhere.
adapter.httpTimeout / integrityHTTPTimeout5s
adapter.projectRuntimeReadTimeout30s
adapter.integrityStatusCacheTTL5mHow often stored credential statuses are re-checked.
adapter.trustedMembershipIssuerDIDs / trustedComplianceIssuerDIDsnoneCompliance issuers default to the membership issuers. They decide which agent certifications are trusted too.
plugins.artifactStorage.provider / bucket / prefixnonegcs, s3, azure, or file. The bucket is required once a provider is set. Give the gateway the same settings in llmGateway.plugins.artifactStorage.
plugins.artifactStorage.s3.region / existingSecretnoneRequired for s3.
plugins.artifactStorage.gcs.existingSecretnoneA Secret with a service account JSON. Without it, grant access through serviceAccount.annotations.
plugins.artifactStorage.azure.accountName / existingSecret / useManagedIdentitynoneFor azure, the bucket is the container. Use exactly one of a Secret with an account key or connection string, or managed identity.
plugins.artifactStorage.file.existingClaimnoneFor file, a ReadWriteMany claim mounted at the bucket path, which must be absolute.
plugins.publisherSigner.keyID / existingSecretnoneThe Secret holds the Ed25519 seed the Control Plane signs uploads with.
plugins.trustedSignerKeysnoneMap of key ID to did:key. Give the gateway the same keys in llmGateway.plugins.trustedSignerKeys.
plugins.secrets.encryptionKey.existingSecretnoneUse the same Secret for llmGateway.plugins.secrets.encryptionKey.
virusTotal.enabled / existingSecretfalse / noneThe Secret holds the VirusTotal API key.
waitForRegistryViews.enabledtrueOn a first install, holds startup until the LLM Gateway has created the registry views. It does not wait on upgrades.
llmGateway.registration.enabledfalseMust be true for the gateway to accept registration tokens.
llmGateway.registration.credentialSigner.existingSecretnoneThe Secret holds the Ed25519 seed the gateway signs registration credentials with. Required with registration on.

Environment Variables

Outside the chart, the Control Plane reads these variables. Every name starts with CONTROL_PLANE_, left out below. The service also reads a TOML file named by -config or CONTROL_PLANE_CONFIG_FILE, and accepts a command-line flag for most settings. A flag overrides its environment variable, which overrides the file.

CategoryVariableDefault
ServerLISTEN:10010
ServerDB_DSNnone, required
ServerAPI_BASE_PATHnone
ServerCORS_ALLOW_ALLtrue
ServerSERVICE_VERSIONnone; reported as dev
AuthenticationAUTH_ENABLEDfalse
AuthenticationAUTH_REGISTRATION_TOKEN_SECRETnone; required when authentication is enabled
AuthenticationAUTH_REGISTRATION_TOKEN_ISSUERcontrol-plane
AuthenticationAUTH_ALLOWED_EMAIL_DOMAINSnone; any domain
AuthenticationAUTH_BEARER_ENABLEDfalse; required when authentication is on
AuthenticationAUTH_BEARER_MODEoidc
AuthenticationAUTH_BEARER_AUTH_SERVICE_BASE_URLADAPTER_AUTH_SERVICE_BASE_URL
AuthenticationAUTH_BEARER_ISSUER_URL / AUTH_BEARER_CLIENT_IDnone; required in oidc mode
AuthenticationAUTH_BEARER_SCOPESopenid,profile,email
GuardianADAPTER_AUTH_ENABLEDfalse
GuardianADAPTER_AUTH_SERVICE_BASE_URLnone; required when the adapter is enabled
GuardianADAPTER_HTTP_TIMEOUT10s
GuardianADAPTER_PROJECT_RUNTIME_READ_TIMEOUT30s
IntegrityADAPTER_INTEGRITY_BASE_URLnone; status refreshes are off without it
IntegrityADAPTER_INTEGRITY_HTTP_TIMEOUT10s
IntegrityADAPTER_INTEGRITY_STATUS_CACHE_TTL5m
IntegrityADAPTER_TRUSTED_MEMBERSHIP_ISSUER_DIDSnone
IntegrityADAPTER_TRUSTED_COMPLIANCE_ISSUER_DIDSthe membership issuers
IntegrityADAPTER_ALLOW_EMBEDDED_CREDENTIAL_BOOTSTRAPfalse
PluginsPLUGIN_TRUSTED_SIGNER_KEYSnone
PluginsPLUGIN_PUBLISHER_SIGNER_KEY_ID / PLUGIN_PUBLISHER_SIGNER_SEED_FILEnone
PluginsPLUGIN_SECRETS_ENCRYPTION_KEYnone
PluginsPLUGIN_ARTIFACT_STORAGE_PROVIDERnone
PluginsPLUGIN_ARTIFACT_STORAGE_BUCKETnone; required when a provider is set
PluginsPLUGIN_ARTIFACT_STORAGE_PREFIXnone
PluginsPLUGIN_ARTIFACT_STORAGE_MAX_UPLOAD_BYTES536870912 (512 MiB)
PluginsPLUGIN_ARTIFACT_STORAGE_GCS_CREDENTIALS_FILE / PLUGIN_ARTIFACT_STORAGE_GCS_KMS_KEY_NAMEApplication Default Credentials; none
PluginsPLUGIN_ARTIFACT_STORAGE_S3_ENDPOINT / PLUGIN_ARTIFACT_STORAGE_S3_REGIONnone; region required for s3
PluginsPLUGIN_ARTIFACT_STORAGE_S3_ACCESS_KEY_ID / PLUGIN_ARTIFACT_STORAGE_S3_SECRET_ACCESS_KEYnone; required for s3
PluginsPLUGIN_ARTIFACT_STORAGE_S3_FORCE_PATH_STYLEfalse
PluginsPLUGIN_ARTIFACT_STORAGE_AZURE_ACCOUNT_NAME / PLUGIN_ARTIFACT_STORAGE_AZURE_ENDPOINTnone
PluginsPLUGIN_ARTIFACT_STORAGE_AZURE_ACCOUNT_KEY / PLUGIN_ARTIFACT_STORAGE_AZURE_CONNECTION_STRINGnone
PluginsPLUGIN_ARTIFACT_STORAGE_AZURE_USE_MANAGED_IDENTITYfalse
VirusTotalVT_ENABLED / VT_API_KEYfalse; none

Lists such as email domains, scopes, and issuer DIDs are comma-separated; their command-line flags are singular and repeatable, and VT_API_KEY has no flag. PLUGIN_TRUSTED_SIGNER_KEYS is a comma-separated list of key_id=public_key pairs, where the public key may be a did:key.

ADAPTER_TRUSTED_COMPLIANCE_ISSUER_DIDS lists the issuers whose project compliance credentials and agent certifications the Control Plane trusts. Setting it replaces the fallback to ADAPTER_TRUSTED_MEMBERSHIP_ISSUER_DIDS, so keep every issuer you trust in it. For agent certification it must include the platform signing DID; see Agent Certification.

PLUGIN_ARTIFACT_STORAGE_PROVIDER accepts gcs, s3, azure, or file. Leave it unset and plugin artifacts cannot be uploaded. With file, the bucket is a folder path that both the Control Plane and the gateway can reach. Azure needs exactly one of a connection string, an account key, or managed identity, and an endpoint override cannot be combined with a connection string.

The LLM Gateway must use the same artifact storage and Auth Service URL as the Control Plane, and the same registration token secret and issuer, plugin trusted signer keys, and plugin secrets key; see LLM Gateway Configuration. Outside the chart, set these four on both services:

Control PlaneLLM Gateway
AUTH_REGISTRATION_TOKEN_SECRETLLM_GATEWAY_REGISTRATION_TOKEN_SECRET
AUTH_REGISTRATION_TOKEN_ISSUERLLM_GATEWAY_REGISTRATION_TOKEN_ISSUER
PLUGIN_TRUSTED_SIGNER_KEYSLLM_GATEWAY_PLUGIN_TRUSTED_SIGNER_KEYS
PLUGIN_SECRETS_ENCRYPTION_KEYLLM_GATEWAY_PLUGIN_SECRETS_ENCRYPTION_KEY

When the publisher signer is configured, the Control Plane signs the plugin artifacts and configurations an admin uploads unsigned, and adds its own key to the trusted signer keys. The gateway must trust the same public key. Without a publisher signer, uploads must carry their own signature, which guardian-plugin publish does not add. The plugin secrets key is 32 bytes in base64, base64url, or hex.

VirusTotal scanning runs only when VT_ENABLED is true and VT_API_KEY is set.

API Base Path

With a base path such as /api, the spec at /api/openapi.json and the API explorer at /api/docs/ are served only under the prefix. Every other route, including /health, answers both with and without it. A base path must start with /.

Startup Validation

The Control Plane refuses to start when its configuration is inconsistent, and logs invalid config: followed by the setting at fault, in flag form:

  • Bearer authentication requires authentication, and authentication requires bearer authentication and a registration token secret.
  • Auth Service mode requires an Auth Service URL, from either AUTH_BEARER_AUTH_SERVICE_BASE_URL or ADAPTER_AUTH_SERVICE_BASE_URL. OIDC mode requires an issuer URL, a client ID, and at least one scope.
  • The Guardian adapter requires the Auth Service URL.
  • Timeouts and the maximum upload size must be above zero.
  • Artifact storage needs a bucket once a provider is set, a region and credentials for s3, and an account name for Azure unless a connection string is set.
  • The publisher signer needs both its key ID and its seed file.

An unknown storage provider, an unreadable signer seed, or an unreachable database also stops startup, with its own log line.

Keep secrets such as the registration token secret, the plugin secrets key, and storage credentials in the deployment’s secret management system, not in values files.