paperless-ngx: Automatische Backups von Docker Volumes und Mounts via Duplicity einrichten

In einem anderen Artikel habe ich behandelt, wie einfache Sicherungen von paperless-ngx als Verzeichnisstruktur oder als ZIP-Datei angelegt werden können. Das ist dann praktisch, wenn man einen manuellen Export und Import plant oder die Sicherungen nicht sehr regelmäig braucht (wobei auch da eine Automatisierung möglich ist!).

Im folgenden möchte ich zeigen wie man leicht den paperless-ngx Docker-Compose-Stack so erweitert, dass eine regelmäßige Datensicherung über ein altbewährtes Tool mit dem Namen Duplicity erfolgen kann.

Schritt 1: „backup“-Container in einer docker-compose.override.yml einrichten

nano /home/user/paperless-ngx/docker-compose.override.yml
services: 
  backup:
    image: ghcr.io/tecnativa/docker-duplicity-docker
    restart: unless-stopped
    hostname: backup
    domainname: pl.coders-home.de
    restart: always
    volumes:
      - ./redisdata:/backup/paperless-redisdata
      - ./data:/backup/paperless-data
      - ./pgdata:/backup/paperless-pgdata
      - ./media:/backup/paperless-media
      - ./export:/backup/paperless-export
    environment:
      JOB_300_WHAT: 'backup'
      JOB_300_WHEN: 'weekly'
      JOB_400_WHAT: 'dup remove-older-than 3M --force $$DST'
      JOB_400_WHEN: 'weekly'
      SRC: /backup
      DST: sftp://benutzername:passwort@benutzername.your-storagebox.de/
      EMAIL_FROM: duplicity@pl.coders-home.de
      EMAIL_TO: admin@coders-home.de
      SMTP_HOST: 'mail.coders-home.de'
      SMTP_PORT: '465'
      SMTP_USER: 'backups@coders-home.de'
      SMTP_PASS: 'passwort'
      SMTP_TLS: true
      OPTIONS: '--full-if-older-than 1M --metadata-sync-mode partial'
      PASSPHRASE: einlangespasswortzurbackupverschluesselungwelchesgesichertseinmuss

In meinem Beispiel oberhalb sind die entsprechenden Felder mit eigenen Daten zu füllen oder zu entfernen. Mein Beispiel setzt voraus, dass man einen E-Mail-Account mit SMTP-Funktion parat hat, das kann ggf. auch ein Freemail-Account bei einem der bekannten Anbieter sein.

Außerdem erfolgt das Backup via SFTP (Secure File Transfer Protocol) auf eine Hetzner Storagebox. Ein beliebiger anderer Speicher und auch andere Protokolle sind hier möglich. Eine vollständige Liste der unterstützten URL-Formate findet man hier.

Anschließend wieder mit Strg+x, y, „Enter“ abspeichern.

Schritt 2: Wiederkehrendes Kommando zum automatischen Export mit Ofelia einrichten

Praktischerweise sichert man auch gleich fertige paperless-ngx-Sicherungen und nicht nur die Datendateien. Das ist besonders deshalb interessant, weil beispielsweise die Sicherung der pgdata-Ordner, also der PostgreSQL-Datendateien, im laufenden Betrieb schwierig ist, sofern die Datendateien gesperrt sind.

Wir richten daher den automatischen, regelmäßigen Export ein:

nano /home/user/paperless-ngx/docker-compose.override.yml

Wir fügen ein:

services:
  webserver:
    labels:
      - "ofelia.enabled=true"
      - "ofelia.job-exec.paperless-export.schedule=@every 24h"
      - "ofelia.job-exec.paperless-export.command=document_exporter /usr/src/paperless/export"
    volumes:
      - ./data:/usr/src/paperless/data
      - ./media:/usr/src/paperless/media
      - ./export:/usr/src/paperless/export
      - ./consume:/usr/src/paperless/consume
  ofelia:
    image: mcuadros/ofelia:latest
    restart: unless-stopped
    depends_on:
      webserver:
        condition: service_healthy
    command: daemon --docker
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    labels:
      ofelia.job-local.my-test-job.schedule: "@every 120s"
      ofelia.job-local.my-test-job.command: "date"

Gegebenenfalls müssen diese Werte mit den anderen Labels des „webserver“ Containers korrekt zusammengeführt werden. Der Abschnitt „ofelia:“ ist neu hinzugekommen.

Schritt 3: paperless Stack neustarten

docker compose -f /home/user/paperless-ngx/docker-compose.yml -f /home/user/paperless-ngx/docker-compose.override.yml up -d

Schritt 4: Funktion prüfen

Mit dem Kommando

docker compose -f /home/user/paperless-ngx/docker-compose.yml -f /home/user/paperless-ngx/docker-compose.override.yml logs

können wir jeweils die Ausführung der wiederkehrenden Aufgaben wie auch die des Duplicity-Containers sehen. Eventuelle Fehler werden hier entsprechend hinterlegt und müssen behandelt werden. Meistens wird ein Problem aufgrund falscher Zugangsdaten zum entfernten Speicher oder ein falscher Pfad vorliegen.

Eine Ausgabe von ofelia in dieser Art würde unseren erfolgreichen Export quittieren:

ofelia-1  | 2025-11-02T06:48:48.001Z  common.go:125 ▶ NOTICE [Job "paperless-export" (65ef8b78af5e)] Started - document_exporter /usr/src/paperless/export
100%|██████████| 1/1 [00:00<00:00, 88.88it/s]go:125 ▶ NOTICE [Job "paperless-export" (65ef8b78af5e)] StdErr:
ofelia-1  | 2025-11-02T06:48:59.013Z  common.go:125 ▶ NOTICE [Job "paperless-export" (65ef8b78af5e)] Finished in "11.012036674s", failed: false, skipped: false, error: none

Eine Ausgabe vom Duplicity-Container wäre:

backup-1  | crond: crond (busybox 1.37.0) started, log level 8
backup-1  | crond: USER root pid   8 cmd run-parts /etc/periodic/15min
backup-1  | INFO:jobrunner:2025-11-02 07:15:00.935330+00:00 UTC - Running 15min jobs
backup-1  | INFO:jobrunner:Nothing to do

Sobald die Sicherung losläuft, erfolgt auch die entsprechende Ausgabe. Im Beispiel wird Duplicity jedoch nur „weekly“ also wöchentlich ausgeführt, sodass die entsprechende Ausgabe länger auf sich warten lässt.

Schreibe einen Kommentar

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