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
:80in 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.serviceandnginx.serviceas 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 1020Step 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.serviceAll 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.txtThe 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: fileOpen 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.comcertbot 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.serviceThe 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
Overview
This image runs Apache Seata 2.6.0, 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. Seata supports the AT, TCC, SAGA and XA transaction modes. Apache Seata is licensed under Apache-2.0 and is currently an Apache Incubator project.
What you get: two components, both run under systemd by a dedicated unprivileged seata system account on a headless OpenJDK Java runtime.
- Seata Server (Transaction Coordinator / TC): a headless Netty RPC endpoint on port
8091, running in standalone file-store mode, so it is completely self-contained with no external database to provision. Your microservice clients (transaction managers and resource managers) connect here.
- Seata NamingServer: hosts the login-protected web console and a registry, bound to the loopback interface on port
8081and published only through an nginx reverse proxy on port80. The Transaction Coordinator registers to the local NamingServer so the console can display it as a healthy cluster member.
The console password and the console token signing key are generated on the first boot of every deployed instance, so two instances launched from the same Amazon Machine Image never share a credential. The password is written to /root/seata-credentials.txt with mode 0600 so that only the root user can read it. The upstream console ships with no login configured, so no working default credential ever ships in the image.
Prerequisites
Before you deploy this image you need:
- An Amazon Web Services account where you can launch EC2 instances
- IAM permissions to launch instances, create security groups, and subscribe to AWS Marketplace products
- An EC2 key pair in the target Region for SSH access to the instance
- A VPC and subnet in the target Region, with a security group allowing inbound port
22from your management network, port80for the console front, and port8091from the networks your microservice clients run in
- The AWS CLI (version 2) installed locally if you plan to deploy from the command line
Launch the Instance from the AWS Marketplace
Sign in to the AWS Management Console, open the EC2 service, and select Launch instance. Under Application and OS Images choose AWS Marketplace AMIs and search for Apache Seata. Select the SecureAnyCloud listing and choose Select, then Continue on the subscription summary.
Pick an instance type of m5.large or larger (Seata is a JVM workload). Choose your EC2 key pair under Key pair (login). Under Network settings select your VPC and subnet, and either create or select a security group that opens port 22 from your management network, port 80 for the console front, and port 8091 from the networks your clients use. Leave the root volume at the default size or larger.
Select Launch instance. First-boot initialisation takes approximately one minute after the instance state becomes Running and the status checks pass.
Launch the Instance from the AWS CLI
You can launch the same image from the command line. Replace the values in angle brackets with your subnet, security group and key pair, and use the AMI id from the Marketplace listing for your Region.
aws ec2 run-instances \
--image-id ami-0123456789abcdef0 \
--instance-type m5.large \
--key-name your-key-pair \
--subnet-id subnet-0123456789abcdef0 \
--security-group-ids sg-0123456789abcdef0 \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=apache-seata}]'Connecting to your instance
Connect over SSH using your EC2 key pair. The login user depends on the operating system variant you launched:
OS variant SSH login user
Ubuntu 24.04 ubuntu
ssh -i /path/to/your-key.pem ubuntu@<public-ip>Retrieve the console password
The console password is unique to each instance and is written to a root-only file at first boot. Retrieve it over SSH:
sudo cat /root/seata-credentials.txtThe file contains the console URL, the console user (seata), and the generated SEATA_CONSOLE_PASSWORD, along with the Transaction Coordinator RPC endpoint your clients should use.
Confirm the services are running
All three services are managed by systemd and start on boot. Confirm they are active:
systemctl is-active seata-namingserver.service seata-server.service nginx.serviceConfirm the listeners are in place: nginx on port 80, the console bound to loopback 8081, and the Transaction Coordinator on 8091:
sudo ss -tlnp | grep -E ':(80|8081|8091) 'The unauthenticated console health endpoint returns a JSON success body through nginx:
curl -s http://127.0.0.1/naming/v1/healthSign in to the web console
Browse to http://<public-ip>/ and sign in as seata with the password from /root/seata-credentials.txt. The console is served by nginx from the loopback-bound NamingServer.
After signing in, the TransactionInfo view lets you browse global transactions, global locks and the coordinator cluster, filtered by namespace and cluster. The version (Apache Seata 2.6.0) is shown at the lower left.
Confirm the Transaction Coordinator is registered
Open ClusterManager in the console and query the public namespace and default cluster. The coordinator appears as a healthy member; choose View to see its control and transaction endpoints on port 8091.
You can prove the same thing from the command line. Log in to the console API with the per-instance password to obtain a bearer token, then query the registered coordinators. The Transaction Coordinator is reported as healthy on port 8091:
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 '.'Wire your microservice clients to the coordinator
Your Seata clients (transaction managers and resource managers embedded in your microservices) connect directly to the Transaction Coordinator RPC endpoint on port 8091. This image runs the coordinator in standalone file-store mode, so point your clients at it using the file registry model. A typical Spring Boot client application.yml looks like:
seata: enabled: true tx-service-group: my_tx_group service: vgroup-mapping: my_tx_group: default grouplist: default: <public-ip>:8091 registry: type: file config: type: fileOpen port 8091 in the instance security group to the subnets your application services run in, and annotate the entry point of a distributed operation with @GlobalTransactional. When the operation runs, the global transaction appears in the console TransactionInfo view.
Security hardening
- Restrict inbound access. Open port
80(console front) and port8091(coordinator RPC) only to trusted networks in your security group. The console (8081) is bound to loopback and is never directly reachable off the instance.
- Terminate TLS. Put a TLS-terminating load balancer, or configure TLS on nginx, in front of port
80so console traffic is encrypted. Restrict the coordinator RPC port to private application subnets.
- Rotate credentials. The console password and token signing key are unique per instance. To rotate the console password later, update
console.user.passwordfor the NamingServer and restartseata-namingserver.service.
- Encrypt at rest. Enable AWS EBS encryption on the root volume to protect configuration and transaction state at rest.
- Scale out. For production throughput and durability beyond evaluation, move the coordinator to a database-backed store and run multiple coordinators; contact SecureAnyCloud support for sizing guidance.
Support
SecureAnyCloud provides 24/7 technical support for this Apache Seata image via email and live chat. We assist with deployment, wiring your microservice clients to the coordinator, console and credential administration, TLS termination, and JVM tuning. Contact sales@secureanycloud.com or reach us via live chat. For sizing recommendations, production architecture planning, or any issues including requesting refunds, contact sales@secureanycloud.com.
All product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.
Deploy on AWS
Launch Apache Seata Transaction Coordinator on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com