Kochrezept für Paperless-ngx mit Tika auf Ubuntu minimal 22.04 LTS

Anbei ein Rezept für Paperless NGX, wie ich das Ding bei mir bereitgestellt habe. Basis ist Ubuntu minimal 22.04, sowie die Docker-Empfehlung von Paperless-NGX mit Tika. Benötigt einen Reverseproxy, z.B. nginx-proxy-manager. Ziel der Sache ist, nicht nur mit einem Dokumentenscanner über eine Freigabe Dokumente abzulegen, sondern auch Office-Dokumente zu verstehen und Rechnungen per Mail an das Ding weiterzuleiten.

Das ECM Paperless-ngx (Fork vom Fork von Paperless) kann in V2 recht viel von dem, was ich persönlich brauche: Klassifizierung, Volltext-OCR, Korri-Logik, umfangreiche Rechtekonzepte, Training der Erkennung von Belegdaten. Notfalls sogar benutzerdefinierte Felder machen das Leben mit Paperless-ngx deutlich einfacher.

Paperless-ngx ist primär eine rein webbasierte Anwendung. Wer auf Versionierung mit Checkin/Checkout, direkte Bearbeitung/Anmerkungen auf den Dokumenten oder Prozessmanagement/Routing verzichten kann, sollte mit dem Ding glücklich werden können – Ich behaupte mal, das trifft für 90% der privaten Anwendungszwecke zu. Zudem gibt es gute Clients für Android (Link) und iOS (Link) für die Nutzung unterwegs.

Beispiel der Oberfläche aus Paperless-ngx, als Chrome-Webapp:

Die Bereitstellung der Serverinstanz ist ob der vielen unterschiedlichen Howto’s (welche zum Teil gar nicht mehr passen oder auf NGX-Vorgänger zielen) nicht ganz einfach oder verwirrend. Von Bare-Metal will ich abraten und halte es da mit der Empfehlung vom Entwickler mit Docker, um die Aktualisierung einfach zu halten.

Ich will mit Nachdruck davon abraten, Container auf NAS von Herstellern, wie Synology oder QNAP zu installieren – auch aus eigener, schmerzhafter Erfahrung (Link). Wohl aber eignen sich die Dinger als Backup-Ziel Eurer VM’s, z.B. aus Proxmox, HyperV oder ESXI.


URL wunschgemäß in nxinx-proxy-manager veröffentlichen, DNS-Konfiguration durchführen.

Man nehme eine VM (keinen Container!), Ubuntu minimal 22.04 LTS, 2vCPU, 4G RAM, min. 40GB HDD.

Nach der Installation aktualisieren und installieren:

sudo apt update && sudo apt upgrade -y && sudo apt install samba openssh docker docker-compose acl -y

Dann paperless Systembenutzer hinzufügen:

sudo adduser paperless
sudo usermod -aG sudo paperless
sudo gpasswd -a paperless docker
id paperless (wenn nicht 1001/1001, dann aufschreiben)

Dann Verzeichnisse erstellen:

sudo mkdir /opt/paperless-ngx
cd /opt
sudo setfacl -Rdm g:docker:rwx paperless-ngx/
sudo setfacl -Rm g:docker:rwx paperless-ngx/
cd paperless-ngx/

Dann installieren:

su paperless

bash -c "$(curl --location --silent --show-error https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/install-paperless-ngx.sh)"

Einzeiler, Quelle https://docs.paperless-ngx.com/setup/#docker_script

Pfade wie zuvor angegeben, als Unterordner von /opt/paperless-ngx erstellen, z.B. consume, media, db, usw.; URL wie im Reverseproxy veröffentlicht angeben, UID und GID wie zuvor überprüft angeben, OCR-Sprache ist deu, Europe/Berlin.

Skript erzeugt in /opt/paperless die 2 Dateien

docker-compose.yml
docker-compose.env

Danach anpassen / prüfen:

nano /opt/paperless-ngx/docker-compose.env
PAPERLESS_URL=INKLUSIVE:ZIELPORT

besonders auch (falls ID vom User "paperless" oben abweichend)

USERMAP_UID=1001
USERMAP_GID=1001

Weitere Konfigurationsoptionen hier nachlesen: (Link), z.B.:

PAPERLESS_EMAIL_TASK_CRON=*/2 * * * *
PAPERLESS_OCR_USER_ARGS={"invalidate_digital_signatures": true}

Danach starten (zunächst ohne -d)

docker-compose up -d

Das System holt sich die Images (dauert etwas) und sollte anschließend starten und auf der URL erreichbar sein. Anmelden geht aber noch nicht.

Paperless-Benutzer anlegen:

docker-compose run --rm webserver createsuperuser

Anschließend noch Samba konfigurieren:

sudo nano /etc/samba/smb.conf

Ab nachfolgender Zeile auskommentieren und oder bis Ende ersetzen:

#======================= Share Definitions =======================

[global]
map to guest = never

[homes]
comment = Home
browsable = no
read only = yes
valid users = %S
create mask = 0700
directory mask = 0700

[paperless]
comment = Paperless Freigabe
valid users = paperless
path = /opt/paperless-ngx/consume/
public = no
writable = yes
printable = no
browsable = yes
guest ok = no
create mask = 0700
directory mask = 0700

Dem User paperless noch ein SMB-Kennwort geben:

sudo smbpasswd -a paperless

Verzeichnisse anpassen und Samba durchstarten:

sudo chown -R paperless:paperless /opt/paperless-ngx/consume/
sudo chmod 700 /opt/paperless-ngx/consume/
sudo systemctl restart smbd

Der consume-folder zum Scannen ist dann unter \\servername\paperless erreichbar und schluckt Dokumente.

Backup

kann man über die eigene VM-Umgebung machen (z.B. Proxmox), über Docker – hierzu gibt es auch eine Dokumentation (Link), oder über das hauseigene Export-Tool. Das könnte ich dann auch in regelmäßigen Abständen durchführen, bzw. scripten.

Sofern Du installiert hast, wie ich hier aufgeschrieben habe, willst Du ggf. vorab noch in der docker-compose.yml in den Volumes vom Abschnitt Webserver kontrollieren, ob die Pfade passen.

Den eigentlichen Export fährst Du dann im laufenden Betrieb über folgendes Kommando:

cd /opt/paperless-ngx

sudo docker-compose run --rm webserver document_exporter /usr/src/paperless/export --zip

Wenn dann alles gut gelaufen ist, findest Du ein Protokoll wie folgt vor:

Creating paperless_webserver_run ... done
Paperless-ngx docker container starting...
Mapping UID and GID for paperless:paperless to 1001:1001
Creating directory /tmp/paperless
Adjusting permissions of paperless files. This may take a while.
Waiting for PostgreSQL to start...
Waiting for Redis...
Connected to Redis broker.
Apply database migrations...
Operations to perform:
  Apply all migrations: admin, auth, authtoken, contenttypes, django_celery_results, documents, guardian, paperless_mail, sessions
Running migrations:
  No migrations to apply.
Running Django checks
System check identified no issues (0 silenced).
Executing management command document_exporter /usr/src/paperless/export --zip
100%|██████████████████████████████████████████| 1021/1021 [00:27<00:00, 36.61it/s]

Und das Backup-File im Ordner /opt/paperless-ngx/export.

Solltest Du das ganze scripten wollen, um den Export in der nacht auf ein SMB-Share irgendwo zu kopieren, anbei ein Quick & Dirty Beispiel:

sudo apt install cron -y && apt install cifs-utils -y
mkdir //opt/paperless-ngx/backup/

Script anpassen (Pfade, Benutzername und Kennwörter):

#!/bin/bash
echo "Backing up Paperless-NGX"
cd /opt/paperless-ngx
echo "Exporting..."
docker-compose run --rm webserver document_exporter /usr/src/paperless/export --zip
sudo mount -t cifs //SERVERIP/SHARENAME/FOLDER //opt/paperless-ngx/backup -o username=BENUTZERNAME,password=PASSWORT
echo "Moving..."
mv //opt/paperless-ngx/export/*.zip //opt/paperless-ngx/backup/
# echo "Deleting backups older than 30 days..."
# find //opt/paperless-ngx/backup/ -type f -mtime +30 -delete
umount //opt/paperless-ngx/backup
echo "docker cleanup"
docker system prune -a -f
echo "Done"

Danach kannst Du das Ding ausführbar machen:

chmod +x //opt/paperless-ngx/backup.sh

Und als Cronjob (mit sudo als root) hinterlegen, so dass es als root ausgeführt wird:

sudo crontab -e

30 2 * * * /opt/paperless-ngx/backup.sh

So sollte das Ding jede Nacht um 2:30 ausgeführt werden. Wenn Du find im Script nicht mehr auskommentierst, kann er alles löschen, was älter als 30 Tage ist (Beispiel).

Anmerkung: Du solltest Deinen eigenen Workflow bauen, den Schadensfall selbst testen, und Du bist selbst verantwortlich für die saubere Funktion Deines Backups.