本文老唐手把手教大家在搬瓦工 VPS 上部署 Ollama + Open WebUI,搭建一个完全属于自己的私人 ChatGPT。整个过程大约 20 分钟,需要的前置知识:会用 SSH 连接 VPS,会在命令行里敲命令,其他的跟着教程走就行。
部署完成后你会得到一个和 ChatGPT 长得差不多的聊天界面,可以对接 VPS 本地运行的开源模型(DeepSeek、Qwen 等),也可以对接 DeepSeek API、OpenAI API 等外部服务。数据全部存在你自己的服务器上,不经过任何第三方。
- 想了解更多配置选择:《2C2G / 4C4G / 8C8G VPS 分别能跑什么 AI 应用?配置选择与性能预估》
- 想了解整体规划:《VPS 部署 AI 大模型完全指南:从选配置到跑起来》
一、准备工作
开始之前,确认以下条件:
| 准备项 | 要求 |
|---|---|
| VPS | 建议 2C4G 以上(只跑平台 + API 的话 2C2G 也行) |
| 操作系统 | Ubuntu 22.04 / 24.04 LTS(本文以 Ubuntu 24.04 为例) |
| 域名(可选) | 如果想配 HTTPS 和自定义域名访问,需要一个域名 |
| SSH 工具 | 能连上 VPS 就行,Windows 用 PuTTY 或 Xshell,Mac/Linux 用终端 |
如果还没有 VPS,推荐搬瓦工 CN2 GIA-E 套餐,线路质量好,延迟低。购买教程参考:《2026 最新搬瓦工购买教程》
已有搬瓦工 VPS 的朋友,在 KiwiVM 后台 → Install new OS → 选择 Ubuntu 24.04 重装系统即可。重装会清空数据,注意提前备份。
二、安装 Docker
SSH 连接到 VPS 后,先安装 Docker。后面的 Open WebUI 通过 Docker 部署,Ollama 虽然可以直接装,但 Docker 也需要用到。
# 更新软件源
apt update && apt upgrade -y
# 安装 Docker(官方一键脚本)
curl -fsSL https://get.docker.com | sh
# 设置 Docker 开机自启
systemctl enable docker
systemctl start docker
# 验证安装
docker --version
正常的话会输出类似 Docker version 27.x.x 的版本号。如果报错,检查一下网络连接是否正常。
顺便装一下常用工具(后面可能用到):
apt install -y curl wget git vim
三、安装 Ollama
Ollama 负责在 VPS 上管理和运行大模型。安装只需要一条命令:
curl -fsSL https://ollama.com/install.sh | sh
安装完成后 Ollama 会自动作为系统服务启动,默认监听 127.0.0.1:11434。验证一下:
systemctl status ollama
看到 active (running) 就说明启动成功了。
3.1 拉取模型
根据你的 VPS 内存大小选择模型:
| VPS 内存 | 推荐模型 | 拉取命令 |
|---|---|---|
| 2GB | Qwen2.5:0.5b(仅测试用) | ollama pull qwen2.5:0.5b |
| 4GB | Qwen2.5:3b 或 DeepSeek-R1:1.5b | ollama pull qwen2.5:3b |
| 8GB+ | DeepSeek-R1:7b 或 Qwen2.5:7b | ollama pull deepseek-r1:7b |
以 8GB 内存的 VPS 为例,拉取 DeepSeek-R1 7B 模型:
ollama pull deepseek-r1:7b
模型文件约 4.4GB,下载时间取决于 VPS 带宽,搬瓦工 CN2 GIA-E 一般几分钟就能下完。下载完成后可以先测试一下:
ollama run deepseek-r1:7b
进入对话模式后随便问个问题,能正常回复就说明模型运行没问题。输入 /bye 退出对话。
如果你的 VPS 内存比较小(2C2G),不打算在本地跑模型,这一步可以跳过,后面直接对接外部 API 即可。不过 Ollama 本身还是建议装上,占用资源很少,以后想试本地模型的时候可以随时用。
3.2 配置 Ollama 监听地址
默认情况下 Ollama 只监听 127.0.0.1,也就是只允许本机访问。Open WebUI 通过 Docker 运行时,需要从容器内部访问 Ollama,所以要么改监听地址,要么用 Docker 的 host 网络模式。
老唐推荐的方式是修改 Ollama 的监听地址为 0.0.0.0(所有地址),同时通过防火墙限制外部访问。
注意: 修改为 0.0.0.0 后,在配置防火墙(第六节)之前,Ollama 的 11434 端口会暂时暴露在公网上,没有任何认证保护。如果你比较在意安全,可以先执行一条临时防火墙规则只阻止外网访问(保留本机和 Docker 容器的访问),等后面配好 ufw 再清理:
# 只阻止外网访问 11434,不影响 Docker 容器通过内部网络访问 Ollama
iptables -A INPUT -p tcp --dport 11434 ! -s 127.0.0.0/8 ! -s 172.16.0.0/12 -j DROP
然后修改 Ollama 配置:
sudo systemctl edit ollama
在打开的编辑器中输入以下内容(注意不要删除已有的注释行):
[Service]
Environment="OLLAMA_HOST=0.0.0.0"
保存退出后重启 Ollama:
sudo systemctl daemon-reload
sudo systemctl restart ollama
验证监听地址是否已更改:
ss -tlnp | grep 11434
应该看到 0.0.0.0:11434,说明配置生效了。
四、安装 Open WebUI
Open WebUI 提供了一个和 ChatGPT 几乎一样的聊天界面,支持对接 Ollama 本地模型和 OpenAI 兼容的 API。
4.1 Docker 一键部署
先生成一个固定的密钥并保存下来(后续更新容器时需要用同一个密钥,否则所有用户会被登出):
# 生成密钥并保存到文件
openssl rand -hex 32 > /root/.open-webui-secret-key
cat /root/.open-webui-secret-key
记住这个密钥(或者记住文件位置),然后启动容器:
docker run -d -p 3000:8080 \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
-e WEBUI_SECRET_KEY="$(cat /root/.open-webui-secret-key)" \
--name open-webui \
--restart always \
ghcr.io/open-webui/open-webui:main
解释一下各参数的作用:
| 参数 | 作用 |
|---|---|
-d |
后台运行 |
-p 3000:8080 |
将容器的 8080 端口映射到 VPS 的 3000 端口 |
--add-host=host.docker.internal:host-gateway |
让容器能通过 host.docker.internal 访问宿主机的服务(Ollama) |
-v open-webui:/app/backend/data |
持久化数据存储,删除容器不丢数据 |
-e WEBUI_SECRET_KEY=... |
设置一个固定的密钥,避免容器重建后所有用户被登出 |
--restart always |
VPS 重启后容器自动启动 |
第一次运行需要下载镜像,大小约 2GB,耐心等几分钟。下载完成后可以查看容器状态:
docker ps
看到 open-webui 容器的 STATUS 是 Up 就说明启动成功了。
4.2 首次访问和配置
打开浏览器,访问 http://你的VPS-IP:3000。
首次访问会要求创建管理员账号,设置用户名和密码后登录。登录后你会看到一个和 ChatGPT 非常相似的界面。
如果 VPS 上已经安装了 Ollama 并拉取了模型,在页面左上角的模型选择器中应该能看到已下载的模型(比如 deepseek-r1:7b)。选择模型后就可以开始对话了。
如果模型列表为空,说明 Open WebUI 没有成功连接到 Ollama。检查以下几点:
- Ollama 是否在运行:
systemctl status ollama - Ollama 是否监听 0.0.0.0:
ss -tlnp | grep 11434 - 从容器内部测试连接:
docker exec open-webui curl -s http://host.docker.internal:11434(如果容器内没有 curl,换用docker exec open-webui wget -qO- http://host.docker.internal:11434)
如果上面第 3 步报错,可以试试使用 host 网络模式重新部署(先删除旧容器):
docker rm -f open-webui
docker run -d --network=host \
-v open-webui:/app/backend/data \
-e WEBUI_SECRET_KEY="$(cat /root/.open-webui-secret-key)" \
-e OLLAMA_BASE_URL=http://127.0.0.1:11434 \
--name open-webui \
--restart always \
ghcr.io/open-webui/open-webui:main
使用 --network=host 模式后,Open WebUI 直接监听在 VPS 的 8080 端口(不再是 3000),访问地址变为 http://你的VPS-IP:8080。
五、对接外部 API
VPS 本地模型受限于 CPU 推理速度和模型参数大小,回答质量和速度都不如云端 API。老唐建议同时配置一个外部 API 作为补充,日常用 API,需要隐私的时候切换到本地模型。
5.1 配置 DeepSeek API
DeepSeek API 兼容 OpenAI 格式,价格便宜,中文能力强,个人用一个月大概几块钱。
- 去 <a href=”https://platform.deepseek.com/” target=”_blank”>DeepSeek 开放平台</a> 注册账号并获取 API Key
- 在 Open WebUI 中点击左下角头像 → 管理员面板 → 设置 → 连接(Connections)
- 找到 “OpenAI API” 部分,填入:
- API Base URL:
https://api.deepseek.com/v1 - API Key:你的 DeepSeek API Key
- API Base URL:
- 点击保存
保存后回到聊天界面,模型选择器中会出现 DeepSeek 的模型(deepseek-chat、deepseek-reasoner 等)。选择 deepseek-chat 即可使用 DeepSeek-V3 满血版模型。
5.2 配置其他 API
除了 DeepSeek,你还可以添加其他兼容 OpenAI 格式的 API:
| API 服务 | API Base URL | 说明 |
|---|---|---|
| DeepSeek | https://api.deepseek.com/v1 |
便宜好用,中文能力强 |
| OpenAI | https://api.openai.com/v1 |
GPT-4o 等模型,需要海外支付方式 |
| 智谱 AI | https://open.bigmodel.cn/api/paas/v4 |
GLM-4 系列,国内付款方便 |
| 硅基流动 | https://api.siliconflow.cn/v1 |
聚合多家模型,有免费额度 |
在 Open WebUI 的连接设置中可以添加多个 API 源,切换模型时会自动路由到对应的 API。
六、配置域名和 HTTPS(可选但推荐)
直接用 IP + 端口号访问虽然能用,但有两个问题:一是记不住,二是 HTTP 明文传输不安全(密码和对话内容在网络上裸奔)。如果你有域名,强烈建议配置 HTTPS 访问。
这里老唐用 Caddy 来做反向代理,比 Nginx 简单很多,而且自动申请和续签 SSL 证书。
6.1 安装 Caddy
apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
apt update
apt install caddy
6.2 配置反向代理
先将你的域名(比如 chat.example.com)解析到 VPS 的 IP 地址(添加一条 A 记录)。等待 DNS 生效后(通常几分钟),编辑 Caddy 配置文件:
vim /etc/caddy/Caddyfile
清空文件内容,写入以下配置:
chat.example.com {
reverse_proxy localhost:3000
}
就这么简单,三行配置搞定。Caddy 会自动向 Let’s Encrypt 申请 SSL 证书,并配置 HTTPS。
保存后重载 Caddy 配置:
systemctl reload caddy
如果 reload 报错(比如首次修改配置文件格式不对),可以用 systemctl restart caddy 代替。
注意: Caddy 需要占用 80 和 443 端口来申请和续签证书。如果 VPS 上有其他服务(如 Nginx、Apache)占用了这些端口,需要先停掉或卸载。
稍等一两分钟让 Caddy 完成证书申请,然后访问 https://chat.example.com,就能看到 Open WebUI 的界面了,地址栏会显示安全的 HTTPS 锁标志。
6.3 关闭直接 IP 访问
配好域名之后,建议通过防火墙关闭 3000 端口的直接访问,只保留 80(HTTP,用于 Caddy 自动跳转 HTTPS)和 443(HTTPS)端口:
# 安装 ufw 防火墙
apt install -y ufw
# 配置规则(顺序很重要:先放行 SSH,再启用防火墙!)
ufw allow 22/tcp # SSH(如果你改过 SSH 端口,这里写实际端口)
ufw allow 80/tcp # HTTP(Caddy 自动跳转到 HTTPS)
ufw allow 443/tcp # HTTPS
# 启用防火墙(会提示可能中断 SSH 连接,输入 y 确认)
ufw enable
# 查看状态
ufw status
务必确保在 ufw enable 之前已经放行了 SSH 端口(默认 22),否则防火墙启用后你会被锁在 VPS 外面,只能通过搬瓦工 KiwiVM 后台的 Shell 去修复。
这样 Open WebUI 只能通过 https://chat.example.com 访问,直接用 IP:3000 就访问不了了。Ollama 的 11434 端口也被防火墙挡住了,外部无法直接调用你的 Ollama API。
七、日常维护
7.1 更新 Open WebUI
Open WebUI 更新比较频繁,更新方法:
# 停止并删除旧容器(数据不会丢,存在 volume 里)
docker rm -f open-webui
# 拉取最新镜像
docker pull ghcr.io/open-webui/open-webui:main
# 重新创建容器(使用之前保存的密钥)
docker run -d -p 3000:8080 \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
-e WEBUI_SECRET_KEY="$(cat /root/.open-webui-secret-key)" \
--name open-webui \
--restart always \
ghcr.io/open-webui/open-webui:main
WEBUI_SECRET_KEY 必须和初次安装时保持一致,否则所有用户会被登出。如果按照前面第四节的步骤操作,密钥已经保存在 /root/.open-webui-secret-key 文件里了。
如果你当时没有保存密钥,可以在删除旧容器之前用以下命令查看:
docker inspect open-webui | grep WEBUI_SECRET_KEY
7.2 更新 Ollama
curl -fsSL https://ollama.com/install.sh | sh
直接重新运行安装脚本即可,会覆盖安装最新版本,已下载的模型不受影响。
7.3 更新模型
# 更新已下载的模型到最新版本
ollama pull deepseek-r1:7b
如果模型有新版本,会自动下载差异部分。
7.4 备份数据
Open WebUI 的数据(用户信息、聊天记录、设置等)存储在 Docker volume 中,备份方法:
# 备份到当前目录
docker run --rm -v open-webui:/data -v $(pwd):/backup \
alpine tar czf /backup/openwebui-backup-$(date +%Y%m%d).tar.gz /data
会在当前目录生成一个 openwebui-backup-日期.tar.gz 文件,下载保存即可。
恢复备份:
docker stop open-webui
docker run --rm -v open-webui:/data -v $(pwd):/backup \
alpine sh -c "rm -rf /data/* && tar xzf /backup/openwebui-backup-20260222.tar.gz -C /"
docker start open-webui
八、安全加固清单
部署完成后,建议对照以下清单做一遍安全检查:
| 项目 | 操作 | 状态 |
|---|---|---|
| 关闭 Open WebUI 注册功能 | 管理员面板 → 设置 → 通用 → 关闭”启用新用户注册” | □ |
| 配置防火墙 | 只开放 22、80、443 端口 | □ |
| 配置 HTTPS | 通过 Caddy 配置域名 + SSL | □ |
| 修改 SSH 端口(可选) | 编辑 /etc/ssh/sshd_config,改为非标准端口 |
□ |
| 设置 SSH 密钥登录(可选) | 禁用密码登录,使用密钥认证 | □ |
| 限制 Ollama 外部访问 | 防火墙不开放 11434 端口 | □ |
九、常见问题
Q:Docker 拉取镜像速度很慢怎么办?
搬瓦工海外 VPS 一般不会有这个问题。如果确实慢,可以尝试使用国内镜像源(适用于国内服务器)。海外 VPS 直接拉取 ghcr.io 的镜像速度通常很快。
Q:Open WebUI 页面打不开?
按顺序排查:1)确认容器在运行 docker ps;2)确认端口映射 docker port open-webui;3)确认防火墙没有阻止 3000 端口 ufw status;4)尝试在 VPS 本地测试 curl http://localhost:3000。
Q:Open WebUI 连不上 Ollama,模型列表为空?
大概率是 Docker 容器访问不了宿主机的 Ollama 服务。解决方法:1)确认 Ollama 监听 0.0.0.0(参考第三节);2)确认 --add-host=host.docker.internal:host-gateway 参数加上了;3)实在不行用 --network=host 模式。
Q:对话时回复很慢?
如果用的是本地模型,VPS CPU 推理本身就慢(7B 模型大概 3-8 tokens/s),这是正常的。想要快就换 API 调用。如果用的是 API 但仍然慢,检查一下 VPS 到 API 服务器的网络延迟。
Q:VPS 重启后服务还在吗?
Ollama 是 systemd 服务,开机自启。Open WebUI 设置了 --restart always,Docker 启动后会自动拉起。Caddy 也是 systemd 服务,开机自启。所以重启 VPS 后所有服务都会自动恢复,不需要手动操作。
Q:如果只想用 API 不想跑本地模型,可以不装 Ollama 吗?
可以。Open WebUI 不依赖 Ollama,单独部署也能用。不过 Ollama 占用资源很少(不加载模型的话几乎不占内存),装着也不碍事,以后想试本地模型的时候就方便了。
十、下一步
私人 ChatGPT 搭好了,接下来可以继续折腾:
- 想搭建 RAG 知识库、AI 智能体:后续会更新《搬瓦工 VPS 部署 Dify AI 应用平台教程》
- 想做 AI 自动化工作流:后续会更新《VPS 部署 n8n + DeepSeek 教程》
- 想了解更多配置选择:《2C2G / 4C4G / 8C8G VPS 分别能跑什么 AI 应用?配置选择与性能预估》
- 想了解整体规划:《VPS 部署 AI 大模型完全指南:从选配置到跑起来》
搬瓦工新手入门:《搬瓦工新手入门完全指南:方案推荐、机房选择、优惠码和购买教程》

老唐笔记



![[硬核教程] 2026最火AI Agent:在搬瓦工 VPS 上部署 OpenClaw (原 Clawdbot)-老唐笔记](https://oldtang.com/wp-content/uploads/2026/02/oldtangcom_openclaw-220x150.jpeg)






