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.servicesystemd unit, which runs the server bound to the loopback interface only and restarts it automatically on failure. - The
plantuml-firstboot.servicesystemd 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
/healthzfor load balancer probes. Port 80 serves the same health endpoint and redirects everything else to HTTPS. - The
INTERNETrenderer security profile, which blocks local-file includes and internal or loopback network fetches (SSRF hardening). - A dedicated EBS data volume mounted at
/var/lib/plantumlfor 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.
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.
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}]'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 nginxactive active activeInspect 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 -u5b9968b8723e Up 8 minutes 127.0.0.1:8080->8080/tcp 0.0.0.0:443 0.0.0.0:80 127.0.0.1:8080The 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 SECURITYPLANTUML_SECURITY_PROFILE=INTERNETConfirm 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 -1Retrieve 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.txtPLANTUML_HTTP_USER=admin PLANTUML_BASIC_AUTH_PASSWORD=<PLANTUML_BASIC_AUTH_PASSWORD> PLANTUML_URL=https://<instance-public-ip>/ PLANTUML_HEALTHZ=https://<instance-public-ip>/healthzThe user name is admin. Keep this password safe, because it is unique to this instance.
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/healthzunauthenticated: HTTP 401 healthz: HTTP 200Render 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 200Open 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.
Render other diagram types
PlantUML supports many diagram types. The bundled Graphviz engine lays out a class diagram:
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:
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 nginxTo rotate the web password, update /etc/nginx/.plantuml_htpasswd with sudo htpasswd -B /etc/nginx/.plantuml_htpasswd admin, then run sudo systemctl reload nginx.
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 belowINTERNET. - 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/plantumlwith 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.
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