raspi-traefik2-überarbeitet

Änderungsstand: 2020-06-16

16.06.2020 – Hinweis zur Portfreigabe Router hinzugefügt.

06.06.2020 – Crontab für Dockeraktualisierung hinzugefügt.

15.05.2020 – Ein Tip für das Login an der Nextcloud-App.

15.05.2020 – Auf Wunsch eines Einzelnen wurde Traefik so erweitert, dass nun der Zugriff von Aussen und von Innen ermöglicht wird

15.05.2020 – Schreibfehler im Apache-yml korrigiert

14.05.2020 – Lokales Verzeichnis in Apache-yml hinzugefügt

Traefik 2.2, WordPress, Nextcloud, PhpMyAdmin && Whoami, Apache aus dem vorherigen Guide.

Das Projekt Nextcloud UND WordPress mit Datenbank auf dem Raspi hätte ich fast aufgegeben. Warum? Nun – die Unterschiede zum handelsüblichen x64-System gehen mir ganz schön auf die Ketten 🙂 Und alle Guides, die darüber schön informieren, wie geschmiert doch alles läuft – naja…. – ich habe wohl das falsche Schmiermittel 🙂 Aber ich habe eine Lösung gefunden, die funktioniert. Nach dem Ganzen hin und her muss ich leider sagen, dass die bessere, kostenlose, Alternative für ein Webhosting mit WordPress ein Hosting direkt bei „wordpress.com“ ist.

Ihr habt nun den Vorteil, dass die knapp 2 Wochen persönliche Informationsbeziehung und Testing an Euch vorbei gehen und hier ein weiterer Guide zu finden ist, wie schön doch alles funktioniert :-). Nun ja – der Knackpunkt waren nicht unbedingt die anderen Guides, sondern das verwendete System. Auf dem ARM ist nun mal einiges anders…

Hier wird also Nextcloud und WordPress mit MariaDB und PhpMyAdmin eingerichtet. Traefik, mit SSL wird Passwortgeschützt sein. Traefik sollte immer seinen Passwortschutz behalten, da wir in diesem Guide aus dem Internet darauf zugreifen!!! MariaDB und PhpMyAdmin werden NICHT im Traefik Netz eingebunden. Whoami-Docker-Compose und Apache-Docker-Compose werden auch noch angepasst, falls das jemand weiter verwenden möchte.

Diese Scriptdateien aus dem vorherigen Thread wurden abgeändert und geben der Sicherheit einen Mega Aufschwung. Diesen „alten Guide“ lasse ich aber, aufgrund der „Step by Step“ – Beschreibung trotzdem drin.

Es wird hier zusätzlich eine kleine Datei eingepflegt. Diese ist aufgrund der Header-Funktion schon Gold Wert. Die zusätzlichen Einträge wie z.B. Cipher-Suites geben der Sicherheit nochmals einen Schub nach oben. Folgendes werden wir hier behandeln:

  • Einige Grundsachen
  • Erstellung einer zusätzlichen Datei
  • Abänderung der Traefik.yml
  • Abänderung der Traefik-Compose (inkl. Update auf traefik 2.2)
  • Abänderung der Whoami-Compose
  • Abänderung der Apache-Compose
  • Abänderung von Nextcloud-Compose
  • WordPress-Compose

Falls noch nicht aus dem vorherigen Thread übernommen, ein paar Kleinigkeiten. Dieser Raspi wird zusätzlich mittels Traefik 2.2 als Reverse-Proxy eingerichtet. Als Vorraussetzung benötigen wir aus dem allerersten Thread, DuckDNS oder einen anderen DNS-Dienst. Alles mit gesichertem Zugriff auf separate Anwendungen von Aussen und ohne separater Serververwaltungssoftware, wie z.B. OMV5. Da ich keine externe Festplatte zur Hand hatte, arbeitete ich in diesem Guide mit dem /var/lib-Verzeichnis des Linux-Systems.

Wer den vorhergehenden Guide schon abgearbeitet hat, sollte hier trotzdem weiterlesen, da es die ersten Änderungen gibt.

Ich empfehle allen, die den vorherigen Guide schon abgearbeitet haben, alle Docker aus dem Guide zu beenden und nochmal NEU hier anzufangen.

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

Step by Step werde ich jetzt nicht alles wiederholen. Nur das Nötigste.

Middlewares (Passwortschutz):

Diesmal ein etwas anderer Passwortschutz, als im vorherigen Guide erklärt. Warum jetzt eine andere Methode? Es ist es nicht verkehrt, auch einen anderen Weg kennenzulernen.

Auf der Seite https://hostingcanada.org/htpasswd-generator/ geben wir einen Usernamen und ein Passwort ein. Ich verwende für diesen Guide 1 User und 1 dazugehöriges Passwort. Verwendet bitte richtige Passwörter!!! karldall ist kein passwort – er ist ein Komiker 🙂 Dies dient nur zur Demonstration!!!

User) admin Passwort: karldall

Diesen User und das Passwort gebe ich jetzt auf der zuvor verlinkten Seite ein und generiere meine Passwort, welches ich später für die traefik-docker.yml benötige. Ich verwende die Methode *Apache spezific….. Folgendes bekomme ich heraus:

admin:$apr1$zejclqhm$OdhdcM9CR37zSovA7o6mq1

Jetzt ist wichtig, vor JEDEM $ noch ein $ zu setzen!!!

admin:$$apr1$zejclqhm$$OdhdcM9CR37zSovA7o6mq1

Diese Ausgabe merken bzw. kopieren.

Mit folgenden Änderungen aller Dateien sind wir auf einen sehr aktuellen Stand. Ebenfalls ist eine etwas übersichtlere Struktur erkennbar (mir geht es jedenfalls so), mit welcher man einfacher weitere Docker einbinden kann. Und der Einstieg in Traefik mit dem ersten Guide war zwar für mich quasi doppelte Arbeit, aber ein gewisses Grundverständniss der Materie kann nie schaden. Fangen wir an.

Zuerst eine neue Datei anlegen. Nennen wir diese dynamic_conf.yml.

dynamic_conf.yml

sudo nano /home/dockervolumes/traefik/dynamic_conf.yml
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.yml

Zuerst beenden wir Traefik, falls es noch läuft. Falls das vergessen wird, wird spätestens nach der Änderung an der Traefik-Compose.yml der Docker nicht mehr ohne Weiteres zu beenden sein. Dann hilft nur noch der Hardcorebefehl um alle Docker zu beenden. Warum? Weil wir eine andere Versionsnummer eintragen. Nicht vergessen, Eure Email einzutragen!

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

Passen wir die traefik-docker-compose.yml noch an. Traefik wird nun von Innen und von Aussen erreichbar sein. Natürlich hier unbedingt von Aussen Passwortgeschützt und mit einer sicheren Verbindung. Wartet bitte ca. 1 Minute nach dem Start von Traefik, dass Letsencrypt genügent Zeit hat, die Zertifikate anzulegen. Das gilt auch für die anderen Docker.

Traefik-Compose

Hier tritt neben Änderungen des Grundscriptes auch die Änderung des Passwortschutzes in Kraft (In Zeile 32, hinter users= die Ausgabe des vorhin erstellten Passwortes eingeben (das “ am Ende nicht vergessen!))!

sudo nano /home/dockervolumes/traefik/docker-compose.yml
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"

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.entrypoints=http"
      - "traefik.http.routers.traefik.rule=Host(`traefik.knilix.duckdns.org`)"
      - "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$2W74R0Cf$$HD9TjPUXTtDIfbdFU3FtN."
      - "traefik.http.routers.traefik.middlewares=https-redirect@file"
      - "traefik.http.routers.traefik-secure.entrypoints=https"
      - "traefik.http.routers.traefik-secure.rule=Host(`traefik.knilix.duckdns.org`)"
      - "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

Falls sich jemand fragt, was es mit der letzten Zeile external: true auf sich hat, bekommt jetzt die Antwort. Damit wird dem Docker nur angegeben, dass es sich um ein selbst-angelegtes Netwerk handelt und bei beenden und/oder Löschen des Dockers, das Netzwerk, in diesem Fall traefik-net, nicht mit gelöscht werden soll. Oder so ähnlich…

Bevor der Docker nun gestartet wird – Portfreigabe im Router gesetzt? Wenn nicht, dann sollte das allerspätestens JETZT erledigt werden, da sonst keine Zertifikate gezogen werden können! Hier nochmal die Beschreibung bei einer 7590. Wenn erledigt, dann:

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

Mit Aufruf von traefik.knilix.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.

Mein Traefik Dashboard (fast fertig)

MariaDB

Erstellen wir unsere Datenbank, die auf dem Raspi-System zuständig sein wird:

sudo mkdir /home/dockervolumes/mariadb
cd /home/dockervolumes/mariadb && sudo nano docker-compose.yml
---
version: "2"
services:
  mymariadb:
    image: linuxserver/mariadb
    container_name: mariadb
    restart: unless-stopped

    environment:
      - PUID=1000
      - PGID=1000
      - MYSQL_ROOT_PASSWORD=123458789
      - TZ=Europe/Berlin

    volumes:
      - /var/lib/MariaDB:/config

    ports:
      - 3306:3306

    networks:
      - intern

networks:
  intern:
    external: true


STRG-x, y, Enter

MariaDB wird nur im Netzerk intern verfügbar sein. Und das auch richtig so! Keiner will, dass eine Datenbank irgendwo Frei-Zugänglich herumliegt!

Nach dem Start, zur ersten Initialisierung, benötigt MariaDB eine Weile. 1 Minute warten, bevor man darauf zugreift.

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

Schön, dass wir jetzt die Datenbank installiert haben. Mit unserer Angabe von „volumes“ haben wir den Vorteil, dass die Datenbankbankdaten ausserhalb des Dockers abgelegt werden. Somit bleiben die Daten erhalten, auch wenn der Docker mal gelöscht werden sollte. Mit Hilfe von phpMyAdmin lege ich mir meine Datenbanken selbst an.

PhpMyAdmin

Da wir auf unserem eigenen Raspi die Sachen installieren, verzichte ich auch bei PhpMyAdmin auf den Zugriff von Aussen.

sudo mkdir -p /home/dockervolumes/phpmyadmin
sudo nano /home/dockervolumes/phpmyadmin/docker-compose.yml
---
version: "2"
services:
 phpmyadmin:
    image: jackgruber/phpmyadmin
    container_name: phpmyadmin
    restart: unless-stopped

    environment:
      - PMA_HOST=192.168.252.118
      - PMA_PORT=3306
    ports:
      - 8081:80
      - 9001:9000

    networks:
      - intern

networks:
  intern:
    external: true

STRG-x, y, Enter

Starten wir den Docker:

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

Jetzt lege ich meine Datenbank per Hand an. Aufruf von PhpMyAdmin im Browser mit Server-IP:8081

Login mit root und das Passwort, welches im mariadb-Dockerfile angegeben wurde. !

Auch hier machte der Browsercache, bei meinen unendlichen Versuchen, immer wieder den Spaß zunichte. Aber irgendwann gewöhnt man sich dran…

Falls hier das Login mit root und ohne Passwort möglich ist, bitte unbedingt das root-Passwort in den Benutzerkonten festlegen!!!

Phpmyadmin startet und knallt uns prompt einen kleinen Warnhinweis um die Ohren. Doch das ist normal.

Einfach auf „Finden Sie heraus, warum“ klicken

Und jetzt auf „anlegen“ klicken – Fertig. Es erscheinen ganz viele „OK’s“.

Dann auf Datenbanken (oberes Menufeld) klicken, einen Datenbanknamen im Eingabefeld eintragen (nextcloud) und utf8_general_ci und auf „Anlegen“ klicken.

Jetzt im linken Menu auf „Neu“ und im oberen Menu auf „Benutzerkonten“ klicken. Nun auf „Neu – Benutzerkonto hinzufügen“

Benutzername und Passwort angeben. Hostname gebe ich mit % an. Authentifizierung ist „Native MYSQL.Authentifizierung“.

Jetzt ganz runter scrollen und auf „OK“ klicken. Alles was mit „Globale Rechte“ zu tun hat, bleibt bitte AUS! Auch Datenbank für Benutzerrechte lassen wir unberührt.

Jetzt legen wir noch für unseren soeben erstellten Benutzer die Datenbankrechte an. Links im Menu auf „Neu“ und oben im Menu auf „Benutzerkonten“. Jetzt an den soeben erstellten Benutzernamen „Rechte ändern“ klicken, oben, in der zweiten Reihe, den Reiter „Datenbank“ wählen, im Auswahlmenu „nextcloud“ selektieren und OK. Jetzt bei „Datenbankspezifife Rechte“ – „Alle auswählen“ und OK.

Soeben wurde eine Datenbank für nextcloud erstellt, mit einem Benutzer, der NUR Rechte für die Datenbank nextcloud besitzt. Was wir heute nicht alles lernen 🙂

Da wir jetzt wissen, wie es funktioniert, legen wir auch gleich eine Datenbank und einen Benutzernamen für WordPress an 🙂

Wenn fertig, kann das phpmadmin-Fenster geschlossen werden.

Nextcloud

Hier wäre der Eintrag external_links wichtig: Hier kommt die Datenbankzuweisung des Services der MariaDB rein. In meinen Fall mymariadb. Die Passwortabfrage kann man sich bei einer Cloud sparen. Aber ich habe diese absichtkich reingesetzt, damit man mit den einzelnen Befehlen erste „Gehversuche“ machen kann. Die Zeilen 17 bis 19 und 24 bis 26 können theoretisch raus. Oder man setzt ein # vor der Zeile 18 und Zeile 25.

sudo mkdir /home/dockervolumes/nextcloud
cd /home/dockervolumes/nextcloud && sudo nano docker-compose.yml
version: "3.3"

services:
   nextcloud:
    image: nextcloud
    container_name: nextcloud
    hostname: "nextcloud"
    restart: unless-stopped
    ports:
      - 8082:80
    volumes:
      - /var/lib/Nextcloud/html:/var/www/html
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nextcloud.entrypoints=http"
      - "traefik.http.routers.nextcloud.rule=Host(`nc.knilix.duckdns.org`)"
## Passwortabfrage
      - "traefik.http.middlewares.nextcloud-auth.basicauth.users=admin:$$apr1$$2W74R0Cf$$HD9TjPUXTtDIfbdFU3FtN."
##
      - "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(`nc.knilix.duckdns.org`)"
## gehört zu Passwortabfrage
      - "traefik.http.routers.nextcloud-secure.middlewares=nextcloud-auth"
##
      - "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/"

    external_links:
       - mymariadb

    networks:
      - intern
      - traefik-net

networks:
  intern:
    external: true
  traefik-net:
    external: true


STRG-x, y, Enter

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

Auf zur Einrichtung Nextcloud

Im Browser gebe ich jetzt nc.knilix.duckdns.org ein und erhalte das Konfigurationsmenu von Nextcloud – natürlich mit zertifiziertem https, wenn man kurz wartet! Bevor mann die Einrichtung beginnt, unbedingt schauen, dass man auch https verwendet!

Administrator-Konto anlegen: lasst Euch was einfallen

Datenverzeichnis: /var/www/html/data

Speicher & Datenbank: MySQL/MARIADB

Datenbankbenutzer: Euren Benutzer, der soeben in phpmyadmin erstellt wurde

Datenbankpasswort: Das dazugehörige Passwort

Datenbankname: nextcloud

Datenbank-Host: Server-IP:3306

Jetzt auf „Installation abschließen“ klicken. Da dauert dauert jetzt etwas. Nach ca. 2-3 Minuten springt das Anmeldefenster um und es werden noch empfohlene Apps installiert, weil ich den Haken bei „Empfohlene Apps installieren“ gesetzt habe. Irgendwas ist doch immer^^.

Die gesamte Ersteinrichtung dauerte dann doch gefühlte 6 Minuten.

Fertig!

Ein Tip!

Das Login mit dem Benutzernamen, welchen wir für Nextcloud in der *.yml angelegt haben, gilt NUR für den Datenbankzugriff (z.B über phpmyadmin). Der Login im Nextcloud ist das Administrator-Login, welches vor der Ersteinrichtung im Browser angelegt wurde.

Sicherheits- & Einrichtungswarnungen in Nextcloud:

Einige Sachen werden hier behoben.

Ein weiterer Tip (Login-Problem Handy-App)!

Nach dem Browser-Login im Nextcloud, erstelle ich einen weiteren Benutzer, der keine admin-Rechte hat. Dann logge ich mit diesem Benutzer ein, gehe auf Einstellungen (rechts oben) und dann links auf Sicherheit. Dort im Hauptfenster, ziemlich weit unten auf App-Name, dort gebe ich ein Passwort ein (das Gleiche, wie eben bei Benutzererstellung eingegeben), klicke auf „Neues App-Passwort erstellen“ und dann auf „QR-Code für mobile Apps anzeigen“. Diesen QR-Code verwende ich dann für das erste Login in der Nextcloud-App am Handy. Somit wäre binnen Sekunden die Einrichtung der Handy-App erledigt.

Whoami

Whoami wird Passwortgeschützt sein. Die 2 Einträge dafür sind Markiert.

sudo mkdir -p /home/dockervolumes/whoami
sudo nano /home/dockervolumes/whoami/docker-compose.yml
version: "3.3"

services:
   whoami:
    image: "containous/whoami"
    container_name: "whoami"
    hostname: "whoami"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.entrypoints=http"
      - "traefik.http.routers.whoami.rule=Host(`whoami.knilix.duckdns.org`)"
## Passwortabfrage
      - "traefik.http.middlewares.whoami-auth.basicauth.users=admin:$$apr1$$2W74R0Cf$$HD9TjPUXTtDIfbdFU3FtN."
##################
      - "traefik.http.routers.whoami.middlewares=https-redirect@file"
      - "traefik.http.routers.whoami-secure.entrypoints=https"
      - "traefik.http.routers.whoami-secure.rule=Host(`whoami.knilix.duckdns.org`)"
## Passwortabfrage
      - "traefik.http.routers.whoami-secure.middlewares=whoami-auth"
##################
      - "traefik.http.routers.whoami-secure.tls.certresolver=lets-encr"

    networks:
      - intern
      - traefik-net

networks:
  intern:
    external: true
  traefik-net:
    external: true

STRG-x, y, Enter

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

Apache

sudo mkdir -p /home/dockervolumes/apache
sudo nano /home/dockervolumes/apache/docker-compose.yml
version: "3.3"
 
services:
  apache:
    image: httpd:latest
    container_name: apache
    hostname: "apache"
## Hier könnte später die eigene Website (kein WordPress) erstellt werden
#    volumes:
#      - '/home/pi/website/:/usr/local/apache2/htdocs/'
#########################################################################
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.apache.entrypoints=http"
      - "traefik.http.routers.apache.rule=Host(`apache.knilix.duckdns.org`)"
## Passwortabfrage
#      - "traefik.http.middlewares.apache-auth.basicauth.users=admin:$$apr1$$2W74R0Cf$$HD9TjPUXTtDIfbdFU3FtN."
##################
      - "traefik.http.routers.apache.middlewares=https-redirect@file"
      - "traefik.http.routers.apache-secure.entrypoints=https"
      - "traefik.http.routers.apache-secure.rule=Host(`apache.knilix.duckdns.org`)"
## Passwortabfrage
#      - "traefik.http.routers.apache-secure.middlewares=apache-auth"
##################
      - "traefik.http.routers.apache-secure.tls.certresolver=lets-encr"

    networks:
      - intern
      - traefik-net

networks:
  intern:
    external: true
  traefik-net:
    external: true

STRG-x, y, Enter

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

WordPress

„Des einen Freud‘ ist des anderen Leid 🙂 „

Was hier so einfach aussieht, ist das Ergebnis Tagelanger Recherche, um WordPress dazu zu bringen, mit der schon vorhandenen Datenbank zu kommunuzieren. Mein etwas anderes Ergebnis, mit dem ich mich paar Tage vorher beschäftigte, zeige ich anschließend. Beide Varianten funktionieren nun, also ist die WordPress-Alternative damit hinfällig.

Wichtig! DB_Host ist der Name des Services, welcher in der maraidb-compose hinterlegt ist. Ebenso external_links.

sudo mkdir -p /home/dockervolumes/wordpress
sudo nano /home/dockervolumes/wordpress/docker-compose.yml
version: '3.1'

services:

   wordpress:
    image: wordpress
    restart: unless-stopped

    ports:
      - 8083:80

    environment:
# Daten müssen in der Datenbank schon angelegt sein!
      WORDPRESS_DB_HOST: mymariadb
      WORDPRESS_DB_USER: wie_in_Datenbank
      WORDPRESS_DB_PASSWORD: 'wie_in_Datenbank'
      WORDPRESS_DB_NAME: wordpress

    volumes:
      - /var/lib/Wordpress:/var/www/html

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.wordpress.entrypoints=http"
      - "traefik.http.routers.wordpress.rule=Host(`wordpress.knilix.duckdns.org`)"
      - "traefik.http.routers.wordpress.middlewares=https-redirect@file"
      - "traefik.http.routers.wordpress-secure.entrypoints=https"
      - "traefik.http.routers.wordpress-secure.rule=Host(`wordpress.knilix.duckdns.org`)"
      - "traefik.http.routers.wordpress-secure.middlewares=secHeaders@file"
      - "traefik.http.routers.wordpress-secure.tls=true"
#
      - "traefik.http.routers.wordpress-secure.tls.certresolver=lets-encr"


    external_links:
       - mymariadb

    networks:
      - traefik-net
      - intern

networks:
  traefik-net:
    external: true
  intern:
    external: true

STRG-x, y, Enter

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

Aufruf mit wordpress.knilix.duckdns.org. Es erfolgt eine automatische Umleitung zu https und die Ersteinrichtung kann beginnen.

Fertig. Im wahrsten Sinne des Wortes^^.

Jetzt noch ein Check auf SSL Labs (https://www.ssllabs.com/ssltest/)

Bingo-Soweit scheint wohl alles zu passen

.

.

.

.

.

WordPress – Alternative mit separater DB

Diesen Versuch startete ich am Anfang. Zum Glück wird das nicht mehr benötigt. Auch die Dokumentation ist noch von damals. Also nicht wundern…

Da der Port 3306 schon für die MariaDB für Nextcloud verwendet wird, stellen wir hier die DB auf Port 3307!!! Man möge mir diesen Umstand verzeihen, aber ich habe WordPress absolut nicht dazu überreden können, unsere Datenbank, die wir für Nextcloud erstellt haben, zu verwenden. Aus diesem Grund habe ich auch ein separates Datenbankverzeichnis angelegt. Wir haben dementsprechend 2 Datenbankverzeichnisse. Eins für Nextcloud und eins für WordPress. Ich muss dazu sagen, dass ich derartige Probleme NUR auf dem Raspi habe! Auf meinem OMV5-System (auf x64), funktioniert das Ganze unkompliziert. Dort erstellte ich einen Datenbank-Docker. Nextcloud, 3 WordPress-Instanzen und meine mittlerweile 8 internen PHP-Seiten (ohne WordPress) greifen munter darauf zu. Aber irgendwas is ja immer 🙂

sudo mkdir -p /home/dockervolumes/wordpresss
sudo nano /home/dockervolumes/wordpresss/docker-compose.yml
version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: unless-stopped

    ports:
      - 8083:80
    depends_on:
      - mymariadb
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: Clara
      WORDPRESS_DB_PASSWORD: 1254389
      WORDPRESS_DB_NAME: wordpressdb
    volumes:
      - /var/lib/Wordpresss:/var/www/html

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.wordpress-app.entrypoints=http"
      - "traefik.http.routers.wordpress-app.rule=Host(`wordpress.knilix.duckdns.org`)"
      - "traefik.http.middlewares.wordpress-app-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.wordpress-app.middlewares=wordpress-app-https-redirect"
      - "traefik.http.routers.wordpress-app-secure.entrypoints=https"
      - "traefik.http.routers.wordpress-app-secure.rule=Host(`wordpress.knilix.duckdns.org`)"
      - "traefik.http.routers.wordpress-app-secure.tls=true"
      - "traefik.http.routers.wordpress-app-secure.tls.certresolver=lets-encr"
      - "traefik.http.routers.wordpress-app-secure.service=wordpress-app"
      - "traefik.http.services.wordpress-app.loadbalancer.server.port=80"
      - "traefik.docker.network=traefik-net"
      - "traefik.http.routers.wordpress-app-secure.middlewares=secHeaders@file"

    networks:
      - traefik-net
      - default

  db:
    image: linuxserver/mariadb
    restart: always
    environment:
      - PUID=1000
      - PGID=1000
      - MYSQL_ROOT_PASSWORD=8467219
      - TZ=Europe/London
      - MYSQL_DATABASE=wordpressdb
      - MYSQL_USER=Clara
      - MYSQL_PASSWORD=1254389

    volumes:
      - /var/lib/Mysql-1:/var/lib/mysql

    ports:
      - 3307:3306

    networks:
      - traefik-net
      - default

networks:
  traefik-net:
    external: true

volumes:
  wordpress:
  db:

STRG-x, y, Enter

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

.

Update der Docker.

.

.

Wie aktualisiert man jetzt die Docker? Ich verwende dafür ein kleines Script, welches ich momentan noch per Hand starte. 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.

cd /usr/local/bin && sudo nano mydockerupdatecomposescript
#!/bin/bash
# Automatisches Update ALLER Docker in /home/dockervolumes/*
# Ablageverzeichnis: /usr/local/bin/mydockerupdatecomposescript
# Angabe Hauptverzeichnis
 
# Datenbank stoppen
##cd /home/dockervolumes/mariadb
##sudo docker-compose stop
# Datenbank gestoppt (wird automatisch wieder gestartet)
 
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 mydockerupdatecomposescript

Entfernt man bei den beiden Befehlen mit ## davor die ##, wird die Datenbank vor der Überprüfung der Docker gestoppt. Anschließend wird diese automatisch wieder gestartet. Dies dient zur Sicherheit, um einen Crash oder Datenverlust vorzubeugen, falls bei der Aktualisierung im selben Moment darauf geschrieben werden sollte.

Möchte man dieses Script täglich durchlaufen lassen, dann hilft folgendes:

sudo crontab -e 

Falls noch nicht geschehen, den Editor wählen. Ich verwende die 1 (nano). Folgendes am Ende der Datei einfügen (das Hashtag am Ende nicht vergessen):

0 5 * * * sudo bash mydockerupdatecomposescript
#

STGR-x, y, Enter

Jetzt wird täglich 05:00 Uhr geschaut, ob ein Update des Dockers verfügbar ist und gegebenenfalls geupdated.

Möchte man nur einmal pro Woche updaten, z.B Montag 05:00 Uhr, dann:

0 5 * * 1 sudo bash mydockerupdatecomposescript
#

STGR-x, y, Enter

Oder nur einmal im Monat, z.B. am 01. jeden Monats um 05:00 Uhr:

0 5 * 1 * sudo bash mydockerupdatecomposescript
#

STGR-x, y, Enter

Ganz gut beschrieben wird das auf https://wiki.ubuntuusers.de/Cron/

.

Quelle(n):

https://projekt-rootserver.de

https://greenitsolutions.at/traefik-docker-lets-encrypt-tutorial/

https://goneuland.de/traefik-v2-reverse-proxy-fuer-docker-unter-debian-10-einrichten/

https://github.com/DoTheEvo/Traefik-v2-examples

https://docs.traefik.io

https://thibmaek.com/post/updating-all-docker-compose-container

https://www.smarthomebeginner.com/traefik-reverse-proxy-tutorial-for-docker

https://chriswiegman.com/2020/01/running-nextcloud-with-docker-and-traefik-2

https://www.teqqy.de/reverse-proxy-mit-traefik-unter-docker