Skip to main content

System overview

Written by Aron Day

Every 3B deployment — from the single-server quick start to a production Kubernetes cluster — runs the same set of components. This page describes what they are, how traffic reaches them, and the properties of the platform they run on.

Components

Component

Kind

Purpose

nginx

Deployment

The front door. Serves all inbound traffic and routes each request to the right service by hostname and path. Optionally terminates TLS.

api

Deployment

The application server: the UI bundle, the API, sign-in, and workflow editing.

orchestrator

Deployment

Schedules and coordinates workflow executions.

worker

Deployment

Executes workflow steps. Runs untrusted automation code inside gVisor sandboxes via its sandboxd sidecar.

public

Deployment

Serves the addresses 3B shares externally — webhooks and public links.

zero-sync

Deployment

The real-time sync service (Zero). The UI holds a persistent websocket to it and receives data and updates as they happen, instead of polling the API.

postgres

StatefulSet

The database: spaces, workflows, users, and run history. Can be replaced with an external Postgres.

blobstore

StatefulSet

File storage: attachments and the blob store. Can be replaced with S3 Supported Storage.

migration

Job

A one-time database migration job that runs on every install and upgrade, before the application services start.

How traffic flows

3B is reached through four external URLs — UI, API, public, and Zero sync. All of them are served by nginx, which routes by hostname and path:

DNS → load balancer (TLS) → nginx → api / zero-sync / public

Because the chart ships its own nginx reverse proxy, no ingress controller is required — all you need in front of 3B is a load balancer (or, on a single server, DNS pointing straight at the host). See connectivity requirements for the URL, DNS, and port details.

Sandboxing

3B runs untrusted automation code inside gVisor sandboxes with per-job isolation. This is a defining property of the platform and drives its infrastructure requirements:

  • Nodes must be x86_64 (amd64) Linux. Arm and other architectures are not supported.

  • The api and worker pods run with hostUsers: false, so the node must support user namespaces: containerd 2.x, a recent kernel, and the user.max_user_namespaces sysctl set to a non-zero value. Some hardened node images ship with this disabled; the deployment guides cover verifying and enabling it.

Storage

Postgres and the blobstore each claim a persistent volume through the cluster’s default StorageClass. Both are sensitive to disk latency, so use SSD-backed storage. The database can instead be external (for example AWS RDS); it must have logical replication enabled (wal_level=logical), which Zero sync requires.

Identity

A built-in identity provider is enabled by default, so a fresh install is immediately usable — open the UI and create the first account. SSO via SAML and OIDC is supported for connecting your own identity provider.

Did this answer your question?