{"record":{"id":"f86bce793afa65b7","repo":"netbirdio/netbird","slug":"startup-check-no-relay-servers-available-0-d-co","errorCode":null,"errorMessage":"startup check: no relay servers available (0/%d connected)","messagePattern":"startup check: no relay servers available \\(0/(.+?) connected\\)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"client/cmd/status.go","lineNumber":317,"sourceCode":"\n\tif !fullStatus.GetSignalState().GetConnected() {\n\t\treturn fmt.Errorf(\"startup check: signal not connected\")\n\t}\n\n\tvar relayCount, relaysConnected int\n\tfor _, r := range fullStatus.GetRelays() {\n\t\turi := r.GetURI()\n\t\tif !strings.HasPrefix(uri, \"rel://\") && !strings.HasPrefix(uri, \"rels://\") {\n\t\t\tcontinue\n\t\t}\n\t\trelayCount++\n\t\tif r.GetAvailable() {\n\t\t\trelaysConnected++\n\t\t}\n\t}\n\n\tif relayCount > 0 && relaysConnected == 0 {\n\t\treturn fmt.Errorf(\"startup check: no relay servers available (0/%d connected)\", relayCount)\n\t}\n\n\treturn nil\n}\n\nfunc parseInterfaceIP(interfaceIP string) string {\n\tip, _, err := net.ParseCIDR(interfaceIP)\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\treturn fmt.Sprintf(\"%s\\n\", ip)\n}\n","sourceCodeStart":299,"sourceCodeEnd":330,"githubUrl":"https://github.com/netbirdio/netbird/blob/93e97f4bf1ad715072dcb3fb6cdb1763431b5a9c/client/cmd/status.go#L299-L330","documentation":"Thrown by checkStartup (client/cmd/status.go:317). It counts relays whose URI starts with rel:// or rels:// from fullStatus.GetRelays() and errors only when at least one such relay exists but zero report Available. Management and signal are connected, but no relay is usable, so the startup check treats the agent as not fully up.","triggerScenarios":"'netbird status --check startup' when every relay in the network map fails its availability check: relay service down, rel:// or rels:// port blocked by egress firewall, or relay TLS/certificate problems. If no rel:// URIs exist at all (relayCount == 0), the check deliberately passes.","commonSituations":"Self-hosted relay container crashed; firewall permits management/signal but blocks relay ports; all relays removed from management but one stale entry remains; relay load balancer health checks failing.","solutions":["Check the relay service status and its healthcheck endpoint","Allow outbound connections to the relay hosts/ports (rel:// = plain, rels:// = TLS) from the agent host","Inspect daemon logs for per-relay probe failures to identify which relay and why","If relays were intentionally removed, clean the stale relay entries in management so relayCount drops to 0"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Monitor relay health endpoints and alert before all relays drop","Open egress for rel:// and rels:// ports alongside management and signal","Remove decommissioned relays from management so stale entries do not trip the check"],"tags":["cli","relay","startup","network","netbird"],"backgroundTag":null,"analyzedSha":"93e97f4bf1ad715072dcb3fb6cdb1763431b5a9c","analyzedAt":"2026-08-16T03:09:19.136Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}