Skip to main content

Configuration readiness

The server checks its deployment settings at startup, under the production profile. GET /api/admin/configuration-readiness returns those facts and the checks that need runtime state. The readiness card of the instance admin overview shows them. The endpoint requires the app_admin authority. It is available only after the checks that can prevent startup pass. Diagnostics never contain configured values.

The chart sets each setting from your values and the release Secret (Configuration reference).

Each fact has a stable id, the configuration subject, the runtime roles, a requirement, a status, an explanation and a link to its section on this page. The requirement is REQUIRED, RECOMMENDED, or OPTIONAL.

StatusMeaning
SATISFIEDThe check passed.
ACTION_REQUIREDThe check failed. A required deployment fact with this status prevents startup.
NOT_CONFIGUREDAn optional setting is absent.
NOT_APPLICABLEThe check does not apply to this server, for example an agent check without sandbox.enabled.
Fact idRequirementSection
runtime.rolesRequiredServer role
database.url, database.username, database.passwordRequiredDatabase
security.credential-encryption, security.value-encryptionRequiredCredential encryption
external.base-url, external.api-originRequiredExternal URL
webhook.shared-secret, webhook.routing-secretRequiredWebhooks
auth.state-cookie-key, auth.login-providerRequiredLogin
llm.proxy-egressRequired with sandbox.enabledLLM proxy
agent.image-contractRequired with sandbox.enabledAgent image
notification.emailOptionalEmail

Server role​

runtime.roles checks that the server role is on. The chart always turns it on. sandbox.enabled turns on reviews, conversation turns and their sandboxes (Reviews and conversation turns).

Database​

database.url checks that DATABASE_URL is a PostgreSQL URL. The production profile adds the jdbc: prefix. database.username and database.password check that both values are not empty. Spring Boot and Liquibase check the connection and the migration separately. An options parameter in DATABASE_URL replaces the 10-second lock wait limit of the server's connections.

A remote database requires TLS, and production startup refuses a plaintext remote connection. The chart always connects with sslmode=verify-full, which encrypts the connection and verifies the server identity.

Credential encryption​

CAUTION: Preserve encryption keys

Do not change the general encryption key on an existing installation. Rotate the credential key with the documented online procedure.

security.credential-encryption checks HEPHAESTUS_SECURITY_CREDENTIAL_ENCRYPTION_KEY, which encrypts stored integration credentials. security.value-encryption checks HEPHAESTUS_SECURITY_ENCRYPTION_KEY, which seals JWT signing keys and other encrypted values. Each key must be exactly 32 printable, non-space ASCII characters. Keep both keys with the backup set, in separate storage with separate credentials (Keep the required keys outside the cluster).

External URL​

external.base-url checks hephaestus.host-url, and external.api-origin checks hephaestus.auth.issuer. Each must be a root HTTPS origin, with no credentials, query, fragment, or path other than /. Provider webhooks and the Slack callback use the issuer. The chart sets both from host.

Webhooks​

webhook.shared-secret checks WEBHOOK_SECRET. It needs at least 32 printable, non-space ASCII characters. Never reuse another application key.

webhook.routing-secret checks WEBHOOK_ROUTING_SECRET, also on a deployment without GitLab. GitLab group hooks and Outline subscriptions use it. It needs at least 32 printable, non-space ASCII characters, and must differ from WEBHOOK_SECRET.

Login​

auth.state-cookie-key checks HEPHAESTUS_AUTH_STATE_COOKIE_KEY, a Base64-encoded 32-byte key that seals the OAuth state. auth.login-provider checks that at least one GitHub or GitLab sign-in provider is enabled in the provider catalog of the instance. Environment provider entries only seed the catalog. Slack and Outline only link accounts, so they do not satisfy this check.

Recent sign-in for sensitive actions​

These actions require a sign-in from the last few minutes:

  • Change an account's role.
  • Force an account out of all its sessions.
  • View as a user.
  • Change a login provider.
  • Register an LLM connection.
  • Link an identity.

That window is 5 minutes. The confirmation uses a provider that is already connected to the account. It is not multi-factor authentication: enforce MFA at the provider. The server does not replay a refused action, so the user submits it again after the confirmation.

Session deadlines​

The access cookie lasts 24 hours. While a tab is active, the browser renews it about every hour. After the cookie expires, the user must sign in. A session ends after 7 days, whatever the activity. Renewal never moves a session past that deadline. Revocation and account suspension deny access before either deadline.

Tokens stay in HttpOnly, Secure, host-only, SameSite=Lax cookies, never in local storage. An account can hold parallel sessions, one for each browser or installed client. An instance admin can end every session of one account with Force sign out, or block the account. To end every session on the instance, see End every session on the instance. For shared computers or sensitive deployments, require MFA at the identity provider.

LLM proxy​

llm.proxy-egress checks that HEPHAESTUS_LLM_EGRESS_ALLOW_LOOPBACK is false on a server with sandbox.enabled. Provider credentials and models are runtime settings in the database, not deployment settings (AI providers).

Agent image​

agent.image-contract checks, on a server with sandbox.enabled, that HEPHAESTUS_AGENT_IMAGE_REQUIRE_DIGEST is on and that HEPHAESTUS_AGENT_IMAGE_REFERENCE is pinned by its SHA-256 digest. The chart sets both from the release (Release image lock).

Email​

Email is optional. notification.email is NOT_CONFIGURED until spring.mail.host names a relay. It is ACTION_REQUIRED if a relay is set but hephaestus.email.from is blank. Every notification is then withheld and recorded as NOT_CONFIGURED. This fact never prevents startup.

Integration settings → Email gives the configuration and the test. Before you turn on email, complete the processing review in the processor checklist.