diff --git a/backend/open_webui/env.py b/backend/open_webui/env.py index 00b2ef55ae..288b08dd16 100644 --- a/backend/open_webui/env.py +++ b/backend/open_webui/env.py @@ -598,6 +598,19 @@ ENABLE_WEBSOCKET_SUPPORT = ( WEBSOCKET_MANAGER = os.environ.get("WEBSOCKET_MANAGER", "") +WEBSOCKET_REDIS_OPTIONS = os.environ.get("WEBSOCKET_REDIS_OPTIONS", "") +if WEBSOCKET_REDIS_OPTIONS == "": + log.debug("No WEBSOCKET_REDIS_OPTIONS provided, defaulting to None") + WEBSOCKET_REDIS_OPTIONS = None +else: + try: + WEBSOCKET_REDIS_OPTIONS = json.loads( + WEBSOCKET_REDIS_OPTIONS + ) + except Exception: + log.warning("Invalid WEBSOCKET_REDIS_OPTIONS, defaulting to None") + WEBSOCKET_REDIS_OPTIONS = None + WEBSOCKET_REDIS_URL = os.environ.get("WEBSOCKET_REDIS_URL", REDIS_URL) WEBSOCKET_REDIS_CLUSTER = ( os.environ.get("WEBSOCKET_REDIS_CLUSTER", str(REDIS_CLUSTER)).lower() == "true" @@ -612,6 +625,19 @@ except ValueError: WEBSOCKET_SENTINEL_HOSTS = os.environ.get("WEBSOCKET_SENTINEL_HOSTS", "") WEBSOCKET_SENTINEL_PORT = os.environ.get("WEBSOCKET_SENTINEL_PORT", "26379") +WEBSOCKET_SERVER_LOGGING = os.environ.get("WEBSOCKET_SERVER_LOGGING", "False").lower() == "true" +WEBSOCKET_SERVER_ENGINEIO_LOGGING = os.environ.get("WEBSOCKET_SERVER_LOGGING", "False").lower() == "true" +WEBSOCKET_SERVER_PING_TIMEOUT = os.environ.get("WEBSOCKET_SERVER_PING_TIMEOUT", "20") +try: + WEBSOCKET_SERVER_PING_TIMEOUT = int(WEBSOCKET_SERVER_PING_TIMEOUT) +except ValueError: + WEBSOCKET_SERVER_PING_TIMEOUT = 20 + +WEBSOCKET_SERVER_PING_INTERVAL = os.environ.get("WEBSOCKET_SERVER_PING_INTERVAL", "25") +try: + WEBSOCKET_SERVER_PING_INTERVAL = int(WEBSOCKET_SERVER_PING_INTERVAL) +except ValueError: + WEBSOCKET_SERVER_PING_INTERVAL = 25 AIOHTTP_CLIENT_TIMEOUT = os.environ.get("AIOHTTP_CLIENT_TIMEOUT", "") diff --git a/backend/open_webui/socket/main.py b/backend/open_webui/socket/main.py index 5c365f76ac..2ef556f987 100644 --- a/backend/open_webui/socket/main.py +++ b/backend/open_webui/socket/main.py @@ -32,6 +32,11 @@ from open_webui.env import ( WEBSOCKET_SENTINEL_PORT, WEBSOCKET_SENTINEL_HOSTS, REDIS_KEY_PREFIX, + WEBSOCKET_REDIS_OPTIONS, + WEBSOCKET_SERVER_PING_TIMEOUT, + WEBSOCKET_SERVER_PING_INTERVAL, + WEBSOCKET_SERVER_LOGGING, + WEBSOCKET_SERVER_ENGINEIO_LOGGING, ) from open_webui.utils.auth import decode_token from open_webui.socket.utils import RedisDict, RedisLock, YdocManager @@ -61,10 +66,11 @@ if WEBSOCKET_MANAGER == "redis": mgr = socketio.AsyncRedisManager( get_sentinel_url_from_env( WEBSOCKET_REDIS_URL, WEBSOCKET_SENTINEL_HOSTS, WEBSOCKET_SENTINEL_PORT - ) + ), + redis_options=WEBSOCKET_REDIS_OPTIONS, ) else: - mgr = socketio.AsyncRedisManager(WEBSOCKET_REDIS_URL) + mgr = socketio.AsyncRedisManager(WEBSOCKET_REDIS_URL, redis_options=WEBSOCKET_REDIS_OPTIONS) sio = socketio.AsyncServer( cors_allowed_origins=SOCKETIO_CORS_ORIGINS, async_mode="asgi", @@ -72,6 +78,10 @@ if WEBSOCKET_MANAGER == "redis": allow_upgrades=ENABLE_WEBSOCKET_SUPPORT, always_connect=True, client_manager=mgr, + logger=WEBSOCKET_SERVER_LOGGING, + ping_interval=WEBSOCKET_SERVER_PING_INTERVAL, + ping_timeout=WEBSOCKET_SERVER_PING_TIMEOUT, + engineio_logger=WEBSOCKET_SERVER_ENGINEIO_LOGGING, ) else: sio = socketio.AsyncServer( @@ -80,6 +90,10 @@ else: transports=(["websocket"] if ENABLE_WEBSOCKET_SUPPORT else ["polling"]), allow_upgrades=ENABLE_WEBSOCKET_SUPPORT, always_connect=True, + logger=WEBSOCKET_SERVER_LOGGING, + ping_interval=WEBSOCKET_SERVER_PING_INTERVAL, + ping_timeout=WEBSOCKET_SERVER_PING_TIMEOUT, + engineio_logger=WEBSOCKET_SERVER_ENGINEIO_LOGGING, )