Paperless NGX ist eine einfach zu bedienende Lösung zur Verwaltung von Dokumenten. Es kann PDF-Dateien, Office-Dokumente, Bilddateien und Mails verarbeiten.
Am Einfachsten und zu empfehlen ist die Installation als Docker-Container.
Zunächst wird eine Docker-Laufzeitumgebung benötigt. Ubuntu bringt eine Docker-Umgebung mit. Allerdings funktioniert diese mitgelieferte Umgebung oftmals und hier konkret mit den Paperless-Paketen nicht. Darum ist eine Installation von Docker auf der Grundlage der Docker-Dokumentation zuverlässiger (s. https://docs.docker.com/engine/install/ubuntu/). Das habe ich in dem Beitrag über Docker beschrieben.
Die eigentliche Installation von Paperless NGX kann bequem über das Install-Script vorgenommen werden:
$ bash -c "$(curl --location --silent --show-error https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/install-paperless-ngx.sh)"
Im folgenden Dialog können die meisten Vorgaben übernommen werden. Wichtig ist, die Frage nach der Installation von TIKA zu bejaen, damit auch Office-Dokumente und Mails verarbeitet werden. Wenn Paperless NGX nicht über eine Domain erreichbar sein soll und wird, dann kann diese entsprechende Frage leer bestätigt werden. Bei den Fragen nach den Pfaden, sollten zumindest die Pfade für consume und Media auf das lokale Homeshare gelegt werden
Damit direkt in das DMS gescannt werden kann, muss der Scanner Dateien im Consume-Ordner ablegen können. Wenn dazu das SMB-Protokoll genutzt werden soll, dann ist auf dem DMS-Server ein Samba-Server zu installieren und eine entsprechende Freigabe einzurichen. Die Freigabe wird in der Datei "/etc/samba/smb.conf" eingetragen:
[paperless]
comment = Paperless Eingangsordner
path = /home/andreas/paperless-ngx/paperless-ngx/consume
browsable = yes
read only = no
guest ok = no
Nach jeder Änderung der smb.conf ist der Samba-Server neu zu starten:
sudo systemctl daemon-reload && sudo systemctl restart smbd
Nun ist der Consume-Ordner als Freigabe im Netz verfügbar. Verarbeitbare Dateien (Office-Dateien, Mails, Textdateien, Grafiken und natürlich PDF), die in diesen Ordner geschrieben werden, werden von Paperless-NGX verarbeitet.
Mein DMS-Server, ein LXC auf einem Proxmox-Host, wird jede Nacht auf den Proxmox-Backup-Server gesichert und kann komplett zurück gesichert werden und es kann auch ein Filerestore vorgenommen werden. Da der PBS immer sieben Sicherungen aufbewahrt, kann jederzeit auf die Stände der letzten sieben Tage zurück gesichert werden.
Zur Offsite-Sicherung wird jeden Tag um 12:00 Uhr eine verschlüsselte, inkrementelle Sicherung des Eportproduktes per duplicati durchgeführt. Dazu wird zunächst per Cronjob um 11:30 Uhr der Export durchgeführt:
30 11 * * * andreas docker exec paperless-webserver-1 document_exporter /usr/src/paperless/data/export
Der Pfad "/usr/src/paperless/data/" ist in der docker-compose-yml für Duplicati (s. dort) hinterlegt und entspricht auf dem DMS-Server dem Pfad "/home/andreas/paperless-ngx/paperless-ngx/data". Dort ist ein Verzeichnis "export" eingerichtet, in das dann per cronjob und exporter die Export-Dateien abgelegt werden.
Dieses Verzeichnis ist per Samba freigegeben. Dazu steht in der Datei "/etc/samba/smb.conf" des DMS-Servers:
[export]
comment = Export von Paperless-NGX
path = /home/andreas/paperless-ngx/paperless-ngx/data/export
browsable = yes
read only = no
guest ok = no
Dieses Verzeichnis ist auf dem Server, auf dem Duplicati läuft, unter "/export" gemounted:
//10.10.0.110/export /export cifs vers=3.0,username=ichhalt,password=**********,uid=1000,gid=1000 0 0
In der Datei "docker-compose.yml" für Ducati ist dieses Verzeichnis als Volume eingetragen:
volumes:
...
- /export:/dms-export
In Duplicati ist nun ein Sicherungsjob namens "dms",
eingerichtet, der die Daten täglich um 12:00 Uhr incrementell
und verschlüsselt in das Verzeichnis "/backup/dms" sichert. Das
Verzeichnis "backup" ist in der Datei "docker-compose.yml" als
Volume mit dem Ziel "/remote-backup" eingetragen.
Das Verzeichnis "/remote-backup" auf dem Duplicati-Server ist
eine SMB-Freigabe auf einen vServer von Netcup, auf den per
Wireguard-Tunnel zugegriffen wird, und die auf dem
Duplicati-Server gemounted ist.
Die nachfolgende Grafik veranschaulicht das Prinzip (hoffentlich):
Updates können bequem durch Aktualisierung Container durchgeführt werden. Dazu wechselt man zunächst auf der Linux-Konsole in den Ordner mit der entsprechenden YAML-Datei (docker-compose.yml).
cd /home/andreas/paperless-ngx
Dort setzt man den Befehl zum Stoppen des Containers ab:
docker-compose down
Dann pullt man die aktuelle Version:
docker-compose pull
Das funktioniert, wenn wir bei der Installation die Version "latest" vorgegeben haben. Danach muss die neue Version gestartet werden:
docker-compose up -d
Wenn das ohne Fehlermeldungen durchgelaufen ist, dann ist die Paperless NGX-Instanz aktualisiert.
Für eine Migration oder einen Umzug müssen zunächst die Quell- und die Zielinstanz in der selben Version vorliegen. Ggf. ist zunächst ein Update durchzuführen. Dann wird von der Quellinstanz der Export durchgeführt:
docker exec -it paperless-webserver-1 document_exporter ../data/export
Die Daten liegen dann im Verzeichnis ../data/export (also z.B. "/home/andreas/paperless-ngx/data/export").
Zum Importieren müssen sie zunächst auf den Zielserver übertragen werden. Wenn sie in den oben genannten Ordner kopiert wurden, dann können sie nun mit dem Befehl
docker exec -it paperless-webserver-1 document_importer ../data/export
importiert werden. Dadurch wird die Datenbank überschrieben und alle Daten werden importiert. Der Name des betreffenden Containers (hier "paperless-webserver-1" genannt) muss natürlich passen. Er kann mit
docker ps
ausgelesen werden.
Das hat erst geklappt, nachdem ich die Daten mit
docker cp export paperless-webserver-1:/usr/src/paperless/export
vom Verzeichnis /home/andreas/paperless-ngx/export in den Container kopiert habe. Dann konnte ich
docker exec -it paperless-webserver-1 document_importer /usr/src/paperless/export/export
ausführen und der Import startete.
Wenn der Webserver nach einem Neustart des Servers nicht auf Port 8000 lauscht, dann hilft es, zunächst die Firewall des Server temporär zu deaktivieren und den Webserver (über Portainer) neu zu starten. Danach kann die Firewall wieder aktiviert werden.