From ca5d1af2b5351cdd4776cdd08a61c2391699ca92 Mon Sep 17 00:00:00 2001 From: Ruslan Date: Tue, 21 Jul 2026 13:53:18 +0000 Subject: [PATCH] fix: webpool containers now stay alive 24h; recycle on session expiry - Pool containers got IDLE_TIMEOUT=86400 instead of SESSION_IDLE_SECONDS (300s) to prevent them from cycling every 5 minutes while idle - On session expiry, WEBPOOLIDX containers are now stopped so ensure_web_pool() recreates them fresh for the next user (prevents dirty Chromium state) --- app/maintenance.py | 9 ++++++++- app/runtime.py | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/maintenance.py b/app/maintenance.py index e6358c9..b1baa0c 100644 --- a/app/maintenance.py +++ b/app/maintenance.py @@ -23,6 +23,7 @@ from runtime import ( ensure_web_pool, start_rdp_slot_container, stop_runtime_container, + web_pool_container_name, ) logger = logging.getLogger("portal") @@ -58,10 +59,16 @@ def cleanup_loop(): rdp_slots_to_restart.append(int(cid.split(":", 1)[1])) except Exception: pass + elif cid.startswith("WEBPOOLIDX:"): + try: + slot = int(cid.split(":", 1)[1]) + stop_runtime_container(web_pool_container_name(slot)) + except Exception: + logger.exception("webpool_slot_recycle_failed cid=%s", cid) elif cid and not ( cid.startswith("POOL:") or cid.startswith("POOLIDX:") - or cid.startswith("WEBPOOLIDX:") + or cid.startswith("RDPSLOT:") ): stop_runtime_container(cid) sess.status = SessionStatus.EXPIRED diff --git a/app/runtime.py b/app/runtime.py index 8b74e10..ff10eaf 100644 --- a/app/runtime.py +++ b/app/runtime.py @@ -145,7 +145,7 @@ def ensure_web_pool(target_size: Optional[int] = None) -> None: "portal.pool.slot": str(i), } env = { - "IDLE_TIMEOUT": str(SESSION_IDLE_SECONDS), + "IDLE_TIMEOUT": "86400", "ENABLE_HEARTBEAT": "0", "SESSION_ID": f"webpool-{i}", "X11VNC_FLAGS": X11VNC_FLAGS,