Layer4 Fallback routes with Unix Domain Socket

1. The problem I’m having:

Using Caddy + caddyl4 in docker, I’m trying to create a fallback route when a specified service is offline, but instead it fails with
"error":"dial unix /sockets/services/service_2.sock: connect: no such file or directory" instead of forwarding to the next upstream.

2. Error messages and/or full log output:

caddy-1           | {"level":"error","ts":1741023340.9800487,"logger":"layer4","msg":"handling connection","remote":"[::1]:51926","error":"dial unix /sockets/services/service_2.sock: connect: no such file or directory"}

3. Caddy version:

$ docker compose exec caddy caddy version
v2.9.1 h1:OEYiZ7DbCzAWVb6TNEkjRcSCRGHVoZsJinoDR/n9oaY=

4. How I installed and ran Caddy:

docker compose

FROM caddy:2.9-builder AS builder

RUN xcaddy build \
    --with github.com/mholt/caddy-l4

FROM caddy:2.9

COPY --from=builder /usr/bin/caddy /usr/bin/caddy

a. System environment:

Debian 12
Docker Compose version v2.33.1
Docker version 28.0.1, build 068a01e

b. Command:

netcat localhost 20000

expected: TCP Service Unavailable (fail overed after trying upstream 0
got: empty / hung session. + error in caddy

c. Service/unit/compose file:

services:
  caddy:
    build: .
    cap_add:
      - NET_ADMIN
    network_mode: host
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy-data:/data
      - caddy-config:/config
      - sockets:/sockets

  local_fallback:
    image: alpine/socat
    command: UNIX-LISTEN:/sockets/fallback.sock,fork EXEC:"echo 'TCP Service Unavailable'"
    volumes:
      - sockets:/sockets


volumes:
  caddy-data:
  caddy-config:
  sockets:
    external: true

d. My complete Caddy config:

{
	layer4 {
		:20000 {
			route {
				proxy {
					lb_policy first
					lb_try_duration 1s
					upstream unix//sockets/service_2.sock
					upstream unix//sockets/fallback.sock
				}
			}
		}
	}
}

service1.localhost {
	reverse_proxy unix//sockets/service_1.sock {
	}
	handle_errors {
		respond "Service unavailable
" 500
	}
}

Well, does the socket file /sockets/services/service_2.sock exist?

Well, no the service isn’t running,
The desired behaviour is that it would fall back to the next upstream

IE if this were normal TCP ports, and the main server wasn’t running/listening to the port set as an upstream