Troubleshooting
Each section is one symptom, one cause, one fix — structured so you (or the AI help desk) can jump straight to the answer.
A new spoke will not show as reachable
Symptom: you added a spoke but devf health-fleet shows it unreachable.
Check, in order:
- Is the spoke on your tailnet? Run
tailscale statuson the spoke; it should list your hub. If not, runtailscale up --sshon the spoke and confirm it appears in your Tailscale admin console. - Is the tooling installed on a reachable PATH? A non-interactive SSH command uses a bare
PATH. Make suredev(andtmux) resolve there — see the macOS and Pi notes below. - Is the roster line correct? The
hostin the roster stanza must match the name the hub can reach over Tailscale.
Once all three are true, the spoke should read reachable within a poll cycle.
tailnet policy does not permit you to SSH to this node
Symptom: on a Raspberry Pi or user-owned node running Tailscale SSH, the hub's poll fails with tailnet: tailnet policy does not permit you to SSH to this node.
Cause: the node runs Tailscale SSH, which intercepts port 22 and enforces your tailnet's SSH policy. Your hub is a tagged node, so it falls outside the default "access your own devices" rule.
Do not disable Tailscale SSH on the node — if your own session to it *is* Tailscale SSH, that cuts you off. Two safe fixes:
- Tailnet ACL rule (cleanest): in the Tailscale admin console, add an SSH rule allowing your hub's tag to reach the spoke's tag (and keep a rule preserving your own access). This is a tailnet-policy edit.
- Second SSH daemon on a non-22 port: Tailscale SSH only intercepts port 22. Run a normal SSH daemon on another port (for example 2222), authorize the hub's key, and encode the port in the hub's SSH config. The hub then reaches the spoke directly with key auth, bypassing the port-22 intercept.
The cockpit file tree is blank or slow
Symptom: the cockpit's file tree shows empty, or takes several seconds and sometimes fails.
Cause (managed hub): SSH relay hops without connection reuse pay a full handshake each time, and can exceed the relay timeout. On managed hubs we enable OpenSSH connection multiplexing so repeat hops reuse one channel; a blank tree usually means that multiplexing needs re-applying (for example after a hub rebuild).
Fix: on a managed hub this is our responsibility — open a support ticket and reference "SSH ControlMaster / relay timeout." The tree should return in about a second once multiplexing is warm.
The cockpit will not reconnect / I have to refresh
Symptom: after roaming networks or leaving the tab idle, the cockpit freezes and only a manual refresh recovers it.
Cause / status: this class of freeze (a half-open socket after a Wi-Fi roam or long idle) is addressed by automatic WebSocket reconnect with backoff plus a server heartbeat. If you are on a current hub build you should see it recover on its own within the backoff window.
Fix: wait through one backoff cycle; it should reconnect without a refresh. If it does not, reload once and, if it recurs, open a ticket — your hub build may need updating (see Updates). Remember: your session itself is safe on the hub (tmux-backed sessions with automatic reconnect); only the view needed to catch up.
macOS spoke: the hub cannot find tmux or dev
Symptom: a Mac spoke is on the tailnet but the hub's relay reports tmux or dev not found.
Cause: Homebrew's bin directory is not on the non-interactive SSH PATH on Apple Silicon.
Fix: surface both on a system path:
sudo ln -sf ~/.local/bin/dev /usr/local/bin/dev
sudo ln -sf "$(command -v tmux)" /usr/local/bin/tmux
Also keep the spoke's repo on the internal disk — macOS blocks non-GUI SSH sessions from files on external /Volumes/... paths.
The hub is unreachable but my work must go on
Symptom: your hub VM is down or unreachable, and you need a spoke.
Fix: a device with a local roster can bypass the hub and SSH straight to a spoke over Tailscale:
devf --direct '&<vm>' a
Your work is unaffected — it lives on the spoke — only the hub-mediated convenience layer was down.
Still stuck?
The in-cockpit AI help desk will answer most tier-1 and tier-2 questions directly from these docs. Anything it cannot resolve will escalate to a human with your transcript attached, so you never repeat yourself.
Next steps
- Adding spokes — the full add-a-spoke flow.
- Tailscale setup — the connection wizard, end to end.
- Updates — keeping your hub and spokes current.