Overview
Temporal is an open-source (MIT) durable-execution platform — applications write workflows as ordinary code, and the Temporal server guarantees they run to completion, surviving process crashes, restarts, and long waits. This template deploys a single-process Temporal server exposing the gRPC frontend to your workloads, plus the Temporal Web UI, both internal-only, backed by a highly available PostgreSQL cluster by default. Database and schema setup run automatically at boot, including schema migrations on version upgrades.Architecture
- Temporal server — A single-replica standard workload running all four Temporal services (frontend, history, matching, worker) in one process; gRPC frontend on port
7233, internal-only. Stateless by design: all workflow state lives in PostgreSQL. - Temporal Web UI (optional, default on) — A standard workload serving the UI on port
8080, internal-only (the UI has no built-in authentication). - PostgreSQL (HA, default) — The postgres-highly-available template as a subchart: 3× Patroni PostgreSQL, 3× etcd, and a HAProxy leader-routing endpoint Temporal connects through.
- PostgreSQL (dev/lightweight, optional) — The single-instance postgres template instead, for lighter non-HA deployments.
What Gets Created
- Standard Temporal Server Workload — A single replica running all four Temporal services in one process, serving gRPC on port
7233. No volume set — all state lives in the database. - Standard Temporal UI Workload (optional) — The Temporal Web UI on port
8080. - Database Workloads — HA mode: a stateful Patroni PostgreSQL workload, a stateful etcd workload, and a standard HAProxy leader-routing workload. Single mode: one stateful PostgreSQL workload.
- Volume Sets — The database subchart’s persistent volumes (10 GiB per replica by default). Temporal itself has none.
- Secrets — The database credentials from the subchart.
- Identity & Policy — A least-privilege policy granting the server identity
revealon exactly the database credentials secret. The UI workload has no identity — it mounts no secrets. - Cron Backup Workload (optional) — When database backups are enabled.
This template does not create a GVC. You must deploy it into an existing GVC.
Prerequisites
None for a default install. For optional database backups, you need a bucket and access setup for one of the supported providers — see Backing Up. 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
Choosing a Database Mode
Exactly one of the two database modes must be enabled — the chart enforces this at render and fails the install with a clear message otherwise.
A fresh HA-mode install converges in roughly 4–6 minutes — the server waits for the database, then runs full schema setup before it starts listening. Single mode is ready in under 3 minutes.
Configuration
The defaultvalues.yaml for this template:
Temporal Server
image— The upstreamauto-setupimage: at boot it creates thetemporalandtemporal_visibilitydatabases, applies or upgrades the schema, registers thedefaultnamespace, then starts the server — all idempotently, so restarts and upgrades are safe. Image bumps apply new schema migrations automatically at boot.resources— CPU and memory for the server container.historyShards— The cluster’s history shard count. Permanent: fixed at the cluster’s first boot and can never be changed — the server refuses a different value later. Size it before installing; 512 suits most deployments.namespaceRetention— How long closed workflow histories stay queryable in thedefaultnamespace (e.g.72h,96h).
Web UI
ui.enabled— Setfalseto remove the UI workload.ui.image/ui.resources— The Temporal UI container image and its CPU/memory.
Access
Both workloads are internal-only — there is no public-access option in this template. The gRPC frontend serves workers and clients running as workloads in your org.internalAccess.type sets the internal firewall scope for both the gRPC frontend (:7233) and the UI (:8080):
Database
Enable exactly one ofpostgresHA (production, default) or postgres (dev/lightweight) — see Choosing a Database Mode. In both modes, change the database password before installing (postgresHA.postgres.password / postgres.config.password). Temporal is wired to the active database automatically — the HAProxy leader endpoint in HA mode, or the single instance directly in dev mode.
Connecting
Running Workers
Workers run as their own workloads (in the internal access scope) and connect to the gRPC frontend. A minimal Python worker:Python workers must guard their entrypoint with
if __name__ == "__main__": — the Temporal Python SDK’s workflow sandbox re-imports the worker module, and an unguarded module-level main() crashes the worker.Backing Up
Database backups are optional and disabled by default. They cover the Temporal databases — all workflow histories, task queues, timers, and visibility data. Enable them withpostgresHA.backup.enabled or postgres.backup.enabled (matching your database mode), and complete the storage setup for your provider before installing. The values below are shown under backup.* — set them within the enabled database block.
- AWS S3
- Google Cloud Storage
- S3-compatible (MinIO, R2, Wasabi)
1
Create a bucket
Create an S3 bucket. Set
backup.aws.bucket and backup.aws.region to match.2
Set up a Cloud Account
If you do not have one, create a Cloud Account for your AWS account. Set
backup.aws.cloudAccountName to its name.3
Create a bucket-scoped IAM policy
Create an AWS IAM policy with the JSON below (replace
YOUR_BUCKET), then set backup.aws.policyName to the policy’s name:backup.mode selects logical (scheduled pg_dump via a cron workload) or wal-g (continuous WAL archiving). The single-instance mode takes scheduled logical dumps.
Important Notes
- Change the database password (
postgresHA.postgres.password/postgres.config.password) before installing. historyShardsis permanent — the shard count is fixed at the cluster’s first boot and can never be changed; the server refuses a different value later. Size it before installing (512 suits most deployments).- Never expose the Web UI publicly — it has no built-in authentication. To offer browser access from outside the internal scope, put your own authenticating proxy in front of it.
- Temporal connects and runs schema setup as the database superuser provisioned by the PostgreSQL subchart — it needs
CREATE DATABASEand DDL rights at every version upgrade. - Upgrades restart the single server replica and apply schema migrations automatically at boot — expect a brief frontend outage per Helm upgrade; in-flight workflows resume where they left off once the server is back.
- Keep the server at one replica — manually scaling the workload will not form a working cluster (required inter-service ports are not declared and the database connection limit would be exceeded).
- Uninstall deletes the database volume sets — all workflow histories and state. Enable backups if the data matters.
External References
Temporal Documentation
Official Temporal documentation
Self-Hosted Guide
Running and operating a self-hosted Temporal service
SDKs
Writing workflows, activities, and workers in every supported language
Namespaces
Namespaces and workflow-history retention
Web UI Reference
The Temporal Web UI reference
Temporal Template
View the source files, default values, and chart definition