Skip to content

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 version

2.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 + 嵌入模型~21GB20-24GB(模型加载时)
OrbStack~200MB容器按需
Open WebUI 容器~1GB~500MB
合计~22GB峰值约 25GB

48GB 内存:跑助理 + 日常用电脑没问题,但别同时再开一堆大内存应用。


下一步

部署遇到的真实问题、踩的坑,回流记录到这里和 05-references.md。规划阶段先看下一章别人的实践案例。

私人 AI 助理部署方法论 · 部署于 Cloudflare Pages