How to Install Apache Guacamole (RDP, VNC and SSH to Every Machine from One Browser Tab)

Every machine's screen in a browser tab: Guacamole does RDP, VNC and SSH behind one login with 2FA — from a work laptop that allows nothing else.

RustDesk (175) is for helping people. Guacamole is for reaching your machines: the Windows PC upstairs by RDP, a Linux desktop by VNC, the servers by SSH, the Proxmox VM consoles — all as tabs in a browser, with nothing installed on the device you're sitting at. Behind HTTPS and TOTP it's the way to get to a home screen from a work laptop that forbids VPN clients and remote-desktop software.

Quick reference

PieceWhat
Containersguacamole/guacd (the protocol engine), guacamole/guacamole (web), PostgreSQL
Webhttp://server-ip:8084/guacamole → guacadmin / guacadmin (change it!)
ConnectionsSettings → Connections → New: RDP / VNC / SSH / Telnet / Kubernetes
2FATOTP_ENABLED: "true"
Behind the proxyremote.example.com with WebSocket lines; /guacamole/ path or WEBAPP_CONTEXT: ROOT
Clipboard, filesper connection: clipboard both ways, SFTP/RDP drive mapping

1. Initialise the database

Guacamole needs its schema loaded once:

mkdir -p ~/docker/guacamole/init && cd ~/docker/guacamole
docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --postgresql > init/initdb.sql

2. The compose file

nano compose.yaml

services:
guacd:
image: guacamole/guacd:latest
container_name: guacd
restart: unless-stopped

guac-db:
image: postgres:16-alpine
container_name: guac-db
environment:
POSTGRES_DB: guacamole_db
POSTGRES_USER: guacamole
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- ./db:/var/lib/postgresql/data
- ./init:/docker-entrypoint-initdb.d:ro
restart: unless-stopped

guacamole:
image: guacamole/guacamole:latest
container_name: guacamole
ports:
- "127.0.0.1:8084:8080"
environment:
GUACD_HOSTNAME: guacd
POSTGRESQL_HOSTNAME: guac-db
POSTGRESQL_DATABASE: guacamole_db
POSTGRESQL_USERNAME: guacamole
POSTGRESQL_PASSWORD: ${DB_PASSWORD}
TOTP_ENABLED: "true"
WEBAPP_CONTEXT: ROOT
depends_on: [guacd, guac-db]
restart: unless-stopped

docker compose up -d

WEBAPP_CONTEXT: ROOT serves it at / instead of /guacamole/.

3. Proxy and first login

remote.example.com → 127.0.0.1:8084 with the WebSocket lines and proxy_buffering off; (28), HTTPS. Open it, log in guacadmin / guacadmin, enrol the TOTP it asks for, then Settings → Users → guacadmin → change password, and make yourself a second admin user.

4. Add connections

Settings → Connections → New Connection:

Connections can be grouped (Home, Work, Servers) and shared with other Guacamole users with per-connection permissions.

5. Use it

Click a connection; the screen fills the tab. Ctrl + Alt + Shift opens the Guacamole menu: clipboard (copy on the remote, paste locally and vice versa), file transfer, input method, zoom. Several connections run as tabs; the recent list is on the home page. Mobile browsers work, with an on-screen keyboard.

6. Keep it safe

It's a door to every screen: HTTPS always; TOTP on; Authelia (95) or VPN-only (33) in front if it isn't strictly needed from the open internet; strong unique passwords for the RDP/VNC targets; Settings → Sessions to see who's connected; and Guacamole's own history page records every session. Consider session recording (a guacd mount and a per-connection setting) for the audit trail.

Troubleshooting

RDP fails with "security negotiation". Security mode: try nla, then tls, then any; and the Windows account must have a password (blank passwords can't RDP).

Black screen on VNC. The VNC server isn't running, or it's bound to localhost — use an SSH tunnel built into the connection (Guacamole has no tunnel; xrdp avoids it).

Clipboard doesn't work. Not enabled for that connection, or the browser blocked clipboard access — use the Guacamole menu's text box.

"Could not connect to guacd". The guacd container name/port; docker compose logs guacd.

Wrapping up

Three containers, the schema initialised once, TOTP on, a proxy entry. Every PC, desktop and server in the house is a tab behind one login — reachable from a browser on a machine that allows nothing else, with the clipboard and files flowing both ways.

Call us