🔗 Redis WebSocket 支持
本教程由社区贡献,不受 Open WebUI 团队支持。它仅作为如何针对特定用例自定义 Open WebUI 的演示。想要做出贡献?请查看贡献教程。
Overview
本篇文档概述了将 Redis 与 Open WebUI 集成以支持 WebSocket 的必要步骤。通过遵循这些步骤,您将能够在您的 Open WebUI 实例中启用 WebSocket 功能,从而实现客户端与应用程序之间的实时通信和更新。
When is Redis Required?
Redis 在 Open WebUI 中服务于两个不同的目的,理解何时需要它对于正确部署至关重要。有关所有扩缩容要求(PostgreSQL、Redis、向量数据库、存储)的高级概述,请参阅 扩展 Open WebUI (Scaling Open WebUI) 指南。
Single Instance Deployments
如果您将 Open WebUI 作为单实例运行,且 UVICORN_WORKERS=1(默认值),那么 Redis 对于基础功能不是必需的。在没有它的情况下,应用程序的绝大多数操作仍能正常运行。
在没有 Redis 的情况下,退出登录并不会使用户的 JWT 令牌失效。该令牌在自然过期之前(默认:4 周)将一直有效且可用。在没有 Redis 的情况下,修改密码和管理员发起的账户停用也无法吊销现有令牌。
对于面向生产环境的部署,请配置 Redis 或缩短 JWT_EXPIRES_IN 以限制暴露窗口。有关详细信息,请参阅 安全加固 (Hardening) 指南。
Multi-Worker and Multi-Instance Deployments
在以下场景中,Redis 变得必不可少:
-
多个 Uvicorn Workers (
UVICORN_WORKERS > 1)- 在单台主机上运行多个工作进程 (worker processes)
- 需要 Redis 在各个 worker 之间共享会话状态和应用程序配置
-
多节点部署 (Multi-Node Deployments)
- 拥有多个 Pod 的 Kubernetes 集群
- 拥有多个副本的 Docker Swarm
- 具有多个 Open WebUI 实例的负载均衡设置
- 需要 Redis 来协调所有实例之间的状态
-
高可用设置 (High Availability Setups)
- 多个 Open WebUI 进程同时运行的任何部署模式
- 需要 Redis 进行会话管理、WebSocket 协调和状态同步
关键要求
在多 worker 或多实例场景中,如果没有配置 Redis,您将遇到:
- 跨 worker 的会话管理失败
- 实例之间的应用程序状态不一致
- 无法正常工作的 WebSocket 连接
- 断断续续的身份验证失败
- 实时聊天更新丢失
Prerequisites
- 一个有效的 Open WebUI 实例(运行版本为 1.0 或更高)
- 一个 Redis 容器(在本示例中,我们将使用
docker.io/valkey/valkey:8.0.1-alpine,它基于最新的 Redis 7.x 版本) - 系统上已安装 Docker Compose(版本为 2.0 或更高)
- 用于 Open WebUI 与 Redis 之间通信的 Docker 网络
- 对 Docker、Redis 和 Open WebUI 的基本理解
Critical: Redis Server Configuration
防止出现“达到最大客户端数量 (Max Number of Clients Reached)”错误
在将 Open WebUI 配置为使用 Redis 之前,您必须确保您的 Redis 服务器本身配置正确。常见的错误配置会导致连接随着时间的推移而不断累积,最终耗尽连接限制,从而导致完全的身份验证失败(所有用户都会遇到 500 内部服务器错误)。
问题所在:
Open WebUI 使用 Redis 进行:
- 令牌验证/吊销检查(针对每个已验证的请求)
- WebSocket 管 理(实时更新)
- 会话存储(如果启用了
ENABLE_STAR_SESSIONS_MIDDLEWARE)
在某些发行版上,使用默认的 Redis 设置(maxclients 1000, timeout 0)时,连接永远不会关闭。数天或数周后,它们会默默地累积,直到达到上限。然后,突然之间,所有人都会无法登录。
症状:
- 应用程序在数天/数周内运行良好
- 突然之间,所有用户在登录时都会收到 500 内部服务器错误
- 日志中的错误:
redis.exceptions.ConnectionError: max number of clients reached - 随着旧连接最终断开,可能会暂时“自行修复”,但随后会再次失败
解决方案:
将以下设置添加到您的 Redis 配置中:
# 允许足够的并发连接
maxclients 10000
# 关闭空闲超过 30 分钟(1800 秒)的连接
# 这并不会影响会话有效性 —— 仅关闭到 Redis 的 TCP 连接
timeout 1800
对于 Docker 部 署,请在您的 Redis 启动命令中添加:
services:
redis:
image: docker.io/valkey/valkey:8.0.1-alpine
command: "valkey-server --save 30 1 --maxclients 10000 --timeout 1800"
# ... 其他配置为什么 timeout 1800 是安全的:
该超时时间仅影响空闲的 Redis TCP 连接,不影响用户会话。当连接超时关闭时:
- 用户的 JWT 令牌依然有效
- 他们的会话不受影响
- 下一次请求只需重新打开一个 Redis 连接(增加约 1-5ms 延迟,完全无感)
监控:
检查当前连接数:
redis-cli INFO clients | grep connected_clients在配置了正确的 timeout 后,这个数字应该自然波动(在活跃时间内上升,在空闲时间内下降),而不是无限攀升。
Setting up Redis
要为 WebSocket 支持设置 Redis,您需要创建一个具有以下内容的 docker-compose.yml 文件:
version: '3.9'
services:
redis:
image: docker.io/valkey/valkey:8.0.1-alpine
container_name: redis-valkey
volumes:
- redis-data:/data
command: "valkey-server --save 30 1 --maxclients 10000 --timeout 1800"
healthcheck:
test: "[ $$(valkey-cli ping) = 'PONG' ]"
start_period: 5s
interval: 1s
timeout: 3s
retries: 5
restart: unless-stopped
cap_drop:
- ALL
cap_add:
- SETGID
- SETUID
- DAC_OVERRIDE
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "1"
networks:
- openwebui-network
volumes:
redis-data:
networks:
openwebui-network:
external: true