|
| 1 | +--- |
| 2 | +title: Configuration readiness |
| 3 | +--- |
| 4 | + |
| 5 | +# Configuration readiness |
| 6 | + |
| 7 | +The production profile validates deployment settings during startup. The server-role endpoint |
| 8 | +`GET /api/admin/configuration-readiness` returns those facts plus checks that need runtime state. It |
| 9 | +requires the `app_admin` authority and is available only when boot-fatal checks pass. Diagnostics |
| 10 | +never contain configured values. |
| 11 | + |
| 12 | +The table names variables inside the application container. In the supported self-host stack, |
| 13 | +Compose maps `POSTGRES_PASSWORD` to `DATABASE_PASSWORD` and owns the runtime-role values. |
| 14 | + |
| 15 | +| Setting | Application environment variable | |
| 16 | +| --- | --- | |
| 17 | +| `spring.datasource.url` | `DATABASE_URL` | |
| 18 | +| `spring.datasource.username` | `DATABASE_USERNAME` | |
| 19 | +| `spring.datasource.password` | `DATABASE_PASSWORD` | |
| 20 | +| `hephaestus.runtime.server.enabled` | `HEPHAESTUS_RUNTIME_SERVER_ENABLED` | |
| 21 | +| `hephaestus.runtime.worker.enabled` | `HEPHAESTUS_RUNTIME_WORKER_ENABLED` | |
| 22 | +| `hephaestus.runtime.webhook.enabled` | `HEPHAESTUS_RUNTIME_WEBHOOK_ENABLED` | |
| 23 | +| `hephaestus.host-url` | `APPLICATION_HOST_URL` | |
| 24 | +| `hephaestus.security.encryption-key` | `HEPHAESTUS_SECURITY_ENCRYPTION_KEY` | |
| 25 | +| `hephaestus.webhook.secret` | `WEBHOOK_SECRET` | |
| 26 | +| `hephaestus.sync.nats.enabled` | `NATS_ENABLED` | |
| 27 | +| `hephaestus.sync.nats.server` | `NATS_SERVER` | |
| 28 | +| `hephaestus.auth.state-cookie-key` | `HEPHAESTUS_AUTH_STATE_COOKIE_KEY` | |
| 29 | +| `hephaestus.llm.egress.allow-loopback` | `HEPHAESTUS_LLM_EGRESS_ALLOW_LOOPBACK` | |
| 30 | +| `hephaestus.agent.image.require-digest` | `HEPHAESTUS_AGENT_IMAGE_REQUIRE_DIGEST` | |
| 31 | +| `hephaestus.agent.image.reference` | `HEPHAESTUS_AGENT_IMAGE_REFERENCE` | |
| 32 | +| `hephaestus.sandbox.container-runtime` | `SANDBOX_CONTAINER_RUNTIME` | |
| 33 | +| `hephaestus.sentry.dsn` | `SENTRY_DSN` | |
| 34 | + |
| 35 | +## Runtime roles {#runtime-roles} |
| 36 | + |
| 37 | +Enable at least one of `hephaestus.runtime.server.enabled`, `worker.enabled`, or `webhook.enabled`; |
| 38 | +each accepts only `true` or `false`. |
| 39 | +The supported split topology enables only webhook on the webhook process, only worker on a remote |
| 40 | +worker, and server (optionally with a colocated worker) on the application process. |
| 41 | + |
| 42 | +## Database {#database} |
| 43 | + |
| 44 | +Every role uses PostgreSQL. `DATABASE_URL` must be a PostgreSQL URL; the production profile adds the |
| 45 | +`jdbc:` prefix. Supply a non-empty username and password. This syntax check does not replace the |
| 46 | +connection and migration health checks performed by Spring Boot and Liquibase. |
| 47 | + |
| 48 | +## Credential encryption {#credential-encryption} |
| 49 | + |
| 50 | +Set `hephaestus.security.encryption-key` to exactly 32 printable, non-space ASCII characters and keep it |
| 51 | +with the database backup. The supported self-host setup generates it with `openssl rand -hex 16`. Do |
| 52 | +not change it on an existing installation. |
| 53 | + |
| 54 | +## External URL {#external-url} |
| 55 | + |
| 56 | +Set `hephaestus.host-url` to the public HTTPS origin, without credentials, a path other than `/`, a |
| 57 | +query, or a fragment. |
| 58 | + |
| 59 | +## Webhooks {#webhooks} |
| 60 | + |
| 61 | +Server and webhook roles require `hephaestus.webhook.secret` with at least 32 printable, non-space ASCII |
| 62 | +characters. The supported self-host setup generates an independent value; never reuse another |
| 63 | +application key. |
| 64 | + |
| 65 | +## NATS {#nats} |
| 66 | + |
| 67 | +Server and webhook roles require NATS and an explicit `nats://` or `tls://` URI with a host, an optional |
| 68 | +valid port, and no query, fragment, or non-root path. A worker-only process must disable NATS because |
| 69 | +its job queue is PostgreSQL-backed. This check validates syntax and role consistency, not |
| 70 | +authentication, connectivity, or JetStream health. |
| 71 | + |
| 72 | +## Login {#login} |
| 73 | + |
| 74 | +The server role requires a Base64-encoded 32-byte `hephaestus.auth.state-cookie-key` and an enabled |
| 75 | +GitHub or GitLab sign-in provider in the database-backed provider catalogue. Environment provider |
| 76 | +entries are seeds, not the readiness authority. Slack and Outline are link-only providers and do not |
| 77 | +satisfy sign-in readiness. Worker and webhook roles do not load login providers. |
| 78 | + |
| 79 | +## LLM proxy {#llm-proxy} |
| 80 | + |
| 81 | +Worker roles must leave `hephaestus.llm.egress.allow-loopback=false`. Provider credentials and model |
| 82 | +configuration are database-backed runtime configuration and are not deployment settings. |
| 83 | + |
| 84 | +## Agent image {#agent-image} |
| 85 | + |
| 86 | +Worker roles require digest enforcement and a SHA-256-pinned `hephaestus.agent.image.reference`. See |
| 87 | +[Agent image digests](./agent-image-digests.md). |
| 88 | + |
| 89 | +## Sandbox isolation {#sandbox-isolation} |
| 90 | + |
| 91 | +Set `SANDBOX_CONTAINER_RUNTIME=runsc` on workers after |
| 92 | +[installing and configuring gVisor](https://gvisor.dev/docs/user_guide/install/) on the host. This |
| 93 | +recommendation is non-fatal. |
| 94 | + |
| 95 | +## Optional observability {#optional-observability} |
| 96 | + |
| 97 | +Sentry is optional. When configured, `hephaestus.sentry.dsn` must use HTTPS. The fact is classified |
| 98 | +`OPTIONAL` and never prevents startup. |
0 commit comments