SEPIA-Framework / sepia-docs

Documentation and Wiki for SEPIA. Please post your questions and bug-reports here in the issues section! Thank you :-)
https://sepia-framework.github.io/
236 stars 16 forks source link

https per docker Nginx Proxy Manager #196

Closed cap-blackbeard closed 2 years ago

cap-blackbeard commented 2 years ago

Hallo Florian, ich habe mich da zu was Neuem inspirieren lassen. Hilfst Du mir bei meinen ersten Verstehversuchen?

Ich habe aktuell meine Installation nach Deinem "SSL for your Server -Tutorial mit Punkt 2b NGINX ... SSL certificate" eingerichtet und erreiche SEPIA auch von extern.

Ich vermute, mehrere nginx-Installationen in einem Netzwerk können Probleme verursachen? Ich habe schließlich zu meiner Server-IP nur einmal die Ports 80 & 443?

So wie ich das verstehe, muss ich also die Nginx-Installation im SEPIA-Container deinstallieren/ abschalten um den separaten NPM-Container zu benutzen?

Anschließend erstelle ich in NPM einen Proxy Host und leite diesen auf http://SEPIA-IP:20727. Ist das soweit richtig? Muss ich noch etwas bedenken? Habe ich was vergessen?

Ach so, muss ich dann überhaupt noch im Router die Ports 20726 und 20727 umleiten? Oder kann ich die Umleitungen löschen und der NPM übernimmt das dann?

Ich frage mich gerade, warum in Deinem Tutorial überhaupt beide Ports 20726 und 20727 umgeleitet werden? Nginx lauscht lt. Deinem Tutorial doch nur auf 20726??? Oder irre ich mich?

Grüße Christian

fquirin commented 2 years ago

Hi Christian,

Hilfst Du mir bei meinen ersten Verstehversuchen?

Mal gucken was ich machen kann ^^.

Ich vermute, mehrere nginx-Installationen in einem Netzwerk können Probleme verursachen?

Wenn diese auf verschiedenen Geräten sind und die Geräte alle unterschiedliche hostnames haben, dann ist das grundsätzlich erstmal kein Problem. Wenn du allerdings eine dieser Nginx Installationen von außen erreichen willst, dann kann dein Router nur auf eines der Geräte zeigen. Das ist die port-forward Einstellung für Port 443 in deinem Router (80 würde ich lieber zu machen für öffentliche Verbindungen).

So wie ich das verstehe, muss ich also die Nginx-Installation im SEPIA-Container deinstallieren/ abschalten um den separaten NPM-Container zu benutzen?

Nginx Proxy Manager kenne ich noch nicht, aber grundsätzlich musst du keinen Nginx abschalten sondern nur an einer zentralen Stelle die Verbindungen managen. Sagen wir mal du hast die Domain "my-sepia.example.org" und die zeigt auf deine vom Provider zugewiesene IP (ich manage das bei mir über Duck-DNS). Dann würde also "https://my-sepia.example.org/device1/sepia" z.B. in deinem Router auf Port 443 (default HTTPS) ankommen oder "https://my-sepia.example.org:9000/device1/sepia" z.B. auf Port 9000. 443 benutzen die Router oft selbst für ihre Konfigurationsseite, deswegen kann das unter Umständen Probleme geben. Deinem Router sagst du dann z.B. er soll Port 9000 weiterleiten (port forward) auf irgendein Gerät in deinem Netzwerk, sagen wir mal ein Raspberry Pi der nur einen Nginx installiert hat und sonst nichts. Im port forward kannst du theoretisch den Port auf dem Zielgerät auch ändern, aber sagen wir mal das Signal kommt jetzt auch auf Port 9000 im Nginx an, dann erstellst du dort eine Nginx config, die anhand des Pfades "/device1/sepia", "/device2/sepia" das Signal jeweils an deine anderen Geräte weiterleitet. Somit hast du dann eine einzige Domain für alle Geräte. Die Einträge wären z.B. so:

# port to listen to 
listen 9000 ssl http2;
listen [::]:9000 ssl http2;
# domain to listen to 
server_name my-sepia.example.org;

location /device1/sepia/ {
    proxy_pass http://192.168.0.10:20726/;
}
location /device2/sepia/ {
    proxy_pass http://192.168.0.11:20726/;
}

# ... SSL Krams ...

Das wäre jetzt die Einstellung für 2 SEPIA Server. Beim Login in der SEPIA App müsstest du dann jeweils den hostname https://my-sepia.example.org/device1/sepia oder https://my-sepia.example.org/device2/sepia angeben.

Ich frage mich gerade, warum in Deinem Tutorial überhaupt beide Ports 20726 und 20727 umgeleitet werden? Nginx lauscht lt. Deinem Tutorial doch nur auf 20726??? Oder irre ich mich?

Port 20726 ist der Standard und im Docker Container glaube ich auch der einzige Port. Bei der Konfiguration mit self-signed SSL läuft HTTPS auf 20726 und HTTP auf 20727 als fallback, damit man das Gerät aus dem eigenen Netzwerk zur Not (und zum Testen) ohne SSL erreichen kann. Bei der "SSL mit Lets Encrypt" Einstellung weiß ich gerade nicht mehr genau ob ich 20727 auch konfiguriert hatte.

Ich hoffe das hilft ein wenig? :-)

cap-blackbeard commented 2 years ago

aber grundsätzlich musst du keinen Nginx abschalten sondern nur an einer zentralen Stelle die Verbindungen managen.

Jo. Habe gemerkt, wenn ich im SEPIA-Container Nginx stoppe, dass SEPIA dann tot ist. Leuchtet mir auch tatsächlich ein ;-)

Vielleicht habe ich mich aber falsch ausgedrückt. Aktuell erreiche ich meine SEPIA-Installation durch Deine Konfiguration lt. Deinem Tutorial. Bedeutet, dass irgendwo im SEPIA-Container die .config liegt, die dem (SEPIA-)nginx sagt, dass ich per https darauf zugreifen kann? Wenn ich jetzt einfach den NPM aktiviere und konfiguriere, dann habe ich ja eigentlich 2x .config, die die SEPIA-Installation von außen erreichbar machen? 1x aus dem SEPIA-Container und 1x aus dem NPM-Container? Also muss ich nach meinem Verständnis den SEPIA-Container so konfigurieren, dass https nicht mehr funktioniert und SEPIA nur noch intern per http zu erreichen ist. Oder? Erst dann kann ich den NPM in betrieb nehmen?

Ich habe schon versucht, die ~/SEPIA/nginx/sites-available/sepia-fw-https-meineURL.duckdns.org.conf umzubenennen bzw. habe sie verschoben. Konnte trotz Neustart den SEPIA-Assistenten aber trotzdem noch von außen erreichen.

fquirin commented 2 years ago

Da die Diskussion letztens mal aufkam eine Zwischenfrage, benutzt du den Docker Container mit isoliertem Netzwerk (Standard) oder mit Host Netzwerk? Wenn du dir nicht sicher bist versuch mal ob du z.B. Port 80 oder 20721 erreichen kannst von Außen (ohne dass die im run command angegeben werden). Wenn du im Host Netzwerk bist trifft vieles aus dem Docker Tutorial nicht zu und alle Ports liegen offen (nicht zu empfehlen!).

Bedeutet, dass irgendwo im SEPIA-Container die .config liegt, die dem (SEPIA-)nginx sagt, dass ich per https darauf zugreifen kann?

Ja, wie du weiter unten auch schon bemerkt hast, das sind die .conf Dateien: ~/SEPIA/nginx/sites-available/sepia-fw-https-[...].conf. Da steht auch drin welcher Port offen ist.

Wenn ich jetzt einfach den NPM aktiviere und konfiguriere, dann habe ich ja eigentlich 2x .config, die die SEPIA-Installation von außen erreichbar machen? 1x aus dem SEPIA-Container und 1x aus dem NPM-Container?

Wenn dein Docker Container isoliert ist kann dir der interne Nginx eigentlich egal sein, du kannst dann einfach so tun als ob das ein Gerät mit einem Port ist, egal was den Port dahinter bedient. Wenn NPM auch die SSL Zertifikate managt würde ich allerdings SEPIA intern die Standard Konfiguration ohne SSL nutzen, also einfach Port 20726 ohne alles und beim run command dann auch nur -p 20726:20726 nutzen. Im NPM machst du dann nur eine einzige Weiterleitung auf Port 20726 und fertig.

Ich habe schon versucht, die ~/SEPIA/nginx/sites-available/sepia-fw-https-meineURL.duckdns.org.conf umzubenennen bzw. habe sie verschoben. Konnte trotz Neustart den SEPIA-Assistenten aber trotzdem noch von außen erreichen.

Gab es da sonst noch andere .conf Dateien? Nginx lädt alles aus dem Ordner was mit '.conf' aufhört. Meistens ist da noch eine "default" die Port 80 bedient, die kannst du auch löschen, wenn du willst. Wenn da sonst nichts mehr ist und du kannst den Server trotzdem erreichen kann ich mir das nur so vorstellen, dass der Container im Host Netzwerk läuft, dann sind immer alle Ports offen, die normalerweise durch den Nginx erst erreichbar werden und ggf. auch in Konflikt mit anderen Containern.

cap-blackbeard commented 2 years ago

benutzt du den Docker Container mit isoliertem Netzwerk (Standard) oder mit Host Netzwerk?

Der SEPIA-Container ist mit bridge-Netzwerk und Port 20726 konfiguriert. (20727 habe ich aktuell rausgenommen)

Gab es da sonst noch andere .conf Dateien?

Ja. Hab ja schon n paar Stunden probiert und gespielt ;-) Insgesamt 6 .conf-Dateien. Hab sie mal verschoben und nur noch diese übrig gelassen: sepia-fw-http.conf. So kann ich SEPIA nur noch aus dem lokalen Netzwerk erreichen.

Im NPM machst du dann nur eine einzige Weiterleitung auf Port 20726 und fertig.

Ja, wenn alles so einfach wäre. Hihi... Im NPM habe ich einen Proxy Host mit meiner xxx.duckdns.org Domain angelegt. Per http auf die Server-IP mit dem Port 20726 konfiguriert. Das SSL-Certificate von Let´s Encrypt ist eingetragen. Access steht auf Public und der Status ist Online. Wenn ich mit dem Handy von extern https://xxx.duckdns.org eingebe bekomme ich trotzdem nur "Welcome to nginx! ..." angezeigt. SEPIA lädt leider nicht. Ich habe auch schon versucht per "Custom locations" den Pfad /sepia/assist/app/index.html und Port 20276 hinzuzufügen. Ebenfalls ohne Erfolg.

Evtl. kann ich noch erklären, dass ich bereits erfolgreich per https auf eine ioBroker Vis-Seite zugreifen kann. Der NPM scheint also grundsätzlich ordentlich zu laufen.

Hast Du wieder die rettende Idee?

fquirin commented 2 years ago

Hi,

mal schauen was mir noch auffällt :sweat_smile: .

Der SEPIA-Container ist mit bridge-Netzwerk und Port 20726 konfiguriert

Das heißt die Ports 20721 etc. sind auch nicht zu erreichen oder? Das ist schon mal gut.

Hab sie mal verschoben und nur noch diese übrig gelassen: sepia-fw-http.conf

Das war die ursprüngliche Config aus dem Container richtig? Also unverändert ohne SSL und einfach Port 20726.

Im NPM habe ich einen Proxy Host mit meiner xxx.duckdns.org Domain angelegt. Per http auf die Server-IP mit dem Port 20726 konfiguriert. Das SSL-Certificate von Let´s Encrypt ist eingetragen. Access steht auf Public und der Status ist Online. Wenn ich mit dem Handy von extern https://xxx.duckdns.org eingebe bekomme ich trotzdem nur "Welcome to nginx! ..." angezeigt.

Nach meinem Verständnis ist das genau richtig, das ist die Startseite des Nginx ohne jegliche Pfadangabe. SEPIA müsste dann erreichbar sein unter https://xxx.duckdns.org/sepia/assist/ping zum Beispiel oder https://xxx.duckdns.org/sepia/assist/app/. In deinen Clients wäre der 'hostname' dann https://xxx.duckdns.org/sepia. Funktioniert das nicht?

cap-blackbeard commented 2 years ago

Das heißt die Ports 20721 etc. sind auch nicht zu erreichen oder?

Ich erreiche den Server nur per 20726.

https://xxx.duckdns.org/sepia/assist/app/

Da war mein Fehler. Ich hatte noch den Port in der Adresse mit angegeben. Ohne Port wird der Assistent geladen.

Nächstes Problem: Der Assistent ist "Offline"! Ich kann meinem User anmelden. Die WakeWord-Erkennung wird geladen. Es blitzt immer mal "Connecting" oben in der Leiste auf, baut aber keine Verbindung auf.

fquirin commented 2 years ago

Ohne Port wird der Assistent geladen.

:+1:

Ich kann meinem User anmelden. Die WakeWord-Erkennung wird geladen. Es blitzt immer mal "Connecting" oben in der Leiste auf, baut aber keine Verbindung auf.

Das riecht nach einem Problem mit den WebSockets, da der login (HTTP) ja scheinbar klappt. Nginx braucht dafür üblicherweise 2 Einträge in der config:

# SEPIA WebSockets
map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

und:

location /sepia/chat/messages/ {
  proxy_pass http://localhost:20723/messages/;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection $connection_upgrade;
  proxy_read_timeout 14400;
}

Ich hatte eigentlich gehofft, dass das nicht nötig ist weil der interne Nginx es übernimmt, aber vielleicht muss es der erste machen wegen SSL.

Die Frage ist wie man das jetzt anpassen muss :thinking: . Den oberen kann man wahrscheinlich einfach so übernehmen und aus dem unteren macht man vielleicht sowas:

location /sepia/chat/messages/ {
  proxy_pass http://[sepia-IP]:20726/sepia/chat/messages/;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection $connection_upgrade;
  proxy_read_timeout 14400;
}
cap-blackbeard commented 2 years ago

hmm... Ich habe zwar die .conf gefunden. Nachdem ich Deinen Vorschlag in der .conf ergänze und speichere connected sich der Client trotzdem nicht. Allerdings werden alle Änderungen wieder auf die Ursprungseinträge überschrieben, sobald ich den Proxy Host Eintrag "neu starte" (disable und wieder enable). Scheinbar kann ich auf diesem Weg keine Änderung der .conf vornehmen.

Meinst Du, das hier hilft weiter: https://nginxproxymanager.com/advanced-config/#custom-nginx-configurations?

fquirin commented 2 years ago

Meinst Du, das hier hilft weiter: https://nginxproxymanager.com/advanced-config/#custom-nginx-configurations?

Hmm, man müsste eigentlich in die individuellen Proxy Einstellungen, aber auf dem screenshot hier steht was von "WebSockets Support" :thinking: schon mal probiert?

[EDIT] Was ich nicht verstehe ist, kann man da keine individuellen Pfade etc. definieren?

cap-blackbeard commented 2 years ago

WebSockets Support

Nö. Hatte ich noch nicht probiert. Aber jetzt wo ich es probiert habe, hat es auch gleich funktioniert!!!

Ich erreiche SEPIA von extern über den NginxProxyManager!

cap-blackbeard commented 2 years ago

Kannst ja mal überlegen, ob Du die Variante per NginxProxyManager als Alternative in Dein Tutorial aufnehmen möchtest.

fquirin commented 2 years ago

Man könnte vielleicht irgendwo in der Dokumentation eine Sektion dazu erstellen. Das Programm sieht ja wirklich nützlich aus.