A Docker Compose setup for Apache Guacamole 1.6.0 with MySQL backend and NGINX HTTPS frontend. Supports VNC/RDP/SSH/Telnet. Designed for internal networks with a DNS-resolvable hostname.
git clone https://github.com/daxm/docker-guacamole-server.gitcd docker-guacamole-servercp .env.example .envnano .envSet passwords and SERVER_NAME (e.g., prdscp-bkp01)
./runme.sh- Access: https://<SERVER_NAME>:${HTTPS_PORT:-8443}
- Login with: guacadmin/guacadmin
- Change password via Settings > Preferences.
- MySQL: Persistent DB for users/connections (auto-initialized in ./mysql-data).
- guacd: Protocol proxy daemon (writes recordings to ./recordings).
- guacamole: Web app (Tomcat-based; reads recordings for playback).
- nginx: Reverse proxy with HTTPS (self-signed certs in ./nginx-certs).
- Configurable via .env (defaults: HTTP_PORT=8080, HTTPS_PORT=8443).
- Set SERVER_NAME in .env (defaults to guacamole.local).
- Configured per service in docker-compose.yml with LOG_MAX_SIZE (default 10MB) and LOG_MAX_FILE (default 3 rotations).
- Enabled via RECORDING_ENABLED=true in docker-compose.yml.
- Stored in ./recordings/{HISTORY_UUID}/recording.
- Configured per-connection in UI: Settings > Connections > > Screen Recording section.
- Set Recording Path: to ${HISTORY_PATH}/${HISTORY_UUID}.
- Check boxes for Include key events: and Automatically create recording path:.
- For SSH connections, in the Typescript section:
- Set Typescript path: to ${HISTORY_PATH}/${HISTORY_UUID} and check the Automatically create typescript path: checkbox.
- If configured correctly, replay sessions via the View link in Settings > History. If no View link appears, recording may not be set up for that connection.
-
Connection Issues:
- Ensure target servers are reachable (e.g., SSH port 22 open).
- Check container status:
docker ps. - Verify logs:
docker-compose logs -f.
-
Database Issues:
- Debug DB:
docker exec -it guac-mysql mysql -u ${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE}.- Check tables:
SHOW TABLES; - Check history:
SELECT history_id, connection_id, start_date FROM guacamole_connection_history ORDER BY start_date DESC;
- Check tables:
- Debug DB:
-
Logging:
- Verify logging:
docker inspect guac-mysql | grep -A 4 LogConfig.
- Verify logging:
-
Copy/Paste:
- Use HTTPS for clipboard functionality.
- For RDP, ensure rdpclip is enabled.
- For VNC, use modern servers (e.g., TigerVNC).
-
Recordings:
- Check ./recordings (e.g., ./recordings//recording).
- Verify permissions:
ls -ld recordings. - Fix permissions:
sudo chown -R 1000:1000 recordings && sudo chmod -R 2775 recordings.
-
Rebuild:
docker-compose down -v && docker-compose up --build
- Pin images in docker-compose.yml to latest tags.
docker-compose pull./runme.sh
Built with ❤️ by daxm!