Appearance
04 · 部署实操:MacBook Pro M5 Pro / 48GB
针对本次环境(Mac 当台式常开)的逐步部署。先搭架构 A(极简版),验证后再考虑架构 B。
环境基线
| 项 | 值 |
|---|---|
| 设备 | MacBook Pro 16"(当台式常开,不搬走) |
| 芯片 | Apple M5 Pro |
| 内存 | 48 GB |
| 系统 | macOS Tahoe 26.4 |
| 已装 | Homebrew ✅ / Node v26 ✅ / Git ✅ |
| 待装 | OrbStack(Docker 运行时)/ Ollama |
阶段 0:把 Mac 调成"真常开"
笔记本即使当台式,合盖或闲置仍会休眠,导致助理掉线。
电源设置(系统设置 → 电池 / 锁屏与睡眠):
- 关闭"自动睡眠"
- 接通电源时不让显示器关闭后睡眠
命令行兜底(防睡眠):
bash
# 临时保持唤醒(前台运行,关掉终端即失效)
caffeinate -dimsu
# 或装 Amphetamine(App Store)做图形化常驻防睡💡 后面服务都用 Docker
restart: unless-stopped+ Ollama 开机自启,重启也能自动恢复。
阶段 1:装 Ollama + 本地模型
bash
# 1. 装 Ollama
brew install ollama
# 2. 启动 Ollama 服务(后台常驻)
brew services start ollama
# 验证:应返回版本号
curl http://localhost:11434/api/version
# 3. 拉模型(约 18-20GB,按网速 10-30 分钟)
ollama pull qwen3:30b
# 4. 拉本地嵌入模型(知识库 RAG 用,约 300MB)
ollama pull nomic-embed-text
# 5. 试聊一句
ollama run qwen3:30b "你好,用一句话介绍你自己"关键环境变量(可选,写进 ~/.zshrc 或 launch agent):
bash
export OLLAMA_KEEP_ALIVE=30m # 模型在内存里保活时长
export OLLAMA_MAX_LOADED_MODELS=1 # 同时只加载 1 个模型,防爆内存
export OLLAMA_NUM_PARALLEL=1 # 单用户够用⚠️ 坑:48GB 内存跑 Qwen3 30B 约占 20-24GB。若同时加载多个大模型会爆内存 → 一定设
OLLAMA_MAX_LOADED_MODELS=1。
阶段 2:装 OrbStack + Open WebUI
2.1 装 OrbStack(Docker 运行时)
bash
brew install --cask orbstack
# 装完打开一次 OrbStack.app 完成初始化,它会提供 docker / docker compose 命令
docker --version
docker compose version2.2 起 Open WebUI
新建一个目录放配置:
bash
mkdir -p ~/ai-assistant/open-webui && cd ~/ai-assistant/open-webui创建 docker-compose.yml:
yaml
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
ports:
- "3000:8080"
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
# ⚠️ 容器内连宿主机 Ollama 必须用 host.docker.internal,不能用 localhost
- OLLAMA_BASE_URL=http://host.docker.internal:11434
- WEBUI_SECRET_KEY=换成你自己的随机串
- WEBUI_NAME=My Assistant
- ENABLE_SIGNUP=false
volumes:
- open-webui-data:/app/backend/data
volumes:
open-webui-data:启动:
bash
docker compose up -d
# 打开浏览器
open http://localhost:3000首次访问创建管理员账号(仅存本地)。顶部下拉应能看到 qwen3:30b,能选中聊天就说明本地链路通了。
⚠️ 坑:下拉为空 = Open WebUI 连不上 Ollama。检查 Ollama 在跑(
curl http://localhost:11434/api/version)+OLLAMA_BASE_URL用的是host.docker.internal。
阶段 3:接入云端 Claude + 知识库
3.1 加云端模型(混合的"云端"那一半)
Open WebUI 后台 → 设置 → 连接(Connections) → 添加 OpenAI 兼容连接:
- 接 Claude:填 Anthropic 的 OpenAI 兼容端点 + API key
- 或接 OpenRouter(一个 key 通所有模型,最省事)
加好后下拉菜单里就能在 qwen3:30b(本地)和 claude-*(云端)之间手动切换——这就是最朴素的"混合"。
3.2 配知识库(RAG)
后台 → 设置 → 文档(Documents):
- 嵌入模型选
nomic-embed-text(阶段 1 已拉,本地、不外流) - 上传你的笔记 / PDF
- 聊天时用
#引用文档,即可基于资料回答
阶段 4:远程访问(Tailscale)
想在外面用手机连回家里的助理:
bash
brew install --cask tailscale
# 登录后,Mac 和手机装同一个 Tailscale 账号即组成私有网之后手机浏览器访问 http://<Mac的Tailscale域名>:3000 即可,无需公网 IP、无需端口转发,流量加密。
阶段 5(可选):上 OwnPilot 补齐语音 + Telegram
仅在架构 A 用顺手、确实想要语音 + 多渠道时再做。
大致流程(细节以官方 README 为准):
bash
cd ~/ai-assistant
git clone https://github.com/ownpilot/OwnPilot.git
cd OwnPilot
# 按其文档配 .env:填 Anthropic key、指向本地 Ollama、设路由策略
docker compose up -d- 接 Telegram:去
@BotFather建 bot、拿 token 填进配置 - 配语音管线:Whisper(STT)+ TTS
- 设智能路由:简单任务走本地 Qwen3、复杂走 Claude
⚠️ 坑:
- 微信无官方个人 API,多渠道先用 Telegram
- OwnPilot 较新,配置项多,预留排错时间
- 给 Agent 放 shell/浏览器权限前,先在沙箱里 readonly 跑一段时间
部署检查清单
- [ ] 阶段 0:Mac 不会自动休眠
- [ ] 阶段 1:
ollama run qwen3:30b能正常对话 - [ ] 阶段 1:
nomic-embed-text已拉 - [ ] 阶段 2:OrbStack 装好,
docker compose version正常 - [ ] 阶段 2:
http://localhost:3000能选qwen3:30b聊天 - [ ] 阶段 3:能在本地/云端模型间切换
- [ ] 阶段 3:上传文档后能基于内容问答
- [ ] 阶段 4:手机经 Tailscale 能访问
- [ ] 阶段 5(可选):Telegram 能找到助理
资源占用预估
| 项目 | 磁盘 | 运行内存 |
|---|---|---|
| Ollama + Qwen3 30B + 嵌入模型 | ~21GB | 20-24GB(模型加载时) |
| OrbStack | ~200MB | 容器按需 |
| Open WebUI 容器 | ~1GB | ~500MB |
| 合计 | ~22GB | 峰值约 25GB |
48GB 内存:跑助理 + 日常用电脑没问题,但别同时再开一堆大内存应用。
下一步
部署遇到的真实问题、踩的坑,回流记录到这里和 05-references.md。规划阶段先看下一章别人的实践案例。