Temporal
Overview
Temporal is an open-source durable execution engine. Your application defines Workflows and Activities and runs them against the Temporal server. The server persists every execution's full event history, so work survives process and host failures and resumes exactly where it left off, with no bespoke retry, queue or state-machine code.
This SecureAnyCloud image ships the MIT-licensed Temporal server and its MIT-licensed Web UI, backed by a bundled PostgreSQL. It runs the officially supported way, as upstream containers orchestrated by Docker Compose under systemd and fronted by nginx. All images are pinned by digest and captured into the VM, so your instance starts in seconds.
Temporal's open-source Web UI has no built-in authentication. SecureAnyCloud fronts it with nginx HTTP Basic Auth, using a unique password created for each VM on first boot, before the port is reachable. The Temporal frontend and the bundled PostgreSQL are bound to the loopback interface only.
Temporal is a trademark of Temporal Technologies Inc. This image is produced by SecureAnyCloud and is not affiliated with, endorsed by, or sponsored by Temporal Technologies Inc. It ships only the MIT-licensed open-source Temporal server and Web UI.
What you get:
- Temporal server 1.31.2 (the MIT-licensed engine: frontend, history, matching and worker services), pinned by image digest
- Temporal Web UI 2.52.1 (namespaces, workflows, event history and schedules), pinned by image digest
- A bundled PostgreSQL 16 database, pinned by image digest, reachable only inside a private Docker network and never published to a host port
- Docker Engine (Docker CE) with the Temporal frontend and Web UI published to the loopback interface only, fronted by nginx on port
80 temporal.service,temporal-firstboot.serviceandnginx.serviceas systemd units, enabled and active on boot- A unique Web UI password (nginx HTTP Basic Auth, bcrypt) and a unique PostgreSQL password created per VM on first boot and never baked into the image
- A clean, freshly initialized database and a preregistered
defaultnamespace on first boot: no default login, no shipped secret, no prior data - 24/7 SecureAnyCloud support
Prerequisites
You need an active Azure subscription, an SSH key pair, and a VNet and subnet in the target region.
Standard_B2s (2 vCPU / 4 GiB RAM) is a sensible starting point. Increase the size for heavier workloads.
For NSG inbound rules, allow 22/tcp from your management network. Allow 80/tcp (and 443/tcp once you add TLS) for the Web UI. The Web UI serves plain HTTP on port 80. In production, put it behind TLS with your own domain (see Step 10).
Step 1 - Deploy from the Azure Marketplace
Sign in to the Azure Portal, choose Create a resource and search the Marketplace for Temporal by SecureAnyCloud. Select Create.
On the Basics tab, pick your subscription, resource group, region and size. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22) and HTTP (80). Then choose Review + create and Create.
Step 2 - Deploy from the Azure CLI
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:temporal:default:latest
az vm create \
--resource-group <your-rg> \
--name temporal \
--image sac1647283583153:temporal:default:latest \
--size Standard_B2s \
--admin-username azureuser \
--ssh-key-values ~/.ssh/id_ed25519.pub \
--vnet-name <your-vnet> --subnet <your-subnet> \
--public-ip-sku Standard
az vm open-port --resource-group <your-rg> --name temporal --port 80 --priority 1010Step 3 - Connect to your VM
ssh azureuser@<vm-public-ip>Step 4 - Confirm the services are running
On first boot, the image creates a unique Web UI password and database password. It initializes a clean PostgreSQL database, applies the Temporal schema, registers the default namespace and starts the stack. Confirm that the systemd services are active:
systemctl is-active docker temporal nginxAll three services report active. The public liveness endpoint returns 200 with no credentials. The Temporal frontend and the bundled PostgreSQL stay bound to the loopback interface only:
curl -s -o /dev/null -w 'health: HTTP %{http_code}\n' http://127.0.0.1/healthzThe full stack runs as containers under one Docker Compose project: the server, the Web UI, the admin tools and the bundled PostgreSQL.
Step 5 - Secure by default: the Web UI password gates everything
Temporal's open-source Web UI has no built-in authentication, so SecureAnyCloud fronts it with nginx HTTP Basic Auth. nginx rejects any request to the Web UI or its API that lacks the exact per-VM credential with 401. Confirm it yourself. This request sends no credential:
curl -s -o /dev/null -w 'no credential: HTTP %{http_code}\n' http://127.0.0.1/api/v1/namespacesIt returns HTTP 401. Guessable defaults such as admin:admin are rejected too. Your unique credential authenticates and returns 200. The block below reads the password from the notes file, so it never appears on screen:
P=$(sudo grep '^TEMPORAL_UI_PASSWORD=' /root/temporal-notes.txt | cut -d= -f2-)
curl -s -o /dev/null -w 'authorized: HTTP %{http_code}\n' -u "admin:$P" http://127.0.0.1/api/v1/namespacesYour unique Web UI user and password are written to /root/temporal-notes.txt, which only root can read:
sudo stat -c '%a %U:%G' /root/temporal-notes.txtIt reports 600 root:root. To view the notes, which include the Web UI user, the Web UI password and the URL, run:
sudo cat /root/temporal-notes.txtStep 6 - Open the Temporal Web UI
Browse to http://<vm-public-ip>/. Your browser prompts for the Basic Auth credential. Enter the user admin and the password from /root/temporal-notes.txt. The Web UI opens on the workflows list for the default namespace, showing every running and closed workflow execution.
Select any workflow to open its detail page. It shows the workflow's status, input and result, the full event history, and a timeline of the activities it ran. This history makes execution durable. Temporal persists it to PostgreSQL and replays it to resume a workflow exactly where it left off.
The Namespaces page lists the namespaces on the server. A namespace is an isolation boundary for your workflows. The image registers a default namespace for you on first boot.
Step 7 - Run and inspect workflows
Point your Temporal SDK workers and clients at the frontend on port 7233. It is bound to the loopback interface, so reach it over an SSH tunnel or your own private network.
The bundled temporal command line, available through the admin tools container, lists and describes executions. For example, to list recent workflows in the default namespace, run:
docker compose -f /etc/temporal-appliance/compose.yaml exec temporal-admin-tools \
temporal workflow list --namespace defaultEach row shows the workflow's status, id, type and start time. This is durable, queryable execution state served from PostgreSQL.
Step 8 - Schedules
The Schedules page manages recurring workflows. A schedule runs a workflow on an interval or a calendar spec and records each run. You can drive nightly jobs and periodic pipelines without an external cron.
Step 9 - Rotate the Web UI password
The Web UI password is your access key. To set your own, rewrite the Basic Auth file, then reload nginx:
sudo htpasswd -B /etc/nginx/temporal.htpasswd admin
sudo systemctl reload nginxStep 10 - Production: your own domain with TLS
In production, front the Web UI with your own domain and TLS. Point a DNS record at the VM public IP. Install a certificate with your preferred tool (for example Certbot with the nginx plugin), then reload nginx.
Once TLS is in place, restrict inbound access in your NSG to 443/tcp (and 22/tcp from your management network). Keep the Web UI credential confidential, because it grants full access to your namespaces, workflows and their inputs and results.
Support
SecureAnyCloud supports this image 24/7. For help with deployment or configuration, contact support through secureanycloud.com.
Deploy on Azure
Launch Temporal on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
Temporal is an open-source durable execution engine. Your application defines Workflows and Activities in your own code and runs them against the Temporal server. The server persists every execution's full event history, so work survives process and host failures and resumes exactly where it left off, with no bespoke retry, queue or state-machine code.
This SecureAnyCloud AMI ships the MIT-licensed Temporal server and its MIT-licensed Web UI, backed by a bundled PostgreSQL. It runs the officially supported way, as upstream containers orchestrated by Docker Compose under systemd and fronted by nginx. All images are pinned by digest and captured into the AMI, so your instance starts in seconds.
Temporal's open-source Web UI has no built-in authentication. SecureAnyCloud fronts it with nginx HTTP Basic Auth, using a unique password created for each instance on first boot, before the port is reachable. The Temporal frontend and the bundled PostgreSQL are bound to the loopback interface only.
Temporal is a trademark of Temporal Technologies Inc. This image is produced by SecureAnyCloud and is not affiliated with, endorsed by, or sponsored by Temporal Technologies Inc. It ships only the MIT-licensed open-source Temporal server and Web UI.
What you get:
- Temporal server 1.31.2 (the MIT-licensed engine: frontend, history, matching and worker services), pinned by image digest
- Temporal Web UI 2.52.1 (namespaces, workflows and event history), pinned by image digest
- A bundled PostgreSQL 16 database, pinned by image digest, reachable only inside a private Docker network and never published to a host port
- Docker Engine (Docker CE) with the Temporal frontend and Web UI published to the loopback interface only, fronted by nginx on port
80 temporal.service,temporal-firstboot.serviceandnginx.serviceas systemd units, enabled and active on boot- A unique Web UI password (nginx HTTP Basic Auth, bcrypt) and a unique PostgreSQL password created per instance on first boot and never baked into the image
- A clean, freshly initialized database and a pre-registered
defaultnamespace on first boot: no default login, no shipped secret, no prior data - 24/7 SecureAnyCloud support
Connecting to your instance
Connect over SSH on port 22 as the default login user for the AMI variant you launched. Use the private key of the EC2 key pair you selected at launch.
AMI variant SSH login user Connect
Temporal on Ubuntu 24.04 ubuntu ssh -i <your-key.pem> ubuntu@<instance-public-ip>
Prerequisites
You need an AWS account, an EC2 key pair in the launch region, and a VPC subnet.
m5.large (2 vCPU / 8 GiB RAM) is a sensible starting point. Increase the instance size for heavier workloads.
For security group inbound rules, allow 22/tcp from your management network. Allow 80/tcp (and 443/tcp once you add TLS) for the Web UI. The Web UI serves plain HTTP on port 80. In production, put it behind TLS with your own domain (see Step 8).
Step 1 - Launch the instance
Subscribe to the listing in AWS Marketplace and choose Launch. Pick your instance type, VPC subnet and EC2 key pair. In the security group, allow SSH (22) from your management network and HTTP (80) for the Web UI. Then launch the instance.
Step 2 - Connect to your instance
ssh -i <your-key.pem> ubuntu@<instance-public-ip>Step 3 - Confirm the services are running
On first boot, the image creates a unique Web UI password and database password. It initializes a clean PostgreSQL database, applies the Temporal schema, registers the default namespace and starts the stack. Confirm that the systemd services are active:
systemctl is-active docker temporal nginxAll three services report active. The public liveness endpoint returns 200 with no credentials. The Temporal frontend and the bundled PostgreSQL stay bound to the loopback interface only:
curl -s -o /dev/null -w 'health: HTTP %{http_code}\n' http://127.0.0.1/healthzStep 4 - Secure by default: the Web UI password gates everything
Temporal's open-source Web UI has no built-in authentication, so SecureAnyCloud fronts it with nginx HTTP Basic Auth. nginx rejects any request to the Web UI or its API that lacks the exact per-instance credential with 401. Confirm it yourself. This request sends no credential:
curl -s -o /dev/null -w 'no credential: HTTP %{http_code}\n' http://127.0.0.1/api/v1/namespacesIt returns HTTP 401. Guessable defaults such as admin:admin are rejected too. Your unique credential authenticates and returns 200. The block below reads the password from the notes file, so it never appears on screen:
P=$(sudo grep '^TEMPORAL_UI_PASSWORD=' /root/temporal-notes.txt | cut -d= -f2-)
curl -s -o /dev/null -w 'authorized: HTTP %{http_code}\n' -u "admin:$P" http://127.0.0.1/api/v1/namespacesYour unique Web UI user and password are written to /root/temporal-notes.txt, which only root can read:
sudo stat -c '%a %U:%G' /root/temporal-notes.txtIt reports 600 root:root. To view the notes, which include the Web UI user, the Web UI password and the URL, run:
sudo cat /root/temporal-notes.txtStep 5 - Open the Temporal Web UI
Browse to http://<instance-public-ip>/. Your browser prompts for the Basic Auth credential. Enter the user admin and the password from /root/temporal-notes.txt. The Web UI opens on the workflows list for the default namespace, showing every running and closed workflow execution.
Select any workflow to open its detail page. It shows the workflow's status, start and end times, duration, run id, workflow type, task queue, history size and the full event history. This history makes execution durable. Temporal persists it to PostgreSQL and replays it to resume a workflow exactly where it left off.
The Namespaces page lists the namespaces on the server. A namespace is an isolation boundary for your workflows. The image registers a default namespace for you on first boot.
Step 6 - Run and inspect workflows
Point your Temporal SDK workers and clients at the frontend on port 7233. It is bound to the loopback interface, so reach it over an SSH tunnel or your own private network.
The bundled temporal command line, available through the admin tools container, lists and describes executions. For example, to list recent workflows in the default namespace, run:
docker compose -f /etc/temporal-appliance/compose.yaml exec temporal-admin-tools \
temporal workflow list --namespace defaultEach row shows the workflow's status, id, type and start time. This is durable, queryable execution state served from PostgreSQL.
Step 7 - Rotate the Web UI password
The Web UI password is your access key. To set your own, rewrite the Basic Auth file, then reload nginx:
sudo htpasswd -B /etc/nginx/temporal.htpasswd admin
sudo systemctl reload nginxStep 8 - Production: your own domain with TLS
In production, front the Web UI with your own domain and TLS. Point a DNS record at the instance public IP. Install a certificate with your preferred tool (for example Certbot with the nginx plugin), then reload nginx.
Once TLS is in place, restrict inbound access in your security group to 443/tcp (and 22/tcp from your management network). Keep the Web UI credential confidential, because it grants full access to your namespaces, workflows and their inputs and results.
Support
SecureAnyCloud supports this image 24/7. For help with deployment or configuration, contact support through secureanycloud.com.
Deploy on AWS
Launch Temporal on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com