This is the first of four pages that expand Deploy to production: once the reference topology and the sidecar boundaries are decided, this page is every credential and secret the deployment must supply — the inventory, then authentication, project-level authorization, LLM, Git, and cloud-engine credentials in turn.
Secrets inventory
Keep the variable names; replace the .env files with your platform’s
secret injection. Every value below is a secret or credential.
| Secret | Consumed by | Variable(s) | Notes |
|---|---|---|---|
LLM provider credentials |
Core |
Provider-specific: |
Names per provider in
LLM providers and models.
Checked at boot for most providers — but not for all of them, and
|
IaC bearer token |
Core and IaC sidecar |
|
Must match on both sides. |
Notifications bearer token |
Core and notifications sidecar |
|
When enabled. |
Mapping bearer token |
Core and mapping sidecar |
|
When enabled. |
Authorization bearer token |
Core and authorization sidecar |
|
When enabled. |
Git credentials |
Core |
|
One token for every session: a service account with the minimum permissions to push branches and open and merge pull requests on the repositories in scope. |
Database URL |
Core |
|
Embeds the password. |
Redis URL |
Core |
|
When Redis needs a password or lives outside the cluster network. |
Object-storage credentials |
Core |
|
Variable names can be changed through |
Cloud credentials for the engine |
IaC sidecar |
|
Read by the providers, not by Kumoss. They must also cover the state
backend — Kumoss’s bucket by default, when the rendered backend block
carries no static keys, or the repository’s own if you set
|
Slack webhook URL |
Notifications sidecar |
|
Anyone holding it can post to the channel. |
Phoenix database URL |
Phoenix |
|
Phoenix’s own setting. |
Rules: generate tokens with a cryptographic generator, one per sidecar;
rotate on a schedule and immediately on suspicion; never put a secret
in config.yaml, in an image, or in a log; make mounted credential
files readable by uid 10001.
Authentication (OIDC)
Mandatory. Follow Enable authentication for your identity provider. In summary:
-
Register a public single-page-application client using the authorization code flow with PKCE. No client secret exists.
-
Register
<origin>/auth/callbackas the redirect URI and<origin>as the post-logout URI, where<origin>is your TLS origin. -
Set
oidc.issuer_url,oidc.client_id, and, for Auth0 and Okta,oidc.audience. Rebuild or remount the configuration. -
Bootstrap the first administrator:
admin.default_root_emailworks when the access token carriesemailandemail_verified: true(Keycloak); for Entra ID, Auth0, and Okta, run the documented SQL grant after the user’s first login. -
Manage every other user from the admin panel’s Users tab. New users arrive as
developerwith no panel role.
The core validates tokens against the issuer’s JWKS on every request and needs outbound access to the issuer’s discovery and JWKS endpoints. Access-token lifetime at the identity provider is the revocation latency: a user disabled at the identity provider keeps access until their access token expires (Kumoss has no user-disable switch of its own). Role changes made in the admin panel take effect on the user’s next request, because roles are read from the database on every request.
Project-level authorization
Decide whether users may operate on any cloud project their credentials
reach, or whether Kumoss must ask your entitlement system first. In the
second case, implement the authorization contract as described in
Authorization
(optional, must be replaced if enabled) and enable services.authz.
Remember that this check runs in the wizard’s preflight; the IaC
sidecar’s cloud identity is what ultimately bounds what can be changed.
LLM credentials
Choose the provider and models in config.yaml and supply the
credentials as secrets to the core. Read
Startup
credential validation and its limits: some providers are not validated
at boot, and custom variable
names in llm.model_list still require the provider’s default
variables to be present. Every prompt, including repository file
contents the agent reads, is sent to the provider; choose an endpoint
and data-handling terms accordingly. The core needs outbound HTTPS to
the provider.
Git credentials
GIT_USER and GIT_TOKEN are written to ~/.git-credentials inside
the core container at boot and used for every push, pull-request
creation, and merge. Use a dedicated service account, restrict the
token to the repositories Kumoss may change, and set git.provider to
the matching host (GITHUB, AZURE_DEVOPS, or GITLAB). The core
needs outbound HTTPS to the Git host, and HTTPS is the only transport:
repository URLs must be https:// — SSH (git@host:path, ssh://),
git://, http://, file:// and local paths are rejected with 422,
so mounted SSH keys are never used. Repository URLs entered by users
must not embed a password or token (https://user:<secret>@host/…,
and https://user:@host/… too); the API rejects those with 422. A
bare userinfo username is accepted and kept as typed, so the <org>@
prefix that the Azure DevOps portal’s clone URL carries can be pasted
as-is — but git then looks up the stored credential under that
username, so it must match GIT_USER or authentication fails at clone
time.
Supported hosts. The pull-request adapters target the public SaaS
hosts only: github.com, gitlab.com (top-level namespace and
project; subgroups are rejected), and dev.azure.com. GitHub Enterprise
Server, self-managed GitLab, and *.visualstudio.com URLs are not
supported today and fail at pull-request time with Malformed
repository URL. Pull-request creation and merge always use the REST
API over HTTPS with GIT_TOKEN.
Error messages. Every failure to reach or read the repository —
git ls-remote when a URL is entered, the default-branch and
branch-existence lookups, and clones — answers the fixed message
"Repository is not reachable or access was denied.". Git’s own output,
which can name internal hosts, addresses or proxy errors, is written
only to the core log.
Cloud credentials for the IaC engine
Separate from the LLM and storage credentials. Give the IaC sidecar an identity that can read and change exactly the resources Kumoss manages, per cloud:
| Cloud | Recommended | Static alternative in the sample file |
|---|---|---|
Azure |
Workload identity federation or managed identity for the |
|
Google Cloud |
Workload identity |
|
AWS |
IAM role for the pod or instance |
|
Oracle Cloud, Kubernetes |
The provider’s own mechanisms (configuration file, instance principals, mounted kubeconfig) |
none in the sample |
That identity covers the resources. The state backend is a second
grant on a different resource and must be satisfied on the same
sidecar: init authenticates to the state store before any provider is
configured, so an identity that can create infrastructure but cannot
read state fails at the first command. The two often share variables —
an s3 backend and the aws provider both read
AWS_ACCESS_KEY_ID — but the state store commonly lives in another
account, subscription, or project, and some backends read variables the
providers ignore (ARM_ACCESS_KEY, ARM_SAS_TOKEN,
GOOGLE_BACKEND_CREDENTIALS) precisely so the identities can differ.
Minimums for both:
Terraform providers; the
rationale:
Two
sets of credentials on the sidecar.
The apply step runs with -auto-approve against the plan a human
reviewed; there is no second confirmation inside the engine. The human
gates are the pull-request review, the session lock, and the explicit
apply action
(Comparing the operating
modes).