Deployment guide

PlantUML Server

Overview

PlantUML Server is a browser-based rendering server for PlantUML, the open source diagram-as-code language. This AMI from SecureAnyCloud runs it on AWS behind HTTPS and a per-instance login. You type or paste plain-text diagram source into the editor, and it renders live as a UML diagram (sequence, class, activity, state, component, use-case, deployment and more). You can export the result as SVG, PNG or ASCII. The server also exposes a stateless HTTP rendering API: an encoded diagram in the URL returns the rendered image, so wikis, documentation sites and editors can embed always-current diagrams generated from text in source control. PlantUML Server is released under the GPL-3.0 licence.

PlantUML Server has no built-in authentication of its own, so this image never exposes it directly. The server is bound to loopback only (127.0.0.1:8080) and fronted by nginx on port 443 over HTTPS with HTTP Basic Auth, so the renderer is never reachable without a credential. At first boot, plantuml-firstboot.service generates a unique per-instance Basic Auth password and a per-instance self-signed TLS certificate. No default login is baked into the image. The service then reloads nginx, runs an authenticated render round trip as a check, and writes the password to /root/plantuml-server-credentials.txt (mode 0600, root only). The renderer also runs with the INTERNET security profile, which blocks local-file includes and requests to internal or loopback network addresses, so it cannot be used to reach instance metadata or internal services.

What you get:

  • PlantUML Server v1.2026.6, run from the maintainer's official pinned distribution (digest-verified). It bundles the diagram engine and Graphviz, so class, activity, state and component diagrams render without extra setup.
  • The plantuml.service systemd unit, which runs the server bound to the loopback interface only and restarts it automatically on failure.
  • The plantuml-firstboot.service systemd oneshot, which generates the per-instance HTTP Basic Auth password and TLS certificate, reloads nginx, runs an authenticated render round trip and writes /root/plantuml-server-credentials.txt.
  • nginx on port 443 (HTTPS) reverse proxying to the loopback-bound PlantUML listener, with HTTP Basic Auth and an unauthenticated /healthz for load balancer probes. Port 80 serves the same health endpoint and redirects everything else to HTTPS.
  • The INTERNET renderer security profile, which blocks local-file includes and internal or loopback network fetches (SSRF hardening).
  • A dedicated EBS data volume mounted at /var/lib/plantuml for the appliance's container store and logs, which you can resize independently of the OS disk.
  • Ubuntu 24.04 LTS base with the latest security patches.
  • 24/7 SecureAnyCloud support with a 24-hour response SLA.

Connecting to your instance

Connect over SSH on port 22 as the default login user for your AMI variant, using the EC2 key pair you selected at launch:

  • Ubuntu 24.04: SSH login user ubuntu
ssh -i /path/to/your-key.pem ubuntu@<vm-ip>

Prerequisites

  • An AWS account subscribed to this listing.
  • An EC2 key pair for SSH access.
  • A Security Group that allows inbound TCP 22 (SSH), TCP 80 and TCP 443 (the web editor and rendering API) from your address.
  • An instance type of m5.large (recommended). Larger instances render bigger diagrams faster.
1

Launch from the AWS Console

  • Open the listing in the AWS Marketplace and choose Continue to Subscribe, then Continue to Configuration and Continue to Launch.
  • Select your instance type, VPC, subnet, key pair and a Security Group that allows inbound ports 22, 80 and 443.
  • Launch the instance, then wait a minute or two for the first boot to generate the per-instance credential and certificate.
2

Launch from the AWS CLI

aws ec2 run-instances \
  --image-id <ami-id-from-listing> \
  --instance-type m5.large \
  --key-name your-key \
  --security-group-ids sg-xxxxxxxx \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=plantuml-server}]'
3

Verify the services are running

PlantUML Server runs from a pinned container supervised by systemd, behind nginx. All three services should report active:

systemctl is-active docker plantuml nginx
active active active
4

Inspect the runtime and listeners

The PlantUML container publishes only to the loopback interface on port 8080. Only nginx (ports 80 and 443) is exposed to the network:

sudo docker ps --format '{{.Image}} {{.Status}} {{.Ports}}'
sudo ss -Htlnp | awk '{print $4}' | sort -u
5b9968b8723e Up 8 minutes 127.0.0.1:8080->8080/tcp 0.0.0.0:443 0.0.0.0:80 127.0.0.1:8080

The renderer also runs with the INTERNET security profile, which hardens it against SSRF and local includes:

sudo docker inspect plantuml --format '{{range .Config.Env}}{{println .}}{{end}}' | grep SECURITY
PLANTUML_SECURITY_PROFILE=INTERNET
5

Confirm the dedicated data volume

The appliance's container store and logs live on a dedicated EBS volume mounted at /var/lib/plantuml:

mountpoint /var/lib/plantuml && df -h /var/lib/plantuml | tail -1
6

Retrieve the access password

At first boot, the image generates a unique HTTP Basic Auth password and writes it to /root/plantuml-server-credentials.txt, readable by root only:

sudo cat /root/plantuml-server-credentials.txt
PLANTUML_HTTP_USER=admin PLANTUML_BASIC_AUTH_PASSWORD=<PLANTUML_BASIC_AUTH_PASSWORD> PLANTUML_URL=https://<instance-public-ip>/ PLANTUML_HEALTHZ=https://<instance-public-ip>/healthz

The user name is admin. Keep this password safe, because it is unique to this instance.

7

Verify access control over HTTPS

An unauthenticated request is rejected, while the unauthenticated health endpoint stays available for load balancer probes:

curl -sk -o /dev/null -w 'unauthenticated: HTTP %{http_code}\n' https://localhost/
curl -sk -o /dev/null -w 'healthz: HTTP %{http_code}\n' https://localhost/healthz
unauthenticated: HTTP 401 healthz: HTTP 200
8

Render a diagram from the command line

The stateless rendering API takes an encoded diagram in the URL and returns the image. The image includes a small helper, plantuml-encode, that produces the encoded form:

PW=$(sudo grep '^PLANTUML_BASIC_AUTH_PASSWORD=' /root/plantuml-server-credentials.txt | cut -d= -f2-)
ENC=$(printf '@startuml\nAlice -> Bob: Hello\nBob --> Alice: Hi\n@enduml' | /usr/local/bin/plantuml-encode)
curl -sk -o /dev/null -w 'SVG render: HTTP %{http_code}\n' -u "admin:$PW" "https://localhost/svg/$ENC"
SVG render: HTTP 200
9

Open the editor in a browser

Open https://<instance-public-ip>/ in your browser and accept the per-instance self-signed certificate. Sign in with the user name admin and the password from Step 6. Type PlantUML source on the left and the diagram renders live, with one-click export to PNG, SVG, ASCII or PDF.

10

Render other diagram types

PlantUML supports many diagram types. The bundled Graphviz engine lays out a class diagram:

11

Embed diagrams with the rendering API

Rendering is a stateless URL, so you can embed always-current diagrams anywhere by pointing at https://<instance>/svg/<encoded> or /png/<encoded>. The editor's address bar shows the encoded URL for the current diagram. Copy it into a wiki, README or documentation pipeline:

12

Managing the service

# Status and logs systemctl status plantuml nginx
sudo docker logs plantuml
# Restart the renderer or the proxy
sudo systemctl restart plantuml
sudo systemctl restart nginx

To rotate the web password, update /etc/nginx/.plantuml_htpasswd with sudo htpasswd -B /etc/nginx/.plantuml_htpasswd admin, then run sudo systemctl reload nginx.

13

Security recommendations

  • Restrict the Security Group to the addresses that need the editor and API, and keep SSH (22) limited to your admin network.
  • Use your own domain and certificate. The per-instance certificate is self-signed. Terminate TLS at nginx with a certificate from your CA, or use AWS Certificate Manager through a load balancer.
  • Keep the INTERNET (or stricter) security profile. It blocks local-file includes and internal-address fetches. Do not lower it below INTERNET.
  • Do not expose the loopback port. The renderer must stay bound to 127.0.0.1:8080, and only nginx should face the network.
  • Snapshot the data volume at /var/lib/plantuml with AWS Backup as part of your routine.
  • Patch regularly with sudo apt update && sudo apt upgrade, and pull a newer pinned server image when you update.
14

Support and licensing

PlantUML Server is licensed under the GPL-3.0 licence. This SecureAnyCloud image packages the upstream software with security hardening and a per-instance credential. The software charge on this listing is for SecureAnyCloud support services, in addition to standard AWS infrastructure costs.

Need Help?

SecureAnyCloud provides 24/7 technical support by email and live chat at sales@secureanycloud.com. Support covers deployment, reverse proxy and certificate setup, connecting the rendering API to your tools, renderer tuning, instance sizing, patching guidance and EBS volume management.

Deploy on AWS

Launch PlantUML Server - Secure Diagram-as-Code Rendering AMI by SecureAnyCloud with 24/7 support from SecureAnyCloud.

View on Marketplace

Need Help?

Our support team is available 24/7.

sales@secureanycloud.com

Deploy on AWS