services: paperless-ngx-db: container_name: paperless-ngx-db image: docker.io/library/postgres:17.5 restart: unless-stopped environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} volumes: - ${APPDATA_PATH}/paperless-ngx/db:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -d ${POSTGRES_DB} -U ${POSTGRES_USER}"] interval: 10s timeout: 5s retries: 3 start_period: 10s paperless-ngx-valkey: container_name: paperless-ngx-valkey image: docker.io/valkey/valkey:8.1.3 restart: unless-stopped volumes: - ${APPDATA_PATH}/paperless-ngx/valkey:/data networks: - backend healthcheck: test: ["CMD-SHELL", "valkey-cli ping | grep PONG"] interval: 10s timeout: 5s retries: 3 start_period: 10s paperless-ngx-tika: container_name: paperless-ngx-tika image: docker.io/apache/tika:3.2.2.0 restart: unless-stopped paperless-ngx-gotenberg: container_name: paperless-ngx-gotenberg image: docker.io/gotenberg/gotenberg:8.21.1 restart: unless-stopped # The gotenberg chromium route is used to convert .eml files. We do not # want to allow external content like tracking pixels or even javascript. command: - "gotenberg" - "--chromium-disable-javascript=true" - "--chromium-allow-list=file:///tmp/.*" paperless-ngx: container_name: paperless-ngx image: ghcr.io/paperless-ngx/paperless-ngx:2.17.1 restart: unless-stopped depends_on: paperless-ngx-db: condition: service_healthy paperless-ngx-valkey: condition: service_healthy paperless-ngx-tika: condition: service_healthy paperless-ngx-gotenberg: condition: service_healthy environment: - PAPERLESS_DBHOST=paperless-ngx-db - PAPERLESS_DBENGINE=postgresql - PAPERLESS_DBPORT=5432 - PAPERLESS_DBNAME=${POSTGRES_DB} - PAPERLESS_DBUSER=${POSTGRES_USER} - PAPERLESS_DBPASS=${POSTGRES_PASSWORD} - PAPERLESS_REDIS=redis://paperless-ngx-valkey:6379 - PAPERLESS_TIKA_ENABLED=1 - PAPERLESS_TIKA_ENDPOINT=http://paperless-ngx-tika:9998 - PAPERLESS_TIKA_GOTENBERG_ENDPOINT=http://paperless-ngx-gotenberg:3000 - USERMAP_UID=${PUID} - USERMAP_GID=${PGID} - PAPERLESS_URL=${PAPERLESS_URL} - PAPERLESS_SECRET_KEY=${PAPERLESS_SECRET_KEY} - PAPERLESS_TIME_ZONE=${TZ} - PAPERLESS_OCR_LANGUAGE=${PAPERLESS_OCR_LANGUAGE} - PAPERLESS_FILENAME_FORMAT={correspondent}/{created_year}/{title} - PAPERLESS_OCR_DESKEW=false volumes: - ${APPDATA_PATH}/paperless-ngx/data:/usr/src/paperless/data - ${APPDATA_PATH}/paperless-ngx/media:/usr/src/paperless/media - ${APPDATA_PATH}/paperless-ngx/export:/usr/src/paperless/export - ${APPDATA_PATH}/paperless-ngx/consume:/usr/src/paperless/consume ports: - ${SERVER_PORT}:8000 networks: - frontend - backend healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000"] interval: 30s timeout: 10s retries: 5 networks: frontend: external: true backend: external: true