基于当前 AI 的使用程度,定制化需求和考虑离线使用 AI 问题,本地部署 AI 成为一种趋势。
一、了解 Ollama 和 OpenClaw
技术栈为:Ollama、OpenClaw、Qwen 大模型
二、部署 Ollama 并运行 Qwen 大模型
1. 下载 Ollama
可在官网下载安装包,或使用安装脚本:
curl -fsSL https://ollama.com/install.sh | bash
2. Ollama 引入 Qwen 模型
本机 Ubuntu 虚拟机部署,选择轻量级模型:
ollama run qwen3.5:2b
跑起来查看是否可以进行问答操作。
Ollama 基础命令
- 退出对话:Ctrl+D
- 查看部署模型:
ollama list - 运行模型:
ollama run <指定模型 + 版本>
3. 部署 OpenClaw
环境准备
排查是否有 Node.js 且版本 >= 22。Node 安装脚本如下:
# 下载并安装 nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
# 加载 nvm
. "$HOME/.nvm/nvm.sh"
# 下载并安装 Node.js
nvm install 24
# 验证 Node.js 版本
node -v
# 应打印 "v24.14.0"
# 验证 npm 版本
npm -v
# 应打印 "11.9.0"
OpenClaw 安装
Linux
curl -fsSL https://openclaw.ai/install.sh | bash
# 或跳过引导
# curl -fsSL https://openclaw.ai/install.sh | bash -s -- --no-onboard
Windows
iwr -useb https://openclaw.ai/install.ps1 | iex
# 或
&([scriptblock]::Create((iwr -useb https://openclaw.ai/install.ps1)))-NoOnboard
OpenClaw 安装向导
在安装向导中,先不选择接入 Qwen 模型,全部跳过,后续在配置里面接入 Ollama。 执行初始化向导:
openclaw onboard --install-daemon
执行完初始化向导后,进行 OpenClaw 配置:
openclaw config
选择 local 后,再选择 Mode。如果直接选择 Qwen 的话部署的是在线模型,是有 token 限制的,我们是本地部署,选择 Custom Provider 进入后自定义模型配置。
Ollama 的地址我这里是 172.0.0.1:11434。
根据提示下 API Base URL 输入地址 http://172.0.0.1:11434/v1 (必须加上 v1,因为 Ollama 识别到请求的 OpenApi 就是 http://172.0.0.1:11434/v1/XXXXXX,OpenClaw 默认不给你加 v1,你必须自己手动加)。
设置 APIKEY,因为我们跑的是本地模型,不存在 APIKEY,这里我们直接随便输入或者敲回车略过就行。 提示 Endpoint compatibility(API 端点兼容性设置),如下图,选择 OpenAI-compatible。
根据提示输入 ModeID: 因为之前拉取的是 qwen3.5:2b,这里 Model Id 直接输入 qwen3.5:2b,回车后 OpenClaw 直接拉取并配置 Ollama 下 qwen3.5:2b 模型。
配置别名:下面会填写好几个别名,这里就没有什么讲究了,起完别名自己记住就行了。 最后配置完成之后,选择 Continue 提交退出。
4. OpenClaw 跑本地 Qwen 模型
# 启动网关
openclaw gateway
# 打开 UI 页面
openclaw dashboard
5. 访问 OpenClaw 可视化页面
由于 OpenClaw 不提供外部源访问,这里直接用 SSH 端口转发方式进行主机端访问:
# 192.168.1.44 为 linux 服务器的 IP
ssh -N -L 18789:127.0.0.1:18789 [email protected]
根据提示访问:http://localhost:18789/#token=...
OpenClaw 接入飞书
1. 飞书配置
打开飞书开放平台,创建企业自建应用。
2. 配置飞书机器人和应用权限
配置机器人
按照界面指引创建机器人。
应用开通权限
批量导入权限(直接复制):
{
"scopes": {
"tenant": [
"base:app:copy",
"base:app:create",
"base:app:read",
"base:app:update",
"base:collaborator:create",
"base:collaborator:delete",
"base:collaborator:read",
"base:dashboard:copy",
"base:dashboard:read",
"base:field:create",
"base:field:delete",
"base:field:read",
"base:field:update",
"base:form:read",
"base:form:update",
"base:record:create",
"base:record:delete",
"base:record:read",
"base:record:retrieve",
"base:record:update",
"base:role:create",
"base:role:delete",
"base:role:read",
"base:role:update",
"base:table:create",
"base:table:delete",
"base:table:read",
"base:table:update",
"base:view:read",
"base:view:write_only",
"bitable:app",
"bitable:app:readonly",
"board:whiteboard:node:create",
"board:whiteboard:node:delete",
"board:whiteboard:node:read",
"board:whiteboard:node:update",
"contact:contact.base:readonly",
"contact:user.base:readonly",
"contact:user.employee_id:readonly",
"contact:user.employee_number:read",
"contact:user.id:readonly",
"docs:doc",
"docs:doc:readonly",
"docs:document.comment:create",
"docs:document.comment:read",
"docs:document.comment:update",
"docs:document.comment:write_only",
"docs:document.content:read",
"docs:document.media:download",
"docs:document.media:upload",
"docs:document.subscription",
"docs:document.subscription:read",
"docs:document:copy",
"docs:document:export",
"docs:document:import",
"docs:event.document_deleted:read",
"docs:event.document_edited:read",
"docs:event.document_opened:read",
"docs:event:subscribe",
"docs:permission.member",
"docs:permission.member:auth",
"docs:permission.member:create",
"docs:permission.member:delete",
"docs:permission.member:readonly",
"docs:permission.member:retrieve",
"docs:permission.member:transfer",
"docs:permission.member:update",
"docs:permission.setting",
"docs:permission.setting:read",
"docs:permission.setting:readonly",
"docs:permission.setting:write_only",
"docx:document",
"docx:document.block:convert",
"docx:document:create",
"docx:document:readonly",
"drive:drive",
"drive:drive.metadata:readonly",
"drive:drive.search:readonly",
"drive:drive:readonly",
"drive:drive:version",
"drive:drive:version:readonly",
"drive:export:readonly",
"drive:file",
"drive:file.like:readonly",
"drive:file.meta.sec_label.read_only",
"drive:file:download",
"drive:file:readonly",
"drive:file:upload",
"drive:file:view_record:readonly",
"event:ip_list",
"im:app_feed_card:write",
"im:biz_entity_tag_relation:read",
"im:biz_entity_tag_relation:write",
"im:chat",
"im:chat.access_event.bot_p2p_chat:read",
"im:chat.announcement:read",
"im:chat.announcement:write_only",
"im:chat.chat_pins:read",
"im:chat.chat_pins:write_only",
"im:chat.collab_plugins:read",
"im:chat.collab_plugins:write_only",
"im:chat.managers:write_only",
"im:chat.members:bot_access",
"im:chat.members:read",
"im:chat.members:write_only",
"im:chat.menu_tree:read",
"im:chat.menu_tree:write_only",
"im:chat.moderation:read",
"im:chat.tabs:read",
"im:chat.tabs:write_only",
"im:chat.top_notice:write_only",
"im:chat.widgets:read",
"im:chat.widgets:write_only",
"im:chat:create",
"im:chat:delete",
"im:chat:moderation:write_only",
"im:chat:operate_as_owner",
"im:chat:read",
"im:chat:readonly",
"im:chat:update",
"im:datasync.feed_card.time_sensitive:write",
"im:message",
"im:message.group_at_msg:readonly",
"im:message.group_msg",
"im:message.p2p_msg:readonly",
"im:message.pins:read",
"im:message.pins:write_only",
"im:message.reactions:read",
"im:message.reactions:write_only",
"im:message.urgent",
"im:message.urgent.status:write",
"im:message.urgent:phone",
"im:message.urgent:sms",
"im:message:readonly",
"im:message:recall",
"im:message:send_as_bot",
"im:message:send_multi_depts",
"im:message:send_multi_users",
"im:message:send_sys_msg",
"im:message:update",
"im:resource",
"im:tag:read",
"im:tag:write",
"im:url_preview.update",
"im:user_agent:read",
"sheets:spreadsheet",
"sheets:spreadsheet.meta:read",
"sheets:spreadsheet.meta:write_only",
"sheets:spreadsheet:create",
"sheets:spreadsheet:read",
"sheets:spreadsheet:readonly",
"sheets:spreadsheet:write_only",
"space:document.event:read",
"space:document:delete",
"space:document:move",
"space:document:retrieve",
"space:document:shortcut",
"space:folder:create",
"wiki:member:create",
"wiki:member:retrieve",
"wiki:member:update",
"wiki:node:copy",
"wiki:node:create",
"wiki:node:move",
"wiki:node:read",
"wiki:node:retrieve",
"wiki:node:update",
"wiki:setting:read",
"wiki:setting:write_only",
"wiki:space:read",
"wiki:space:retrieve",
"wiki:space:write_only",
"wiki:wiki",
"wiki:wiki:readonly"
]
}
}
事件配置回调与版本发布
订阅方式设置成使用 长连接 接收事件后再进行最后版本发布。
3. OpenClaw 配置飞书
按照配置指导会让输入飞书应用的 App ID、App Secret,直接拷贝就行。 按照下图步骤,选择输入完成后,进行 finished。
4. 飞书访问白名单
访问时会回复没有权限。 解决办法:
- 在终端直接输入
openclaw pairing approve feishu <你的 App ID>敲回车。 - 配置飞书白名单:
# 直接修改配置文件
openclaw config set channels.feishu.dmPolicy "allowlist"
# 这里 ou_63985fc0b877330b926df092b8145XXX 修改为你的 user id
openclaw config set security.allowlist "[\"ou_63985fc0b877330b926df092b8145XXX\"]"
- 直接一键关闭白名单:
openclaw config set security.dmPolicy pass
设置完成之后一定要记得重启网关 openclaw gateway restart。
总结
本文完整讲解了 Linux 系统离线部署 ollama + Qwen 本地大模型 + OpenClaw 可视化平台的全套流程,核心目标是搭建无 API 限制、可离线使用的本地 AI 服务。
核心组件
- Ollama:快速运行、管理本地大模型
- Qwen3.5:2b:轻量、高效的离线大模型
- OpenClaw:提供 Web 可视化聊天界面
关键部署步骤
- 安装 Ollama 并拉取运行 qwen3.5:2b 模型
- 安装 Node.js 环境,部署 OpenClaw 平台
- 核心配置:OpenClaw 选择 Custom Provider,以 OpenAI 兼容模式接入本地 Ollama
- 必须填写:API 地址末尾加 /v1 → http://127.0.0.1:11434/v1
- 模型 ID 填写 qwen3.5:2b,API Key 留空或随便填
最终效果
- 本地运行大模型,无 API 限流、无网络依赖、完全隐私
- 通过 OpenClaw Web 界面可视化交互
- 支持 SSH 端口转发,在本地电脑访问服务器上的服务
- OpenClaw 成功接入飞书

