☰
Mac mini 硬盘扩容 + OpenClaw:家庭数据中转站搭建实录
2026/10/12 17:24:19 网站建设 项目流程

1. Mac mini 扩容后为什么需要一个家庭数据中转站

Mac mini 的定位很微妙:它性能足够、功耗够低、常年开机也不心疼电费,但原厂存储价格贵得离谱。我身边不少朋友买的是 256GB 或 512GB 版本,用不到半年系统盘就红了。扩容这件事本身不难,外接一块 SSD 或者换内置盘都能解决容量问题,但扩容之后你会发现一个新问题:数据是散落的。手机的照片备份在移动硬盘 A,笔记本的工程文件在共享文件夹 B,下载的电影在硬盘 C,家里几台设备各存各的,找一份文件要翻三个地方。

这就是「家庭数据中转站」要解决的事。它不是简单的 NAS,而是在存储之上加一层智能处理能力:自动归档、内容索引、按需转码、多设备同步。OpenClaw 这类自托管服务正好补上这一层,它跑在 Docker 里,把挂载进来的目录当成数据源,对外提供统一的访问入口。

而模型服务这一环,过去最麻烦的是每家厂商一个 Key、一套计费、一套接口格式。我试过在几个项目里分别维护 OpenAI、Anthropic 和国内几家平台的配置,光是环境变量就写满一屏。TaoToken 的价值在于把这些通道收敛成一个统一 Key,OpenClaw 只需要认一个 Base URL 和一把 Key,后面换模型、加模型都不用改业务代码。这篇就按「扩容 → 部署 → 挂载 → 接模型 → 排障」的顺序,把可复制的片段全部给出来。

适合谁看:手里有 Mac mini、想把它变成家庭数据中心、又不想折腾一堆厂商配置的人。全程命令可直接粘贴,路径按你自己的盘符改一下就行。

2. 扩容方案选型与外置盘挂载实操

扩容有三条路:换内置 SSD、外接 SSD、外接 HDD。换内置性能最好但要拆机,Mac mini 的拆解对新手不算友好,而且拆了影响保修,我不太推荐第一次就上。外接方案里,SSD 适合放经常读写的数据(照片库、代码、Docker 数据卷),HDD 适合放冷数据(影视库、历史备份)。我的建议是组合:一块 1TB 外接 SSD 做热数据 + 一块 4TB HDD 做冷备份,总成本比升级内置盘低不少。

选定硬盘后先格式化。打开「磁盘工具」,选中外接盘,点「抹掉」,名称填Data,格式选APFS,方案选GUID 分区图。APFS 对 SSD 友好,支持快照和加密,后面做 Time Machine 也方便。

格式化完确认挂载状态:

diskutil list

输出里找到你的盘,比如/dev/disk4,然后确认挂载点:

diskutil info /dev/disk4 | grep "Mount Point"

正常会显示/Volumes/Data。如果没自动挂载,手动来一下:

diskutil mountDisk /dev/disk4

为了让它在重启后稳定挂载,用vifs编辑 fstab:

sudo vifs

加入一行(注意用 TAB 分隔字段,不是空格):

LABEL=Data /Volumes/Data apfs rw,auto,nobrowse 0 0

这里我加了nobrowse,桌面和 Finder 侧边栏不会一直显示这块盘,减少误操作。挂载点建好之后,把要共享的目录一次性建出来:

mkdir -p /Volumes/Data/{openclaw,documents,photos,videos,music,downloads,backups}

权限这块是后面最容易出问题的地方。Docker 容器里的进程 UID 通常不是你的登录用户,如果目录权限是700,容器读写会直接失败。给共享目录放宽到组可写:

sudo chown -R $(whoami):staff /Volumes/Data sudo chmod -R 775 /Volumes/Data

775意味着属主和同组可读写执行,其他人只读。家庭环境够用,别直接上777,那等于把盘敞开给局域网里任何设备。

注意:如果你用的是 exFAT 格式的盘,权限位是不生效的,Docker 挂载后可能出现「文件能读不能写」。家庭中转站场景建议统一用 APFS,别图省事用 exFAT。

盘挂好、目录建好,扩容这步就算落地了。接下来才是重头戏:把 OpenClaw 跑起来。

3. Docker 部署 OpenClaw 与目录挂载配置

Mac mini 上跑 Docker 最省心的是 Docker Desktop,Apple Silicon 版本对 arm64 镜像支持已经很好。先装 Homebrew(如果还没装):

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile eval "$(/opt/homebrew/bin/brew shellenv)"

然后装 Docker:

brew install --cask docker open /Applications/Docker.app docker --version docker compose version

docker compose version能打印出版本号就说明 compose v2 可用,后面统一用docker compose(中间是空格),别再用老的docker-compose。

建工作目录:

mkdir -p ~/openclaw && cd ~/openclaw

接下来是核心的docker-compose.yml。我把数据卷全部指向外置盘的/Volumes/Data/openclaw,这样容器重建、镜像升级都不会丢数据:

services: openclaw: image: openclaw/openclaw:latest container_name: openclaw restart: unless-stopped ports: - "8080:8080" volumes: - /Volumes/Data/openclaw/data:/data - /Volumes/Data/documents:/mnt/documents:ro - /Volumes/Data/photos:/mnt/photos:ro - ./config:/app/config environment: - TZ=Asia/Shanghai - DATA_PATH=/data - DB_HOST=postgres - REDIS_HOST=redis - OPENCLAW_HOST=0.0.0.0 - OPENCLAW_PORT=8080 depends_on: - postgres - redis networks: - openclaw-net postgres: image: postgres:16-alpine container_name: openclaw-postgres restart: unless-stopped volumes: - /Volumes/Data/openclaw/pgdata:/var/lib/postgresql/data environment: - POSTGRES_DB=openclaw - POSTGRES_USER=openclaw - POSTGRES_PASSWORD=change_me_strong networks: - openclaw-net redis: image: redis:7-alpine container_name: openclaw-redis restart: unless-stopped command: redis-server --appendonly yes volumes: - /Volumes/Data/openclaw/redis:/data networks: - openclaw-net networks: openclaw-net: driver: bridge

几个关键点解释一下。documents和photos用了:ro只读挂载,因为中转站主要是读取和索引这些内容,不需要容器回写,只读能防止误删。pgdata和redis的持久化目录也放在外置盘,避免系统盘被数据库日志撑爆。restart: unless-stopped保证 Mac mini 重启后容器自动拉起。

配置文件config/config.yaml单独放,方便改:

server: host: 0.0.0.0 port: 8080 storage: data_path: /data watch_dirs: - /mnt/documents - /mnt/photos database: host: postgres port: 5432 name: openclaw user: openclaw cache: host: redis port: 6379 model: provider: openai-compatible base_url: https://taotoken.net/api api_key: ${TAOTOKEN_API_KEY} model_id: claude-sonnet-4-5

注意api_key用的是环境变量占位,真正的 Key 不写进文件。在~/openclaw下建一个.env:

TAOTOKEN_API_KEY=sk-你的Key

.env记得加进.gitignore,别哪天顺手推到公开仓库。

启动:

docker compose up -d docker compose ps

ps里三个容器都是running或healthy就对了。第一次拉镜像会慢一点,耐心等。

4. 通过 TaoToken 统一 Key 接入模型并验证请求

OpenClaw 的智能处理能力依赖模型服务,比如文档摘要、图片打标、内容分类。传统做法是每个能力接一家,配置散落各处。用 TaoToken 的话,Base URL 统一填https://taotoken.net/api,Key 用同一把,模型 ID 按需切换。

先拿到 Key。访问 TaoToken API Keys 页面 创建一把,复制出来填进.env。想先确认模型可用,可以去 模型对话页 手动发一条消息试试,能正常返回再往下走。

配置写好后重启 OpenClaw 让环境变量生效:

cd ~/openclaw docker compose down docker compose up -d docker compose logs -f openclaw

日志里看到model provider initialized之类的字样,说明配置被读到了。接下来做一次真实的请求验证。OpenClaw 一般会暴露一个健康检查和一个模型测试接口,用 curl 直接打:

curl -s http://localhost:8080/api/health | jq

返回{"status":"ok"}说明服务活着。再测模型通道:

curl -s -X POST http://localhost:8080/api/model/test \ -H "Content-Type: application/json" \ -d '{"prompt":"用一句话说明家庭数据中转站的作用"}' | jq

如果 OpenClaw 版本没有这个测试端点,也可以直接验证底层通道,确认 Key 和 Base URL 没问题:

curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "messages": [{"role":"user","content":"ping"}], "max_tokens": 32 }' | jq '.choices[0].message.content'

能打印出模型回复,就说明统一 Key 通道打通了。这一步过了,OpenClaw 里所有依赖模型的功能——文档摘要、图片描述、语义搜索——都会走同一条通道,后面想换模型只改config.yaml里的model_id,不用动任何业务逻辑。

如果你打算长期跑编码类或 Agent 类任务,单次调用量大,可以看下 Coding Plan,按套餐走比按量计费更可控。接入细节和参数说明在 接入文档 里都有,遇到字段对不上先翻文档。

5. 常见报错排查:401、挂载失败与模型读取异常

部署过程里踩的坑基本集中在三类,我把真实报错和对应处理列出来。

第一类:401 Unauthorized。日志里出现401或invalid api key,九成是 Key 没生效。先确认.env里的变量名和config.yaml里的${TAOTOKEN_API_KEY}完全一致,大小写敏感。然后确认容器真的读到了环境变量:

docker compose exec openclaw env | grep TAOTOKEN

如果这里是空的,说明.env没被 compose 加载。检查.env是否和docker-compose.yml在同一目录,或者显式在 compose 里加env_file: .env。还有一种情况是 Key 复制时带了首尾空格,用cat -A .env看一眼行尾有没有多余字符。

第二类:local proxy failed / connection refused。这个报错通常出现在容器内访问外部服务时。Mac mini 上 Docker Desktop 的网络走的是虚拟网卡,容器里localhost指向容器自己,不是宿主机。如果你在配置里写了localhost:8080去访问宿主服务,必然失败。容器间通信用服务名(postgres、redis),访问宿主机用host.docker.internal。另外确认 Docker Desktop 的 DNS 设置正常,能解析外部域名:

docker compose exec openclaw nslookup taotoken.net

解析不出来就是 DNS 问题,在 Docker Desktop 设置里把 DNS 改成223.5.5.5或8.8.8.8再重启。

第三类:reading choices 相关报错。日志里出现error reading choices或unexpected response format,一般是模型返回结构和客户端预期不一致。先确认model_id拼写正确,别把claude-sonnet-4-5写成别的。再用第 4 节的 curl 直接打底层接口,看原始返回长什么样。如果底层返回正常但 OpenClaw 报错,多半是 OpenClaw 版本对 OpenAI 兼容格式的解析有差异,升级镜像到最新版:

docker compose pull docker compose up -d

第四类:挂载目录权限拒绝。报错类似permission denied或read-only file system。先看挂载是否真的生效:

docker compose exec openclaw ls -la /mnt/documents

如果列不出来,检查docker-compose.yml里的路径拼写,以及外置盘是否真的挂在/Volumes/Data。如果列得出来但写不进去,那是权限问题,回到第 2 节把目录权限调成775。只读挂载的目录本来就写不了,这是设计如此,别去改。

第五类:OAuth 相关报错。如果你在 OpenClaw 里配了需要 OAuth 的第三方服务,出现OAuth token expired或invalid_grant,先确认系统时间准确:

date

时间偏差超过几分钟会导致 token 校验失败。Mac mini 默认会同步时间,但如果你手动改过时区,检查一下TZ环境变量和系统时区是否一致。

排查顺序建议固定下来:先看容器状态docker compose ps,再看日志docker compose logs --tail=100 openclaw,然后进容器验证网络和文件系统,最后才怀疑配置。大部分问题在前两步就能定位。

6. 多设备访问与长期运行的关键配置

中转站跑起来只是开始,真正让它好用的是多设备接入和稳定运行。

文件共享用 macOS 自带的 SMB 就够。在「系统设置 → 通用 → 共享」里打开「文件共享」,把/Volumes/Data下的几个目录加进去,给每个目录设置访问用户。手机端用「文件」App 连smb://Mac-mini的IP,Windows 和 Linux 直接挂载网络驱动器。这样家里所有设备读写的是同一份数据,不用再传来传去。

OpenClaw 的 Web 界面默认监听8080,局域网内用http://Mac-mini的IP:8080访问。想在外网用的话,别直接把端口暴露到公网,用 Tailscale 这类组网工具把设备拉进同一个虚拟局域网更安全,配置也简单。

长期运行要关注两件事:磁盘空间和容器健康。写个简单的检查脚本,用 launchd 定时跑:

#!/bin/bash USAGE=$(df -h /Volumes/Data | tail -1 | awk '{print $5}' | tr -d '%') if [ "$USAGE" -gt 85 ]; then osascript -e "display notification \"磁盘使用率 ${USAGE}%\" with title \"Mac mini 存储告警\"" fi HEALTH=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/api/health) if [ "$HEALTH" != "200" ]; then cd ~/openclaw && docker compose restart openclaw fi

存成~/openclaw/check.sh,chmod +x后挂到 launchd 每 10 分钟跑一次。磁盘超阈值弹通知,服务挂了自动重启,基本不用管。

备份策略上,OpenClaw 的数据库和配置目录是核心,用 rsync 每天同步到另一块盘:

rsync -avz --delete /Volumes/Data/openclaw/pgdata /Volumes/Backup/openclaw/ rsync -avz --delete ~/openclaw/config /Volumes/Backup/openclaw/

--delete让备份和目标保持一致,但用之前确认目标路径没写错,否则会误删。冷数据(影视、历史照片)可以每周同步一次,不用天天跑。

最后提一句模型通道的维护。TaoToken 的统一 Key 让 OpenClaw 的模型配置收敛成三个字段:Base URL、Key、Model ID。想换模型只改model_id,想加新能力只改config.yaml,容器重启即可。这套结构跑久了你会发现,真正需要操心的只有硬盘够不够大,而不是配置又对不上了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询