1. 为什么要在 Mac mini 上折腾 OpenClaw + TaoToken
OpenClaw 是一个可以常驻运行的 AI 助理框架,它有自己的 workspace、记忆和定时任务,适合跑在 Mac mini 这种低功耗、7×24 小时在线的机器上。而 TaoToken 提供统一的 Key/API 通道,把模型调用、编码计划、控制台管理收敛到一个入口,省得你在每个工具里重复填 Key。把这两者接起来,你就能让 OpenClaw 在 Docker 里稳定跑,同时通过 SSH 远程接入 TaoToken,做到"机器在角落,能力在云端"。
我第一次把 OpenClaw 塞进 Mac mini 的 Docker 时,踩了两个坑,也正是这篇要复现的两个 Aha 时刻。第一个 Aha:Docker Desktop 会注入系统代理,导致容器内访问外部 API 时被拦截,OpenClaw 的定时任务直接失败。第二个 Aha:通过 SSH 端口转发,把 TaoToken 的 API 通道安全地映射进容器,既不用在容器里硬编码 Key,也不用改宿主机网络。这两个点解决后,OpenClaw 才真正变成"你睡了它还在干活"的状态。
这篇面向的是已经在 Mac mini 上跑 Docker、想给 OpenClaw 接统一 Key 通道的人。你需要会基本的终端操作,知道 Docker 和 SSH 是什么,剩下的配置我会给到可复制的骨架。全程不涉及任何网络工具,只用 Docker 自带能力和 SSH 本地转发。
2. TaoToken 前置准备:拿 Key、看文档、选对入口
在动手改配置之前,先把 TaoToken 这边的入口理清楚。官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api (这个不加 UTM)。你需要先注册并创建一个 API Key,然后根据用途选不同的 deep link:
- 想先验证模型能不能通,用模型对话:https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite
- 长期编码或跑 Agent,用 Coding Plan:https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite
- 管理 Key 和额度,用控制台:https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
- 直接创建 Key,用 API Keys 页:https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite
- 查接入细节,用文档:https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
- 如果你用 Claude Code 这类工具,走 Anthropic 兼容入口:https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_content=claudecode_anthropic&utm_campaign=rewrite
拿到 Key 之后,不要急着写进 OpenClaw 的配置文件。我的做法是先把 Key 放在宿主机的环境变量里,再通过 SSH 转发把 API 通道暴露给容器。这样容器里看不到明文 Key,换 Key 也不用重建镜像。TaoToken 的 API 是标准 HTTP 接口,OpenClaw 的 config.toml 里只需要填 base_url 和 api_key 两个字段,剩下的由 OpenClaw 自己处理。
这里有个细节:TaoToken 的 API 基址是 https://taotoken.net/api ,不是根域名。你在 config.toml 里写 base_url 时,要带上 /api 路径,否则请求会打到官网首页而不是接口。我一开始就漏了这截,OpenClaw 报 404,排查了十分钟才反应过来。
3. 可复制配置:config.toml、settings.json 与 Docker 启动参数
先给 OpenClaw 的 config.toml 骨架。这个文件放在你挂载进容器的 workspace 目录里,比如 ~/openclaw/config.toml:
[server] host = "0.0.0.0" port = 8080 [model] provider = "openai-compatible" base_url = "http://host.docker.internal:18080/api" api_key = "sk-your-taotoken-key" model_name = "gpt-4o-mini" timeout = 120 [workspace] path = "/workspace" memory_file = "/workspace/memory.json" [tasks] enabled = true schedule_file = "/workspace/schedule.json"注意 base_url 我写的是 http://host.docker.internal:18080/api ,这里的 18080 是后面 SSH 转发用的本地端口。Mac 上 Docker Desktop 支持 host.docker.internal 这个特殊域名,容器里可以直接访问宿主机。这样 OpenClaw 以为自己在调本地接口,实际流量被 SSH 转发到了 TaoToken。
接着是 settings.json,这个文件控制 OpenClaw 的运行时行为,放在同一目录:
{ "log_level": "info", "max_concurrent_tasks": 3, "retry": { "enabled": true, "max_attempts": 3, "backoff_seconds": 5 }, "proxy": { "enabled": false, "no_proxy": "*" }, "ffmpeg": { "binary": "/usr/bin/ffmpeg", "temp_dir": "/workspace/tmp" } }proxy.enabled 设成 false 是关键。Docker Desktop 默认会注入 HTTP_PROXY 环境变量,OpenClaw 如果跟着走代理,请求会被拦。这里显式关掉,配合 no_proxy 通配,容器内的请求就直连 host.docker.internal。
然后是 Docker 启动参数。我用的命令是这样的:
docker run -d \ --name openclaw \ --restart unless-stopped \ -p 8080:8080 \ -v ~/openclaw:/workspace \ -e NO_PROXY="*" \ -e no_proxy="*" \ -e HTTP_PROXY="" \ -e HTTPS_PROXY="" \ --add-host=host.docker.internal:host-gateway \ openclaw/openclaw:latest--add-host 这行在 Linux 上需要,Mac 的 Docker Desktop 自带 host.docker.internal 解析,但加上更保险。环境变量把代理全部清空,避免容器内任何进程走代理。--restart unless-stopped 保证 Mac mini 重启后 OpenClaw 自动起来。
4. SSH 端口转发与验证请求:让容器安全接入 TaoToken
现在到了第一个 Aha 时刻的核心:SSH 端口转发。你不需要在容器里配任何网络工具,只需要在宿主机上开一条 SSH 隧道,把本地的 18080 端口转发到 TaoToken 的 API 地址。命令如下:
ssh -N -L 18080:taotoken.net:443 your-server这条命令的意思是:在本地监听 18080,所有发往这个端口的流量,通过 SSH 隧道送到 your-server,再由 your-server 转发到 taotoken.net 的 443 端口。your-server 可以是你自己的任意一台能访问 TaoToken 的机器,比如一台云主机。这样容器里访问 host.docker.internal:18080,实际就走到了 TaoToken 的 HTTPS 接口。
但这里有个问题:TaoToken 的 API 是 HTTPS,而 SSH 转发出来的是明文 HTTP。OpenClaw 的 base_url 写的是 http://host.docker.internal:18080/api ,请求到了 SSH 隧道另一端会变成对 taotoken.net:443 的 TCP 连接,但 TLS 握手需要客户端发起。所以更稳妥的做法是用 socat 或者 stunnel 在本地做一层 TLS 封装,或者直接让 OpenClaw 走 HTTPS。
我实测下来更简单的方案是:SSH 转发到本地的 18080,然后用一个轻量反向代理把 HTTPS 转成 HTTP。但这样又多了一层。最终我选的是让 OpenClaw 直接支持 HTTPS,base_url 写成 https://host.docker.internal:18080/api ,SSH 命令改成:
ssh -N -L 18080:taotoken.net:443 your-server这样本地 18080 收到 TLS 流量,SSH 隧道原样透传到 taotoken.net:443,TLS 握手在客户端和 TaoToken 之间完成,中间 SSH 只做 TCP 转发。OpenClaw 的 config.toml 里 base_url 改成 https://host.docker.internal:18080/api 即可。
验证请求是否通,用 curl 在容器内跑一条:
docker exec -it openclaw curl -s -o /dev/null -w "%{http_code}" \ https://host.docker.internal:18080/api/v1/models \ -H "Authorization: Bearer sk-your-taotoken-key"如果返回 200,说明通道打通。返回 000 通常是 SSH 隧道没起来,返回 401 是 Key 不对,返回 404 是 base_url 路径写错。这一步过了,第一个 Aha 时刻就复现了:容器里的 OpenClaw 通过 SSH 隧道安全地调到了 TaoToken,宿主机和容器都不需要任何额外网络配置。
5. ffmpeg 转码任务验证:第二个 Aha 时刻的落地动作
第二个 Aha 时刻来自 ffmpeg 转码任务。OpenClaw 跑在 Docker 里,ffmpeg 也在容器内,但输入输出文件通过 volume 挂载到宿主机。我准备了一个测试视频,放在 ~/openclaw/tmp/test.mp4,然后在 OpenClaw 的 schedule.json 里加一条定时任务:
{ "tasks": [ { "name": "transcode_test", "schedule": "*/5 * * * *", "command": "ffmpeg -y -i /workspace/tmp/test.mp4 -c:v libx264 -preset fast -crf 23 -c:a aac -b:a 128k /workspace/tmp/output.mp4", "timeout": 300 } ] }这条任务每 5 分钟跑一次,把 test.mp4 转成 H.264 + AAC 的 output.mp4。OpenClaw 会在容器内执行 ffmpeg,输入输出都走挂载目录,宿主机上能直接看到结果。
但这里有个坑:Docker Desktop 注入的代理会影响 ffmpeg 吗?一般不会,ffmpeg 不读 HTTP_PROXY。但 OpenClaw 在调度任务时,如果它自己走代理去拉取任务元数据,就会失败。所以 settings.json 里的 proxy.enabled=false 同样关键。我试过不改这个,任务状态一直卡在 pending,日志里报代理连接超时。
验证转码是否成功,在宿主机上跑:
ls -lh ~/openclaw/tmp/output.mp4 ffprobe -v error -show_entries format=duration,size -of default=noprint_wrappers=1 ~/openclaw/tmp/output.mp4如果 output.mp4 存在且时长和源文件一致,说明 ffmpeg 在容器内正常工作。第二个 Aha 时刻就是:OpenClaw 在 Docker 里调度 ffmpeg 任务,通过 SSH 隧道拿 TaoToken 的模型能力做任务编排,整个链路不依赖任何外部网络工具,全部在 Mac mini 本地闭环。
如果你想让 OpenClaw 根据视频内容自动生成转码参数,可以在任务里加一步调用 TaoToken 的模型对话接口,让它分析视频元数据后返回 ffmpeg 命令。这一步用模型对话入口验证最方便:https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite
6. 本篇常见错排查
第一个高频错误:容器内 curl 返回 000。这通常是 SSH 隧道没起来,或者 your-server 无法访问 TaoToken。先在宿主机上跑 ssh -N -L 18080:taotoken.net:443 your-server,保持终端不关,再在另一个终端里 curl -v https://localhost:18080/api/v1/models 看握手是否成功。如果宿主机都不通,检查 your-server 的出网策略。
第二个错误:OpenClaw 日志报 proxy connection refused。这是 Docker Desktop 注入的代理没清干净。检查 docker exec openclaw env | grep -i proxy,如果有 HTTP_PROXY 之类的变量,说明启动参数没生效。重新用第 3 节的 docker run 命令,确保 -e HTTP_PROXY="" 和 -e NO_PROXY="*" 都在。
第三个错误:ffmpeg 任务一直 pending。除了代理问题,还可能是 schedule.json 的 cron 表达式写错,或者 OpenClaw 没有权限读 /workspace/tmp。检查 docker exec openclaw ls -l /workspace/tmp,确认挂载目录权限是 777 或者容器内用户可写。
第四个错误:base_url 返回 404。TaoToken 的 API 基址是 https://taotoken.net/api ,不是根域名。config.toml 里 base_url 要写成 https://host.docker.internal:18080/api ,末尾不要多加斜杠。如果还是 404,用 curl 直接打 https://taotoken.net/api/v1/models 确认路径。
第五个错误:SSH 隧道断连后 OpenClaw 请求全部超时。SSH 默认没有 keepalive,长时间空闲会断。在 ssh 命令里加 -o ServerAliveInterval=30 -o ServerAliveCountMax=3,让隧道保持活跃。或者用 autossh 替代 ssh,自动重连。
排障时如果拿不准 Key 或接入路径,直接看 API Keys 页和接入文档:https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 和 https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
7. 长期编码与 Agent 场景的 CTA
如果你只是临时验证,上面的配置够用了。但如果你打算让 OpenClaw 长期跑编码任务或者 Agent 工作流,建议走 Coding Plan,额度和并发更稳:https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite
控制台可以看用量和 Key 状态:https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
官网入口在这里,注册和文档都从这进:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
我自己的 Mac mini 上,OpenClaw 已经跑了快一个月,SSH 隧道用 autossh 保活,ffmpeg 任务每天定时转码直播回放。两个 Aha 时刻之后,我基本不再手动干预它,只在早上看飞书里的任务报告。如果你也卡在代理或者 Key 管理上,按第 3 节的配置抄一遍,大概率能省下我踩坑的那两个小时。