Blinking Blue light

I am using docker to connect to the controller. I hadn’t updated in a while and when I did a update on the docker the controller is no longer able to connect. I have a flashing green light. I did a reset on the photon board and was able to connect to the Particle cloud but when I flashed the controller, the controller is back to green flashing and the Dashboard shows waiting on datastore

Below is my current docker-compose file.

# DO NOT EDIT: THIS FILE WILL BE RESET DURING UPDATES
#
# This file contains configuration for the shared Brewblox services
#
# If you need to make change to any of the shared services,
# you can do so in docker-compose.yml.
#
# For more information, see https://docs.docker.com/compose/extends/

networks:
  default:
    driver_opts:
      com.docker.network.bridge.name: br-${COMPOSE_PROJECT_NAME}

version: "3.7"
services:
  eventbus:
    image: ghcr.io/brewblox/mosquitto:${BREWBLOX_RELEASE}
    restart: unless-stopped
    labels:
      # MQTT
      - traefik.tcp.routers.mqtt.entrypoints=mqtt
      - traefik.tcp.routers.mqtt.rule=HostSNI(`*`)
      - traefik.tcp.routers.mqtt.tls=false
      - traefik.tcp.routers.mqtt.service=mqtt
      - traefik.tcp.services.mqtt.loadBalancer.server.port=1884
      # MQTTS with TLS termination by traefik
      - traefik.tcp.routers.mqtts.entrypoints=mqtts
      - traefik.tcp.routers.mqtts.rule=HostSNI(`*`)
      - traefik.tcp.routers.mqtts.tls=true
      - traefik.tcp.routers.mqtts.service=mqtts
      - traefik.tcp.services.mqtts.loadBalancer.server.port=1884
      # MQTT over websockets
      - traefik.http.services.eventbus.loadbalancer.server.port=15675
    volumes:
      - type: bind
        source: /mnt/user/appdata/mosquitto
        target: /mosquitto/include
        
  victoria:
    image: victoriametrics/victoria-metrics:v1.88.0
    restart: unless-stopped
    labels:
      - traefik.http.services.victoria.loadbalancer.server.port=8428
    volumes:
      - type: bind
        source: /mnt/user/appdata/victoria
        target: /victoria-metrics-data
    command: >-
      --retentionPeriod=100y
      --influxMeasurementFieldSeparator=/
      --http.pathPrefix=/victoria
      --search.latencyOffset=10s
  redis:
    image: redis:6.0
    restart: unless-stopped
    labels:
      - traefik.enable=false
    volumes:
      - type: bind
        source: /mnt/user/appdata/redis
        target: /data
    command: --appendonly yes
    
  history:
    image: ghcr.io/brewblox/brewblox-history:${BREWBLOX_RELEASE}
    restart: unless-stopped
    volumes:
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true
    # Privileged to avoid a bug in libseccomp for Debian Buster hosts
    # This flag should be removed when Debian Buster is no longer supported
    # For an explanation: https://github.com/sdr-enthusiasts/Buster-Docker-Fixes
    privileged: true

  # auth:
  #   image: ghcr.io/brewblox/brewblox-auth:${BREWBLOX_RELEASE}
  #   restart: unless-stopped
  #   environment:
  #     - BREWBLOX_AUTH_ENABLED={{ config.auth.enabled }}
  #     - BREWBLOX_AUTH_IGNORE=/|/(ui|shared)/.*
  #   volumes:
  #     - type: bind
  #       source: ./auth
  #       target: /app/data
  #     - type: bind
  #       source: /etc/localtime
  #       target: /etc/localtime
  #       read_only: true
    
  traefik:
    image: traefik:2.10
    restart: unless-stopped
    labels:
      - traefik.http.routers.api.rule=PathPrefix(`/api`) || PathPrefix(`/dashboard`)
      - traefik.http.routers.api.service=api@internal
      - traefik.http.middlewares.prefix-strip.stripprefixregex.regex=/[^/]+
    volumes:
      - type: bind
        source: /mnt/user/appdata/traefik
        target: /config
        read_only: true
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true
    ports:
      - "${BREWBLOX_PORT_HTTP:-80}:${BREWBLOX_PORT_HTTP:-80}"
      - "${BREWBLOX_PORT_HTTPS:-443}:${BREWBLOX_PORT_HTTPS:-443}"
      - "${BREWBLOX_PORT_MQTT:-1884}:${BREWBLOX_PORT_MQTT:-1883}"
      - "${BREWBLOX_PORT_MQTTS:-8883}:${BREWBLOX_PORT_MQTTS:-8883}"
    command: >-
      --api.dashboard=true
      --providers.docker=true
      --providers.docker.constraints="LabelRegex(`com.docker.compose.project`, `${COMPOSE_PROJECT_NAME}`)"
      --providers.docker.defaultrule="PathPrefix(`/{{ index .Labels \"com.docker.compose.service\" }}`)"
      --providers.file.directory=/config
      --entrypoints.web.address=:${BREWBLOX_PORT_HTTP}
      --entrypoints.websecure.address=:${BREWBLOX_PORT_HTTPS}
      --entrypoints.websecure.http.tls=true
      --entrypoints.mqtt.address=:${BREWBLOX_PORT_MQTT}/tcp
      --entrypoints.mqtts.address=:${BREWBLOX_PORT_MQTTS}/tcp
  ui:
    image: ghcr.io/brewblox/brewblox-ui:${BREWBLOX_RELEASE}
    restart: unless-stopped
    labels:
      - traefik.http.routers.ui.rule=PathPrefix(`/ui`) || Path(`/`)
    volumes:
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true  
        
  hass:
    image: brewblox/brewblox-hass:edge
    restart: unless-stopped
    command: >-
      --hass-mqtt-host=192.168.1.229
      --hass-mqtt-port=1883
      
  sparkone:
    image: ghcr.io/brewblox/brewblox-devcon-spark:${BREWBLOX_RELEASE}
    volumes:
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true
      - type: bind
        source: /mnt/user/appdata/brewblox
        target: /app/backup
#    volumes:
#      #- /mnt/user/appdata/brewblox
#      - /spark/backup:/app/backup
    privileged: true
    restart: unless-stopped
    command: >-
      --name=sparkone
      --device-id=1C0029001247343339383037
      --device-host=192.168.1.80
      
#   brewblox:
#     url: https://192.168.1.229:37443/                                          # URL of brewblox install
#     fields:                                                        # List of Brewblox services
#       temp: "spark-one/Ferment Beer Sensor/value[degC]"            #   Every item is defined with the brewfather variable as key
#       aux_temp: "spark-one/Ferment Fridge Sensor/value[degC]"      #   and the Brewblox variable name as value
#       ext_temp: "spark-one/Kamertemperatuur sensor/value[degC]"    #   Brewblox variables are formatted as {service}/{field}
#       gravity: "tilt/Blue/Specific gravity"                        # https://github.com/BrewBlox/brewblox-tilt
    
#   brewersfriend:
#     url: https://log.brewersfriend.com/stream/454497935965b2bdf539bfd326a0d09949d1fdc4  # replace with your URL from brewfather settings page (Custom Stream)
#     interval: 900                                              # number of seconds between updates, minimum 900 seconds, 0 stop after run
    
    # Data to be submitted & defaults
#   brewersfrienddata:
#     name: F1               # Device name
#     temp: None             # Beer temp
#     aux_temp: None         # Fridge temp
#     ext_temp: None         # Room temp
#     temp_unit: C           # C, F, K
#     gravity: None          # Gravity
#     gravity_unit: G        # G, P
#     pressure: None         # Pressure
#     pressure_unit: None    # PSI, BAR, KPA
#     ph: None               # pH
#     comment: None          # comment
#     beer: None             # Beer name 

  # {% if config.usb_proxy.enabled %}
  #   usb-proxy:
  #     image: ghcr.io/brewblox/brewblox-usb-proxy:${BREWBLOX_RELEASE}
  #     restart: unless-stopped
  #     privileged: true
  #     labels:
  #       - traefik.enable=false
  #     volumes:
  #       - /dev:/dev
  # #      - type: bind
  # #        source: /dev
  # #        target: /dev
  # {% endif %}
  
  # {% if config.reflector.enabled %}
  # {% for interface in config.reflector.interfaces %}
  #   reflector-{{interface}}:
  #     image: yuxzhu/mdns-reflector:latest
  #     restart: unless-stopped
  #     network_mode: host
  #     command: mdns-reflector -fn4 {{interface}} br-${COMPOSE_PROJECT_NAME}
  #     labels:
  #       - traefik.enable=false
  
  # {% endfor %}
  # {% endif %}
````Preformatted text`



Here are some of the logs.

sparkone-1 | 2024/08/20 09:38:43.526 [I:brewblox_devcon_spark.synchronization:99] prompting handshake…
sparkone-1 | 2024/08/20 09:38:43.540 [I:brewblox_devcon_spark.command:90] name=‘BREWBLOX’ firmware_version=‘39c3cde0’ proto_version=‘e9b2f8b9’ firmware_date=‘2023-02-22’ proto_date=‘2023-02-09’ system_version=‘3.2.0’ platform=‘photon’ reset_reason_hex=‘78’ reset_data_hex=‘00’ device_id=‘1C0029001247343339383037’ reset_reason=‘DFU_MODE’ reset_data=‘NOT_SPECIFIED’
sparkone-1 | 2024/08/20 09:38:43.540 [W:brewblox_devcon_spark.state_machine:130] Handshake error: incompatible firmware
sparkone-1 | 2024/08/20 09:38:43.540 [I:brewblox_devcon_spark.state_machine:156] >>> ACKNOWLEDGED
sparkone-1 | 2024/08/20 09:38:43.540 [I:brewblox_devcon_spark.command:90] name=‘BREWBLOX’ firmware_version=‘39c3cde0’ proto_version=‘e9b2f8b9’ firmware_date=‘2023-02-22’ proto_date=‘2023-02-09’ system_version=‘3.2.0’ platform=‘photon’ reset_reason_hex=‘78’ reset_data_hex=‘00’ device_id=‘1C0029001247343339383037’ reset_reason=‘DFU_MODE’ reset_data=‘NOT_SPECIFIED’
sparkone-1 | 2024/08/20 09:38:43.540 [W:brewblox_devcon_spark.state_machine:130] Handshake error: incompatible firmware
sparkone-1 | 2024/08/20 09:38:43.540 [I:brewblox_devcon_spark.state_machine:156] >>> ACKNOWLEDGED
sparkone-1 | 2024/08/20 09:38:43.540 [E:brewblox_devcon_spark.synchronization:67] Sync subroutine failed: sync handshake - IncompatibleFirmware(424: )
sparkone-1 | 2024/08/20 09:38:43.540 [E:brewblox_devcon_spark.synchronization:194] Incompatible firmware version detected

I hope that makes sense.

The firmware on your Spark is not compatible with your current version of Brewblox. You must update the Spark firmware. Do you see an option to do so from the Dashboard? Can you show us a screenshot?

I’ve been able to do it through the UI in the past but since I updated the docker containers all I get is waiting for datastore.

Navigate to the Admin tab and attach a screenshot of what you see under “Services”.

There isn’t an option, or a way to select services…
There used to be a way for me to see the Spark controller whether the firmware was updated to date or not.

Can you confirm your Spark IP address is still 192.168.1.80?

It looks like it’s correct.

This feels reminiscent of an issue I’ve had in the past. I remember grabbing a Raspberry Pi and plugging in the Spark over USB to flash the firmware. I also run my Brewblox instance remotely in a virtual machine. Not sure if there is any other option to update the firmware other than USB.

I’m using docker right now and it’s plugged into the host machine. I’m not sure I have any more pi’s around to see if that works. I was hoping it was an issue with my compose file or an issue with the container that would be an easy update.

The error in the log shows incompatible firmware, so I’m inclined to follow that.

In light of the fact that you have it connected over USB, I would try to follow their documentation here:

Are you not using brewblox-ctl to manage your install? Your compose is out of date compared to the current version: brewblox-ctl/brewblox_ctl/templates/docker-compose.shared.yml.j2 at develop · BrewBlox/brewblox-ctl · GitHub

Why have you commented the auth service?
It must be running. If stopping the auth service would disable authentication, that would be very bad design. That is why it is disabled with a flag and not the existence of the service.

I’ve tried the brewblox-ctl but Unraid only allows admin rights to login and run commands via terminal and when I try to use brewblox-ctl I always get errors due to trying to run it via root.

I saw the updated docker-compose but the spark container was removed and didn’t move much past that. Do I still need to add it in?

Here is what my compose currenlty looks like. WIth the updated compose, the UI isn’t loading.


# DO NOT EDIT: THIS FILE WILL BE RESET DURING UPDATES
#
# This file contains configuration for the shared Brewblox services
#
# If you need to make change to any of the shared services,
# you can do so in docker-compose.yml.
#
# For more information, see https://docs.docker.com/compose/extends/

networks:
  default:
    driver_opts:
      com.docker.network.bridge.name: br-${COMPOSE_PROJECT_NAME}

services:
  eventbus:
    image: ghcr.io/brewblox/mosquitto:${BREWBLOX_RELEASE}
    restart: unless-stopped
    labels:
      # MQTT
      - traefik.tcp.routers.mqtt.entrypoints=mqtt
      - traefik.tcp.routers.mqtt.rule=HostSNI(`*`)
      - traefik.tcp.routers.mqtt.tls=false
      - traefik.tcp.routers.mqtt.service=mqtt
      - traefik.tcp.services.mqtt.loadBalancer.server.port=1883
      # MQTTS with TLS termination by traefik
      - traefik.tcp.routers.mqtts.entrypoints=mqtts
      - traefik.tcp.routers.mqtts.rule=HostSNI(`*`)
      - traefik.tcp.routers.mqtts.tls=true
      - traefik.tcp.routers.mqtts.service=mqtts
      - traefik.tcp.services.mqtts.loadBalancer.server.port=1884
      # MQTT over websockets
      - traefik.http.services.eventbus.loadbalancer.server.port=15675
    volumes:
      - type: bind
        source: /mnt/user/appdata/mosquitto
        target: /mosquitto/include
        
  victoria:
    image: victoriametrics/victoria-metrics:v1.98.0
    restart: unless-stopped
    command: >- 
      --envflag.enable=true 
      --envflag.prefix=VM_
      --retentionPeriod=100y
      --influxMeasurementFieldSeparator=/
      --http.pathPrefix=/victoria
      --search.latencyOffset=10s
    labels:
      - traefik.http.services.victoria.loadbalancer.server.port=8428
    environment:
      - VM_http_pathPrefix=/victoria
      - VM_influxMeasurementFieldSeparator=/
      - VM_retentionPeriod={{ config.victoria.retention }}
      - VM_search_latencyOffset={{ config.victoria.search_latency }}
    volumes:
      - type: bind
        source: /mnt/user/appdata/victoria
        target: /victoria-metrics-data
      
  redis:
    image: redis:6.0
    restart: unless-stopped
    labels:
      - traefik.enable=false
    volumes:
      - type: bind
        source: /mnt/user/appdata/redis
        target: /data
    command: --appendonly yes
    
  history:
    image: ghcr.io/brewblox/brewblox-history:${BREWBLOX_RELEASE}
    restart: unless-stopped
    volumes:
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true

  auth:
    image: ghcr.io/brewblox/brewblox-auth:${BREWBLOX_RELEASE}
    restart: unless-stopped
    environment:
      - BREWBLOX_AUTH_ENABLED={{ config.auth.enabled }}
      - BREWBLOX_AUTH_IGNORE=/|/(ui|shared)/.*
    volumes:
      - type: bind
        source: ./auth
        target: /app/data
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true
    
  traefik:
    image: traefik:2.10
    restart: unless-stopped
    command: --configFile={{ config.traefik.static_config_file }}
    volumes:
      - type: bind
        source: /mnt/user/appdata/traefik
        target: /config
        read_only: true
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true
    ports:
      - "${BREWBLOX_PORT_HTTP:-80}:${BREWBLOX_PORT_HTTP:-80}"
      - "${BREWBLOX_PORT_HTTPS:-443}:${BREWBLOX_PORT_HTTPS:-443}"
      - "${BREWBLOX_PORT_MQTT:-1884}:${BREWBLOX_PORT_MQTT:-1883}"
      - "${BREWBLOX_PORT_MQTTS:-8883}:${BREWBLOX_PORT_MQTTS:-8883}"
      
  ui:
    image: ghcr.io/brewblox/brewblox-ui:${BREWBLOX_RELEASE}
    restart: unless-stopped
    labels:
      - traefik.http.routers.ui.rule=PathPrefix(`/ui`) || PathPrefix(`/static`) || Path(`/`)
    volumes:
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true
      - type: bind
        source: ./traefik/minica.pem
        target: /var/www/static/minica.pem
        read_only: true
      - type: bind
        source: ./traefik/minica.der
        target: /var/www/static/minica.der
        read_only: true

        
  # hass:
  #   image: brewblox/brewblox-hass:edge
  #   restart: unless-stopped
  #   command: >-
  #     --hass-mqtt-host=192.168.1.229
  #     --hass-mqtt-port=1883
      
#   sparkone:
#     image: ghcr.io/brewblox/brewblox-devcon-spark:${BREWBLOX_RELEASE}
#     volumes:
#       - type: bind
#         source: /etc/localtime
#         target: /etc/localtime
#         read_only: true
#       - type: bind
#         source: /mnt/user/appdata/brewblox
#         target: /app/backup
# #    volumes:
# #      #- /mnt/user/appdata/brewblox
# #      - /spark/backup:/app/backup
#     privileged: true
#     restart: unless-stopped
#     command: >-
#       --name=sparkone
#       --device-id=1C0029001247343339383037
#       --device-host=192.168.1.80

We have a docker-compose.shared.yml file, which is managed by us and can be overwritten.
We also have docker-compose.yml, which contains the non-system containers, usually the just the decvon-spark services.

For reference, this is my docker-compose.shared.yml:

# DO NOT EDIT: THIS FILE WILL BE RESET DURING UPDATES
#
# This file contains configuration for the shared Brewblox services
#
# If you need to make change to any of the shared services,
# you can do so in docker-compose.yml.
#
# For more information, see https://docs.docker.com/compose/extends/

networks:
  default:
    driver_opts:
      com.docker.network.bridge.name: br-${COMPOSE_PROJECT_NAME}

services:
  eventbus:
    image: ghcr.io/brewblox/mosquitto:${BREWBLOX_RELEASE}
    restart: unless-stopped
    labels:
      # MQTT
      - traefik.tcp.routers.mqtt.entrypoints=mqtt
      - traefik.tcp.routers.mqtt.rule=HostSNI(`*`)
      - traefik.tcp.routers.mqtt.tls=false
      - traefik.tcp.routers.mqtt.service=mqtt
      - traefik.tcp.services.mqtt.loadBalancer.server.port=1883
      # MQTTS with TLS termination by traefik
      - traefik.tcp.routers.mqtts.entrypoints=mqtts
      - traefik.tcp.routers.mqtts.rule=HostSNI(`*`)
      - traefik.tcp.routers.mqtts.tls=true
      - traefik.tcp.routers.mqtts.service=mqtts
      - traefik.tcp.services.mqtts.loadBalancer.server.port=1884
      # MQTT over websockets
      - traefik.http.services.eventbus.loadbalancer.server.port=15675
    volumes:
      - type: bind
        source: ./mosquitto
        target: /mosquitto/include

  victoria:
    image: victoriametrics/victoria-metrics:v1.98.0
    restart: unless-stopped
    command: --envflag.enable=true --envflag.prefix=VM_
    labels:
      - traefik.http.services.victoria.loadbalancer.server.port=8428
    environment:
      - VM_http_pathPrefix=/victoria
      - VM_influxMeasurementFieldSeparator=/
      - VM_retentionPeriod=100y
      - VM_search_latencyOffset=10s
    volumes:
      - type: bind
        source: ./victoria
        target: /victoria-metrics-data

  redis:
    image: redis:6.0
    restart: unless-stopped
    labels:
      - traefik.enable=false
    volumes:
      - type: bind
        source: ./redis
        target: /data
    command: --appendonly yes

  history:
    image: ghcr.io/brewblox/brewblox-history:${BREWBLOX_RELEASE}
    restart: unless-stopped
    volumes:
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true

  auth:
    image: ghcr.io/brewblox/brewblox-auth:${BREWBLOX_RELEASE}
    restart: unless-stopped
    environment:
      - BREWBLOX_AUTH_ENABLED=False
      - BREWBLOX_AUTH_IGNORE=/|/(ui|shared)/.*
    volumes:
      - type: bind
        source: ./auth
        target: /app/data
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true

  traefik:
    image: traefik:2.10
    restart: unless-stopped
    command: --configFile=/config/traefik.yml
    volumes:
      - type: bind
        source: ./traefik
        target: /config
        read_only: true
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true
    ports:
      - "80:80"
      - "443:443"
      - "1883:1883"
      - "8883:8883"
      - "127.0.0.1:9600:9600"

  ui:
    image: ghcr.io/brewblox/brewblox-ui:${BREWBLOX_RELEASE}
    restart: unless-stopped
    labels:
      - traefik.http.routers.ui.rule=PathPrefix(`/ui`) || PathPrefix(`/static`) || Path(`/`)
    volumes:
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true
      - type: bind
        source: ./traefik/minica.pem
        target: /var/www/static/minica.pem
        read_only: true
      - type: bind
        source: ./traefik/minica.der
        target: /var/www/static/minica.der
        read_only: true


  reflector-enp0s31f6:
    image: yuxzhu/mdns-reflector:latest
    restart: on-failure:3
    network_mode: host
    command: mdns-reflector -fn4 enp0s31f6 br-${COMPOSE_PROJECT_NAME}
    labels:
      - traefik.enable=false

You don’t need the reflector if you don’t use MDNS.
We now use jinja templates for the compose files, so many environment variables are gone.

The docker-compose file just adds a spark service, for example:

  spark4c:
    image: ghcr.io/brewblox/brewblox-devcon-spark:${BREWBLOX_RELEASE}
    privileged: true
    restart: unless-stopped
    environment:
    - BREWBLOX_SPARK_DISCOVERY=all
    - BREWBLOX_SPARK_DEVICE_ID=c4dd5766e7e8
    volumes:
    - type: bind
      source: /etc/localtime
      target: /etc/localtime
      read_only: true
    - type: bind
      source: ./spark/backup
      target: /app/backup

I see in your file, the MQTT port is different in traefik, perhaps just hardcode the ports like my file.
You also still have some templated placeholders between {{ }} that jinja replaces with the actual config.

I suggest copying mine and updating the mounts.

I’ve been able to redo the docker compose and updating the mounts. All the containers are up and running but I’m still not able to access the UI. I also noticed that there isn’t an environment variable to define the Spark IP address. Does the Discovery=all do that instead?

Here is the updated docker compose.

# DO NOT EDIT: THIS FILE WILL BE RESET DURING UPDATES
#
# This file contains configuration for the shared Brewblox services
#
# If you need to make change to any of the shared services,
# you can do so in docker-compose.yml.
#
# For more information, see https://docs.docker.com/compose/extends/

networks:
  default:
    driver_opts:
      com.docker.network.bridge.name: br-${COMPOSE_PROJECT_NAME}

services:
  eventbus:
    image: ghcr.io/brewblox/mosquitto:${BREWBLOX_RELEASE}
    restart: unless-stopped
    labels:
      # MQTT
      - traefik.tcp.routers.mqtt.entrypoints=mqtt
      - traefik.tcp.routers.mqtt.rule=HostSNI(`*`)
      - traefik.tcp.routers.mqtt.tls=false
      - traefik.tcp.routers.mqtt.service=mqtt
      - traefik.tcp.services.mqtt.loadBalancer.server.port=1883
      # MQTTS with TLS termination by traefik
      - traefik.tcp.routers.mqtts.entrypoints=mqtts
      - traefik.tcp.routers.mqtts.rule=HostSNI(`*`)
      - traefik.tcp.routers.mqtts.tls=true
      - traefik.tcp.routers.mqtts.service=mqtts
      - traefik.tcp.services.mqtts.loadBalancer.server.port=1884
      # MQTT over websockets
      - traefik.http.services.eventbus.loadbalancer.server.port=15675
    volumes:
      - type: bind
        source: /mnt/user/appdata/mosquitto
        target: /mosquitto/include

  victoria:
    image: victoriametrics/victoria-metrics:v1.98.0
    restart: unless-stopped
    command: --envflag.enable=true --envflag.prefix=VM_
    labels:
      - traefik.http.services.victoria.loadbalancer.server.port=8428
    environment:
      - VM_http_pathPrefix=/victoria
      - VM_influxMeasurementFieldSeparator=/
      - VM_retentionPeriod=100y
      - VM_search_latencyOffset=10s
    volumes:
      - type: bind
        source: /mnt/user/appdata/victoria
        target: /victoria-metrics-data

  redis:
    image: redis:6.0
    restart: unless-stopped
    labels:
      - traefik.enable=false
    volumes:
      - type: bind
        source: /mnt/user/appdata/redis
        target: /data
    command: --appendonly yes

  history:
    image: ghcr.io/brewblox/brewblox-history:${BREWBLOX_RELEASE}
    restart: unless-stopped
    volumes:
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true

  auth:
    image: ghcr.io/brewblox/brewblox-auth:${BREWBLOX_RELEASE}
    restart: unless-stopped
    environment:
      - BREWBLOX_AUTH_ENABLED=False
      - BREWBLOX_AUTH_IGNORE=/|/(ui|shared)/.*
    volumes:
      - type: bind
        source: /mnt/user/appdata/brewblox
        target: /app/data
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true

  traefik:
    image: traefik:2.10
    restart: unless-stopped
    command: --configFile=/config/traefik.yml
    volumes:
      - type: bind
        source: /mnt/user/appdata/traefik
        target: /config
        read_only: true
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true
    ports:
      - "70:80"
      - "9443:443"
      - "1885:1883"
      - "8883:8883"
      - "127.0.0.1:9600:9600"

  ui:
    image: ghcr.io/brewblox/brewblox-ui:${BREWBLOX_RELEASE}
    restart: unless-stopped
    labels:
      - traefik.http.routers.ui.rule=PathPrefix(`/ui`) || PathPrefix(`/static`) || Path(`/`)
    volumes:
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true
      - type: bind
        source: ./traefik/minica.pem
        target: /var/www/static/minica.pem
        read_only: true
      - type: bind
        source: ./traefik/minica.der
        target: /var/www/static/minica.der
        read_only: true

  sparkone:
      image: ghcr.io/brewblox/brewblox-devcon-spark:${BREWBLOX_RELEASE}
      privileged: true
      restart: unless-stopped
      environment:
      - BREWBLOX_SPARK_DISCOVERY=all
      - BREWBLOX_SPARK_DEVICE_ID=1C0029001247343339383037
      volumes:
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true
      - type: bind
        source: /mnt/user/appdata/brewblox/backup
        target: /app/backup

For a fixed IP setup that doesn’t require MDNS reflection:
- BREWBLOX_SPARK_DEVICE_HOST=192.168.1.xxx

What do you have in the docker logs for the auth service and traefik?

When I go to the http url I get a 404 error but when I go to https I get site can’t be reached.

Here are the logs.

For the auth container:

INFO:     Will watch for changes in these directories: ['/app/data']
INFO:     Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit)
INFO:     Started reloader process [1] using WatchFiles

For all the containers:

eventbus-1 | 1724269172: mosquitto version 2.0.18 starting
sparkone-1 | 2024/08/21 14:39:34.561 [I:brewblox_devcon_spark.app_factory:88] name='sparkone' debug=False trace=False debugger=False mqtt_protocol='mqtt' mqtt_host='eventbus' mqtt_port=1883 state_topic='brewcast/state' history_topic='brewcast/history' datastore_topic='brewcast/datastore' blocks_topic='brewcast/spark/blocks' http_client_interval=datetime.timedelta(seconds=1) http_client_interval_max=datetime.timedelta(seconds=60) http_client_backoff=1.1 datastore_host='history' datastore_port=5000 datastore_path='/history/datastore' datastore_fetch_timeout=datetime.timedelta(seconds=300) datastore_flush_delay=datetime.timedelta(seconds=5) datastore_shutdown_timeout=datetime.timedelta(seconds=2) device_id='1C0029001247343339383037' discovery= device_host='192.168.1.80' device_port=8332 usb_proxy_host='usb-proxy' usb_proxy_port=5000 mock=False simulation=False simulation_port=45909 simulation_display_port=46743 simulation_workdir=Po:5000/history/datastore'
redis-1 | 1:C 21 Aug 2024 19:39:32.212 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
sparkone-1 | 2024/08/21 14:39:34.579 [I:brewblox_devcon_spark.synchronization:148] Service temperature unit set to degF
redis-1 | 1:C 21 Aug 2024 19:39:32.212 # Redis version=6.0.20, bits=64, commit=00000000, modified=0, pid=1, just started
eventbus-1 | 1724269172: Config loaded from /mosquitto/config/mosquitto.conf.
redis-1 | 1:C 21 Aug 2024 19:39:32.212 # Configuration loaded
redis-1 | 1:M 21 Aug 2024 19:39:32.214 * Running mode=standalone, port=6379.
eventbus-1 | 1724269172: Warning: File /mosquitto/include/externals.passwd has world readable permissions. Future versions will refuse to load this file.
eventbus-1 | To fix this, use `chmod 0700 /mosquitto/include/externals.passwd`.
victoria-1 | 2024-08-21T19:39:32.824Z info VictoriaMetrics/lib/logger/flag.go:12 build version: victoria-metrics-20240214-141427-tags-v1.98.0-0-gbaaa88001
victoria-1 | 2024-08-21T19:39:32.824Z info VictoriaMetrics/lib/logger/flag.go:13 command-line flags
victoria-1 | 2024-08-21T19:39:32.824Z info VictoriaMetrics/lib/logger/flag.go:20 -envflag.enable="true"
eventbus-1 | 1724269172: Opening ipv4 listen socket on port 1883.
victoria-1 | 2024-08-21T19:39:32.824Z info VictoriaMetrics/lib/logger/flag.go:20 -envflag.prefix="VM_"
eventbus-1 | 1724269172: Opening ipv4 listen socket on port 1884.
eventbus-1 | 1724269172: Opening websockets listen socket on port 15675.
eventbus-1 | 1724269172: mosquitto version 2.0.18 running
redis-1 | 1:M 21 Aug 2024 19:39:32.214 # Server initialized
victoria-1 | 2024-08-21T19:39:32.824Z info VictoriaMetrics/lib/logger/flag.go:20 -http.pathPrefix="/victoria"
victoria-1 | 2024-08-21T19:39:32.824Z info VictoriaMetrics/lib/logger/flag.go:20 -influxMeasurementFieldSeparator="/"
redis-1 | 1:M 21 Aug 2024 19:39:32.214 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
sparkone-1 | 2024/08/21 14:39:34.595 [I:brewblox_devcon_spark.state_machine:100] >>> CONNECTED (TCP)
redis-1 | 1:M 21 Aug 2024 19:39:32.214 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo madvise > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled (set to 'madvise' or 'never').
redis-1 | 1:M 21 Aug 2024 19:39:32.255 * DB loaded from append only file: 0.040 seconds
redis-1 | 1:M 21 Aug 2024 19:39:32.255 * Ready to accept connections
sparkone-1 | 2024/08/21 14:39:34.595 [I:brewblox_devcon_spark.synchronization:99] prompting handshake...
sparkone-1 | 2024/08/21 14:39:34.623 [I:brewblox_devcon_spark.command:90] name='BREWBLOX' firmware_version='39c3cde0' proto_version='e9b2f8b9' firmware_date='2023-02-22' proto_date='2023-02-09' system_version='3.2.0' platform='photon' reset_reason_hex='78' reset_data_hex='00' device_id='1C0029001247343339383037' reset_reason='DFU_MODE' reset_data='NOT_SPECIFIED'
sparkone-1 | 2024/08/21 14:39:34.623 [W:brewblox_devcon_spark.state_machine:130] Handshake error: incompatible firmware
sparkone-1 | 2024/08/21 14:39:34.623 [I:brewblox_devcon_spark.state_machine:156] >>> ACKNOWLEDGED
sparkone-1 | 2024/08/21 14:39:34.623 [I:brewblox_devcon_spark.command:90] name='BREWBLOX' firmware_version='39c3cde0' proto_version='e9b2f8b9' firmware_date='2023-02-22' proto_date='2023-02-09' system_version='3.2.0' platform='photon' reset_reason_hex='78' reset_data_hex='00' device_id='1C0029001247343339383037' reset_reason='DFU_MODE' reset_data='NOT_SPECIFIED'
sparkone-1 | 2024/08/21 14:39:34.623 [W:brewblox_devcon_spark.state_machine:130] Handshake error: incompatible firmware
sparkone-1 | 2024/08/21 14:39:34.623 [I:brewblox_devcon_spark.state_machine:156] >>> ACKNOWLEDGED
sparkone-1 | 2024/08/21 14:39:34.623 [E:brewblox_devcon_spark.synchronization:67] Sync subroutine failed: sync handshake - IncompatibleFirmware(424: )
sparkone-1 | 2024/08/21 14:39:34.623 [E:brewblox_devcon_spark.synchronization:194] Incompatible firmware version detected
victoria-1 | 2024-08-21T19:39:32.824Z info VictoriaMetrics/lib/logger/flag.go:20 -retentionPeriod="100y"
victoria-1 | 2024-08-21T19:39:32.824Z info VictoriaMetrics/lib/logger/flag.go:20 -search.latencyOffset="10s"
victoria-1 | 2024-08-21T19:39:32.824Z info VictoriaMetrics/app/victoria-metrics/main.go:73 starting VictoriaMetrics at "[:8428]"...
victoria-1 | 2024-08-21T19:39:32.824Z info VictoriaMetrics/app/vmstorage/main.go:106 opening storage at "victoria-metrics-data" with -retentionPeriod=100y
victoria-1 | 2024-08-21T19:39:32.840Z info VictoriaMetrics/lib/memory/memory.go:42 limiting caches to 80994506342 bytes, leaving 53996337562 bytes to the OS according to -memory.allowedPercent=60
victoria-1 | 2024-08-21T19:39:34.707Z info VictoriaMetrics/app/vmstorage/main.go:120 successfully opened storage "victoria-metrics-data" in 1.882 seconds; partsCount: 442; blocksCount: 65912; rowsCount: 378470277; sizeBytes: 545181954
victoria-1 | 2024-08-21T19:39:34.710Z info VictoriaMetrics/app/vmselect/promql/rollup_result_cache.go:126 loading rollupResult cache from "victoria-metrics-data/cache/rollupResult"...
victoria-1 | 2024-08-21T19:39:34.724Z info VictoriaMetrics/app/vmselect/promql/rollup_result_cache.go:155 loaded rollupResult cache from "victoria-metrics-data/cache/rollupResult" in 0.014 seconds; entriesCount: 0, sizeBytes: 0
victoria-1 | 2024-08-21T19:39:34.724Z info VictoriaMetrics/app/victoria-metrics/main.go:84 started VictoriaMetrics in 1.900 seconds
history-1 | 2024/08/21 14:39:33.209 [I:brewblox_history.app_factory:49] name='history' debug=False debugger=False mqtt_protocol='mqtt' mqtt_host='eventbus' mqtt_port=1883 redis_host='redis' redis_port=6379 victoria_protocol='http' victoria_host='victoria' victoria_port=8428 victoria_path='/victoria' history_topic='brewcast/history' datastore_topic='brewcast/datastore' ranges_interval=datetime.timedelta(seconds=10) metrics_interval=datetime.timedelta(seconds=10) minimum_step=datetime.timedelta(seconds=10) query_duration_default=datetime.timedelta(days=1) query_desired_points=1000
victoria-1 | 2024-08-21T19:39:34.724Z info VictoriaMetrics/lib/httpserver/httpserver.go:117 starting server at http://127.0.0.1:8428/
victoria-1 | 2024-08-21T19:39:34.724Z info VictoriaMetrics/lib/httpserver/httpserver.go:118 pprof handlers are exposed at http://127.0.0.1:8428/debug/pprof/
auth-1 | INFO: Will watch for changes in these directories: ['/app/data']
auth-1 | INFO: Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit)
traefik-1 | time="2024-08-21T14:39:33-05:00" level=info msg="Configuration loaded from flags."
auth-1 | INFO: Started reloader process [1] using WatchFiles
ui-1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
ui-1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
ui-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
ui-1 | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
ui-1 | 10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf differs from the packaged version
ui-1 | /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
ui-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
ui-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
ui-1 | /docker-entrypoint.sh: Configuration complete; ready for start up
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: using the "epoll" event method
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: nginx/1.27.0
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: built by gcc 13.2.1 20231014 (Alpine 13.2.1_git20231014)
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: OS: Linux 6.1.99-Unraid
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 40960:40960
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker processes
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 29
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 30
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 31
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 32
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 33
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 34
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 35
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 36
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 37
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 38
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 39
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 40
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 41
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 42
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 43
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 44
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 45
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 46
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 47
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 48
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 49
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 50
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 51
ui-1 | 2024/08/21 14:39:32 [notice] 1#1: start worker process 52

On my nas, I run brewblox on a 8080/8443 instead of 80/443 and the traefik port mapping in the docker file is

ports:
      - "8080:8080"
      - "8443:8443"
      - "1883:1883"
      - "8883:8883"
      - "127.0.0.1:9600:9600"

our ctl tool migrates the env settings to config settings here:

And then regenerates the config files with the templates.

I think maybe your traefik config files might need to be updated and your docker-compose.yml to not remap the ports. Here is my traefik.yml. I do not have MQTT on custom ports, only http/https.

Traefik proxies to the right container and is configured to run on these ports instead of docker remapping them.

# DO NOT EDIT: THIS FILE WILL BE RESET DURING UPDATES
#
# This file contains static configuration for the Traefik proxy.
# It is generated using the brewblox.yml settings.
#
# If you need to replace it with custom configuration,
# you can set a custom value for `traefik.static_config_file` in brewblox.yml.
#
# For more information, see: https://doc.traefik.io/traefik/getting-started/configuration-overview/#the-static-configuration

api:
  dashboard: true
providers:
  docker:
    constraints: "LabelRegex(`com.docker.compose.project`, `brewblox`)"
    defaultRule: 'PathPrefix(`/{{ index .Labels "com.docker.compose.service" }}`)'
  file:
    directory: /config/dynamic
entryPoints:
  websecure:
    address: :8443
    http:
      tls: True
      middlewares:
        - cors@file
        - auth@file
  web:
    address: :8080
    http:
      middlewares:
        - cors@file
        - auth@file
      redirections:
        entryPoint:
          to: websecure
  admin:
    address: :9600
    http:
      middlewares:
        - cors@file
  mqtt:
    address: :1883/tcp
  mqtts:
    address: :8883/tcp

@Bob_Steers stopped working at Brewblox last month, but might still be able to give some insight.

All templates are here:

The traefik dynamic config doesn’t have any templated parameters for now, but it should be present (traefik/dynamic/brewblox-provider.yml).

This is likely what’s causing you problems. Traefik expects container and host ports to match, otherwise redirects get lost. You want to use 70:70, 9443:9443, and 1885:1885, and then to apply those ports in traefik static config at /mnt/user/appdata/traefik/traefik.yml.

Thanks. I’m still only getting 404 errors. I’m sure it’s user error on my side…

Here are my docker compose files and the Traefik static file

Docker:

# DO NOT EDIT: THIS FILE WILL BE RESET DURING UPDATES
#
# This file contains configuration for the shared Brewblox services
#
# If you need to make change to any of the shared services,
# you can do so in docker-compose.yml.
#
# For more information, see https://docs.docker.com/compose/extends/

networks:
  default:
    driver_opts:
      com.docker.network.bridge.name: br-${COMPOSE_PROJECT_NAME}

services:
  eventbus:
    image: ghcr.io/brewblox/mosquitto:${BREWBLOX_RELEASE}
    restart: unless-stopped
    labels:
      # MQTT
      - traefik.tcp.routers.mqtt.entrypoints=mqtt
      - traefik.tcp.routers.mqtt.rule=HostSNI(`*`)
      - traefik.tcp.routers.mqtt.tls=false
      - traefik.tcp.routers.mqtt.service=mqtt
      - traefik.tcp.services.mqtt.loadBalancer.server.port=1883
      # - traefik.tcp.services.mqtt.loadBalancer.server.port=1885
      # MQTTS with TLS termination by traefik
      - traefik.tcp.routers.mqtts.entrypoints=mqtts
      - traefik.tcp.routers.mqtts.rule=HostSNI(`*`)
      - traefik.tcp.routers.mqtts.tls=true
      - traefik.tcp.routers.mqtts.service=mqtts
      - traefik.tcp.services.mqtts.loadBalancer.server.port=1884
      # - traefik.tcp.services.mqtts.loadBalancer.server.port=8883
      # MQTT over websockets
      - traefik.http.services.eventbus.loadbalancer.server.port=15675
    volumes:
      - type: bind
        source: /mnt/user/appdata/brewblox/mosquitto
        target: /mosquitto/include

  victoria:
    image: victoriametrics/victoria-metrics:v1.98.0
    restart: unless-stopped
    command: --envflag.enable=true --envflag.prefix=VM_
    labels:
      - traefik.http.services.victoria.loadbalancer.server.port=8428
    environment:
      - VM_http_pathPrefix=/victoria
      - VM_influxMeasurementFieldSeparator=/
      - VM_retentionPeriod=100y
      - VM_search_latencyOffset=10s
    volumes:
      - type: bind
        source: /mnt/user/appdata/brewblox/victoria
        target: /victoria-metrics-data

  redis:
    image: redis:6.0
    restart: unless-stopped
    labels:
      - traefik.enable=false
    volumes:
      - type: bind
        source: /mnt/user/appdata/brewblox/redis
        target: /data
    command: --appendonly yes

  history:
    image: ghcr.io/brewblox/brewblox-history:${BREWBLOX_RELEASE}
    restart: unless-stopped
    volumes:
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true

  auth:
    image: ghcr.io/brewblox/brewblox-auth:${BREWBLOX_RELEASE}
    restart: unless-stopped
    environment:
      - BREWBLOX_AUTH_ENABLED=False
      - BREWBLOX_AUTH_IGNORE=/|/(ui|shared)/.*
    volumes:
      - type: bind
        source: /mnt/user/appdata/brewblox
        target: /app/data
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true

  traefik:
    image: traefik:2.10
    restart: unless-stopped
    command: --configFile=/config/traefik.yml
    volumes:
      - type: bind
        source: /mnt/user/appdata/brewblox/traefik
        target: /config
        read_only: true
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true
    ports:
      - "70:70"
      - "9443:9443"
      - "1885:1885"
      - "8883:8883"
      - "127.0.0.1:9600:9600"

  ui:
    image: ghcr.io/brewblox/brewblox-ui:${BREWBLOX_RELEASE}
    # image: brewblox/brewblox-ui:fix-ipv6-listen
    restart: unless-stopped
    labels:
      - traefik.http.routers.ui.rule=PathPrefix(`/ui`) || PathPrefix(`/static`) || Path(`/`)
    volumes:
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
        read_only: true
      - type: bind
        source: /mnt/user/appdata/brewblox/traefik/minica.pem
        target: /var/www/static/minica.pem
        read_only: true
      - type: bind
        source: /mnt/user/appdata/brewblox/traefik/minica.der
        target: /var/www/static/minica.der
        read_only: true

  sparkone:
    image: ghcr.io/brewblox/brewblox-devcon-spark:${BREWBLOX_RELEASE}
    privileged: true
    restart: unless-stopped
    environment:
    - BREWBLOX_SPARK_DISCOVERY=all
    - BREWBLOX_SPARK_DEVICE_ID=1C0029001247343339383037
    - BREWBLOX_SPARK_DEVICE_HOST=192.168.1.80
    volumes:
    - type: bind
      source: /etc/localtime
      target: /etc/localtime
      read_only: true
    - type: bind
      source: /mnt/user/appdata/brewblox/backup
      target: /app/backup
        
  # hass:
  #     image: ghcr.io/brewblox/brewblox-hass:${BREWBLOX_RELEASE}
  #     restart: unless-stopped
  #     environment:
  #       - BREWBLOX_HASS_HASS_MQTT_HOST=192.168.1.229

Traefik Static:

# DO NOT EDIT: THIS FILE WILL BE RESET DURING UPDATES
#
# This file contains static configuration for the Traefik proxy.
# It is generated using the brewblox.yml settings.
#
# If you need to replace it with custom configuration,
# you can set a custom value for `traefik.static_config_file` in brewblox.yml.
#
# For more information, see: https://doc.traefik.io/traefik/getting-started/configuration-overview/#the-static-configuration

api:
  dashboard: true
providers:
  docker:
    constraints: "LabelRegex(`com.docker.compose.project`, `{{ config.compose.project }}`)"
    defaultRule: 'PathPrefix(`/{% raw %}{{ index .Labels "com.docker.compose.service" }}{% endraw %}`)'
  file:
    directory: /config/static
entryPoints:
  websecure:
    address: :9443
    http:
      tls: True
      middlewares:
        - cors@file
        - auth@file
#   web:
#     address: :70
#     http:
#       middlewares:
#         - cors@file
#         - auth@file
# # {% if config.traefik.redirect_http %}
#       redirections:
#         entryPoint:
#           to: websecure
# # {% endif %}

  web:
    address: :70
    http:
      middlewares:
        - cors@file
        - auth@file
      redirections:
        entryPoint:
          to: websecure

  admin:
    address: :9600
    http:
      middlewares:
        - cors@file
  mqtt:
    address: :1885/tcp
  mqtts:
    address: :8883/tcp

I’m still trying to get this working. Now I have an error message, how can I get the auth@file created?

time="2024-08-28T13:12:54-05:00" level=info msg="Configuration loaded from file: /config/traefik.yml"
time="2024-08-28T13:12:54-05:00" level=error msg="middleware \"auth@file\" does not exist" entryPointName=web routerName=web-to-websecure@internal
time="2024-08-28T13:12:54-05:00" level=error msg="middleware \"auth@file\" does not exist" entryPointName=web routerName=web-to-websecure@internal