Duplicati (Docker) [ThoSch:Wiki]

Benutzer-Werkzeuge

Webseiten-Werkzeuge


thoschwiki:docker:apps:duplicati

Duplicati (Docker)

Duplicati ist eine Software, die verschlüsselte, komprimierte, inkrementelle Datensicherungen (Backups) erstellt und diese auf Netzwerklaufwerke, integrierte oder externe USB-Festplatten oder Onlinespeicher überträgt. (aus Duplicati)

Duplicati zeichnet sich durch die folgenden Punkte aus:

  • Bedienung über ein Web-Frontend, d.h. von außerhalb des Containers per Browser gut bedienbar
  • umfassende Unterstützung von (freien) Netzwerkprotokollen und Cloud-Diensten für die Erstellung von Offside-Backups
  • Verschlüsselung der Sicherungsdateien, d.h. diese können auch unsicheren Servern gespeichert werden

Duplicati ist mit .NET entwickelt und läuft unter unixoiden Betriebssystemen wie Linux oder nacOS mit Mono. Das Windows-Erbe ist beispielsweise beim Namen des Commandline-Tools Duplicati.CommandLine.exe deutlich erkennbar.

Auf jeden Fall nichts, was ich „direkt“ auf meinen Linux- oder macOS-Rechner installieren möchte. Also so oder so ein Fall für eine Virtualisiserung.

Image
Docker Hub linuxserver/duplicati
GitHub linuxserver/docker-duplicati
Architektur x86-64, armhf, arm64
Software
Projekt Duplicati
GitHub duplicati/duplicati
Anmerkung
Es gibt bei DockerHub ein Repository duplicati mit dem Image duplicati/duplicati, das durch die Namensgebung den Eindruck erwecken könnte. dass es vom Duplicati-Projekt gepflegt wird. Jedoch finde ich keinerlei Bezug zwischen dem Repository und dem Projekt und es gibt auch keine andere Möglichkeit den Maintainer zu identifizieren oder zu kontaktieren. Weiterhin ist das Image nur sehr lückenhaft dokumentiert.

docker run

Der Container wird wie folgt mit docker run eingerichtet und gestartet:

docker run -d \ 
  --name=duplicati \
  -e PUID=2000 \
  -e PGID=2000 \
  -e TZ=Europe/Berlin \
  -e CLI_ARGS= `#optional` \
  -p 8200:8200 \
  -v /path/to/appdata/config:/config \
  -v /path/to/backups:/backups \
  -v /path/to/source:/source \
  --restart unless-stopped \
  linuxserver/duplicati

Parameter

Dies sind die wichtigsten Parameter. Sofern sie mit einem „*“ markiert sind, sollte eine Anpassung erfolgen:

Parameter Funktion
-e PUID= * Vorgabe des Users und der Gruppe, mit denen die Daten auf dem Docker-Host in die gemounteten Verzeichnisse geschrieben werden.
Sofern Daten aus anderen Docker-Containern gesichert werden sollen, dann ist es notwendig, dass die PUID und PGID der Containerkonfigurationen übereinstimmt, damit der Duplicati-Container die Verzeichnisse der anderen Container lesen und gff. schreiben kann.
-e PGID= *
-e TZ= * Vorgabe der lokalen Zeitzone im Format Gebiet/Ort.
-p 8200:8200 Netzwerkport, über den die Benutzeroberfläche zu erreichen ist. Sofern die Oberfläche über einen anderen Port erreichbar sein soll, ist der erste Wert zu ändern (z.B.: -p 80:8200).
-v * Volumes, siehe Unterabschnitt Volumes
-e CLI_ARGS= Vorgabe von Kommendozeilenparametern, die an Duplicati übergeben werden (optional). Die Zeile kann in den meisten Fällen weggelassen werden.

Volumes

In der Konfiguration werden Volumes in der Regel im folgenden Format angegeben:

<Pfad auf dem Host>:<Pfad im Container>[:<Optionen>]

Die Volumes haben die folgenden Funktionen (maßgeblich ist der Pfad im Container):

Pfad im Container Funktion
/config Ablageort der Konfigurationsdateien
/backups Ablageort von lokalen Backups. Kann weggelassen werden, wenn ausschließlich Online-Backups auf andere Server oder in die Cloud erstellt werden.
/source Das Verzeichnis auf dem Host, in dem die Daten außerhalb des Duplicati-Containers liegen, von denen die Backups erstellt werden sollen.
Hier bietet sich ein Verzeichnis an, unterhalb dessen auf dem Docker-Host zentral die Daten der einzelnen Docker-Container abgelegt sind.

Auswahl Sicherungsziel bei lokalen Backups

Dieser Abschnitt ist nicht relevant, wenn ausschließlich Online-Backups (d.h. Backups werden per Netzwerkverbindung auf einem anderen Server oder in der Cloud abgelegt) erstellt werden.

Beim Einrichten eines Backups in Duplicati ist nach der Vorgabe der Meta-Daten und des Kryptoschlüssels das Sicherungsziel (=Ort an den das backup abgelegt wird) auszuwählen. Sofern das Backup nicht per Netzwerkverbindung auf einem anderen Server oder nicht der Cloud abgelegt werden soll, ist das Sicherungszeil auszuwählen. Bei diesem lokalen Backup muss beim Anlegen des Container eine Volume-Zuweisung für das Volume /backups erfolgt sein.

Im Verzeichnisbaum wird das Verzeichnis /backups auch dann angezeigt, wenn das Volume nicht konfiguriert ist.
In diesem Fall würde das dort abgelegte Backup innerhalb des Containers abgelegt und damit nicht dauerhaft gespeichert werden.

grün Die lokalen Backups sind unterhalb dieses Verzeichnisses abzulegen.
orange Diese Verzeichnisse liegen zwar bei einer korrekten Konfiguration außerhalb des Container, sind aufgrund ihrer Bestimmung jedoch nicht als Sicherungsziel geeignet.
rot Diese Verzeichnisse liegen innerhalb des Containers und sind deshalb als Sicherungsziel nicht geeignet.

Auswahl der Quelldateien

Das Ziel eines dockerized Duplicati ist nicht die Sicherung von Dateien aus dem Duplicati-Container, sondern die Sicherung der außerhalb der Container auf dem Host abgelegten Volumes. Der Ablageort dieser Volumes ist über das Volume /sources in den Duplicati-Container einzubinden.

grün In diesem Verzeichnis des Containers sind die über das Volume /sources eingebundenen, außerhalb des Container liegenden Verzeichnisse erreichbar und können für die Backups ausgewählt werden.
blau Die ausgewählt Verzeichnisse und Dateien werden hier zusammengefasst angezeigt.
orange Diese Verzeichnisse liegen bei einer korrekten Konfiguration außerhalb des Containers.
Eine Sicherung des Verzeichnisses /backups ist nicht sinnvoll, weil es die lokalen Backups enthält.
Die Konfiguration im Verzeichnis /config sollte über das Verzeichnis /sources erfolgen.
rot Diese Verzeichnisse liegen innerhalb des Containers und eine Sicherung ist nicht notwendig.

docker-compose

Der Container wird wie folgt in der Datei docker-compose.yml konfiguriert:

docker-compose.yml
version: "2.1"
services:
  duplicati:
    image: linuxserver/duplicati
    container_name: duplicati
    environment:
      - PUID=2000
      - PGID=2000
      - TZ=Europe/Berlin
#      - CLI_ARGS= #optional
    volumes:
      - /path/to/appdata/config:/config
      - /path/to/backups:/backups
      - /path/to/source:/source
    ports:
      - 8200:8200
    restart: unless-stopped

Details siehe Abschnitte Parameter und Volumes.

Integration in Træfik

Die Integration des Containers in das Træfik-Setup gestaltete sich unerwartet schwierig. Im Nachhinein stellte sich heraus, dass für die Cloud-Instanz der Port 8200 nicht geöffnet war. Dies dürfte der Grund für die Probleme gewesen sein.

Die derzeitige Umsetzung setzt auf ein Routing durch _Træfik_ und funktioniert ohne den Port 8200.

Es sind hierfür die folgenden Ergänzungen in der docker-compose.yml und der static.yml:

docker-compose.yml:

  duplicati:
    image: linuxserver/duplicati
    container_name: duplicati
    environment:
      - PUID=2000
      - PGID=2000
      - TZ=Europe/Berlin
    volumes:
      - /path/to/DockerData/duplicati/config:/config
      - /path/to/DockerData/:/source
#    ports:          # Inbound traafik via Traefik
#      - 8200:8200   # Port 8200 not ued
    restart: unless-stopped
    labels:
     - traefik.http.routers.duplicati.rule=Host(`subdomain.example.com`)
     - "traefik.http.routers.duplicati.tls.certResolver=default"
     - "traefik.http.routers.duplicati.tls=true"

static.yml:

  web-duplicati:
    address: ":8200"
Bei dieser Implementation ist es für den Zugriff nicht notwendig den Port 8200 in der URL vorzugeben. Die Duplicati-Instanz liegt damit auf dem Web-Root und damit der Landingpage der jeweiligen (Sub)Domain. Es sollte daher eine Subdomain benutzt werden.

Da Duplicati zur Sicherung nur ein Passwort (keine Vorgabe eines Usernamens) verlangt, sollte ein sehr starkes Passwort verwendet werden.

Weitere Ansätze zur Integration:

thoschwiki/docker/apps/duplicati.txt · Zuletzt geändert: 10.10.2020 20:30 von thosch