Stop every deploy from throwing everyone off their desktop

FixKlusterServices
Ya
25 Agosti 2026, 16:02 UTC
Mwandishi
Kamo
Ahadi ya
ddff1f0

"An error has occurred and this action cannot be completed" after leaving a desktop open was not an idle timeout and not a browser problem. It was CI. deploy-services.yml ran `kubectl rollout restart deployment/guacamole` unconditionally on every deploy that touched desktop/. Guacamole keeps its sessions in memory (HashTokenSessionMap) and its GUACAMOLE_HOME is an emptyDir, so replacing the pod destroys every live session: the browser's next /api/tokens gets a 502 from Traefik and the app drops to APP.ERROR_PAGE_UNAVAILABLE, which is the exact wording reported. Traefik's access log shows that 502 landing at 15:12:34 and 15:36:44, and a ReplicaSet created 34 seconds before the first. Four rolls on 2026-08-25 alone (13:56, 14:49, 15:12, 15:36); consecutive revisions differ ONLY by **************** so nothing about the deployment was actually changing. The restart had a real purpose — picking up branding or signing-key changes that live in a ConfigMap and a Secret the pod only reads at startup — so it is now conditional instead of removed. A checksum of those inputs is stamped onto the pod template: identical inputs produce an identical patch, which is a no-op that rolls nothing, while a genuine change rolls exactly once. Verified against the cluster on a scratch deployment: generation 1 -> 2 on a new sum, 2 -> 2 on the same sum, 2 -> 3 on a changed sum. Second, a restart should not be a dead end for whoever was working. The SSO link is still in the address bar and stays redeemable, so kamo-reconnect.js (shipped via the branding extension's "js" manifest field, confirmed present as @JsonProperty("js") in ExtensionManifest) watches for the error page and reloads to reconnect. It refuses to reload a HIDDEN tab — background timers are throttled to about once a minute, far past guacd's 15-second patience, so reconnecting into one just dies again in a loop — and waits for the tab to be looked at instead. It refuses to reload without ?data=, which would loop against a login screen. Its attempt budget lives in sessionStorage so it survives the reloads it triggers, and an unreadable budget degrades to the old dead end rather than to an unbounded loop. 10 unit tests, gated in CI.

Mabadiliko yote

Je, unaona nini kuhusu usafiri?

Kila moja ya hizi updates ardhi katika nafasi yako ya kazi moja kwa moja. Kuanza bure na kuangalia kukua wiki baada ya wiki.

Kuwa Huru MileleMtazamo wa bei