Deployment guide

Penpot

Overview

Penpot is the open source design and prototyping platform, a self-hostable alternative to Figma. It gives design and product teams a complete browser-based workspace for UI design, vector illustration, interactive prototyping and developer hand-off, all under your own control.

The SecureAnyCloud image installs Penpot 2.5.4 as the official self-host Docker Compose stack and runs it as a systemd service. A complete design platform is online within minutes of launch.

What you get:

  • Penpot 2.5.4 (Mozilla Public License 2.0), deployed from the official self-host Docker Compose stack and pinned so the image never silently upgrades at build time
  • Docker Engine (Docker CE) and the Docker Compose plugin, installed from the official Docker package repository
  • The Penpot Compose stack: penpot-frontend (the nginx-based SPA and reverse proxy), penpot-backend (the application server), penpot-exporter (the headless-browser export and render service), penpot-postgres (PostgreSQL 15, the primary database) and penpot-redis (the cache, queue and realtime pub/sub)
  • The bundled nginx frontend publishing the Penpot UI, the REST/RPC API (/api) and a static unauthenticated health endpoint (/health) on port 80
  • All stateful data (the PostgreSQL database, the Redis data and every uploaded design asset) on a dedicated 40 GiB data disk mounted at /var/lib/penpot, with Docker's data-root relocated there. The disk is independently resizable and re-provisioned on every VM
  • Open self-registration disabled, and a per-VM admin account (email and a generated password) created at first boot
  • Two systemd units: penpot.service (a oneshot wrapper around docker compose up -d) and penpot-firstboot.service
  • 24/7 SecureAnyCloud support

Prerequisites

You need an active Azure subscription, an SSH key, and a VNet and subnet.

Standard_B4ms (4 vCPU / 16 GB RAM) is the recommended size. It is comfortable for the five-container Penpot stack.

Configure the NSG to allow 22/tcp from your management CIDR for SSH and 80/tcp from the CIDR that needs the Penpot UI. Add 443/tcp if you enable HTTPS.

1

Connect over SSH

Replace <vm-ip> with the public IP address of your VM. The default login user is azureuser.

ssh azureuser@<vm-ip>
2

Confirm the services are active

sudo systemctl is-active docker.service penpot.service docker --version docker compose version

The output shows active twice, then the Docker Engine version and the Docker Compose v2 plugin version.

3

Confirm the Penpot containers are running

sudo docker ps --format "table {{.Names}}\t{{.Status}}"

You should see all five Penpot containers in the Up / healthy state: penpot-frontend, penpot-backend, penpot-exporter, penpot-postgres and penpot-redis.

4

Confirm the data disk is mounted

All stateful Penpot data lives on a dedicated data disk mounted at /var/lib/penpot. Check the mount:

findmnt /var/lib/penpot df -h /var/lib/penpot

findmnt shows the device that backs /var/lib/penpot, and df confirms the 40 GiB volume.

5

Check the Penpot health endpoint

The bundled nginx frontend serves the health endpoint on port 80 without authentication. Request it:

curl -s -o /dev/null -w "%{http_code}\n" http://localhost/health

A 200 response confirms that the frontend is up and serving.

6

Read the per-VM admin credentials

On first boot, your instance generates a unique admin email and password and writes them to a root-only file. Open self-registration is disabled, so this admin is the only login until you invite more users from inside Penpot.

sudo cat /root/penpot-credentials.txt

The file lists PENPOT_URL (where to sign in), PENPOT_ADMIN_EMAIL and PENPOT_ADMIN_PASSWORD. Store the password somewhere safe.

7

Sign in to Penpot

Browse to http://<vm-ip>/. Sign in with the PENPOT_ADMIN_EMAIL and PENPOT_ADMIN_PASSWORD from Step 6. The bundled nginx frontend serves the Penpot UI and API on port 80.

After you sign in, the projects dashboard opens, scoped to your default team. Create a project and your first file to start designing.

8

Design and prototype

Open a file to enter the Penpot design workspace. It is a full vector design and layout canvas with layers, components, shared libraries, flex and grid layout, and real-time multiplayer editing.

Switch to the prototype view to wire boards together into interactive flows. You can play the flows back and share them for review.

9

Invite your team

Open registration is disabled on this appliance, so new users join by invitation instead of self-signup. In your team's Members settings inside Penpot, send email invitations to add designers and stakeholders.

Penpot supports per-team roles, so you control who can edit and who can only view.

10

Manage the stack

The penpot.service systemd unit manages the whole stack. It wraps docker compose under /opt/penpot.

sudo systemctl restart penpot.service
sudo docker compose -f /opt/penpot/docker-compose.yaml ps

systemctl restart cleanly recreates the Compose stack, and docker compose ps lists the containers and their health.

11

Enable HTTPS for production (recommended)

The image serves plain HTTP on port 80, so it works out of the box on the VM's public IP. For production, put Penpot behind TLS with your own domain.

Point a DNS record at the VM and open 443/tcp in the NSG. Terminate TLS with a reverse proxy such as Caddy or nginx, or obtain a certificate with certbot. Then set PENPOT_PUBLIC_URI to your https:// URL in /opt/penpot/.env and restart penpot.service.

Until you do, use the plain-HTTP endpoint for evaluation only.

Support

SecureAnyCloud provides 24/7 support for this image. Penpot is a trademark of its respective owners. SecureAnyCloud packages and supports the open source distribution and is not affiliated with or endorsed by the Penpot project. The software is licensed under the Mozilla Public License 2.0.

Deploy on Azure

Launch Penpot 2.5.4 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