traefik, nextcloud, ssl, komplettguide

Änderungsstand: 2021-03-29

DuckDNS, Traefik und letzendes Nextcloud als Anwendung, natürlich SSL-Verschlüsselt.

Folgendes gilt für die hier beschriebenen Beispiele:

  • Domain: troubadix.duckdns.org
  • IP-Adresse meines OMV5-Servers: 192.168.1.79
  • Erstellter Benutzername: berti
  • uid 1001
  • gid 100
  • Als Terminal verwende ich Putty

Wichtig! Sichere Passwörter verwenden. Meine Passwörter, hier im Guide, dienen nur zur Veranschaulichung!

Vorbereitung:

Folgender Schritt ist notwendig, weil ich die Ports 80 und 443 für Traefik benötige. Ich setze OMV5 auf andere Ports!

  • „Allgemeine Einstellungen“
    • Port: ich verwende 90
    • SPEICHERN
    • Konfiguration anwenden

Achtung! OMV ist ab jetzt unter der Adresse…

IP-Adresse:90

…erreichbar. Deshalb auch die erscheinende Fehlermeldung „Es trat ein Fehler auf“. Einfach die neue Adresse im Browser eingeben, Hinweis bestätigen und alles passt wieder.

Wer die „sichere Verbindung“ eingerichtet hat, setzt den Port dort von 443 auf 446. Ansonsten gleiches Szenario, wie eben beschrieben. Wer das nicht verwendet bzw. nicht einrichtete, kann Port 443 ignorieren.

Jetzt installiere ich unter OMV5 Docker und Portainer:

  • „OMV-Extras“
    • „Docker“
      • „Docker installieren“
  • „OMV-Extras“
    • „Portainer“
      • „Portainer installieren“

Alle benötigten Sachen, inkl. Compose und Autostart des Docker-Daemon, werden installiert.

Um Portainer zu starten, die IP-Adresse:9000 im Browser eingeben, Passwort vergeben, auf „Docker“ klicken und „Connect“. Unter „local“ und dann „Containers“ kann man die erstellten Docker betrachten. Für mehr verwende ich Portainer nicht. Alle Docker erstelle ich im Terminal.

Im OMV einen Benutzer erstellen:

  • „Zugriffskontrolle“
    • „Benutzer“
      • „+ Hinzufügen“
        • „+ Hinzufügen“
          • „Allgenein“
            • Name: berti
            • Passwort:
            • Passwort bestätigen:
          • „Gruppen“
            • docker und users selektieren
    • SPEICHERN
    • Anwenden klicken (gelber Balken)
    • Konfiguarion anwenden? Ja

Jetzt im Terminal( ich verwende für alles kommende den root-Zugang [Benutzername: root | Passwort: Das root-Passwort, welches bei der Installation von Debian oder OMV5 angegeben wurde]) folgendes eingeben:

id berti

Ich habe für den Benutzer berti folgende uid und gid:

  • uid=1001
  • gid=100

Diese Werte (uid und gid) werden später unter Umständen noch benötigt.

DUCKDNS:

Der Dienst DuckDns sorgt dafür, dass der Server aus dem Internet immer mit dem Domainnamen erreichbar ist. Auch nach einer Trennung des Internets und einer Neuvergabe der Internet-IP-Adresse durch den Router. Aller 5 Minuten wird die IP-Adresse abgecheckt. Es kann also passieren, dass im schlimmsten Fall Euer Server nach einem IP-Reset, 5 Minuten nicht erreichbar ist. Damit kann man leben.

Zuerst wird ein DuckDNS Account benötigt, den man hier registrieren kann. Nach der Registrierung hat man die Möglichkeit, bis zu 5 Domains anzulegen. Die angelegte(n) Domain(s) und das Token wird später im Docker benötigt.

Terminal:

Wenn noch nicht geschehen, den Hauptordner für die Compose-Dateien erstellen:

mkdir /home/dockervolumes

Nun folgenden Befehl im Terminal eingeben (Ordner wird erstellt und die *.yml wird dort geöffnet).

mkdir /home/dockervolumes/duckdns && cd /home/dockervolumes/duckdns && nano docker-compose.yml

Folgendes dort einfügen (vorher Eure Werte überprüfen):

---
version: "2"
services:
  duckdns:
    image: linuxserver/duckdns
    container_name: duckdns
    environment:
      - PUID=1001
      - PGID=100
      - TZ=Europe/Berlin
      - SUBDOMAINS=troubadix
      - TOKEN=das_erstellte_duckdns_token
      - LOG_FILE=true
    volumes:
      - /var/lib/DuckdnsConfig:/config
    restart: unless-stopped

STRG-x, y, Enter

Quelle: https://hub.docker.com/r/linuxserver/duckdns

Zur Erklärung.

  • Zeile 8: Die UID
  • Zeile 9: Die Gid
  • Zeile 11: Das Token ist auf der Login-DuckDNS-Webpage ersichtlich
  • Zeile 14: Das Konfigurationsverzeichnis vom erstellten DuckDNS-Docker

Da ich anschließend mit Traefik arbeite, benötige ich nur eine erstellte Subdomain. Traefik legt dann, wenn benötigt, automatisch weitere Sub-Subdomains an, mit denen man arbeitet.

cd /home/dockervolumes/duckdns && docker-compose up -d

Der Docker wird gestartet. Erscheint die Meldung…

Creating duckdns ... done

…wurde DuckDNS gestartet. Es erfolgt auch nach ca. 1 Minute ein Abgleich der IP-Adresse, welche im Benutzermenu von DUCKDNS auch angezeigt wird, wenn man das Browserfenster aktualisiert.

Traefik:

Ich erkläre nun das einzelne Genöns nicht noch einmal. Hier nur die Erstellung des Traefik-Dockers, mit Allem, was benötigt wird. Eigene Werte werden wieder grün markiert.

mkdir -p /home/dockervolumes/traefik
touch /home/dockervolumes/traefik/acme.json
chmod 600 /home/dockervolumes/traefik/acme.json
touch /var/log/traefik.log
chmod 600 /var/log/traefik.log
touch /home/dockervolumes/traefik/.htpasswd
chmod 600 /home/dockervolumes/traefik/.htpasswd
docker network create traefik-net
docker network create intern

Traefik – Erstellung eines Passwortschutzes:

Das ist wichtig, damit keiner, ohne Berechtigung, Zugriff von Aussen auf Traefik erlangt. Zuerst installiere ich die Utils von Apache. Aber NUR die Utils!

apt-get install apache2-utils -y

Die .htpasswd wurde vorhin schon angelegt. Mit dem ersten Befehl lege ich einen Benutzer mit dem dazugehörigem Passwort in die htpasswd-Datei an. „-B“ bedeuted, dass bcrypt als Verschlüsselung verwendet wird und die Pfadangabe sagt, wohin der Benutzername, in meinem Beispiel der User FerdinandAdmiN, inkl. dazugehörigem Passwort, welches gleich anschließend, nach Befehlseingabe, eingegeben werden muss, abgespeichert wird:

htpasswd -B /home/dockervolumes/traefik/.htpasswd FerdinandAdmiN

Möchte man jetzt weitere Benutzer mit separaten Passwörtern hinzufügen, dann diesen Befehl wiederholt, mit einem weiteren Benutzer, verwenden. In meinem Beispiel verwende ich FerdinandAdmiNzWei:

sudo htpasswd -B /home/dockervolumes/traefik/.htpasswd FerdinandAdmiNzWei

Für weitere Benutzer fährt man einfach so weiter. Die Benutzer sind in der .htpasswd-Datei eingetragen. Öffnet man die Datei, können auch einzelne Benutzer mit dem dazugehörigem generiertem bcrypt-Passwortfile gelöscht werden, falls diese nicht mehr benötigt werden. Jeder Benutzer belegt eine Zeile.

Hierbei sollte beachtet werden, dass man kein $-Zeichen im Passwort, welches man eingeben muss, verwendet. Das macht Probleme beim generierten bcrypt-Passwort bzw. beim Auslesen des Passwortes und funktionierte bei mir (mehrmals getestet) nicht. Damit kann ich aber sehr gut zurecht kommen 🙂 . Weitere Einschränkungen, bei der Verfahrensweise mit Sonderzeichen, sind mir jetzt nicht bekannt, aber auch nicht ausgeschlossen.

Traefik – Erstellung der dynamic_conf.yml:

sudo nano /home/dockervolumes/traefik/dynamic_conf.yml

Folgendes dort eintragen (kann 1 zu 1 übernommen werden).

tls:
  options:
    default:
      minVersion: VersionTLS12
      cipherSuites:
        - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
        - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
        - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
        - TLS_AES_128_GCM_SHA256
        - TLS_AES_256_GCM_SHA384
        - TLS_CHACHA20_POLY1305_SHA256
      curvePreferences:
        - CurveP521
        - CurveP384
      sniStrict: true
http:
  middlewares:
    secHeaders:
      headers:
        browserXssFilter: true
        contentTypeNosniff: true
        frameDeny: true
        sslRedirect: true
        #HSTS Configuration
        customFrameOptionsValue: "SAMEORIGIN"
        stsIncludeSubdomains: true
        stsPreload: true
        stsSeconds: 31536000
    https-redirect:
      redirectScheme:
        scheme: https

STRG-x, y, Enter

Vielen Dank an dieser Stelle an https://goneuland.de/traefik-v2-https-verschluesselung-sicherheit-verbessern/. Ohne diesen Tip wäre es hier nicht so einfach weiter gegangen. Ganz speziell die Header-Sache hat mich am WordPress fast zum Verzweifeln gebracht. Ich habe diese Datei um ein kleines Extra erweitert (die letzten 3 Zeilen).

Traefik – Erstellung der traefik.yml:

Die Angabe der Email-Adresse ist wichtig und muss eine gültige Email-Adresse sein. Der Rest kann wieder 1 zu 1 übernommen werden.

sudo nano /home/dockervolumes/traefik/traefik.yml
## STATIC CONFIGURATION
log:
  level: INFO
  filePath: "/traefik.log"
 
api:
  insecure: true
  dashboard: true
 
entryPoints:
  http:
    address: ":80"
  https:
    address: ":443"
 
providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    network: traefik-net
    exposedByDefault: false
  file:
    filename: "/dynamic_conf.yml"
 
certificatesResolvers:
  lets-encr:
    acme:
      storage: acme.json
      email: EMAIL-ADRESSE
 
      httpChallenge:
        entryPoint: http

STRG-x, y, Enter

Traefik – Erstellung der traefik-compose:

Hier tritt nun auch der Passwortschutz in Kraft (Zeilen 35 und 41).

Setzt man „traefik.enable=true“ ist Traefik unter der angegebenen Domain passwortgeschützt und intern erreichbar.

Setzt man „traefik.enable=false“ ist Traefik unter der angegebenen Domain, nicht erreichbar. Aber intern, unter Eingabe der IP-Adresse:8080 kann man Traefik trotzdem öffnen.

sudo nano /home/dockervolumes/traefik/docker-compose.yml

Folgendes dort einfügen (eigene Werte beachten):

version: '3'
   
services:
  traefik:
    image: "traefik:v2.2"
    container_name: "traefik"
    hostname: "traefik"
    restart: unless-stopped
   
    security_opt:
      - no-new-privileges:true
   
    networks:
      - traefik-net
   
    ports:
      - 80:80
      - 443:443
      - 8080:8080
   
    volumes:
      - "/etc/localtime:/etc/localtime:ro"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "/var/log/traefik.log:/traefik.log"
      - "./traefik.yml:/traefik.yml:ro"
      - "./acme.json:/acme.json"
      - "./dynamic_conf.yml:/dynamic_conf.yml:ro"
      - "./.htpasswd:/.htpasswd:ro"
   
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.entrypoints=http"
      - "traefik.http.routers.traefik.rule=Host(`traefik.troubadix.duckdns.org`)"
## folgende Zeile gehört zur Passwortabfrage
      - "traefik.http.middlewares.traefik-auth.basicauth.usersfile=.htpasswd"
##
      - "traefik.http.routers.traefik.middlewares=https-redirect@file"
      - "traefik.http.routers.traefik-secure.entrypoints=https"
      - "traefik.http.routers.traefik-secure.rule=Host(`traefik.troubadix.duckdns.org`)"
## folgende Zeile gehört ebenfalls zur Passwortabfrage
      - "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
##
      - "traefik.http.routers.traefik-secure.tls=true"
      - "traefik.http.routers.traefik-secure.tls.certresolver=lets-encr"
      - "traefik.http.routers.traefik-secure.service=api@internal"
   
networks:
  traefik-net:
    external: true

STRG-x, y, Enter

Jetzt den Docker nicht starten, bevor die Portweiterleitung im Router gesetzt wurde! Anderenfalls können keine Zertifikate installiert werden!

Portweiterleitung im Router:

Als Beispiel verwende ich die Fritz!Box 7590: Achtung! Portweiterleitung eines bestimmten Ports funktionieren nur zu einem Gerät. Sollten schon Portweiterleitungen der Ports 80 und 443 eingerichtet worden sein, diese vorher entfernen.

Die Software der FritzBox! ist derzeit 7.21. Dort im Menu auf:

  • „Internet“
    • „Freigaben“
      • „Portfreigaben“
        • Das gewünschte Gerät (OMV5-Server) wählen
          • „Neue Freigabe hinzufügen“
            • „Portfreigabe“ wählen
              • Anwendung: HTTP-Server
              • 80 80 80
              • Freigabe aktivieren
              • OK
          • „Neue Freigabe hinzufügen“
            • „Portfreigabe“ wählen
              • Anwendung: HTTPS-Server
                • 443 443 443
                • Freigabe aktivieren
                • OK
          • OK
          • Aktualisieren klicken

(ist das Gerät nicht aufgeführt, dann „Gerät für Freigaben hinzufügen“ klicken und Gerät aus der Liste wählen. Notfalls auf „IP-Adresse manuell hinzufügen“ und die IP-Adresse des OMV5-Servers eintragen. Anschließend auf „Neue Freigabe“ klicken) und weiter, wie auf den Bildern zu sehen…

Das gleiche Szenario für den https-Port.

Jetzt noch einmal auf „Aktualisieren“ klicken. Wenn fertig, müssen beide Ports Grün leuchten.

Die Portfreigaben wurden erstellt und die Routerkonfiguration kann geschlossen werden.

Zur Info: Wer eine USG (Ubiquiti Security Gateway) oder eine openSense-Firewall hinter der Fritz!Box verwendet, muss die Freigabe der Fritz!Box zur USG (oder openSense-Firewall) setzen und dann dort die Portfreigabe zum Server weiterleiten.

Jetzt kann der Traefik-Docker gestartet werden:

cd /home/dockervolumes/traefik && sudo docker-compose up -d

Jetzt bitte ca. eine Minute warten, bis die Zertifikate erstellt wurden.

Mit Aufruf von traefik.troubadix.duckdns.org sehen wir, nach Passworteingabe, die Benutzeroberfläche von Traefik, natürlich mit SSL. Von Innen ist Traefik weiterhin mit Server-IP:8080 erreichbar.

Benötigt man den Zugang von Aussen nicht, dann die Zeile 30 in der traefik-docker-compose von true auf false setzen und den Traefik-Docker neu starten.

cd /home/dockervolumes/traefik && sudo docker-compose stop
cd /home/dockervolumes/traefik && sudo docker-compose start

Erscheint jetzt ein ERROR, hat man wahrscheinlich vergessen, den OMV-Port von 80 auf etwas anderen zu ändern. Erscheint „Starting traefik … done“ ist alles in Ordnung.

Aufruf im Browser:

Intern: Server-IP-Adresse:8080

Extern: https://traefik.troubadix.duckdns.org

Bei einem externen Aufruf von Traefik erscheint jetzt das Benutzernamen- und Passwort-Eingabefenster. Benutzernamen und Passwort habe ich vorhin in der .htpasswd-Datei angelegt.

Hat man es bis hierher geschafft und Traefik ist von Aussen, gesichert, erreichbar, weiß man, dass das interne Letsencrypt von Traefik ordentlich funktioniert 🙂 .

Die größte Hürde wäre geschafft. Ab jetzt ist die weitere Umgangsweise fast ein Kinderspiel. Jeder Docker-Compose-Anwendung, die ab jetzt erstellt wird, kann man quasi mit einigen Label-Einträgen versehen und somit den Zugang von Aussen über Traefik ermöglichen. Mit der Option „traefik.enable=true“ und der Zugabe des traefik-net erkennt Traefik automatisch, dass der Docker ins Traefik-Netz eingebunden werden soll. Natürlich unter Angabe der Subdomain, die allerdings bei jedem Docker anders heißen muss. Nextcloud würde dann z.B. so aussehen:

nextcloud.troubadix.duckdns.org

oder

kartoffelsack.troubadix.duckdns.org

usw…

Nextcloud mit SSL über Traefik:

In diesem Docker-Compose-File wird Nextcloud inkl. einem Redis-Cache und eine SQL-Datenbank installiert. Ich empfehle den Datenordner von Nextcloud auf einer großen Festplatte oder einem Verbund zu legen. Nicht in das /var/lib-Verzeichnis! Da hier eine Menge an Daten anfallen können, passiert es leicht, dass das Systemlaufwerk voll läuft.

Zuerst in OMV einen Ordner erstellen. Ich nenne diesen Nextclouddata.

Achtung! Hier muss man die Zugriffsrechte beachten!!! Zugriffsrechte Administrator und Benutzer lesen/schreiben, andere Kein Zugriff!

Jetzt den Ordner einmal anklicken, bei „Referenziert“ den kleinen Pfeil anklicken, Columns und Absoluter Pfad selektieren. Diesen „Absoluten Pfad“ benötige ich als Zuweisung in der Compose-Datei für den Ablageort der Nextclouddaten (Zeile 47).

Dann im Terminal:

mkdir /home/dockervolumes/nextcloud
cd /home/dockervolumes/nextcloud && sudo nano docker-compose.yml

Folgendes einfügen (eigene Werte beachten):

version: "3.3"

services:
  nextcloud-db:
    image: mariadb
    container_name: nextcloud-db
    command: --transaction-isolation=READ-COMMITTED --log-bin=ROW
    restart: unless-stopped
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /var/lib/Nextcloud/nc-database:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=PASSWORT123 #SQL root Passwort eingeben
      - MYSQL_PASSWORD=PASSWORT456 #SQL Benutzer Passwort eingeben
      - MYSQL_DATABASE=nextcloud #Datenbank Name
      - MYSQL_USER=nextcloud #SQL Nutzername
      - MYSQL_INITDB_SKIP_TZINFO=1
    networks:
      - default

  nextcloud-redis:
      image: redis:alpine
      container_name: nextcloud-redis
      hostname: nextcloud-redis

      networks:
          - default

      restart: unless-stopped
      command: redis-server --requirepass PASSWORT789 # Redis Passwort eingeben

  nextcloud:
    image: nextcloud
    container_name: nextcloud
    restart: unless-stopped
    depends_on:
      - nextcloud-db
      - nextcloud-redis
    environment:
        REDIS_HOST: nextcloud-redis
        REDIS_HOST_PASSWORD: PASSWORT789 # Redis Passwort von oben wieder eingeben
    volumes:
      - /var/lib/Nextcloud/html:/var/www/html
      - /var/lib/Nextcloud/apps:/var/www/html/custom_apps
      - /var/lib/Nextcloud/config:/var/www/html/config
      - /srv/dev-disk-by-label-Data/Nextclouddata:/var/www/html/data
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nextcloud.entrypoints=http"
      - "traefik.http.routers.nextcloud.rule=Host(`nextcloud.troubadix.duckdns.org`)"
      - "traefik.http.routers.nextcloud.middlewares=https-redirect@file"
      - "traefik.http.routers.nextcloud-secure.entrypoints=https"
      - "traefik.http.routers.nextcloud-secure.middlewares=calcarddav,secHeaders@file"
      - "traefik.http.routers.nextcloud-secure.rule=Host(`nextcloud.troubadix.duckdns.org`)"
      - "traefik.http.routers.nextcloud-secure.tls=true"
      - "traefik.http.routers.nextcloud-secure.tls.certresolver=lets-encr"
## Traefik-Redirects für CalDAV / CardDAV:
      - "traefik.http.middlewares.calcarddav.redirectregex.permanent=true"
      - "traefik.http.middlewares.calcarddav.redirectregex.regex=https://(.*)/.well-known/(card|cal)dav"
      - "traefik.http.middlewares.calcarddav.redirectregex.replacement=https://$$1/remote.php/dav/"
      - "traefik.http.services.nextcloud.loadbalancer.server.port=80"

    networks:
      - traefik-net
      - default

networks:
  traefik-net:
    external:
      name: traefik-net

Quelle: https://hub.docker.com/_/nextcloud

STRG-x, y, Enter

cd /home/dockervolumes/nextcloud && docker-compose up -d

Auch hier wieder, nachdem alle 3 Container gestartet wurden, kurz warten, damit Letsencrypt die Zertifikate erstellen kann.

Auf zur Einrichtung Nextcloud

Dazu die verwendete Domain im Browser eingeben. In meinem Fall wäre das:

nextcloud.troubadix.duckdns.org

Eine automatische Weiterleitung zu http s erfolgt.

Administrator-Konto anlegen: lasst Euch was einfallen. Statt admin kann man auch etwas komplizierteres nehmen, wie z.B. aDmiNfeRdiNand

Datenverzeichnis: /var/www/html/data

Speicher & Datenbank: MySQL/MARIADB

Datenbankbenutzer: nextcloud (Zeile 17 im Compose-Script)

Datenbankpasswort: PASSWORT456 (Zeile 15 im Compose-Script)

Datenbankname: nextcloud (Zeile 16 im Compose-Script)

Datenbank-Host: nextcloud-db (Zeile 6 im Compose-Script)

.

Nextcloud wird installiert und konfiguriert.

Jetzt noch einige kleine Anpassungen in der config.php. Vorher folgenden Befehl im Terminal eingeben:

docker inspect traefik

Folgenden Wert, fast am Ende der Datei, merken:

                "IPAddress": "172.19.0.2",
                    "IPPrefixLen": 16,

Diese Adresse inkl. Prefix benötige ich gleich als Angabe des trusted_Proxies.

Nun die config.php. Hat man nach meiner Anleitung aufgebaut, befindet sich die config.php hier:

nano /var/lib/Nextcloud/config/config.php

Folgendes am Ende, aber vor ); einfügen. Wieder die grünen Markierungen beachten und eigene Werte eintragen:

  'trusted_proxies' =>
  array (
    0 => '172.19.0.2/16',
  ),
  'overwriteprotocol' => 'https',
  'overwritehost' => 'nextcloud.troubadix.duckdns.org',
  'default_phone_region' => 'DE',

Dann folgende Zeile suchen und aus dem http ein https machen:

'overwrite.cli.url' => 'https://nextcloud.troubadix.duckdns.org,

STRG-x, y, Enter

cd /home/dockervolumes/nextcloud && sudo docker-compose restart

.

Quelle:

https://goneuland.de/nextcloud-server-mit-docker-compose-und-traefik-installieren/

Falls doch noch Sicherheitswarnungen stehen sollten, kann man hier nachsehen, wie man diese behebt. Ich hoffe, dass ich soweit alle Fehlermeldungen korrigieren konnte. Bei meinen Nextcloudinstallationen gibt es keine relevanten Fehlermeldungen.

Hat man alles soweit fertig, wird man bei SSL Labs mit einem A+ belohnt.

Update aller Docker-Compose-Files:

Ich verwende dafür ein kleines Script. Aber bedenkt, dass ALLE Docker, von denen sich in Dockervolumes die Scripte befinden, geupdated und gestartet werden, auch wenn diese nicht relevant sind. Soll heissen, dass die Compose-Files von Dockern, die keine Verwendung mehr haben oder momentan nicht benötigt werden, nicht im Verzeichnis /home/dockervolumes sein sollten. Dieses Script ist für alle in diesem Guide erstellten Docker.

Im Terminal:

cd /usr/local/bin && sudo nano mydockercomposeupdatescript

Folgendes, ohne Änderung, eintragen:

#!/bin/bash
# Automatisches Update ALLER Docker in /home/dockervolumes/*
# Ablageverzeichnis: /usr/local/bin/mydockerupdatescript
# Angabe Hauptverzeichnis
    
# Nextcloud stoppen
cd /home/dockervolumes/nextcloud
sudo docker-compose stop
# Nextcloud gestoppt (wird automatisch wieder gestartet)
  
# Systemupdate
sudo apt update
    
cd /home/dockervolumes
     
readarray -d '' composeConfigs < <(find . -type f -name docker-compose.y* -print0)
     
for cfg in "${composeConfigs[@]}"; do
  docker-compose -f "$cfg" pull
  docker-compose -f "$cfg" up -d
done
     
# Alte Images automatisch löschen
docker image prune -f

Strg-x, y, Enter

Zum Aufruf des Scriptes folgenden Befehl eingeben:

sudo bash mydockercomposeupdatescript

Es werden alle Docker, die im Verzeichnis „/home/dockervolumes/“ vorhanden sind, geupdatet und die alten Images gelöscht.

Ich stoppe in diesem Script, vor der Aktualisierung der Docker, vorsichtshalber den Nextcloud-Docker, da sich dort die Datenbank mit drin befindet und ebenfalls gestoppt wird. Dies dient zur Sicherheit, um einen Crash oder Datenverlust vorzubeugen, falls bei der Aktualisierung im selben Moment darauf geschrieben werden sollte. Nur interessant, wenn eine Datenbank betrieben wird. Und das ist hier der Fall.

Diesen Befehl …

sudo bash mydockercomposeupdatescript

…kann man jetzt in OMV5 unter „geplante Aufgaben“ für die automatische Aktualisierung eintragen. Einmal täglich ist für den Anfang ein guter Ansatz.