前言:
OpenWebUI 是一个 开源的、自托管的、可扩展 AI 对话前端,支持任何 OpenAI 兼容 API(包括 xAI Grok、CPA 反代、Ollama 本地模型等),自带账号管理、对话历史、图像生成、知识库、插件等全套功能。它就像你自己的 ChatGPT 网页版,但数据 100% 在自己 VPS 上。
我们将使用 Docker 方式部署 OpenWebUI(官方主镜像,已内置完整管理面板和图像生成模块)。
部署完成后,可以把之前搭好的 CPAProxyAPI 直接挂进去,把 xAI 的 grok-imagine-image、grok-imagine-image-quality 这类图像模型接到一个能正常显示图片的界面里——这是 codex GUI 这类纯代码壳子做不到的事情。
【比如你 codex GUI 切到 grok-imagine 模型就报"image model not available on this endpoint",是因为图像模型只能走 /v1/images/generations 端点,而 codex 走的是 /v1/chat/completions。OpenWebUI 同时支持这两个端点,所以画图、聊天都能用】
一、加 SWAP(新手忽略)
注意:此步骤新手可直接跳过,直接进行第二步
若服务器内存 ≤ 1G 可添加 swap 虚拟内存。OpenWebUI 镜像本体加运行时大约要 1.5G 内存,小机器建议加 swap。
设置 SWAP 可以用脚本:
wget -O box.sh https://raw.githubusercontent.com/BlueSkyXN/SKY-BOX/main/box.sh && chmod +x box.sh && clear && ./box.sh
填写 18 后,选择 1,填写 2048 或者 1024,然后回车
二、更新工具
如果你已经按 CPA 那篇教程装过 Docker,本章可以直接跳到第五章。否则从这里开始。
2.1、切换到 root 用户
sudo -i
2.2、升级 packages
apt update -y
2.3、安装常用工具
apt install wget curl sudo vim git -y
| 工具 | 作用 |
|---|---|
| wget | 下载文件 |
| curl | 网络请求 |
| vim | 文本编辑 |
| git | 下载项目 |
三、安装 Docker 环境(非大陆)
此步为非大陆 vps 安装 docker 的步骤,大陆服务器请参考 CPA 教程的 1.7、补充 部分。
3.1、安装
curl -fsSL https://get.docker.com | bash
3.2、查看 docker 版本
docker -v
出现 Docker version 22.xx 或更高版本即可。
3.3、设置开机自动启动
systemctl enable docker
四、安装 Docker-compose(非大陆)
4.1、安装 compose 插件
apt install docker-compose-plugin -y
4.2、查看版本
docker compose version
五、安装项目(OpenWebUI)
5.1、创建目录
mkdir -p /root/data/docker_data/openwebui
目录结构(和你已有的 CPA 项目并列,互不打架):
/root
└─ data
└─ docker_data
├─ cli-proxy-api ← 已有的 CPA
└─ openwebui ← 本次要装的
5.2、进入目录
cd /root/data/docker_data/openwebui
5.3、配置 docker-compose.yml
nano docker-compose.yml
复制粘贴下面这段:
services:
openwebui:
image: ghcr.io/open-webui/open-webui:main # 官方最新主镜像
pull_policy: always # 每次启动检查更新
container_name: openwebui
ports:
- "3000:8080" # Web 访问端口(左边可改为你想暴露的端口)
volumes:
- ./data:/app/backend/data # 挂载数据目录(账号、对话、配置全在这里)
environment:
- TZ=Asia/Shanghai # 时区
- WEBUI_AUTH=true # 开启账号认证(建议保留)
- DEFAULT_USER_ROLE=pending # 新注册用户默认待审核,防止公网被白嫖
restart: unless-stopped
extra_hosts:
- "host.docker.internal:host-gateway" # 关键:让容器能访问宿主机的 CPA
⚠️ 关键点说明:
extra_hosts那行别删。这是为了让 OpenWebUI 容器能通过host.docker.internal这个域名访问到宿主机上跑着的 CPA。如果两个容器在同一台 VPS 上但分属不同 compose 项目,直接写localhost是不行的(localhost 会指向容器自己)。- 端口左边的
3000如果被占用,改成别的(例如3001:8080),冒号右边的8080不要动。
保存:Ctrl + O → 回车 → Ctrl + X。
5.4、启动项目
docker compose up -d
第一次启动会拉镜像,大约 4GB,耐心等一下。
5.5、查看启动状态
docker compose ps
看到 STATUS 为 Up 即可。如果想看实时日志(排查问题时用):
docker compose logs -f
按 Ctrl + C 退出日志查看。
5.6、完成
确保 VPS 防火墙/安全组已开放 3000 端口(如果用了第八章的 Nginx 反代,则不需要对公网开放 3000,只对外开 80/443 即可)。
浏览器访问 http://你的VPS_IP:3000,第一个注册的账号自动成为管理员。
六、把 CPA 接入 OpenWebUI
这是整篇教程最关键的一步,分两个部分:聊天模型 和 图像生成模型。
6.1、登录并进入管理设置
右上角头像 → Settings → Admin Settings(管理员设置)。
6.2、接入聊天模型(chat 类,比如 grok-4、claude、gpt 等)
进入 Connections(连接) → 找到 OpenAI API,点 + 新增一条:
| 字段 | 值 |
|---|---|
| API Base URL | http://host.docker.internal:8085/v1 |
| API Key | 在 CPA 管理面板里生成的 access key(或者 config.yaml 里配的那个) |
点保存 → 测试连接 → 出现 ✅ 即成功。
如果连不上,9 成是这两个原因:
extra_hosts那行没写或者没生效——docker compose down && docker compose up -d重启一下- CPA 的端口不是 8085,按你实际配置填
回到主界面,左上角模型选择器里就能看到 CPA 暴露出来的所有模型了(grok-4、claude-opus、gpt-5 等等,看你 CPA 里挂了哪些账号)。
6.3、接入图像生成模型(这才是重点)
回到 Admin Settings → Images(图像):
| 字段 | 值 |
|---|---|
| Image Generation Engine | OpenAI (Dall-E)(这只是协议名,不是真用 Dall-E) |
| OpenAI API Base URL | https://api.x.ai/v1 |
| OpenAI API Key | 你的 xAI API key(这里直接用 xAI 原生 key,不走 CPA) |
| Image Generation Model | grok-imagine-image-quality |
| Image Size | 1024x1024(或你喜欢的尺寸) |
| Enable Image Generation | ✅ 打开 |
保存。
为什么图像这里不走 CPA?目前主流的 CLI Proxy 类项目(包括 CPA)默认只代理
/v1/chat/completions这条聊天端点,没有把/v1/images/generations这条图像端点也代理过去。所以图像生成这里直接连 xAI 官方最稳。如果你执意要让图像也走 CPA(统计、限流、号池负载),需要给 CPA 加一条路由规则把 image 请求转发到 xAI 的 image endpoint——这是另一个话题,可以单开一篇。
6.4、测试出图
回主界面随便开个对话,输入框旁边会出现一个 🖼️ 图标。
发一句 a cyberpunk cat sitting on a neon sign → 点 🖼️ → 等几秒 → 出图。
七、本地电脑如何登录(重点)
VPS 装好了,本地电脑怎么访问?四种方式按推荐度排序:
7.1、方案 A:域名 + HTTPS(最正经,推荐)
如果你按 CPA 那篇教程已经买好域名并托管在 Cloudflare 了,这步几乎是零成本。
直接复用你已经在跑的 Nginx Proxy Manager(第八章那个 81 端口的面板),加一条反代规则:
| 字段 | 值 |
|---|---|
| Domain Names | chat.你的域名.top |
| Scheme | http |
| Forward Hostname/IP | 你的VPS_IP或 127.0.0.1 |
| Forward Port | 3000 |
| Block Common Exploits | ✅ |
| Websockets Support | ✅(必须开,否则流式输出会断) |
切到 SSL 标签:
- SSL Certificate:
Request a new SSL Certificate - Force SSL: ✅
- HTTP/2 Support: ✅
- 同意条款,邮箱填好 → Save
完事。本地浏览器访问 https://chat.你的域名.top,证书 Let's Encrypt 自动签发。
别忘了在 Cloudflare 给
chat这个子域名加一条 A 记录指向 VPS IP,且 SSL 模式选Full不要选Flexible。
7.2、方案 B:SSH 隧道(最安全,无需域名)
不开放任何公网端口,只让你自己这台电脑能访问。
本地电脑(Windows PowerShell / Mac 终端 / Linux 终端)执行:
ssh -L 3000:localhost:3000 root@你的VPS_IP
保持这个 SSH 窗口开着,本地浏览器访问 http://localhost:3000 即可。流量全程走加密 SSH 隧道,关掉窗口就断开。
适合:临时用、不想搞域名、不想暴露公网。
7.3、方案 C:Tailscale 内网(懒人神器,无需域名)
VPS 和本地电脑都装 Tailscale,登录同一账号,VPS 会有一个 100.x.x.x 的内网 IP。
本地浏览器访问 http://100.x.x.x:3000 即可。
- Tailscale 免费档够个人用
- 手机也能装,手机也能直连
- 不用开放任何公网端口
7.4、方案 D:裸 IP 直连(最快但最不安全)
VPS 防火墙放行 3000:
ufw allow 3000/tcp
VPS 控制台的安全组也要放行 3000。
本地浏览器访问 http://你的VPS_IP:3000。
⚠️ 风险:HTTP 明文,登录密码和对话内容公网可见;端口扫描器会扫到你这个面板,可能被爆破。只建议临时测试用,长期挂着请用方案 A 或 C。
八、常见问题
8.1、CPA 模型在 OpenWebUI 里不显示
- 检查 OpenAI Connections 里的 base url 是不是写成了
host.docker.internal:8085/v1,注意有/v1后缀 - 进 CPA 管理面板看看对应账号有没有被禁用、配额还够不够
- OpenWebUI Admin Settings → Models 里手动拉一下列表
8.2、图像生成报 Invalid endpoint
回去检查 Images 设置里的 Base URL,必须是 https://api.x.ai/v1,不能是 CPA 的地址。
8.3、流式输出(打字机效果)卡顿或断开
Nginx Proxy Manager 那条规则的 Websockets Support 没打开,回去打开。
8.4、忘记管理员密码
docker compose exec openwebui bash
# 进容器后
cd /app/backend
python -c "from open_webui.models.users import Users; Users.update_user_password_by_id('用户ID', '新密码')"
或者直接删 ./data/webui.db 重来(会丢所有对话历史)。
8.5、想升级到最新版
cd /root/data/docker_data/openwebui
docker compose pull
docker compose up -d
因为配置了 pull_policy: always,直接重启也会自动拉新镜像。
九、配件文档
- OpenWebUI 官方文档:https://docs.openwebui.com
- OpenWebUI GitHub:https://github.com/open-webui/open-webui
- xAI 图像生成 API 文档:https://docs.x.ai/docs/guides/image-generations
- xAI 可用图像模型:
grok-imagine-image-quality(推荐)、grok-imagine-image、grok-2-image - 上一篇 CPA 教程:参见你站内
Docker-CLI_Proxy_API那篇
评论区