RASPI – traefik, nextcloud, ssl – komplettguide

Änderungsstand: 2021-05-06

Raspi 4 – OMV5 Grundkonfiguration, DuckDNS als CronJob, Traefik mit SSL und Nextcloud als Docker-Anwendung.

Zuerst OMV auf dem Raspi installieren. Ich verwende das Scriptinstall. Hier der überarbeitete Guide.

Wurde OMV5 installiert, im Browser einloggen. Nun arbeite ich alle wichtigen Sachen ab. Zur Info: Ich verwende eine Neuinstallation, auf welcher noch nichts eingerichtet wurde. Login: admin | openmediavault

1.) Login-Passwort vergeben:

  • „Allgemeine Einstellungen“
    • „Web Administrator Passwort“
      • Passwort vergeben
    • Speichern

2.) Port 80 ändern:

  • „Allgemeine Einstellungen“
    • „Web Administration“
      • Port: 80 ändern auf 90
      • Automatische Abmeldung: 1 Tag
    • Speichern
  • Jetzt im erscheinenden gelben Feld „Anwenden“ klicken
  • Mit „Ja“ bestätigen

Fehlermeldung – „Es trat ein Fehler auf“ mit OK bestätigen und neue Adresse für den Login verwenden:

IP-Adresse:90

Das ist ab jetzt die Adresse für das Web-Menu des OMV5!

3.) IP-Adresse fest vergeben:

Hier hatte ich heftige Probleme, speziell nach einem Reboot des Raspi. Ich verwendete die Festvergabe der IP-Adresse NICHT! Ich vergab diese als feste IP-Zuweisung in meinem Router.

Wer es trotzdem versuchen möchte:

  • „Netzwerk“
    • „Schnittstellen“
      • „eth0“ – Doppelklick
        • IPv4 Methode: Statisch
        • Adresse: Die schon verwendete IP-Adresse (oder eine Neue, die noch frei ist)
        • Netzmaske: 255.255.255.0
        • Gateway: IP der Fritz!Box oder des Routers
        • runter scrollen und DNS-Server: 8.8.8.8 oder die IP-Adresse des Routers oder die IP-Adresse eines anderen DNS-Servers
        • Optional: Wake-on-LAN (ich verwende das nicht, da mein Raspi 24/7 läuft)
    • Speichern
  • Jetzt im erscheinenden gelben Feld „Anwenden“ klicken
  • Mit „Ja“ bestätigen

4.) Optional: Zertifikat installieren und Port 443 auf 446 ändern

  • „Zertifikate“
    • „SSL“
      • + Hinzufügen
        • + Hinzufügen
          • Schlüssellänge: 4096b
          • Gültigkeitsdauer: 20 Jahre
          • Land: Deutschland (:-) steht unter G wie Germany 🙂 )
          • Speichern
  • Jetzt im erscheinenden gelben Feld „Anwenden“ klicken
  • Mit „Ja“ bestätigen
  • „Allgemeine Einstellungen“
    • „Aktiviere SSL/TLS – ON
    • Zertifikat: Das soeben erstellte Zertifikat wählen
    • Port: 446
    • Optional: Erzwinge SSL/TLS (ich verwende das nicht, weil dann der normale Login auf Port 90 nicht mehr funktioniert)
    • Speichern
  • Jetzt im erscheinenden gelben Feld „Anwenden“ klicken
  • Mit „Ja“ bestätigen

Falls der Hinweis kommt, dass ein Fehler auftritt, kann dieser bestätigt und ignoriert werden. Wer SSL/TLS erzwungen hat, muss jetzt anders einloggen:

https://Server-IP:446

5.) OMV-System aktualisieren:

  • „Aktualisierungsverwaltung“
    • „Prüfen“ klicken
      • Alle zu aktualisierenden Sachen selektieren
        • „+ Installieren“ klicken
        • Wenn fertig, „Schließen“ klicken
  • Jetzt im erscheinenden gelben Feld „Anwenden“ klicken (falls es erscheint) und mit „Ja“ bestätigen

6.) Docker und Portainer installieren:

(Alle benötigten Sachen, inkl. Docker-Compose, werden mit installiert)

  • „OMV-Extras“
    • „Docker“
      • „Docker + Installieren“
      • Wenn fertig, „Schließen“
    • „Docker“ (ist noch ausgewählt)
      • „Portainer + Installieren“
      • Wenn fertig, „Schließen“

Portainer kann nun im Browser verwendet werden:

IP-Adresse:9000

  • Passwort vergeben und „Create User“ klicken
  • „Docker“ wählen
  • „Connect“ klicken
  • local“ klicken
  • „Containers“ klicken

Die installierten Docker werden angezeigt. Bisher natürlich nur der Portainer selbst.

Browserfenster des Portainers kann wieder geschlossen werden.

7.) Benutzererstellung:

Hier sind bei mir schon 2 Benutzer vorhanden. pi und raspi. Daher erstelle ich vorerst keinen weiteren Benutzer. Aber ich hole mir die UID und GID dieser Benutzer, weil ich die später bei meinen Docker-Compose-Dateien teilweise benötige.

  • Im Terminal folgendes eingeben
    • id pi
    • uid und gid merken (bei mir: uid=1000 und gid=100)
    • Die gid bleibt normalerweise immer auf 100
    • Die uid geht bei jedem hinzugefügtem Benutzer eins nach oben (der Benutzer raspi hat dementsprechen die uid=1001)

8.) Freigabeordner erstellen:

Um einen Freigabeordner zu erstellen, muss entweder eine Festplatte angeschlossen werden oder ein Plugin installiert werden (sharerootfs), um den zusätzlichen Platz der Systemplatte mit zu verwenden. Ich verwende eine zusätzliche Platte. Für meinen Guide werde ich eine zusätzliche SSD verwenden. Da meine SSD nicht leer ist, werde ich diese formatieren.

  • Platte am USB-Anschluss anstecken (ich verwende einen aktiven Hub)
  • Im Terminal folgendes eingeben
lsblk

mmcblk0 ist meine SD-Card. sda ist meine soeben angeschlossene SSD.

Hier bitte unbedingt kontrollieren, welche Bezeichnung die angeschlossene Platte hat!!! Wer schon eine SSD als Systemplatte verwendet, hat dort wahrscheinlich sda!!! Es ist definitiv mit Datenverlust zu rechnen, wenn man weiter macht!!!

Diese werde ich nun mit ext4 formatieren:

Label neu schreiben:

sudo parted /dev/sda "mklabel gpt"

Yes

Partitionierung vornehmen:

sudo cfdisk /dev/sda
  • New – Enter
  • Enter
  • Type – Enter
  • Linux Filesystem – Enter
  • Write – Enter
  • yes – Enter
  • Quit – Enter

Formatierung:

sudo mkfs.ext4 /dev/sda1

sudo reboot

Nun die Platte im OMV5 einbinden:

  • „Datenspeicher“
    • „Dateisysteme“
      • /dev/sda1 einmal anklicken
      • „Einbinden“ klicken
  • Jetzt im erscheinenden gelben Feld „Anwenden“ klicken
  • Mit „Ja“ bestätigen

Die Platte ist nun im OMV5 verfügbar. Jetzt kann ich meine Freigabeordner erstellen. Ich erstelle einen Ordner Namens media:

  • „Zugriffskontrolle“
    • „Freigegebene Ordner“
      • + Hinzufügen
        • Name: media
        • Gerät: /dev/sda1 (wird im Dropdown-Menu angezeigt)
        • Zugriffsrechte: entweder so lassen oder evtl. anpassen auf z.B. jeder lesen/schreiben
      • Speichern
  • Jetzt im erscheinenden gelben Feld „Anwenden“ klicken
  • Mit „Ja“ bestätigen

Jetzt nach dem gleichen Prinzip einen weiteren Freigabeordner Namens appdata erstellen. Dort könnten später die Config’s der erstellten Docker hineingelegt werden. Muss man aber nicht. Man kann auch /var/lib für die Config’s verwenden.

Tip:

Wenn man die Erweiterung „openmediavault-sharerootfs“ installiert, kann man auch das Verzeichnis „appdata“ auf rootfs installieren. Dann würden die „appdata“ auf der Systemplatte liegen, aber in einem separatem Verzeichnis. Der Pfad zum Verzeichnis würde dann einfach so aussehen. /appdata

9.) Samba Freigabe erstellen:

  • „Dienste“
    • „SMB/CIFS“
      • „Aktivieren“ ON
    • Speichern
  • Jetzt im erscheinenden gelben Feld „Anwenden“ klicken
  • Mit „Ja“ bestätigen
  • „Dienste“
    • „Freigaben“
      • „+ Hinzufügen“ klicken
      • Gewünschten Ordner wählen
      • Öffentlich: Nein
      • Berechtigungen erben: ON
      • Optional: Erlaubte Hosts festlegen (nur die hier eingetragenen IP-Adressen dürfen auf die Freigabe zugreifen)
    • Speichern
  • Jetzt im erscheinenden gelben Feld „Anwenden“ klicken
  • Mit „Ja“ bestätigen

10) Midnight Commander installieren:

Für weitere Zwecke installiere ich noch den Midnight Commander.

sudo apt install mc -y

Um den Midnight Commander zu öffnen, folgernden Befehl im Terminal anwenden:

sudo mc

Das war soweit die Grundkonfiguration des OMV5 auf einem Raspi.

Nun DuckDNS, Traefik und Nextcloud, 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 1002
  • gid 100
  • Als Terminal verwende ich Putty

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

Die Ports in OMV habe ich wissentlich schon auf andere Ports geändert, da ich ab hier den Port 80 und 443 für meine Sachen benötige. Des Weiteren wurden Docker und Portainer auch schon installiert.

Im OMV einen Benutzer erstellen:

  • „Zugriffskontrolle“
    • „Benutzer“
      • „+ Hinzufügen“
        • „+ Hinzufügen“
          • „Allgenein“
            • Name: berti
            • Passwort:
            • Passwort bestätigen:
          • „Gruppen“
            • docker, sudo und users selektieren
    • SPEICHERN
  • Jetzt im erscheinenden gelben Feld „Anwenden“ klicken
  • Mit „Ja“ bestätigen

Jetzt im Terminal [Benutzername: pi | Passwort: Das root-Passwort, welches bei der Installation angegeben wurde]) folgendes eingeben:

id berti

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

  • uid=1002
  • gid=100

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

DUCKDNS als Cronjob:

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:

In diesem Guide tätige ich die IP-Abfrage nicht mit dem DuckDNS-Docker, sondern als Cronjob.

sudo su
cd && mkdir duckdns
cd duckdns && nano duck.sh

Folgendes eintragen. troubadix mit der eigenen Domain und die X mit dem Token ersetzen.

echo url="https://www.duckdns.org/update?domains=troubadix&token=xxxxxxxx-xxxx-xxxx-xxx-xxxxxxxxxxxx&ip=" | curl -k -o ~/duckdns/duck.log -K -

STRG-x, y, Enter

chmod 700 duck.sh
crontab -e

Folgendes am Ende der Datei eintragen:

*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>&1
#

STRG-x, y, Enter

Zum Testen des Sccriptes folgendes eingeben:

./duck.sh

Erscheint nach dem folgendem Befehl ein OK, hat es funktioniert.

cat duck.log
exit

Es erfolgt auch umgehend ein Abgleich der IP-Adresse, welche im Benutzermenu von DUCKDNS auch angezeigt wird, wenn man das DuckDNS-Browserfenster aktualisiert oder auf „update ip“ klickt. Der Abgleich der IP-Adresse erfolgt nun aller 5 Minuten.

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.

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 touch /home/dockervolumes/traefik/.htpasswd
sudo chmod 600 /home/dockervolumes/traefik/.htpasswd
sudo docker network create traefik-net
sudo 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!

sudo apt 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:

sudo 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

Nun 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:

sudo 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: coreymbryant/mariadb-armv7
    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/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:
    image: nextcloud
    container_name: nextcloud
    restart: unless-stopped
    depends_on:
      - nextcloud-db
    volumes:
      - /var/lib/NextcloudConfig/html:/var/www/html
      - /var/lib/NextcloudConfig/apps:/var/www/html/custom_apps
      - /var/lib/NextcloudConfig/config:/var/www/html/config
      - /srv/dev-disk-by-uuid-a70f3d12-6ad1-4542-9362-93bb5e2b358e/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

STRG-x, y, Enter

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

Die Zeile 32 ist das Datenverzeichnis von Nextcloud. Hier die eigenen Werte verwenden. Diese findet man im OMV unter „Freigegebene Ordner“. Dort im Reiter „Relativer Pfad“ das Dropdownmenu anklicken, Columns und „Absoluter Pfad“ aktivieren.

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

Auch hier wieder, nachdem alle 3 Container gestartet wurden, ca. 1 Minute 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.

Falls eine Fehlermeldung erscheint (Die Website ist nicht erreichbar), diese vorerst ignorieren und die folgenden Konfigurationen zu Ende bringen.

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:

sudo nano /var/lib/NextcloudConfig/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

Jetzt kann Nextcloud im Browser über folgende Adresse aufgerufen werden:

nextcloud.troubadix.duckdns.org

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.

Erstelle deine Website mit WordPress.com
Jetzt starten