FAQ & troubleshooting#

Install & environment#

serverctl doctor says the vault check failed (Linux). You need an unlocked Secret Service provider — see Platforms. On a headless server either run an unlocked gnome-keyring-daemon or stick to agent-kind credentials.

doctor can't find ssh (Windows). Install the OpenSSH Client optional feature (Settings → Apps → Optional features) and reopen the terminal.

fastapi/uvicorn marked missing. Run ./scripts/bootstrap (source checkout) or reinstall with pipx/uv — the UI dependencies are part of the standard install.

Connections#

server test returns host-key-untrusted. The host key is unknown or changed. Verify the fingerprint out-of-band, accept it once with plain ssh, or clean the stale entry from ~/.ssh/known_hosts. The manager never bypasses verification for you.

authentication-failed but the password is right. Check the username on the profile (server show ALIAS); confirm the server allows password auth (PasswordAuthentication yes on the server side); if the account uses 2FA/OTP the automated password flow will stop at the OTP prompt by design — connect interactively with serverctl connect.

exec says "No such file or directory" for a command that exists. You passed a compound command as one string without --shell. Either serverctl exec a -- ls -la /tmp (separate args) or serverctl exec a --shell -- 'ls -la /tmp | head' (one string).

--reuse doesn't speed anything up on Windows. ControlMaster needs Unix sockets; Windows OpenSSH doesn't support it. The warning is expected — auth is still non-interactive, only slower.

Interactive connect asks for the password even though it's stored. That usually means the AskPass helper couldn't classify the prompt (unusual server banner) or the vault is locked. Run server test ALIAS --json and check error_code; run doctor to confirm the vault backend.

Profiles & credentials#

server add says "server alias already exists". add only creates; it never overwrites an existing profile. Update it with serverctl server edit ALIAS instead — for example --credential LABEL to switch the attached credential, or --hostname/--port to fix the endpoint. No need to remove and re-add.

I typed the wrong password, and credential add-password now says the label exists. Replace the stored secret with serverctl credential edit LABEL --replace-secret — it prompts hidden again. Labels are unique, and a taken label is refused before the password prompt runs, so you never type the secret twice for nothing.

Web UI#

The URL says "use the one-time URL opened by serverctl ui". The launch token was already used or the server restarted. Stop and rerun serverctl ui for a fresh URL.

Port already in use. serverctl ui --port 0 (automatic selection) or pick another port.

Passkey registration fails. Use a browser with WebAuthn platform-authenticator support (Safari, Chrome, Edge) on localhost, not an IP address. Enroll the master password as a fallback factor.

The Files panel cannot open a directory. Run serverctl server test ALIAS --json first. The browser requires the OpenSSH sftp client locally and an enabled SFTP subsystem on the remote host. It also honors normal directory permissions and refuses unknown or changed host keys. An SSH shell can therefore work while browsing still fails if SFTP is disabled by the server administrator.

Why did a green host become amber? Green is reserved for a connection verified within the last two minutes. After that, the result becomes historical and shows “Last reachable” with its age. Click Test, or browse the host over SFTP, to collect a new result. The manager intentionally does not poll every host in the background.

Data & migration#

Where is everything stored? serverctl doctor prints the paths — database in the platform data dir, rendered config at ~/.ssh/ssh-server-manager.conf, secrets in the OS vault under service ssh-server-manager.

How do I move to a new machine? Copy the database (it holds no secrets), re-add secrets on the new machine, or simply re-import from ~/.ssh/config and re-create credentials. A git-friendly export command is on the roadmap.

Does it ever modify my ~/.ssh/config? No. It renders a separate file that Includes your config last. Never Include the rendered file back from your own config — that's a cycle and rendering will refuse.

Edit this page on GitHub