[Howto] Nextcloud mittels Docker-Container

  • [NAS Typ:] TS-251+
    [Firmware:] 4.3.4.0435
    [Getestet:] ja
    [Sonstige Modifikationen:] keine


    Um den vielen Fragen nach einem Tutorial zur Nutzung von NextCloud nachzukommen, habe ich ein weiteres kleines Schritt-für-Schritt-Tutorial erstellt. Da dieses Tutorial als Voraussetzung MariaDB und phpMyAdmin benötigt, sollte vorher mein erstes Tutorial zum Thema "MariaDB + phpMyAdmin im Docker Container" durchgeführt werden. Beide Docker-Container müssen gestartet sein und sollten korrekt laufen. Andernfalls müssen die entsprechenden Felder selbstständig korrigiert bzw. korrekt gefüllt werden. Nach erfolgreicher Durchführung dieses Tutorials steht ein Apache2-Server in einem Docker-Container mit einem lauffähigen NextCloud über das unsichere HTTP-Protokoll zur Verfügung. Ich empfehle es ausdrücklich nicht, diesen NextCloud-Server direkt über das Internet nach außen zugänglich zu machen. Vor Nutzung dieser NextCloud-Instanz über das Internet sollte ein Reverse-Proxy mit einem passenden Zertifikat eingerichtet werden. Innerhalb des eigenen, privaten Netzes sollte die Nutzung in meinen Augen unbedenklich sein.


    Da das offizielle NextCloud-Image Probleme unter Nutzung eines Qnap-NAS aufweist (Container beendet sich nach Wechsel auf den laufenden Container über die Qnap-GUI selbstständig, da Apache2 das Linux-Signal SIGWNDCH für sich verwendet), nutze ich für dieses Tutorial das Image "webdevops/php-apache", welches auf dem Docker-Hub zur Verfügung steht. Mit diesem habe ich bereits sehr positive Erfahrungen sammeln können


    Dieses Tutorial besteht im wesentlichen aus den folgenden vier Punkten:

    • Anlegen des NextCloud-eigenen MariaDB-Nutzers mit der dazugehörigen, leeren Datenbank
    • Download und Entpacken von NextCloud zur Nutzung unter Apache2
    • Docker-Container für NextCloud erstellen
    • NextCloud-Instanz konfigurieren

    Ich habe das gesamte Tutorial auf mehrere Antworten verteilt, da ich sonst Probleme mit dem bestehenden 10.000-Zeichen-Limit des Forums hatte und leider noch nix vom Blog wusste - Vieln Dank noch einmal an Christian für den Hinweis dazu - das nächste mal werde ich dort schreiben ... :)


    Aber nun genug geredet - "Let's fetz" und viel Spaß :D

    2 Mal editiert, zuletzt von ariaci ()

  • 1) Anlegen des NextCloud-eigenen MariaDB-Nutzers mit der dazugehörigen, leeren Datenbank

  • 2) Download und Entpacken von NextCloud zur späteren Nutzung unter Apache2

  • 3) Docker-Container für NextCloud erstellen

    • Auswahl des Images "webdevops/php-apache", Klick auf "Erstellen" und Einstellung des Container-Namens
      03 php-apache-Container erstellen - Schritt 1.png
      Im ersten Schritt ist der Container-Name (Feld 1) zu vergeben. Dieser muss lokal eindeutig sein. Im Normalfall ist hier nichts anzupassen. Die restlichen allgemeinen Eigenschaften können ebenfalls beim Standard verbleiben. Nachdem alles für euch passend konfiguriert ist, genügt ein Klick auf "Erweiterte Einstellungen". Solltet ihr Probleme beim Erstellen des Containers haben und z.B. der Eingangspunkt bzw. Befehl leer sein, so schaut bitte die Allgemeinen Hinweise (Punkt 0) im "MariaDB + phpMyAdmin im Docker-Container erstellen"-Tutorial durch und befolgt die dort stehenden Punkte.
    • MariaDB und NextCloud miteinander vebinden, damit eine gesicherte Kommunikation zwischen diesen Containern erfolgen kann
      03 php-apache-Container erstellen - Schritt 2.png
      Nachdem in die erweiterten Einstellungen gewechselt wurde, befindet man sich auf der Seite "Link". Über diese Seite können Docker-Container miteinander verbunden werden. Um eine Verbindung herzustellen reicht ein Klick auf "Hinzufügen" und die richtige Konfiguration der entsprechenden Werte. In der Combobox in der Spalte "Link" ist in unserem Falle der Name des Docker-Container von MariaDB auszuwählen. In meinem Fall lautet dieser "mariadb-1". Als Alias verwenden wir die Bezeichnung "db". Die Bezeichnung kann jedoch von auch frei gewählt werden. Wichtig ist, dass ihr euch den hier vergebenen Alias-Namen merkt, da später unter diesem Hostnamen MariaDB dem NextCloud-Container zur Verfügung steht. Ist dies getan, so konfigurieren wir nun die benötigten Umgebungsvariablen über einen Klick auf "Umgebung".
    • Benötigte Umgebungsvariablen für den Apache-Container festlegen
      03 php-apache-Container erstellen - Schritt 3.png
      Um die Umgebungsvariablen des Docker-Containers festzulegen, müsst ihr in den erweiterten Einstellungen auf die Seite "Umgebung" wechseln. Danach seht ihr eine Liste der Variablen und deren Werte. Die dort sichtbaren Variablen werden unter dem entsprechenden Namen und mit dem festgelegten Wert an den Container übergeben. Diese stehen dann dem Container für seine Zwecke zur Verfügung. Es werden nicht immer alle konfigurierbaren Umgebungsvariablen nach außen geführt. Wichtig ist für das verwendete Apache2-Image, das die Umgebungsvariablen "APPLICATION_GID" und "APPLICATION_UID" korrekt konfiguriert sind. Mittels "APPLICATION_GID" wird die zu verwendende Benutzergruppe konfiguriert, unter der der Apache2-Dienst im Container laufen soll. Dieser sollte unter der Administrator-Gruppe der Qnap laufen, welche die ID 0 haben müsste. Mit "APPLICATION_UID" ist der zu nutzende User konfigurierbar. Dieser sollte als lokaler httpdusr des Host-Systems (eurer Qnap) laufen. Die ID des Users dürfte im Standardfall bei Qnap 99 lauten. Falls ihr euch nicht sicher seid, ob diese Werte passen, so könnt ihr diese mittels SSH, z.B. Putty und den Befehlen id -u httpdusr für die Nutzer-ID bzw. id -g httpdusr für die Gruppen-ID ermitteln.
      Sind diese beiden Werte konfiguriert, so geht es zur Konfiguration des Netzwerks per Klick auf "Netzwerk" weiter.
    • Konfiguration der Ports, um auf den Apache2-Webserver für die NextCloud-Instanz über den Host zugreifen zu können
      03 php-apache-Container erstellen - Schritt 4.png
      Dieser Schritt wird nicht unbedingt benötigt, ist jedoch dann wichtig, wenn ich die NextCloud-Instanz direkt über die Adresse des NAS erreichen möchte. Im Normalfall wählt Docker beim Start des Containers einen zufälligen Port für jeden Port, der durch den Container nach außen gegeben werden soll. In unserem Fall verwendet der Apache2-Container die Standardports 80 für eine unsichere Verbindung (Standardport für Standard HTTP-Anwendungen) und 443 für eine sichere Verbindung zum Webserver. Um über den Host auf den Webserver des Containers zugreifen zu können, kann jedoch nicht in jedem Fall direkt der Port 80 oder 443 verwendet werden, da Docker ja nicht weiß, ob diese Ports bereits durch den Host belegt sind. Daher wird wird bei Nichtkonfiguration zufällige, freie Ports verwendet. Diese können hier auf feste Ports gelegt werden. In meinem Beispiel der Port 10080 für eine unsichere Verbindung und 10443 für eine sichere. Ist mein NAS über den Namen "testnas" erreichbar, so ist die Apache2-Instanz des Containers für HTTP über testnas:10080 und für HTTPS über testnas:10443 erreichbar. Der letzte Port 9000 wird auf dem Host nicht unbedingt benötigt und kann daher frei bleiben bzw. zufällig beim Start vergeben werden.
      Nachdem hier alles entsprechend konfiguriert wurde, kann auf die Konfiguration des Apache2-Contents per Klick auf "Freigabe..." gewechselt werden.
    • Apache2-Inhalt außerhalb des Containers festlegen
      03 php-apache-Container erstellen - Schritt 5.png
      Wird dieser Schritt übersprungen, so wird innerhalb des Containers ein extra Datenbereich angelegt, so stellt unsere Apache2-Instanz keinerlei Inhalt zur Verfügung. Um NextCloud dem Apache2-Server zur Verfügung zu stellen, muss hier eine Verbindung zwischen dem Host-Dateisystem und unserem Container angelegt werden. Laut Dokumentation des "webdevops/php-apache"-Images steht dafür im Container der Ordner "/app" zur Verfügung. Sämtlicher dort liegender Inhalt wird durch Apache2 gehostet. Da ich in meinem Fall in Schritt 2 den Download nach "/Public" entpackt habe, verwende ich in meinem Beispiel den lokalen Ordner "/Public/nextcloud" und binde den kompletten Inhalt unter "/app" im Container ein. Im Hintergrund verwendet Docker eine Art Mount-Point. Das heißt, eine lokale Änderung wirkt sich direkt im Container und andersherum aus.
      Nachdem auch dies korrekt konfiguriert wurde, genügt ein Klick auf "Erstellen", um unseren Webserver mit Apache2 und NextCloud zu erstellen.
    • Erstellen des Containers
      Die Erstellung sollte relativ flott von unserer Qnap erledigt sein. Prüfen könnt ihr dies, indem ihr euch die Konsolenausgabe (unterer Teil in der Container Station - einfach den entsprechenden Docker-Container mit dem richtigen Namen anklicken) anschaut. Nachdem der Container hoffentlich korrekt läuft, kann per Browser und unserem konfigurierten Port für eine unsichere Verbindung direkt zu NextCloud gewechselt werden.



      HERZLICHEN GLÜCKWUNSCH :thumbup: - DIE ERSTE HÜRDE IST ÜBERWUNDEN :)

  • 4) NextCloud-Instanz konfigurieren

    • Browser starten und Über Namen des "http://<Namen oder IP des NAS>:<Port>" NextCloud aufrufen
      04 nextcloud in Aktion Ersteinrichtung - Schritt 1.png
      Hier erfolgt das Basis-Setup von NextCloud. Gebt hier den Nutzernamen und ein Passwort für euren Administrator zu NextCloud ein. Weiterhin konfiguriert ihr hier eure zu nutzende Datenbank. Im Standardfall verwendet NextCloud SQlite. Dies ist jedoch nicht empfehlenswert. Zur Konfiguration auf das Feld "Speicher und Datenbank" klicken und auf "MySQL/MariaDB" wechseln. Nun könnt ihr euren vorab in Schritt 1 erstellten Nutzer, das dazugehörige Passwort und die zu verwendende Datenbank (sollte mit dem Namen des Nutzers übereinstimmen) konfigurieren. Als Adresse des Datenbank-Servers tragt ihr den im Schritt 3.1 verwendeten Alias-Namen ein.
      Nach Klick auf "Installation abschließen" benötigt NextCloud etwas Zeit, um die MariaDB-Datenbank mit Daten und den zugehörigen Tabellen zu füllen. Genehmigt euch hier am besten einen weiteren :cup: und lasst eure Qnap "rödeln".
    • Nach Abschluss der Einrichtung
      04 nextcloud in Aktion Ersteinrichtung - Schritt 2.png
      Nach Abschluss müsst ihr nur noch den "Willkommen"-Bildschirm per Klick auf das "X" rechts oben schließen.
    • Laufende und komplette eingerichtete Instanz von NextCloud
      04 nextcloud in Aktion Ersteinrichtung - Schritt 3.png
      Seht ihr diesen Bildschirm, so ist alles korrekt verlaufen und ihr habt eine laufende NextCloud-Instanz.



      HERZLICHEN GLÜCKWUNSCH!

    Das war's dann erstmal von mir. Ich hoffe, ihr könnt/konntet mit dem kleinen :handbuch: etwas anfangen.
    Und nun viel Spaß beim Nachmachen ... :qclub:

  • Hallo,


    kannst du mir den Vorteil zu einer direkten Docker Installation sagen? Funktionieren hier Updates über den internen Updater?


    Edit: Ich habe mir dein Tutorial jetzt mal zu Gemüte gezogen und muss sagen dass es schon ein paar Vorteile gibt, die du oben auch erwähnt hast. Aber ich habe das Gefühl, dass das Laden relativ lange dauert (TS453 Pro)
    Muss aber auch dazu sagen, dass ich mich für die Einbindung in die lokale SQL DB entschieden habe.


    + https Unterstützung
    + Docker wird nicht bei jedem Klick auf die Einstellungen neu gestartet
    + schnell eingerichtet
    + Verzeichnis Wahl


    - gefühlt langsamer als eine lokale Installation


    Vielen Dank für die Anleitung!

    Einmal editiert, zuletzt von nadstefan ()

  • Hallo nadstefan,


    ich versuche mal deine Frage zu beantworten.


    Ich sehe den größten Vorteil bei Docker darin, dass das vorhandene System absolut unangetastet bleibt. Bis auf die nach außen geführten Volumes, werden keine Änderungen am Host-System vorgenommen. Dadurch können Updates usw. ohne Weiteres durchgeführt werden. Sollte es zu Problemen kommen, so kann dieser Container auf einen funktionierenden Stand zurückgesetzt werden. Die Flexibilität liegt darin, dass eben sämtliche benötigten Komponenten bereits komplett "verpackt" geliefert werden und damit auch keine System-Bibliotheken zerstören, da jeder Container in einem abgetrennten Kernel-Namespace des Hosts läuft. Im Fall des verwendeten "webdevops/php-apache" hat dies den Vorteil, dass PHP7 verwendet werden kann, obwohl der Host-eigene Apache der Qnap nur PHP5 anbietet. Beide Installationen beeinflussen sich nicht.


    Zu deinen vier Positiv-Punkten:

    • https-Unterstützung
      Auch diese kann über das vorliegende Basis-Image konfiguriert werden. Allerdings habe ich diesen Schritt aufgrund der sonst hinzukommenden Komplexität erst einmal bewusst ausgelassen. Die Nutzung eines Reverse-Proxies ist allerdings sehr sinnvoll, um die verwendeten Zertifikate zentral an einer Stelle "hosten" zu können.
    • Docker wird nicht bei jeden Klick auf die Einstellungen neu gestartet
      Da die ContainerStation als Backend im Hintergrund ebenfalls vollständig das native Docker verwendet, ist auch hier eine Unterdrückung des Neustarts möglich. Dazu muss das Häkchen "Container zur Übernahme der Einstellungen bitte neu starten" deaktiviert werden:
      Container-Neustart-Einstellungen.png
    • schnell eingerichtet
      Im Prinzip hast du hier vollkommen Recht. Eine Einrichtung über die bash geht deutlich schneller von der Hand, wenn man firm in der Benutzung der Gui ist. Ich selbst habe für diese wiederkehrenden Aufgaben Skripte geschrieben, welche lediglich gestartet werden müssen. docker-compose übernimmt hier das Updaten und die passende Konfiguration der Dienste.
    • Verzeichnis Wahl
      Jup - man hat auf der Konsole auch die Möglichkeit, Verzeichnisse zu nutzen, welche nicht in der Oberfläche angeboten werden. Würde ich ebenfalls als Vorteil sehen :)

    Zu deinem Negativ-Punkt:

    • Gefühlt langsamer
      Ich glaube nicht, dass eines der beiden Systeme tatsächlich langsamer oder schneller ist. Die ContainerStation verwendet ja im Hintergrund auch nur docker. Ich kann mir maximal vorstellen, dass auf der bash manuell ein paar Befehle mehr, wie z.B. das Pullen der aktuellsten Version, ausgeführt werden, die an der Oberfläche so entfallen. Im laufenden Betrieb sollte sich die Performance gar nicht unterscheiden.

    Zum Update:


    Da gibt es verschiedene Varianten. Ich habe Skripte geschrieben, die sich das aktuellste Image des benötigten Basis-Image pullen und nachher automatisch per docker-compose auf Basis dieser neuen Images einen neuen Container erstellen. Das Ganze könnte auch manuell durchgeführt werden, erfordert jedoch, dass bei jedem Update sämtliche Einstellungen (wenn das Update über die ContainerStation durchgeführt werden soll) neu konfiguriert werden müssen. Dabei müssen die lokal liegenden Volumes wieder korrekt mit dem Image verbunden werden.


    Ich hoffe, meine Antworten waren nicht allzu verwirrend :qclub:


    Ciao
    ariaci

  • Hallo,


    ich habe anstelle des Ordners Public mir einen neuen Freigabeordner mit dem Namen "DockerFiles" gemacht, darin den Ordner nextcloud. Habe das auch so bei "Volume vom Host" angegeben, aber wenn ich die Docker starte kommen einige Fehler und die Seite ist auch nicht erreichbar. Habe bereits mit

    Code
    chown -R httpdusr:everyone /share/DockerFiles/chown -R httpdusr:everyone /share/DockerFiles/nextcloud


    versucht die rechte zu vergeben aber anscheinend erfolglos.


    Der Fehler ist folgender:



    Wie kann ich das beheben?


    Grüße

  • Hallo silencshadow,


    versuch bitte mal anstatt


    chown -R httpdusr:everyone /share/DockerFiles/
    chown -R httpdusr:everyone /share/DockerFiles/nextcloud


    die Verwendung der Nutzer-IDs. Ich hatte damit vor langer Zeit auch mal Probleme und dächte, ich hätte das mit den Befehlen


    chown -R 1000:1000 /share/DockerFiles/
    chown -R 1000:1000 /share/DockerFiles/nextcloud


    klären können. Aus diesem Grund habe ich mir dann ein eigenes Image, basierend auf webdevops/php-apache, gebaut. :D


    Ciao
    ariaci

  • Hallo,


    Habe den Mariadb-data Ordner zerschossen, da unten steht wie man es "repariert". Die Nextcloud anwendung geht dennoch nicht, obwohl ich alle Ordner und Dateien sogar auf chmod 777 laufen habe und der chown ist httpdusr:aministrator also chown 99:0.. wie im Enviroment angegeben .....







    Der Edit für die Leute die das selbe Problem mit der MariaDB haben:
    Der MariaDB Ordner brauch folgende chmod und chown!!







    Grüße

  • Moin,


    sorry, da habe ich dich gestern falsch verstanden. Ich war der Meinung, dass du dein "DockerFiles"-Verzeichnis nach "/app" gemountet hast.
    Dies ist ja nun zum Glück geklärt :rolleyes: ...


    Probiere bitte mal, dem allen unter /share/nextcloud liegenden Dateien/Verzeichnissen den Besitzer 1000 mit der Gruppe 1000 zu geben.
    Sollte dann folgender Befehl sein:
    chown -R 1000:1000 /share/DockerFiles/nextcloud/


    Ich glaube das Problem ist, dass der Nutzer und die Gruppe "application" im Docker-Container diese Nutzer-/Gruppen-ID verwenden. Einige Dienste verwenden u.U. noch unter diese ID und können somit nicht auf /app zugreifen.


    Ciao
    ariaci

  • Hallo,


    hat leider nicht geklappt. Also, die Fehler bleiben.. Chmod ist immer noch 777 also eigentlich sollte doch sogar ein Gast die Rechte haben da was auszuführen?!

    Code
    chown -R 1000:1000 /share/DockerFiles/nextcloud/[Wed Feb 14 10:46:54.025131 2018] [core:crit] [pid 68:tid 140046480008960] (13)Permission denied: [client 10.0.3.1:43702] AH00529: /app/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable and that '/app/' is executable


    In der Docker unter Shared Folders ist folgendes angegeben:



    Code
    Shared Folders		
    /app	/share/DockerFiles/nextcloud	
    Read/Write


    Grüße

  • So eine gute und bebilderte Anleitung. Da könnte man meinen es kann nichts schief gehen. Ich habs aber trotzdem geschafft.
    Habe die Anleitung jetzt 3x durch. Leider finde ich den Fehler nicht. Ich kann es auch nicht selbst beheben, weil Container Neuland für mich sind. Ich bin froh der Anleitung folgen zu können, aber das zu verstehen, davon bin ich sehr weit weg.


    f.PNG

  • danke für die ausführliche anleitung. leider gehts mir auch wir rednag. sowohl per http://....:10080 als auch per https://....:10443 leider nur


    Code
    Forbidden
    You don't have permission to access /on this server.
    Server unable to read htaccess file, denying access to be safe
    
    
    Apache/2.4.18 (Ubuntu) Server at xxx.xxx.xxx.xxx Port 10443


    was machen wir verkehrt?

  • Hallo,


    versucht mal bitte per SSH den Besitzer/die Besitzergruppe für den Ordner und sämtliche darunter liegenden Dateien auf 1000:1000 zu setzen.


    Das funktioniert über SSH (zum Beispiel per Putty) über folgenden Befehl:


    chown -R 1000:1000 /share/Public/nextcloud


    Anstatt “/share/Public/nextcloud“ müsst ihr natürlich euren verwendeten NextCloud-Ordner verwenden, in den ihr den nextcloud-Source entpackt habt.


    Ich hoffe das hilft etwas ...


    Ciao
    ariaci


    PS: Ich habe alle im Tutorial beschriebenen Schritte als Administrator ausgeführt. Evtl. besteht hier noch ein Unterschied?

    Einmal editiert, zuletzt von ariaci ()

  • guten morgen,


    der befehl chown -R 1000:1000 /share/Public/nextcloud brachte keine veränderung. als admin habe ich auch alle schritte durchgeführt... naja ich werde weiter probieren.


    gruß schumla

  • Hat soweit ganz gut geklappt alles.


    Die Nextcloud meckert jetzt aber das kein php Memory Cache und so weiter konfiguriert ist.


    Wie komme ich jetzt in dem Apache Container an die Configs ?


    Gruß

  • Hallo Luzifer999,


    sorry, dass ich erst jetzt zum Antworten komme - die Arbeit halt - aber das kennst du ja sicher selbst :whistling:


    Um Hilfe zur weiteren Konfiguration des Container zu erhalten, kannst du auf diese Seite schauen: http://dockerfile.readthedocs.…ckerfiles/php-apache.html
    Dort sind sämtliche Konfigurationsmöglichkeiten, ob über Umgebungsvariablen oder die Configs selbst, dokumentiert.


    In deinem Fall sollte das Binden des Ordners "/opt/docker/etc/httpd/conf.d" des Containers zu einem lokalen Ordner deiner Wahl ausreichend sein. Nach einem Start des Containers dürfte dann dein lokaler Ordner mit den aktuellen Konfigurationsdateien des Apache gefüllt sein. Eine Änderung der Konfiguration wirkt sich entsprechend nach einem Neustart des Containers (oder des Apaches direkt im laufenden Container) aus.


    Ich hoffe das hilft dir etwas weiter ...


    Ciao
    ariaci

  • Das macht überhaupt nichts, und ja kenne ich. ;) Ich hätte momentan sowieso nix anstellen können. Bindehautentzündung :(


    Aber dein Beitrag Hilft mir. Hatte die angaben auf der Seite gesehen, nur falsch interpretiert. Danke dir für dein Hilfreiches Tutorial. Hatte schon länger geplant mich mal mit Docker zu beschäftigen, und das war nun der einstieg für mich!


    :)

  • Hat leider nicht funktioniert. Der Ordner war leider leer. Muss da wohl weiter rumexperimentieren.


    EDIT: das einloggen mittles SSH auf dem QNAP und

    Code
    docker exec -it php-apache-1 bash

    war des Rätzels Lösung. Installieren von nano mittels apt-get war kein Problem und somit das bearbeiten der Configs lt. Doku auch nicht.


    :)

    Einmal editiert, zuletzt von eol21 ()