Deploy DVARA
A reliable DVARA deployment keeps governance on the request path without making its control plane a new source of outages. Start by choosing DVARA Open Source or the Enterprise platform; their dependencies and operating models are different.
This page covers self-managed deployments. For a dedicated environment operated by DVARA, see Choose a deployment.
Choose the topology that matches your distribution
| Topology | Components | Database | Best fit |
|---|---|---|---|
| Open Source distribution | One DVARA LLM Gateway configured by gateway.yaml | None | A team that wants a small, self-managed LLM governance runtime |
| Enterprise platform with Docker Compose | DVARA Gateway, DVARA Flightdeck, and PostgreSQL on one host | Bundled by the example stack, for Flightdeck only | Evaluation, development, and non-HA environments |
| Enterprise platform on Kubernetes | Replicated Gateway and Flightdeck workloads with external PostgreSQL | PostgreSQL 14+ for Flightdeck, that you operate or consume as a managed service | Production and horizontally scaled environments |
The Open Source distribution has no Flightdeck, Enterprise persistence, MCP Gateway, or A2A Gateway. Its configuration is local and takes effect after restart.
The Enterprise platform centralizes configuration, evidence, cost, identity, and operations in Flightdeck.
Prepare an Open Source distribution deployment
The standalone Open Source distribution needs Java 25, a gateway.yaml file, and network
access to each model provider you configure. It does not need PostgreSQL or a
licence.
Before you put it on a shared request path:
- Generate a DVARA API key and store only its SHA-256 fingerprint in the file.
- Set
DVARA_CONFIG_FILEwhen the file is not in the process working directory. - Set
DVARA_AUDIT_FILE_PATHto a durable, writable path if you need audit evidence. When it is unset, audit events are dropped and startup logs a warning. - Set a private
DVARA_AUDIT_HMAC_SECRET. The public development placeholder must not protect production evidence. - Terminate TLS before the Gateway and restrict operational endpoints at the network boundary.
Each replica reads its own startup file. Distribute the same reviewed file to every replica, restart them in a controlled rollout, and give each process its own audit file. The runtime does not coordinate configuration or local audit files across replicas.
Follow Run the Open Source distribution for the build, key-generation, request, and audit-verification workflow.
Prepare an Enterprise platform deployment
The minimum Enterprise topology is the DVARA Gateway, DVARA Flightdeck, and
PostgreSQL 14 or later. The Gateway serves all active planes on port 8080;
Flightdeck serves the Flightdeck on port 8090.
From 1.8.2 only Flightdeck connects to PostgreSQL, and only Flightdeck runs its
migrations. The Gateway has no database: it enrols with Flightdeck, reads its
configuration from a signed bundle Flightdeck publishes over its /internal
channel (port 8443), and spools audit, usage and cost records to its own
volume before shipping them to Flightdeck. See
How the gateway runs without a database.
Prepare these dependencies before installation:
| Requirement | Why it is needed |
|---|---|
| PostgreSQL 14+ | Flightdeck's store for managed configuration, identity, cost, and audit evidence |
| Provider access | Lets the Gateway reach at least one configured model provider |
| Database credentials | For Flightdeck only. From 1.8.2 a Gateway given a database refuses to start |
| Enrolment shared secret | Lets each Gateway enrol with Flightdeck for its /internal certificate; the same value on both, at least 32 characters |
| A volume per Gateway | Holds the Gateway's spool, bundle snapshot and certificate; it must survive a restart |
| Encryption master password | Protects provider credentials stored in encrypted mode |
| Audit HMAC secret | Signs the tamper-evident audit chain when you manage the key material |
| Actuator API key | Protects operational status endpoints |
| A distinct metrics API key | Protects metrics without granting broader operational access |
| DVARA licence | Required for production rights and support; removes the 3-workspace and 100,000-call limits |
The stock Enterprise Gateway image carries the in-process Defender prompt-injection classifier and, from 1.8.1, the optional Phileas scanner. Both are off until you turn them on. Presidio and the HTTP classifiers need services you run or subscribe to. Treat a setting as configuration rather than proof that a detector is present, and check the Gateway startup log for the ones that are actually active.
Do not reuse the actuator key as the metrics key. Both values must match between Flightdeck and the Gateway where the corresponding connection is used.
For a single-host evaluation, use the Docker Compose guide. For production, use the Kubernetes guide and keep secrets in your cluster's secret-management path rather than command history or a checked-in values file.
Design the production boundary
Expose only the surfaces their users need:
- Send application traffic to the Gateway.
/v1/*is the LLM plane;/mcp/*and/a2a/*are the MCP and A2A planes, served with or without a licence. - Put Flightdeck on a separate administrative hostname and apply your normal identity and network-access controls.
- Keep PostgreSQL private. Only Flightdeck connects to it; the Gateway, the browser and calling applications do not.
- Keep Flightdeck's
/internalport (8443) reachable from Gateway pods only. It is a pod-to-Flightdeck channel, not a public API. - Keep
/actuator/health,/actuator/health/liveness,/actuator/health/readiness, and/actuator/infoavailable to platform probes. Other operational endpoints require the appropriate bearer key. - Terminate TLS at the ingress or load balancer and encrypt database connections according to your infrastructure policy.
Use separate provider credentials and DVARA API keys for each environment. A workspace and key name should identify both the application and environment so audit and cost records remain understandable.
Set availability controls deliberately
The Kubernetes chart starts with one Gateway replica, one Flightdeck replica, autoscaling disabled, and disruption budgets disabled. Those defaults make a small evaluation easy; they are not a high-availability claim.
For a production rollout:
- Run at least two Gateway replicas across failure domains.
- Set resource requests and limits from a load test that represents your streaming duration, concurrency, provider latency, and guardrail work.
- Enable autoscaling only after the chosen CPU, memory, or custom signal tracks saturation in that test.
- Add a disruption budget that matches the replica count and availability objective.
- Keep rolling updates at zero unavailable Gateway replicas unless your capacity plan permits an interruption.
- Back up PostgreSQL and test restore, not only backup creation.
The Gateway's startup and readiness probes use
/actuator/health/readiness; its liveness probe uses
/actuator/health/liveness.
Do not replace readiness with a process-only check: a running process that
cannot become ready should not receive new traffic.
Give each Gateway pod a volume, not a database credential
From 1.8.2 Gateway pods hold no database credential. Each pod keeps serving from its last verified bundle during a Flightdeck or PostgreSQL outage, and its records wait in its spool until Flightdeck is back. Up to 1.8.1 Gateway pods connected to PostgreSQL by default; that option was removed.
What each pod needs instead:
- Flightdeck's
/internaladdress and the enrolment secret. The Compose example and the Helm chart set both. - A volume for its spool that survives a restart. The chart's default is an
emptyDir; turn onllmGatewayServer.persistence.enabledfor production. - A termination grace period long enough for the spool to flush on shutdown.
Alert on spool shedding and drain lag; the observability guide lists the shipped signals. A change made in Flightdeck reaches a Gateway in about 10 seconds at the default settings, and a Gateway's records reach Flightdeck in about 30 seconds. Follow How the gateway runs without a database for enrolment, certificates, and failure modes.
Verify the deployment from edge to evidence
First, check the Gateway through the same load balancer or ingress applications will use:
curl --fail --silent https://<dvara-host>/actuator/health
The anonymous response reports the overall result without exposing component details:
{
"status": "UP",
"groups": ["liveness", "readiness"]
}
Next, sign in to Flightdeck and confirm its connection indicator is green. Create a workspace, provider credential, route, and DVARA API key, then send a request through the public Gateway address:
curl --fail --silent https://<dvara-host>/v1/chat/completions \
--header 'Authorization: Bearer <your-dvara-key>' \
--header 'Content-Type: application/json' \
--data '{
"model": "<configured-model>",
"messages": [
{"role": "user", "content": "Confirm the production route is governed."}
]
}'
A successful response is only the first check. In Flightdeck, open
Governance → Audit, select the workspace and GATEWAY_RESPONSE, then
confirm the request's model, status, and latency. The record reaches Flightdeck
when the Gateway's spool drains, so allow about 30 seconds. Finally, restart one Gateway
replica and repeat the request while the rollout is in progress. That verifies
the edge, request path, evidence path, and basic failover together.
Diagnose the first failure before adding complexity
| Symptom | Check first |
|---|---|
| Gateway is live but not ready | Readiness response and Gateway logs; then enrolment with Flightdeck and the last verified bundle |
| Gateway refuses to start and names a setting | A missing Flightdeck address or spool path, or a database setting left on the Gateway |
| Flightdeck shows disconnected | Gateway URL and the matching actuator API key |
| Flightdeck metrics are empty | The distinct metrics API key on both applications |
Request returns 401 | Whether the supplied API key exists, is active, and belongs to the intended workspace |
| Request has no provider route | Provider credential, requested model, and route pattern |
| Audit row is absent | Workspace attribution, and whether the Gateway's spool has drained to Flightdeck (about 30 seconds by default) |
Calls refused with 402 *_cap_exceeded and no licence | The install passed 110,000 governed calls this month; add a licence or wait for the 1st |
Keep the topology simple until the health check, one governed request, and its evidence all work. Add autoscaling, advanced routing, regional placement, and per-pod volumes one change at a time, with the same verification after each.