Skip to main content

Hosting topologies

This page describes where and how to host the Navin Platform: on premises servers installed from packages, Kubernetes clusters, the high availability topology, several sites and disaster recovery. Each topology lists what the repository provides and what stays the responsibility of the hosting team.

On premises servers (OS packages)​

TopologyHostsWhen
StandaloneOne server: Navin Manager, agent, platform (API, worker, portal) and local PostgreSQLPilot, small entity, isolated site
ClusterOne Navin Manager host, nodes with the agent navin-manager-agent; the Manager installs the services on the nodesSeveral servers without Kubernetes
Platform with the services of the bankPlatform host with the PostgreSQL, Keycloak, Redis and OpenBao servers that the bank already runsShared infrastructure, central operations

The services listen in plain HTTP (8080, 3300): a TLS reverse proxy of the bank is always in front of them (TLS). The database moves to an external server with navin-platform-db external, with TLS (sslmode=verify-full). Guided installation: OS packages; Manager and nodes: os/install/README.md.

High availability of the services installed by the Navin Manager (PostgreSQL with Patroni and etcd, Redis Sentinel, NATS JetStream R3) is described in navin-manager/docs/availability.en.md, with the measured local failover times and their limits (asynchronous replication: zero loss is measured, not guaranteed).

Kubernetes​

One cluster per environment (dev, staging, prod), each registered in Argo CD with the label eai.io/environment. The namespaces are created by the bootstrap with their Pod Security level:

NamespaceContent
enterprise-aiControl Plane API, worker, portal, LiteLLM, vLLM, Ollama, media workers
eai-sandboxSandboxes of the tools and of the code interpreter (gVisor, Kata)
eai-dataPostgreSQL, Redis, NATS, Qdrant, Temporal, LiveKit
eai-securityKeycloak, OpenFGA, OPA
openbaoOpenBao (raft)
observability, observability-agentsPrometheus, OpenSearch, Jaeger, Opik, ClickHouse, OpenTelemetry Collector, Alloy
apisixAPI gateway
toolhive-system, mcp-<id>ToolHive Operator and the MCP Runtime namespaces

Installation: Kubernetes with Helm.

High availability topology​

Use values-prod.yaml then values-ha.yaml on a cluster with at least three nodes in three zones.

ComponentTopologySource
Control Plane API3 to 20 replicas (HPA), PDB minAvailable: 2, required zone anti affinity, spread over hostnames, 60 s graceful shutdownvalues-prod.yaml, values-ha.yaml
Portal, LiteLLM3 replicas minimum, PDB minAvailable: 2values-prod.yaml, values-ha.yaml
Worker1 active replica per plane, PostgreSQL advisory lock; extra replicas wait for the lockvalues.yaml (worker)
PostgreSQLCloudNativePG, 3 instances, automatic failover, WAL archive to S3deploy/data/postgres/cluster.yaml
NATS JetStream3 replicasdeploy/data/nats/values.yaml
Qdrant3 nodes, 3 shards, 2 replicas per shard: one node may be lostdeploy/data/qdrant/values.yaml, EAI_QDRANT_*
OpenBao3 node raftdeploy/openbao/values.yaml
Temporal3 replicasdeploy/data/temporal/values.yaml
RedisReplication through the operator; the rate limits of APISIX tolerate a transient loss; no backup needed (cache rebuilt from PostgreSQL)deploy/data/redis/values.yaml
vLLMReplicas of one model on distinct GPU nodes with vllm.antiAffinity: required, PodDisruptionBudgetvalues.yaml (vllm)
note

A rendered manifest proves the configuration only (HA_CONFIGURED). A topology is validated (HA_VALIDATED) only after a recorded failover test on a real cluster.

Recovery objectives​

Targets of High availability and disaster recovery:

ScopeRPORTO
PostgreSQL (CloudNativePG, continuous WAL)5 min30 min
WORM audit archive (S3 object lock, replication)0 (synchronous write)1 h
Kubernetes configuration (hourly Velero and GitOps)1 h1 h
Qdrant indexes (daily snapshots, reindex possible)24 h4 h
OpenBao (daily raft snapshot, 3 node raft)24 h1 h
vLLM inference (stateless)not applicable15 min (model from the cache)

Multi-site and disaster recovery​

The repository provides one active site per environment and a recovery site restored from the backups. An active active deployment across several sites is not provided: the Navin Manager marks MULTI_CLUSTER as unsupported.

  1. Several clusters, one Argo CD. A central Argo CD manages several clusters: register each one with argocd cluster add <kube-context> --label eai.io/environment=<env> and add its address to destinations of deploy/argocd/appproject.yaml. The second site receives the same manifests from Git.
  2. Backups outside the site. CloudNativePG archives the WAL and a daily base backup to s3://eai-backups/cnpg (retention 30 days, encrypted). Velero runs eai-platform-daily (volumes, pg_dumpall, Qdrant snapshot, OpenBao raft snapshot hooks, 30 days) and eai-config-hourly (configuration, 7 days). Replicate these buckets and the WORM bucket to the object storage of the recovery site.
  3. Recovery. On the recovery cluster: bootstrap and infra layer, OpenBao restored from its raft snapshot, PostgreSQL restored with a new CloudNativePG Cluster and bootstrap.recovery (point in time with recoveryTarget.targetTime), then velero restore create --from-backup <backup> and the apps layer.
  4. Drill every quarter. Restore into isolated namespaces (deploy/velero/restore-test.yaml, or --namespace-mappings enterprise-ai:enterprise-ai-drill), run GET /v1/audit/verify, record the measured RPO and RTO.
  5. Isolated site. Reinstall from the signed bundle verified offline (Air-gapped installation).
warning

The recovery procedure has been validated offline only (manifests rendered and checked against the pinned schemas). Run the drill on an acceptance cluster before you rely on the objectives above.

Next steps​