【人工智能】OpenClaw(一):MacOS极简安装OpenClaw之Docker版

目录
一、背景
OpenClaw最近实在是太火了,作为ZEEKLOG认证的“优质人工智能博主”,不跟进有点说不过去了,还是一贯的风格,尽量极简让你养上自己的小龙虾。
在当下企业协同办公与AI智能化应用深度融合的趋势下,越来越多团队需要一款轻量化、易部署、可自定义对接的AI助手工具,实现大模型能力与日常办公协作平台的无缝衔接,提升内部沟通、信息处理、任务执行的效率。OpenClaw作为一款开源的AI助手框架,具备跨平台部署、灵活对接各类大模型API、适配主流协同办公工具的核心优势,能够帮助个人和中小企业快速搭建专属的AI协作机器人,无需复杂的底层开发,即可实现AI对话、任务处理、信息调取等实用功能。
相较于传统的AI工具部署方式,基于Docker部署OpenClaw能够最大程度规避不同操作系统的环境兼容问题,实现环境隔离、一键启停和便捷维护,尤其适合非专业运维人员快速上手。而飞书作为国内主流的企业协同办公平台,将OpenClaw与飞书机器人集成,能够让团队成员直接在飞书聊天界面调用AI能力,无需切换软件,真正实现办公场景与AI能力的闭环融合。本教程针对MacOS系统用户,梳理了从Docker环境搭建、OpenClaw镜像部署、大模型API配置到飞书机器人对接、功能调试的全流程实操步骤,解决新手部署过程中环境报错、配置遗漏、对接失败等常见问题,帮助用户快速完成专属AI办公助手的搭建,落地轻量化AI办公应用。
二、安装教程
2.1 MacOS安装Docker


2.2 下载OpenClaw镜像
docker pull openeuler/openclaw:2026.3.2-oe2403sp3
2.3 启动OpenClaw镜像+安装引导
docker run -it --name openclaw openeuler/openclaw:2026.3.2-oe2403sp3 onboard --install-daemon
2.4 自己购买的大模型API配置
◇ I understand this is personal-by-default and shared/multi-user use requires lock-down. Continue?(“我明白这是默认个人私有的,共享/多用户使用则需要加以限制。是否继续?”) │ Yes │ ◇ Onboarding mode │ QuickStart │ ◇ QuickStart ─────────────────────────╮ │ │ │ Gateway port: 18789 │ │ Gateway bind: Loopback (127.0.0.1) │ │ Gateway auth: Token (default) │ │ Tailscale exposure: Off │ │ Direct to chat channels. │ │ │ ├──────────────────────────────────────╯ │ ◇ Model/auth provider │ Custom Provider │ ◇ API Base URL │ https://api.xxxx.com/v1(自己大模型服务的api) │ ◇ How do you want to provide this API key? │ Paste API key now │ ◇ API Key (leave blank if not required) │ sk-XXXXXXXXXXXXXXXXXXXXX(自己大模型服务的API Key) │ ◇ Endpoint compatibility │ OpenAI-compatible │ ◇ Model ID │ claude-sonnet-4-6(自己大模型服务的模型ID) │ ◇ Verification successful. │ ◇ Endpoint ID │ custom-api-xxx-ai(自定义EndpointID) │ ◇ Model alias (optional) │ Configured custom provider: custom-api-xxx-ai/claude-sonnet-4-62.5 飞书配置
2.5.1 打开飞书开放平台

2.5.2 创建应用

2.5.3 创建机器人
进入应用—添加应用能力—机器人

2.5.4 权限管理
批量导入权限

批量权限json(或参考https://docs.openclaw.ai/zh-CN/channels/feishu)
{ "scopes": { "tenant": [ "aily:file:read", "aily:file:write", "aily:session:read", "aily:session:write", "application:application.app_message_stats.overview:readonly", "application:application:self_manage", "application:bot.menu:write", "bitable:app", "bitable:app:readonly", "board:whiteboard:node:create", "board:whiteboard:node:delete", "board:whiteboard:node:read", "board:whiteboard:node:update", "cardkit:card:write", "contact:contact.base:readonly", "contact:user.base:readonly", "contact:user.employee_id:readonly", "corehr:file:download", "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", "docx:document:write_only", "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:chat", "im:chat.access_event.bot_p2p_chat:read", "im:chat.members:bot_access", "im:message", "im:message.group_at_msg:readonly", "im:message.group_msg", "im:message.p2p_msg:readonly", "im:message:readonly", "im:message:send_as_bot", "im:resource", "sheets:spreadsheet", "sheets:spreadsheet.meta:read", "sheets:spreadsheet.meta:write_only", "sheets:spreadsheet:create", "sheets:spreadsheet:read", "sheets:spreadsheet:readonly", "sheets:spreadsheet:write_only", "slides:presentation:create", "slides:presentation:read", "slides:presentation:update", "slides:presentation: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" ], "user": [ "aily:file:read", "aily:file:write", "im:chat.access_event.bot_p2p_chat:read" ] } }2.5.5 事件与回调
使用长链接接收事件

创建长链接环境
conda create -n py38 python=3.8 conda activate py38 pip install lark-oapi -Uimport lark_oapi as lark ## P2ImMessageReceiveV1 为接收消息 v2.0;CustomizedEvent 内的 message 为接收消息 v1.0。 def do_p2_im_message_receive_v1(data: lark.im.v1.P2ImMessageReceiveV1) -> None: print(f'[ do_p2_im_message_receive_v1 access ], data: {lark.JSON.marshal(data, indent=4)}') def do_message_event(data: lark.CustomizedEvent) -> None: print(f'[ do_customized_event access ], type: message, data: {lark.JSON.marshal(data, indent=4)}') event_handler = lark.EventDispatcherHandler.builder("", "") \ .register_p2_im_message_receive_v1(do_p2_im_message_receive_v1) \ .register_p1_customized_event("这里填入你要自定义订阅的 event 的 key,例如 out_approval", do_message_event) \ .build() def main(): cli = lark.ws.Client("配置成应用的App Id", "配置成应用的App Secret", event_handler=event_handler, log_level=lark.LogLevel.DEBUG) cli.start() if __name__ == "__main__": main()启动长链接
python feishu_ws.py
启动长链接后,“事件配置”与“回调配置”中的“保存”可以点击了(否则点不动)

“事件配置”中,添加所有“消息与群组”

“回调配置”中,添加所有回调

2.5.6 新建版本

版本发布后,飞书会收到“开发者小助手”的审批通过,发布成功的消息,打开应用,出现机器人聊天对话框。


OpenClaw的飞书配置
◇ Channel status ────────────────────────────╮ │ │ │ Telegram: needs token │ │ WhatsApp (default): not linked │ │ Discord: needs token │ │ Slack: needs tokens │ │ Signal: needs setup │ │ signal-cli: missing (signal-cli) │ │ iMessage: needs setup │ │ imsg: missing (imsg) │ │ IRC: not configured │ │ Google Chat: not configured │ │ Feishu: install plugin to enable │ │ Google Chat: install plugin to enable │ │ Nostr: install plugin to enable │ │ Microsoft Teams: install plugin to enable │ │ Mattermost: install plugin to enable │ │ Nextcloud Talk: install plugin to enable │ │ Matrix: install plugin to enable │ │ BlueBubbles: install plugin to enable │ │ LINE: install plugin to enable │ │ Zalo: install plugin to enable │ │ Zalo Personal: install plugin to enable │ │ Synology Chat: install plugin to enable │ │ Tlon: install plugin to enable │ │ │ ├─────────────────────────────────────────────╯ │ ◇ How channels work ───────────────────────────────────────────────────────────────────────╮ │ │ │ DM security: default is pairing; unknown DMs get a pairing code. │ │ Approve with: openclaw pairing approve <channel> <code> │ │ Public DMs require dmPolicy="open" + allowFrom=["*"]. │ │ Multi-user DMs: run: openclaw config set session.dmScope "per-channel-peer" (or │ │ "per-account-channel-peer" for multi-account channels) to isolate sessions. │ │ Docs: channels/pairing │ │ │ │ Telegram: simplest way to get started — register a bot with @BotFather and get going. │ │ WhatsApp: works with your own number; recommend a separate phone + eSIM. │ │ Discord: very well supported right now. │ │ IRC: classic IRC networks with DM/channel routing and pairing controls. │ │ Google Chat: Google Workspace Chat app with HTTP webhook. │ │ Slack: supported (Socket Mode). │ │ Signal: signal-cli linked device; more setup (David Reagans: "Hop on Discord."). │ │ iMessage: this is still a work in progress. │ │ Feishu: 飞书/Lark enterprise messaging with doc/wiki/drive tools. │ │ Nostr: Decentralized protocol; encrypted DMs via NIP-04. │ │ Microsoft Teams: Bot Framework; enterprise support. │ │ Mattermost: self-hosted Slack-style chat; install the plugin to enable. │ │ Nextcloud Talk: Self-hosted chat via Nextcloud Talk webhook bots. │ │ Matrix: open protocol; install the plugin to enable. │ │ BlueBubbles: iMessage via the BlueBubbles mac app + REST API. │ │ LINE: LINE Messaging API bot for Japan/Taiwan/Thailand markets. │ │ Zalo: Vietnam-focused messaging platform with Bot API. │ │ Zalo Personal: Zalo personal account via QR code login. │ │ Synology Chat: Connect your Synology NAS Chat to OpenClaw with full agent capabilities. │ │ Tlon: decentralized messaging on Urbit; install the plugin to enable. │ │ │ ├───────────────────────────────────────────────────────────────────────────────────────────╯ │ ◇ Select channel (QuickStart) │ Feishu/Lark (飞书) │ ◇ Install Feishu plugin? │ Download from npm (@openclaw/feishu) Downloading @openclaw/feishu… Extracting /tmp/openclaw-npm-pack-jlpXLF/openclaw-feishu-2026.3.13.tgz… WARNING: Plugin "feishu" contains dangerous code patterns: Environment variable access combined with network send — possible credential harvesting (/tmp/openclaw-plugin-62J8G3/extract/package/src/client.test.ts:74); Environment variable access combined with network send — possible credential harvesting (/tmp/openclaw-plugin-62J8G3/extract/package/src/client.ts:12) Installing to /root/.openclaw/extensions/feishu… Installing plugin dependencies… 12:38:31 [plugins] plugins.allow is empty; discovered non-bundled plugins may auto-load: feishu (/root/.openclaw/extensions/feishu/index.ts). Set plugins.allow to explicit trusted ids. │ ◇ Feishu credentials ──────────────────────────────────────────────────────────────╮ │ │ │ 1) Go to Feishu Open Platform (open.feishu.cn) │ │ 2) Create a self-built app │ │ 3) Get App ID and App Secret from Credentials page │ │ 4) Enable required permissions: im:message, im:chat, contact:user.base:readonly │ │ 5) Publish the app or add it to a test group │ │ Tip: you can also set FEISHU_APP_ID / FEISHU_APP_SECRET env vars. │ │ Docs: feishu │ │ │ ├───────────────────────────────────────────────────────────────────────────────────╯ │ ◇ How do you want to provide this App Secret? │ Enter App Secret │ ◇ Enter Feishu App Secret │ XXXXXXXXXXXXXXXXXXXX │ ◇ Enter Feishu App ID │ XXXXXXXXXXXXXXXX [info]: [ 'client ready' ] │ ◇ Feishu connection test ───────────────────────────╮ │ │ │ Connected as ou_XXXXXXXXXXX │ │ │ ├────────────────────────────────────────────────────╯ │ ◇ Feishu connection mode │ WebSocket (default) │ ◇ Which Feishu domain? │ Feishu (feishu.cn) - China │ ◇ Group chat policy │ Open - respond in all groups (requires mention) │ ◇ Selected channels ──────────────────────────────────────────╮ │ │ │ Feishu — 飞书/Lark enterprise messaging. Docs: │ │ feishu │ │ │ ├──────────────────────────────────────────────────────────────╯ Config warnings: - plugins.entries.feishu: plugin feishu: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/feishu/index.ts) Updated ~/.openclaw/openclaw.json Workspace OK: ~/.openclaw/workspace Sessions OK: ~/.openclaw/agents/main/sessions2.6 Skills及其他配置
默认先选“no”或“skip”
◇ Skills status ─────────────╮ │ │ │ Eligible: 7 │ │ Missing requirements: 41 │ │ Unsupported on this OS: 7 │ │ Blocked by allowlist: 0 │ │ │ ├─────────────────────────────╯ │ ◇ Configure skills now? (recommended) │ No │ ◇ Hooks ──────────────────────────────────────────────────────────────────╮ │ │ │ Hooks let you automate actions when agent commands are issued. │ │ Example: Save session context to memory when you issue /new or /reset. │ │ │ │ Learn more: https://docs.openclaw.ai/automation/hooks │ │ │ ├──────────────────────────────────────────────────────────────────────────╯ │ ◇ Enable hooks? │ Skip for now Config warnings: - plugins.entries.feishu: plugin feishu: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/feishu/index.ts) Config overwrite: /root/.openclaw/openclaw.json (sha256 39b96fed22c10c899a69792e607481ecf7d50b58f30be76a2451fd34630ab5a7 -> 21a9d0e63b76cf77d1b268e539c9a5eeba5e3f47e8981a9ba65f5295d91e11da, backup=/root/.openclaw/openclaw.json.bak) │ ◇ Systemd ───────────────────────────────────────────────────────────────────────────────╮ │ │ │ Systemd user services are unavailable. Skipping lingering checks and service install. │ │ │ ├─────────────────────────────────────────────────────────────────────────────────────────╯ │ ◇ Gateway service ─────────────────────────────────────────────────────────────────────╮ │ │ │ Systemd user services are unavailable; skipping service install. Use your container │ │ supervisor or `docker compose up -d`. │ │ │ ├───────────────────────────────────────────────────────────────────────────────────────╯ Config warnings:\n- plugins.entries.feishu: plugin feishu: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/feishu/index.ts) Config warnings:\n- plugins.entries.feishu: plugin feishu: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/feishu/index.ts) Health check failed: gateway closed (1006 abnormal closure (no close frame)): no close reason Gateway target: ws://127.0.0.1:18789 Source: local loopback Config: /root/.openclaw/openclaw.json Bind: loopback │ ◇ Health check help ────────────────────────────────╮ │ │ │ Docs: │ │ https://docs.openclaw.ai/gateway/health │ │ https://docs.openclaw.ai/gateway/troubleshooting │ │ │ ├────────────────────────────────────────────────────╯ │ ◇ Optional apps ────────────────────────╮ │ │ │ Add nodes for extra features: │ │ - macOS app (system + notifications) │ │ - iOS app (camera/canvas) │ │ - Android app (camera/canvas) │ │ │ ├────────────────────────────────────────╯ │ ◇ Control UI ───────────────────────────────────────────────────────────────────────────────╮ │ │ │ Web UI: http://127.0.0.1:18789/ │ │ Web UI (with token): │ │ http://127.0.0.1:18789/#token=xxxxxxxx │ │ Gateway WS: ws://127.0.0.1:18789 │ │ Gateway: not detected (gateway closed (1006 abnormal closure (no close frame)): no close │ │ reason) │ │ Docs: https://docs.openclaw.ai/web/control-ui │ │ │ ├────────────────────────────────────────────────────────────────────────────────────────────╯ │ ◇ Workspace backup ────────────────────────────────────────╮ │ │ │ Back up your agent workspace. │ │ Docs: https://docs.openclaw.ai/concepts/agent-workspace │ │ │ ├───────────────────────────────────────────────────────────╯ │ ◇ Security ──────────────────────────────────────────────────────╮ │ │ │ Running agents on your computer is risky — harden your setup: │ │ https://docs.openclaw.ai/security │ │ │ ├─────────────────────────────────────────────────────────────────╯ │ ◇ Shell completion ───────────────────────────────────────────────────────╮ │ │ │ Shell completion installed. Restart your shell or run: source ~/.zshrc │ │ │ ├──────────────────────────────────────────────────────────────────────────╯ │ ◇ Dashboard ready ────────────────────────────────────────────────────────────────╮ │ │ │ Dashboard link (with token): │ │ http://127.0.0.1:18789/#token=xxxxxxx │ │ Copy/paste this URL in a browser on this machine to control OpenClaw. │ │ No GUI detected. Open from your computer: │ │ ssh -N -L 18789:127.0.0.1:18789 user@<host> │ │ Then open: │ │ http://localhost:18789/ │ │ http://localhost:18789/#token=xxxxxxx │ │ Docs: │ │ https://docs.openclaw.ai/gateway/remote │ │ https://docs.openclaw.ai/web/control-ui │ │ │ ├──────────────────────────────────────────────────────────────────────────────────╯ │ ◇ Web search (optional) ─────────────────────────────────────────────────────────────────╮ │ │ │ If you want your agent to be able to search the web, you’ll need an API key. │ │ │ │ OpenClaw uses Brave Search for the `web_search` tool. Without a Brave Search API key, │ │ web search won’t work. │ │ │ │ Set it up interactively: │ │ - Run: openclaw configure --section web │ │ - Enable web_search and paste your Brave Search API key │ │ │ │ Alternative: set BRAVE_API_KEY in the Gateway environment (no config changes). │ │ Docs: https://docs.openclaw.ai/tools/web │ │ │ ├─────────────────────────────────────────────────────────────────────────────────────────╯ │ ◇ What now ─────────────────────────────────────────────────────────────╮ │ │ │ What now: https://openclaw.ai/showcase ("What People Are Building"). │ │ │ ├────────────────────────────────────────────────────────────────────────╯ │ └ Onboarding complete. Use the dashboard link above to control OpenClaw.2.7 启动openclaw容器(container)
docker start openclaw
2.8 openclaw容器内启动gateway
docker exec -it openclaw openclaw gateway run
2.9 openclaw容器内使用tui对话
2.9.1 docker应用内对话
在docker桌面版——Containers——点击openclaw这个container——Exec——运行——对话
openclaw tui
2.9.2 新开终端对话
docker exec -it openclaw openclaw tui2.10 openclaw与飞书配对
2.10.1 回到飞书与机器人聊天,会提示需要配对

2.10.2 在docker的Container终端内运行
openclaw pairing approve feishu CZQCNKEG
2.10.3 回到飞书继续聊天——大功告成!

三、总结
本教程完整覆盖了MacOS系统下,基于Docker部署OpenClaw并完成飞书机器人集成的全流程操作,核心逻辑是依托Docker实现标准化环境部署,规避系统兼容问题,再通过大模型API配置赋予工具AI核心能力,最后对接飞书开放平台实现办公场景落地,整体流程可分为环境搭建、镜像部署、核心配置、平台对接、功能调试五大核心环节。
从实操关键点来看,Docker环境正常启动、大模型API信息准确、飞书长链接稳定运行、权限配置完整、两端成功配对是整个部署流程的核心要点,任意一个环节出错都会导致功能异常,新手操作时需重点关注长链接启动后再保存飞书配置、权限批量导入完整、容器全程保持运行这几个细节,避免踩坑。
完成全部部署后,OpenClaw飞书AI机器人即可正常投入使用,实现飞书端的AI对话、信息查询、任务处理等功能,且基于Docker的部署方式具备易维护、易迁移、易重启的优势,后续可根据需求自定义添加Skills技能、更换大模型API或对接其他协同平台,拓展更多实用功能。整体部署流程门槛较低,无需深厚的运维和开发基础,按照步骤逐步操作即可完成,能够快速帮助个人和团队实现AI办公能力的轻量化落地,提升日常办公协作效率,后续若出现容器异常、接口调用失败等问题,可优先检查Docker运行状态、API密钥有效性、飞书长链接连通性和权限配置情况,快速排查解决。