# 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 # Release on 13 Nov 2025
    depends_on:
      penpot-backend:
        condition: service_healthy
      penpot-exporter:
        condition: service_healthy
    environment:
      - SERVICE_URL_FRONTEND_8080
      - 'PENPOT_FLAGS=${PENPOT_BACKEND_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 # Release on 13 Nov 2025
    depends_on:
      postgres:
        condition: service_healthy
      penpot-valkey:
        condition: service_healthy
      minio-init:
        condition: service_completed_successfully
    environment:
      - 'PENPOT_FLAGS=${PENPOT_BACKEND_FLAGS:-enable-login-with-password}'

      # Backend & URIs
      - 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

      # Database
      - PENPOT_DATABASE_URI=postgresql://postgres/${POSTGRES_DB:-penpot}
      - PENPOT_DATABASE_USERNAME=${SERVICE_USER_POSTGRES}
      - PENPOT_DATABASE_PASSWORD=${SERVICE_PASSWORD_POSTGRES}

      # Valkey
      - 'PENPOT_REDIS_URI=redis://penpot-valkey/0'

      # Telemetry
      - PENPOT_TELEMETRY_ENABLED=${PENPOT_TELEMETRY_ENABLED:-false}

      # S3 Storage Configuration (MinIO)
      - PENPOT_OBJECTS_STORAGE_BACKEND=s3
      - PENPOT_OBJECTS_STORAGE_S3_REGION=us-east-1
      - PENPOT_OBJECTS_STORAGE_S3_BUCKET=penpot
      - PENPOT_OBJECTS_STORAGE_S3_ENDPOINT=http://minio:9000

      # S3 Credentials (MinIO)
      - AWS_ACCESS_KEY_ID=${SERVICE_USER_MINIO}
      - AWS_SECRET_ACCESS_KEY=${SERVICE_PASSWORD_MINIO}
      
      # Email Configuration
      - 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 # Release 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

  # MinIO S3 Local server
  minio:
    image: ghcr.io/coollabsio/minio:RELEASE.2025-10-15T17-29-55Z # Released on 15 October 2025
    command: server /data
    environment:
      - MINIO_ROOT_USER=${SERVICE_USER_MINIO}
      - MINIO_ROOT_PASSWORD=${SERVICE_PASSWORD_MINIO}
    volumes:
      - minio-data:/data
    healthcheck:
      test: ["CMD", "mc", "ready", "local"]
      interval: 5s
      timeout: 20s
      retries: 10
      
  # S3 Bucket initialization
  minio-init:
    image: minio/mc:latest
    depends_on:
      minio:
        condition: service_healthy
    entrypoint: >
      sh -c "
        mc alias set local http://minio:9000 ${SERVICE_USER_MINIO} ${SERVICE_PASSWORD_MINIO} &&
        mc mb -p local/penpot || true &&
        mc anonymous set private local/penpot
      "
    restart: "no"
    exclude_from_hc: true

  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
 
  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
