Zugriff auf Docker mittels reverse proxy von aussen

Status
Für weitere Antworten geschlossen.

mdawid

Benutzer
Mitglied seit
07. Jan 2014
Beiträge
61
Punkte für Reaktionen
3
Punkte
8
Hallo Zusammen,

ich versuche zur Zeit ein Docker-Image (Nextcloud) über einen Reverse Proxy über das Internet zugreifbar zu machen. Ich habe bereits diesen Thread http://www.synology-forum.de/showthread.html?73345-DSM-6-Reverse-Proxy gelesen und versucht mir eine Konfiguration für ngingx zu erstellen.

Da ich dabei zwischenzeitlich den Zugriff auf die DSM Oberfläche zerschossen hatte und diesen nur über mehrere Neustarts wiederherstellen konnte, dachte ich, ich schreibe mal einen eigenen Thread.

Ich möchte gerne folgendes erreichen: Zugriff auf den Docker-Container von extern über meinedomaine.de/nextcloud. Der Docker-Container (wonderfall/nextcloud) läuft auf Port 8888. Über die in DSM eingebaute Reverse-Proxy funktion kann ich z.B. über eingen spezifischen Port (z.B. 7777) den Zugriff ermöglichen (meinedomaine.de:7777).

Ich denke die schwierigkeit dabei besteht, dass ich nebenbei auch eine "native" ownCloud Instanz laufen lasse die über meinedomaine.de/owncloud erreichbar ist (und auch weiterhin erreichbar bleiben soll). Die "native" ownCloud läuft über den in die Webstation integrierten Webserver Apache2.

Hier meine erste Frage an die Experten: Kann ich die ownCloud über die Webstation mit Apache2 laufen lassen und parallel dazu den Reverse-Proxy über nginx? Oder muss ich erst die ownCloud auf nginx migrieren? Wenn ich einfach so umschalte, dann bekomme ich im Sync-Client auf Windows die Fehlermeldung server replied: Not Allowed. Scheinbar muss man da mehr als nur "umschalten".

Für meinen Reverse-Proxy habe ich mir aus dem o.g. Thread folgende nginx-Konfiguration gebastelt:

Rich (BBCode):
# -------------------------------------------------------------------------------------------------
# Nextcloud
# -------------------------------------------------------------------------------------------------
server {
listen 443 ssl http2;
server_name meinedomaine.de;

add_header Strict-Transport-Security "max-age=31536000"; # Use with caution
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

location /nextcloud {
        proxy_set_header        Host                $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          off;

        proxy_pass http://DOCKER-IP:8888;
        }
}

Diese hatte ich per SSH nach /usr/local/etc/nginx/sites-enabled/ kopiert und mit nginx -s reload neu geladen. Danach war mein DSM nicht mehr verfügbar.

Gibt es nicht eine generelle lösung wie ich ein HTTP-Frontend in einem Docker-Container auf HTTPS (mit den Zertifikaten aus dem DSM) nach außen schleifen kann?

Danke,

Grüße,

mdawid
 

fabe

Benutzer
Mitglied seit
17. Mai 2015
Beiträge
2
Punkte für Reaktionen
0
Punkte
0
Moin, hast Du mittlerweile schon eine Lösung gefunden? Oder jemand anders? Ich stehe vor exakt demselben Problem.

Beste Grüße
 

BuchM41

Benutzer
Mitglied seit
22. Aug 2016
Beiträge
17
Punkte für Reaktionen
0
Punkte
1
Hallo,

bei mir hat das folgendermaßen funktioniert:

1. einfach einen Eintrag für den Reverse Proxy anlegen
2. Quelle ist der Name meiner Domain, mit der ich die Nextcloud von außen ansprechen möchte (Bsp. "subdomain.meinedomain.de") und der gewünschte Port (Bei mir 443)
3. Ziel ist der Name meiner Diskstation und als Port nehme ich den Port, der von Docker bereitgestellt und nach Port 443 umgeleitet wird. Finden kann man den unter der Detailansicht des gestarteten Docker-Containers von Nextcloud unter "Überblick - Porteinstellungen". Lokaler Port ist der Port, der nach außen hin sichtbar ist.
4. Protokoll ist bei beiden, Quelle und Ziel, https
5. Damit das Ganze per https erreichbar ist, habe ich für meine Adresse (subdomain.meinedomain.de) noch ein neues Lets Encrypt-Zertifikat erstellt und aktiviert

Jetzt lässt sich Nextcloud von außen einfach über https://subdomain.meinedomain.de/nextcloud aufrufen.
Nextcloud läuft dann unabhängig vom Synology-eigenen Webserver.

Ich hoffe das hilft Dir weiter.
 

mdawid

Benutzer
Mitglied seit
07. Jan 2014
Beiträge
61
Punkte für Reaktionen
3
Punkte
8
Hi,

ich habe die Lösung von BuchM41 ausprobiert und ja sie funktioniert! Danke schonmal dafür. Allerdings hatte ich gehofft, dass ich mehrere Docker parallel zu einander ausführen kann. Mit der Lösung geht nur einer :-(. Aber immerhin schonmal etwas. Ich denke mit subdomains könnte ich da wahrscheinlich mehr erreichen, allerdings unterstützt mein Hosting Tarif noch keine. Außerdem bräuchte ich ja dann noch Wildcard-Zertifikate, es sei denn Let's Encrypt kann das?

Dank und Grüße
 

rednag

Benutzer
Mitglied seit
08. Nov 2013
Beiträge
3.954
Punkte für Reaktionen
11
Punkte
104
LE kann m. W. keine Wildcard, aber Du kannst Dir ja für sub.domain.de ein Zert. austellen lassen.
 

BuchM41

Benutzer
Mitglied seit
22. Aug 2016
Beiträge
17
Punkte für Reaktionen
0
Punkte
1
Also pro Subdomain ein Lets Encrypt Zertifkat erstellen ist überhaupt kein Problem
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.137
Punkte für Reaktionen
898
Punkte
424
Du kannst auch ein LE Zertifikat mit Alternativen Namen ausstatten. Dann gilt das Zertifikat für alle angegebenen Namen. Sie müssen nur auch während der Beantragung des Zertifikats auch alle erreichbar sein.
 

mdawid

Benutzer
Mitglied seit
07. Jan 2014
Beiträge
61
Punkte für Reaktionen
3
Punkte
8
Also pro Subdomain ein Lets Encrypt Zertifkat erstellen ist überhaupt kein Problem

Das führt mich zu meinem nächsten Problem:

Ich kann scheinbar kein vom Standard-Zertifikat abweichendes Zertifkat für eine Web-Applikation einstellen. Im DSM gibt es eine Möglichkeit dafür, aber es funktioniert bei mir nicht.

Siehe auch die Lang-Version:

http://www.synology-forum.de/showthread.html?80192-Frage-zu-Webstation-und-Zertifikaten


Ich fasse zusammen: Ich kann über Docker N belibige Web-Applikationen heraufbeschwören, diese dann über Reverse-Proxy an jeweils eine Sub-Domain binden und über LE-Zertifikate (mit eingebundenen Sub-Domains) per SSL/TLS ins Internet stellen.

Jetzt muss ich mir nur noch überlegen, ob es mir das Wert ist meinen Hosting-Tarif dafür hochzustufen (das wär schon der zweite :( )
 

rednag

Benutzer
Mitglied seit
08. Nov 2013
Beiträge
3.954
Punkte für Reaktionen
11
Punkte
104
Ich habe mich jetzt auch mal da rangewagt. Habe o. g. Image runtergeladen und dann gestartet Wie gehts weiter :p ?
 

dsrw445

Benutzer
Mitglied seit
19. Nov 2016
Beiträge
1
Punkte für Reaktionen
0
Punkte
0
Hallo zusammen,

auch ich bin gerade dabei, mir eine Nextcloud aus dem Docker-Image von wonderfall (https://hub.docker.com/r/wonderfall/nextcloud) auf meiner DS aufzusetzen.
Ich bin so weit, dass der Container läuft und ich die Nextcloud direkt über http://ds.meinedomain.xy:8888 erreichen kann.

Im nächsten Schritt bin ich nach der Anleitung von BuchM41 vorgegangen, um den DSM eigenen Reverse Proxy vorzuschalten. Daran scheitere ich gerade.
Die Reverse Proxy-Regel ist so konfiguriert:

Quelle
Protokoll: HTTPS
Hostname: nextcloud.ds.meinedomain.xy
Port: 443

Ziel
Protokoll: HTTP
Hostname: localhost
Port: 8888

Der Aufruf von https://nextcloud.ds.meinedomain.xy führt dennoch nicht ans Ziel. Mein Browser sagt mir: GET https://nextcloud.ds.meinedomain.xy net::ERR_NAME_NOT_RESOLVED

Klingt irgendwie nach einem DNS-Problem?
Zusatzinfo: Die Domain meinedomain.xy ist im DHCP-Server meines LANs konfiguriert (DD-Wrt auf WRT54G).

Sieht jemand den Fehler?

Danke und schöne Grüße
dsrw445
 

rednag

Benutzer
Mitglied seit
08. Nov 2013
Beiträge
3.954
Punkte für Reaktionen
11
Punkte
104
Ich bin so weit, dass der Container läuft und ich die Nextcloud direkt über http://ds.meinedomain.xy:8888 erreichen kann.

Ich kann Dir leider nicht bei Deinem Problem helfen, aber mich würde interessierenwie Du soweit gekommen bist.
Docker ist für mich ein Buch mit sieben Siegeln und ich finde den Einstieg nicht.
Unter Abbild habe ich nextcloud/wonderfall stehen. Wenn ich das starte, wie geht es weiter?
 

BuchM41

Benutzer
Mitglied seit
22. Aug 2016
Beiträge
17
Punkte für Reaktionen
0
Punkte
1
Über DynDNS wird meinedomain.net auf meine FritzBox weitergeleitet. Die FritzBox sorgt auch dafür, regelmaßig die IP-Adresse bei meinedomain.net zu aktualisieren.
An meiner FritzBox habe ich dann zwei Portweiterleitungen aktiviert. Port 80 und Port 443 werden intern auf Port 80 und Port 443 meiner Synology weitergeleitet.

In der Konfiguration des ReverseProxy ist als Quelle jetzt HTTPS nextcloud.meinedomain.net und der Port 443 eingetragen und als Ziel der Name meiner Diskstation, so wie ich sie lokal im Netz anspreche und der Port des Docker-Containers.

Ich glaube Dein Fehler liegt darin "localhost" als Ziel anzugeben. Dann wird die Anfrage an den Synology-Webserver und nicht an den Docker-Container weitergeleitet.
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.137
Punkte für Reaktionen
898
Punkte
424
Blos weil du irgendwo meindomain.xy eingetragen hast gibt es ja nicht automtisch für alle Hosts/Subdomains einen IP Eintrag.
Es muss schon explizit irgendwo im DNS die nextcloud.ds.meinedomain.xy auf die IP der DS zeigen.
 

rednag

Benutzer
Mitglied seit
08. Nov 2013
Beiträge
3.954
Punkte für Reaktionen
11
Punkte
104
Mein Problem wird kommentarlos übergangen :(
Ok, ich bin aber einen kleinen Schritt weiter. Ich konnte Nextcloud mit der internen IP und Port 8888 ansprechen.
Leider wird da die Trusted-Domain bemängelt. Wo wird der Ordner "config" für den Docker angelegt, damit ich das ändern kann?
 

BuchM41

Benutzer
Mitglied seit
22. Aug 2016
Beiträge
17
Punkte für Reaktionen
0
Punkte
1
Stimmt, hab ich ganz vergessen, ich hab bei meiner Subdomain noch den Eintrag für CNAME angepasst: also bei nextcloud.meinedomain.net steht im Eintrag für CNAME "meinedomain.net."
 

BuchM41

Benutzer
Mitglied seit
22. Aug 2016
Beiträge
17
Punkte für Reaktionen
0
Punkte
1
Der Ordner config ist per Default erst mal in dem Container, genauso wie Deine anderen Daten. D.h. wenn Du eine neue Version von Nextcloud herunterlädst (ein neues Image) und daraus einen neuen Container erstellst, sind Deine Daten noch in dem alten Container. Daher sollte man solche Daten aus dem Container über Volumes "herausziehen".

Für das Docker-Image von wonderfall sind folgende Volumes innerhalb des Container angegeben:

/data : Nextcloud data.
/config : config.php location.
/apps2 : Nextcloud downloaded apps.
/var/lib/redis : Redis dumpfile location.

Die müssen also auf ein Verzeichnis Deines NAS umgebogen werden. Legst Du über die FileStation einen Ordner an z.B. /docker/meinenextcloud/data
Danach öffnest Du den deaktivierten Nextcloud-Container zur Bearbeitung und wechselst auf die Karteikarte "Volume". Dort einen Ordner hinzufügen und den eben angelegten Ordner auswählen. Als Mount-Point nimmst Du dann das entsprechende Volume, das auf der Beschreibung des Docker-Images angegeben wurde, also hier /data
Das machst Du auch für die Ordner /config, /apps2 und /var/lib/redis.

Wenn Du dann Nextcloud startest, werden die Daten nicht mehr im Container gespeichert, sondern in den entsprechenden Ordnern auf Deinem NAS.

War das zu verwirrend? Ich hoffe, es hilft Dir weiter.
 

rednag

Benutzer
Mitglied seit
08. Nov 2013
Beiträge
3.954
Punkte für Reaktionen
11
Punkte
104

BuchM41

Benutzer
Mitglied seit
22. Aug 2016
Beiträge
17
Punkte für Reaktionen
0
Punkte
1
Ok, ich versuch es nochmal, auch auf die Gefahr hin, dass es etwas zu ausführlichwird.
Was Du von Docker herunterlädst, ist ein Image oder Abbild in der deutschen Übersetzung der Diskstation. Dieses Image enthält Nextcloud in einer bestimmten Version. Welche Version das ist, bestimmst Du beim Herunterladen:

Anhang anzeigen 33954

Welche Versionen (unter Git auch Tags) es zu einem Image gibt, kann man auch auf der Seite bei Docker-Hub sehen (teilweise werden auf Docker-Hub mehr oder aktuellere Versionen angezeigt, wie im Docker-Modul der Diskstation)

Anhang anzeigen 33955

Das Image selbst ist nicht das, was Du startest. Wenn Du Dir das Image heruntergeladen hast, kannst Du daraus beliebig viele Container erstellen, die alle parallel laufen können. Du könntest also mehrere Nextcloud Instanzen auf einmal starten.

Wenn Du jetzt einen Nextcloud-Container gestartet hast, werden alle Daten per Default erst mal in diesem Container gespeichert. Wenn Du den Container löschst, sind auch Deine Daten weg.

Wenn jetzt ein neue Nextcloud-Version herauskommt, brauchst Du Deine bestehende Nextcloud-Version nicht zu aktualisieren, sondern Du lädst Dir einfach ein Image mit der neuen Version herunter und startest mit diesem Image einen weiteren Container. Dann hast Du zwei Container: einen mit der alten Nextcloud-Version und einen mit der neuen Nextcloud-Version, aber Du kannst die Daten zwischen diesen beiden Containern nicht so einfach austauschen. Dafür ist es sinnvoll, Programm und Daten voneinander zu trennen. Unter Docker läuft das unter dem Stichtwort "Volumes". Du verknüpfst quasi ein Verzeichnis des Docker-Containers mit einem Verzeichnis Deiner Diskstation (also außerhalb des Docker-Containers).

Dazu legst Du erst mal mit der Filestation ein Verzeichnis an, z.B. so:

filestation.png

Die Infoseite auf dem Docker-Hub von Nextcloud sagt Dir, welche Volumes sinnvoll wären:

/data : Nextcloud data.
/config : config.php location.
/apps2 : Nextcloud downloaded apps.
/var/lib/redis : Redis dumpfile location.

D.h. Du legst z.B. folgende Verzeichnisstruktur auf Deinem NAS an:
/docker/meindockerverzeichnis/nextcloud/data/
/docker/meindockerverzeichnis/nextcloud/config
/docker/meindockerverzeichnis/nextcloud/apps2
/docker/meindockerverzeichnis/nextcloud/redis

Abschließend musst Du nur noch diese Volumes aus Deinem Docker-Container mit Deinen Ordnern auf dem NAS verknüpfen.

Das kannst Du machen, in dem Du Deinen Container bearbeitest. Dafür muss der Container deaktiviert sein:

containerbearbeiten.jpg

In dem folgenden Dialog gehst Du auf die Karteikarte "Volumens" und fügst ein Ordner hinzu:

volumehinzufuegen.png

Danach gibst Du unter "Mount-Pfad" an, was aus dem Docker-Container in diesem Ordner gespeichert werden soll. In diesem Fall also alles, was Nextcloud im Container unter dem Ordner "/data" speichern würde. Die Daten werden dann aber nicht mehr im Container gespeichert, sondern außerhalb.

So kannst gehst Du auch mit dem Ordner "/config" etc. vor.

Was ist der Vorteil davon? Du hast Deine Daten unabhängig von Deiner Version. Wenn Du jetzt z.B. eine neue Version von Nextcloud testen willst, duplizierst Du einfach den nextcloud-Ordner, der in Deinem Filesystem liegt und benutzt diesen für die neue Version. So kannst Du in Ruhe Deine alte Nextcloud-Version weiter betreiben und in der Zwischenzeit die neue Version mit Deinen Daten testen.

Ich hoffe das ist jetzt etwas klarer geworden. Wenn nicht, frag gerne nach :)
 

rednag

Benutzer
Mitglied seit
08. Nov 2013
Beiträge
3.954
Punkte für Reaktionen
11
Punkte
104
Danke, daß ich nachfragen darf. :eek: Danke auch für die gute Erklärung. Ich denke es hat ein Stück des Wegese erleuchtet :)
Was mir nicht ganz klar ist, ist wie eine Aktualisierung von staten gehen soll. Ok, das kann man aber auch erst machen wenn es den eine neue Version gibt.
Ich habe mir jetzt die Struktur auf der Syno angelegt. Wenn ich ehrlich sein darf, weiß ich aber immer noch nicht genau was und warum ich das so getan habe.
Ich dachte ein Abbild ist soweit startfertig. Also ist in dem Abbild erst der Container enthalten? wenn ich z. B. zwei mal nextcloud haben will, muß ich nicht zweimal das selbe Image runterladen und neue Strukturen für die o. g. Ordner erstellen? Weil das Abbild und damit der Container ist ja schon da. Soweit richtig?
Man sehe es mir nach, es ist das erste mal daß ich mit sowas in Berührung komme :eek:

So sieht es jetzt bei mir aus:

nc1.PNG

nc2.PNG

Ich kann den Container auch starten, aber wie gehts weiter?
Über die IP vom NAS und Port 8888 wie gestern auch funktioniert nicht mehr. :(

Ok, über die IP von NAS und Port 32770 komme ich drauf. Nur immer noch die Fehlermledung wegen Trusted Domain.
Der Vorteil von so einer Nextcloud-Instanz gegenüber einer in /web installiert leuchtet mir auch noch nicht so ein....

nc3.PNG
 
Zuletzt bearbeitet:

mdawid

Benutzer
Mitglied seit
07. Jan 2014
Beiträge
61
Punkte für Reaktionen
3
Punkte
8
hallo rednag,

Ich dachte ein Abbild ist soweit startfertig. Also ist in dem Abbild erst der Container enthalten? wenn ich z. B. zwei mal nextcloud haben will, muß ich nicht zweimal das selbe Image runterladen und neue Strukturen für die o. g. Ordner erstellen?

Ja, genau das habe ich auch gemacht. Mein Hintergrund ist dabei, dass ich mehrere Versionen von Nextcloud haben kann, die ich bei bedarf "einschalten" kann - ohne das diese ständig im Hintergrund laufen und theroretisch ressourcen verbrauchen. Das ist zum Beispiel für Entwicklungszwecke sehr praktisch :cool:.
Das dürfte wohl auch deine zweite Frage ein wenig beantworten. Es zeigt zumindest einen use case der sich mit Docker leicher realisieren lässt.

Bezüglich deines trusted domain problems, musst du deine config.php aufmachen und deine domaine in das entsprechende array eintragen.
Zum Beispiel könnte der entsprechende Eintrag so aussehen:
Rich (BBCode):
'trusted_domains' =>
  array (
    0 => '<IP-Adresse der NAS>',
    1 => 'meinedomaine.de'
  ),

in dem Array war 0 bereits eingetragen und ich habe unter 1 noch meine domaine hinzugefügt über die ich auf nextcloud zugreifen möchte. Die config.php findest du in dem von dir gelinkten ordner ( BuchM41 gab als Beispiel /docker/meindockerverzeichnis/nextcloud/config an). Die Datei musst du ggf. mit höheren rechten editieren. Ich mache das immer per SSH und VIM.

Grüße,
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat