Overview
OpenBao is the Linux Foundation’s open-source (MPL-2.0) fork of HashiCorp Vault: an identity-based secrets engine with a Vault-compatible API and CLI, covering KV v2 storage, dynamic secrets, PKI, and transit encryption. This template deploys a single-node OpenBao server with integrated raft storage on a persistent volume set, and auto-unseal so the server comes back on its own after every restart. If you are choosing between catalog templates: OpenBao is the Vault-compatible engine for workloads that need dynamic secrets, PKI, transit, or existing Vault tooling, while Infisical is an application-secrets workflow platform with a team-oriented web UI. The two solve different problems and can be run side by side.Architecture
- OpenBao server — A single
statefulworkload serving the HTTP API and web UI on port8200, configured from a rendered HCL config file. Storage is OpenBao’s integrated raft backend, written to a persistent volume set at/openbao/data. - Auto-unseal — The encryption barrier is unwrapped automatically on every boot in one of three seal modes:
static(a 32-byte key held in a Control Plane secret you create),awskms, orgcpckms. Both KMS modes are keyless — the workload identity reaches the KMS key through a Control Plane cloud account, with no static cloud credentials in the container. - Private by default — External access is off (
publicAccess.enabled: false); the server is reachable only from inside the GVC until you turn it on.
What Gets Created
- Stateful OpenBao Workload — One replica serving the API and UI on port
8200. - Volume Set — Persistent raft storage for all secrets, auth configuration, and cluster state. A final snapshot is retained for 7 days when the volume set is deleted.
- Config Secret — An opaque secret holding the rendered HCL server config, file-mounted into the container.
- Identity & Policy — An identity bound to the workload with
revealon exactly the secrets it mounts. In the KMS seal modes the identity also carries the keyless cloud access used to reach the KMS key.
This template does not create a GVC. You must deploy it into an existing GVC.
Prerequisites
Prerequisites depend on the seal mode you choose. Static seal (the default): create the unseal-key secret before installing. The workload references it by name (seal.static.secretName, default my-openbao-unseal-key) and the deployment wedges until the secret exists. Create it as an opaque secret holding a 32-byte key:
awskms / gcpckms) need a KMS key, a Control Plane cloud account, and a key-scoped grant instead — see Auto-unseal setup. No unseal-key secret is required in these modes.
Install the template using your preferred method:
UI
Browse, install, and manage templates visually
CLI
Manage templates from your terminal
Terraform
Declare templates in your Terraform configurations
Pulumi
Declare templates in your Pulumi programs
Configuration
The defaultvalues.yaml for this template:
OpenBao Server
openbao.image— The official OpenBao image. The template pins2.6.xdeliberately: OpenBao 2.7 moves the KMS auto-unseal mechanisms into external plugins, so a blind bump would break theawskmsandgcpckmsseal modes.openbao.resources— CPU and memory for the server container. The defaults run a single node comfortably; raisemaxMemoryfor large secret sets or heavy PKI use.
Seal and Auto-unseal
seal.type selects exactly one mode, and only that mode’s sub-block is used:
In every mode the server unseals itself on boot with no operator action. In the KMS modes there is no static credential anywhere: the container is issued no cloud access keys, and no unseal key is mounted.
Storage
volumeset.capacity— Initial volume size in GiB (minimum 10). This volume holds the raft store: every secret, auth mount, policy, and the cluster state.
helm upgrade. Uninstalling deletes the volume set (a final snapshot is kept for 7 days), so a reinstall comes up uninitialized.
Access
publicAccess.enabled—falseby default. When set totrue, the API and web UI are served over HTTPS on the automatically assigned*.cpln.appcanonical endpoint. While it isfalse, external requests are rejected at the edge.internalAccess.type— Internal firewall scope of the server workload:
Auto-unseal Setup (KMS Modes)
Skip this section if you are using the defaultstatic seal.
- AWS KMS
- GCP Cloud KMS
Access is keyless: the workload identity federates into your AWS account through a Control Plane cloud account, so no credentials are stored in the container or in your values.No post-install step is needed — the identity carries the policy from the moment it is created, and the server boots ready (uninitialized) as usual.
1
Create or pick a symmetric KMS key
Set
seal.aws.kmsKeyId to the key ARN (an ID or alias also works) and seal.aws.region to the key’s region.2
Set up a Cloud Account
If you do not have one, create an AWS Cloud Account. Set
seal.aws.cloudAccountName to its name.3
Create a scoped IAM policy
Create an IAM policy with the JSON below, replacing the resource with your key ARN, and set
seal.aws.policyName to the policy name.Initializing OpenBao
The server boots reachable but uninitialized — that is the expected state right after install. Initialize it exactly once:bao login <root-token> or through the web UI, create scoped auth (for example userpass or OIDC), then revoke the root token per standard practice.
The bao CLI is present in the container with BAO_ADDR preset, so any cpln workload exec … -- bao … command works without extra flags — for example bao status to check the seal state.
Connecting
External clients use
https:// — the platform edge terminates TLS. Same-GVC clients use plain http:// over the mesh’s mTLS. The canonical hostname appears under status.canonicalEndpoint in cpln workload get {release}-openbao --gvc {gvc} -o yaml.
Because the API is Vault-compatible, existing Vault clients, SDKs, and the vault CLI can talk to this endpoint by pointing their address at it.
Important Notes
- Static mode: the unseal-key secret must exist before install, and it is write-once. A missing secret wedges the deployment; a lost or changed key makes all stored data unrecoverable.
- Run
bao operator initonce after install and save the output — the recovery keys and root token are printed a single time, to your terminal only. - Do not switch
seal.typeafter initialization — changing modes requires an OpenBao seal migration, not a values change. gcpckmsneeds its key grant applied after install — the workload crash-loops oncloudkms.cryptoKeys.getuntil both roles are granted on the key, then recovers on its own.- Private by default — set
publicAccess.enabled: trueto expose the API and web UI on the canonical endpoint. - Data survives restarts and upgrades; uninstall deletes the volume set (a final snapshot is kept for 7 days), and a reinstall starts uninitialized.
- Uninstall does not delete your unseal-key secret — it is your resource, created outside the release, and it stays until you remove it.
- The template deploys a single node — raft runs with one member, so plan maintenance windows around the short restart gap rather than expecting failover.
External References
OpenBao Documentation
Official OpenBao documentation
Seal / Auto-unseal Configuration
Reference for the static, awskms, and gcpckms seal stanzas
Raft Storage
The integrated storage backend this template uses
operator init
The one-time initialization command and its options
OpenBao on GitHub
Source, releases, and issue tracker
OpenBao Template
View the source files, default values, and chart definition