Analytics cookies only (Google Analytics, PostHog). No ad networks, no cross-site tracking. See our privacy policy.
Te
Self-host Temporal
updated Oct 2026deployed by usprices checked · Jul 2026Install verified on Ubuntu 26.04 · Oct 2026 · how we test
We earn commissions when you shop through the links below. Full disclosure →
A durable execution platform: you write workflows as ordinary code with an SDK (Go, Java, Python, TypeScript, .NET and others), and the Temporal Service persists every step of their history so they survive crashes, restarts and long waits, with retries, timers and a web UI to inspect runs. MIT-licensed Go; this install runs the server with PostgreSQL and the UI.
Runs on a VPS from $12/mo (Kamatera 4GB, 4 GB RAM) · prices checked Sep 2026
Our recommendation
Pick Temporal when you have code that must finish even if the machine running it dies: payment flows, provisioning, long-running jobs that wait days for an event. You write the workflow as a function in your language, Temporal records each step in its history so a restarted worker resumes exactly where it stopped, and the UI shows every run. It is code-first and aimed at developers, unlike the catalog's n8n, Activepieces and Node-RED visual builders, and it is a service your workers connect to rather than a tool that runs your tasks for you. It is MIT-licensed, and Temporal Cloud is the hosted option. Our snippet clones the project's `samples-server` repository at a pinned commit and starts its PostgreSQL Compose file with the image versions set to an exact server and UI release. We did not find an upstream RAM minimum for this stack, so our 2 GB floor is an estimate.
What you need
Any VPS with at least 2048 MB of RAM
A domain you control — most self-hosted setups need HTTPS in front of them
The samples-server README and its Compose file flag these before you take it past a local install:
non-negotiableThe README describes these files as a way to run a local instance of the Temporal Server. They use the database user and password temporal/temporal and the development-sql.yaml dynamic config, so treat them as a starting point and not a hardened production setup. For production the project documents other deployment options, such as Kubernetes with Helm; our snippet pins the cloned repo to a commit so the files cannot change under you.
non-negotiableOur snippet makes one edit to upstream's file: it binds the PostgreSQL port to 127.0.0.1, because the file publishes 5432 on every interface with a known password. The setup runs in order: PostgreSQL starts, an admin-tools container creates the schema and exits, the server starts, and a second admin-tools container creates the default namespace; the UI starts last.
non-negotiableThere is no authentication on the frontend (port 7233) or the web UI (8080) in this Compose file; the repo has a separate TLS compose file, and the project documents authorizers and claim mappers for access control. Keep both ports on a private network. Your workers are your own code: the stack runs none, so a workflow does nothing until a worker connects.
non-negotiableThe .env in the repository sets server, admin-tools and UI versions, and we override them on the command line with exact release tags (server and admin-tools 1.32.1, UI 2.57.0); the Docker Hub listing also carries latest and minor-series tags. Upgrade the server one minor at a time, schema first, as the project's upgrade notes require.