hashicorp/nomad · error
Client RPC advertise address is not advertisable: %v
Error message
Client RPC advertise address is not advertisable: %v
What it means
Nomad server startup validates that the resolved Client RPC advertise address is usable. After checking that the address is a *net.TCPAddr, it rejects addresses whose IP is unspecified (0.0.0.0 or ::) because agents cannot advertise an any-address to clients that need to dial back to the server.
Source
Thrown at nomad/server.go:1232
listener.Close()
return err
}
if s.config.ClientRPCAdvertise != nil {
s.clientRpcAdvertise = s.config.ClientRPCAdvertise
} else {
s.clientRpcAdvertise = s.rpcListener.Addr()
}
// Verify that we have a usable advertise address
clientAddr, ok := s.clientRpcAdvertise.(*net.TCPAddr)
if !ok {
listener.Close()
return fmt.Errorf("Client RPC advertise address is not a TCP Address: %v", clientAddr)
}
if clientAddr.IP.IsUnspecified() {
listener.Close()
return fmt.Errorf("Client RPC advertise address is not advertisable: %v", clientAddr)
}
if s.config.ServerRPCAdvertise != nil {
s.serverRpcAdvertise = s.config.ServerRPCAdvertise
} else {
// Default to the Serf Advertise + RPC Port
serfIP := s.config.SerfConfig.MemberlistConfig.AdvertiseAddr
if serfIP == "" {
serfIP = s.config.SerfConfig.MemberlistConfig.BindAddr
}
addr := net.JoinHostPort(serfIP, fmt.Sprintf("%d", clientAddr.Port))
resolved, err := net.ResolveTCPAddr("tcp", addr)
if err != nil {
return fmt.Errorf("Failed to resolve Server RPC advertise address: %v", err)
}
s.serverRpcAdvertise = resolvedView on GitHub (pinned to 482b49bf1a)
Solutions
- Set client_rpc advertise address in the server config to a specific routable IP (e.g. "192.168.1.10") instead of 0.0.0.0/::
- If advertise was derived from Serf/memberlist config, set an explicit advertise_addr rather than leaving bind_addr as 0.0.0.0
- Verify with `nomad agent -server -config ...` output or `ip addr` which interface IP the node should advertise
Example fix
// before (server.hcl)
advertise {
rpc = "0.0.0.0"
}
// after
advertise {
rpc = "10.0.2.15"
} Defensive patterns
Strategy: validation
Validate before calling
ip := net.ParseIP(advertiseRPC)
if ip == nil || ip.IsUnspecified() {
return fmt.Errorf("advertise rpc must be a specific IP, got %q", advertiseRPC)
} Type guard
func isSpecificTCPAddr(a net.Addr) bool {
ta, ok := a.(*net.TCPAddr)
return ok && !ta.IP.IsUnspecified()
} Try / catch
if err := server.SetupRPC(listener); err != nil {
if strings.Contains(err.Error(), "not advertisable") {
logger.Error("fix advertise address in config", "err", err)
}
return err
} Prevention
- Always set an explicit routable advertise address in server config
- Never use 0.0.0.0/:: in advertise blocks
- Validate config with a linter or `nomad agent -config ... -verify-only` if available before launch
When it happens
Trigger: setupRPC() is called during server startup with s.config.ClientRPCAdvertise (or the derived clientAddr) pointing at an IP that IsUnspecified(), e.g. advertise { http = "0.0.0.0" } or a bind/advertise address of "::".
Common situations: Operator sets client RPC advertise to 0.0.0.0 in the config instead of a specific interface IP; running in a container where the advertise address defaults to the unspecified address; copying bind_addr values into advertise fields.
Related errors
- Server RPC advertise address is not advertisable: %v
- no CNI network config found
- failed to initialize network configurator: %v
- failed to configure networking for alloc: %v
- client setup failed: %v
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/29fa4d083578fb09.
Report an issue: GitHub.