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