{"record":{"id":"39d36674932eefb9","repo":"netbirdio/netbird","slug":"startup-check-signal-not-connected","errorCode":null,"errorMessage":"startup check: signal not connected","messagePattern":"startup check: signal not connected","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"client/cmd/status.go","lineNumber":301,"sourceCode":"\tcase internal.StatusNeedsLogin, internal.StatusLoginFailed, internal.StatusSessionExpired:\n\t\treturn fmt.Errorf(\"readiness check: daemon status is %s\", daemonStatus)\n\tdefault:\n\t\treturn fmt.Errorf(\"readiness check: unexpected daemon status %q\", daemonStatus)\n\t}\n}\n\nfunc checkStartup(resp *proto.StatusResponse) error {\n\tfullStatus := resp.GetFullStatus()\n\tif fullStatus == nil {\n\t\treturn fmt.Errorf(\"startup check: no full status available\")\n\t}\n\n\tif !fullStatus.GetManagementState().GetConnected() {\n\t\treturn fmt.Errorf(\"startup check: management not connected\")\n\t}\n\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","sourceCodeStart":283,"sourceCodeEnd":319,"githubUrl":"https://github.com/netbirdio/netbird/blob/93e97f4bf1ad715072dcb3fb6cdb1763431b5a9c/client/cmd/status.go#L283-L319","documentation":"Thrown by checkStartup (client/cmd/status.go:301). FullStatus is present and management is connected, but fullStatus.GetSignalState().GetConnected() is false: the agent is not connected to the signal service that brokers peer handshakes. The signal URL is distributed by management, so this is a data-plane bootstrap failure after control-plane success.","triggerScenarios":"'netbird status --check startup' when the signal service is down, the signal URL/port learned from management is unreachable (egress firewall), or the signal TLS handshake fails. Also transiently true for the few seconds between management connect and signal connect.","commonSituations":"Self-hosted signal container stopped or crashed; firewall allowing 443 to management but blocking the signal port (default 10000); hostname resolution for the signal endpoint failing on the agent host.","solutions":["Retry the check briefly - signal connect normally completes right after management connect","Check the signal service health (docker ps / systemctl, /healthcheck endpoint on the signal)","Open outbound access to the signal host/port advertised by management","Inspect 'netbird status -d' or daemon logs for the signal dial error"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep the signal service monitored (healthcheck endpoint) in self-hosted setups","Allow egress to the signal host/port that management advertises","Expect signal to lag management by a few seconds during startup; poll, do not single-shot"],"tags":["cli","signal","startup","network","netbird"],"backgroundTag":null,"analyzedSha":"93e97f4bf1ad715072dcb3fb6cdb1763431b5a9c","analyzedAt":"2026-08-16T03:09:19.136Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}