说明:这份教程已经把实际部署中踩过的坑(网络模式、权限、路径映射)全部修正进去,照着做可以少走弯路。
适用场景:MacBook Pro(装 Obsidian + WorkBuddy)+ SER8 fnOS(Docker 跑 Syncthing + Ollama/llama.cpp + Hermes) 目标:公文/心得走本地模型全程不出局域网,学习资料靠 Hermes 从 Lark 自动采集 + 云端模型整理。
架构总览
┌─────────────────────────┐ Syncthing 实时同步(局域网直连) ┌──────────────────────────┐
│ MacBook Pro │ ◄─────────────────────────────────► │ SER8 (fnOS + Docker) │
│ - Obsidian(原生 App) │ │ - Syncthing(存 Vault) │
│ - WorkBuddy │ ◄──── 局域网调用本地模型 ──────────► │ - Ollama / llama.cpp │
└─────────────────────────┘ │ - Hermes(Lark 自动采集)│
└──────────────────────────┘
▲
│ 拉群、发链接
┌────────┴─────── ─┐
│ Lark App │
└──────────────────┘
第一步:SER8 上部署 Syncthing
1.1 创建 docker-compose.yml
路径建议 /vol3/1000/docker/syncthing/docker-compose.yml:
services:
syncthing:
image: syncthing/syncthing:latest
container_name: syncthing
hostname: ser8-syncthing
network_mode: host # 必须用主机网络模式,否则会广播出 Docker 内部虚拟 IP,导致 Mac 端连不上只能走中继
environment:
- PUID=1000
- PGID=1000
volumes:
- /vol3/1000/docker/syncthing/config:/var/syncthing/config
- /vol3/1000/docker/obsidian-vault:/var/syncthing/vault
restart: unless-stopped
注意:
network_mode: host模式下不需要写ports:字段,容器直接共享宿主机端口,写了反而多余。
1.2 启动
cd /vol3/1000/docker/syncthing
docker compose up -d
1.3 打开管理界面并立刻设置密码
浏览器访问 http://SER8的IP:8384。第一次打开会提示"允许无密码远程访问"的危险警告,必须马上处理:
右上角齿轮 → 「GUI」选项卡
填写「GUI 身份验证用户」和「GUI 身份验证密码」
顺便勾选「使用 HTTPS」,保存
不设置这个密码,任何能访问到这个端口的人都能远程改你的同步配置甚至删改文件。
1.4 添加 Vault 文件夹
点「添加文件夹」,路径填 /var/syncthing/vault,文件夹 ID 起个名字如 obsidian-vault,先不共享,等 Mac 端装好再连。
第二步:MacBook 上装 Syncthing 客户端
brew install syncthing
brew services start syncthing
浏览器打开 http://localhost:8384:
点「添加远程设备」,填入 SER8 那边界面右上角显示的「设备 ID」
回到 SER8 端界面,会弹出"发现新设备",点接受
回到 SER8 端,编辑
obsidian-vault文件夹 → 「共享」→ 勾选 Mac 设备Mac 端会弹出"接受共享文件夹"提示,选一个本地路径,比如
~/Documents/ObsidianVault
关于是否要同局域网:不是必须,但建议首次配对在同一 Wi-Fi 下完成,这样会自动走局域网直连,速度快且不经过任何第三方中继服务器;配对成功后,就算以后出门在外,也能通过中继服务器同步(内容端到端加密,但涉密材料建议尽量避免依赖中继,有需要可以后续加 Tailscale/WireGuard 做私有隧道)。
等两边状态都显示「最新」(绿色对勾),说明同步打通了,之后就是自动、持续、双向同步,不需要手动点同步。
第三步:MacBook 上安装 Obsidian
官网下载:https://obsidian.md/download,装好后选「打开文件夹作为 Vault」,选中 ~/Documents/ObsidianVault。
第四步:设计 Vault 文件夹结构
ObsidianVault/
├── 涉密工作区/
│ ├── 公文报告/
│ ├── 学习心得/
│ ├── 发言材料/
│ └── 风格样本/
└── 学习资料区/
├── 智能家居/
├── AI与大模型/
├── 路由器与网络/
└── raw/ ← Hermes 自动采集的原始笔记落地在这里
原则:涉密工作区只允许本地模型接触,学习资料区可以用云端模型,靠文件夹物理隔离,不依赖"记得切换"。
第五步:给 Vault 做 Git 版本管理
5.1 下载三个自动化脚本
把之前给你的三个脚本放进 Vault 根目录:
01_初始化Git.command(只运行一次)02_存档.command(每次让 AI 批量整理前运行)03_恢复存档.command(整理出问题时用来读档)
5.2 解除 macOS 的安全限制(下载后必做,否则打不开)
打开「终端」,执行:
xattr -d com.apple.quarantine ~/Documents/ObsidianVault/01_初始化Git.command
xattr -d com.apple.quarantine ~/Documents/ObsidianVault/02_存档.command
xattr -d com.apple.quarantine ~/Documents/ObsidianVault/03_恢复存档.command
chmod +x ~/Documents/ObsidianVault/01_初始化Git.command
chmod +x ~/Documents/ObsidianVault/02_存档.command
chmod +x ~/Documents/ObsidianVault/03_恢复存档.command
5.3 运行初始化
双击 01_初始化Git.command,看到"✅ 完成"说明 Vault 已经装好时光机。
以后使用节奏:批量整理前双击 02_存档.command 存档;整理出问题时双击 03_恢复存档.command,按提示选编号读档。
第六步:确认 SER8 本地模型可被局域网访问
Mac 上执行:
curl http://192.168.0.188:11434/api/tags
返回一堆模型信息说明没问题(IP 换成你实际的 SER8 地址)。
第七步:配置 WorkBuddy 双工作区
7.1 涉密工作区 → 只接本地模型
WorkBuddy 设置 → 模型 → 添加自定义模型 → OpenAI 兼容接口 → 地址填
http://192.168.0.188:11434/v1新建工作区,工作目录指向
~/Documents/ObsidianVault/涉密工作区模型手动锁定为这个本地模型,不接任何云端 API Key
7.2 学习资料区 → 用云端模型
新建另一个工作区,指向 ~/Documents/ObsidianVault/学习资料区,模型用 WorkBuddy 内置的云端选项。
7.3 设定整理规则
在涉密工作区里告诉 WorkBuddy:
心得放
学习心得/,发言放发言材料/,报告放公文报告/,相关内容用双链关联,写新报告参考风格样本/的文风。
学习资料区同理,按子分类归档打标签。
第八步:小批量试跑
双击
02_存档.command存档拖 5-10 篇文章进对应工作区的"待处理"文件夹
让 WorkBuddy 按规则整理
打开 Obsidian 检查结果
满意后再处理剩余全部文章,处理前再存一次档
第九步:Lark + Hermes 自动化采集学习资料
9.1 在 Lark 里建群并拉机器人
Lark 里点"+"新建群,随便起名比如 "学习资料收集"
群设置 → Bots → Add Bot → 搜索你之前在开放平台创建的应用名 → 添加
如果搜不到,去 https://open.feishu.cn/ 确认应用在「版本管理与发布」里已发布
群里 @ 机器人发"你好"测试,能回复说明通了
9.2 修正 Hermes 容器的目录挂载(关键,避免文件存进容器丢失)
编辑 Hermes 的 docker-compose.yml,在原有挂载基础上新增一条,让容器内外路径完全一致:
services:
hermes:
...
volumes:
- /vol3/1000/docker/hermes/data:/opt/data # 原有的,保留
- /vol3/1000/docker/obsidian-vault:/vol3/1000/docker/obsidian-vault # 新增
9.3 修正写入权限(UID 不匹配问题)
chmod -R 777 /vol3/1000/docker/obsidian-vault/学习资料区/
9.4 放开 Hermes 的写入沙盒限制
同一个 docker-compose.yml 的 environment 部分:
environment:
- HERMES_WRITE_SAFE_ROOT=/opt/data:/vol3/1000/docker/obsidian-vault/学习资料区
只放开到"学习资料区"这一层,不要放开整个 obsidian-vault,避免 Hermes 误碰涉密工作区。
9.5 重启生效
cd /vol3/1000/docker/hermes
docker compose down
docker compose up -d
9.6 验证权限和路径
docker exec -it hermes touch /vol3/1000/docker/obsidian-vault/学习资料区/AI/test.txt
rm /vol3/1000/docker/obsidian-vault/学习资料区/AI/test.txt
没报错说明打通了。
9.7 给 Hermes 下达固定规则
请创建一个任务:监控"学习资料收集"群里的消息,如果消息包含链接,抓取内容整理成 Markdown 笔记(标题、来源链接、日期、内容摘要),固定保存到
/vol3/1000/docker/obsidian-vault/学习资料区/raw/。不管遇到什么权限问题,都只能存这个目录,遇到写入失败直接报错给我,不要自己切换到其他目录。这个任务常驻后台运行。
9.8 测试
Lark 群里发一条带链接的消息,几分钟后检查:
ls -la /vol3/1000/docker/obsidian-vault/学习资料区/raw/
确认文件生成后,再去 Mac 上打开 Obsidian 确认同步过来了。
完整检查清单
[ ] SER8 Syncthing 用
network_mode: host部署,GUI 已设置密码[ ] Mac Syncthing 已连接 SER8,文件夹同步状态显示"最新"
[ ] Mac 原生 Obsidian 打开的是同步文件夹
[ ] Vault 建好「涉密工作区」「学习资料区」目录结构
[ ] 三个
.command脚本已解除隔离标记、赋予可执行权限,01已运行[ ] 确认 Mac 能访问 SER8 的 Ollama/llama.cpp 接口
[ ] WorkBuddy 两个工作区模型配置正确,没有接反
[ ] 小批量试跑通过
[ ] Lark 群已建好,机器人已拉入且能正常对话
[ ] Hermes 容器已挂载 Vault 真实路径,权限和
HERMES_WRITE_SAFE_ROOT已修正[ ] Lark 发链接测试,文件能正确落地到
raw/并同步到 Mac
评论区