Paperless – Backup Skript

Heute schauen wir uns mein Backup Skript für Paperless Ngx an.

Im Backup enthalten:

  • alle Dokumente
  • alle Einstellungen
  • alle Thumbnails
  • alle OCR Scans

nicht enthalten:

  • Docker Einstellungen (Usershares – sind bewusst nicht enthalten da hier ein einspielen in jede neue Paperless NGX Instanz möglich ist und Unraid euch ja die Docker XML sowieso weg sichert

Somit könnt ihr bei einem Systemcrash eure Daten einfach wiederherstellen auf jedem System.

Als erstes müssen wir herausfinden wie unser Paperless Container genau heißt.

docker ps | grep paperless

Hier sehen wir den Dockernamen: „paperless-ngx“ diesen benötigen wir für folgendes Skript

#!/bin/bash
# Backup-Script für Paperless

# Name des Paperless-Containers mit "docker ps | grep paperless" den richtigen Namen ermitteln
CONTAINER_NAME="paperless-ngx"

# Zielverzeichnis für das Backup
BACKUP_DIR="/mnt/user/Backups/Paperless"

# Anzahl der zu behaltenden Sicherungen
BACKUP_COUNT=7

############ keine Bearbeitung mehr unter dieser Zeile ############ 

# Aktuelles Datum und Uhrzeit im Format YYYY-MM-DD_HH-MM-SS
CURRENT_DATE=$(date +"%Y-%m-%d_%H-%M-%S")

# Überprüfe, ob das Zielverzeichnis existiert
if [ ! -d "$BACKUP_DIR" ]; then
  echo "Fehler: Das Zielverzeichnis '$BACKUP_DIR' existiert nicht."
  exit 1
fi

# Führe den document_exporter Befehl im Paperless-Container aus
docker exec $CONTAINER_NAME document_exporter /usr/src/paperless/export -z -zn "$CURRENT_DATE"

# Kopiere das Backup-Archiv aus dem Container in das Backup-Verzeichnis
docker cp $CONTAINER_NAME:/usr/src/paperless/export/"$CURRENT_DATE.zip" "$BACKUP_DIR/$CURRENT_DATE.zip"

# Lösche die Backup-Datei im Container nach erfolgreichem Kopieren
docker exec $CONTAINER_NAME rm -f /usr/src/paperless/export/"$CURRENT_DATE.zip"

# Behalte nur die letzten BACKUP_COUNT Backups im Backup-Verzeichnis
cd "$BACKUP_DIR" || exit
ls -t | grep -E '\.zip$' | tail -n +$(($BACKUP_COUNT + 1)) | xargs -d '\n' rm -f

Sollte dein Zielverzeichnis nicht richtig sein bzw. nicht existieren wirst du dies im Script sehen.

Sollte alles richtig sein wird es kurz dauern bist folgende Anzeige auftaucht:

Dieses Backup braucht etwas wenn Ihr ein paar Daten habt. Etwas Geduld.

Backup Restore

Um einen Restore auszuführen legt ihr die Zip Datei einfach in /mnt/user/appdata/paperless/

Jetzt suchen wir uns wieder den Docker Namen mit:

docker ps | grep paperless
#!/bin/bash
# Restore-Script für Paperless

# Name des Paperless-Containers mit "docker ps | grep paperless" den richtigen Namen ermitteln
CONTAINER_NAME="paperless"

# Verzeichnis, in dem die manuelle Backup-Datei abgelegt wird
BACKUP_DIR="/mnt/user/appdata/paperless"

############ keine Bearbeitung mehr unter dieser Zeile ############  

# Temporäres Verzeichnis auf dem Host zum Entpacken der .zip-Datei
UNPACK_DIR="$BACKUP_DIR/restore_temp"

# Pfad im Docker-Container, in dem die Dateien verarbeitet werden sollen
CONTAINER_EXPORT_DIR="/usr/src/paperless/export"

# Überprüfe, ob das Backup-Verzeichnis existiert
if [ ! -d "$BACKUP_DIR" ]; then
  echo "Fehler: Das Backup-Verzeichnis '$BACKUP_DIR' existiert nicht."
  exit 1
fi

# Überprüfe, ob eine .zip-Datei im Backup-Verzeichnis vorhanden ist
BACKUP_FILE=$(ls "$BACKUP_DIR" | grep -E '\.zip$' | head -n 1)

if [ -z "$BACKUP_FILE" ]; then
  echo "Fehler: Keine .zip-Datei im Verzeichnis '$BACKUP_DIR' gefunden."
  exit 1
fi

# Erstelle das temporäre Verzeichnis zum Entpacken
if [ ! -d "$UNPACK_DIR" ]; then
  echo "Erstelle das temporäre Verzeichnis '$UNPACK_DIR'..."
  mkdir -p "$UNPACK_DIR"
fi

# Entpacke die .zip-Datei in das temporäre Verzeichnis
echo "Entpacke die Backup-Datei '$BACKUP_FILE' in '$UNPACK_DIR'..."
unzip -o "$BACKUP_DIR/$BACKUP_FILE" -d "$UNPACK_DIR"

# Kopiere die entpackten Dateien in den Docker-Container
echo "Kopiere die entpackten Dateien in den Docker-Container..."
docker cp "$UNPACK_DIR/." "$CONTAINER_NAME:$CONTAINER_EXPORT_DIR/"

# Führe den document_importer Befehl im Docker-Container aus
echo "Stelle Dokumente aus '$CONTAINER_EXPORT_DIR' wieder her..."
if docker exec $CONTAINER_NAME document_importer "$CONTAINER_EXPORT_DIR"; then
  echo "Wiederherstellung erfolgreich."

  # Lösche die .zip-Datei auf dem Host
  echo "Lösche die Backup-Datei '$BACKUP_FILE' auf dem Host..."
  rm -f "$BACKUP_DIR/$BACKUP_FILE"

  # Lösche die entpackten Dateien im temporären Verzeichnis
  echo "Lösche das temporäre Verzeichnis '$UNPACK_DIR'..."
  rm -rf "$UNPACK_DIR"

  # Lösche die Dateien im Docker-Container
  echo "Lösche die Dateien im Docker-Container..."
  docker exec $CONTAINER_NAME sh -c "rm -rf $CONTAINER_EXPORT_DIR/*"
else
  echo "Fehler: Die Wiederherstellung ist fehlgeschlagen."
  exit 1
fi

echo "Wiederherstellung abgeschlossen!"