Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Off Topic
    4. reverse proxy mit mehreren iqontrol instanzen und auth

    NEWS

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    reverse proxy mit mehreren iqontrol instanzen und auth

    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      astrakid last edited by

      hi,
      ich habe eine anforderung, die mich gerade selbst überfordert.

      kurz: ich habe iqontrol im einsatz, remote über reverse proxy verfügbar gemacht und mit authentifizierung geschützt. nun brauche ich eine 2. iqontrol instanz für mein kind, damit er seine sachen schalten darf. aber er darf keinen zugriff auf meine iqontrol instanz bekommen.
      problem: die andere iqontrol-instanz wird nur mit einem parameter in der url ausgewählt.

      langform: über meinen reverse proxy komme ich von außen auf meine iqontrol instanz (und auch auf iobroker-admin, über separate subdomains). klappt wuderbar. ich melde mich per basic authentication am reverse proxy an und komme auf meine iqontrol-instanz, mit der anderen subdomain auf meinen iobroker-admin.

      warum authentifizierung am nginx? hier habe ich die möglichkeit, mehrere benutzer zu hinterlegen und pro subdomain unterschiedliche authentifizierungen hinterlegen kann. nachteil: gehe ich direkt auf die iobroker instanz -> keine authentifizierung. daher ist zumindest die admin-instanz noch zusätzlich gesichert.

      iqontrol läuft aber über eine web-instanz.
      muss ich jetzt für jede iqontrol-instanz eine separate web-instanz installieren? ist das nicht ressourcenverschwendung?

      am saubersten wäre natürlich, wenn man den zugriff auf eine instanz über benutzer in iobroker verwalten könnte. das scheint es aber nicht zu geben.

      hat jemand eine idee, wie man das umsetzen kann?
      oder hat einer interesse, mit mir einen sauberen plan zu schmieden, wie man das vernünftig umsetzen kann? ich bräuchte später noch weitere iqontrol instanzen, jeweils für unterschiedliche anwender in der familie...

      gruß,
      andre

      BananaJoe 1 Reply Last reply Reply Quote 0
      • BananaJoe
        BananaJoe Most Active @astrakid last edited by BananaJoe

        @astrakid sagte in reverse proxy mit mehreren iqontrol instanzen und auth:

        ist das nicht ressourcenverschwendung?

        naja, ich habe sowieso immer 2 Instanzen am laufen. Ob nun eine Instanz 2 Clients bedient oder 2 Instanzen 2 Clients ist vermutlich von der CPU her gleich.

        Meine viel genutzte Hauptinstanz verbraucht ca 290MByte, die Neben-Instanz etwa 130MByte.
        Verschwendung wäre es nur wenn es für nichts genutzt wird ...
        Ob das viel ist hängt davon wieviel dein System hat ...
        Wenn in deinem System eh noch ein paar Gigabyte RAM frei sind - was soll es, hast du vorher eh nicht genutzt.

        A 1 Reply Last reply Reply Quote 0
        • A
          astrakid @BananaJoe last edited by

          @bananajoe ram wäre das, wovon ich am meisten zur verfügung habe. 😉 also wäre das der einzige weg? eigene web- und iqontrol-instanz und über den rev-proxy entsprechend auf die instanz verteilen?
          ok, werde ich mal testen.

          BananaJoe OliverIO 2 Replies Last reply Reply Quote 0
          • BananaJoe
            BananaJoe Most Active @astrakid last edited by BananaJoe

            @astrakid sagte in reverse proxy mit mehreren iqontrol instanzen und auth:

            also wäre das der einzige weg? eigene web- und iqontrol-instanz und über den rev-proxy entsprechend auf die instanz verteilen?

            keine Ahnung, bestimmt nicht.
            Ich mache persönlich auch ganz viel mit Reverse Proxy - aber mit Apache (in HAproxy arbeite ich mich gerade ein). Dein Problem ist ja aber das du Änderungen an der URL verhindern willst.

            Wobei das auch vermutlich per URL-Rewrite ginge - also wenn einer .../view2/... eintippt der daraus automatisch wieder .../view1... macht. Nur in cooler bitte, also immer umschreiben wenn es nicht .../view1/... ist.

            Oder du wertest aus welches Clientgerät sich mit der View verbindet und reagierst entsprechend auf ioBroker-Seite. Wobei diese Auswertung am einfachsten über mehrere Web-Instanzen geht ...

            1 Reply Last reply Reply Quote 0
            • OliverIO
              OliverIO @astrakid last edited by OliverIO

              @astrakid
              Ich bin in iqcontrol nun nicht so ganz firm
              Wenn ich richtig verstanden hab ist die berechtigungsunterscheidung über ein Parameter in der url gesetzt?
              Durch ein url rewrite kannst du ja alles so ummodeln wie du willst um dann den Request zum backend abzusetzen
              https://www.nginx.com/blog/creating-nginx-rewrite-rules/

              A 1 Reply Last reply Reply Quote 0
              • A
                astrakid @OliverIO last edited by

                @oliverio ja korrket. es ist noch nicht mal eine berechtigungsunterscheidung, sondern nur der einsprungspunkt auf die andere instanz. berechtigung würde ich übe rden reverse proxy machen können.
                über die web-instanzen klappt das ganze gar nicht, da ich die iqontrol-instanz nicht an die web-instanz binden kann. ich habe nur im admin-modul die option, für den reverse proxy einträge anzulegen und an die web-instanz zu binden. ist das der richtige weg?

                A 1 Reply Last reply Reply Quote 0
                • A
                  astrakid @astrakid last edited by

                  ich hab es nu mal per rewrite funktioniet, kriege es aber nicht hin, weil:
                  iqontrol wird nur über /iqontrol/ aufgerufen, danach wird automatisch immer die erste instanz geöffnet.
                  rufe ich die zweite instanz über den namespace auf /iqontrol/index.html?namespace=iqontrol.2 klappt es.
                  aber ich kann nicht sicherstellen, dass namespace=iqontrol.2 verwendet wird.

                  hab es banal folgendermaßen versucht zu lösen:

                  location / {
                      if ($request_uri !~* /(namespace=iqontrol.2)) {
                              return 302 https://my.domain.de/iqontrol/index.html?namespace=iqontrol.2;
                      }
                  

                  landet aber in einer endlosschleife.
                  jetzt habe ich festgestellt, das iqontrol bzw der webadapter erst auf /login/ umleitet. aber selbst das landet in einer endlosschleife. hab auch einen block für /login/ erstellt, damit der nicht umgeleitet wird, will abr nicht.

                  meine nginx-config:

                  server {
                      listen              443 ssl http2; # 'ssl' parameter tells NGINX to decrypt the traffic
                      server_name         my.domain.de;
                      access_log /var/log/nginx/iod-access.log ;
                      error_log  /var/log/nginx/iod-error.log notice;
                      proxy_ssl_verify off;
                      proxy_ssl_server_name on;
                      proxy_set_header Host $http_host;
                      proxy_set_header X_FORWARDED_PROTO https;
                      proxy_http_version 1.1;
                      proxy_set_header Upgrade $http_upgrade;
                      proxy_set_header Connection "upgrade";
                      proxy_read_timeout 86400;
                  
                      location /login/ {
                          proxy_pass https://10.1.1.2:8082/;
                      }
                  
                      location / {
                          rewrite_log on;
                          proxy_pass https://10.1.1.2:8082/;
                  }
                  

                  das log sagt:

                  87.15.1.4 - user [13/Apr/2024:17:42:23 +0200] "GET / HTTP/2.0" 302 116 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
                  87.15.1.4 - user [13/Apr/2024:17:42:23 +0200] "GET /login/index.html?href=%2F&error HTTP/2.0" 302 116 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
                  87.15.1.4 - user [13/Apr/2024:17:42:23 +0200] "GET /login/index.html?href=%2F&error HTTP/2.0" 302 116 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
                  87.15.1.4 - user [13/Apr/2024:17:42:23 +0200] "GET /login/index.html?href=%2F&error HTTP/2.0" 302 116 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
                  87.15.1.4 - user [13/Apr/2024:17:42:23 +0200] "GET /login/index.html?href=%2F&error HTTP/2.0" 302 116 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
                  [...]
                  

                  wo ist mein denkfehler?

                  OliverIO 1 Reply Last reply Reply Quote 0
                  • OliverIO
                    OliverIO @astrakid last edited by

                    @astrakid

                    dann schau dir mal im browser mit den developer tools an, was da zurückgegeben wird. irgendein fehler wird da ja dann weitergeschleift.

                    denke dran. der reverseproxy behandelt alle requests. also auch die zu css, js, bilder, etc-dateien

                    A 1 Reply Last reply Reply Quote 0
                    • A
                      astrakid @OliverIO last edited by

                      @oliverio habs jetzt so halbwegs hibekommen. danke für die denkanstöße.
                      das größte problem war, dass man nicht stumpf auf die iqontrol instanz gehen darf, sondern andere ordner durchreichen muss (/ib, /socket.io (?), /...).

                      dann funktioniert es so halbwegs.

                      hier mal meine config:

                      server-block:

                      server {
                          listen              443 ssl http2; # 'ssl' parameter tells NGINX to decrypt the traffic
                          server_name         my.iqo1.de;
                          access_log /var/log/nginx/iol-access.log ;
                          error_log  /var/log/nginx/iol-error.log notice;
                          rewrite_log on;
                          proxy_ssl_verify off;
                          proxy_ssl_server_name on;
                          proxy_set_header X_FORWARDED_PROTO https;
                          proxy_http_version 1.1;
                          proxy_set_header Upgrade $http_upgrade;
                          proxy_set_header Connection $connection_upgrade;
                          proxy_read_timeout 86400;
                      
                      

                      locations:

                          location /login$request_uri {
                              proxy_pass https://10.1.1.1:8082/login$request_uri;
                              proxy_ssl_verify off;
                          }
                      
                          location /iqontrol/index.html {
                              proxy_set_header Host $host;
                              proxy_pass https://10.1.1.1:8082$request_uri;
                              if ($request_uri !~* "index.html.*namespace=iqontrol.1") {
                                      rewrite .* https://my.iqo1.de/iqontrol/index.html?namespace=iqontrol.1;
                              }
                          }
                      
                          location /iqontrol/ {
                              proxy_set_header Host $host;
                              proxy_pass https://10.1.1.1:8082$request_uri;
                          }
                      
                      
                          location /iqontrol/jquery/ {
                              proxy_pass https://10.1.1.1:8082/iqontrol/jquery/;
                          }
                      
                          location / {
                              proxy_pass https://10.1.1.1:8082/;
                      }
                      
                          location /lib {
                              proxy_pass https://10.1.1.1:8082/lib/;
                          }
                      
                          location /socket.io/ {
                              proxy_pass https://10.1.1.1:8082$request_uri;
                          }
                      

                      zugegeben weiß ich nicht, ob ich wirklich alles brauche (socket.io und lib müsste theoretisch über / ausgeliefert werden), aber so tut es zu 90%.
                      was nicht geht, und das vestehe ich nicht:
                      rufe ich die url mit /iqontrol auf, dann läuft das rewriting nicht. wenn ihc das rewrite aber in einen /iqontrol-block packe, funktioniert es nicht mehr. dann kriege ich zwar eine seite, aber sämtliche grafiken und funktionen fehlen...
                      egal. teilziel erreicht. optimierung erfolgt demnächst.

                      1 Reply Last reply Reply Quote 0
                      • First post
                        Last post

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      952
                      Online

                      31.6k
                      Users

                      79.5k
                      Topics

                      1.3m
                      Posts

                      3
                      9
                      323
                      Loading More Posts
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes
                      Reply
                      • Reply as topic
                      Log in to reply
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                      The ioBroker Community 2014-2023
                      logo