Docker compose exporter failing on export

Hello, there Penpot Community!

I’m reaching to you as I’ve run into a problem (of course) and cannot fix it, which has been flustering me for some time now.

The problem happens no matter if I want to export frames, single assets or components in any kind of format. The issue just happens every single time with similar kind of log.

The user and file permissions are properly set up, I’m not using the user with penpot-frontend because it fails for some reason if I do that, but backend runs smoothly. I’ve tried running penpot-exporter as root which didn’t bare any fruits.

Another thing to take note on is that I’m using Nginx Proxy Manager as my reverse proxy, which in itself shouldn’t be of issue. I did use Cloudflare as an proxy (orange cloud) but also tried to without it, which in both cases led to the former again.

Anyways, most importantly, here is my docker-compose.yml:

## Common flags:
# demo-users
# email-verification
# log-emails
# log-invitation-tokens
# login-with-github
# login-with-gitlab
# login-with-google
# login-with-ldap
# login-with-oidc
# login-with-password
# prepl-server
# registration
# secure-session-cookies
# smtp
# smtp-debug
# telemetry
# webhooks
##
## You can read more about all available flags and other
## environment variables here:
## https://help.penpot.app/technical-guide/configuration/#advanced-configuration
#
# WARNING: if you're exposing Penpot to the internet, you should remove the flags
# 'disable-secure-session-cookies' and 'disable-email-verification'
x-flags: &penpot-flags
  PENPOT_FLAGS: enable-smtp enable-prepl-server

x-uri: &penpot-public-uri
  PENPOT_PUBLIC_URI: ${PENPOT_PUBLIC_URI}

x-body-size: &penpot-http-body-size
  # Max body size (30MiB); Used for plain requests, should never be
  # greater than multi-part size
  PENPOT_HTTP_SERVER_MAX_BODY_SIZE: 31457280

  # Max multipart body size (350MiB)
  PENPOT_HTTP_SERVER_MAX_MULTIPART_BODY_SIZE: 367001600


networks:
  penpot:
  proxy:
    driver: bridge
    external: true

volumes:
  penpot_postgres_v15:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/srv/penpot/penpot-data'
  penpot_assets:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/srv/penpot/penpot-assets'

services:

  penpot-frontend:
    image: "penpotapp/frontend:latest"
    container_name: penpot-frontend
    restart: always
    
    volumes:
      - penpot_assets:/opt/data/assets

    depends_on:
      - penpot-backend
      - penpot-exporter

    networks:
      - penpot
      - proxy

    environment:
      << : [*penpot-flags, *penpot-http-body-size]
      PENPOT_PUBLIC_URI: ${PENPOT_PUBLIC_URI}

  penpot-backend:
    image: "penpotapp/backend:latest"
    user: ${PENPOT_USER}:${PENPOT_GROUP}
    container_name: penpot-backend
    restart: always

    volumes:
      - penpot_assets:/opt/data/assets

    depends_on:
      penpot-postgres:
        condition: service_healthy
      penpot-valkey:
        condition: service_healthy

    networks:
      - penpot

    ## Configuration envronment variables for the backend container.

    environment:
      << : [*penpot-flags, *penpot-http-body-size]

      PENPOT_PUBLIC_URI: ${PENPOT_PUBLIC_URI}

      PENPOT_DATABASE_URI: postgresql://penpot-postgres/penpot
      PENPOT_DATABASE_USERNAME: ${POSTGRES_USER}
      PENPOT_DATABASE_PASSWORD: ${POSTGRES_PASSWORD}

      PENPOT_REDIS_URI: redis://penpot-valkey/0

      PENPOT_ASSETS_STORAGE_BACKEND: assets-fs
      PENPOT_STORAGE_ASSETS_FS_DIRECTORY: /opt/data/assets

      PENPOT_TELEMETRY_ENABLED: false
      PENPOT_TELEMETRY_REFERER: compose

      PENPOT_SMTP_DEFAULT_FROM: ${SMTP_FROM_ADDRESS}
      PENPOT_SMTP_DEFAULT_REPLY_TO: ${SMTP_FROM_ADDRESS}
      PENPOT_SMTP_HOST: ${SMTP_HOST}
      PENPOT_SMTP_PORT: ${SMTP_PORT}
      PENPOT_SMTP_USERNAME: ${SMTP_USERNAME}
      PENPOT_SMTP_PASSWORD: ${SMTP_PASSWORD}
      PENPOT_SMTP_TLS: true
      PENPOT_SMTP_SSL: true

  penpot-exporter:
    image: "penpotapp/exporter:latest"
    user: ${PENPOT_USER}:${PENPOT_GROUP}
    container_name: penpot-exporter
    restart: always

    depends_on:
      penpot-valkey:
        condition: service_healthy

    networks:
      - penpot

    environment:
      # Don't touch it; this uses an internal docker network to
      # communicate with the frontend.
      PENPOT_PUBLIC_URI: http://penpot-frontend:8080
      #PENPOT_PUBLIC_URI: ${PENPOT_PUBLIC_URI}

      ## Valkey (or previously Redis) is used for the websockets notifications.
      PENPOT_REDIS_URI: redis://penpot-valkey/0

  penpot-postgres:
    image: "postgres:17"
    user: ${PENPOT_USER}:${PENPOT_GROUP}
    container_name: penpot-postgres
    restart: always
    stop_signal: SIGINT

    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U penpot"]
      interval: 2s
      timeout: 10s
      retries: 5
      start_period: 2s

    volumes:
      - penpot_postgres_v15:/var/lib/postgresql/data

    networks:
      - penpot

    environment:
      - POSTGRES_INITDB_ARGS=--data-checksums
      - POSTGRES_DB=penpot
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

  penpot-valkey:
    image: valkey/valkey:8.1
    user: ${PENPOT_USER}:${PENPOT_GROUP}
    container_name: penpot-valkey
    restart: always

    healthcheck:
      test: ["CMD-SHELL", "valkey-cli ping | grep PONG"]
      interval: 1s
      timeout: 3s
      retries: 5
      start_period: 3s

    networks:
      - penpot

Besides that, here is the issue I’ve been having:

Log provided by the frontend via the download report button:

Hint:    ResourceRequest timed out
Prof ID: 6b27875e-b7bf-808f-8006-ac0c73109d9a
Team ID: --

Data:
{:type :server-error, :code :internal, :hint "ResourceRequest timed out", :data "(...)"}

{:type :internal, :code :timeout, :hint "ResourceRequest timed out"}

Trace:
Error: http error
  at new PENPOT.eh (https://penpot.einaldr.com/js/shared.44bc4b7fa-1754046250.js:306:97)
  at PENPOT.fh (https://penpot.einaldr.com/js/shared.44bc4b7fa-1754046250.js:306:419)
  at PENPOT.gh (https://penpot.einaldr.com/js/shared.44bc4b7fa-1754046250.js:306:372)
  at PENPOT.y_a (https://penpot.einaldr.com/js/shared.44bc4b7fa-1754046250.js:1496:424)
  at https://penpot.einaldr.com/js/shared.44bc4b7fa-1754046250.js:1254:242
  at _ (https://penpot.einaldr.com/js/libs.js?ts=1754046776119:757:16436)
  at e.f [as _nextOverride] (https://penpot.einaldr.com/js/libs.js?ts=1754046776119:757:16386)
  at e.htr [as _next] (https://penpot.einaldr.com/js/libs.js?ts=1754046776119:757:1873)
  at e.next (https://penpot.einaldr.com/js/libs.js?ts=1754046776119:757:1370)
  at e.next [as _nextOverride] (https://penpot.einaldr.com/js/libs.js?ts=1754046776119:757:13985)
  at e.htr [as _next] (https://penpot.einaldr.com/js/libs.js?ts=1754046776119:757:1873)
  at e.next (https://penpot.einaldr.com/js/libs.js?ts=1754046776119:757:1370)
  at e.next [as _nextOverride] (https://penpot.einaldr.com/js/libs.js?ts=1754046776119:757:16499)
  at e.htr [as _next] (https://penpot.einaldr.com/js/libs.js?ts=1754046776119:757:1873)
  at e.next (https://penpot.einaldr.com/js/libs.js?ts=1754046776119:757:1370)
  at e.next [as _nextOverride] (https://penpot.einaldr.com/js/libs.js?ts=1754046776119:757:13985)
  at e.htr [as _next] (https://penpot.einaldr.com/js/libs.js?ts=1754046776119:757:1873)
  at e.next (https://penpot.einaldr.com/js/libs.js?ts=1754046776119:757:1370)
  at https://penpot.einaldr.com/js/libs.js?ts=1754046776119:757:4469

Last events:
[":app.main.features/initialize"
 ":app.main.data.team/fetch-members"
 ":app.main.data.team/team-initialized"
 ":app.main.data.team/members-fetched"
 ":app.main.data.workspace/bundle-fetched"
 ":app.main.data.project/fetch-project"
 ":app.main.data.project/initialize-project"
 ":app.main.data.workspace.notifications/handle-presence"
 ":app.main.data.workspace.notifications/initialize"
 ":app.main.data.workspace.shape-layout/initialize-shape-layout"
 ":app.main.data.workspace/fetch-libries"
 ":app.main.data.plugins/check-open-plugin"
 ":app.main.data.workspace.fix-deleted-fonts/fix-deleted-fonts"
 ":app.main.data.workspace.fix-broken-shapes/fix-broken-shapes"
 ":app.main.data.workspace/workspace-initialized"
 ":app.main.data.workspace.pages/initialize-page*"
 ":app.main.data.workspace.thumbnails/watch-state-changes"
 ":app.main.data.workspace.libraries/watch-component-changes"
 ":app.main.data.workspace.pages/initialize-page"
 ":app.main.data.shortcuts/push-shortcuts"
 ":app.main.data.project/project-fetched"
 ":app.main.data.workspace/libraries-fetched"
 ":app.main.data.workspace.libraries/library-thumbnails-fetched"
 ":app.main.data.workspace.highlight/highlight-shape"
 ":app.main.data.workspace.libraries/library-thumbnails-fetched"
 ":app.main.data.workspace.collapse/expand-all-parents"
 ":app.main.router/navigate"
 ":app.main.data.workspace.selection/select-shape"
 ":app.main.router/navigated"
 ":app.main.data.workspace/library-resolved"
 ":app.main.data.workspace.highlight/dehighlight-shape"
 ":app.main.data.persistence/persistence-notification"
 ":app.main.data.workspace.common/set-workspace-visited"
 ":app.main.data.persistence/persistence-notification"
 ":app.main.data.exports.assets/request-simple-export"
 ":app.main.data.event/event"
 ":app.main.data.workspace/library-resolved"
 ":app.main.data.workspace/check-libraries-synchronozation"
 ":app.main.data.exports.assets/clear-export-state"
 ":app.main.data.team/finalize-team"
 ":app.main.data.persistence/persistence-notification"
 ":app.main.data.workspace.notifications/finalize"
 ":app.main.data.project/finalize-project"
 ":app.main.data.workspace.shape-layout/finalize-shape-layout"
 ":app.main.data.workspace.colors/stop-picker"
 ":app.main.data.workspace.common/set-workspace-visited"
 ":app.main.data.modal/hide-modal"
 ":app.main.data.notifications/hide"
 ":app.main.data.workspace/finalize-workspace"
 ":app.main.data.workspace.pages/finalize-page"
 ":app.main.data.shortcuts/pop-shortcuts"]

The penpot-exporter log:

DBG [app.handlers] hint="process-request", cmd=:export-frames
ERR [app.handlers.export-frames] hint="unexpected error on frames exportation"
  Data:
  {:type :internal, :code :timeout, :hint "ResourceRequest timed out"}

  Error: ResourceRequest timed out
      at new cljs.core.ExceptionInfo (/opt/penpot/exporter/app.js:25881:14)
      at cljs.core.ex_info.cljs$core$IFn$_invoke$arity$3 (/opt/penpot/exporter/app.js:25916:10)
      at app.browser.translate_browser_errors (/opt/penpot/exporter/app.js:76404:29)
      at /opt/penpot/exporter/app.js:75673:134
      at Object.reject (/opt/penpot/exporter/app.js:75188:107)
      at $jscomp$scope$84173391$25$processNextTick (/opt/penpot/exporter/app.js:74067:167)
      at $jscomp$scope$84173391$27$transition (/opt/penpot/exporter/app.js:74046:110)
      at $jscomp$scope$84173391$14$PromiseImpl.reject (/opt/penpot/exporter/app.js:74148:82)
      at Object.complete (/opt/penpot/exporter/app.js:74080:28)
      at $jscomp$scope$84173391$26$resolveTask (/opt/penpot/exporter/app.js:74055:65)
DBG [app.handlers] hint="process-request", cmd=:get-resource

Thanks for your time.

Sorry had to remove my comment, as my issue was related to coolify auto generated url to one of my preassigned environment variables.

It is still an issue for me as of 06/10/2025.

I had this issue but i have entered the exporter image with root user and ran the following commands

apt-get update

apt-get install imagemagick

npm install imagemagick

now i can export webp, and any combination of file format correctly