Paperless-ngx, Teil 8: Exportfunktion nutzen

Paperless-ngx läuft rund und macht, was es soll? Prima! Dann wird es Zeit, sich über Backup-Strategien Gedanken zu machen. Schließlich wurde viel Arbeit in den Aufbau und die Organisation der Unterlagen gesteckt – das soll nicht alles „weg“ sein, wenn der Sohnemann mit seinem Lego-Laster ein Regal umwirft oder Blitz die Elektrik zum Erliegen bringt. Heute soll es um den ersten Schritt einer umfassenden Backup-Strategie gehen.
Inhalt
Umfangreiche Exportfunktion nutzen
Bei dem Wort „Export“ denkt man zunächst nur an das Speichern der Dokumente. Die Funktion, die Paperless-ngx eingebaut hat, ist aber viel umfangreicher: Datenbankinhalte, Metadaten, Einstellungen, Nutzer-Accounts – sogar Passwörter für die einzelnen Account: all dies wird mit einem einzigen Befehl gesichert. Mehr noch: Paperless-ngx überprüft auch Änderungen zum letzten durchgeführten Export und passt die Sicherung entsprechend an. Und noch mehr: Die Sicherung kann auf ein anderes Gerät übertragen werden. Wenn dort ebenfalls Paperless-ngx installiert ist, so hat man – nach einem kurzen Import – auch in dieser anderen Installation ein 1:1-Abbild seines Archivs.
Mit anderen Worten, man muss sich keine Gedanken um irgendwelche (Docker-)Pfade, Datenbanken usw. usw. machen. Man führt den Befehl aus, wartet ein paar Sekunden und hat – je nach Einstellung – alles in einem ZIP-Archiv oder auf einem Export-Pfad liegen.
1 Zeile genügt
Zunächst wird die Kommandozeile aufgerufen. Dann hangelt man sich zu seinem Paperless-ngx-Ordner hin, also z.B.
cd /home/pi/paperless-ngx
Dort fügt man den Export-Befehl ein:
sudo docker-compose exec webserver document_exporter ../export
Jetzt ein paar Sekunden warten – danach wurde ein Unterpfad „export“ mit allen Dateien angelegt.
Neben den Datenbank-Einträgen (1) sind damit auch die Vorschau-Bilder (2), die Archiv-Version (3) und die Original-Version (4) des Dokuments gespeichert.
Mit dem zusätzlichen Parameter „-z“ am Ende der Zeile wird von Paperless-ngx alles in ein ZIP-Archiv gepackt:
Hinweise für den Import
Möchte man später die Dokumente in eine Neu-Installation von Paperless-ngx aufnehmen oder zieht man beispielsweise vom Raspberry Pi zu einem Synology-NAS um, so gibt man auf dem Paperless-ngx-Pfad fast den gleichen Befehl ein:
sudo docker-compose exec webserver document_importer ../export
Natürlich müssen zuvor die gesicherten Dateien in den Unterpfad „export“ kopiert werden.
sudo docker-compose exec webserver document_exporter ../export -z
Vorgehen bei Versions-Updates
Das beschriebene Vorgehen klappt problemlos, sofern es sich um die gleiche Paperless-ngx-Version handelt. Aktuell wird gerade Version 2 ausgerollt. Hat man ein reguläres Update von der vorherigen Version (1.17.4) vorgenommen, so wurden automatisch alle Daten übernommen und angepasst. Anschließend kann man mit diesen Dokumenten einen Export vornehmen und ist damit während der 2-er-Generation auf der sicheren Seite. War kein reguläres Update mit vorhandenen Daten möglich, so sollte man zunächst die ältere Paperless-ngx-Version installieren (hier also 1.17.4). Danach die Dateien auf dem Export-Pfad importieren. Und dann erst das Update von 1.17.4 auf 2 vornehmen.
Zeitsteuerung für den Export einrichten (Cronjob)
Wenn das vollständige Archiv erstmalig gesichert wurde, muss man danach nicht ständig den Export anwerfen. Oft wandern die Woche nur 2 bis 10 neue Dokumente ins Archiv – dann genügt es, wenn man beispielsweise auf der Todoliste einen Eintrag hat „Freitag, 15:00 Uhr, Export, wöchentlich“ einträgt.
Oder man nutzt für den Befehl das Texterweiterungstool Espanso, über das ich in einem früheren Artikel berichtet habe.
Eleganter ist es natürlich, wenn unser kleiner Raspberry Pi die Arbeit für uns erledigt. Dazu richten wir einen „Cronjob“ ein. Damit wird der Export z.B. immer nachts um 4:00 Uhr durchgeführt, während wir noch schlummern.
Vorarbeit: Export-Befehl in Datei schreiben
Ein kleines Skript nimmt die Befehle auf, die wir sonst mit der Hand eingeben. Keine Sorge – das ist in 20 Sekunden erledigt. Der Name der Skript-Datei ist gleichgültig, im Beispiel nennen wir sie „ex.sh“. Die wird über den Texteditor Nano erzeugt. Also: Kommandozeile aufrufen und „nano ex.sh“ eingeben:
nano ex.sh
Jetzt öffnet sich eine leere Datei. Die erste Zeile beginnt bei solchen Skripten immer mit „#!/bin/bash“ – danach werden die oben erwähnten Befehle eingetragen:
#!/bin/bash
cd /home/pi/paperless-ngx
sudo docker-compose exec -T webserver document_exporter ../export -z
So sieht die Datei im Nano-Editor aus:
Gespeichert wird mit „Strg + O“, Dateinamen bestätigen, „Strg + X“ für das Schließen des Editors.
Das Skript muss nun noch als ausführbare Datei gekennzeichnet werden. Das geschieht mit diesem Befehl:
chmod +x ex.sh
Cronjob anlegen
Die eben erzeugte Datei starten wir über einen Cronjob. Hier kommt wieder der Texteditor Nano ins Spiel. Zunächst auf der Kommandozeile eingeben
crontab -e
Falls bisher noch von keinem anderen Programm ein Cronjob eingetragen wurde, erfolgt kurz eine Abfrage, ob man Nano verwenden möchte – die angezeigt Ziffer (in der Regel „1“) eingeben. Es muss nun nur eine einzige Zeile eingetragen werden. Diese besteht aus der Zeitangabe und dem Aufruf unserer vorher angelegten Skript-Datei. Die Art der Zeitangabe erkläre ich gleich näher, aber hier direkt mal ein Beispiel:
Mit der Zeile „0 4 * * * /home/pi/ex.sh“ wird der Export von Paperless-ngx täglich morgens um 4:00 Uhr ausgeführt. Aber da man ja neugierig ist, ob alles klappt, richten wir kurz eine „1-Minuten-Sicherung“ ein. Dafür werden als Zeitangabe 5 Sternchen mit Leerraum gesetzt, also:
* * * * * /home/pi/ex.sh
Wieder mit Strg-O/Dateinamen bestätigen/Strg-X speichern und beenden.
Nun mit dem Dateimanager den Export-Pfad aufrufen und schauen, ob da nach einer Minute die Export-Datei generiert wird. Wenn alles korrekt ist, so wird die Datei angelegt und erhält minütlich eine neue Version. Das ist natürlich überflüssig, daher noch einmal mit „crontab -e“ die Zeitsteuerung aufrufen. Und jetzt jene Sicherungsabstände eintragen, die man haben möchte.
Zeiteintrag bestimmen
Die fünf Punkte stehen für „Minute“, „Stunde“, „Tag des Monats“, „Monat“ und „Wochentag“. Das klingt kompliziert, man hat den Bogen aber rasch raus. Ich übernehme hier einfach das Beispiel von Wikipedia:
Für die Ausführung an jedem Samstag um 23:45 Uhr muss der Vorspann also lauten:
45 23 * * 6 /home/pi/ex.sh
Mit einem „/“ an der jeweiligen Stelle kann eine Angabe wie „führe alle x Minuten oder Stunden etwas aus. Also etwa „/10 * * * *“ für „alle 10 Minuten oder „* /6 * * *“ für „alle 6 Stunden“.
4 Uhr morgens ist eine gute Zeit, denn der Vorschlag in der nächsten Folge wird sein, um 4:30 Uhr über ein anderes Tool eine verschlüsselte Komplettsicherung einzurichten. Die zeitliche Automatisierung wird dabei von dem Backup-Tool vorgenommen – wir müssen also keine weiteren Cronjobs mehr „von Hand“ anlegen.
Bisherige Teile der Paperless-ngx-Serie:
Teil 1: Ausführlicher Überblick
Teil 2: Suche & Tags
Teil 3: consume-Ordner – Einsatz von Scannern
Teil 4: Speicherpfade konfigurieren
Teil 5: Installation auf dem Raspberry Pi
Teil 6: Neue Funktionen in Version 2
Teil 7: Dokumente unterwegs über das eigene Modem abrufen
Teil 8: Exportfunktion nutzen
Teil 9: Update durchführen
Teil 10: Das Rundum-sorglos-Backup
Teil 11: Mail-Abruf mit vielen Extras
Teil 12: Mein Alltag mit Paperless-ngx
Teil 13: Ein Quanten-Code für das Papier-Archiv
FORUM für Fragen eröffnet
Teil 14: Automatisierte Ablage auf Speicherpfaden
Teil 15: Neue Funktion für das Verbinden und Trennen von Dokumenten
Teil 16: Dashboard, smarte Widgets und erweiterte Ansichten
Teil 17: Unterordner des consume-Verzeichnisses nutzen
Teil 18: Paperless-ngx auf Synology/NAS ohne Docker nutzen
Teil 19: Praxisbeispiel – kleine Hausverwaltung


33 Kommentare
Wolfgang
Hallo Herbert,
danke für die sehr hilfreiche paperless-ngx-Reihe 🙂
Mit der Anleitung (Teil 8) hat es bei mir zunächst nicht geklappt. Du hast am Anfang den Benutzer ‚pi‘, dann kommen aber zwei Screenshots und den Angaben für ex.sh mit User ‚a‘. ‚pi‘ hatte ich immer brav ersetzt, aber ‚a‘? Einfach brav kopiert. Es hat eine Weile gedauert, bis ich es verstanden habe.
Ich habe die Datei für den Cronjob auch zuerst im Verzeichnis paperless-ngx angelegt, das hat dann nicht geklappt. Beim genaueren Hinsehen (Screenshot paperless9_6.png ) habe ich dann erst gesehen, dass ich wieder ins Benutzerverzeichnis zurückwechseln muss. Vielleicht könnte hier ein kleiner Hinweis ergänzt werden – für Leute wie mich 😉
Liebe Grüße
Wolfgang
Herbert
Danke für den Hinweis – mein Fehler – ich habe 2 Nutzer „a“ bzw. „pi“ – werde ich ändern. Danke!
Sascha
Hi Herbert, ich bin neulich auf die Seite https://crontab.guru gestoßen, die den Zeiteintrag im Cronjob noch mal schön darstellt und auch zur Überprüfung ganz praktisch ist.
VG
Sascha
Herbert
Die sieht gut aus! Kannte ich noch nicht – danke für den Hinweis!
Willi Albrecht
Hallo,
ich hätte mal eine Frage zu der Exportfunktion.
Zuerst einmal, diese lies sich nach Ihrer Anleitung gut einrichten.
Gibt es die Möglichkeit, dass man so eine Art inkrementelle Exports erzeugt, oder muss man bei einem wöchentlichen Export immer alle X-Wochen in den Exportordner gehen und alle „alten“ Exports entfernen?
Ich mache die Exports aktuell in gezippter Form.
Vielen Dank vorab.
Grüße,
Willi
Herbert
Wenn Du nicht den ZIP-Parameter nimmst, sollte es – soweit ich mich erinnere – inkrementell gespeichert werden. Ich lasse über die Aufgabenplanung ein Bash-Skript mit dem ZIP-Export-Befehl ausführen und lösche von Zeit zu Zeit die alten ZIP-Archive. Das könnte man sich ersparen, indem man im Skript vor dem eigentlichen Export-Befehl ein „rm *.*“ schaltet. Probier das einfach mal aus.
Willi Albrecht
Hallo Herbert,
ich habe dennoch den zip-Parameter beibehalten und den Exportbefehl entsprechend erweitert.
Von:
#!/bin/bash
cd /home/pi/paperless-ngx
sudo docker-compose exec -T webserver document_exporter ../export -z
Zu Neu:
#!/bin/bash
cd /home/pi/paperless-ngx/export
rm *.*
cd /home/pi/paperless-ngx
sudo docker-compose exec -T webserver document_exporter ../export -z
Hat beim ersten Test so wunderbar funktioniert.
Vielen herzlichen Dank dafür.
Beste Grüße
Willi
Herbert
Danke für die Rückmeldung! Das hilft sicher auch anderen Lesern!
Holger
Hallo Herbert,
danke für deine tolle PaperlessNGX Reihe. Ich habe dadurch schon einiges an Inspiration bekommen 🙂
Habe auch schon einiges umgesetzt, dabei bin ich über zwei Dinge gestolpert:
– bei mir funktioniert der Befehl „docker-compose“ nicht, ich gebe es immer mit einem Leerzeichen dazwischen ein, also „docker compose“ –> komisch, oder?
– Ich habe das Skript für den Export erstellt und per Crontab eingerichtet, das funktioniert soweit. Nun habe ich versucht, den Output des Befehls in ein Logfile schreiben zu lassen. Üblicherweise mache ich das über „> logfile.log“, das funktioniert hier aber leider nicht.
Danke schon mal vorab,
Holger
Herbert
Das mit „docker compose“ scheint bei manchen Systemen die richtige Schreibweise zu sein – Hintergründe kenne ich da auch nicht.
Ich würde den Log auch mit dem Pipe-Symbol umleiten – welches OS benutzt Du denn?
Holger
Ich nutze das aktuelle Raspberry Pi OS Lite (64-Bit).
Funktioniert das Umleiten der Ausgabe bei dir?
Herbert
Ich habe zur Zeit MX Linux auf meinem Raspberry Pi 5 installiert – aber mein 4-er läuft noch mit Raspberry Pi OS – ich schau‘ mal bei Gelegenheiten, ob ich da etwas finde.
Carina
Hallo Herbert,
vielen Dank für die tolle Artikelserie! Ich habe mich davon inspirieren lassen, Paperless zu installieren und bin begeistert!
Den Export bekomme ich nicht hin. Das Paperless läuft bei mir in einem Docker-Container und ich stelle mich zu dumm an den Paperless-Pfad zu finden. Ich bekommen immer die Fehlermeldung „no configuration file provided: not found“, wenn ich mit docker compose[..] versuche den Export anzustoßen. Hast Du vielleicht eine Idee, woran es liegen könnte?
Viele Grüße
Carina
Herbert
Sofern Du es so installiert hast, wie ich es beschrieben habe, muss es einen Pfad geben, von dem der Ordner „consume“ und der Ordner „documents“ als Unterverzeichnisse verzweigen (bei mir nennet er sich „\home\paperless-ngx“. In diesem Pfad muss eine Datei „docker-compose.yml“. Wenn Du diesen Pfad gefunden hast, dann gibst Du den im Artikel beschriebenen Export-Befehl _innerhalb_ des Pfades im Terminal ein. Oder hast Du es anders installiert?
Carina
Danke, Herbert, für für die schnelle Antwort!
Ich habe es über Portainer installiert. Also nicht wie Du beschrieben hast.
Herbert
Ich hatte Portainer nur mal testweise installiert. Für mich ist es einfacher, die Befehle auf die Kommandozeile zu kopieren. Daher kann ich Dir bei diesem Tool leider nicht helfen. Eventuell gibt es ja andere Leser, die sich besser damit auskennen und einen Tipp für Dich haben.
Carina
Danke Dir, Herbert!
Sebastian
Hallo Herbert,
vielen Dank für die Anleitung! Der Export der Dokumente funktioniert auch sehr schön, ich vermisse jedoch eine Möglichkeit, meine Tags und Korrespondenten zu sichern bzw. wiederherzustellen. Hast du dazu eine Idee?
Viele Grüße
Sebastian
Herbert
Beides sollte beim Export gesichert werden – nach einem Import hast Du Deine Tags usw. wieder.
Sebastian
PS: Ich nutze Docker…
Sebastian
Es werden ausschließlich Dateien mit der Endung .pdf und .webp exportiert. Erwartet hätte ich eine manifest.json oder ähnliches…
Nach dem Import in eine neue, saubere Installation sind keine Tags oder Korrespondenten verfügbar.
Bin ein wenig frustriert 😀
Herbert
Manifest, Tags usw. sind nach meiner Erinnerung da – steht auch ausdrücklich so im Handbuch: „This includes documents, thumbnails and a manifest.json file. The manifest contains all metadata from the database (correspondents, tags, etc).“ https://docs.paperless-ngx.com/administration/
Sebastisn
So hatte ich es auch gelesen, scheinbar wird aber nicht alles exportiert?
Genutzt habe ich:
sudo docker-compose exec webserver document_exporter ../export
Herbert
Der Befehl sollte stimmen – habe gerade auf meinem Export-Pfad nachgeschaut – dort gibt es auch version.json und manifest.json. Also alles so, wie es sein soll.
Sebastian
Update:
Ich konnte das Problem identifizieren. Mein RasPi 3 ist offenbar zu schwach für paperless in Verbindung mit den anderen Aufgaben. Das führt letztlich zu einem Abbruch des Exports.
Seit einem Umstieg auf einen Barebone klappt nun alles.
Murat
Hallo Herbert,
ich habe mein Paperless auf meinem MacBook Air M1 laufen, also nie dauerhaft sondern wenn ich daran sitze.
Läuft alles ganz prächtig und auch mit den Befehl „sudo docker exec paperless_ngx-webserver-1 document_exporter ../export -z“ bekomme ich meine Dateien gesichert, die anschl. von meiner Time Machine gesichert werden. Leider bekomme ich wie von dir beschrieben den Cronjob nicht hin. Zeitbasiert ist bei mir eigentlich doof, da ich ja nicht unbedingt zur vorgegebenen Zeit daran sitze. Gibt es die Möglichkeit anstatt einer Zeit die Aktivität ansich anzugeben? Ansonsten stelle ich 20 Uhr ein, da bin ich eh meist dran.
Jetzt zu meinen Fragen:
– wo muss die ex.sh Datei erstellt werden?
– wenn ich sie in den Hauptordner stelle dann müsste es doch bei mir wie folgt stehen:
#!/bin/bash
cd /Users/murat/docker/paperless
sudo docker exec paperless_ngx-webserver-1 document_exporter ../export -z
– dem Cronjob schreibe ich dann:
* * * * * /Users/murat/docker/ex.sh
Wenn ich bei mir manuell eine Sicherung mache, verlangt mein Terminal immer mein Admin Passwort. Wie umgeht es denn Cronjob, wenn es denn mal anspringt?
Ich hoffe, du verstehst meinen Text. Danke und Gute N8!
Gruß … Murat
PS: Danke für Deine tolle Seite. 😉
Herbert
Hallo Murat,
prima, dass es bei Dir auch auf dem Mac funktioniert! Ich würde in diesem Fall nicht über einen Cronjob die Sicherung regeln. Ideal ist da z.B. das kostenlose Tool „Freefilesync“ https://freefilesync.org Das sichert Dir z.B. Deine Daten, sobald Du einen USB-Stick reinsteckst. Hat noch sehr viel mehr Möglichkeiten, schaue es Dir mal an. Ansonsten kannst Du auch den Taskmanager für Backups auf dem Mac nutzen: CMD + ALT + ESC.
Jakob
Vielen Dank für die ausführlichen und sehr hilfreichen Artikel.
Kann es sein, dass im Crontab-Screenshot ein kleiner Fehler steckt?
`* 4 * * *` triggert nach meinem Verständnis jede Minute zwischen 4:00 und 4:59 Uhr.
Wenn ein Trigger um 4 Uhr gewünscht ist, wie im Text geschrieben, brauchen wir: `0 4 * * *`, oder?
Herbert
Du hast völlig recht! Danke für Deinen Hinweis – habe die Korrektur im Text vermerkt.
Erich
Vielen Dank für Deinen tollen Beitrag, der mir wunderbar als roter Faden im Aufbau meines elektronischen Archives dient.
Ein Hinweis zum ‚importer‘ und ‚exporter‘. Die im Beitrag aufgeführten Befehle haben bei mir nicht funktioniert. funktioniert hat nicht ’sudo docker-compose exec….‘ sondern ’sudo docker exec…‘ – also ohne ‚-compose‘. Dies sowohl für den ‚exporter‘ wie auch für den ‚importer‘
Beste Grüsse
Herbert
Danke für die Rückmeldung und den Hinweis. Ja, je nach OS unterscheidet sich das etwas – manchmal „docker-compose“, manchmal „docker compose“ oder „docker“. Gut, dass Du es erwähnst – das hilft vielleicht auch anderen Anwendern!
Thomas
Hallo Herbert,
Danke für deine Arbeit. Ich benutze Paperless auf einem PI5 schon eine ganze Weile. Nun musste ich doch tatsächlich die Import-/Exportfunktion nutzen. Export hat auch offensichtlich funktioniert. Beim Import kommt die Fehlermeldung: „….directory doesn’t appear to contain a manifest.json file“ und es wird nichts importiert. Es gibt diese Datei aber in der directory.
Kannst Du einen Tip geben?
Thomas
Zu meiner Meldung oben. Nach einem Update des Systems hat sich das Problem erledigt. Herbert, bitte lösche meine Posts. Danke