# documentation: https://help.penpot.app/technical-guide/getting-started/#install-with-docker # slogan: Penpot is the first Open Source design and prototyping platform for product teams. # category: productivity # tags: penpot,design,prototyping,figma,open,source # logo: svgs/penpot.svg # port: 8080 services: frontend: image: penpotapp/frontend:2.11.1 # Released on 13 Nov 2025 volumes: - penpot-assets:/opt/data/assets depends_on: penpot-backend: condition: service_healthy penpot-exporter: condition: service_healthy environment: - SERVICE_URL_FRONTEND_8080 - PENPOT_FLAGS=${PENPOT_FRONTEND_FLAGS:-enable-login-with-password} healthcheck: test: ['CMD', 'curl', '-f', 'http://127.0.0.1:8080'] interval: 2s timeout: 10s retries: 15 penpot-backend: image: penpotapp/backend:2.11.1 # Released on 13 Nov 2025 volumes: - penpot-assets:/opt/data/assets depends_on: postgres: condition: service_healthy penpot-valkey: condition: service_healthy environment: - PENPOT_FLAGS=${PENPOT_BACKEND_FLAGS:-enable-login-with-password enable-smtp} - PENPOT_HTTP_SERVER_PORT=6060 - PENPOT_SECRET_KEY=$SERVICE_REALBASE64_64_PENPOT - PENPOT_PUBLIC_URI=$SERVICE_URL_FRONTEND_8080 - PENPOT_BACKEND_URI=http://penpot-backend - PENPOT_EXPORTER_URI=http://penpot-exporter - PENPOT_DATABASE_URI=postgresql://postgres/${POSTGRES_DB:-penpot} - PENPOT_DATABASE_USERNAME=${SERVICE_USER_POSTGRES} - PENPOT_DATABASE_PASSWORD=${SERVICE_PASSWORD_POSTGRES} - 'PENPOT_REDIS_URI=redis://penpot-valkey/0' - PENPOT_OBJECTS_STORAGE_BACKEND=fs - PENPOT_OBJECTS_STORAGE_FS_DIRECTORY=/opt/data/assets - PENPOT_TELEMETRY_ENABLED=${PENPOT_TELEMETRY_ENABLED:-false} - PENPOT_SMTP_DEFAULT_FROM=${PENPOT_SMTP_DEFAULT_FROM:-no-reply@example.com} - PENPOT_SMTP_DEFAULT_REPLY_TO=${PENPOT_SMTP_DEFAULT_REPLY_TO:-no-reply@example.com} - PENPOT_SMTP_HOST=${PENPOT_SMTP_HOST:-mailpit} - PENPOT_SMTP_PORT=${PENPOT_SMTP_PORT:-1025} - PENPOT_SMTP_USERNAME=${PENPOT_SMTP_USERNAME:-penpot} - PENPOT_SMTP_PASSWORD=${PENPOT_SMTP_PASSWORD:-penpot} - PENPOT_SMTP_TLS=${PENPOT_SMTP_TLS:-false} - PENPOT_SMTP_SSL=${PENPOT_SMTP_SSL:-false} healthcheck: test: ['CMD', 'node', '-e', "require('http').get({host:'127.0.0.1', port:6060, path:'/readyz'}, res => process.exit(res.statusCode===200 ? 0 : 1)).on('error', () => process.exit(1));"] interval: 10s timeout: 30s retries: 15 penpot-exporter: image: penpotapp/exporter:2.11.1 # Released on 13 Nov 2025 environment: - PENPOT_PUBLIC_URI=$SERVICE_URL_FRONTEND_8080 - 'PENPOT_REDIS_URI=redis://penpot-valkey/0' healthcheck: test: ['CMD', 'curl', '-f', 'http://127.0.0.1:6061/readyz'] interval: 2s timeout: 10s retries: 15 mailpit: image: axllent/mailpit:v1.28 # Released on 26 Nov 2025 environment: - SERVICE_URL_MAILPIT_8025 healthcheck: test: ['CMD', '/mailpit', 'readyz'] interval: 5s timeout: 20s retries: 10 postgres: image: postgres:15 volumes: - penpot-postgresql-data:/var/lib/postgresql/data environment: - POSTGRES_INITDB_ARGS=--data-checksums - POSTGRES_USER=$SERVICE_USER_POSTGRES - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES - POSTGRES_DB=${POSTGRES_DB:-penpot} healthcheck: test: ['CMD-SHELL', 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}'] interval: 5s timeout: 20s retries: 10 penpot-valkey: image: 'valkey/valkey:8.1' volumes: - 'penpot-valkey-data:/data' environment: - 'VALKEY_EXTRA_FLAGS=--maxmemory 128mb --maxmemory-policy volatile-lfu' healthcheck: test: - CMD-SHELL - 'valkey-cli ping | grep PONG' interval: 1s timeout: 3s retries: 5 start_period: 3s