Deployment guide

Apache Seata

Overview

Apache Seata is an open-source distributed transaction solution for microservices. At its centre is the Seata Server, a Transaction Coordinator (TC) that your services register with, so that a single business operation spanning several microservices and databases either commits everywhere or rolls back everywhere. It supports the AT, TCC, SAGA and XA transaction modes.

The SecureAnyCloud image installs Apache Seata 2.6.0 on OpenJDK 25 at /opt/seata. It runs the Transaction Coordinator (seata-server) in standalone, self-contained file-store mode on TCP 8091, with no external database. It also runs the bundled Seata NamingServer, which hosts the web console and registry, behind an nginx reverse proxy on TCP 80. A unique console password is generated on the first boot of every VM, and 24/7 SecureAnyCloud support backs the image.

What you get:

  • The Apache Seata 2.6.0 Transaction Coordinator (seata-server) on OpenJDK 25 at /opt/seata, in standalone file-store mode with no external database.
  • The bundled Seata NamingServer, which hosts the web console and the registry and is bound to loopback 127.0.0.1:8081.
  • An nginx reverse proxy on :80 in front of the web console.
  • The Transaction Coordinator RPC endpoint on :8091, for your microservice clients (TM/RM) to connect to.
  • A per-VM console password (SEATA_CONSOLE_PASSWORD) generated at first boot and stored in a root-only file; the upstream default login is disabled.
  • seata-namingserver.service, seata-server.service and nginx.service as systemd units, enabled and active.
  • 24/7 SecureAnyCloud support.

Prerequisites

You need an active Azure subscription, an SSH key pair, and a VNet plus subnet in the target region. Standard_B2s (2 vCPU / 4 GiB RAM) is a good starting point. Scale up for higher transaction throughput.

In the NSG, allow inbound 22/tcp from your management network and 80/tcp for the web console (front it with TLS for public exposure, see Enabling HTTPS). Also allow 8091/tcp for the Transaction Coordinator from the application subnets whose microservices will register with it.

Step 1 - Deploy from the Azure Marketplace

Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Apache Seata by SecureAnyCloud, and select Create. On Basics, 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 select Review + create, followed by 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:apache-seata-ubuntu-24-04:default:latest
az vm create \
  --resource-group <your-rg> \
  --name seata \
  --image sac1647283583153:apache-seata-ubuntu-24-04: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 seata --port 80 --priority 1010
az vm open-port --resource-group <your-rg> --name seata --port 8091 --priority 1020

Step 3 - Connect to your VM

ssh azureuser@<vm-public-ip>

Step 4 - Confirm the services are running

systemctl is-active seata-namingserver.service seata-server.service nginx.service

All three report active. On first boot the JVM can take 30 to 60 seconds to start fully while it warms up.

ss -tln | grep -E ':80 |:8081 |:8091 '

You should see nginx on :80, the console bound to loopback on 127.0.0.1:8081, and the Transaction Coordinator on :8091:

Step 5 - Retrieve your web console password

A unique console password is generated on the first boot of every VM and written to a root-only file. There is no shared or default login.

sudo cat /root/seata-credentials.txt

The file records the console URL, the console user (seata) and the per-VM password:

Step 6 - Sign in to the web console

Browse to http://<vm-public-ip>/ and sign in as seata with the password from Step 5.

After you sign in, you land on the TransactionInfo view. It lists the global transactions coordinated by the server, and it stays empty until your applications start running transactions:

Step 7 - Verify the Transaction Coordinator is up

The web console health endpoint is unauthenticated and answers through nginx:

curl -s http://127.0.0.1/naming/v1/health
{"code":"200","message":"success","success":true}

To prove that the coordinator itself is up, and not merely that the port is open, sign in and open ClusterManager. Then click View on the default cluster. The console shows the Transaction Coordinator registered as a healthy member on port 8091:

The same fact is available from the console API. Log in for a token, then query the registered cluster:

PW=$(sudo grep '^SEATA_CONSOLE_PASSWORD=' /root/seata-credentials.txt | cut -d= -f2-)
TOKEN=$(curl -s -H 'Content-Type: application/json' -X POST \
  -d "{\"username\":\"seata\",\"password\":\"$PW\"}" \
  http://127.0.0.1/api/v1/auth/login | jq -r .data)
curl -s -H "Authorization: $TOKEN" \
  'http://127.0.0.1/naming/v1/clusters?namespace=public' \
  | jq '.[0].unitData[0].namingInstanceList[0] | {transaction, healthy, role, version}'
{ "transaction": { "host": "10.0.0.10", "port": 8091 }, "healthy": true, "role": "MEMBER", "version": "2.6.0" }

Step 8 - Connect your microservice clients to the coordinator

Your Seata clients (the Transaction Manager and Resource Managers embedded in your microservices) connect directly to the Transaction Coordinator on TCP 8091. With the standalone file registry, point each client at the coordinator's address. For a Spring Boot application, set:

seata: tx-service-group: default_tx_group service: vgroup-mapping: default_tx_group: default grouplist: default: <vm-private-ip>:8091 registry: type: file config: type: file

Open your NSG to allow 8091/tcp from the subnets where those microservices run. When your applications begin coordinating transactions, they appear in the TransactionInfo view. Any held global locks appear under GlobalLockInfo:

Enabling HTTPS

nginx serves the console over plain HTTP on :80. For public exposure, put a certificate in front of it. Point your own DNS name at the VM, then run:

sudo apt-get update && sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d seata.example.com

certbot obtains a certificate, rewrites the nginx site to listen on 443 with a redirect from :80, and installs a renewal timer.

Backup and maintenance

The Transaction Coordinator stores its session/lock state under /opt/seata/current/seata-server/sessionStore (standalone file mode). Service logs are under /var/log/seata. To restart the stack after a configuration change:

sudo systemctl restart seata-namingserver.service seata-server.service

The base image keeps receiving unattended security updates. Scale the VM up for higher transaction throughput. The JVM heaps are tuned for the 4 GiB Standard_B2s.

Support

Every SecureAnyCloud image is backed by 24/7 support. For questions about this deployment, contact us through secureanycloud.com.

Deploy on Azure

Launch Apache Seata Server 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

Deploy on Azure