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.

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.

(Screenshot von Benutzer „a“ – im Text verwende ich den Standardnutzer „pi“.)

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 „* 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:

Aufbau der Zeitangabe

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

14 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

  • 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

  • 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?

        • 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?

Eine Antwort schreiben

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert