Posted on 2025/12/22  
tagged selfhosted  

paperless-ngx is an excellent document organization tool

  • README.md
  • docker-compose.env
  • docker-compose.yml
  • mkdirs.sh

  • README.md

    top
    paperless
    
    github
    https://github.com/paperless-ngx/paperless-ngx
    docs
    https://paperless-ngx.readthedocs.io/en/latest/
    
    # Initial user setup
    
    docker-compose run --rm webserver createsuperuser
    

    docker-compose.env

    top
    # The UID and GID of the user used to run paperless in the container. Set this
    # to your UID and GID on the host so that you have write access to the
    # consumption directory.
    USERMAP_UID=1000
    USERMAP_GID=1000
    
    # Additional languages to install for text recognition, separated by a
    # whitespace. Note that this is
    # different from PAPERLESS_OCR_LANGUAGE (default=eng), which defines the
    # language used for OCR.
    # The container installs English, German, Italian, Spanish and French by
    # default.
    # See https://packages.debian.org/search?keywords=tesseract-ocr-&searchon=names&suite=buster
    # for available languages.
    #PAPERLESS_OCR_LANGUAGES=tur ces
    
    ###############################################################################
    # Paperless-specific settings                                                 #
    ###############################################################################
    
    # All settings defined in the paperless.conf.example can be used here. The
    # Docker setup does not use the configuration file.
    # A few commonly adjusted settings are provided below.
    
    # This is required if you will be exposing Paperless-ngx on a public domain
    # (if doing so please consider security measures such as reverse proxy)
    #PAPERLESS_URL=https://paperless.example.com
    
    # Adjust this key if you plan to make paperless available publicly. It should
    # be a very long sequence of random characters. You don't need to remember it.
    #PAPERLESS_SECRET_KEY=change-me
    
    # Use this variable to set a timezone for the Paperless Docker containers. If not specified, defaults to UTC.
    #PAPERLESS_TIME_ZONE=America/Los_Angeles
    
    # The default language to use for OCR. Set this to the language most of your
    # documents are written in.
    #PAPERLESS_OCR_LANGUAGE=eng
    

    docker-compose.yml

    top
    # docker-compose file for running paperless from the Docker Hub.
    # This file contains everything paperless needs to run.
    # Paperless supports amd64, arm and arm64 hardware.
    #
    # All compose files of paperless configure paperless in the following way:
    #
    # - Paperless is (re)started on system boot, if it was running before shutdown.
    # - Docker volumes for storing data are managed by Docker.
    # - Folders for importing and exporting files are created in the same directory
    #   as this file and mounted to the correct folders inside the container.
    # - Paperless listens on port 8000.
    #
    # In addition to that, this docker-compose file adds the following optional
    # configurations:
    #
    # - Instead of SQLite (default), PostgreSQL is used as the database server.
    #
    # To install and update paperless with this file, do the following:
    #
    # - Copy this file as 'docker-compose.yml' and the files 'docker-compose.env'
    #   and '.env' into a folder.
    # - Run 'docker-compose pull'.
    # - Run 'docker-compose run --rm webserver createsuperuser' to create a user.
    # - Run 'docker-compose up -d'.
    #
    # For more extensive installation and update instructions, refer to the
    # documentation.
    
    #version: "3.4"
    
    networks:
      svc1:
        name: svc1
        external: true
    
    services:
      broker:
        image: docker.io/library/redis:6.0
        restart: unless-stopped
        volumes:
          - /srv/paperlessngx/redis-data:/data
        labels:
          # - traefik.http.routers.paperless.rule=Host(`paperless.lan`)
          # - traefik.http.services.paperless.loadbalancer.server.port=8000
          - tsdproxy.enable=true
          - tsdproxy.name=paperless
    
      db:
        image: docker.io/library/postgres:13
        restart: unless-stopped
        volumes:
          - /srv/paperlessngx/postgresql-data:/var/lib/postgresql/data
        environment:
          POSTGRES_DB: paperless
          POSTGRES_USER: paperless
          POSTGRES_PASSWORD: changeme
    
      webserver:
        image: ghcr.io/paperless-ngx/paperless-ngx:latest
        restart: unless-stopped
        depends_on:
          - db
          - broker
        ports:
          - 8000:8000
        healthcheck:
          test: ["CMD", "curl", "-fs", "-S", "--max-time", "2", "http://localhost:8000"]
          interval: 30s
          timeout: 10s
          retries: 5
        volumes:
          - /srv/paperlessngx/paperless-data:/usr/src/paperless/data
          - /srv/paperlessngx/paperless-media:/usr/src/paperless/media
          - /srv/paperlessngx/export:/usr/src/paperless/export
          - /srv/paperlessngx/consume:/usr/src/paperless/consume
        env_file: docker-compose.env
        environment:
          PAPERLESS_REDIS: redis://broker:6379
          PAPERLESS_DBHOST: db
    

    mkdirs.sh

    top
    #!/usr/bin/env bash
    #
    # grep /srv docker-compose.yml  |awk -F'[ :]+' '{print $3}'
    sudo mkdir -pv /srv/paperlessngx/redis-data
    sudo mkdir -pv /srv/paperlessngx/postgresql-data
    sudo mkdir -pv /srv/paperlessngx/paperless-data
    sudo mkdir -pv /srv/paperlessngx/paperless-media
    sudo mkdir -pv /srv/paperlessngx/export
    sudo mkdir -pv /srv/paperlessngx/consume
    
    sudo chown 1000 /srv/paperlessngx/export
    sudo chown 1000 /srv/paperlessngx/consume