Overview
Apache Guacamole is a clientless remote desktop gateway: users open RDP, VNC, SSH, and telnet sessions to internal machines in a plain browser tab, with no client, plugin, or VPN to install. This template deploys the Guacamole web application together with theguacd protocol daemon in one workload, backed by a bundled PostgreSQL that holds users, connections, permissions, and session history. The gateway runs as a single replica and is private by default — you reach the UI over a port forward and opt in to publishing it.
The administrator login is not a template value. It comes from a dictionary secret you create before installing, so it never passes through Helm and never lands in the release.
What Gets Created
Prerequisites
One secret must exist before you install. It holds the Guacamole administrator login. The values never pass through Helm, so they do not land in the release. Secrets are org-level, so no GVC flag is involved.Create the admin secret
username and password. They become the Guacamole administrator account, replacing the well-known stock guacadmin account before the web application ever serves a request:admin.secretName to this name.Read the secret back later
-o yaml. A bare cpln secret reveal prints only a summary table, not the values:Installation
Once your admin secret exists, install from the marketplace registry, pointingadmin.secretName at it and replacing the bundled database password:
postgres.config.credentialsSecretName to a name no other release uses — secret names are org-wide.
Other ways to install and manage the template:
UI
CLI
Terraform
Pulumi
Configuration
Guacamole Web Application
guacd Protocol Daemon
guacd:1.6.0 has RDP, VNC, SSH, and telnet compiled in. The Kubernetes protocol is not included.
Admin Account
admin.secretName is required. The secret is read on first boot only; afterwards, change the password in the Guacamole UI, not in the secret.
Logging
warn is deliberately not an option: guacd spells that level warning while the web application spells it warn, so no single value covers both containers. The chart rejects anything outside the four listed values at render.
Access
guacd may dial: a remote desktop gateway needs outbound reach to the machines its connections target, so egress stays open. Control what a user can connect to through the connections and permissions you create inside Guacamole.
Bundled PostgreSQL
The database is the postgres template as a subchart, so every knob of that template is available underpostgres.*. The chart builds the credentials secret from postgres.credentials.* for you — nothing to create before installing. postgres.image also sets the image of the schema-init container, so psql always matches the server version.
postgres.credentials.password seeds the database on first boot and is not updated by later value edits. Uninstalling the release deletes the volume set; reinstall to reset.Connecting
/, not at /guacamole/. With the default private install, reach the UI from your machine through a tunnel and open http://localhost:8080:
First Run
A default install is closed to the internet. Sign in through a port forward first, set your own password, add a connection, and publish the UI only if you want it reachable from outside the GVC.Wait for the gateway to report ready
schema-init container loads the schema and writes your administrator account, and only then does the web application start serving. Expect the first boot to take a few minutes.guacamole: waiting for the schema and admin account to be applied...; the boot is finished when schema-init: bootstrap complete, idling and guacamole: schema ready, starting Tomcat appear:Sign in over a port forward
cpln port-forward is a top-level command, not a cpln workload subcommand:http://localhost:8080 and sign in with the username and password from your admin secret. The stock guacadmin / guacadmin login is never valid here — the stock account is replaced by yours before the web application starts.Change the administrator password
Add a connection
WORKLOAD_NAME.GVC_NAME.cpln.local — with the service’s port (for example 22 for SSH). A bare short name does not reliably resolve. Then grant users access to the connection under Settings → Users.Publish the UI, if you want it public
publicAccess.enabled set to true. The canonical *.cpln.app hostname then appears under status.canonicalEndpoint:Operations
Backing Up
Scheduled backups of the bundled PostgreSQL are off by default. Enablingpostgres.backup.enabled: true adds one cron workload, RELEASE_NAME-postgres-backup, that runs pg_dumpall on the schedule and uploads a gzipped dump to your bucket under the configured prefix. The dump covers everything Guacamole persists: users, connections, connection parameters, permissions, and session history. Pick a postgres.backup.provider and complete the matching setup before installing or upgrading with it on.
- AWS S3
- Google Cloud Storage
- MinIO / S3-compatible
Create a bucket
postgres.backup.aws.bucket and postgres.backup.aws.region to match.Set up a cloud account
postgres.backup.aws.cloudAccountName to its name.Create a bucket-scoped IAM policy
YOUR_BUCKET_NAME) and set postgres.backup.aws.policyName to its name. The template attaches it to the PostgreSQL identity and nothing else — the bucket in your policy is the only storage the backup job can reach:postgres.backup.image must match the PostgreSQL major version in postgres.image. If you move off the defaults, change both together. The full per-provider walkthrough lives on the postgres template page.RELEASE_NAME-pg-vs takes no scheduled snapshots; a final snapshot is taken when the volume set is deleted and kept 7 days.
Restoring a Backup
Each backup is a gzipped plain-SQLpg_dumpall archive. Restoring means replaying that SQL into the bundled PostgreSQL. The one transport that carries a dump into the container intact is cpln workload exec with --stdin and a base64 wrapper on both ends — raw binary piped through exec is corrupted:
CREATE ROLE and CREATE DATABASE statements, so a straight replay collides with the guacamole database the schema-init container already created on first boot; and no user should be signed in while you drop and recreate that database before the replay — every session is cut when its rows disappear.
Scaling and Availability
This template runs exactly one replica, and there is noreplicas knob. Guacamole keeps authentication tokens in each web application’s memory with no cross-instance sharing, so a second replica would randomly sign users out.
Any restart — an upgrade, a replica reschedule, or a forced redeployment — therefore drops active desktop sessions and signs everyone out. Reconnecting re-establishes the session. Nothing persisted is lost: users, connections, permissions, and history all live in PostgreSQL on the RELEASE_NAME-pg-vs volume set, which survives restarts, redeploys, and upgrades under the same release name.
helm upgrade after an install can restart the bundled PostgreSQL even when its values are unchanged, so expect a brief interruption.cpln workload force-redeployment RELEASE_NAME-guacamole --gvc GVC_NAME. For the admin credentials specifically, even a redeployment does not change your login — those are applied on first boot only.
Troubleshooting
Deployment never becomes ready and the logs are empty
Deployment never becomes ready and the logs are empty
cpln helm install reported success, cpln logs returns nothing, and cpln workload get-deployments RELEASE_NAME-guacamole --gvc GVC_NAME -o yaml shows The secret ADMIN_SECRET_NAME no longer exists. Workload updates are paused until the secret is added or the reference to the secret removed. under status.versions[].message.Cause: The prerequisite admin secret named by admin.secretName does not exist.Fix: Create it (see Prerequisites). The deployment recovers on its own once the secret exists; cpln workload force-redeployment RELEASE_NAME-guacamole --gvc GVC_NAME skips the wait.Gateway stays at waiting for the schema and admin account to be applied
Gateway stays at waiting for the schema and admin account to be applied
guacamole: waiting for the schema and admin account to be applied... without ever reaching schema-init: bootstrap complete, idling.Cause: The schema-init container is almost always still waiting on PostgreSQL — its own log line reads schema-init: waiting for postgres at RELEASE_NAME-postgres.GVC_NAME.cpln.local:5432 ....Fix: Check that RELEASE_NAME-postgres is ready with cpln workload get-deployments RELEASE_NAME-postgres --gvc GVC_NAME -o yaml, then follow the bootstrap with a server-side filter:Second install refused as managed by a different release
Second install refused as managed by a different release
cannot be updated because it is being managed by a different release and creates nothing.Cause: Both releases use the same postgres.config.credentialsSecretName. Secret names are org-wide, and the first release owns that one. Nothing is shared, overwritten, or deleted.Fix: Set postgres.config.credentialsSecretName to a distinct name for the second release and install again.Rotated the admin secret but the old password still works
Rotated the admin secret but the old password still works
username or password in the admin secret (and even forced a redeployment), yet the original credentials still sign in and the new ones are rejected.Cause: The admin credentials seed the database on first boot only. Once the schema exists the schema-init container logs schema-init: guacamole schema already present, skipping bootstrap and leaves the account alone — otherwise every restart would overwrite a password changed in the UI.Fix: Change the password in the Guacamole UI under Settings → Preferences, or as an administrator under Settings → Users.guacadmin / guacadmin does not sign in
guacadmin / guacadmin does not sign in
username and password in your admin secret before the web application starts serving.Fix: Sign in with the values from cpln secret reveal ADMIN_SECRET_NAME -o yaml.Render fails because logLevel must be trace, debug, info or error
Render fails because logLevel must be trace, debug, info or error
guacamole: logLevel must be 'trace', 'debug', 'info' or 'error', got 'warn'.Cause: warn is excluded because guacd spells that level warning and the web application spells it warn, so no single value covers both containers.Fix: Use info or error.Everyone was signed out after an upgrade or restart
Everyone was signed out after an upgrade or restart
helm upgrade, a forced redeployment, or a replica reschedule, every user is back at the login page and open desktop sessions ended.Cause: Expected. Guacamole holds authentication tokens in the web application’s memory, and the template runs one replica — see Scaling and Availability.Fix: Sign in again and reconnect. Users, connections, and history are intact in PostgreSQL.A connection to a workload in the GVC cannot resolve its host
A connection to a workload in the GVC cannot resolve its host
guacd.Cause: The connection’s hostname is a bare workload name. Short names do not reliably resolve.Fix: Edit the connection and set the hostname to the fully qualified form WORKLOAD_NAME.GVC_NAME.cpln.local.Important Notes
- Create the admin secret before installing —
admin.secretNamemust name an existing dictionary secret withusernameandpassword. A missing secret wedges the deployment silently; see Prerequisites for the one command that shows the reason. - The admin credentials are first-boot only. Rotating the secret afterwards does not change your login. Change the password in the Guacamole UI instead.
guacadmin/guacadminis never valid here — the stock account is replaced by yours before the web application starts.- Rotating any referenced secret does not restart the workload. The old value stays in force until you run
cpln workload force-redeployment RELEASE_NAME-guacamole --gvc GVC_NAME. - Single replica by design, with no
replicasknob. Any restart drops active desktop sessions and signs everyone out; see Scaling and Availability. - Public access is off by default. Reach the UI over
cpln port-forwarduntil you deliberately publish it. Access changes take a couple of minutes to take effect. guacd’s port4822is intentionally unpublished because the protocol daemon is unauthenticated. Only the web application in the same workload can reach it.- Only RDP, VNC, SSH, and telnet are available in
guacd:1.6.0. The Kubernetes protocol is not compiled in. - Use fully qualified internal names —
WORKLOAD_NAME.GVC_NAME.cpln.local— both for reaching Guacamole from other workloads and for the connection targets you configure in it. - Keep
guacamole.imageandguacd.imageon the same tag — the web application and the protocol daemon are versioned together upstream. - Change
postgres.credentials.passwordbefore installing and give each release its ownpostgres.config.credentialsSecretName— secret names are org-wide, and a second release on the same name is refused at install. - Uninstalling deletes the volume set and every user, connection, and history row in it; your admin secret is yours and survives.