Backend (in Docker) zeigt Port 8082 für UI nicht.

Hallo zusammen,

Zuerst einmal vielen Dank für dieses sehr coole Projekt! Ich finde es fantastisch, was hier alles schon aufgebaut wurde. Ich selbst kann davon leider noch nicht allzu viel “geniessen”, da ich immer noch ziemlich tief in der (bekanntermassen steilen) Lernkurve stecke :thinking:.

Lokal habe ich eine erste Simulation zum Laufen gebracht und möchte darum als nächsten Lernschritt das Backend “dockerisiert” aufsetzen.

Leider bekomme ich aber partout die Verbindung zwischen UI und Backend nicht zum laufen.

Zunächst die generellen Informationen:

Setup: Backend, UI, NGINX (reverse proxy) und Let’s encrypt jeweils in eigenem Container
System: Ubuntu 24.04.3 LTS (GNU/Linux 6.8.0-90-generic x86_64)
Docker: 29.1.3
NGINX: alpine
Let’s encrypt: certbot
Edge: noch nicht implementiert
Backend: diverse (2025.10.0, 2025.12.0, 2026.1.0)
Ui: latest (2025.12.0)
DB: noch nicht implementiert
Odoo: noch nicht implementiert

Backend scheint zu laufen und Port 8079 ist erreichbar (Apache Felix).

Meine docker-compose.yml sieht wie folgt aus:

services:
  # ---------- Certbot ----------
  certbot:
    image: certbot/certbot
    container_name: certbot
    volumes:
      - ./certs:/etc/letsencrypt
      - ./certbot-www:/var/www/certbot
    command: >
      certonly --webroot -w /var/www/certbot
      -d example.com -d ems.example.com
    networks:
      - webnet

  # ---------- Nginx Reverse Proxy ----------
  nginx:
    image: nginx:alpine
    container_name: nginx
    ports:
      - "443:443"
      - "80:80"
    volumes:
      - ./certs:/etc/letsencrypt:ro
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
    depends_on:                         # service names
      - openems-backend
      - openems-ui
    networks:
      - webnet

  # ---------- OpenEMS Backend ----------
  openems-backend:                      # service name
#    image: openems/backend:latest
    image: openems/backend:2025.10.0
    container_name: openems_backend     # container name
    hostname: openems_backend
    restart: unless-stopped
    volumes:
      - openems-backend-conf:/var/opt/openems/config:rw
      - openems-backend-data:/var/opt/openems/data:rw
    ports:
      - 8079:8079 # Apache-Felix
      - 8081:8081 # Edge-Websocket
      - 8082:8082 # UI-Websocket
    networks:
      - webnet

  # ---------- OpenEMS UI ----------
  openems-ui:
    image: openems/ui-backend:latest
    container_name: openems_ui
    hostname: openems_ui
    restart: unless-stopped
    environment:
      - WEBSOCKET_HOST=example.com
      - WEBSOCKET_PORT=443
      - WEBSOCKET_PROTOCOL=wss

    networks:
      - webnet

volumes:
  openems-backend-conf:
  openems-backend-data:
   
networks:
  webnet:
    driver: bridge

Diese Config lehnt sich hier an: Deploy OpenEMS Backend to Docker :: Open Energy Management System

Der Vollständigkeit halber hier auch noch meine NGINX Config (./nginx/conf.d/default_prod.conf)

# -------- HTTP → HTTPS Redirect --------
server {
    listen 80;
    server_name example.com ems.example.com;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

# -------- HTTPS Server --------
server {
#    listen 443 ssl http2;
    listen 443 ssl;
    server_name example.com ems.example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
#    ssl_ciphers HIGH:!aNULL:!MD5;

    # ---------- OpenEMS UI ----------
    location / {
        proxy_pass http://openems-ui:80;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $remote_addr;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    # ---------- OpenEMS Edge -> OpenEMS Backend  ----------
    location /edge-to-backend {
        proxy_pass http://openems-backend:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        access_log /var/log/nginx/edge-to-backend.access.log;
        error_log /var/log/nginx/edge-to-backend.error.log;
    }

    # ---------- OpenEMS UI -> OpenEMS Backend----------
    location /openems-backend {
        proxy_pass http://openems_backend:8082;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
#        proxy_set_header X-Forwarded-Proto https;
#        proxy_set_header X-Real-IP $remote_addr;
#        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        access_log /var/log/nginx/ui-to-backend.access.log;
        error_log /var/log/nginx/ui-to-backend.error.log;
    }
}

Problembeschreibung

  • alle Container starten
  • Das Backend lässt sich über Apache Felix (port 8079) erreichen
  • https://example.com zeigt: Server nicht erreichbar
  • Ein Verbindung zwischen UI und Backend kommt meines Erachtens nicht zu Stande.

Dinge die ich überprüft/probiert habe:

Ports

sudo docker exec -it openems_backend sh -lc 'netstat -tulpn | egrep "8079|8081|8082" || true'

tcp        0      0 :::8079                 :::*                    LISTEN      -

Also kein Port 8082

Varianten in den Configs

Ein paar wenige Versuche habe ich als Kommentar in meinen Configs stehen lassen. Andere Versuche habe ich der Übersicht halber wieder gelöscht.

Apache Felix → Core.JsonRpcRequestHandler:

  • Status: unsatisfied (reference)
  • Reference edgeManager: Unsatisfied

Ist das eine Spur oder ein Nebenschauplatz?:man_shrugging:

Verschiedene Versionen des Backend

  • 2025.10.0
  • 2025.12.0
  • 2026.1.0

Bin mir aber noch nicht mal sicher, ob ich überhaupt an der richtigen Stelle suche…
Vielen Dank jetzt schon für jeden Hinweis.

Viele Grüsse, Simon

Hallo Simon,

ich würde schlicht behaupten, dass das backend gar nicht vollständig hochgefahren ist. Schau dir doch mal die LOG-Ausgaben an (docker compose logs openems-backend). Auch in der Felix-Admin-Oberfläche im Menü unter OSGi→LogServices kann man einiges sehen.

Ich nutze zwar ein vollständig eigenes docker setup, aber ich denke die Angaben

 `environment:
  - WEBSOCKET_HOST=``example.com``
  - WEBSOCKET_PORT=443
  - WEBSOCKET_PROTOCOL=wss`

können so nicht richtig sein, da du sicher nicht Eigentümer von example.com bist. Da müsste afaik Hostname und Port hin, wo das backend zu erreichen ist - aus Sicht des Browers.

Hallo chpo

Vielen Dank für deine Rückmeldung.

  • Startet das Backend überhaupt?
    Ich habe mir die LOG-Ausgabe angeschaut. Sieht IMHO nicht schlecht aus. Folgende Auffälligkeiten habe ich entdeckt:

openems_backend | [custom-init] No custom files found, skipping…

und ein [WARN] habe ich gefunden:

openems_backend | 2026-01-01T17:08:25,824 [hread-11] WARN [end.metadata.file.MetadataFile] [Metadata.File] Unable to read file [/var/opt/openems/metadata.json]: /var/opt/openems/metadata.json (No such file or directory)
openems_backend | java.io.FileNotFoundException: /var/opt/openems/metadata.json (No such file or directory)

Alles andere sind [INFO] z.T. auch mit “stopped”:
Hier darum die ganze LOG-Ausgabe:

sudo docker compose logs openems-backend

openems_backend  | [migrations] started
openems_backend  | [migrations] no migrations found
openems_backend  | usermod: no changes
openems_backend  | ───────────────────────────────────────────
openems_backend  |  _____ _____ _____ _____ _____ _____ _____
openems_backend  | |     |  _  |   __|   | |   __|     |   __|
openems_backend  | |  |  |   __|   __| | | |   __| | | |__   |
openems_backend  | |_____|__|  |_____|_|___|_____|_|_|_|_____|
openems_backend  |
openems_backend  |     Based on images from linuxserver.io
openems_backend  | ───────────────────────────────────────────
openems_backend  | for further information visit:
openems_backend  | https://openems.io/
openems_backend  |
openems_backend  | ───────────────────────────────────────
openems_backend  | GID/UID:    911/911
openems_backend  | ───────────────────────────────────────
openems_backend  | [custom-init] No custom files found, skipping...
openems_backend  | org.ops4j.pax.logging.pax-logging-api [org.ops4j.pax.logging.internal.Activator] INFO : Enabling Java Util Logging API support.
openems_backend  | org.ops4j.pax.logging.pax-logging-api [org.ops4j.pax.logging.internal.Activator] INFO : Enabling SLF4J API support.
openems_backend  | org.ops4j.pax.logging.pax-logging-api [org.ops4j.pax.logging.internal.Activator] INFO : Enabling Apache Commons Logging API support.
openems_backend  | org.ops4j.pax.logging.pax-logging-api [org.ops4j.pax.logging.internal.Activator] INFO : Enabling JULI Logger API support.
openems_backend  | org.ops4j.pax.logging.pax-logging-api [org.ops4j.pax.logging.internal.Activator] INFO : Enabling Avalon Logger API support.
openems_backend  | org.ops4j.pax.logging.pax-logging-api [org.ops4j.pax.logging.internal.Activator] INFO : Enabling JBoss Logging API support.
openems_backend  | org.ops4j.pax.logging.pax-logging-api [org.ops4j.pax.logging.internal.Activator] INFO : Enabling Log4J v1 API support.
openems_backend  | org.ops4j.pax.logging.pax-logging-api [org.ops4j.pax.logging.internal.Activator] INFO : Enabling Log4J v2 API support.
openems_backend  | 2026-01-01T17:08:25.174201341Z FelixStartLevel INFO Initializing Log4j2 using default configuration
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : Initializing Log4j2 using default configuration
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : Starting LoggerContext[name=pax-logging] with configuration org.apache.logging.log4j.core.config.DefaultConfiguration@2041f761...
openems_backend  | 2026-01-01T17:08:25.387040537Z FelixStartLevel INFO Starting LoggerContext[name=pax-logging] with configuration org.apache.logging.log4j.core.config.DefaultConfiguration@2041f761...
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : Starting configuration org.apache.logging.log4j.core.config.DefaultConfiguration@2041f761...
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : Configuration org.apache.logging.log4j.core.config.DefaultConfiguration@2041f761 started.
openems_backend  | 2026-01-01T17:08:25.393579157Z FelixStartLevel INFO Starting configuration org.apache.logging.log4j.core.config.DefaultConfiguration@2041f761...
openems_backend  | 2026-01-01T17:08:25.394176442Z FelixStartLevel INFO Configuration org.apache.logging.log4j.core.config.DefaultConfiguration@2041f761 started.
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : Stopping configuration org.apache.logging.log4j.core.config.DefaultConfiguration@54ba9525...
openems_backend  | 2026-01-01T17:08:25.396801051Z FelixStartLevel INFO Stopping configuration org.apache.logging.log4j.core.config.DefaultConfiguration@54ba9525...
openems_backend  | 2026-01-01T17:08:25.397880387Z FelixStartLevel INFO Configuration org.apache.logging.log4j.core.config.DefaultConfiguration@54ba9525 stopped.
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : Configuration org.apache.logging.log4j.core.config.DefaultConfiguration@54ba9525 stopped.
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : LoggerContext[name=pax-logging] started with configuration org.apache.logging.log4j.core.config.DefaultConfiguration@2041f761.
openems_backend  | 2026-01-01T17:08:25.400404737Z FelixStartLevel INFO LoggerContext[name=pax-logging] started with configuration org.apache.logging.log4j.core.config.DefaultConfiguration@2041f761.
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : Log4J2 configured using default configuration.
openems_backend  | 2026-01-01T17:08:25.401233588Z FelixStartLevel INFO Log4J2 configured using default configuration.
openems_backend  | org.ops4j.pax.logging.pax-logging-log4j2 [org.ops4j.pax.logging.spi.support.EventAdminConfigurationNotifier] INFO : Sending Event Admin notification (configuration successful) to org/ops4j/pax/logging/Configuration
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : Stopping configuration org.apache.logging.log4j.core.config.DefaultConfiguration@2041f761...
openems_backend  | 2026-01-01T17:08:25.405088460Z CM Configuration Updater (ManagedService Update: pid=[org.ops4j.pax.logging]) INFO Stopping configuration org.apache.logging.log4j.core.config.DefaultConfiguration@2041f761...
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : Configuration org.apache.logging.log4j.core.config.DefaultConfiguration@2041f761 stopped.
openems_backend  | 2026-01-01T17:08:25.407662885Z CM Configuration Updater (ManagedService Update: pid=[org.ops4j.pax.logging]) INFO Configuration org.apache.logging.log4j.core.config.DefaultConfiguration@2041f761 stopped.
openems_backend  | 2026-01-01T17:08:25.474006478Z CM Configuration Updater (ManagedService Update: pid=[org.ops4j.pax.logging]) INFO Starting LoggerContext[name=pax-logging] with configuration org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@48281087...
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : Starting LoggerContext[name=pax-logging] with configuration org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@48281087...
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : Starting configuration org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@48281087...
openems_backend  | 2026-01-01T17:08:25.625969416Z CM Configuration Updater (ManagedService Update: pid=[org.ops4j.pax.logging]) INFO Starting configuration org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@48281087...
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : Configuration org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@48281087 started.
openems_backend  | 2026-01-01T17:08:25.631115301Z CM Configuration Updater (ManagedService Update: pid=[org.ops4j.pax.logging]) INFO Configuration org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@48281087 started.
openems_backend  | 2026-01-01T17:08:25.634832467Z CM Configuration Updater (ManagedService Update: pid=[org.ops4j.pax.logging]) INFO Stopping configuration org.apache.logging.log4j.core.config.NullConfiguration@5d0a3db3...
openems_backend  | 2026-01-01T17:08:25.635737221Z CM Configuration Updater (ManagedService Update: pid=[org.ops4j.pax.logging]) INFO Configuration org.apache.logging.log4j.core.config.NullConfiguration@5d0a3db3 stopped.
openems_backend  | 2026-01-01T17:08:25.635969990Z CM Configuration Updater (ManagedService Update: pid=[org.ops4j.pax.logging]) INFO LoggerContext[name=pax-logging] started with configuration org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@48281087.
openems_backend  | 2026-01-01T17:08:25.636070760Z CM Configuration Updater (ManagedService Update: pid=[org.ops4j.pax.logging]) INFO Log4J2 configured using configuration from passed properties
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : Stopping configuration org.apache.logging.log4j.core.config.NullConfiguration@5d0a3db3...
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : Configuration org.apache.logging.log4j.core.config.NullConfiguration@5d0a3db3 stopped.
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : LoggerContext[name=pax-logging] started with configuration org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@48281087.
openems_backend  | org.ops4j.pax.logging.pax-logging-api [log4j2] INFO : Log4J2 configured using configuration from passed properties
openems_backend  | 2026-01-01T17:08:25,645 [ogging])] INFO  [ventAdminConfigurationNotifier] Sending Event Admin notification (configuration successful) to org/ops4j/pax/logging/Configuration
openems_backend  | 2026-01-01T17:08:25,644 [artLevel] INFO  [backend.application.BackendApp] ===========================================
openems_backend  | 2026-01-01T17:08:25,656 [artLevel] INFO  [backend.application.BackendApp] OpenEMS Backend version [2025.10.0] started
openems_backend  | 2026-01-01T17:08:25,657 [artLevel] INFO  [backend.application.BackendApp] ===========================================
openems_backend  | 2026-01-01T17:08:25,707 [artLevel] INFO  [.debugcycle.DebugCycleExecutor] Update metrics all 5 Seconds
openems_backend  | 2026-01-01T17:08:25,818 [artLevel] INFO  [end.metadata.file.MetadataFile] Activate [path=/var/opt/openems/metadata.json]
openems_backend  | 2026-01-01T17:08:25,824 [hread-11] WARN  [end.metadata.file.MetadataFile] [Metadata.File] Unable to read file [/var/opt/openems/metadata.json]: /var/opt/openems/metadata.json (No such file or directory)
openems_backend  | java.io.FileNotFoundException: /var/opt/openems/metadata.json (No such file or directory)
openems_backend  |      at java.base/java.io.FileInputStream.open0(Native Method)
openems_backend  |      at java.base/java.io.FileInputStream.open(Unknown Source)
openems_backend  |      at java.base/java.io.FileInputStream.<init>(Unknown Source)
openems_backend  |      at java.base/java.io.FileInputStream.<init>(Unknown Source)
openems_backend  |      at java.base/java.io.FileReader.<init>(Unknown Source)
openems_backend  |      at io.openems.backend.metadata.file.MetadataFile.refreshData(MetadataFile.java:190)
openems_backend  |      at io.openems.backend.metadata.file.MetadataFile.lambda$activate$0(MetadataFile.java:117)
openems_backend  |      at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(Unknown Source)
openems_backend  |      at java.base/java.lang.Thread.run(Unknown Source)
openems_backend  | 2026-01-01T17:08:25,876 [artLevel] INFO  [d.timedata.dummy.TimedataDummy] [Timedata.Dummy] Activate
openems_backend  | 2026-01-01T17:08:26,279 [artLevel] INFO  [rg.eclipse.jetty.server.Server] jetty-12.0.25; built: 2025-08-11T23:52:37.219Z; git: a862b76d8372e24205765182d9ae1d1d333ce2ea; jvm 21.0.8+9-LTS
openems_backend  | 2026-01-01T17:08:26,346 [artLevel] INFO  [ession.DefaultSessionIdManager] Session workerName=node0
openems_backend  | 2026-01-01T17:08:26,386 [artLevel] INFO  [.server.handler.ContextHandler] Started oeje10s.ServletContextHandler@6fda328d{ROOT,/,b=null,a=AVAILABLE,h=oeje10s.SessionHandler@53c5a4bc{STARTED}}
openems_backend  | 2026-01-01T17:08:26,398 [artLevel] INFO  [.servlet.ServletContextHandler] Started oeje10s.ServletContextHandler@6fda328d{ROOT,/,b=null,a=AVAILABLE,h=oeje10s.SessionHandler@53c5a4bc{STARTED}}
openems_backend  | 2026-01-01T17:08:26,410 [artLevel] INFO  [rg.eclipse.jetty.server.Server] Started oejs.Server@511efb0b{STARTING}[12.0.25,sto=0] @3599ms
openems_backend  | 2026-01-01T17:08:26,524 [artLevel] INFO  [jetty.server.AbstractConnector] Started ServerConnector@72c3ae47{HTTP/1.1, (http/1.1)}{0.0.0.0:8079}
openems_backend  | 2026-01-01T17:08:26,531 [artLevel] INFO  [org.apache.felix.http         ] Started Jetty 12.0.25 at port(s) HTTP:8079 on context path / [minThreads=8,maxThreads=200,acceptors=1,selectors=1,virtualThreadsEnabled=false]
openems_backend  | 2026-01-01T17:08:26,641 [artLevel] INFO  [org.apache.felix.webconsole   ] org.apache.felix.webconsole.internal.compendium.PreferencesConfigurationPrinter not enabled. Reason: Class org/osgi/service/prefs/BackingStoreException missing
openems_backend  | 2026-01-01T17:08:26,697 [artLevel] INFO  [org.apache.felix.webconsole   ] Servlet 3 bridge enabled
openems_backend  | Connection to 127.0.0.1 8079 port [tcp/*] succeeded!
openems_backend  | [ls.io-init] done.

Wie beurteilst du den LOG?

  • nicht Eigentümer von example.com
    Sorry, da war ich zu wenig ausführlich. Die Domain gehört mir tatsächlich nicht. Ich habe aber zu Testzwecken eine Domain registriert und auf die IP meines Test-Servers verbunden. example.com ist darum nur ein Platzhalter, damit ich meine “provisorische Test-URL” nicht publizieren muss. Habe das bei anderen Posts auch schon gesehen und dachte, das sein üblich.

Zudem muss ich noch einen Nachtrag machen: Beim copy-pasten ist mir bei der NGINX-config eine Klammer verloren gegangen. Im Code ist sie aber vorhanden:

    # ---------- OpenEMS UI ----------
    location / {
        proxy_pass http://openems-ui:80;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $remote_addr;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    
    # ---------- OpenEMS Edge -> OpenEMS Backend  ----------

(Gibt es die Möglichkeit in diesem Forum seine eigenen Einträg nachträglich zu editieren?)

Ich habe das Backend gerade nicht mehr laufen. Falls du nur ein paar einfach Sachen machen willst, reicht ein Edge.

Ich denke aber im Backend braucht man die metadata.json, da darin Benutzerinformationen konfiguriert werden, sofern du Metadata.File verwendest. Für nen Test wäre auch Metadata.Dummy eine Möglichkeit. Ausserdem pfüfe mal im Felix, ob du einen Ui.Websocket konfiguriert und aktiviert hast.

Hallo @S1m0n,

tatsächlich sind deine variablen

    environment:
      - WEBSOCKET_HOST=example.com
      - WEBSOCKET_PORT=443
      - WEBSOCKET_PROTOCOL=wss

falsch. Diese geben nicht an, wo dein UI gehostet ist, sondern wo der UI-Websocket des backends ereichbar ist.

für deine configuration sollten die standart variablen

    environment:
      - WEBSOCKET_HOST=openems_backend
      - WEBSOCKET_PORT=8082

funktionieren.

Und du könntest versuchen die volumes openems-backend-conf und openems-backend-data zu löschen, um das metadata.json problem zu lösen.

Hallo chpo

Danke für die Hinweise!

Habe Metadata auf Dummy gesetzt und geprüft ob Ui.Websocket und Edge.Websocket in der Apache Felix Web Console konfiguriert sind.

Jetzt sieht es schon etwas besser aus:

sudo docker exec -it openems_backend sh -lc 'netstat -tulpn | egrep "8079|8081|8082" || true'
tcp        0      0 :::8081                 :::*                    LISTEN      -
tcp        0      0 :::8082                 :::*                    LISTEN      -
tcp        0      0 :::8079                 :::*                    LISTEN      -

Leider kommt aber bei Aufruf meiner Test-URL nach wie vor: “Server nicht erreichbar”

Hallo @da-Kai

Danke für deine Hinweise!

WEBSOCKET_HOST:

  • habe ich entsprechend umgestellt.
  • Das Verhalten meines Backends hat sich dadurch nicht verändert, ist aber sicher sauberer so.

Neu sieht mein docker-compose.yml wie folgt aus:

services:
  # ---------- Certbot ----------
  certbot:
    image: certbot/certbot
    container_name: certbot
    volumes:
      - ./certs:/etc/letsencrypt
      - ./certbot-www:/var/www/certbot
    command: >
      certonly --webroot -w /var/www/certbot
      -d example.com 
    networks:
      - webnet

  # ---------- Nginx Reverse Proxy ----------
  nginx:
    image: nginx:alpine
    container_name: nginx
    ports:
      - "443:443"
      - "80:80"
    volumes:
      - ./certs:/etc/letsencrypt:ro
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
  #    - ./certbot-www:/var/www/certbot:ro
    depends_on:                         # service names
      - openems-backend
      - openems-ui
    networks:
      - webnet

  # ---------- OpenEMS Backend ----------
  openems-backend:                      # service name: for internal DNS, how other container can find this one
#    image: openems/backend:latest
    image: openems/backend:2025.10.0
    container_name: openems_backend     # how docker addresses this container / name used in docker CLI
    hostname: openems_backend           # within the container / for app identity / relevant for Java/OSGi
    restart: unless-stopped
    volumes:
      - openems-backend-conf:/var/opt/openems/config:rw
      - openems-backend-data:/var/opt/openems/data:rw
    ports:
      - 8079:8079 # Apache-Felix
      - 8081:8081 # Edge-Websocket
      - 8082:8082 # UI-Websocket
    networks:
      - webnet

# ---------- OpenEMS InfluxDB ----------
# initial code from: https://openems.github.io/openems.io/openems/latest/backend/deploy/docker.html#_add_influxdb_container
  openems_influxdb:
    image: influxdb:alpine
    container_name: openems_influxdb
    hostname: openems_influxdb
    restart: unless-stopped
    volumes:
      - openems-influxdb:/var/lib/influxdb2:rw
    ports:
      - 8086:8086

# ---------- OpenEMS UI ----------
  openems-ui:
    image: openems/ui-backend:latest
    container_name: openems_ui
    hostname: openems_ui
    restart: unless-stopped
    volumes:
      - openems-ui-conf:/etc/nginx:rw
      - openems-ui-log:/var/log/nginx:rw
    environment:
      - WEBSOCKET_HOST=openems-backend
      - WEBSOCKET_PORT=8082
#      - WEBSOCKET_PROTOCOL=ws
    networks:
      - webnet

volumes:
  openems-backend-conf:
  openems-backend-data:
  openems-influxdb:
  openems-ui-conf:
  openems-ui-log:
  
networks:
  webnet:
    driver: bridge

Leider kommt immer noch “Server nicht erreichbar”

Metadata.json

{
	edges: {
		edge0: {
			comment: "Edge #0",
			apikey: "edge0",
			setuppassword: "abcdefgh"
		}
	}
}
  • Habe wie von dir vorgeschlagen, die beiden OpenEMS-volumes gelöscht

Leider alles ohne Erfolg.

Logs

openems-ui

sudo docker logs openems_ui
[migrations] started
[migrations] no migrations found
usermod: no changes
───────────────────────────────────────────
 _____ _____ _____ _____ _____ _____ _____
|     |  _  |   __|   | |   __|     |   __|
|  |  |   __|   __| | | |   __| | | |__   |
|_____|__|  |_____|_|___|_____|_|_|_|_____|

        OpenEMS UI for backend
    Based on images from linuxserver.io
───────────────────────────────────────────
for further information visit:
https://openems.io/

───────────────────────────────────────
GID/UID:    911/911
───────────────────────────────────────
sending incremental file list
./
dhparams.pem
openems-nginx.conf
site-confs/
site-confs/443-openems.conf.tpl
site-confs/80-openems.conf.tpl
snippets/
snippets/ssl-cert.conf
snippets/ssl.conf

sent 7,098 bytes  received 149 bytes  14,494.00 bytes/sec
total size is 6,576  speedup is 0.91
HTTPS is disabled.
No Keys will be used.
[custom-init] No custom files found, skipping...

openems-backend

2026-01-18T21:03:01,665 [thread-1] INFO  [.debugcycle.DebugCycleExecutor] [Ui.Websocket] [Ui.Websocket] [monitor] Connections: 0, Pool: 0/10, Pending: 0, Completed: 0, Active: 0
2026-01-18T21:03:01,665 [thread-1] INFO  [.debugcycle.DebugCycleExecutor] [Edge.Websocket] [Edge.Websocket] [monitor] Connections: 0, Pool: 0/10, Pending: 0, Completed: 0, Active: 0

Ich sehe leider nicht, wo ich da ansetzen soll.

Brauche ich gültiges metadata.json file oder ist das eher “die nächste Baustelle”, wenn dann das Backend Ui mal läuft?

Die beiden Variablen

 - WEBSOCKET_HOST=openems-backend
 - WEBSOCKET_PORT=8082

geben an, wie die UI, welche im Browser läuft, das backend erreichen kann.

  1. wenn du also einen Browser in einem docker-container der dem Netz webnet zugeordnet ist startest, sollte es gehen, da docker alle services unter ihrem Namen im DNS bereitstellt.
  2. wenn du “openems-backend” in deinem DNS-resolver (ich glaube unter Windows host.txt oder so ähnlich) einträgst sollte es auch gehen.
  3. wenn dein Browser “openems-backend“ nicht auflösen kann, wird es nicht gehen.
  4. wenn du dort den Hostnamen des Computers einträgst, auf dem docker läuft, sollte es gehen
  5. wenn du dort “localhost” einträgst und den Browser auf dem gleichen Computer startest, sollte es gehen

Hintergrund: die UI läuft im Browser und wird versuchen, den eingetragenen Hostname “openems-backend” über DNS aufzulösen. Ganz ähnlich wie der Browser auch www.google.de auflöst. Du musst also etwas verwenden, dass der Browser in eine IP-Adresse übersetzen kann und die IP-Adresse sollte natürlich zum passenden Rechner gehören, wo das backend läuft. Die Details sind aber davon abhängig wie dein Netz gestaltet ist und was du erreichen willst.

Sicher, dass das korrekt ist? Ich bin selber kein Dockerexperte, hatte aber verstanden, dass es darum geht wie der Container auf dem Server den anderen Container erreichen kann (also Kommunikation innerhalb des Docker-Netzes), und nicht wie der Browser auf dem Client den anderen Container (auf dem Server erreichen kann).

Meine Config funktioniert mit folgenden Angaben:

services:
  openems-edge:
    image: openems/edge:develop
    container_name: openems_edge
    hostname: openems_edge
[...]
  openems-ui:
    image: openems/ui-edge:develop
    container_name: openems_ui
    hostname: openems_ui
    restart: unless-stopped
    volumes:
      - openems-ui-conf:/etc/nginx:rw
      - openems-ui-log:/var/log/nginx:rw
    environment:
      - WEBSOCKET_HOST=openems_edge
      - WEBSOCKET_PORT=8085
[...]

Ich würde eher darauf tippen, dass das Problem von @S1m0n daher rührt, dass er dem Backend in seiner Config den Container-Namen und Hostnamen openems_backend gegeben hat, und in dem ui-Block dann den Websocket Host mit openems-backend angegeben hat. Was zwei unterschiedliche Namen (_ != -) sind. Aber wie gesagt, bin selber kein Docker-Experte, @da-Kai kann sonst sicherlich mehr dazu sagen. :slight_smile:

1 Like

Da hast du @sjjh natürlich recht… die Namen sollten passen.

Die Angabe von “hostname” ist eigentlich gar nicht wirklich erfoderlich, da docker automatisch den hostnamen vom service-name ableitet. Ihr könntet den Parameter einfach weglassen. In der Umgebungsvariable WEBSOCKET_HOST sollte der hostname des docker containers vom backend bzw. edge stehen. Also entweder die ganzen hostname weglassen und dort den service-name eintragen (in @S1m0n fall wäre das openems-backend) oder die hostname drinlassen, dann aber den dort eingetragenen Wert nutzen (bei @S1m0n dann openems_backend).

EDIT: auch in der Konfiguration des ngnix containers darauf achten, dass die Hostnamen stimmen.

Hallo zusammen und vielen Dank für eure Unterstützung und Hinweise.

Schlussendlich lag es tatsächlich wie von @sjjh vermutet an der Namensgebung im docker-compose.

Jetzt findet das UI das Backend.

Der Vollständigkeit halber hier mein code, wobei ich wiederum die Test-URL meines Servers durch example.com ersetzt habe.

nginx: default.conf

# -------- HTTP → HTTPS Redirect --------
server {
    listen 80;
    server_name example.com ems.example.com;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

# -------- HTTPS Server --------
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    # ---------- OpenEMS UI ----------
    location / {
        proxy_pass http://openems-ui:80;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $remote_addr;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # ---------- OpenEMS Edge -> OpenEMS Backend  ----------
    location /edge-to-backend {
        proxy_pass http://openems-backend:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        access_log /var/log/nginx/edge-to-backend.access.log;
        error_log /var/log/nginx/edge-to-backend.error.log;
    }

    # ---------- OpenEMS UI -> OpenEMS Backend----------
    location /ui-to-backend {
        proxy_pass http://openems-backend:8082;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header X-Forwarded-Proto $scheme;

        access_log /var/log/nginx/ui-to-backend.access.log;
        error_log /var/log/nginx/ui-to-backend.error.log;
    }
}

docker-compose.yml

services:
  # ---------- Certbot ----------
  certbot:
    image: certbot/certbot
    container_name: certbot
    volumes:
      - ./certs:/etc/letsencrypt
      - ./certbot-www:/var/www/certbot
    command: >
      certonly --webroot -w /var/www/certbot
      -d example.com
    networks:
      - webnet

  # ---------- Nginx Reverse Proxy ----------
  nginx:
    image: nginx:alpine
    container_name: nginx
    ports:
      - "443:443"
      - "80:80"
    volumes:
      - ./certs:/etc/letsencrypt:ro
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./certbot-www:/var/www/certbot:ro
    depends_on:                         # service names
      - openems-backend
      - openems-ui
    networks:
      - webnet

  # ---------- OpenEMS Backend ----------
  openems-backend:  
    image: openems/backend:latest
    container_name: openems_backend     
    hostname: openems_backend
    restart: unless-stopped
    volumes:
      - openems-backend-conf:/var/opt/openems/config:rw
      - openems-backend-data:/var/opt/openems/data:rw
    ports:
      - 8079:8079 # Apache-Felix
      - 8081:8081 # Edge-Websocket
      - 8082:8082 # UI-Websocket
    networks:
      - webnet

# ---------- OpenEMS UI ----------
  openems-ui:
    image: openems/ui-backend:latest
    container_name: openems_ui
    hostname: openems_ui
    restart: unless-stopped
    volumes:
      - openems-ui-conf:/etc/nginx:rw
      - openems-ui-log:/var/log/nginx:rw
    environment:
      - WEBSOCKET_HOST=openems_backend
      - WEBSOCKET_PORT=8082
    networks:
      - webnet

volumes:
  openems-backend-conf:
  openems-backend-data:
  openems-ui-conf:
  openems-ui-log:
  
networks:
  webnet:
    driver: bridge

Interessant ist noch, dass ChatGPT überzeugt ist, dass der obige Code nicht funktioniert, weil Service-Name (in meinem Fall “openems-backend”) und Websocket (“hier openems_backend”) nicht zusammenpassen…

Nun, wie dem auch sei, aktuell schaffe ich es mein Backend zu erreichen.

1 Like