Metasfresh Docker Weiße Seite

Hallo,

ich versuche gerade metasfresh mit docker-compose zum laufen zu bekommen. Leider erhalte ich beim Aufruf der Website nur eine weiße Seite. Ich nehme an, es liegt daran, dass in der config.js nur http steht, die Seite aber über https aufgerufen wird.

In der docker-compose.yml ist auch https hinterlegt.

version: '3.2'
services:
  db:
    build: db
    restart: always
    volumes:
      - ./volumes/db/data:/var/lib/postgresql/data
      - ./volumes/db/log:/var/log/postgresql
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    environment:
      - METASFRESH_USERNAME=metasfresh
      - METASFRESH_PASSWORD=metasfresh
      - METASFRESH_DBNAME=metasfresh
      - DB_SYSPASS=System
      - POSTGRES_PASSWORD=ip2LmNzXX8p8iXg9lZTWEJ9524kQDbXFudB7LR03T-xK9fLweX3TLMkA2AYcEiaS
    networks:
      - default

  app:
    build: app
    hostname: app
    links:
      - db:db
      - rabbitmq:rabbitmq
      - search:search
    expose:
      - "8282"
      - "61616"
      - "8788"
    restart: always
    volumes:
      - ./volumes/app/log:/opt/metasfresh/log:rw
      - ./volumes/app/heapdump:/opt/metasfresh/heapdump:rw
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    environment:
      - METASFRESH_HOME=/opt/metasfresh
    networks:
      - default
  
  webapi:
    build: webapi
    links:
      - app:app
      - db:db
      - rabbitmq:rabbitmq
      - search:search
    expose:
      - "8789"
  # to access the webui-api directly
  # (eg. for debugging or connecting your app to the metasfresh api)
  # uncomment following port:
    #ports:
     #- "8080:8080"
    restart: always
    volumes:
      - ./volumes/webapi/log:/opt/metasfresh-webui-api/log:rw
      - ./volumes/webapi/heapdump:/opt/metasfresh-webui-api/heapdump:rw
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    networks:
      - default
  
  webui:
    build: webui
    links:
      - webapi:webapi
    #ports:
      #- "80:80"
      #- "443:443"
    restart: always
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    #uncomment and set to URL where metasfresh will be available from browsers
    environment:
      - WEBAPI_URL=https://crm.meinedomain.de
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.metafresh.entrypoints=http"
      - "traefik.http.routers.metafresh.rule=Host(`crm.meinedomain.de`)"  ## Hier eure Domain eingeben ##
      - "traefik.http.middlewares.metafresh-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.metafresh.middlewares=metafresh-https-redirect"
      - "traefik.http.routers.metafresh-secure.entrypoints=https"
      - "traefik.http.routers.metafresh-secure.rule=Host(`crm.meinedomain.de`)" ## Hier eure Domain eingeben ##
      - "traefik.http.routers.metafresh-secure.tls=true"
      - "traefik.http.routers.metafresh-secure.tls.certresolver=http"
      - "traefik.http.routers.metafresh-secure.service=metafresh"
      - "traefik.http.services.metafresh.loadbalancer.server.port=80"
      - "traefik.docker.network=proxy"
      - "traefik.http.routers.metafresh-secure.middlewares=secHeaders@file"
    networks:
      - default
      - proxy
    
   
  rabbitmq:
    build: rabbitmq
    expose:
      - "5672"
    restart: always
    volumes:
      - ./volumes/rabbitmq/log:/var/log/rabbitmq/log
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    environment:
      RABBITMQ_DEFAULT_USER: "metasfresh"
      RABBITMQ_DEFAULT_PASS: "metasfresh"
      RABBITMQ_DEFAULT_VHOST: "/"
    networks:
      - default
  
  search:
    build: search
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    cap_add:
      - IPC_LOCK
   # to access the search api directly
   #(e.g. if you did docker-compose up search to have the deachboard with your locally running metasfresh services)
   # uncomment following ports:
  # ports:
  #   - "9200:9200"
  #   - "9300:9300"
    volumes:
      - ./volumes/search/data:/usr/share/elasticsearch/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    environment:
      - "ES_JAVA_OPTS=-Xms128M -Xmx256m"
    restart: always
    networks:
      - default
   
networks:
    proxy:
      external: true

Wenn ich manuell im Container die Datei auf https ändere, kommt der Login screen, nach einem Neustart ist aber (natürlich) wieder alles beim alten.

Irgendwelche Ideen woher der falsche Wert kommt und wie ich ihn dauerhaft ändern kann?

Danke vorab!

Konnte das Problem lösen.
Als erstes metasfresh auf SSL umstellen (https://docs.metasfresh.org/installation_collection/DE/Wie_richte_ich_ssl_in_metasfresh_docker_ein.html)
Dann die Traefik Flags bei webui geändert:

labels:
  - "traefik.enable=true"
  #- "traefik.http.routers.metasfresh.entrypoints=http"
  #- "traefik.http.routers.metasfresh.rule=Host(`crm.rz-walhall.de`)"  ## Hier eure Domain eingeben ##
  #- "traefik.http.middlewares.metasfresh-https-redirect.redirectscheme.scheme=https"
  #- "traefik.http.routers.metasfresh.middlewares=metasfresh-https-redirect"
  - "traefik.http.routers.metasfresh-secure.entrypoints=https"
  - "traefik.http.routers.metasfresh-secure.rule=Host(`crm.rz-walhall.de`)" ## Hier eure Domain eingeben ##
  - "traefik.http.routers.metasfresh-secure.tls=true"
  #- "traefik.http.routers.metasfresh-secure.service=metasfresh"
  #- "traefik.http.services.metasfresh.loadbalancer.server.port=80"
  - "traefik.docker.network=proxy"
  - "traefik.http.routers.metasfresh-secure.middlewares=secHeaders@file"

Moing ich habe Metasfresh nun endlich mit Letsencrypt per Traefik am laufen.

Sehe auch die UI aber leider ohne Menus (tw Icons aber keine Namen) auch das Usermenu kommt 404.

Ich vermute das die API Anbindung nicht passt und es hier keine Daten abgerufen werden können.

Soll ich mal meine docker-compose Daten posten oder kann mir jemand schon so einen Tipp geben?

Meine Vermutung ist richtig:

Ich bekomme wenn ich die WebAPI direkt aufrufe diese Meldung:

Proxy Error

The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request

Reason: DNS lookup failure for: webapi

Ok hier noch ein Zwischenbericht!

Ich habe nun noch 2 Probleme:

  1. Die Domain die in der Config.js gespeichert wird ist immer ohne https wenn ich aber in der docker-compose was reinschreibe wie httpss:// dann erscheint das ss auch. Aber aus einen https wird ein http

  2. Die Service von /rest/api und /stomp sind nicht erreichbar?

Wer kann mir Tipps geben oder helfen?

Ich habe MetasFresh und Traefik mit folgender Anleitung am laufen:

version: "3.3"

services:
  traefik:
    image: "traefik:v2.3"
    container_name: Traefik
    command:
      - "--api=true"
      - "--api.dashboard=true"
      - "--log.level=INFO"
      - "--accesslog=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.myresolver.acme.caserver=https://acme-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.myresolver.acme.email=info@web-seo-consulting.eu"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"

    ports:
      - "80:80"
      - "443:443"

    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

    networks:
      - "traefik_proxy"
      - "default"

    labels:
      traefik.enable: true

      # Routers
      traefik.http.routers.traefik.rule: Host(`traefik.meine-Domain.de`)
      traefik.http.routers.traefik.entrypoints: websecure
      traefik.http.routers.traefik.service: api@internal
      traefik.http.routers.traefik.tls.certresolver: myresolver
      traefik.http.routers.traefik.middlewares: traefik-auth

      # global redirect to https
      traefik.http.routers.http-catchall.rule: hostregexp(`{host:.+}`)
      traefik.http.routers.http-catchall.entrypoints: web
      traefik.http.routers.http-catchall.middlewares: redirect-to-https

      # Middleware
      traefik.http.middlewares.traefik-auth.basicauth.removeheader: true
      traefik.http.middlewares.traefik-auth.basicauth.users: USER

      # middleware redirect
      traefik.http.middlewares.redirect-to-https.redirectscheme.scheme: https

networks:
  traefik_proxy:
    external:
      name: traefik_proxy
  default:
    driver: bridge

==

Dazu kommt dann die docker-compose von Metasfresh:

version: "3.2"
services:
  db:
    build: db
    restart: always
    volumes:
      - ./volumes/db/data:/var/lib/postgresql/data
      - ./volumes/db/log:/var/log/postgresql
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    environment:
      - METASFRESH_USERNAME=metasfresh
      - METASFRESH_PASSWORD=metasfresh
      - METASFRESH_DBNAME=metasfresh
      - DB_SYSPASS=System
      - POSTGRES_PASSWORD=ip2LmNzXX8p8iXg9lZTWEJ9524kQDbXFudB7LR03T-xK9fLweX3TLMkA2AYcEiaS
    networks:
      - default

  app:
    build: app
    hostname: app
    links:
      - db:db
      - rabbitmq:rabbitmq
      - search:search
    expose:
      - "8282"
      - "61616"
      - "8788"
    restart: always
    volumes:
      - ./volumes/app/log:/opt/metasfresh/log:rw
      - ./volumes/app/heapdump:/opt/metasfresh/heapdump:rw
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    environment:
      - METASFRESH_HOME=/opt/metasfresh
    networks:
      - default

  webapi:
    build: webapi
    links:
      - app:app
      - db:db
      - rabbitmq:rabbitmq
      - search:search
    expose:
      - "8789"
  # to access the webui-api directly
  # (eg. for debugging or connecting your app to the metasfresh api)
  # uncomment following port:
    #ports:
     #- "8080:8080"
    restart: always
    volumes:
      - ./volumes/webapi/log:/opt/metasfresh-webui-api/log:rw
      - ./volumes/webapi/heapdump:/opt/metasfresh-webui-api/heapdump:rw
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    networks:
      - default

  webui:
    build: webui
    links:
      - webapi:webapi
    ports:
      - "888:80"
      - "8443:443"
    restart: always
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    #uncomment and set to URL where metasfresh will be available from browsers
    environment:
      - WEBAPI_URL=https://meine-Domain.de
    labels:
      traefik.enable: true
      traefik.docker.network: traefik_proxy

      # Routers
      traefik.http.routers.webui.rule: Host(`meine-Domain.de`)
      traefik.http.routers.webui.entrypoints: websecure
      traefik.http.routers.webui.tls.certresolver: myresolver
      traefik.http.routers.webui.service: webui_svc
      traefik.http.routers.webui.middlewares: webuiHeader
      traefik.http.routers.webui.tls: true

      traefik.http.services.webui_svc.loadBalancer.server.port: 80
      traefik.http.middlewares.webuiHeader.headers.customrequestheaders.X-Forwarded-Proto: https
      traefik.http.middlewares.webuiHeader.headers.customrequestheaders.X-Forwarded-Ssl: on
      traefik.http.middlewares.webuiHeader.headers.customrequestheaders.X-Forwarded-Port: 443

    networks:
      - traefik_proxy
      - default

  rabbitmq:
    build: rabbitmq
    expose:
      - "5672"
    restart: always
    volumes:
      - ./volumes/rabbitmq/log:/var/log/rabbitmq/log
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    environment:
      RABBITMQ_DEFAULT_USER: "metasfresh"
      RABBITMQ_DEFAULT_PASS: "metasfresh"
      RABBITMQ_DEFAULT_VHOST: "/"
    networks:
      - default

  search:
    build: search
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    cap_add:
      - IPC_LOCK
  # to access the search api directly
  # (e.g. if you did docker-compose up search to have the deachboard with your locally running metasfresh services)
  # uncomment following ports:
  # ports:
  #   - "9200:9200"
  #   - "9300:9300"
    volumes:
      - ./volumes/search/data:/usr/share/elasticsearch/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    environment:
      - "ES_JAVA_OPTS=-Xms128M -Xmx256m"
    restart: always
    networks:
      - default

networks:
  traefik_proxy:
    external:
      name: traefik_proxy
  default:
    driver: bridge

==

Ich hatte eine weiße Seite, weil alles eine kurze Zeit (~10m) nach docker-compose up -d brauchte, sich zu initialisieren (CPU auf 100%).
Seitdem läuft alles stabil, ist erreichbar und auch schnell.

@Sven
Ist bei dir auch der Websocket Service und die REST API verfügbar?
Ich kann mich einloggen, aber bekomme 403 Fehlercode für API Calls und kann keine Verbindung zum Websocket Dienst herstellen.

Der 403 kommt, weil auf Seiten des Servers folgende Fehlermeldung kommt:
Origin header value ‘https://erp.my-domain.de’ not allowed.

Hier meine Service Konfig in docker-compose:

webui:
build: webui
links:
  - webapi:webapi
ports:
  - "8080:80"
  - "8443:443"
restart: always
volumes:
  - /etc/localtime:/etc/localtime:ro
  - /etc/timezone:/etc/timezone:ro
environment:
  - WEBAPI_URL=https://erp.my-domain.de/
labels:
  - "traefik.enable=true"
  - "traefik.http.routers.erp.entrypoints=websecure"
  - "traefik.http.routers.erp.rule=Host(`erp.my-domain.de`)"
  - "traefik.http.routers.erp.tls=true"
  - "traefik.docker.network=web"
  - "traefik.http.routers.erp.service=erp"
  - "traefik.http.services.erp.loadbalancer.server.port=80"

Was mich besonders wundert. Ich kann mich nur auf Port 80 mit dem Container verbinden und den exponierten Port nicht ändern. Bei mapping auf 443 bekomme ich einen 400 Bad Request Fehler, mit der Begründung ich würde mich über plain http mit dem ssl Server verbinden. Der Schlüssel und das Zertifikat liegen als exportierte PEM im vorgesehenen certs Ordner.
Wenn ich den http oder den https Port des Containers nach außen mappe bspw. 8443:443, ist keine Verbindung möglich. Dann kommt immer Bad Gateway.

Ich vermute die Verbindung zu API und Websocket gehen über port 80 nicht, weil der Server auf SSL eingestellt ist und nicht über Port 443, weil traefik aus irgendeinem Grund plain http mit dem Container spricht.

Hat hier jemand eine funktionierende Lösung oder einen Hinweis, wie ich das Problem lösen kann?

Ehrlich gesagt ich hab es aufgegeben

Also ich hab’s mittlerweile mit Traefik 2.4 am Laufen. Sind noch ein zwei Glitches im Setup, aber ansonsten ist die Software doch vielversprechend.

Sag Bescheid, wenn du es nochmal versuchen willst, und ggf. Hife brauchst.