OTBR Docker issues connecting to ZBT-1

I’m attempting to setup the OTBR docker container as I am running HA docker. I have attached my OTBR docker compose file. I did go to the home assistant website and update the firmware to the newest version before attempting this.

My problem is that although it sometimes seems it is talking to the ZBT-1 correctly I can never connect to the web interface and I’m not sure why I have tried to change the port from 8080 to 8180 as I thought there could be some type of interference from another container, but nothing seems to be working. I’m fairly confident that my device passthrough is working as I initially tested it on the HA docker container and it recognized the device although it told me to add it to OTBR.

I have also attached the logs and any help or knowledge would be helpful.

OTBR Docker Compose:

version: '3.8'
services:
  otbr:
    image: openthread/otbr:latest
    container_name: otbr
    hostname: otbr
    restart: unless-stopped
    devices:
      - "/dev/serial/by-id/usb-Nabu_Casa_Home_Assistant_Connect_ZBT-1_a6c7b1cd7e39ef11ba5b59f454516304-if00-port0"
    privileged: true
    group_add:
      - dialout
    cap_add:
      - NET_ADMIN
      - SYS_ADMIN
      - SYS_MODULE
    environment:
      - OTBR_WEB_SERVICE_PORT=8080
      - OTBR_AGENT_PORT=49191
      - OTBR_INTERFACE_NAME=eth0
      - OTBR_RADIO_URL=spinel+hdlc+uart:///dev/ttyUSB0?uart-baudrate=115200
    volumes:
      - /DATA/AppData/otbr:/etc/otbr
      - /lib/modules:/lib/modules:ro
    network_mode: "host"
    command: sh -c "rm -f /var/run/otbr-*.pid && exec /init"
    extra_hosts:
      - "otbr:127.0.0.1"

volumes:
  otbr_data:

Logs:

otbr  | Members:
otbr  | + ipset destroy otbr-ingress-deny-src
otbr  | + ipset_destroy_if_exist otbr-ingress-deny-src-swap
otbr  | + ipset list otbr-ingress-deny-src-swap
otbr  | Name: otbr-ingress-deny-src-swap
otbr  | Type: hash:net
otbr  | Revision: 6
otbr  | Header: family inet6 hashsize 1024 maxelem 65536
otbr  | Size in memory: 1240
otbr  | References: 0
otbr  | Number of entries: 0
otbr  | Members:
otbr  | + ipset destroy otbr-ingress-deny-src-swap
otbr  | + ipset_destroy_if_exist otbr-ingress-allow-dst
otbr  | + ipset list otbr-ingress-allow-dst
otbr  | Name: otbr-ingress-allow-dst
otbr  | Type: hash:net
otbr  | Revision: 6
otbr  | Header: family inet6 hashsize 1024 maxelem 65536
otbr  | Size in memory: 1240
otbr  | References: 0
otbr  | Number of entries: 0
otbr  | Members:
otbr  | + ipset destroy otbr-ingress-allow-dst
otbr  | + ipset_destroy_if_exist otbr-ingress-allow-dst-swap
otbr  | + ipset list otbr-ingress-allow-dst-swap
otbr  | Name: otbr-ingress-allow-dst-swap
otbr  | Type: hash:net
otbr  | Revision: 6
otbr  | Header: family inet6 hashsize 1024 maxelem 65536
otbr  | Size in memory: 1240
otbr  | References: 0
otbr  | Number of entries: 0
otbr  | Members:
otbr  | + ipset destroy otbr-ingress-allow-dst-swap
otbr  | + stop_service rsyslog
otbr  | + local service_name=rsyslog
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service rsyslog status
otbr  |  * rsyslogd is running
otbr  | + sudo service rsyslog stop
otbr  |  * Stopping enhanced syslogd rsyslogd
otbr  |    ...done.
otbr  | + stop_service dbus
otbr  | + local service_name=dbus
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service dbus status
otbr  |  * dbus is running
otbr  | + sudo service dbus stop
otbr  |  * Stopping system message bus dbus
otbr  |    ...done.
otbr  | + [[ mDNSResponder == \a\v\a\h\i ]]
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 0 == 1 ]]
otbr  | + have service
otbr  | + command -v service
otbr  | + stop_service mdns
otbr  | + local service_name=mdns
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service mdns status
otbr  | Usage: /etc/init.d/mDNS {start|stop|reload|restart}
otbr  | + echo 'Failed to stop mdns!'
otbr  | Failed to stop mdns!
otbr  | + without WEB_GUI
otbr  | + with WEB_GUI
otbr  | + local value
otbr  | ++ printenv WEB_GUI
otbr  | + value=1
otbr  | + [[ -z 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + stop_service otbr-web
otbr  | + local service_name=otbr-web
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service otbr-web status
otbr  |  * otbr-web is not running
otbr  | + echo 'Failed to stop otbr-web!'
otbr  | Failed to stop otbr-web!
otbr  | + stop_service otbr-agent
otbr  | + local service_name=otbr-agent
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service otbr-agent status
otbr  |  * otbr-agent is not running
otbr  | Failed to stop otbr-agent!
otbr  | + echo 'Failed to stop otbr-agent!'
otbr  | RADIO_URL: spinel+hdlc+uart:///dev/ttyUSB0
otbr  | TREL_URL: 
otbr  | TUN_INTERFACE_NAME: wpan0
otbr  | BACKBONE_INTERFACE: eth0
otbr  | NAT64_PREFIX: 64:ff9b::/96
otbr  | DEBUG_LEVEL: 7
otbr  | +++ dirname /app/script/server
otbr  | ++ cd /app/script/..
otbr  | ++ HAVE_SYSTEMCTL=0
otbr  | ++ have systemctl
otbr  | ++ command -v systemctl
otbr  | ++ HAVE_SERVICE=0
otbr  | ++ have service
otbr  | ++ command -v service
otbr  | ++ HAVE_SERVICE=1
otbr  | ++ [[ ! -n x ]]
otbr  | ++ echo 'Current platform is ubuntu'
otbr  | Current platform is ubuntu
otbr  | ++ with BORDER_ROUTING
otbr  | ++ local value
otbr  | +++ printenv BORDER_ROUTING
otbr  | ++ value=1
otbr  | ++ [[ -z 1 ]]
otbr  | ++ [[ 1 == 1 ]]
otbr  | ++ with DHCPV6_PD
otbr  | ++ local value
otbr  | +++ printenv DHCPV6_PD
otbr  | ++ value=
otbr  | ++ [[ -z '' ]]
otbr  | ++ [[ -f examples/platforms/ubuntu/default ]]
otbr  | ++ [[ '' == 1 ]]
otbr  | ++ with BORDER_ROUTING
otbr  | ++ local value
otbr  | +++ printenv BORDER_ROUTING
otbr  | ++ value=1
otbr  | ++ [[ -z 1 ]]
otbr  | ++ [[ 1 == 1 ]]
otbr  | ++ with NETWORK_MANAGER
otbr  | ++ local value
otbr  | +++ printenv NETWORK_MANAGER
otbr  | ++ value=
otbr  | ++ [[ -z '' ]]
otbr  | ++ [[ -f examples/platforms/ubuntu/default ]]
otbr  | ++ [[ '' == 1 ]]
otbr  | ++ STAGE_DIR=/app/stage
otbr  | ++ BUILD_DIR=/app/build
otbr  | ++ [[ -d /app/stage ]]
otbr  | ++ [[ -d /app/build ]]
otbr  | ++ export PATH=/app/stage/usr/bin:/app/stage/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
otbr  | ++ PATH=/app/stage/usr/bin:/app/stage/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
otbr  | +++ basename /app/script/server
otbr  | ++ TASKNAME=server
otbr  | ++ BEFORE_HOOK=examples/platforms/ubuntu/before_server
otbr  | ++ AFTER_HOOK=examples/platforms/ubuntu/after_server
otbr  | ++ [[ ! -f examples/platforms/ubuntu/before_server ]]
otbr  | ++ BEFORE_HOOK=/dev/null
otbr  | ++ [[ ! -f examples/platforms/ubuntu/after_server ]]
otbr  | ++ AFTER_HOOK=/dev/null
otbr  | + . script/_nat64
otbr  | ++ NAT64_SERVICE=openthread
otbr  | ++ TAYGA_DEFAULT=/etc/default/tayga
otbr  | ++ TAYGA_CONF=/etc/tayga.conf
otbr  | ++ TAYGA_IPV4_ADDR=192.168.255.1
otbr  | ++ TAYGA_IPV6_ADDR=fdaa:bb:1::1
otbr  | ++ TAYGA_TUN_V6_ADDR=fdaa:bb:1::2
otbr  | ++ NAT64_PREFIX=64:ff9b::/96
otbr  | ++ DYNAMIC_POOL=192.168.255.0/24
otbr  | ++ NAT44_SERVICE=/etc/init.d/otbr-nat44
otbr  | ++ WLAN_IFNAMES=eth0
otbr  | ++ THREAD_IF=wpan0
otbr  | + . script/_dns64
otbr  | ++ BIND_CONF_OPTIONS=/etc/bind/named.conf.options
otbr  | ++ NAT64_PREFIX=64:ff9b::/96
otbr  | ++ DNS64_NAMESERVER_ADDR=127.0.0.1
otbr  | +++ echo 64:ff9b::/96
otbr  | +++ tr '"/"' '"/"'
otbr  | ++ DNS64_CONF='dns64 64:ff9b::/96 { clients { thread; }; recursive-only yes; };'
otbr  | ++ without NAT64
otbr  | ++ with NAT64
otbr  | ++ local value
otbr  | +++ printenv NAT64
otbr  | ++ value=1
otbr  | ++ [[ -z 1 ]]
otbr  | ++ [[ 1 == 1 ]]
otbr  | ++ without DNS64
otbr  | ++ with DNS64
otbr  | ++ local value
otbr  | +++ printenv DNS64
otbr  | ++ value=0
otbr  | ++ [[ -z 0 ]]
otbr  | ++ [[ 0 == 1 ]]
otbr  | ++ '[' ubuntu = raspbian ']'
otbr  | ++ '[' ubuntu = beagleboneblack ']'
otbr  | ++ '[' ubuntu = ubuntu ']'
otbr  | ++ RESOLV_CONF_HEAD=/etc/resolvconf/resolv.conf.d/head
otbr  | + . script/_firewall
otbr  | ++ FIREWALL_SERVICE=/etc/init.d/otbr-firewall
otbr  | ++ sudo modprobe ip6table_filter
otbr  | sudo: modprobe: command not found
otbr  | ++ true
otbr  | ++ FIREWALL=1
otbr  | + OTBR_MDNS=mDNSResponder
otbr  | + OT_BACKBONE_CI=0
otbr  | + REFERENCE_DEVICE=0
otbr  | + main
otbr  | + [[ '' == \s\h\u\t\d\o\w\n ]]
otbr  | + startup
otbr  | + . /dev/null
otbr  | + sudo sysctl --system
otbr  | * Applying /etc/sysctl.d/10-console-messages.conf ...
otbr  | kernel.printk = 4 4 1 7
otbr  | * Applying /etc/sysctl.d/10-ipv6-privacy.conf ...
otbr  | net.ipv6.conf.all.use_tempaddr = 2
otbr  | net.ipv6.conf.default.use_tempaddr = 2
otbr  | * Applying /etc/sysctl.d/10-kernel-hardening.conf ...
otbr  | kernel.kptr_restrict = 1
otbr  | * Applying /etc/sysctl.d/10-link-restrictions.conf ...
otbr  | fs.protected_hardlinks = 1
otbr  | fs.protected_symlinks = 1
otbr  | * Applying /etc/sysctl.d/10-magic-sysrq.conf ...
otbr  | kernel.sysrq = 176
otbr  | * Applying /etc/sysctl.d/10-network-security.conf ...
otbr  | net.ipv4.conf.default.rp_filter = 1
otbr  | net.ipv4.conf.all.rp_filter = 1
otbr  | net.ipv4.tcp_syncookies = 1
otbr  | * Applying /etc/sysctl.d/10-ptrace.conf ...
otbr  | kernel.yama.ptrace_scope = 1
otbr  | * Applying /etc/sysctl.d/10-zeropage.conf ...
otbr  | vm.mmap_min_addr = 65536
otbr  | * Applying /etc/sysctl.d/60-otbr-accept-ra.conf ...
otbr  | * Applying /etc/sysctl.d/60-otbr-ip-forward.conf ...
otbr  | net.ipv6.conf.all.forwarding = 1
otbr  | net.ipv4.ip_forward = 1
otbr  | * Applying /etc/sysctl.conf ...
otbr  | + nat64_start
otbr  | + with NAT64
otbr  | + local value
otbr  | ++ printenv NAT64
otbr  | + value=1
otbr  | + [[ -z 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + '[' openthread = tayga ']'
otbr  | + nat44_start
otbr  | + with DOCKER
otbr  | + local value
otbr  | ++ printenv DOCKER
otbr  | + value=1
otbr  | + [[ -z 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + service otbr-nat44 start
otbr  | + dns64_start
otbr  | + with NAT64
otbr  | + local value
otbr  | ++ printenv NAT64
otbr  | + value=1
otbr  | + [[ -z 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + with DNS64
otbr  | + local value
otbr  | ++ printenv DNS64
otbr  | + value=0
otbr  | + [[ -z 0 ]]
otbr  | + [[ 0 == 1 ]]
otbr  | + return 0
otbr  | + firewall_start
otbr  | + with FIREWALL
otbr  | + local value
otbr  | ++ printenv FIREWALL
otbr  | + value=1
otbr  | + [[ -z 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + with DOCKER
otbr  | + local value
otbr  | ++ printenv DOCKER
otbr  | + value=1
otbr  | + [[ -z 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + service otbr-firewall start
otbr  | + case "$1" in
otbr  | + firewall_start
otbr  | + firewall_stop
otbr  | + ip6tables -C FORWARD -o wpan0 -j OTBR_FORWARD_INGRESS
otbr  | ip6tables v1.6.1: Couldn't load target `OTBR_FORWARD_INGRESS':No such file or directory
otbr  | 
otbr  | Try `ip6tables -h' or 'ip6tables --help' for more information.
otbr  | + ip6tables -L OTBR_FORWARD_INGRESS
otbr  | ip6tables: No chain/target/match by that name.
otbr  | + ipset_destroy_if_exist otbr-ingress-deny-src
otbr  | + ipset list otbr-ingress-deny-src
otbr  | ipset v6.34: Kernel support protocol versions 6-7 while userspace supports protocol versions 6-6
otbr  | The set with the given name does not exist
otbr  | + ipset_destroy_if_exist otbr-ingress-deny-src-swap
otbr  | + ipset list otbr-ingress-deny-src-swap
otbr  | ipset v6.34: Kernel support protocol versions 6-7 while userspace supports protocol versions 6-6
otbr  | The set with the given name does not exist
otbr  | + ipset_destroy_if_exist otbr-ingress-allow-dst
otbr  | + ipset list otbr-ingress-allow-dst
otbr  | ipset v6.34: Kernel support protocol versions 6-7 while userspace supports protocol versions 6-6
otbr  | The set with the given name does not exist
otbr  | + ipset_destroy_if_exist otbr-ingress-allow-dst-swap
otbr  | + ipset list otbr-ingress-allow-dst-swap
otbr  | ipset v6.34: Kernel support protocol versions 6-7 while userspace supports protocol versions 6-6
otbr  | The set with the given name does not exist
otbr  | + ipset create -exist otbr-ingress-deny-src hash:net family inet6
otbr  | + ipset create -exist otbr-ingress-deny-src-swap hash:net family inet6
otbr  | + ipset create -exist otbr-ingress-allow-dst hash:net family inet6
otbr  | + ipset create -exist otbr-ingress-allow-dst-swap hash:net family inet6
otbr  | + ip6tables -N OTBR_FORWARD_INGRESS
otbr  | + ip6tables -I FORWARD 1 -o wpan0 -j OTBR_FORWARD_INGRESS
otbr  | + ip6tables -A OTBR_FORWARD_INGRESS -m pkttype --pkt-type unicast -i wpan0 -j DROP
otbr  | + ip6tables -A OTBR_FORWARD_INGRESS -m set --match-set otbr-ingress-deny-src src -j DROP
otbr  | + ip6tables -A OTBR_FORWARD_INGRESS -m set --match-set otbr-ingress-allow-dst dst -j ACCEPT
otbr  | + ip6tables -A OTBR_FORWARD_INGRESS -m pkttype --pkt-type unicast -j DROP
otbr  | + ip6tables -A OTBR_FORWARD_INGRESS -j ACCEPT
otbr  | + start_service rsyslog
otbr  | + local service_name=rsyslog
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service rsyslog status
otbr  |  * rsyslogd is not running
otbr  | + sudo service rsyslog start
otbr  |  * Starting enhanced syslogd rsyslogd
otbr  |    ...done.
otbr  | + start_service dbus
otbr  | + local service_name=dbus
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service dbus status
otbr  |  * dbus is not running
otbr  | + sudo service dbus start
otbr  |  * Starting system message bus dbus
otbr  |    ...done.
otbr  | + [[ mDNSResponder == \a\v\a\h\i ]]
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 0 == 1 ]]
otbr  | + have service
otbr  | + command -v service
otbr  | + sudo service mdns status
otbr  | Usage: /etc/init.d/mDNS {start|stop|reload|restart}
otbr  | + sudo service mdns start
otbr  | Starting Apple Darwin Multicast DNS / DNS Service Discovery daemon: mdnsd.
otbr  | + without WEB_GUI
otbr  | + with WEB_GUI
otbr  | + local value
otbr  | ++ printenv WEB_GUI
otbr  | + value=1
otbr  | + [[ -z 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + start_service otbr-web
otbr  | + local service_name=otbr-web
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service otbr-web status
otbr  |  * otbr-web is not running
otbr  | + sudo service otbr-web start
otbr  |  * thread web interface already started; not starting.
otbr  | + start_service otbr-agent
otbr  | + local service_name=otbr-agent
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service otbr-agent status
otbr  |  * otbr-agent is not running
otbr  | + sudo service otbr-agent start
otbr  |  * thread border agent already started; not starting.
otbr  | + . /dev/null
otbr  | Mar 21 17:27:34 otbr kernel: [ 4136.604805] vethbb4cd2c (unregistering): left allmulticast mode
otbr  | Mar 21 17:27:34 otbr kernel: [ 4136.604809] vethbb4cd2c (unregistering): left promiscuous mode
otbr  | Mar 21 17:27:34 otbr kernel: [ 4136.604812] br-f1f3d4462179: port 3(vethbb4cd2c) entered disabled state
otbr  | Mar 21 17:27:34 otbr kernel: [ 4136.643158] docker0: port 4(veth9ac5c6d) entered disabled state
otbr  | Mar 21 17:27:34 otbr kernel: [ 4136.643546] vethd2a8c99: renamed from eth0
otbr  | Mar 21 17:27:34 otbr kernel: [ 4136.661746] docker0: port 4(veth9ac5c6d) entered disabled state
otbr  | Mar 21 17:27:34 otbr kernel: [ 4136.662464] veth9ac5c6d (unregistering): left allmulticast mode
otbr  | Mar 21 17:27:34 otbr kernel: [ 4136.662468] veth9ac5c6d (unregistering): left promiscuous mode
otbr  | Mar 21 17:27:34 otbr kernel: [ 4136.662471] docker0: port 4(veth9ac5c6d) entered disabled state
otbr  | Mar 21 17:28:11 otbr mDNSResponder: Default: mDNSResponder (Engineering Build) (Mar 20 2025 14:27:29) starting
otbr  | Mar 21 17:28:11 otbr rsyslogd: rsyslogd's groupid changed to 101
otbr  | Mar 21 17:28:11 otbr rsyslogd: rsyslogd's userid changed to 101
otbr  | Mar 21 17:28:11 otbr rsyslogd:  [origin software="rsyslogd" swVersion="8.32.0" x-pid="87" x-info="http://www.rsyslog.com"] start

Logs when changing 8080 to 8181:

otbr  | The set with the given name does not exist
otbr  | + ipset create -exist otbr-ingress-deny-src hash:net family inet6
otbr  | + ipset create -exist otbr-ingress-deny-src-swap hash:net family inet6
otbr  | + ipset create -exist otbr-ingress-allow-dst hash:net family inet6
otbr  | + ipset create -exist otbr-ingress-allow-dst-swap hash:net family inet6
otbr  | + ip6tables -N OTBR_FORWARD_INGRESS
otbr  | + ip6tables -I FORWARD 1 -o wpan0 -j OTBR_FORWARD_INGRESS
otbr  | + ip6tables -A OTBR_FORWARD_INGRESS -m pkttype --pkt-type unicast -i wpan0 -j DROP
otbr  | + ip6tables -A OTBR_FORWARD_INGRESS -m set --match-set otbr-ingress-deny-src src -j DROP
otbr  | + ip6tables -A OTBR_FORWARD_INGRESS -m set --match-set otbr-ingress-allow-dst dst -j ACCEPT
otbr  | + ip6tables -A OTBR_FORWARD_INGRESS -m pkttype --pkt-type unicast -j DROP
otbr  | + ip6tables -A OTBR_FORWARD_INGRESS -j ACCEPT
otbr  | + start_service rsyslog
otbr  | + local service_name=rsyslog
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service rsyslog status
otbr  | + sudo service rsyslog start
otbr  |  * rsyslogd is not running
otbr  |  * Starting enhanced syslogd rsyslogd
otbr  |    ...done.
otbr  | + start_service dbus
otbr  | + local service_name=dbus
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service dbus status
otbr  |  * dbus is not running
otbr  | + sudo service dbus start
otbr  |  * Starting system message bus dbus
otbr  |    ...done.
otbr  | + [[ mDNSResponder == \a\v\a\h\i ]]
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 0 == 1 ]]
otbr  | + have service
otbr  | + command -v service
otbr  | + sudo service mdns status
otbr  | Usage: /etc/init.d/mDNS {start|stop|reload|restart}
otbr  | + sudo service mdns start
otbr  | Starting Apple Darwin Multicast DNS / DNS Service Discovery daemon: mdnsd.
otbr  | + without WEB_GUI
otbr  | + with WEB_GUI
otbr  | + local value
otbr  | ++ printenv WEB_GUI
otbr  | + value=1
otbr  | + [[ -z 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + start_service otbr-web
otbr  | + local service_name=otbr-web
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service otbr-web status
otbr  |  * otbr-web is not running
otbr  | + sudo service otbr-web start
otbr  |  * thread web interface already started; not starting.
otbr  | + start_service otbr-agent
otbr  | + local service_name=otbr-agent
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service otbr-agent status
otbr  |  * otbr-agent is not running
otbr  | + sudo service otbr-agent start
otbr  |  * Starting thread border agent otbr-agent
otbr  |    ...done.
otbr  | + . /dev/null
otbr  | Mar 21 17:32:52 otbr kernel: [  299.220284] veth05ab21d (unregistering): left allmulticast mode
otbr  | Mar 21 17:32:52 otbr kernel: [  299.220288] veth05ab21d (unregistering): left promiscuous mode
otbr  | Mar 21 17:32:52 otbr kernel: [  299.220291] docker0: port 2(veth05ab21d) entered disabled state
otbr  | Mar 21 17:32:52 otbr kernel: [  299.239518] br-f1f3d4462179: port 4(vethed30557) entered disabled state
otbr  | Mar 21 17:32:52 otbr kernel: [  299.239738] veth972835f: renamed from eth0
otbr  | Mar 21 17:32:52 otbr kernel: [  299.261841] br-f1f3d4462179: port 4(vethed30557) entered disabled state
otbr  | Mar 21 17:32:52 otbr kernel: [  299.262837] vethed30557 (unregistering): left allmulticast mode
otbr  | Mar 21 17:32:52 otbr kernel: [  299.262842] vethed30557 (unregistering): left promiscuous mode
otbr  | Mar 21 17:32:52 otbr kernel: [  299.262846] br-f1f3d4462179: port 4(vethed30557) entered disabled state
otbr  | Mar 21 17:33:28 otbr mDNSResponder: Default: mDNSResponder (Engineering Build) (Mar 20 2025 14:27:29) starting
otbr  | Mar 21 17:33:29 otbr otbr-agent: [NOTE]-AGENT---: Backbone interface: eth0
otbr  | Mar 21 17:33:29 otbr otbr-agent[152]: [NOTE]-AGENT---: Running 0.3.0-9b3f502
otbr  | Mar 21 17:33:29 otbr otbr-agent[152]: [NOTE]-AGENT---: Thread version: 1.4.0
otbr  | Mar 21 17:33:29 otbr otbr-agent[152]: [NOTE]-AGENT---: Thread interface: wpan0
otbr  | Mar 21 17:33:29 otbr otbr-agent[152]: [NOTE]-AGENT---: Radio URL: spinel+hdlc+uart:///dev/ttyUSB0
otbr  | Mar 21 17:33:29 otbr otbr-agent[152]: [NOTE]-ILS-----: Infra link selected: eth0
otbr  | Mar 21 17:33:29 otbr otbr-agent[152]: [INFO]-RCP_HOS-: OpenThread log level changed to 5
otbr  | Mar 21 17:33:29 otbr otbr-agent[152]: 49d.17:03:05.600 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:0, cmd:RESET
otbr  | Mar 21 17:33:29 otbr otbr-agent[152]: 49d.17:03:05.601 [D] P-SpinelDrive-: Waiting response: key=0
otbr  | Mar 21 17:33:29 otbr rsyslogd: rsyslogd's groupid changed to 101
otbr  | Mar 21 17:33:29 otbr rsyslogd: rsyslogd's userid changed to 101
otbr  | Mar 21 17:33:29 otbr rsyslogd:  [origin software="rsyslogd" swVersion="8.32.0" x-pid="86" x-info="http://www.rsyslog.com"] start
otbr  | Mar 21 17:33:31 otbr otbr-agent[152]: 49d.17:03:07.602 [W] P-SpinelDrive-: Wait for response timeout
otbr  | Mar 21 17:33:31 otbr otbr-agent[152]: 49d.17:03:07.602 [I] P-SpinelDrive-: co-processor self reset successfully
otbr  | Mar 21 17:33:31 otbr otbr-agent[152]: 49d.17:03:07.602 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:1, cmd:PROP_VALUE_GET, key:PROTOCOL_VERSION
otbr  | Mar 21 17:33:31 otbr otbr-agent[152]: 49d.17:03:07.602 [D] P-SpinelDrive-: Waiting response: key=1
otbr  | Mar 21 17:33:33 otbr otbr-agent[152]: 49d.17:03:09.604 [W] P-SpinelDrive-: Wait for response timeout
otbr  | Mar 21 17:33:33 otbr otbr-agent[152]: 49d.17:03:09.604 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:1, cmd:PROP_VALUE_GET, key:PROTOCOL_VERSION
otbr  | Mar 21 17:33:33 otbr otbr-agent[152]: 49d.17:03:09.604 [D] P-SpinelDrive-: Waiting response: key=1
otbr  | Mar 21 17:33:35 otbr otbr-agent[152]: 49d.17:03:11.606 [W] P-SpinelDrive-: Wait for response timeout
otbr  | Mar 21 17:33:35 otbr otbr-agent[152]: 49d.17:03:11.606 [C] Platform------: Init() at spinel_driver.cpp:83: Failure
otbr  | Mar 21 17:33:35 otbr otbr-agent[152]: 49d.17:03:11.606 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:1, cmd:PROP_VALUE_GET, key:PROTOCOL_VERSION
otbr  | Mar 21 17:33:35 otbr otbr-agent[152]: 49d.17:03:11.606 [D] P-SpinelDrive-: Waiting response: key=1
otbr  | Mar 21 17:33:36 otbr kernel: [   25.403637] Bluetooth: Core ver 2.22
otbr  | Mar 21 17:33:36 otbr kernel: [   25.403717] NET: Registered PF_BLUETOOTH protocol family
otbr  | Mar 21 17:33:36 otbr kernel: [   25.403720] Bluetooth: HCI device and connection manager initialized
otbr  | Mar 21 17:33:36 otbr kernel: [   25.403724] Bluetooth: HCI socket layer initialized
otbr  | Mar 21 17:33:36 otbr kernel: [   25.403726] Bluetooth: L2CAP socket layer initialized
otbr  | Mar 21 17:33:36 otbr kernel: [   25.403731] Bluetooth: SCO socket layer initialized
otbr  | Mar 21 17:33:37 otbr otbr-agent[152]: 49d.17:03:13.608 [W] P-SpinelDrive-: Wait for response timeout

The message Init() at spinel_driver.cpp:83: Failure suggests the software cannot access your USB dongle. Looking at your docker-compose, you do not have the correct mapping format; you need to expose the device to docker as /dev/ttyUSB0 (which is what your RADIO_URL env variable is telling otbr to use for the dongle):

  devices: 
    - '/dev/serial/by-id/blahblah:/dev/ttyUSB0'

That was a mistake on my part when placing the docker compose into this forum. I have tried some other things and this is what my docker compose currently looks like. It’s still not working and I’ve attached the logs of this to it. Again, I thank you for any help.

Compose:

version: '3.8'
services:
  otbr:
    image: openthread/otbr:latest
    container_name: otbr
    hostname: otbr
    restart: unless-stopped
    devices:
      - "/dev/serial/by-id/usb-Nabu_Casa_Home_Assistant_Connect_ZBT-1_a6c7b1cd7e39ef11ba5b59f454516304-if00-port0:/dev/ttyUSB0"
    privileged: true
    group_add:
      - dialout
    cap_add:
      - NET_ADMIN
      - SYS_ADMIN
      - SYS_MODULE
    environment:
      - OTBR_WEB_SERVICE_PORT=8282
      - OTBR_AGENT_PORT=49191
      - OTBR_INTERFACE_NAME=eth0
      - OTBR_RADIO_URL=spinel+hdlc+uart:///dev/ttyUSB0?uart-baudrate=115200
    volumes:
      - /DATA/AppData/otbr:/etc/otbr
      - /lib/modules:/lib/modules:ro
    network_mode: "host"
    command: sh -c "rm -f /var/run/otbr-*.pid && exec /init"
    extra_hosts:
      - "otbr:127.0.0.1"

volumes:
  otbr_data:

Logs:

otbr  | RADIO_URL: spinel+hdlc+uart:///dev/ttyUSB0
otbr  | TREL_URL: 
otbr  | TUN_INTERFACE_NAME: wpan0
otbr  | BACKBONE_INTERFACE: eth0
otbr  | NAT64_PREFIX: 64:ff9b::/96
otbr  | DEBUG_LEVEL: 7
otbr  | +++ dirname /app/script/server
otbr  | ++ cd /app/script/..
otbr  | ++ HAVE_SYSTEMCTL=0
otbr  | ++ have systemctl
otbr  | ++ command -v systemctl
otbr  | ++ HAVE_SERVICE=0
otbr  | ++ have service
otbr  | ++ command -v service
otbr  | ++ HAVE_SERVICE=1
otbr  | ++ [[ ! -n x ]]
otbr  | ++ echo 'Current platform is ubuntu'
otbr  | ++ with BORDER_ROUTING
otbr  | ++ local value
otbr  | Current platform is ubuntu
otbr  | +++ printenv BORDER_ROUTING
otbr  | ++ value=1
otbr  | ++ [[ -z 1 ]]
otbr  | ++ [[ 1 == 1 ]]
otbr  | ++ with DHCPV6_PD
otbr  | ++ local value
otbr  | +++ printenv DHCPV6_PD
otbr  | ++ value=
otbr  | ++ [[ -z '' ]]
otbr  | ++ [[ -f examples/platforms/ubuntu/default ]]
otbr  | ++ [[ '' == 1 ]]
otbr  | ++ with BORDER_ROUTING
otbr  | ++ local value
otbr  | +++ printenv BORDER_ROUTING
otbr  | ++ value=1
otbr  | ++ [[ -z 1 ]]
otbr  | ++ [[ 1 == 1 ]]
otbr  | ++ with NETWORK_MANAGER
otbr  | ++ local value
otbr  | +++ printenv NETWORK_MANAGER
otbr  | ++ value=
otbr  | ++ [[ -z '' ]]
otbr  | ++ [[ -f examples/platforms/ubuntu/default ]]
otbr  | ++ [[ '' == 1 ]]
otbr  | ++ STAGE_DIR=/app/stage
otbr  | ++ BUILD_DIR=/app/build
otbr  | ++ [[ -d /app/stage ]]
otbr  | ++ [[ -d /app/build ]]
otbr  | ++ export PATH=/app/stage/usr/bin:/app/stage/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
otbr  | ++ PATH=/app/stage/usr/bin:/app/stage/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
otbr  | +++ basename /app/script/server
otbr  | ++ TASKNAME=server
otbr  | ++ BEFORE_HOOK=examples/platforms/ubuntu/before_server
otbr  | ++ AFTER_HOOK=examples/platforms/ubuntu/after_server
otbr  | ++ [[ ! -f examples/platforms/ubuntu/before_server ]]
otbr  | ++ BEFORE_HOOK=/dev/null
otbr  | ++ [[ ! -f examples/platforms/ubuntu/after_server ]]
otbr  | ++ AFTER_HOOK=/dev/null
otbr  | + . script/_nat64
otbr  | ++ NAT64_SERVICE=openthread
otbr  | ++ TAYGA_DEFAULT=/etc/default/tayga
otbr  | ++ TAYGA_CONF=/etc/tayga.conf
otbr  | ++ TAYGA_IPV4_ADDR=192.168.255.1
otbr  | ++ TAYGA_IPV6_ADDR=fdaa:bb:1::1
otbr  | ++ TAYGA_TUN_V6_ADDR=fdaa:bb:1::2
otbr  | ++ NAT64_PREFIX=64:ff9b::/96
otbr  | ++ DYNAMIC_POOL=192.168.255.0/24
otbr  | ++ NAT44_SERVICE=/etc/init.d/otbr-nat44
otbr  | ++ WLAN_IFNAMES=eth0
otbr  | ++ THREAD_IF=wpan0
otbr  | + . script/_dns64
otbr  | ++ BIND_CONF_OPTIONS=/etc/bind/named.conf.options
otbr  | ++ NAT64_PREFIX=64:ff9b::/96
otbr  | ++ DNS64_NAMESERVER_ADDR=127.0.0.1
otbr  | +++ echo 64:ff9b::/96
otbr  | +++ tr '"/"' '"/"'
otbr  | ++ DNS64_CONF='dns64 64:ff9b::/96 { clients { thread; }; recursive-only yes; };'
otbr  | ++ without NAT64
otbr  | ++ with NAT64
otbr  | ++ local value
otbr  | +++ printenv NAT64
otbr  | ++ value=1
otbr  | ++ [[ -z 1 ]]
otbr  | ++ [[ 1 == 1 ]]
otbr  | ++ without DNS64
otbr  | ++ with DNS64
otbr  | ++ local value
otbr  | +++ printenv DNS64
otbr  | ++ value=0
otbr  | ++ [[ -z 0 ]]
otbr  | ++ [[ 0 == 1 ]]
otbr  | ++ '[' ubuntu = raspbian ']'
otbr  | ++ '[' ubuntu = beagleboneblack ']'
otbr  | ++ '[' ubuntu = ubuntu ']'
otbr  | ++ RESOLV_CONF_HEAD=/etc/resolvconf/resolv.conf.d/head
otbr  | + . script/_firewall
otbr  | ++ FIREWALL_SERVICE=/etc/init.d/otbr-firewall
otbr  | ++ sudo modprobe ip6table_filter
otbr  | sudo: modprobe: command not found
otbr  | ++ true
otbr  | ++ FIREWALL=1
otbr  | + OTBR_MDNS=mDNSResponder
otbr  | + OT_BACKBONE_CI=0
otbr  | + REFERENCE_DEVICE=0
otbr  | + main
otbr  | + [[ '' == \s\h\u\t\d\o\w\n ]]
otbr  | + startup
otbr  | + . /dev/null
otbr  | + sudo sysctl --system
otbr  | * Applying /etc/sysctl.d/10-console-messages.conf ...
otbr  | kernel.printk = 4 4 1 7
otbr  | * Applying /etc/sysctl.d/10-ipv6-privacy.conf ...
otbr  | net.ipv6.conf.all.use_tempaddr = 2
otbr  | net.ipv6.conf.default.use_tempaddr = 2
otbr  | * Applying /etc/sysctl.d/10-kernel-hardening.conf ...
otbr  | kernel.kptr_restrict = 1
otbr  | * Applying /etc/sysctl.d/10-link-restrictions.conf ...
otbr  | fs.protected_hardlinks = 1
otbr  | fs.protected_symlinks = 1
otbr  | * Applying /etc/sysctl.d/10-magic-sysrq.conf ...
otbr  | kernel.sysrq = 176
otbr  | * Applying /etc/sysctl.d/10-network-security.conf ...
otbr  | net.ipv4.conf.default.rp_filter = 1
otbr  | net.ipv4.conf.all.rp_filter = 1
otbr  | net.ipv4.tcp_syncookies = 1
otbr  | * Applying /etc/sysctl.d/10-ptrace.conf ...
otbr  | kernel.yama.ptrace_scope = 1
otbr  | * Applying /etc/sysctl.d/10-zeropage.conf ...
otbr  | vm.mmap_min_addr = 65536
otbr  | * Applying /etc/sysctl.d/60-otbr-accept-ra.conf ...
otbr  | * Applying /etc/sysctl.d/60-otbr-ip-forward.conf ...
otbr  | net.ipv6.conf.all.forwarding = 1
otbr  | net.ipv4.ip_forward = 1
otbr  | * Applying /etc/sysctl.conf ...
otbr  | + nat64_start
otbr  | + with NAT64
otbr  | + local value
otbr  | ++ printenv NAT64
otbr  | + value=1
otbr  | + [[ -z 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + '[' openthread = tayga ']'
otbr  | + nat44_start
otbr  | + with DOCKER
otbr  | + local value
otbr  | ++ printenv DOCKER
otbr  | + value=1
otbr  | + [[ -z 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + service otbr-nat44 start
otbr  | + dns64_start
otbr  | + with NAT64
otbr  | + local value
otbr  | ++ printenv NAT64
otbr  | + value=1
otbr  | + [[ -z 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + with DNS64
otbr  | + local value
otbr  | ++ printenv DNS64
otbr  | + value=0
otbr  | + [[ -z 0 ]]
otbr  | + [[ 0 == 1 ]]
otbr  | + return 0
otbr  | + firewall_start
otbr  | + with FIREWALL
otbr  | + local value
otbr  | ++ printenv FIREWALL
otbr  | + value=1
otbr  | + [[ -z 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + with DOCKER
otbr  | + local value
otbr  | ++ printenv DOCKER
otbr  | + value=1
otbr  | + [[ -z 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + service otbr-firewall start
otbr  | + case "$1" in
otbr  | + firewall_start
otbr  | + firewall_stop
otbr  | + ip6tables -C FORWARD -o wpan0 -j OTBR_FORWARD_INGRESS
otbr  | ip6tables v1.6.1: Couldn't load target `OTBR_FORWARD_INGRESS':No such file or directory
otbr  | 
otbr  | Try `ip6tables -h' or 'ip6tables --help' for more information.
otbr  | + ip6tables -L OTBR_FORWARD_INGRESS
otbr  | ip6tables: No chain/target/match by that name.
otbr  | + ipset_destroy_if_exist otbr-ingress-deny-src
otbr  | + ipset list otbr-ingress-deny-src
otbr  | ipset v6.34: Kernel support protocol versions 6-7 while userspace supports protocol versions 6-6
otbr  | The set with the given name does not exist
otbr  | + ipset_destroy_if_exist otbr-ingress-deny-src-swap
otbr  | + ipset list otbr-ingress-deny-src-swap
otbr  | ipset v6.34: Kernel support protocol versions 6-7 while userspace supports protocol versions 6-6
otbr  | The set with the given name does not exist
otbr  | + ipset_destroy_if_exist otbr-ingress-allow-dst
otbr  | + ipset list otbr-ingress-allow-dst
otbr  | ipset v6.34: Kernel support protocol versions 6-7 while userspace supports protocol versions 6-6
otbr  | The set with the given name does not exist
otbr  | + ipset_destroy_if_exist otbr-ingress-allow-dst-swap
otbr  | + ipset list otbr-ingress-allow-dst-swap
otbr  | ipset v6.34: Kernel support protocol versions 6-7 while userspace supports protocol versions 6-6
otbr  | The set with the given name does not exist
otbr  | + ipset create -exist otbr-ingress-deny-src hash:net family inet6
otbr  | + ipset create -exist otbr-ingress-deny-src-swap hash:net family inet6
otbr  | + ipset create -exist otbr-ingress-allow-dst hash:net family inet6
otbr  | + ipset create -exist otbr-ingress-allow-dst-swap hash:net family inet6
otbr  | + ip6tables -N OTBR_FORWARD_INGRESS
otbr  | + ip6tables -I FORWARD 1 -o wpan0 -j OTBR_FORWARD_INGRESS
otbr  | + ip6tables -A OTBR_FORWARD_INGRESS -m pkttype --pkt-type unicast -i wpan0 -j DROP
otbr  | + ip6tables -A OTBR_FORWARD_INGRESS -m set --match-set otbr-ingress-deny-src src -j DROP
otbr  | + ip6tables -A OTBR_FORWARD_INGRESS -m set --match-set otbr-ingress-allow-dst dst -j ACCEPT
otbr  | + ip6tables -A OTBR_FORWARD_INGRESS -m pkttype --pkt-type unicast -j DROP
otbr  | + ip6tables -A OTBR_FORWARD_INGRESS -j ACCEPT
otbr  | + start_service rsyslog
otbr  | + local service_name=rsyslog
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service rsyslog status
otbr  |  * rsyslogd is not running
otbr  | + sudo service rsyslog start
otbr  |  * Starting enhanced syslogd rsyslogd
otbr  |    ...done.
otbr  | + start_service dbus
otbr  | + local service_name=dbus
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service dbus status
otbr  |  * dbus is not running
otbr  | + sudo service dbus start
otbr  |  * Starting system message bus dbus
otbr  |    ...done.
otbr  | + [[ mDNSResponder == \a\v\a\h\i ]]
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 0 == 1 ]]
otbr  | + have service
otbr  | + command -v service
otbr  | + sudo service mdns status
otbr  | Usage: /etc/init.d/mDNS {start|stop|reload|restart}
otbr  | + sudo service mdns start
otbr  | Starting Apple Darwin Multicast DNS / DNS Service Discovery daemon: mdnsd.
otbr  | + without WEB_GUI
otbr  | + with WEB_GUI
otbr  | + local value
otbr  | ++ printenv WEB_GUI
otbr  | + value=1
otbr  | + [[ -z 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + start_service otbr-web
otbr  | + local service_name=otbr-web
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service otbr-web status
otbr  |  * otbr-web is not running
otbr  | + sudo service otbr-web start
otbr  |  * thread web interface already started; not starting.
otbr  | + start_service otbr-agent
otbr  | + local service_name=otbr-agent
otbr  | + [[ 0 == 1 ]]
otbr  | + [[ 1 == 1 ]]
otbr  | + sudo service otbr-agent status
otbr  |  * otbr-agent is not running
otbr  | + sudo service otbr-agent start
otbr  |  * thread border agent already started; not starting.
otbr  | + . /dev/null
otbr  | Mar 22 02:12:54 otbr kernel: [  886.832375] docker0: port 3(vethdcc1742) entered disabled state
otbr  | Mar 22 02:12:54 otbr kernel: [  886.841411] br-f1f3d4462179: port 1(vethcadf3b0) entered disabled state
otbr  | Mar 22 02:12:54 otbr kernel: [  886.842652] vethcadf3b0 (unregistering): left allmulticast mode
otbr  | Mar 22 02:12:54 otbr kernel: [  886.842656] vethcadf3b0 (unregistering): left promiscuous mode
otbr  | Mar 22 02:12:54 otbr kernel: [  886.842660] br-f1f3d4462179: port 1(vethcadf3b0) entered disabled state
otbr  | Mar 22 02:12:54 otbr kernel: [  886.855847] docker0: port 3(vethdcc1742) entered disabled state
otbr  | Mar 22 02:12:54 otbr kernel: [  886.856500] vethdcc1742 (unregistering): left allmulticast mode
otbr  | Mar 22 02:12:54 otbr kernel: [  886.856504] vethdcc1742 (unregistering): left promiscuous mode
otbr  | Mar 22 02:12:54 otbr kernel: [  886.856506] docker0: port 3(vethdcc1742) entered disabled state
otbr  | Mar 22 02:13:31 otbr mDNSResponder: Default: mDNSResponder (Engineering Build) (Mar 21 2025 16:56:40) starting
otbr  | Mar 22 02:13:31 otbr rsyslogd: rsyslogd's groupid changed to 101
otbr  | Mar 22 02:13:31 otbr rsyslogd: rsyslogd's userid changed to 101
otbr  | Mar 22 02:13:31 otbr rsyslogd:  [origin software="rsyslogd" swVersion="8.32.0" x-pid="87" x-info="http://www.rsyslog.com"] start

Note the RADIO_URL in the logs is not same as the OTBR_RADIO_URL in your compose. In fact none of the environment variables in the log have the OTBR_ prefix, so maybe this image uses different variables?

Also take a look at this post where someone determined the correct radio url for ZBT-1 should be spinel+hdlc+uart:///dev/ttyUSB0?uart-baudrate=460800&uart-flow-control

Thanks so much for the help everyone, I need to get ahold of a computer I can run HAOS on to install the firmware, so it might take me a day or two. I’ll update once I hopefully can get everything working.