Paperless-ngx als papierloses DMS / Archiv für zuhause auf QNAP Docker

Bisher hatte ich ecoDMS als papierlosses Dokumentenmanagementsystem (DMS) daheim verwendet. Nun erfolgte bei mir daheim der Umstieg auf Paperless-ngx.

Im Folgenden stelle ich zuerst meine aktuelle Infrastruktur dar und erkläre, was bei ecoDMS für privatanwender nicht ideal läuft und warum für mich Paperless-ngx besser zu sein scheint. Danach folgt die Installationsanleitung und Darstellung der Konfiguration.

Hardware / Infrastruktur

Die Hardware, für die ich mich damals entschieden habe ist folgende:

Der Scanner kann duplex scannen und ist relativ schnell im Scanvorgang. Wenn der Scanner die Daten auf dem NAS ablegt, dann ist das mit etwas wartezeit verbunden. Länger, wenn die Scans viele Seiten umfassen. Auch das Menü ist etwas träge, wenn man über den Schnellzugrif (2 mal tippen für Scan) auf das Netzlaufwerk auf dem NAS speichern möchte. Da das nur für zuhause die Datenablage bildet, ist ein wenig Wartezeit verkraftbar – man hat ja auch noch nebenbei die Blätter physikalisch zu sortieren oder gar zu stempeln.

Bisheriger Arbeitsablauf (2023)

Bisher hatte ich mit ecoDMS ein System im Einsatz, das alle paar Jahre etwas Geld kostet. Hier war der Arbeitsablauf wie folgt:

  • Scan auf ein Netzlaufwerk – das macht der Scanner von alleine.
  • ecoDMS Applikation starten und in die INBOX gehen. Dort liegen alle gescannten Dateien zur Prüfung. Seiten drehen, Dokument klassifizieren, fertig.

Das hört sich im Grundsatz sehr einfach an. Die Probleme und damit die Entscheidung gegen ecoDMS liegen jedoch wo anders.

  • Automatisches Klassifizieren ist umständlich. Hier muss man regex experte werden, um bspw. Versicherungsnummern, Kennzeichen, o. ä. zuverlässig automatisch zu klassifizieren.
  • Beim Klassifizieren habe ich gefühlt ewige Zeit verbraucht, da Massenklassifizierung schlicht fehlt. Wird das System mit „alten Daten“ gefüttert, muss man jedes Dokument einzeln durchklicken und einzeln klassifizieren.
  • Bei jedem Update von ecoDMS muss man die Lizenz deaktivieren, den Docker Container neu anlegen, alle Daten sicherheitshalber für das Update kopieren, Windows Software aktualisieren, Lizenz wieder einspielen. Dieser Aufwand ist mir einfach zu viel und für viele Anwender schlicht überfordernd.
  • ecoDMS kann „deskew“ nicht – also wenn das Dokument 3 Grad schief eingescannt ist, dann wird es auch so archiviert – mit allen Folgen für die Texterkennung (OCR).
  • Die Weblösung von ecoDMS wurde mit der Zeit immer mehr erweitert, jedoch ist der Funktionsumfang nicht vollständig. Das bedeutet, ich muss für bspw. Einstellungen den Windows Client installiert haben. Web und Client sind vollkommen unterschiedliche Applikationen. Da finde ich es handlicher, nur eine Oberfläche zu haben, über die ich alles tun kann. Und diese eine Oberfläche muss Webfähig sein.

In Summe ist ecoDMS dennoch ein gutes System. Hier kann man Massen an gleichartigen Dokumenten besser verarbeiten. Über die Vorlagen kann man klar definieren, wo man bspw. das Datum erwartet, Rechnungsbeträge direkt in Felder extrahieren, etc.

Das sind jedoch Features, die ich privat nicht benötige. Und zufällig bin ich auf paperless-ngx gestoßen – für meine private Datenhaltung klar besser.

Ablauf mit Paperless und PDF-Web-Edit (2024)

Im Grundsatz ist der Ablauf der gleiche wie zuvor:

  • Scannen
  • Seiten drehen, aufteilen und zusammenführen
  • Dokument klassifizieren

Hier ist der Unterschied jedoch wie folgt: Nach dem Scanner landen die Dokumente zuerst in der PDF-Bearbeitung außerhalb von Paperless-ngx – nämlich in pdf-web-edit. Dort werden die PDF-Dokumente nur bearbeitet hin auf die richtige Orientierung und die richtige Dokumentenaufteilung. Größere Dokumente, die auf einmal nicht gescannt werden konnten, werden zusammengführt. Beim Speichern erst landet das Dokument im Posteingang von Paperless.

Paperless-ngx hat einen selbstlernmechanismus und verschiedene Möglichkeiten einfache Automatismen selbst zu definieren. In Paperless werden neue Dokumente mit dem INBOX Tag versehen und automatismen durchgeführt – sie sind schon im DMS gespeichert und auffindbar. Wenn man nun alle Dokumente mit dem INBOX Tag durchblättert und taggt, das Datum ggf. korrigiert (Vorschläge zum taggen übernimmt), nimmt man final einfach das INBOX Tag weg und das Dokument ist damit final abgelegt.

Paperless mit Office-Dokumenten

Paperless kann mehr als nur PDF-Dokumente verarbeiten. Auch die folgenden Office-Dokumente kann es mit Hilfe von den Docker Containern tika und gotenberg importieren und verarbeiten.

  • Emails als *.eml
  • Word-Dokumente
  • Excel-Tabellen
  • PowerPoint-Präsentationen

Installation von pdf-web-edit per Docker yaml auf QNAP

Auch hier das gleiche Vorgehen. Container Station aufrufen, „Applications“ auswählen und auf „+ Create“ klicken. Es öffnet sich ein Fenster, bei dem man oben den Application Name eingeben muss – hier empfiehlt sich bspw. „pdf-web-edit“.

Darunter ist ein Feld, in dem der folgende „YAML code“ eingetragen werden kann:

version: '3'

services:
  pdf-web-edit:
    image: lbrowning/pdf-web-edit:latest
    container_name: pdf-web-edit
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Berlin
    volumes:
      - /share/<YOURPATHTOYOURCONTAINERDATA>/config:/config
      - /share/<YOURPATHTOYOURCONTAINERDATA>/inbox:/inbox
      - /share/<YOURPATHTOYOURCONTAINERDATA>/consume:/outbox
      - /share/<YOURPATHTOYOURCONTAINERDATA>/archive:/archive
    ports:
      - 101010:80
    restart: unless-stopped

In dieser Konfiguration muss noch unter „Volumes“ der Wert „<YOURPATHTOYOURCONTAINERDATA>“ zu einem sinnvollen Wert geändert werden. So könnten beispielsweise die persistenten Datenverzeichnisse „config“ und „archive“ unter /share/Container/pdf-web-edit/* gelegt werden.

Der Ordner „inbox“ ist der Ordner, in den der Scanner die Dateien ablegen soll. Das ist ein Ordner analog zum „scaninput“ bei ecoDMS. Sinnvoll ist somit ein Verzeichnis, das auf der Ebene der Samba / Netzlaufwerk Ebene angesiedelt ist. Beispielsweise /share/scan/inbox

Dann gibt es noch die Outbox – wenn man im pdf-web-edit auf Save klickt, landen die Dateien im Ordner outbox des pdf-web-edit. Diesen kann man direkt auf das „consume“ Verzeichnis von der Paperless-Instanz legen. Sinnvoll ist somit ein Verzeichnis, das auf der Ebene der Samba / Netzlaufwerk Ebene angesiedelt ist. Beispielsweise /share/scan/consume

Was nun funktionieren sollte:

  • Aufrufen von pdf-web-edit – http://<NAS-IP>:101010
  • Dateien ablegen im „inbox“ Order -> Datei kann man im pdf-web-edit sehen (ggf. Browser refresh / F5)
  • In pdf-web-edit auf den Haken klicken -> Datei liegt nun im Ordner „consume“

Mit diesen Einstellungen sind wir nun vorbereitet für die Installation und Konfiguration von Paperless.

Installation von Paperless per Docker yaml auf QNAP

Wie immer straigt forward und einfach. Container Station aufrufen, „Applications“ auswählen und auf „+ Create“ klicken. Es öffnet sich ein Fenster, bei dem man oben den Application Name eingeben muss – hier empfiehlt sich bspw. „paperless“.

Darunter ist ein Feld, in dem der nachfolgende „YAML code“ eingetragen werden kann:

version: "3.4"
services:
  broker:
    image: docker.io/library/redis:7
    restart: unless-stopped
    volumes:
      - /share/<YOURPATHTOYOURCONTAINERDATA>/redisdata:/data

  db:
    image: docker.io/library/postgres:15
    restart: unless-stopped
    volumes:
      - /share/<YOURPATHTOYOURCONTAINERDATA>/pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: paperless
      POSTGRES_USER: paperless
      POSTGRES_PASSWORD: paperless

  webserver:
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    restart: unless-stopped
    depends_on:
      - db
      - broker
      - gotenberg
      - tika
    ports:
      - "101020:8000"
    healthcheck:
      test: ["CMD", "curl", "-fs", "-S", "--max-time", "2", "http://localhost:8000"]
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - /share/<YOURPATHTOYOURCONTAINERDATA>/data:/usr/src/paperless/data
      - /share/<YOURPATHTOYOURCONTAINERDATA>/media:/usr/src/paperless/media
      - /share/<YOURPATHTOYOURCONTAINERDATA>/export:/usr/src/paperless/export
      - /share/<YOURPATHTOYOURCONTAINERDATA>/consume:/usr/src/paperless/consume
    environment:
      PAPERLESS_REDIS: redis://broker:6379
      PAPERLESS_DBHOST: db
      
      PAPERLESS_ADMIN_USER: <YOURSECRETUSER>
      PAPERLESS_ADMIN_PASSWORD: <YOURSECRETPASS>
      PAPERLESS_SECRET_KEY: <YOURSECRETKEY>
            
      PAPERLESS_OCR_CLEAN: clean-final
      PAPERLESS_OCR_SKIP_ARCHIVE_FILE: never
      PAPERLESS_CONSUMER_POLLING: 10
      PAPERLESS_OCR_LANGUAGE: deu+eng
      PAPERLESS_TIME_ZONE: Europe/Berlin
            
      PAPERLESS_TIKA_ENABLED: 1
      PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
      PAPERLESS_TIKA_ENDPOINT: http://tika:9998


  gotenberg:
    image: gotenberg/gotenberg
    restart: on-failure:5
    ports:
      - 3000:3000
    # 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/.*"

  tika:
    image: ghcr.io/paperless-ngx/tika
    restart: always
    ports:
      - 9998:9998

Es müssen ein paar Elemente angepasst werden:

  • <YOURSECRETUSER> – Der Administrations-Login Benutzer
  • <YOURSECRETPASS> – Und das Passwort dieses Benutzers
  • <YOURSECRETKEY> – Das ist aus Sicherheitsgründen zu setzen, hier wählt man einen sehr langen, randomisierten String aus Zahlen und Buchstaben
  • <YOURPATHTOYOURCONTAINERDATA> – analog oben könnte dies wie folgt gesetzt werden: „/share/Container/paperless/“
  • consume – Wichtig ist dieser Ordner, der sollte auf den gleichen Pfad zeigen, wie schon der output Ordner im web-pdf-edit. Im obigen Teil habe ich folgenden Pfad als Beispiel gesetzt: „/share/scan/consume“

Mit dieser Einstellung kann man recht einfach loslegen und Paperless auf folgender Adresse aufrufen:

  • http://<NAS-IP>:101020

Konfiguration von Paperless-ngx

Jetzt werden grundsätzlich die Dokumente aus dem „consume“ Ordner eingelesen, per unpaper und tesseract analysiert und in Paperless dargestellt. Nachfolgend noch Konfigurationshilfen, nachdem man sich in Paperless angemeldet hat.

INBOX – Einfach einen Tag anlegen und beispielsweise „INBOX“ nennen. Dann den Haken bei „Posteingangs-Tag“ setzen. Nun werden alle neuen Dokumente mit diesem Tag versehen. Hilfreich für mich war das speichern der Ansicht „Alle Dokumente mit dem Tag INBOX“ und links ins Menü zu hängen.

Korrespondenten – Das sind Behörden, Institutionen, Unternehmen, Menschen o. Ä. von denen die Kommunikation kommt. Das ganze kann man etwas generischer anlegen, bspw. „Bank“, „Versicherung“, „Finanzamt“ … oder eben ganz konkret wie bspw. „Deutsche Rentenversicherung“, „Mercedes-Benz Group AG“, „BMW AG“… Man kann natürlich auch beides Mischen, wenn man will.

Tags – Ich verwende Tags für einen konkreten Sachverhalt. Beispielsweise eine Auslandskrankenversicherung hat einen Tag mit der Mitgliedsnummer und dem Namen. Auto und Motorrad erhalten je einen eigenen Tag mit dem Kennzeichen. Die Konkrete Bank mit der Kontonummer, etc. Denn ein Tag kann automatisch zugewiesen werden über verschiedene Mechanismen. Findet man bspw. die Vertragsnummer der Auslandskrankenversicherung, so wird automatisch dieser Tag vergeben. Über einen Arbeitsablauf kann dann wiederum diese Versicherung mit weiteren Tags, Korrespondenten, Speicherpfaden, etc. versehen werden.

Dokumententypen – Hier habe ich ein paar allgemeine Typen angelegt. Beispiele sind „Rechnung“, „Vertrag“, „Anleitung“. Verständlich ist dies bei vielen Abos – einmal wird der Vertrag erstellt, dann folgen unzählige Rechnungen – wenn man den Vertrag schnell wiederfinden möchte, lohnt sich eine solche Klassifizierung über den Dokumententyp.

Speicherpfade – Das repräsentiert, wie die Dokumente auf dem Dateisystem in Paperless abgelegt werden und wie der Name vergeben wird. Man kann hier bspw. mehrere Pfade angeben, für Versicherung (Korrespondent) oder die INBOX (Tag) oder Rechnungen (Dokumententyp) und von dieser Basis weitere Unterverzeichnisse anlegen. Eine Dokumentation hat Paperless dazu natürlich auch. Ein Beispiel hierfür ist:

  • Versicherungen/{tag_list}/{correspondent}/{created_year}/{created} {document_type} {title}

Damit ist „Versicherungen“ ein fester Bestandteil, danach folgen dynamische Bestandteile. Mit dieser Vorgabe kann man per Arbeitsablauf bspw. alle Dokumente in den Ordner „Versicherungen“ ablegen, die den Tag, Korrespondenten, Dokumententyp oder einem anderen Muster entsprechen.

Will man E-Mails ebenfalls abrufen und archivieren, kann dies ebenfalls im Menü eingestellt werden. Die Voraussetzungen Tika und gotenberg sind bereits in der oben beschriebenen yaml integriert.

Es gibt noch viele weitere Funktionen, die ich hier nicht im Detail vorstellen möchte, deswegen – FERTIG.

Aktuelle Version von Paperless-ngx: 2.4.0