Da das NAS-System ohnehin ständig läuft, bietet es sich an, dort auch Services zu installieren, die vom Internet ständig erreichbar sein sollen. Zur Isolierung vom restlichen System sollen sie aber als Docker-Container laufen. Damit haben die Services nur Zugriff auf die Ressourcen, die unbedingt nötig sind.
Dafür wird am Internet-Router wird eine Portweiterleitung vom externen Port 443 auf Port 8000 des NAS-Servers eingerichtet. Der Standard-SSL-Port 443 des NAS ist ja bereits von der Weboberfläche des NAS-Systems belegt.
Auf dem NAS horcht ein nginx-Webserver als reverse Proxy an Port 8000, setzt den verschlüsselten https-Datenstrom in unverschlüsseltes http um und leitet es an den lokalen Port 8001 weiter.
Die Docker-interne Bridge an Port 8001 des NAS-Hosts leitet den Verkehr an Port 80 des nextcloud-Containers weiter. Damit landet alles, was per https am externen Router-Port ankommt, schließlich unverschlüsselt an Port 80 des nextcloud-Systems.
Als Datenspeicher für nextcloud dient eine MariaDB, die ebenfalls als Docker-Container auf dem NAS läuft und auf dem Host-Port 3306 arbeitet. Das Watchtower-Paket sorgt für die automatische Aktualisierung der Docker-Pakete.
Im einzelnen sind diese Konfigurationsschritte nötig:
- Docker-Erweiterung installieren (siehe Docker-Artikel)
- Docker-Images herunterladen für:
- mariadb
- nextcloud
- v2tech/watchtower - MariaDB Container über die omv-GUI starten. Folgende Parameter eintragen:
- Name: mariadb
- Restart Policy: unless-stopped
- Netzwermodus: Host
- Ungebungsvariable MYSQL_ROOT_PASSWORD=xxx - MySQL Nutzer für nextcloud in der Docker-Shell anlegen:
host# docker exec -it mariadb bash docker# mysql -u root -p xxx mysql# create user nextcloud@localhost identified by 'yyy'; mysql# create user nextcloud@'%' identified by 'yyy'; mysql# grant all privileges on nextcloud.* to nextcloud@localhost; mysql# grant all privileges on nextcloud.* to nextcloud@'%';
- Nextcloud Container über die omv-GUI starten. Folgende Parameter eintragen:
- Name: nextcloud
- Restart Policy: unless-stopped
- Netzwerkmodus: Bridge
- Host Name: cloud.home.kunz.de
- Port 0.0.0.0:8001 -> Container Port 80/tcp
- Container Dir /var/www/html -> Host Dir /cloud - Nginx reverse Proxy in der omv-GUI einrichten:
- Erweiterung openmediavault-nginx installieren
- Dienste -> nginx -> Einstellungen -> Aktivieren
- Dienste -> nginx -> Server ->Hinzufügen
- Aktivieren
- SSL aktivieren
- Port: 8000
- Zertifikat: Let’s Encrypt
- Only use SSL
- Zusätzliche Optionen:location / { proxy_pass http://127.0.0.1:8001; proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect http:// https://; }
Quellen und Verweise:
- Nextcloud ins NAS, c’t 10/2018 S. 142 ff
- Umbauanleitung: Docker-Container für Haus- und Heimserver, c’t 15⁄2017 S.110ff, Fehlerbereinigung unter gist.github.com
Hallo Jörg,
Dein Beitrag ist interessant und ich habe schon lange nach dieser Möglichkeit gesucht.
Leider habe ich folgendes Problem und Du kannst mir vielleicht dabei helfen.
Ich habe seit über einem Jahr mein OMV am laufen und bin voll zufrieden.
Ich habe mein OMV über Docker erweitert und lasse dabei einige Container laufen:
- Plex
- Unifi
- TVHeadend
- Nextcloud
Bisher war es so, dass ich die einzelnen Sites über eine Portweiterleitung von außen angesprochen habe.
Das ganze natürlich über SSL mit Letsencrypt, abgesichert.
z.B.
https://myDomain.spdns.de:0000
Hat auch super funktioniert.
Schöner wäre es aber wenn ich das ganze nun über Namen ansprechen könnte,
z.B.
https://myDomain.spdns.de/nextcloud
https://myDomain.spdns.de/Unifi
usw.
Ich habe Deinen Artikel durchgearbeitet und die Umleitung funktioniert auch soweit.
Ich kann von Aussen meine Nextcloud ansprechen.
Leider aber nur über meine Domain.
https://myDomain.spdns.de
Ich sitze seit 2 Tagen an meinem Server und habe schon das halbe Internet ausgelesen.
Ich komme aber einfach nicht weiter.
Kannst Du mir hier weiterhelfen oder habe ich da einen Denkfehler?
Viele Grüsse aus Bayern.
Josef
Hallo Josef, ich bin nicht ganz sicher, ob ich dein Problem verstanden habe. Du willst nextcloud also über https://myDomain.spdns.de/nextcloud erreichen können? Das ist etwas anderes als die Konstruktion mit Reverse Proxy oben. Du müsstest dann per Redirect eine Seite deines Web-Servers auf den entsprechenden Port des nextcloud-Docker-Images umleiten.
Eher im Sinne dieser Anleitung wäre eine Adresse wie https://nextcloud.myDomain.spdns.de, also eine Subdomain. Dieser Name lässt sich dann mit dem Reverse Proxy auf den nextcloud-Container mappen. Wichtig ist, dass das DNS die Subdomain dann auf die Adresse des Reverse-Proxy-Servers auflöst.
Hallo Jörg,
du hast geschrieben „Bisher war es so, dass ich die einzelnen Sites über eine Portweiterleitung von außen angesprochen habe.”
Wie genau hast du das realisiert? OMV und Docker sind ziemlich neu für mich.
Ich habe Plex und NextcloudPi als Docker eingerichtet und möchte auf Nextcloud bzw NextcloudPi jetzt auch von außerhalb des Netzwerks zugreifen.
An meinen Fritzbox-Einstellungen habe ich die Ports 80 und 443 freigegeben, allerdings gelingt es mir nicht, DNS einzurichten (DNS hatte ich an anderer Stelle schon einmal eingerichtet, ist also nicht komplett neu für mich).
Wie sahen die einzelnen Schritte bei dir aus? Ich würde mich über eine Antwort freuen 🙂
Viele Grüße
Leo
Hallo Leo,
Die Aussage zu den Portweiterleitungen kam nicht von mir, sondern aus einem Kommentar.
Wenn Du nur einen einzigen Service verfügbar machen willst, reicht es, in der Fritzbox einen DynDNS-Service einzurichten und Port 443 auf deinen Server weiterzuleiten (der natürlich dann auch auf 443 und https hören muss). Dann ist dein Server vom Internet aus über den per DynDNS eingerichteten Hostnamen erreichbar.
Wie DynDNS eingerichtet wird, findest Du im Fritz-Handbuch. Im Artikel https://edv.mueggelland.de/dyndns-ersatz-freedns-einrichten/ ist es für einen Router ohne DynDNS-Unterstützung beschrieben.
Docker und reverse Proxies brauchst Du nur, wenn Du mehrere Services auf unterschiedlichen Hostnamen eines Servers bedienen willst. Alle Hostnamen zeigen dann auf die selbe Adresse; der reverse Proxy kümmert sich darum, die Anfragen je nach Hostname auf die unterschiedlichen Services/Ports/Docker-Container weiterzuleiten. Die DNS-Auflösung musst Du bei deinem Internet-Provider einrichten, das ist bei jedem etwas anders gelöst. Am Beispiel Hetzner/freedns erklärt es der o.g. Artikel.
Hallo Jörg,
entschuldige, da habe ich mich vertan! Es war schon zu spät..
Vielen Dank für die schnelle Antwort! Deine Ausführungen haben mir geholfen, das besser zu verstehen. Ich habe es jetzt mit DynDNS hinbekommen.
Viele Grüße
Leo
Hallo Josef,
du schreibst „Bisher war es so, dass ich die einzelnen Sites über eine Portweiterleitung von außen angesprochen habe.”
Wie genau hast du das realisiert?
OMV und Docker sind für mich ziemlich neu. Bisher habe ich Plex und NextcloudPi als Docker eingerichtet.
Leider gelingt es mir nicht, Nextcloud bzw. NextcloudPi von außerhalb des Netzwerks zugänglich zu machen.
Bei meiner Fritzbox habe ich die Ports 80 und 443 geöffnet, leider funktioniert das nicht.
Wie waren deine einzelnen Schritte als du das gemacht hast?
Ich freue mich über eine Antwort 🙂
Viele Grüße, Leo
Hi,
wollte schon Traefik als Reverse Proxy für docker einsetzen. Aber die Lösung mit dem omv-nginx finde ich angenehmer. Kleiner Tip zu deiner config für den nginx-server, da sollte man
„client_max_body_size 1G;” hinzufügen. Im Standard stehen 10M. Womit dateien > 10M nicht hochgeladen werden können das sieht man im nginx an folgendem Fehler Eintrag „.…client intended to send too large body:.…” und das der upload im nextcloud einfach stehen bleibt. 😉
Kann dann so aussehen
client_max_body_size 1G;
location / {
proxy_pass http://127.0.0.1:8001;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect http:// https://; }
Hallo John,
Danke für den Tipp! Im Moment ist das bei mir noch kein Problem, weil mein nextcloud zur Zeit nur für Kontakte und Kalender benutzt wird. Bei Nutzung als Cloud-Speicher aber ganz sicher sinnvoll, sonst hakt’s vielleicht schon beim ersten Filmchen.
Moin,
danke für die Anleitung. Ich habe Nextcloud so zunächst erfolgreich eingerichtet und kann sie über den Browser auch aufrufen (zur Zeit nur im lokalen Netz, weil ich keine Portweiterleitungen vom Router einrichten kann). Versuche ich jedoch, mich per App auf dem Handy oder Desktopanwendung anzumelden, bekomme ich die Fehlermeldung „400 Bad Request The plain HTTP request was sent to HTTPS port nginx/1.10.3”
Woran liegt das? Ich habe alle Einstellungen so vorgenommen wie hier beschrieben.
VG
Bastian
Das hört sich so an, als ob deine App versucht, sich unverschlüsselt anzumelden. Checke nochmal, ob Du für Nextcloud auch die korrekte https:// Adresse angegeben hast.
hallo jörg, danke für deine anleitung, leider klemmt es bei mir .…..
was ich schaffte:
cloud.server.de
unter dieser adresse (natürlich anonymisiert) läuft omv 4 mit https, letsencrypt und docker
ich habe jetzt nextcloud installiert (docker)
läuft super auf port 444 - ich erhalte jedoch eine fehlermeldung bezüglich des zertifikats (das schaffe ich)
was ich jetzt dank deiner anleitung erreichen wollte war, dass ich die nextcloud nicht mehr über den port aufrufe sondern über eine subdomain. mein ziel war:
data.server.de
leider klappt das nach deiner anleitung gar nicht, ich lande immer wieder auf der loginseite von omv.
hst du eine ahnung was ich da noch falsch abgetippt haben könnte?
danke
Der Zertifikatsfehler ist normal, es ist ja für einen anderen Hostnamen ausgestellt.
Wenn sich omv meldet, landest Du auf dem Standard-SSL-Port (443). Da stimmt also eine der Portweiterleitungen nicht, entweder am Router, im nginx oder der Docker-Bridge.
Moin.
Zwei Fragen zur Anleitung:
1) Host Name: cloud.home.kunz.de ist hier als Subdomain konfiguriert, richtig? Ich müsste das also anpassen an: nextcloud.meine-dyndns-domain.
Bei letsencrypt trage ich meine-dyndns-domain wieder ein. Was muss bei Web root hin, damit nginx das Zertifikat auch findet? Da stehe ich gerade auf dem Schlau.
Vielen Dank im Voraus!
Herzliche Grüße
Michael
Die Authentifizierung für letsencrypt läuft bei mit über DNS. Wenn Du wie ich ein Wildcard-Zertifikat benutzt, geht das nicht anders. Die Konfiguration ist unter DynDNS für eine eigene Domain einrichten erklärt.
Hallo,
sehr informativer Beitrag. Ist diese Lösung der Installation von nextcloud als Docker auch aktuell noch so möglich? Das heißt: OMV5 mit aktuellen Nginx?
Im Internet findet man viele Videos und Beiträge bezüglich traefik, nextcloud, letsencrypt und docker (alles zusammen als Installation).
Das ist jetzt schon fast 3 Jahre her und läuft inzwischen nicht mehr so bei mir. Von daher kann ich dir nicht mit letzter Sicherheit sagen, ob das noch genau so klappt. Aber das sind ja alles quasi Basistechnologien, und ich bin sicher, dass auch ein aktueller nginx noch als reverse Proxy arbeiten kann und MariaDB und Nextcloud auch als Docker-Images verfügbar sind. Nur die Installation von Docker hat sich meines Wissens in OMV5 gegenüber 4 etwas verändert, aber das wird ja bei OMV ausführlich beschrieben.