https://penpot.shawns-machine.com (penpotter)
Straight from Penpot’s Docker install guide (it listens on http://localhost:9001 by default). 
1) Penpot locally with simple Docker (compose)
2) save a “restart it later” command on Penpot host (192.168.1.9)
3) Pin a version (recommended):
4) STOP
5) START
Restart (when you need it)
On mini-stage in~/penpot:
Restart everything cleanly:
Stop / start:
If you later want to access it from other devices / proper invites / exports, you’ll end up setting the public URI + running behind HTTPS/proxy (Penpot strongly recommends HTTPS). SEE BELOW
Subdomain Install
Proxy – /etc/nginx/conf.d
Certbot
Staging (192.168.1.9)
Step 1: Add nginx config
Enable and test
sudo ln -s /etc/nginx/sites-available/penpot.shawns-machine.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Important: Because you’re serving it at a real URL, set Penpot’s public URI so links and auth flows don’t think they’re on localhost.
~/penpot/.env
Easiest way: create an .env beside the compose file:
Staging (.9): run Penpot via Docker
Quick Verify
The one “gotcha” to watch
If Penpot generates links or redirects to http: // or localhost, it means the . env wasn’t picked up.
Confirm with:
If you paste your working NGINX config for one of the other 6 subdomains (just the server block), I can mirror it exactly for Penpot withthe right upstream + websocket bits in one shot.
Install Docker
Linux Docker permissions wall: your user can’t talk to the Docker daemon yet.
Then lock down sign ups
1. On the proxy server (192.168.1.26):
2. Add this inside the location / { … } block of your penpot.shawns-machine.com nginx config on proxy:
3. reload nginx
4. add new backup user just in case
