Deployment
A deliberately minimal install — three containers, ~1GB — ported from upstream’sdocker-compose-postgres.yml to a Swarm stack pinned to debian-1.
| Container | Image | Role |
|---|---|---|
temporal_temporal | temporalio/auto-setup:1.29.1 | All-in-one server (frontend + matching + history + worker in one process), gRPC :7233 |
temporal_postgresql | postgres:16-alpine | Persistence and visibility store |
temporal_ui | temporalio/ui:2.34.0 | Web UI :8080, fronted by Traefik |
- PostgreSQL, not Cassandra (
DB=postgres12). The default auto-setup uses Cassandra, which is overkill here. - No Elasticsearch (
ENABLE_ES=false). Postgres handles visibility (the searchable workflow index) at homelab scale — Elasticsearch would roughly triple the footprint for nothing.
auto-setup process is the right altitude for one homelab.
Networking
The server and UI join the sharedswarm overlay; the server and Postgres also share a private temporal-net overlay. Agent workers connect to the gRPC frontend at temporal:7233 over the swarm overlay — any stack on it can dial through (verified from the Mastra container). The UI talks to the same frontend internally and is exposed at temporal.augustin.ai via Traefik, with TEMPORAL_CORS_ORIGINS set so browser API calls are accepted.
temporal-net is intentionally not --attachable, so ad-hoc CLI containers must attach to swarm instead.
Management
Thetemporal CLI ships inside the server image — no standalone admin-tools container runs (keeping it to three). Exec into the running task:
default namespace is created automatically on first boot. Postgres credentials live in temporal/.env.
Status
Up and serving — frontendSERVING, UI loads, default namespace registered. The next step is pointing agent workers (Mastra, the coding frameworks) at temporal:7233 and building the first durable agent workflow.