Aisle Files & photos

Paperless-ngx

Scan and find all your paperwork.

Add to my serverdocker-compose generator (French)Step-by-step guide (French)Official documentation

What is it for?

Paperless-ngx turns your paperwork (invoices, payslips, contracts) into a digital archive. It reads the text of scanned documents (OCR), files them automatically and lets you find anything with one search.

Who is it for?

People who want to finally get rid of binders full of admin papers.

Good to know

The generated configuration reads documents in French (PAPERLESS_OCR_LANGUAGE: fra): change it to eng for English documents.

After installing

  1. Log in as admin with the ADMIN_PASSWORD from the .env file, then change it.
  2. Drop PDFs into the consume folder: they are imported automatically.

The docker-compose

Example behind Traefik. To adapt it (Nginx Proxy Manager, local port…) with a line-by-line explanation, use the generator (in French).

# docker-compose.yml : Paperless-ngx
services:
  paperless:
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    container_name: paperless
    restart: unless-stopped
    depends_on:
      - db
      - broker
    environment:
      PAPERLESS_REDIS: redis://broker:6379
      PAPERLESS_DBHOST: db
      PAPERLESS_DBPASS: "${DB_PASSWORD}"
      PAPERLESS_SECRET_KEY: "${PAPERLESS_SECRET_KEY}"
      PAPERLESS_URL: https://papiers.mydomain.com
      PAPERLESS_OCR_LANGUAGE: fra
      PAPERLESS_ADMIN_USER: admin
      PAPERLESS_ADMIN_PASSWORD: "${ADMIN_PASSWORD}"
      PAPERLESS_TIME_ZONE: Europe/Paris
      USERMAP_UID: "1000"
      USERMAP_GID: "1000"
      TZ: Europe/Paris
    volumes:
      - ./data:/usr/src/paperless/data
      - ./media:/usr/src/paperless/media
      - ./export:/usr/src/paperless/export
      - ./consume:/usr/src/paperless/consume
    networks:
      - traefik
      - default
    labels:
      - traefik.enable=true
      - traefik.http.routers.paperless.rule=Host(`papiers.mydomain.com`)
      - traefik.http.routers.paperless.entrypoints=websecure
      - traefik.http.routers.paperless.tls.certresolver=letsencrypt
      - traefik.http.services.paperless.loadbalancer.server.port=8000
      - traefik.docker.network=traefik

  db:
    image: postgres:17-alpine
    container_name: paperless-db
    restart: unless-stopped
    environment:
      POSTGRES_DB: paperless
      POSTGRES_USER: paperless
      POSTGRES_PASSWORD: "${DB_PASSWORD}"
    volumes:
      - ./db:/var/lib/postgresql/data

  broker:
    image: redis:7-alpine
    container_name: paperless-broker
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true

networks:
  traefik:
    external: true