-
Notifications
You must be signed in to change notification settings - Fork 0
Troubleshooting
Fixes for the errors and gotchas people most often hit self-hosting Termi. If your issue isn't listed here, check GitHub Discussions or open a bug report.
You're missing (or have an empty) ENCRYPTION_KEY in your .env. Generate one and set it:
openssl rand -base64 32This key encrypts every stored credential — see Security for why it's required rather than optional.
guacd (the Apache Guacamole daemon that powers RDP/VNC) has known FreeRDP struct-alignment bugs when emulated on ARM64. On Apple Silicon Macs, always start it with the native platform flag:
docker run -d -p 4822:4822 --name termi-guacd --platform linux/arm64 guacamole/guacd:1.6.0Some Windows/RDP servers don't support Network Level Authentication (NLA), which causes credentials to fail without a clear error. In the server's connection settings, set RDP security mode to rdp instead of the default any — this bypasses NLA negotiation.
SESSION_SECRET, ENCRYPTION_KEY, and GATEWAY_JWT_SECRET must be identical between the web app and the gateway service — they're two processes that need to agree on the same secrets to validate each other's tokens. If you generated separate values for each service, connections will fail to authenticate. Set the same three values in both .env files.
This is intentional SSRF protection, not a bug — Termi blocks connections to private/internal IP ranges by default so a malicious "server" entry can't be used to probe your internal network. If you're self-hosting on a home network or homelab and want to manage local devices, set:
ALLOW_PRIVATE_NETWORKS=trueOnly enable this if Termi itself is not exposed to the public internet.
The local terminal feature is opt-in for browser/cloud deployments (it's always available in the desktop app). To enable it on your self-hosted instance:
ALLOW_LOCAL_TERMINAL=trueUnderstand what this grants before enabling it: it lets anyone signed in to your instance open a shell on the machine running the gateway.
If Termi runs behind Traefik, Nginx, or another reverse proxy, set:
TRUSTED_PROXY=trueThis tells Termi to read the real client IP from X-Forwarded-For instead of the proxy's own address.
The bundled native module doesn't match your installed Electron version. Rebuild it:
npm run setup:electronRun this once after any npm install in the Electron workspace.
Expected — the desktop build is ad-hoc signed but not notarized (no paid Apple Developer ID). See Desktop App for the right-click-to-open and quarantine-removal fixes.
Also expected for the same reason. Click More info → Run anyway.
Related pages: Getting Started · Security · FAQ
Termi — self-hosted SSH, SCP, RDP & VNC from your browser. MIT Licensed · Source · Support