- Chat GPT
- Yes
Hallo Liebe Gemeinde,
mit dieser Anleitung möchte ich euch helfen eine gute Möglichkeit PaperlesNGX per Cronjob und Duplicati zu sichern.
Cronjob:
unter Linux ist ein automatisch geplanter Task, der zu festgelegten Zeiten oder Intervallen ausgeführt wird.
Er wird über den Dienst cron gesteuert und in der Datei crontab eingerichtet, z. B. um Backups, Skripte oder Wartungsaufgaben regelmäßig ohne manuelles Eingreifen zu starten.
Duplicati:
ist ein kostenloses Open-Source-Backup-Programm, mit dem du verschlüsselte, komprimierte und inkrementelle Backups auf verschiedene Ziele wie NAS, externe Festplatten, FTP-Server oder Cloud-Speicher erstellen kannst – alles über eine einfache Weboberfläche.
- Der erste Schritt, wenn ihr Paperless aufgesetzt habt, ist Duplicati via Portainer zu installieren. Dafür gerne das Tutorial von eineb anschauen --> TUT
BITTE ALLE PFADE UND "USER" ANPASSEN
SSH Aktivieren
als erstes schaltet ihr SSH beim NAS ein
Es wird dann eine ".sh" Datei erstellt, die ihr am besten auf dem NAS speichert. Dafür habe ich als angemeldeter Admin, auf dem NAS einen Ordner im "Persönlichen Ordner" als Admin angelegt.
(Diese ist dann eine Script Datei, die für das automatisieren verantwortlich ist, in Verbindung mit dem Cronjob)
"/home/User/Backup/PaperlessNGX" das wäre der Pfad bei mir
Ihr könnt auch gern gleich die anderen Ordner außer den "alt" Ordner anlegen
- ebenso bitte auch diese Pfade auf der externen Platte anlegen
Danach schaltet ihr euch per SSH Verbindung auf den NAS (ich bevorzuge Putty).
in Putty tragt ihr eure IP vom NAS ein bei mir wäre das 192.168.178.220 und dann als Port die 22 wo ihr den Haken gesetzt habt und drück Open.
nun meldet ihr euch mit eurem selbst angelegtem Admin an. (Euer NAS Admin)
- anschließend wird nun ein Script via "nano" angelegt.
bei Putty können dinge kopiert werden und mit "rechtsklick" eingefügt werden
ist das erledigt sollte sich das Script öffnen.
Bitte passt eure Pfade an. Falls ihr Schwierigkeiten habt, könnt ihr einfach meine .sh Datei bei ChatGPT einfügen und ihm sagen, was eure Pfade sind. Dann sollte er sie anpassen können.
Vor allem Wichtig bei dem "USB_BACKUP_DIR="/mnt/@usb/sdc1/Backup/Paperless_zip"" je nach dem an welche Schnittstelle ihr eure Platte gehängt habt.
- einfach auf den ordner rechtsklicken und den Pfad bei "Ort" kopieren und dann im script einfügen
- macht das bitte in dem script für alle Pfade
- ladet euch zur Not Notepad++ runter um den Text zu editieren (der markierte Teil)
- danach können wir weiter machen
#!/bin/bash
# Backup-Ordner auf dem NAS
BACKUP_DIR="/home/USER/Backup/PaperlessNGX_zip"
EXPORT_DIR="/volume2/docker/paperless/export"
USB_BACKUP_DIR="/mnt/@usb/sdc1/Backup/Paperless_zip"
# NEU: Originals-Quelle und Zielordner für die "raw" Zips
ORIGINALS_DIR="/volume2/docker/paperless/media/documents/originals"
RAW_USB_DIR="/mnt/@usb/sdc1/Backup/Paperless_raw"
RAW_BACKUP_DIR="/home/USER/Backup/PaperlessNGX_raw"
mkdir -p "$BACKUP_DIR"
mkdir -p "$USB_BACKUP_DIR"
mkdir -p "$RAW_USB_DIR"
mkdir -p "$RAW_BACKUP_DIR"
# Datum für das Backup (ohne .zip im Namen!)
BACKUP_NAME="paperless_export_$(date +%F)"
# Prüfen, ob das Backup für heute schon existiert
if [ -f "$EXPORT_DIR/$BACKUP_NAME.zip" ]; then
echo "Backup für heute existiert bereits: $BACKUP_NAME.zip"
else
# Export als ZIP direkt ins gemountete Verzeichnis
docker exec paperlessngx document_exporter -z -zn "$BACKUP_NAME" /usr/src/paperless/export
fi
# Funktion: Maximalanzahl von ZIP-Dateien in einem Ordner begrenzen
limit_zip_count() {
local folder="$1"
local max_files="$2"
if [ -d "$folder" ]; then
local total
total=$(ls -1t "$folder"/*.zip 2>/dev/null | wc -l)
while [ "$total" -gt "$max_files" ]; do
oldest=$(ls -1t "$folder"/*.zip | tail -n 1)
rm -f "$oldest"
echo "Älteste ZIP gelöscht in $folder: $(basename "$oldest")"
total=$(ls -1t "$folder"/*.zip 2>/dev/null | wc -l)
done
fi
}
# Limit für Export-Ordner
limit_zip_count "$EXPORT_DIR" 30
# Zusätzlich Kopien auf NAS und externe Festplatte erstellen
cp "$EXPORT_DIR/$BACKUP_NAME.zip" "$BACKUP_DIR/"
cp "$EXPORT_DIR/$BACKUP_NAME.zip" "$USB_BACKUP_DIR/"
# Limits auch in den Kopie-Zielordnern anwenden
limit_zip_count "$BACKUP_DIR" 30
limit_zip_count "$USB_BACKUP_DIR" 30
echo "Backup erstellt und zusätzlich kopiert nach:"
echo "- $BACKUP_DIR"
echo "- $USB_BACKUP_DIR"
###############################################################################
# NEU: Originals-Ordner 1x täglich zippen und in zwei Zielpfade kopieren
###############################################################################
# Zip-Name der Originals basierend auf dem gleichen Datum wie der Export
ORIGINALS_ZIP_NAME="paperless_originals_${BACKUP_NAME#paperless_export_}.zip"
# Wenn die Datei bereits in BEIDEN Zielen existiert, nichts mehr tun
if [ -f "$RAW_USB_DIR/$ORIGINALS_ZIP_NAME" ] && [ -f "$RAW_BACKUP_DIR/$ORIGINALS_ZIP_NAME" ]; then
echo "Originals-Backup für heute existiert bereits in beiden Zielen: $ORIGINALS_ZIP_NAME"
else
# Temporär in /tmp erstellen
TMP_ZIP="/tmp/$ORIGINALS_ZIP_NAME"
rm -f "$TMP_ZIP"
if [ -d "$ORIGINALS_DIR" ]; then
(
cd "$(dirname "$ORIGINALS_DIR")" || exit 1
zip -r "$TMP_ZIP" "originals" >/dev/null
)
cp "$TMP_ZIP" "$RAW_USB_DIR/"
cp "$TMP_ZIP" "$RAW_BACKUP_DIR/"
rm -f "$TMP_ZIP"
echo "Originals-Backup erstellt und kopiert nach:"
echo "- $RAW_USB_DIR/$ORIGINALS_ZIP_NAME"
echo "- $RAW_BACKUP_DIR/$ORIGINALS_ZIP_NAME"
else
echo "Warnung: Originals-Quelle nicht gefunden: $ORIGINALS_DIR"
fi
fi
# Limits für Originals-Backups anwenden
limit_zip_count "$RAW_USB_DIR" 30
limit_zip_count "$RAW_BACKUP_DIR" 30
Display More
- nachdem Ihr nun alles angepasst und eingefügt habt
- drückt ihr STR + O --> ENTER Taste (ist ein O keine null)
- zum speichern und dann STR + X zum schließen
Anschließend machen wir das Script ausführbar.
- es wird nun .zip benötigt
ich musste mehrere schritte durchführen das es richtig installiert wird. (kann sein, wenn ihr keine Meldung bekommt, das ihr nur den ersten befehl ausführen müsst)
danach könnt ihr Probieren ob das Script geht
Wenn ihr alles richtig gemacht habt, und alles Fuktioniert könnt ihr in den angelegten Ordnern schauen ob nun alle Datein vorhanden sind.
Wir sollten Folgendes erhalten
in den "RAW" Ordnern sind die "Originals" als PDF mit eurer Struktur als .zip gespeichert. Einmal auf der Externen Platte und einmal in eurem /home Verzeichnis.
und in den "_zip" Ordnern die export.zip Dateien, mit denen ihr Paperless auf einem anderen Docker Container widerherstellen könnt.
Das alles wollen wir nun automatisieren. Ich habe es so schreiben lassen, das es jede Nacht um 02:00 Uhr passiert. Ebenso prüft das Script das nicht mehr als 30 Backups erstellt werden. und löscht nach 30 Tagen, dann immmer das Älteste.
in Putty gebt ihr nun folgendes ein
danach öffnet sich wieder ein Fesnter wo ihr folgendes eingebt
0 2 * * * su - USER -c "/home/USER/Backup/PaperlessNGX/backup_paperless.sh >> /home/USER/Backup/PaperlessNGX/backup.log 2>&1"
bei USER bitte wieder euren Admin name eingeben bei dem das Script schon liegt.
- nachdem Ihr nun alles angepasst und eingefügt habt
- drückt ihr STR + O --> ENTER Taste (ist ein O keine 0)
- zum speichern und dann STR + X zum schließen
Nun ist das Script fertig und es sollte nun jede Nacht um 02:00 Uhr alles automatisch ausführen.
Mit Duplicati könnt ihr nun auch noch eine Absicherung erstellen und entweder die "export" Datei nur sichern oder einmal das ganze /home/User/Backup/PaperlessNGX verzeichnis.
viel Spaß ![]()
Edit:
Bestes Video für eine Saubere Paperless Installation