Clawdbot整合Qwen3:32B部署案例:Ollama代理+8080→18789网关配置详解
1. 为什么需要这套组合:从本地大模型到可用聊天平台的闭环
你有没有试过在本地跑一个32B参数的大模型,结果发现——模型是跑起来了,但根本没法跟它说话?
不是API调不通,就是前端连不上,要么是端口冲突,要么是跨域报错,最后只能对着终端日志干瞪眼。
Clawdbot + Qwen3:32B + Ollama + 端口网关这套组合,解决的正是这个“最后一公里”问题:
它不追求炫技的分布式训练,也不堆砌复杂的K8s编排,而是用最轻量、最可控的方式,把一个高性能本地大模型,变成一个真正能打开网页、输入问题、实时回复的聊天平台。
核心逻辑其实就三步:
- Ollama 在本地加载并托管
qwen3:32b模型,暴露标准/api/chat接口(默认http://localhost:11434); - Clawdbot 作为前端聊天界面,不直接连 Ollama,而是通过一个中间代理层发起请求;
- 这个代理层把发往
http://localhost:8080/api/chat的请求,精准转发到http://localhost:11434/api/chat,同时把响应原路送回——而对外,Clawdbot 只认8080这个端口; - 最关键的一环:再加一层端口映射,把本机
8080映射为18789,让外部设备(比如手机、测试机、内网其他服务)也能稳定访问,且避开常见端口占用冲突。
这不是“又一种部署方式”,而是面向真实使用场景的工程取舍:
- 不改 Ollama 默认行为(省心);
- 不动 Clawdbot 前端代码(兼容);
- 不开防火墙、不配反向代理服务器(轻量);
- 所有配置可复现、可备份、可一键重装。
下面我们就从零开始,把这套链路一节一节搭出来。
2. 环境准备与基础服务启动
2.1 确认系统前提条件
这套方案对硬件和系统要求明确,但不高:
- 操作系统:Linux(推荐 Ubuntu 22.04+/Debian 12+)或 macOS(Intel/M系列均可);Windows 用户建议使用 WSL2,不推荐原生 CMD/PowerShell 部署;
- 内存:Qwen3:32B 推理需至少 64GB 可用内存(含系统占用),建议 72GB+;
- 磁盘空间:模型文件约 65GB,缓存+日志预留 20GB,总计建议 ≥100GB 可用空间;
- Python 版本:3.10~3.12(Clawdbot 后端依赖);
- Node.js 版本:18.x 或 20.x(Clawdbot 前端构建所需)。
注意:不要用
pip install ollama—— Ollama 是独立二进制服务,不是 Python 包。请始终从 https://ollama.com/download 下载对应平台的安装包,运行后会自动注册为系统服务。
2.2 安装并验证 Ollama 与 Qwen3:32B
打开终端,执行:
# 检查 Ollama 是否已运行 ollama list # 若提示 command not found,请先安装 Ollama # 拉取 Qwen3:32B(注意:这是官方发布的完整版,非量化精简版) ollama pull qwen3:32b # 启动一个临时会话,验证模型可响应 ollama run qwen3:32b "你好,请用一句话介绍你自己"你会看到类似这样的输出:
我是通义千问Qwen3,阿里巴巴全新推出的大语言模型,具备更强更全的工具调用能力、多语言支持和长上下文理解能力……
表示模型加载成功,Ollama API 已就绪(监听http://localhost:11434)。
2.3 获取并启动 Clawdbot
Clawdbot 是一个开源的、前后端分离的 LLM 聊天前端,支持自定义后端地址。我们不从源码构建,而是使用其预编译的轻量版:
# 创建工作目录 mkdir -p ~/clawdbot-deploy && cd ~/clawdbot-deploy # 下载最新 release(以 v0.8.2 为例,实际请查看 https://github.com/clawdbot/clawdbot/releases) curl -L https://github.com/clawdbot/clawdbot/releases/download/v0.8.2/clawdbot-linux-x64.tar.gz | tar xz # 启动前端服务(默认监听 8080) ./clawdbot --backend-url http://localhost:8080/api/chat此时访问http://localhost:8080,你应该能看到干净的聊天界面——但点击发送会失败,因为http://localhost:8080/api/chat还没任何人响应。这就是我们要补上的代理层。
3. 构建 Ollama 代理层:8080 → 11434 的精准转发
3.1 为什么不用 Nginx / Caddy?用什么替代?
你可以用 Nginx,但需要写 location 规则、处理 OPTIONS 预检、配置 CORS、管理证书……对于本地开发或小团队内网部署,这属于“过度工程”。
我们采用更直接的方式:一个极简的 Node.js 代理脚本,仅 30 行,无依赖,启动快,日志清,出错即停。
新建文件proxy.js:
// proxy.js const http = require('http'); const url = require('url'); const { parse } = require('url'); const TARGET_HOST = 'localhost'; const TARGET_PORT = 11434; const PROXY_PORT = 8080; const server = http.createServer((req, res) => { const parsedUrl = new URL(req.url, `http://${req.headers.host}`); // 只代理 /api/chat 路径,其他一律 404 if (!parsedUrl.pathname.startsWith('/api/chat')) { res.writeHead(404, { 'Content-Type': 'text/plain' }); res.end('Not Found'); return; } // 复制原始请求头(保留 Authorization、Content-Type 等) const options = { hostname: TARGET_HOST, port: TARGET_PORT, path: parsedUrl.pathname + parsedUrl.search, method: req.method, headers: { ...req.headers } }; const proxyReq = http.request(options, (proxyRes) => { res.writeHead(proxyRes.statusCode, proxyRes.headers); proxyRes.pipe(res); }); proxyReq.on('error', (err) => { console.error(`[Proxy Error] ${req.method} ${parsedUrl.pathname}:`, err.message); res.writeHead(502, { 'Content-Type': 'text/plain' }); res.end('Bad Gateway'); }); req.pipe(proxyReq); }); server.listen(PROXY_PORT, () => { console.log(` Proxy running on http://localhost:${PROXY_PORT}`); console.log(`➡ Forwarding /api/chat → http://${TARGET_HOST}:${TARGET_PORT}/api/chat`); });保存后,执行:
node proxy.js终端输出Proxy running on http://localhost:8080,表示代理已就绪。
现在你可以手动测试代理是否通畅:
curl -X POST http://localhost:8080/api/chat \ -H "Content-Type: application/json" \ -d '{ "model": "qwen3:32b", "messages": [{"role": "user", "content": "今天天气怎么样?"}] }'如果返回完整的 JSON 流式响应(含message.content字段),说明代理完全打通。
3.2 关键细节说明:为什么路径和 Header 必须严格透传?
- Ollama 的
/api/chat接口强依赖Content-Type: application/json和Accept: application/json,缺一不可; - 它还校验
Authorization(若启用了 Ollama 的 token 认证); - Clawdbot 发送的请求中包含
stream: true字段,Ollama 会据此返回 SSE 流(Server-Sent Events),代理必须原样透传,不能缓冲或改写; - 所以我们的代理脚本不做任何 body 解析、不修改 header、不重写 path——只做“管道式”转发。
这就是它比通用反向代理更稳的原因:不做假设,只做传递。
4. 端口网关配置:8080 → 18789 的稳定映射
4.1 为什么要额外映射到 18789?
两个现实原因:
- 避免端口冲突:8080 是开发常用端口,Docker、Vue Dev Server、其他 Node 服务都可能抢占;
- 统一访问入口:团队协作时,大家记住
18789比记住“谁的机器上开了 8080”更可靠; - 绕过权限限制:Linux/macOS 下,绑定 1024 以下端口需 root 权限,而 18789 是普通用户可自由使用的高位端口。
我们不引入 iptables 或 systemd socket 激活这种重型方案,而是用一个单命令、零配置的socat实现:
# 安装 socat(Ubuntu/Debian) sudo apt update && sudo apt install -y socat # 启动端口映射(后台运行,自动重连) nohup socat TCP4-LISTEN:18789,fork,reuseaddr TCP4:127.0.0.1:8080 > /dev/null 2>&1 & echo $! > ~/clawdbot-deploy/socat.pid执行后,访问http://localhost:18789/api/chat将等价于访问http://localhost:8080/api/chat。
验证方式:
curl -I http://localhost:18789/api/chat # 应返回 HTTP/1.1 405 Method Not Allowed(因为 GET 不被允许),证明端口通提示:
socat进程 ID 被写入socat.pid,如需停止,执行kill $(cat ~/clawdbot-deploy/socat.pid)即可。
4.2 如何让 Clawdbot 前端真正连上 18789?
回到 Clawdbot 启动命令——我们之前用的是:
./clawdbot --backend-url http://localhost:8080/api/chat现在要改成:
./clawdbot --backend-url http://localhost:18789/api/chat注意:这里--backend-url的值,必须是 Clawdbot 浏览器进程能直接访问的地址。
如果你在 Windows 上用 WSL2 运行整套服务,而用 Windows Chrome 访问,则应写成:
./clawdbot --backend-url http://host.docker.internal:18789/api/chat # 或 ./clawdbot --backend-url http://172.17.0.1:18789/api/chatClawdbot 会把这个地址注入前端 JS,所有 AJAX 请求都发往此处。因此,确保该地址在浏览器环境中可连通,是唯一前提。
5. 全链路联调与常见问题排查
5.1 四步联调法:逐层验证,快速定位
| 步骤 | 检查点 | 验证命令 | 期望结果 |
|---|---|---|---|
| ① 模型层 | Ollama 是否响应 | curl http://localhost:11434/api/tags | 返回 JSON,含"name":"qwen3:32b" |
| ② 代理层 | 8080 是否转发 | curl -X POST http://localhost:8080/api/chat -d '{}' | 返回 400 或 500(格式错误),不是连接拒绝 |
| ③ 网关层 | 18789 是否可达 | curl -I http://localhost:18789/api/chat | 返回HTTP/1.1 405 |
| ④ 前端层 | Clawdbot 是否通信 | 浏览器打开http://localhost:8080→ 发送消息 | 控制台无 CORS 错误,Network 标签中/api/chat返回 200 |
只要其中某一步失败,就停在这一步深入查,不要跳着走。
5.2 高频问题与直击解法
问题1:Clawdbot 页面显示 “Network Error”,控制台报ERR_CONNECTION_REFUSED
→ 检查socat是否运行:ps aux \| grep socat;
→ 检查proxy.js是否仍在运行:ps aux \| grep node;
→ 检查ollama serve是否意外退出:systemctl --user status ollama(Linux)或活动监视器(macOS)。
问题2:发送消息后卡住,Network 中请求一直 pending
→ 这是典型的流式响应未正确处理。检查proxy.js是否遗漏了req.pipe(proxyReq);
→ 检查 Ollama 是否启用了--no-tls-verify(不需要);
→ 临时关闭 Clawdbot 的 stream 模式(如有开关),改用非流式接口测试。
**问题3:返回中文乱码,或 emoji 显示为 **
→ 在proxy.js的res.writeHead前添加:
res.setHeader('Content-Type', 'application/json; charset=utf-8');问题4:Ollama 报错context length exceeded
→ Qwen3:32B 默认上下文为 131072,但 Ollama 默认限制为 4096;
→ 编辑~/.ollama/modelfile,在FROM qwen3:32b后添加:
PARAMETER num_ctx 131072→ 重新ollama create my-qwen3 --file ~/.ollama/modelfile并ollama run my-qwen3。
6. 总结:一条清晰、可控、可交付的本地大模型落地路径
我们没有构建一个新框架,也没有封装一堆抽象层。
我们只是把四个确定可靠的组件——Ollama、Qwen3:32B、Clawdbot、socat——用最朴素的协议和端口规则串了起来。
这条路径的价值在于:
- 可解释:每一层做什么、监听哪个端口、转发哪段路径,全部肉眼可见;
- 可替换:明天你想换成 Llama-3.1-405B?只需
ollama pull+ 改一行model名字; - 可交付:整个部署过程可写成 10 行 shell 脚本,发给同事,3 分钟内完成复现;
- 可监控:每层都有独立日志(Ollama 日志、proxy.js
console.log、socat 无日志但ps可查)。
它不追求“企业级高可用”,但足够支撑一个产品原型演示、一次内部技术分享、一个客户 PoC 环境。
当你需要的不是一个玩具,而是一个能随时打开、输入问题、得到回答的真实对话窗口时,这套组合就是目前最省心、最透明、最不容易翻车的选择。
下一步,你可以:
- 把
proxy.js改造成支持多模型路由(根据 URL path 切换qwen3:32b/llama3:70b); - 加一层简单的 Basic Auth,防止内网随意访问;
- 用
pm2管理proxy.js和clawdbot进程,实现开机自启; - 将整套流程打包为 Docker Compose,一键拉起全栈。
但那些,都是“锦上添花”。而今天,你已经拥有了“雪中送炭”的能力。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。