Mac mini M2 部署 OpenClaw:最稳 7×24 本地 AI 服务器
1. Mac mini M2 跑 OpenClaw 的真实场景与坑点Mac mini M2 这台机器我愿称之为「家用 AI 服务器天花板」8 核 CPU 10 核 GPU、统一内存带宽 100GB/s、整机功耗 5–10W、几乎零噪音。你把它塞在电视柜或者书桌角落插上电、连上 Wi-Fi它就能 7×24 小时不关机地跑 OpenClaw 这类本地 AI 服务。但「能跑」和「稳跑」是两回事很多人第一次部署 OpenClaw 会卡在三个地方Docker Desktop 的资源分配没调、容器重启策略没配、以及模型 API 通道没打通导致服务起来了但请求全超时。先说清楚 OpenClaw 是什么、能做什么、适合谁。OpenClaw 是一个可自托管的 AI 服务框架你可以把它理解成一个「本地 AI 网关 会话管理 工具调用」的组合体它对外暴露 HTTP API对内可以接本地模型llama.cpp、Ollama 等也可以接云端模型 API。适合三类人一是想在家里搭一个随时可用的 AI 助手、不想每次开电脑等模型加载的人二是做 Agent / 自动化脚本开发、需要一个稳定常驻的推理入口的人三是想把 Mac mini 当家庭服务器、顺便跑点 AI 服务的人。我自己的场景是Mac mini M2 放在书房白天写代码时用 OpenClaw 做代码补全和文档问答晚上跑一些定时任务比如自动整理笔记、生成日报。这就要求它必须 7×24 稳定不能我睡一觉起来发现容器挂了。踩过的坑主要集中在这几块Docker Desktop 默认只给 2GB 内存OpenClaw 加载模型直接 OOMrestart: always写了但 Docker Desktop 本身没设开机自启重启后容器全没了以及最关键的——模型 API 通道不稳定请求经常 401 或者超时。所以这篇教程的核心思路是用 Docker Compose 把 OpenClaw PostgreSQL Redis 三件套编排起来用 TaoToken 统一 Key/API 通道解决模型调用问题再配上 LaunchAgent 做开机自启和健康检查。整套配置我会给全你复制粘贴就能跑。下面从 TaoToken 的前置准备开始。2. TaoToken 统一 Key/API 通道前置准备在 Mac mini 上跑 OpenClaw模型调用这块有两个选择一是纯本地模型Ollama llama.cpp二是接云端 API。纯本地模型的好处是数据不出内网但 M2 的 8–24GB 统一内存跑 7B 模型还行跑更大的模型就吃力了而且推理速度会拖慢整个服务的响应。所以更实用的方案是「本地小模型兜底 云端 API 主力」这时候就需要一个稳定的 API 通道。TaoToken 在这里扮演的角色是「统一 Key/API 通道」你不需要在 OpenClaw 里分别配置 OpenAI、Anthropic、DeepSeek 等一堆厂商的 Key 和 Base URL只需要一个 TaoToken 的 Key 和一个 Base URL就能在 OpenClaw 里调用多个模型。对 7×24 运行的本地服务器来说这能省掉大量「某个厂商 Key 过期了要改配置」的维护成本。前置准备分三步。第一步注册并拿到 API Key。访问 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后在控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_campaignrewrite API Key 管理页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_campaignrewrite 。创建时建议给 Key 起个名字比如macmini-openclaw方便以后区分。第二步确认 Base URL。TaoToken 的 API 端点是https://taotoken.net/api注意这个地址不带任何 UTM 参数直接写进配置里就行。OpenClaw 里配置模型时Base URL 填这个Key 填你刚创建的Model ID 填你想用的模型名比如gpt-4o、claude-3-5-sonnet等具体以 TaoToken 文档为准。第三步本地验证 Key 是否可用。在 Mac mini 终端里跑一条 curl确认网络和 Key 都没问题curl -s -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d { model: gpt-4o, messages: [{role: user, content: ping}], max_tokens: 10 }如果返回里有choices字段说明通道通了。如果返回 401检查 Key 有没有复制错、有没有多余空格如果返回超时检查 Mac mini 的网络后面排障章节会细说。这一步很重要因为 OpenClaw 容器里的网络环境和宿主机不完全一样先在宿主机确认通道可用能排除掉一半问题。另外提醒一句TaoToken 的 Key 不要直接写进docker-compose.yml而是写进.env文件然后通过env_file或环境变量注入。这样你以后换 Key 不用改 Compose 文件也避免 Key 被提交到 Git。下面进入正式部署。3. 可复制的 Docker Compose 与 OpenClaw 配置这一章是全文的核心所有配置我都给全你按顺序复制即可。先创建工作目录mkdir -p ~/openclaw/data cd ~/openclaw然后创建.env文件把 TaoToken 的 Key 和模型配置写进去cat .env EOF # OpenClaw 基础配置 OPENCLAW_PORT8080 OPENCLAW_HOST0.0.0.0 # 数据库配置 DB_HOSTpostgres DB_PORT5432 DB_NAMEopenclaw DB_USERopenclaw DB_PASSWORDopenclaw123 # Redis 配置 REDIS_HOSTredis REDIS_PORT6379 REDIS_PASSWORD # TaoToken 统一 API 通道 TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_API_KEYsk-你的Key TAOTOKEN_DEFAULT_MODELgpt-4o # 日志 LOG_LEVELinfo EOF注意TAOTOKEN_API_KEY换成你自己的 Key。接着创建docker-compose.ymlversion: 3.8 services: openclaw: image: openclaw/openclaw:latest container_name: openclaw restart: always ports: - 8080:8080 volumes: - ~/openclaw/data:/data - ~/openclaw/config.toml:/app/config.toml:ro env_file: - .env environment: - DB_HOSTpostgres - REDIS_HOSTredis depends_on: postgres: condition: service_healthy redis: condition: service_started healthcheck: test: [CMD, curl, -f, http://localhost:8080/api/health] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - openclaw-net postgres: image: postgres:14 container_name: openclaw-postgres restart: always volumes: - ~/openclaw/data/postgres:/var/lib/postgresql/data environment: - POSTGRES_DBopenclaw - POSTGRES_USERopenclaw - POSTGRES_PASSWORDopenclaw123 healthcheck: test: [CMD-SHELL, pg_isready -U openclaw] interval: 10s timeout: 5s retries: 5 networks: - openclaw-net redis: image: redis:7-alpine container_name: openclaw-redis restart: always volumes: - ~/openclaw/data/redis:/data networks: - openclaw-net networks: openclaw-net: driver: bridge这里有几个关键点restart: always保证容器挂了自动重启healthcheck让 Docker 能感知 OpenClaw 是否真的健康depends_on配合condition: service_healthy保证 Postgres 就绪后才启动 OpenClaw避免启动顺序问题导致连接失败。然后是config.toml骨架OpenClaw 的模型通道配置写在这里[server] host 0.0.0.0 port 8080 [database] host postgres port 5432 name openclaw user openclaw password openclaw123 [redis] host redis port 6379 [model] provider openai-compatible base_url https://taotoken.net/api api_key ${TAOTOKEN_API_KEY} default_model gpt-4o timeout 60 [model.fallback] enabled true provider ollama base_url http://host.docker.internal:11434 model qwen2.5:7b [logging] level info path /var/log/openclaw${TAOTOKEN_API_KEY}会从环境变量读取这样 Key 不会硬编码在配置文件里。[model.fallback]是可选的本地兜底如果你没装 Ollama 可以删掉这一段。如果你用的是 Cline MCP 或者 Claude Code 这类工具连 OpenClaw配置里需要写全三件套Base URL 填https://taotoken.net/apiKey 填 TaoToken 的 KeyModel ID 填gpt-4o或你用的模型名。Cline 的 MCP 配置示例{ mcpServers: { openclaw: { url: http://localhost:8080/mcp, env: { OPENCLAW_API_KEY: your-openclaw-key } } } }Codex 的auth.json配置示例{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: gpt-4o }配置写完后启动docker-compose up -d docker-compose ps正常情况下你会看到三个容器都是Up状态OpenClaw 那个还会显示(healthy)。如果 OpenClaw 显示(unhealthy)先看日志docker-compose logs -f openclaw多半是数据库连接或者模型通道的问题下一章会讲怎么验证。4. 验证请求与成功结果容器起来不代表服务能用必须做连通性验证。分三层容器健康、API 健康、模型通道健康。第一层容器健康检查。docker-compose ps里 OpenClaw 显示(healthy)就说明容器自身的 healthcheck 通过了。如果一直(health: starting)等 40 秒start_period设的 40s还不行就看日志。第二层API 健康检查。在 Mac mini 宿主机上跑curl -s http://localhost:8080/api/health正常返回类似{status:ok,db:connected,redis:connected}。如果返回{status:degraded,db:disconnected}说明 OpenClaw 连不上 Postgres检查.env里的DB_HOST是不是postgres容器名以及 Postgres 容器是否健康。第三层模型通道验证。这是最关键的一步直接调 OpenClaw 的 chat 接口curl -s -X POST http://localhost:8080/api/chat \ -H Content-Type: application/json \ -d { message: 用一句话解释什么是 Docker, model: gpt-4o }如果返回里有正常的回答内容说明 OpenClaw → TaoToken → 模型 这条链路全通了。如果返回 401是 TaoToken Key 的问题如果返回超时是网络或 Base URL 的问题如果返回reading choices相关错误说明上游返回格式不对检查 Model ID 是否拼写正确。我实测下来M2 上 OpenClaw 冷启动到健康大约 15–25 秒之后简单问答响应在 1–2 秒取决于上游模型并发 10 个请求总耗时 8–10 秒。这个性能做家庭 AI 服务器完全够用。再验证一下开机自启。创建 LaunchAgentcat ~/Library/LaunchAgents/com.openclaw.plist EOF ?xml version1.0 encodingUTF-8? !DOCTYPE plist PUBLIC -//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd plist version1.0 dict keyLabel/key stringcom.openclaw/string keyProgramArguments/key array string/usr/local/bin/docker-compose/string string-f/string string/Users/你的用户名/openclaw/docker-compose.yml/string stringup/string string-d/string /array keyRunAtLoad/key true/ keyKeepAlive/key true/ keyStandardOutPath/key string/tmp/openclaw.log/string keyStandardErrorPath/key string/tmp/openclaw.err/string /dict /plist EOF launchctl load ~/Library/LaunchAgents/com.openclaw.plist注意把/Users/你的用户名/换成实际路径。加载后重启 Mac mini等一分钟再跑curl http://localhost:8080/api/health如果返回 ok说明开机自启成功。这一步做完你的 7×24 本地 AI 服务器就算立起来了。5. 本篇常见错误排查这一章按真实报错来你遇到哪个查哪个。报错一401 Unauthorized。最常见两种原因TaoToken Key 错了或者 OpenClaw 没读到环境变量。先确认.env里TAOTOKEN_API_KEY没有多余空格和引号再进容器里确认环境变量注入了docker exec openclaw env | grep TAOTOKEN。如果容器里没有这个变量说明env_file没生效检查docker-compose.yml里env_file: - .env的缩进。还有一种情况是config.toml里写的是${TAOTOKEN_API_KEY}但 OpenClaw 版本不支持变量插值那就直接写 Key不推荐但能快速验证。报错二local proxy failed / connection refused。这个通常出现在 OpenClaw 容器尝试访问宿主机服务时。如果你配了 Ollama 兜底base_url写的是http://localhost:11434在容器里 localhost 指向容器自己不是宿主机。正确写法是http://host.docker.internal:11434。Mac 上 Docker Desktop 支持这个特殊域名。如果是访问 TaoToken 超时检查 Mac mini 的 DNS可以试试在 Docker Desktop 设置里把 DNS 改成8.8.8.8。报错三reading choices 相关错误。这个报错说明 OpenClaw 收到了上游响应但解析choices字段失败。原因通常是 Model ID 写错了比如你写gpt4o但实际应该是gpt-4o或者你用的模型在 TaoToken 上不支持 chat completions 格式。解决办法先用第 2 章的 curl 命令在宿主机直接调 TaoToken确认返回结构里有choices再把同样的 Model ID 填进config.toml。报错四OAuth / token expired。如果你用的是 Claude Code 或 Codex 这类带 OAuth 的工具连 OpenClaw可能会遇到 token 过期。这类工具建议直接用 API Key 模式而不是 OAuth 模式配置里写全三件套Base URLhttps://taotoken.net/api、Key、Model ID。Codex 的auth.json里不要留旧的 OAuth token清空后只填api_key字段。报错五容器频繁重启。docker-compose ps里看到Restarting先看日志docker-compose logs --tail100 openclaw。如果是 OOM去 Docker Desktop → Settings → Resources 把 Memory 调到 8GBM2 16GB 机型或 12GB24GB 机型。如果是数据库连接失败检查 Postgres 容器的 healthcheck 是否通过。如果是端口冲突lsof -i :8080看谁占了 8080改.env里的OPENCLAW_PORT。报错六健康检查一直 starting。把start_period从 40s 调到 90s 试试M2 上首次启动要初始化数据库慢一点正常。如果超过 2 分钟还不行进容器手动跑 healthcheck 命令docker exec openclaw curl -f http://localhost:8080/api/health看具体报什么错。排障时有个通用技巧所有配置改完后用docker-compose down docker-compose up -d重建而不是restart因为restart不会重新读取.env和config.toml。这个坑我踩过好几次改了 Key 发现不生效就是因为只 restart 了。6. 长期运行与后续接入建议7×24 运行的核心不是「部署一次」而是「部署后能自愈」。前面配的restart: always healthcheck LaunchAgent 已经覆盖了大部分场景但还有两件事建议做。第一件加一个定时健康检查脚本每 5 分钟跑一次发现异常自动重启并记日志cat ~/openclaw/monitor.sh EOF #!/bin/bash LOG~/openclaw/monitor.log HEALTH$(curl -s -o /dev/null -w %{http_code} http://localhost:8080/api/health) echo [$(date %F %T)] health$HEALTH $LOG if [ $HEALTH ! 200 ]; then cd ~/openclaw docker-compose restart openclaw echo [$(date %F %T)] restarted openclaw $LOG fi EOF chmod x ~/openclaw/monitor.sh再用 LaunchAgent 每 300 秒跑一次配置和前面的 plist 类似把ProgramArguments换成monitor.sh加StartInterval为 300。第二件磁盘清理。Docker 日志和镜像会慢慢吃满 SSD建议每月跑一次docker system prune -f或者写进 monitor 脚本里当磁盘使用率超过 80% 时自动清理。后续如果你想扩展几个方向一是接更多模型在 TaoToken 控制台看支持的模型列表改config.toml里的default_model即可不用改代码二是接 Coding Plan 做长期编码任务适合把 OpenClaw 当代码助手常驻三是把 OpenClaw 的 API 暴露到局域网让家里其他设备也能用注意加认证。模型对话调试可以用 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_campaignrewrite 快速验证模型可用性接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_campaignrewrite 。最后说个实用技巧Mac mini M2 的 SSD 读写很快但 Docker volume 默认走的是虚拟磁盘性能有损耗。如果你对 IO 敏感可以把~/openclaw/data放到外置 Thunderbolt SSD 上改docker-compose.yml里的 volume 路径即可。不过对大多数 AI 服务场景内置 SSD 完全够用。整套配置跑下来功耗稳定在 8–10W一个月电费不到 5 块钱这才是 Mac mini 做本地 AI 服务器最香的地方。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →