Issue with Matter on self hosted Homey

Hi all, sharing another Matter-related fix for Homey SHS on Docker. This is a different issue from Pepe’s IPv6 routing fix (great post!), but equally frustrating. It took some digging but the fix is
permanent and clean.


Symptoms

  • Homey SHS runs on a NAS (UGREEN DXP2800) in Docker with network_mode: host
  • Matter daemon fails to initialize on startup
  • Homey logs show: ENDPOINT_POOL_FULL (0x00c1)
  • Other Homey features (Zigbee, Z-Wave, Wi-Fi devices) work fine
  • Restarting Homey sometimes fixes it temporarily, especially if you stop other containers first

Root cause

The Matter stack uses the CHIP SDK, which tries to bind a UDP socket on every host network interface at startup. There’s an internal limit of roughly 16–18 endpoints in the pool.

On a NAS running multiple Docker stacks, the host interface count explodes because:

  • Each Docker bridge network creates 1 host interface
  • Each bridge-connected container creates 1 veth pair (another host interface)
  • Add libvirt bridges, loopback, your physical NIC… it adds up fast

In my case I had 24 interfaces — well over the limit. The CHIP SDK ran out of endpoints trying to bind them all, and Matter never started.

How to check if this is your problem

SSH into your NAS and count interfaces:

ip link show | grep -c ‘[1]

If this number is above ~16, and you see ENDPOINT_POOL_FULL in your Homey logs, this is likely your issue.

You can also see what’s eating up interfaces:

Docker bridge networks (1 interface each)

docker network ls

veth pairs from bridge-connected containers

ip link show | grep veth

Solution: reduce host interfaces by consolidating Docker networks

The idea is simple: instead of each Docker Compose stack creating its own bridge network, make them all share a single one. Then use the sidecar pattern to group containers that can share a network
namespace (= 1 veth for the whole group instead of 1 per container).

High-level steps:

  1. Create one shared Docker network:
    docker network create --driver bridge shared
  2. Move all stacks to the shared network. In each docker-compose.yml, replace per-stack networking with:
    networks:
    shared:
    external: true
  3. And on each service:
    networks:
    • shared
  4. Group related containers as sidecars. If containers don’t need to talk to the outside world independently make one the “anchor” and attach the rest:

Homey Matter logs (should show clean init, no ENDPOINT_POOL_FULL)

docker logs homey-shs | grep -i matter

Important notes

  • The sidecar pattern means if the anchor container restarts, its sidecars temporarily lose network. They recover once the anchor is back.
  • All ports for a sidecar group must be declared on the anchor service.
  • Host-mode containers (like Homey SHS itself, Zigbee2MQTT, Mosquitto) don’t create veths — they’re already fine.
  • When adding new containers in the future, always use the shared network or sidecar pattern. Never let a stack create its own bridge network, or your interface count will creep back up.

Hope this helps someone else. The error message ENDPOINT_POOL_FULL is pretty opaque and there’s not much about it online in the context of Docker. Cheers!


  1. 0-9 ↩︎

2 Likes