Reference Architecture
The DuoKey on-premise deployment is a highly available (HA), production-grade hybrid architecture. It combines an OpenShift cluster for containerized application workloads with a dedicated VM infrastructure for core data, CI/CD, and secret management — all backed by a comprehensive backup and restore plan.

At a glance: the OpenShift cluster (application workloads), the VM infrastructure (secrets, data, CI/CD), and the backup & restore plan.
The same design as a logical flow:
Office clients reach the OpenShift Ingress Router over 443; it fronts the Cockpit frontend and API, which talk to the data tier, OpenBao, and key custody. ArgoCD deploys the workloads and VictoriaMetrics observes them.
The architecture below describes the recommended reference design. Storage, ingress, and object-store choices can be adapted to your environment (bare metal, VMware, OpenStack, or Nutanix) — your DuoKey representative will help you tailor it.
If your site has no OpenShift/Kubernetes platform, DuoKey also runs on a VM-only topology — the same components on plain virtual machines, with single-site HA behind a load balancer and multi-site HA via a Geo load balancer.
Core components
1. Centralized secrets — external OpenBao
- Standalone isolation — OpenBao (the Linux Foundation's community-driven, open-source fork of Vault) runs externally on dedicated virtual machines, configured in an HA setup with a Raft consensus storage engine.
- Secure auth handshake — the OpenShift cluster runs the External Secrets Operator (ESO). When an application pod starts, ESO authenticates with OpenBao via the Kubernetes Auth Method using the pod's ServiceAccount token.
- Dynamic, non-persistent injection — credentials, database connection
strings, and cache keys are fetched on demand from OpenBao and injected as
native Kubernetes Secret primitives mapped to ephemeral, in-memory (
tmpfs) volumes. No raw secret is ever written to cluster storage or hardcoded into Git.
Key custody defaults to the built-in Software Vault. Where a deployment needs it, you can add the DuoKey MPC KMS — DuoKey's own multi-party-computation cluster (3+ nodes; no single node ever holds a complete key) — or a Securosys HSM for a hardware root of trust. See Prerequisites → Key custody for details.
2. Continuous delivery & source control — GitLab
- Source & registry hub — code repositories, CI pipelines, and custom base container images reside on a self-hosted GitLab instance running on a standalone VM. This can be replaced by GitLab's SaaS offering where policy allows.
3. Persistent database — PostgreSQL cluster
- Database high availability — PostgreSQL runs under a cloud-native database operator (such as CloudNativePG or Patroni), maintaining a primary read-write node and multiple hot-standby replicas.
4. Platform & application orchestration
- OpenShift control plane — leverages built-in OpenShift Operators to manage lifecycle, networking, routing, and platform upgrades automatically.
- Ingress & load balancing — the built-in, highly available OpenShift Ingress Router handles edge traffic, terminates TLS, and load-balances across the frontend pods. Internal routing between the frontend and the API backend uses native headless and ClusterIP Kubernetes Services.
- HA topology — all frontend and backend pods use explicit pod anti-affinity rules, guaranteeing workloads are spread across different worker nodes and separate availability zones (AZs).
- GitOps reconciliation — the in-cluster OpenShift GitOps (ArgoCD) operator continuously tracks branches in GitLab. When application manifests change, ArgoCD detects drift and pushes updates cleanly to the targeted namespaces.
5. Persistent data tier
- Stateful orchestration — database and caching engines are deployed as StatefulSets to preserve network identities and block-device mappings across restarts.
- Storage provider — persistence is provided by OpenShift Data Foundation (ODF) or a CSI driver appropriate to your platform (e.g. OpenStack Cinder, vSphere CSI).
- Cache high availability — Redis is configured as a multi-node sharded cluster with automated master/replica failover.
6. Observability — VictoriaMetrics & VictoriaLogs
- Metrics — lightweight
vmagentinstances scrape performance endpoints and route them to a distributed VictoriaMetrics stack (vmstorage,vminsert,vmselect). - Logs — Vector agents harvest
stdout/stderrand forward them to VictoriaLogs for structured search. - Dashboards — an integrated Grafana connects to both as data sources for operational dashboards.
Request & data flow
A user request is TLS-terminated at the Ingress Router, routed through the frontend to the API, which fetches a short-lived secret from OpenBao and reads or writes PostgreSQL before the response is rendered back.
Network & availability zones
- Application pods are distributed across at least three worker nodes spanning separate availability zones / failure domains.
- The dedicated VM tier (OpenBao, PostgreSQL, GitLab) is segmented onto isolated networks, ideally with a separate, hardened VLAN for any HSM.
- All inter-component traffic is encrypted in transit (TLS); OpenBao is reached only over mutually authenticated channels.
See Prerequisites → Network for the concrete network and firewall requirements.