feat: add open-webui-rust

This commit is contained in:
Sun-ZhenXing
2025-11-13 18:10:31 +08:00
parent 42aa5c40d6
commit 5f9820e7db
14 changed files with 1144 additions and 9 deletions

View File

@@ -0,0 +1,345 @@
# Open WebUI Rust
基于 Rust 的高性能 Open WebUI 实现,具有原生异步运行时和优化的资源效率。
## 概述
Open WebUI Rust 是 Open WebUI 后端的完整 Rust 重写版本,提供:
- **10-50 倍更快的响应时间**API 端点性能显著提升
- **70% 更低的内存使用**:负载下内存占用大幅降低
- **原生并发**:基于 Tokio 的异步运行时
- **类型安全**:防止整类运行时错误
- **零拷贝流式传输**:聊天补全高效传输
- **生产就绪**:全面的错误处理机制
此部署包含:
- **Rust 后端**:高性能 API 服务器,支持 WebSocket
- **PostgreSQL**:数据持久化的主数据库
- **Redis**:缓存和 WebSocket 会话管理
- **Sandbox Executor**:安全的代码执行环境,具有 Docker 隔离
- **Frontend**:基于 SvelteKit 的用户界面,配备 Nginx 反向代理
## 特性
-**完全兼容** Open WebUI Python 后端的 API
-**原生 WebSocket/Socket.IO** 使用 Rust 实现
-**安全的代码执行**:通过隔离的 Docker 容器
-**多语言支持**Python、JavaScript、Shell、Rust
-**RAG 和嵌入**:集成向量数据库
-**身份验证和授权**JWT 令牌
-**速率限制和安全**:内置保护机制
-**全面的日志记录**:用于调试和监控
## 前置要求
- Docker 20.10+
- Docker Compose 2.0+
- 4GB+ 可用内存
- 访问 Docker 套接字(用于沙箱执行)
## 快速开始
### 1. 创建 `.env` 文件
```bash
cp .env.example .env
```
编辑 `.env` 并设置必需的变量:
```bash
# 重要:生成一个安全的密钥(至少 32 个字符)
WEBUI_SECRET_KEY=$(uuidgen | tr '[:upper:]' '[:lower:]' | tr -d '-')
# 可选:配置 OpenAI API
OPENAI_API_KEY=sk-your-api-key
OPENAI_API_BASE_URL=https://api.openai.com/v1
```
### 2. 启动服务
```bash
docker compose up -d
```
### 3. 访问应用程序
- **前端界面**<http://localhost:3000>
- **Rust 后端 API**<http://localhost:8080>
- **Sandbox Executor**<http://localhost:8090>
### 4. 初始设置
1. 打开 <http://localhost:3000>
2. 创建管理员账户(第一个用户成为管理员)
3. 在设置中配置您的 AI 模型
## 架构
```text
┌─────────────┐
│ Frontend │ :3000
│ (SvelteKit) │
└──────┬──────┘
┌─────────────┐ ┌──────────────┐
│Rust Backend │────→│ PostgreSQL │ :5432
│ (API) │ │ (Database) │
└──────┬──────┘ └──────────────┘
├───────────→┌──────────────┐
│ │ Redis │ :6379
│ │ (Cache) │
│ └──────────────┘
└───────────→┌──────────────┐
│ Sandbox │ :8090
│ Executor │
└──────────────┘
```
## 配置
### 核心环境变量
| 变量 | 默认值 | 描述 |
| ---------------------------- | --------------------- | -------------------------------- |
| `WEBUI_SECRET_KEY` | (必需) | JWT 令牌的密钥(至少 32 个字符) |
| `POSTGRES_PASSWORD` | `open_webui_password` | PostgreSQL 密码 |
| `FRONTEND_PORT_OVERRIDE` | `3000` | 前端访问端口 |
| `RUST_BACKEND_PORT_OVERRIDE` | `8080` | 后端 API 端口 |
| `TZ` | `UTC` | 时区设置 |
### 功能开关
| 变量 | 默认值 | 描述 |
| ------------------------- | ------- | ---------------- |
| `ENABLE_CODE_EXECUTION` | `true` | 启用安全代码执行 |
| `ENABLE_CODE_INTERPRETER` | `true` | 启用代码解释器 |
| `ENABLE_IMAGE_GENERATION` | `false` | 启用图像生成 |
| `ENABLE_WEB_SEARCH` | `false` | 启用网络搜索 |
| `ENABLE_SIGNUP` | `true` | 允许新用户注册 |
### 资源限制
每个服务都有可配置的 CPU 和内存限制:
```bash
# Rust 后端
RUST_BACKEND_CPU_LIMIT=2
RUST_BACKEND_MEMORY_LIMIT=2G
# PostgreSQL
POSTGRES_CPU_LIMIT=1
POSTGRES_MEMORY_LIMIT=1G
# Sandbox Executor
SANDBOX_EXECUTOR_CPU_LIMIT=2
SANDBOX_EXECUTOR_MEMORY_LIMIT=2G
```
### 沙箱安全
配置沙箱执行限制:
```bash
SANDBOX_MAX_EXECUTION_TIME=60 # 最大执行时间(秒)
SANDBOX_MAX_MEMORY_MB=512 # 每次执行的最大内存
SANDBOX_MAX_CONCURRENT_EXECUTIONS=10 # 最大并行执行数
SANDBOX_NETWORK_MODE=none # 禁用网络访问
```
## 使用示例
### 基础聊天
```bash
curl -X POST http://localhost:8080/api/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "你好!"}]
}'
```
### 代码执行
```bash
curl -X POST http://localhost:8090/api/v1/execute \
-H "Content-Type: application/json" \
-d '{
"language": "python",
"code": "print(\"Hello from sandbox!\")"
}'
```
## 监控
### 查看日志
```bash
# 所有服务
docker compose logs -f
# 特定服务
docker compose logs -f rust-backend
docker compose logs -f sandbox-executor
```
### 检查服务健康状态
```bash
# Rust 后端
curl http://localhost:8080/health
# Sandbox Executor
curl http://localhost:8090/api/v1/health
# PostgreSQL
docker compose exec postgres pg_isready
```
### 资源使用情况
```bash
docker stats
```
## 维护
### 备份数据库
```bash
docker compose exec postgres pg_dump -U open_webui open_webui > backup.sql
```
### 恢复数据库
```bash
cat backup.sql | docker compose exec -T postgres psql -U open_webui open_webui
```
### 更新服务
```bash
docker compose pull
docker compose up -d
```
### 清理重置
```bash
# 停止并删除所有数据
docker compose down -v
# 全新启动
docker compose up -d
```
## 故障排除
### 无法连接到服务
检查所有容器是否健康:
```bash
docker compose ps
```
### JWT 令牌错误
确保 `WEBUI_SECRET_KEY` 已设置并在重启后保持一致。
### 代码执行失败
1. 验证 Docker 套接字是否可访问
2. 检查 sandbox executor 日志:`docker compose logs sandbox-executor`
3. 确保运行时镜像可用:`docker images | grep sandbox-runtime`
### 内存使用过高
`.env` 中调整资源限制:
```bash
RUST_BACKEND_MEMORY_LIMIT=1G
SANDBOX_EXECUTOR_MEMORY_LIMIT=1G
```
## 安全注意事项
### 生产部署
1. **更改默认密码**
```bash
POSTGRES_PASSWORD=$(openssl rand -base64 32)
WEBUI_SECRET_KEY=$(openssl rand -base64 48)
```
2. **限制网络访问**
```bash
CORS_ALLOW_ORIGIN=https://yourdomain.com
```
3. **初始设置后禁用注册**
```bash
ENABLE_SIGNUP=false
```
4. **使用反向代理启用 HTTPS**nginx、Traefik、Caddy
5. **限制沙箱资源**
```bash
SANDBOX_MAX_EXECUTION_TIME=30
SANDBOX_MAX_MEMORY_MB=256
SANDBOX_NETWORK_MODE=none
```
### Docker 套接字访问
Sandbox Executor 需要访问 Docker 套接字(`/var/run/docker.sock`)以实现容器隔离。这是一个特权操作,应该:
- 仅在受信任的环境中使用
- 通过适当的网络隔离进行保护
- 监控可疑活动
考虑使用以下替代方案:
- Docker-in-DockerDinD以获得更好的隔离
- 带有 Pod 安全策略的 Kubernetes
- 在单独节点上的专用沙箱服务
## 性能
典型资源使用情况:
| 服务 | CPU空闲 | 内存(空闲) | CPU负载 | 内存(负载) |
| ---------------- | ----------- | ------------ | ----------- | ------------ |
| Rust Backend | ~1% | 50MB | 10-30% | 200MB |
| PostgreSQL | ~1% | 50MB | 5-15% | 300MB |
| Redis | <1% | 10MB | 2-5% | 50MB |
| Sandbox Executor | <1% | 30MB | 变化 | 512MB |
| Frontend | <1% | 50MB | 5-10% | 200MB |
## 许可证
本项目遵循原 Open WebUI 的许可证
## 相关项目
- [Open WebUI](https://github.com/open-webui/open-webui) - 原始 Python 实现
- [Open WebUI Rust](https://github.com/knoxchat/open-webui-rust) - 官方 Rust 后端仓库
## 支持
问题和疑问
- [Open WebUI Rust Issues](https://github.com/knoxchat/open-webui-rust/issues)
- [Open WebUI 文档](https://docs.openwebui.com/)