Terminals(编排层)
Terminals 是面向 Open Terminal 的企业级编排层。它会为每个用户分配一个完全隔离的 terminal 容器,而不是让所有人共享一个容器。
- 需要给不同团队配置不同环境?请看 Policies guide
工作原理
- 用户在 OPL 数据空间中启用 terminal
- OPL 数据空间把请求转给 orchestrator
- orchestrator 为该用户创建一个 Open Terminal 容器,或者恢复已有容器
- 所有流量都经由 orchestrator 代理,用户不会直接连到容器
- 空闲容器可按策略自动清理,数据可选持久化
它同时暴露与 Open Terminal 相同的工具接口,因此 AI 仍然能像平时一样执行命令、读文件、跑代码,只不过现在这些能力都被限定在“当前用户自己的容器”里。
部署
- Docker
- Kubernetes Operator
前置条件
- 已安装并运行 Docker Engine
- OPL 数据空间已运行,或准备和它一起部署
- OPL 数据空间 Enterprise License
用 Docker Compose 快速启动
下面这个 Compose 文件会同时部署 OPL 数据空间和 Terminals orchestrator:
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
ports:
- "3000:8080"
environment:
- >-
TERMINAL_SERVER_CONNECTIONS=[{
"id": "terminals",
"name": "Terminals",
"enabled": true,
"url": "http://terminals:3000",
"key": "${TERMINALS_API_KEY}",
"auth_type": "bearer"
}]
depends_on:
- terminals
terminals:
image: ghcr.io/open-webui/terminals:latest
environment:
- TERMINALS_BACKEND=docker
- TERMINALS_API_KEY=${TERMINALS_API_KEY}
- TERMINALS_IMAGE=ghcr.io/open-webui/open-terminal:latest
- TERMINALS_NETWORK=open-webui-network
- TERMINALS_IDLE_TIMEOUT_MINUTES=30
volumes:
- /var/run/docker.sock:/var/run/docker.sock.env 文件示例:
TERMINALS_API_KEY=change-me-to-a-strong-random-value
启动:
docker compose up -d部署完成后, OPL 数据空间 会在 http://localhost:3000 可用。用户激活 terminal 时,orchestrator 会自动为其创建独立容器。
orchestrator 需要通过 /var/run/docker.sock 管理容器。生产环境建议配合 Docker socket proxy 来收窄权限。
常见配置项
| 变量 | 默认值 | 说明 |
|---|---|---|
TERMINALS_BACKEND | docker | 当前部署模式 |
TERMINALS_API_KEY | 空 | OPL 数据空间与 orchestrator 共享密钥 |
TERMINALS_IMAGE | ghcr.io/open-webui/open-terminal:latest | 用户 terminal 的默认镜像 |
TERMINALS_PORT | 3000 | orchestrator 监听端口 |
TERMINALS_HOST | 0.0.0.0 | orchestrator 监听地址 |
TERMINALS_NETWORK | 空 | 用户容器所加入的 Docker 网络 |
TERMINALS_DOCKER_HOST | 127.0.0.1 | 无 TERMINALS_NETWORK 时用于 published ports |
TERMINALS_DATA_DIR | data/terminals | 每用户工作目录数据位置 |
TERMINALS_IDLE_TIMEOUT_MINUTES | 0 | 空闲超时 |
TERMINALS_MAX_CPU | 空 | CPU 上限 |
TERMINALS_MAX_MEMORY | 空 | 内存上限 |
TERMINALS_OPEN_WEBUI_URL | 空 | 若设置则改用 JWT 校验 |
局限性
- 单主机场景
- 无内建高可用
- 依赖 Docker socket
前置条件
- 可用的 Kubernetes 集群(v1.24+)
- 已安装 Helm v3
kubectl已配置好- OPL 数据空间 Enterprise License
使用 Helm 部署
OPL 数据空间 Helm chart 内置了可选的 Terminals 子 chart。你只需要在 values 文件里增加:
terminals:
enabled: true
apiKey: ""
crd:
install: true
operator:
image:
repository: ghcr.io/open-webui/terminals-operator
tag: latest
orchestrator:
image:
repository: ghcr.io/open-webui/terminals
tag: latest
backend: kubernetes-operator
terminalImage: "ghcr.io/open-webui/open-terminal:latest"
idleTimeoutMinutes: 30安装或升级:
helm upgrade --install open-webui open-webui/open-webui \
-f values.yaml \
--namespace open-webui --create-namespace当 terminals.enabled: true 时,chart 会自动把 TERMINAL_SERVER_CONNECTIONS 指向集群内 orchestrator,无需手动配置。
验证
kubectl get pods -n open-webui -l app.kubernetes.io/part-of=open-terminal
kubectl get crd terminals.openwebui.com会部署哪些资源
启用 terminals.enabled: true 后,chart 会创建:
TerminalCRD- Operator Deployment
- Orchestrator Deployment + Service
- 用于共享 API key 的 Secret
对于每个用户 terminal,operator 还会创建 Pod、Service、Secret,以及可选 PVC。
生命周期
当用户启用 terminal 时,orchestrator 会创建一个 Terminal CR;operator 负责拉起 Pod、Service、Secret 和 PVC。
当 terminal 空闲超过 idleTimeoutMinutes,operator 会删除 Pod,但保留 PVC 与 Secret,因此下次再请求时,用户数据仍可恢复。
监控
kubectl logs -n open-webui deployment/<release>-terminals-operator --tail=50
kubectl logs -n open-webui deployment/<release>-terminals-orchestrator --tail=50CRD 关键字段
常见 spec 字段包括:
userIdimageresources.requests.cpuresources.requests.memoryresources.limits.cpuresources.limits.memoryidleTimeoutMinutespackagespipPackagespersistence.enabledpersistence.sizepersistence.storageClass
常见 Helm values
常用配置包括:
terminals.enabledterminals.apiKeyterminals.operator.image.repositoryterminals.orchestrator.image.repositoryterminals.orchestrator.backendterminals.orchestrator.terminalImageterminals.orchestrator.idleTimeoutMinutes
RBAC(手动安装时)
如果你不用 Helm,则 operator 的 ServiceAccount 需要具备对以下资源的读写权限:
terminals.openwebui.compodsservicespersistentvolumeclaimssecretseventsconfigmapsleases
认证方式
orchestrator 支持三种认证:
| 模式 | 适用场景 | 配置方式 |
|---|---|---|
| OPL 数据空间 JWT | 生产推荐 | 设置 TERMINALS_OPEN_WEBUI_URL |
| Shared API key | 常规部署 | OPL 数据空间与 orchestrator 共享 TERMINALS_API_KEY |
| Open | 仅开 发环境 | 不配置 JWT 也不配置 API key |
故障排查
Terminal 无法启动
- 查看 orchestrator 日志
- 检查
TERMINALS_API_KEY是否两边一致 - 如果使用私有镜像仓库,确认拉取权限已配置
认证失败
- JWT 模式下,确认
TERMINALS_OPEN_WEBUI_URL可达 - API key 模式下,确认 key 两边完全一致
容器被回收得太快
调高 TERMINALS_IDLE_TIMEOUT_MINUTES,例如设为 30。
Connection refused
- Docker:确认
TERMINALS_NETWORK已设置 - Kubernetes:确认 orchestrator Service 对 OPL 数据空间 Pod 可达
延伸阅读
License
Terminals 需要 OPL 数据空间 Enterprise License 才能在生产中使用。