Theme system: - 6 built-in presets (dark, light, high-contrast, terminal, nord, corporate) - Admin configures preset + per-color overrides in [theme] config section - Client-side theme switching via localStorage (flash-free) - All static pages updated with 28 CSS custom properties Proxy telemetry: - Track which side terminated connection (guacd/browser/cancelled) - Timing-based log levels (guacd close <5s = warning) - Clamp session dimensions to safe ranges (width 640-8192, height 480-8192, DPI 16-384) Docker fixes (#37): - Fix port mismatch: Dockerfile now uses 8089 consistently - Auto-generate admin API key on first run - Add API key setup docs and recordings volume to compose example ARM64 support: - Multi-platform Docker builds (linux/amd64 + linux/arm64) - Native ARM64 .deb and tarball builds via ubuntu-24.04-arm runner Dependency updates: - rustls 0.23.37, chrono 0.4.44, clap 4.5.60, toml 1.0.3 - futures-util 0.3.32, uuid 1.21.0, pulldown-cmark 0.13.1 - actions/upload-artifact v7, actions/download-artifact v8 Also: FreeRDP 3.x NULL deref patch (003), .gitignore for .playwright-mcp/ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
6.0 KiB
Installation
Option A: Debian package (recommended)
Pre-built .deb packages are available from the releases page for Debian 13 (Trixie) and compatible distributions.
sudo apt install ./rustguac_*.deb
Using apt install (not dpkg -i) ensures all runtime dependencies are resolved automatically.
The package installs to /opt/rustguac and creates systemd services for both guacd and rustguac.
Post-install
- Create an admin API key:
/opt/rustguac/bin/rustguac --config /opt/rustguac/config.toml add-admin --name admin
Save the printed API key — it is only shown once.
-
Configure — edit
/opt/rustguac/config.tomlas needed (see Configuration). -
Start the services:
sudo systemctl enable --now rustguac
This starts both rustguac-guacd (the protocol daemon) and rustguac (the web proxy).
- (Optional) Set up encrypted drive storage:
sudo /opt/rustguac/bin/drive-setup.sh
See Drive / File Transfer for details.
Option B: Bare-metal install script
For fresh Debian 13 systems, the install script builds everything from source:
sudo ./install.sh
This performs the following steps:
- Installs system packages (build tools, Xvnc, Chromium, cryptsetup, etc.)
- Installs the Rust toolchain (if not present)
- Clones and builds guacd from guacamole-server source, applying patches automatically
- Builds rustguac with
cargo build --release - Creates the
rustguacsystem user (home:/home/rustguac) - Generates a self-signed TLS certificate
- Installs binaries, static files, and config to
/opt/rustguac - Sets up systemd services
Install flags
| Flag | Description |
|---|---|
--no-tls |
Skip TLS certificate generation, listen on HTTP port 8089 |
--hostname=FQDN |
Hostname for the TLS certificate (default: system hostname) |
--deps-only |
Only install system packages, then exit |
--no-deps |
Skip apt package installation |
Installed layout
/opt/rustguac/
bin/rustguac # Main binary
bin/drive-setup.sh # LUKS drive setup script
sbin/guacd # Guacamole protocol daemon
lib/ # guacd shared libraries
static/ # Web UI files
tls/ # TLS certificates
data/ # SQLite database
recordings/ # Session recordings
config.toml # Configuration file
env # Environment variables (VAULT_SECRET_ID, etc.)
Systemd services
| Service | Description |
|---|---|
rustguac-guacd |
guacd protocol daemon (TLS, loopback only) |
rustguac |
rustguac web proxy (depends on guacd) |
Both services run as the rustguac user and restart on failure.
The rustguac service loads environment variables from /opt/rustguac/env via systemd's EnvironmentFile directive. Use this for secrets like VAULT_SECRET_ID and OIDC_CLIENT_SECRET.
Option C: Docker
Pre-built images are available on Docker Hub:
docker pull sol1/rustguac:latest
docker run -d -p 8089:8089 sol1/rustguac:latest
To build from source instead:
docker build -t rustguac .
docker run -d -p 8089:8089 rustguac
The Docker image:
- Uses a multi-stage build (Debian 13 trixie-slim runtime)
- Builds guacd from source with patches applied
- Generates a self-signed TLS certificate at build time
- Enables TLS between rustguac and guacd by default
- Exposes HTTP on port 8089 (put a reverse proxy in front for HTTPS)
API key setup
On first run (when no database exists), the container automatically generates an admin API key and prints it to the logs:
docker logs rustguac
Save the printed key — it is only shown once. To generate additional keys later:
docker exec rustguac /opt/rustguac/bin/rustguac \
--config /opt/rustguac/config.toml add-admin --name my-admin
Docker Compose example
services:
rustguac:
image: sol1/rustguac:latest
ports:
- "8089:8089"
volumes:
- rustguac-data:/opt/rustguac/data
- rustguac-recordings:/opt/rustguac/recordings
environment:
- RUST_LOG=info
volumes:
rustguac-data:
rustguac-recordings:
Option D: RPM package
An RPM spec is available for Red Hat / Fedora / Rocky Linux based systems:
bash build-rpm.sh
sudo rpm -i rustguac-*.rpm
Option E: Development
# Clone guacamole-server alongside rustguac
git clone https://github.com/apache/guacamole-server.git ../guacamole-server
# Install build deps, build guacd, build + run rustguac
./dev.sh deps
./dev.sh build-guacd
./dev.sh start
For development with TLS:
./dev.sh generate-cert
cat > config.local.toml <<EOF
[tls]
cert_path = "cert.pem"
key_path = "key.pem"
guacd_cert_path = "cert.pem"
EOF
./dev.sh start
System dependencies
For bare-metal installs, rustguac requires:
- Rust toolchain (1.75+)
- guacd (built from guacamole-server source)
- Xvnc (tigervnc-standalone-server) — for web browser sessions
- Chromium — for web browser sessions
- cryptsetup — for LUKS encrypted drive storage
- Build libraries for guacd: libcairo2, libjpeg, libpng, libwebp, libssh2, libssl, libvncserver, libpango, libpulse, ffmpeg, freerdp3
See install.sh for the full package list.
guacamole-server patches
guacd requires patches to build and run correctly with FreeRDP 3.15+ as shipped in Debian 13. These patches are in the patches/ directory and are applied automatically by all build scripts.
The patches fix:
- Autoconf
-Werrorvs deprecated FreeRDP headers — FreeRDP 3.15 deprecatescodecs_free(), breaking compile tests - Deprecated function pointer API — replaces
->input->MouseEvent()etc. with safe FreeRDP 3.x functions - NULL pointer dereference — FreeRDP 3.x fires PubSub events before
guac_rdp_dispis allocated