NEWS
ioBroker Admin per traefik nicht erreichbar
-
Hallo zusammen,
ich habe bei mir jetzt seit längerem ioBroker, InfluxDB und Grafana in Docker-Containern laufen.
Jetzt würde ich gerne ioBroker sowie Grafana hinter einem Reverse Proxy (konkret Traefik) betreiben, damit ich nicht jedes Mal die IP-Adresse und den Port eingeben muss. Außerdem hat mich hier etwas der Spieltrieb gepackt
Teilweise sieht es auch schon ganz gut aus. Grafana läuft schon mal.Allerdings habe ich jetzt das Problem, dass beim Zugriff auf ioBroker Admin (http://myDomain.de/iobroker) ein Redirect zu folgender Adresse erfolgt: http://myDomain.de/index.html?login&href=%2Fiobroker
Der entsprechende Ausschnitt im docker-compose.yml von ioBroker sieht so aus:labels: - "traefik.enable=true" - "traefik.http.routers.iobroker-admin.entrypoints=http" - "traefik.http.routers.iobroker-admin.rule=Host(`mydomain.de`) && PathPrefix(`/iobroker`)" - "traefik.http.routers.iobroker-admin.service=iobroker-admin" - "traefik.http.services.iobroker-admin.loadbalancer.server.port=8081" - "traefik.docker.network=proxy" `
In den Instanzeinstellungen des Admin-Adapters habe ich den Reverse Proxy auch eingetragen (siehe https://github.com/ioBroker/ioBroker.admin#reverse-proxy)
Globaler Pfad: /iobroker/
Instance: admin
Instance path behind proxy: /iobroker/Hat jemand schon ioBroker Admin zusammen mit Traefik am laufen und hat irgendeine Idee?
Vielen Dank vorab!
Gruß
Frank -
@frankb
Leider läuft es bei mir auch nicht,
aber ich denke ich bin ein Schritt weiter.
ioBroker macht intern normalerweise ein redirect auf eine https Verbindung, aus dem Grund muss dies auch in traefik so hinterlegt werden. Zudem ist das Zertifikat das ioBroker benutzt nicht zertifiziert, deshalb muss man traefik mitteilen, das es auch unsichere https Verbindungen zulassen soll.Ich bekomme einen Login-Screen, nach dem Login kommt ein ioBroker Ladescreen, weiter komme ich leider nicht. Ich vermute das der Header oder die Proxy-Einstellungen im admin Adapter noch angepasst werden müssen.
Wichtig ist in diesem Fall, dass "serversTransport" auf ein config file verweist. Diese Einstellung kann man aktuell nicht per docker-compose Label machen.
Und "scheme=https" weist traefik darauf hin, dass man eine sichere Verbindung zu ioBroker aufbaut.
Ohne "passhostheader=true" kommt kein Login-Screen sondern nur eine Ladescreen.
Wahrscheinlich muss der Hostname von ioBroker an die URL angepasst werden.
Meine Config sieht wie folgt aus:
docker-compose.yml... networks: traefik: ... labels: - "traefik.enable=true" - "traefik.http.routers.smarthomepi-iobroker-router.entryPoints=websecure" - "traefik.http.routers.smarthomepi-iobroker-router.rule=Host(`iobroker.foo.bar`)" - "traefik.http.routers.smarthomepi-iobroker-router.tls=true" - "traefik.http.routers.smarthomepi-iobroker-router.tls.certResolver=http" - "traefik.http.routers.smarthomepi-iobroker-router.tls.domains[0].main=iobroker.foo.bar" - "traefik.http.routers.smarthomepi-iobroker-router.service=smarthomepi-iobroker-service" - "traefik.http.services.smarthomepi-iobroker-service.loadBalancer.server.scheme=https" - "traefik.http.services.smarthomepi-iobroker-service.loadBalancer.passhostheader=true" - "traefik.http.services.smarthomepi-iobroker-service.loadBalancer.server.port=8081" - "traefik.http.services.smarthomepi-iobroker-service.loadBalancer.serversTransport=insecure-https-transport@file" - "traefik.docker.network=traefik" networks: traefik: external: true
insecure-https-transport.yml
http: serversTransports: insecure-https-transport: insecureSkipVerify: true
Quellen:
https://github.com/traefik/traefik/issues/7893
https://doc.traefik.io/traefik/routing/services/#insecureskipverify -
@smhrambo sagte in ioBroker Admin per traefik nicht erreichbar:
Ich bekomme einen Login-Screen, nach dem Login kommt ein ioBroker Ladescreen, weiter komme ich leider nicht.
Das spricht dafür, dass Traefik nicht (korrekt) für die Nutzung von Websocket-Verbindungen konfiguriert ist. Vielleicht lohnt es sich, an der Stelle mal zu recherchieren.
-
Nach ein paar Tests ist mir aufgefallen,
dass wenn ich den Container neu starte oder der Tab aus dem StandBy erwacht, ich auf das Admin-Panel weitergeleitet wurde.
Da Traefik WebSockets von sich aus verwaltet und diese keine extra Konfiguration benötigten,
bin ich zurück zu Path und Header gegangen und habe die Kommunikation analysiert.Das Problem war der Übergang der Headers, weshalb ein "X-Forwarded-Proto=https" nötig war.
Das zweite Problem ist aktuell noch die Verwendung eines Path statt einer Subdomain.
Für das AdminPanel habe ich es inzwischen zum laufen bekommen, für andere Instanzen noch nicht.
Leider bekomme ich dafür noch eine Fehlermeldung:Cannot GET /ioBrokerWeb/
Leider habe ich bisher nicht herausgefunden wer diese Fehlermeldung ausgibt.
Weder im Log von Traefik, noch im Log von ioBroker habe ich eine Meldung gefunden.Bei Domain+Path muss die Path Erweiterung bei der Übertragung auch wieder entfernt werden.
Dafür benutze ich "stripprefix.prefixes=/ioBrokerAdmin/", ansonsten kann ioBroker damit nichts anfangen.
Zudem benötigt ioBroker eine Wildcard für den Path hinter dem /, da hier z.B. "#tab-instances" zum Einsatz kommt.
Damit Traefik damit umgehen kann und eine PathPrefix alleine nicht ausreicht, habe ich hier auf ein regex zurückgegriffen.Beim rumprobieren und Wechseln zwischen Domain und Domain+Path ist es öfter dazu gekommen,
dass ich wieder einen endlosen Ladescreen hatte.
Wenn es unter Edge zu einem endlosen Ladebildschirm kommt,
muss man den Tab schließen und einen neuen aufmachen.
Bei Firefox hatte ich das Problem nicht.Hier die Konfiguration inklusive Path für eine Web Instanz, was aktuell noch nicht funktioniert:
docker-compose.yml
... networks: traefik: labels: - "traefik.docker.network=traefik" - "traefik.enable=true" - "traefik.http.middlewares.smarthomepi-iobroker-sslheader.headers.customRequestHeaders.X-Forwarded-Proto=https" - "traefik.http.routers.smarthomepi-iobroker-admin-router.entryPoints=websecure" - "traefik.http.routers.smarthomepi-iobroker-admin-router.rule=Host(`iobroker.mydomain.net`) || (Host(`iobroker.mydomain.net`) && PathPrefix(`/ioBrokerAdmin{regex:$$|/.*}`))" - "traefik.http.routers.smarthomepi-iobroker-admin-router.tls=true" - "traefik.http.routers.smarthomepi-iobroker-admin-router.tls.certResolver=http" - "traefik.http.routers.smarthomepi-iobroker-admin-router.tls.domains[0].main=iobroker.mydomain.net" - "traefik.http.routers.smarthomepi-iobroker-admin-router.middlewares=smarthomepi-iobroker-sslheader@docker, smarthomepi-iobroker-admin-pathstrip@docker" - "traefik.http.routers.smarthomepi-iobroker-admin-router.service=smarthomepi-iobroker-admin-service" - "traefik.http.middlewares.smarthomepi-iobroker-admin-pathstrip.stripprefix.prefixes=/ioBrokerAdmin/" - "traefik.http.services.smarthomepi-iobroker-admin-service.loadBalancer.server.scheme=https" - "traefik.http.services.smarthomepi-iobroker-admin-service.loadBalancer.server.port=8081" - "traefik.http.services.smarthomepi-iobroker-admin-service.loadBalancer.serversTransport=insecure-https-transport@file" # Dieser Teile funktioniert noch nicht - "traefik.http.routers.smarthomepi-iobroker-web-router.entryPoints=websecure" - "traefik.http.routers.smarthomepi-iobroker-web-router.rule=Host(`iobroker.mydomain.net`) && PathPrefix(`/ioBrokerWeb{regex:$$|/.*}`)" - "traefik.http.routers.smarthomepi-iobroker-web-router.tls=true" - "traefik.http.routers.smarthomepi-iobroker-web-router.tls.certResolver=http" - "traefik.http.routers.smarthomepi-iobroker-web-router.tls.domains[0].main=iobroker.mydomain.net" - "traefik.http.routers.smarthomepi-iobroker-web-router.middlewares=smarthomepi-iobroker-sslheader@docker, smarthomepi-iobroker-web-pathstrip@docker" - "traefik.http.routers.smarthomepi-iobroker-web-router.service=smarthomepi-iobroker-web-service" - "traefik.http.middlewares.smarthomepi-iobroker-web-pathstrip.stripprefix.prefixes=/ioBrokerWeb/" - "traefik.http.services.smarthomepi-iobroker-web-service.loadBalancer.server.scheme=https" - "traefik.http.services.smarthomepi-iobroker-web-service.loadBalancer.server.port=8082" - "traefik.http.services.smarthomepi-iobroker-web-service.loadBalancer.serversTransport=insecure-https-transport@file" networks: traefik: external: true
insecure-https-transport.yml
http: serversTransports: insecure-https-transport: insecureSkipVerify: true
Wenn man zwischen ioBroker und Traefik keine SSL Verbindung benutzen will,
muss man folgende Zeilen ändern:docker-compose.yml
... - "traefik.http.services.smarthomepi-iobroker-admin-service.loadBalancer.server.scheme=https" # Löschen oder in folgendes ändern: - "traefik.http.services.smarthomepi-iobroker-admin-service.loadBalancer.server.scheme=http" # Löschen - "traefik.http.services.smarthomepi-iobroker-web-service.loadBalancer.serversTransport=insecure-https-transport@file" ...
Ansonsten kann man auf alle Sachen zurückgreifen die Traefik anbietet.
Authelia für LDAP Login usw.Viel Spaß beim rumprobieren.
-
Hier eine neue funktionierende Konfiguration mit Domain+Path für andere Instanzen.
Jeder weitere Instanz die durch Domain+Path erreichbar sein soll,
muss mit einer höheren Priorität ausgestattet sein,
als der Eintrag der unter rule "Domain && Domain+Path" beinhaltet.
Ansonsten leitet Traefik alle Anfragen an diesen Eintrag weiter,
womit dann in diesem Fall das AdminPanel nichts anfangen kann.
Das AdminPanel besitzt zwar die Möglichkeit selber als Revers Proxy zu arbeiten, da die Anfragen nicht intern umgeleitet werden sondern an die Domain:Port,
kann dies nur funktionieren wenn die Ports für die Instanzen geöffnet sind und diese auch weitergeleitet werden(Docker u. Firewall).docker-compose.yml
... networks: traefik: labels: - "traefik.docker.network=traefik" - "traefik.enable=true" # customRequestHeaders - "traefik.http.middlewares.smarthomepi-iobroker-sslheader.headers.customRequestHeaders.X-Forwarded-Proto=https" # AdminPanel - "traefik.http.routers.smarthomepi-iobroker-admin-router.entryPoints=websecure" - "traefik.http.routers.smarthomepi-iobroker-admin-router.rule=Host(`iobroker.mydomain.net`) || (Host(`iobroker.mydomain.net`) && PathPrefix(`/ioBrokerAdmin{regex:$$|/.*}`))" - "traefik.http.routers.smarthomepi-iobroker-admin-router.priority=1" - "traefik.http.routers.smarthomepi-iobroker-admin-router.tls=true" - "traefik.http.routers.smarthomepi-iobroker-admin-router.tls.certResolver=http" - "traefik.http.routers.smarthomepi-iobroker-admin-router.tls.domains[0].main=iobroker.mydomain.net" - "traefik.http.routers.smarthomepi-iobroker-admin-router.middlewares=smarthomepi-iobroker-sslheader@docker, smarthomepi-iobroker-admin-pathstrip@docker" - "traefik.http.routers.smarthomepi-iobroker-admin-router.service=smarthomepi-iobroker-admin-service" - "traefik.http.middlewares.smarthomepi-iobroker-admin-pathstrip.stripprefix.prefixes=/ioBrokerAdmin/" - "traefik.http.services.smarthomepi-iobroker-admin-service.loadBalancer.server.scheme=https" - "traefik.http.services.smarthomepi-iobroker-admin-service.loadBalancer.server.port=8081" - "traefik.http.services.smarthomepi-iobroker-admin-service.loadBalancer.serversTransport=insecure-https-transport@file" # WebPanel - "traefik.http.routers.smarthomepi-iobroker-web-router.entryPoints=websecure" - "traefik.http.routers.smarthomepi-iobroker-web-router.rule=Host(`iobroker.mydomain.net`) && PathPrefix(`/ioBrokerWeb{regex:$$|/.*}`)" - "traefik.http.routers.smarthomepi-iobroker-web-router.priority=2" - "traefik.http.routers.smarthomepi-iobroker-web-router.tls=true" - "traefik.http.routers.smarthomepi-iobroker-web-router.tls.certResolver=http" - "traefik.http.routers.smarthomepi-iobroker-web-router.tls.domains[0].main=iobroker.mydomain.net" - "traefik.http.routers.smarthomepi-iobroker-web-router.middlewares=smarthomepi-iobroker-sslheader@docker, smarthomepi-iobroker-web-pathstrip@docker" - "traefik.http.routers.smarthomepi-iobroker-web-router.service=smarthomepi-iobroker-web-service" - "traefik.http.middlewares.smarthomepi-iobroker-web-pathstrip.stripprefix.prefixes=/ioBrokerWeb/" - "traefik.http.services.smarthomepi-iobroker-web-service.loadBalancer.server.scheme=https" - "traefik.http.services.smarthomepi-iobroker-web-service.loadBalancer.server.port=8082" - "traefik.http.services.smarthomepi-iobroker-web-service.loadBalancer.serversTransport=insecure-https-transport@file" networks: traefik: external: true
insecure-https-transport.yml
http: serversTransports: insecure-https-transport: insecureSkipVerify: true
Wenn man zwischen ioBroker und Traefik keine SSL Verbindung benutzen will(SSL in Admin/Web/... deaktivieren!!!),
muss man folgende Zeilen ändern:
docker-compose.yml... - "traefik.http.services.smarthomepi-iobroker-***-service.loadBalancer.server.scheme=https" # Löschen oder in folgendes ändern: - "traefik.http.services.smarthomepi-iobroker-***-service.loadBalancer.server.scheme=http" # Löschen - "traefik.http.services.smarthomepi-iobroker-***-service.loadBalancer.serversTransport=insecure-https-transport@file" ...