# Paperless-ngx - Document Management System (DMS) # Domain: paperless.${DOMAIN} # Database: PostgreSQL + Redis # RAM: ~500MB (more with OCR/Tika) | Pi-compatible: Yes (arm64, 4GB+ RAM recommended) # # Environment variables (set in Portainer): # DOMAIN - Your domain (e.g., demo-felhom.eu) # HDD_PATH - HDD mount path (e.g., /mnt/hdd_1) # PAPERLESS_SECRET_KEY - Random secret (generate with: openssl rand -hex 32) # DB_PASSWORD - PostgreSQL password # PAPERLESS_ADMIN_USER - Initial admin username (default: admin) # PAPERLESS_ADMIN_PASSWORD - Initial admin password # # Storage layout: # Consume folder → ${HDD_PATH}/storage/paperless/consume (HDD, drop files here) # Document media → ${HDD_PATH}/storage/paperless/media (HDD, originals + archive) # Export folder → ${HDD_PATH}/storage/paperless/export (HDD, for backups) # App data/index → paperless_data (named volume, NVMe) # PostgreSQL data → paperless_postgres_data (named volume, NVMe) # Redis data → paperless_redis_data (named volume, NVMe) # # First-time setup: # If PAPERLESS_ADMIN_USER/PASSWORD env vars are set, admin is auto-created. # Otherwise: docker exec -it paperless-webserver createsuperuser services: paperless-webserver: image: ghcr.io/paperless-ngx/paperless-ngx:2.15.3 container_name: paperless-webserver restart: unless-stopped depends_on: paperless-postgres: condition: service_healthy paperless-redis: condition: service_healthy environment: - PAPERLESS_REDIS=redis://paperless-redis:6379 - PAPERLESS_DBHOST=paperless-postgres - PAPERLESS_DBUSER=paperless - PAPERLESS_DBPASS=${DB_PASSWORD} - PAPERLESS_DBNAME=paperless - PAPERLESS_SECRET_KEY=${PAPERLESS_SECRET_KEY} - PAPERLESS_URL=https://paperless.${DOMAIN} - PAPERLESS_TIME_ZONE=Europe/Budapest - PAPERLESS_OCR_LANGUAGE=hun+eng - PAPERLESS_ADMIN_USER=${PAPERLESS_ADMIN_USER:-} - PAPERLESS_ADMIN_PASSWORD=${PAPERLESS_ADMIN_PASSWORD:-} - PAPERLESS_CONSUMER_POLLING=30 - PAPERLESS_TASK_WORKERS=2 - PAPERLESS_THREADS_PER_WORKER=1 - USERMAP_UID=1000 - USERMAP_GID=1000 volumes: - paperless_data:/usr/src/paperless/data - ${HDD_PATH}/storage/paperless/media:/usr/src/paperless/media - ${HDD_PATH}/storage/paperless/consume:/usr/src/paperless/consume - ${HDD_PATH}/storage/paperless/export:/usr/src/paperless/export networks: - traefik-public - paperless-internal healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000"] interval: 30s timeout: 10s retries: 5 start_period: 60s labels: - "traefik.enable=true" - "traefik.http.routers.paperless.rule=Host(`paperless.${DOMAIN}`)" - "traefik.http.routers.paperless.entrypoints=websecure" - "traefik.http.routers.paperless.tls=true" - "traefik.http.routers.paperless.tls.certresolver=letsencrypt" - "traefik.http.services.paperless.loadbalancer.server.port=8000" paperless-postgres: image: postgres:16-alpine container_name: paperless-postgres restart: unless-stopped environment: - POSTGRES_USER=paperless - POSTGRES_PASSWORD=${DB_PASSWORD} - POSTGRES_DB=paperless volumes: - paperless_postgres_data:/var/lib/postgresql/data networks: - paperless-internal healthcheck: test: ["CMD-SHELL", "pg_isready -U paperless -d paperless"] interval: 10s timeout: 5s retries: 5 start_period: 20s paperless-redis: image: redis:7-alpine container_name: paperless-redis restart: unless-stopped command: redis-server --appendonly yes volumes: - paperless_redis_data:/data networks: - paperless-internal healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 3 volumes: paperless_data: paperless_postgres_data: paperless_redis_data: networks: traefik-public: external: true paperless-internal: