Dieses Tutorial ist VALID.

Bitte lies Dir den Disclaimer durch, bevor Du eine Anleitung umsetzt...

Haftungsausschluss / Disclaimer

Nextcloud Docker Container

Verzeichnisse und docker-compose Datei erstellen

Das ist wieder eine grundlegende Designentscheidung, die VOR der Installation getroffen werden muss. Hinterher bekommen wir sonst beim Updaten von Nextcloud ein Problem, wenn wir das zwischen der Installation und dem Update geändert hätten :/

Wir legen wie erwartet ein Verzeichnis „nextcloud.xp-server.de“ unterhalb von „/var/www“ an. In diesem Verzeichnis befinden sich dann die „docker-compose“-Datei und das Verzeichnis mit der eigentlichen Anwendung von Nextcloud.

Innerhalb dieses Verzeichnises gibt es das „data“ Verzeichnis, in das später alle unsere Dateien hochgeladen werden. Und das hätte ich gerne an einer anderen Stelle, wegen der Datensicherung.

Zur Datensicherung habe ich ein relativ einfaches Script, dass die ganzen Verzeichnisse in „/var/www“ packt und in jeweils eine große zip-Datei schreibt. Da das Datenverzeichnis eines Cloud-Servers aber sehr schnell ziemlich riesig wird, möchte ich das getrennt von den „www“-Daten wegsichern. Also „Anwendung“ und „Daten“ trennen.

Dazu legen wir direkt in „/var“ ein Verzeichnis „nextclouddata“ an, das wir als Volume an den richtigen Punkt einhängen, um die Daten dort abzulegen, während der Rest der Anwendung wie erwartet in „/var/www/nextcloud.xp-server.de“ liegt.

Hier müssen wir das Datenverzeichnis per Hand anlegen. Docker würde das zwar für uns machen, genau wie das Erstellen des Datenverzeichnisses von MariaDB, aber das Verzeichnis für Nextcloud braucht besondere Benutzerrechte. Hier muss der Webserver hineinschreiben dürfen, also ist es wichtig, vorher dem „www-data“-Benutzer das Eigentum an dem Verzeichnis zu übertragen.

Ansonsten ist die Konfiguration der von phpMyAdmin recht ähnlich…

mkdir /var/nextclouddata && chown -R www-data:www-data /var/nextclouddata
mkdir -p /var/www/nextcloud.xp-server.de
nano /var/www/nextcloud.xp-server.de/docker-compose.yml
### Nextcloud
### docker-compose.yml
###
###
##START
version: '3'
services:

 nextcloud:
  image: nextcloud-php74-apache:latest
  container_name: nextcloud
  restart: always
  networks:
   - intern
   - web
  ports:
   - 80
  environment:
   MYSQL_HOST: maria104master:3306
   MYSQL_PASSWORD: 'unglaublichsicherespasswort'
   MYSQL_DATABASE: nxcloud
   MYSQL_USER: nxcloud
  labels:
   - "traefik.enable=true"
   - "traefik.http.routers.nextcloud.entrypoints=http"
   - "traefik.http.routers.nextcloud.rule=Host(`nextcloud.xp-server.de`)"
   - "traefik.http.routers.nextcloud.middlewares=https-redirect@file"
   - "traefik.http.routers.nextcloud-sec.entrypoints=https"
   - "traefik.http.routers.nextcloud-sec.middlewares=calcarddav,default-headers@file"
   - "traefik.http.routers.nextcloud-sec.rule=Host(`nextcloud.xp-server.de`)"
   - "traefik.http.routers.nextcloud-sec.tls=true"
   - "traefik.http.routers.nextcloud-sec.tls.options=myTLSOptions@file"
   - "traefik.http.routers.nextcloud-sec.tls.certresolver=le"
# Reverse-Proxy "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.routers.nextcloud-sec.middlewares=calcarddav"
  volumes:
   - /var/nextclouddata:/var/www/html/data
   - ./wwwdata:/var/www/html
  external_links:
   - maria104master

networks:
  intern:
    external: true
  web:
    external: true
##EOF

Die „docker-compose“-Datei ist bis auf kleine Anpassungen ziemlich das, was wir bei den vorhergehenden Dateien schon kennengelernt haben:

Zeilen 5-9: Wir deklarieren die Version und den Namen des Services.

Zeile 10: Als Image verwenden wir unser frisch gebackenes eigenes Nextcloud Image des vorherigen Kapitels. Die Versionsbezeichnung „:latest“ sorgt dafür, dass wir immer das mit „:latest“ getaggte Image laden.

Zeile 11: Containername für Docker: nextcloud
Ist an der Stelle vielleicht inkonsequent, da ich die Container eigentlich mit der vollen URL benennen sollte. Da wir aber wissen, was gemeint ist, und wir von Nextcloud ja nur eine Instanz hochfahren, verzichte ich auf den vollen Domainnamen…

Zeile 12: Der Cloud-Server soll immer laufen, daher „restart: always“.

Zeilen 13-15: Wir brauchen beide Docker-Netzwerke. Das Interne für die Verbindung zur Datenbank und das „Web“ zum Internet über unseren Reverse-Proxy Traefik.

Zeilen 16+17: Wir docken Traefik auf Port 80 an den Container an.

Zeilen 18-22: Über die „Environment“-Variablen übergeben wir den Datenbank-Server, den Namen der Datenbank, des Benutzers und das Passwort an die Nextcloud Anwendung.

Zeilen 23-38: Die Traefik-Label. Neu sind Zeilen 35-38, in denen eine Adress-Umschreibung für die CalDAV- und CardDAV-Dienste vorgenommen wird. Die sind für die Kalender- und Adressbuch-Funktion nötig.
Ansonsten musst Du Zeilen 26 und 30 mit Deiner URL ersetzen, damit die Verbindung ins Internet und das Anfordern des Zertifikats klappt!

Zeilen 39-41: Hier werden die Volume-Mounts eingerichtet. Wie oben erwähnt, legen wir einen Link außerhalb des „/var/www“-Verzeichnisses für unsere Daten an. Der zeigt auf „/var/nextclouddata“. Der Inhalt des „html“-Verzeichnisses wird relativ zum Basisverzeichnis „/var/www/nextcloud.xp-server.de“ in das neue Verzeichnis „wwwdata“ gespeichert.

Zeilen 42+43: Der externe Link zur MariaDB wird eingerichtet.

Zeilen 45-49: Die Netzwerke werden noch einmal aufgelistet und über „external“ mitgeteilt, dass diese Netzwerke beim Schließen des Containers nicht gelöscht werden sollen.

Update 22.03.2020
Eike hat mich in diesem Kommentar darauf hingewiesen, dass in der Config ein Fehler gesteckt hat.
Resultat ist das Auskommentieren von Zeile 38 und der Umbau der Zeile 29, die jetzt sowohl die „header“ als auch „calcarddav“ enthält. Noch mal vielen Dank für diesen Tipp!

Hier der Hintergrund dazu: https://community.containo.us/t/help-migrating-to-v2-0-wildcard-acme-and-non-existent-middleware/1854/8
tl/dr: Du darfst keine zwei Middlewares parallel anlegen, sondern die müssen entweder in einer Zeile stehen; kommagetrennt. Oder per Middleware-Chain definiert sein.

… Moment … Vielleicht hilft mir das bei meinem Problem mit WordPress, an dem ich mir bisher die Zähle ausgebissen hab. Werd ich gleich testen …
>>> JUHUU! Genau das löst das Weiterleitungsproblem! Wo hab ich den Sekt…?

Nextcloud Container starten, Logfile auswerten

Da wir das Image lokal erzeugt haben, brauchen wir das nicht mehr aus dem Internet herunterladen und können den Container gleich hochfahren lassen.

Bitte beachten: Dieser Vorgang ist zeitkritisch!
Sobald der Container läuft, kann sich theoretisch jeder auf unserer URL einloggen und das Setup beenden. Dann ist das „sein“ Cloud-Server, nicht unserer… :/
Also bitte gleich nach dem Hochfahren des Containers über den Browser einloggen und das Setup SELBST abschließen, bevor es jemand anders tut!

docker-compose -f /var/www/nextcloud.xp-server.de/docker-compose.yml up -d
docker ps -a
docker logs -f --tail="30" nextcloud

Anzeige *

25 Kommentare zu „Nextcloud Docker Container“

  1. Wolfgang Stauch

    Hallo Peter,
    vielen herzlichen Dank für Deine Ausarbeitungen. Erst mit deren Hilfe bin ich zu meiner nextcloud / traefik Installation gekommen. Lediglich das Problem der iOS Kalender- bzw. Kontakte-Synchronisation bekomme ich trotz aller Bemühungen nicht gelöst. Nach Erfassung des Links meldet iOS, dass eine Verbindung über SSL unmöglich sei.
    Die Kommunikation erfolgt über den Port 443.

    Ich habe alle im Internet angegebenen Links ausprobiert, beispielsweise für CardDAV (Kontakte):
    https://NEXTCLOUD. MEINEDOMAIN.DE/remote.php/dav/addressbooks/users/USERNAME/contacts/

    Über den WebDAV Client (iOS App) war die nextcloud Anbindung ohne Schwierigkeiten einzurichten.
    Eventuell hast Du eine Idee, was ich noch machen kann.

    Gruß Wolfgang Stauch

    1. Hallo Wolfgang,
      Kontakte und Kalender hab ich noch nie über die Cloud synchronisiert. Und selbst wenn, ich habe nur Android, kein Apple, und könnte das gar nicht testen.

      Hier wäre der offizielle Weg laut Nextcloud: https://docs.nextcloud.com/server/13.0.0/user_manual/pim/sync_ios.html
      Ansonsten die Logs auswerten (docker logs -f -n20 nextcloud), das läuft dann mit und zeigt live an, was passiert, wenn man versucht, sich anzumelden. Eventuell sieht man an der Stelle, wo es klemmt.

      Viel Glück!
      Peter.

  2. Moin Peter!

    Erst mal vielen Dank für die ganzen kostenlosen Inhalte auf dieser Seite, mir hat es wirklich viel Sucherei erspart!
    Hier noch ein kleiner Hinweis:
    Durch das explizite Angeben des Ports in der docker-compose.yml (Zeile 16/17) wurde bei mir automatisch ein zusätzlicher Port exposed. Die Zeilen 16 und 17 sollte man also vielleicht lieber weglassen.

    Ich weiß jetzt natürlich nicht, ob wir evtl. einfach unterschiedliche Docker Versionen nutzen, wodurch sich das bei Dir anders verhält, oder ob das schon immer so war.

    Grüße

    1. Das werde ich gerne testen. Vielen Dank für den Tipp, Jannik!

      Update:
      Geht, aber das sitzt dann auf dem lokalen Port 80. Sprich wenn ich die zweite Nextcloud auf der Maschine starte, kollidieren die Ports.

      1. Mh, dass es dann zu Problemen kommen würde kann ich mir eigentlich nicht vorstellen, denn: Ich habe neben dem Nextcloud Container ebenfalls ein GitLab Container auf dem gleichen Host. Auch hier läuft ja ein Webserver der per default auf 80 gehen möchte und auch hier habe ich keine explizite Angabe eines Ports vorgenommen. Ich nehme an entweder Docker oder Traefik sorgt hier dafür, dass automatisch ein freier lokaler Port vergeben wird und Traefik nutzt diesen dann automatisch?

  3. Norbert Schmidt

    Ich habe die Updates für Nextcloud bis auf Version 20.0.4 erfolgreich durchgeführt. Wenn ich aber auf https://scan.nextcloud.com/ die Installation überprüfen lasse, so erhalte ich immer ein F weil angeblich die Version 15.0.14.1 installiert wäre.
    Warum wird die falsche Version erkannt? Auf einer anderen Installation ohne Docker (klassisch installiert) wird dort die richtige Version von Nextcloud erkannt.

    1. Danke für den Hinweis, Norbert!
      Das ist eine ekelhafte Besonderheit des Nextcloud Scanners. Der speichert das Ergebnis vom Scan. Und wenn Du Jahre später drauf schaust, bekommst Du immer noch das gespeicherte Ergebnis von Anno dazumal angezeigt :/
      Einfach auf „re-scan“ drücken, bestätigen, warten, neu laden => et voila :)

      https://www.projekt-rootserver.de/wir-haben-eine-aktuelle-nextcloud-installiert-der-scan-zeigt-aber-eine-alte-version/2021/01/

  4. Hallo Peter,
    vielen Dank für dein Tutorial – ich vermute die interne Statistik wird dir schon verraten das es gut genutzt wird! Daumen hoch.
    Ich habe leider weiterhin das Problem, dass mein LE-Zertifikat nicht angezogen wird und das Standard-Trafik-Zertifikat genutzt wird. Weißt du aus dem Stehgreif wo potenzielle Fehler liegen / wo ich mal näher reingucken sollte?

    Viele Grüße, Nao

    1. Peter Fiedler

      Hallo Nao,
      freut mich, wenn Dir die Tutorials gefallen.

      Leider müsste ich raten, wo da genau der Fehler steckt.
      Hast Du sonst noch was am Laufen wie WordPress oder Matomo? Werden da die Zertifikate richtig geholt? Falls ja, ist der Fehler in der Nextcloud Config.
      Ansonsten tippe ich auf die Traefik-Config, weil der für Let’s Encrypt zuständig ist.

      Hast Du die anderen Tutorials auch exakt nachgebildet? Läuft bei Dir das Basis-System wie beschrieben, also Debian 10?

      Beste Grüße
      Peter.

  5. Hallo,
    der André mal wieder.
    Sag mal, die Maileinstellungen, welche im Dockerfile angelegt, bzw. geändert wurden, wo kann ich diese „nach konfigurieren“?
    Ich bin mir mit den Einstellungen nicht so sicher, ob die so korrekt sind, weil auch keine Mails raus gehen.
    UND: Danke noch mal für die geilen Anleitungen!!
    BTW: mailcow vs. traefik Integration? Idee?
    Grüße
    André

    1. Peter Fiedler

      Hallo André,

      in der Anleitung zum Image beim Dockerfile Zeilen 178-183 kannst Du den Mailserver einstellen. Glaube aber eher, dass die Einstellung in der Nextcloud-Verwaltung falsch ist:

      Nextcloud E-Mail Server einstellungen

      Das steht bei der Anleitung zum Nextcloud Container auf Seite 3.

      Beim Problem Mailcow ./. Traefik hat Juno diesen Link ausgegraben:
      https://goneuland.de/mailcow-e-mail-komplettsytem-mit-antivirus-spam-filer-webmail-webfrontend-installieren-mittels-docker-und-traefik/

      Entscheidend sind die Punkte 4, 5 und 6, weil die sich von der „normalen“ Installation unterscheiden. Pass die Werte auf Deine Installation an und es „müsste“ laufen.
      Ich mach das nicht, weil ich a) nicht in die Mechanik der Mailcow eingreifen möchte und b) ein anderes Backup-Konzept für meine Mailserver habe, weswegen die Maschinen in jedem Fall getrennt laufen.

      Frohe Pfingsten!
      Peter.

  6. Hallo Peter

    Nochmals Besten Dank für deine hervorragenden Anleitungen. Hast Du Kenntnisse über OCR Scan in der Nextcloud. Diese Funktion würde mir noch fehlen. Habe zwar einiges darüber gelesen. Finde halt zur Zeit den Wald vor lauter Bäumen nicht!

    lg Siegfried

    1. Peter Fiedler

      Hallo Siegfried,
      hmm… Ich wüsste nicht, dass die Nextcloud OCR macht. Also nicht „out of the Box“.
      Wenn Du mehr Info hast, womit das laufen soll, poste doch bitte einen Link.

      Liebe Grüße
      Peter.

  7. Deine Anleitungen gefallen mir sehr gut!
    Aufgrund der aktuellen Situation durch viele Web-Meetings würde ich gerne jitsi-meet auf deiner basis installieren.
    Hast du dich damit schon beschäftigt und würdest support anbieten.

    Gruß
    Sven

    1. Hallo Sven,
      nein, mit dieser Anwendung hab ich mich noch nicht beschäftigt.
      Ein anderer Nutzer der Tutorials hat mir mal geschrieben, dass er ein Jitsi Image bauen möchte. Leider ist das wohl gescheitert…

      https://github.com/jitsi/docker-jitsi-meet
      Da wäre das offizielle Repository.
      Aber durch Traefik wird sich das nicht ohne Anpassungen schleusen lassen. Alleine schon wegen der zusätzlichen Ports.

      Viel Glück!
      Peter.

  8. Hallo klasse Anleitung. Nur die Hintergrund-Aufgaben lassen sich nicht über Cron automatiseren.
    Hast du eine Idee an was das liegen könnte?

    1. Hi Juli,
      danke für die Blumen!
      Zu Deinem Problem bräuchte ich aber schon ein bisschen mehr Info…

      Kommt eine Fehlermeldung?
      Falls nicht, brauche ich die Ausgabe von „docker ps -a“ und „crontab -l“ an fiedler@cpf.de

      Frohe Ostern!
      Peter.

  9. Vielen Dank für die wirklich guten Anleitungen! Dank euch habe ich’s geschafft den alten Traefik durch die v2 zu ersetzen. Es war der benötigte Anstoß um alles zu verstehen ;)

    Ein Hinweis, ich habe nach langem suchen einen Fehler in eurer Nextcloud Docker-Compose gefunden.

    Die Zeilen:
    – „traefik.http.routers.nextcloud-sec.middlewares=default-headers@file“
    – „traefik.http.routers.nextcloud-sec.middlewares=calcarddav“
    sorgen dafür, dass Traefik nur eins der beiden anwedet, dies hat bei mir dazu geführt, dass die headers nicht angewendet wurden. Aufgefallen ist es beim Selbsttest von Nextcloud (meckert über STS). Mit dem Label in einer einzigen Zeile
    – „traefik.http.routers.nextcloud-sec.middlewares=calcarddav,default-headers@file“
    Funktioniert es dann. Alternativ könntet ihr auch eine Middleware Chain bilden
    Grüße und weiter so! :)

    1. Hallo Eike,
      ganz vielen Dank dafür!
      Da ich diese Funktion selber nicht nutze ist mir das bis jetzt nicht aufgefallen…
      Den STS-Fehler hab ich gekonnt ignoriert, da der Wert ja in der Config gesetzt war. Silly me!
      Bleib gesund :)
      Peter.

    1. Peter Fiedler

      Ja, das ist eine blöde Geschichte… Da brauchst einen richtig schnellen Server.
      Ich verwende clientseitige Verschlüsselung mit Cryptomator. Das funktioniert super, wenn Du nur Computer an die Cloud stöpselst. Auf Handys soll das laufen, aber da ist die Geschwindigkeit dann auch grottig.

  10. Andreas Baumruck

    Hallo Peter!
    Die meisten meiner verbliebenen Fragen konnte ich, dank Deiner Anleitung und ein wenig gegoogle, selbst klären.
    Übrig geblieben sind noch diese Punkte:
    NextCloud/WordPress
    -> kann ich Updates einfach über die integrierten Updater einspielen, oder gibt es da etwas zu beachten (ausser vorab einen
    snapshot zu machen?
    Backups
    -> mich würde noch interessieren, wie backup/restore genau ablaufen. Das habe ich nicht wirklich durchschaut

    1. Bei Nextcloud sind die Updates leider etwas besonderes. Über den integrierten Updater kannst die leider nicht einspielen. Das Ganze läuft wie folgt:
      1.) Ins Nextloud Dockerfile und dort die Version durch die neueste ersetzen.
      2.) Image neu bauen lassen und wieder mit „latest“ taggen.
      3.) Den Container mit „docker-compose up -d“ neu erstellen lassen.
      4.) Einloggen und jetzt den „Aktualisieren“ Button anklicken.
      Das dauert dann ein Weilchen, aber sollte von Erfolg gekrönt sein und dann wieder einloggen.
      5.) Das alte Image löschen. Das geht mit „docker images“ zur Anzeige und dann „docker images rmi [ID]“. Dazu kommt noch ein extra Tutorial.

      Snapshots brauchst da keine machen, weil beide Images noch da sind. Läuft das neue nicht, einfach das alte wieder mit „latest“ taggen und den Container wieder neu bauen lassen – geht wieder.

      Backup / Restore von Nextcloud? Oder Deinen dort gespeicherten Daten? Oder beidem?

Kommentar verfassen

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

Verwendung
von Cookies

Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung.

Scroll to Top