本文作者:鱼总聊AI(@AI_Jasonyu)。版权归作者所有,未经授权禁止转载。
我最近把家里的设备重新捋了一遍:MacBook、Mac mini、iPhone,三台设备彻底打通。
为什么要折腾这个?很简单——我想出门的时候,不用随身背笔记本,也能随时随地调用我的知识库去写内容、写代码。
以前我只有两个选择:要么笔记本走哪带哪,要么让笔记本在家里 24 小时开着不敢合盖。现在这套方案跑通之后,我的状态变成了:
- 家里的 Mac mini 当“主脑”,24 小时常开,跑着 Hermes,接着微信
- MacBook 是“操作端”,写代码、深度改稿用它,合盖就走
- iPhone 是“遥控器”,人在外面,发条微信就能让家里的 AI 干活,需要时还能直接 SSH 进电脑敲命令
- 所有笔记、知识库内容,在两台 Mac 之间自动同步,改哪边都一样
整套方案用到的核心工具就三个:Syncthing(同步知识库)+ Tailscale(跨网络组网)+ SSH(远程控制),全部免费。
这篇文章我会把完整的配置过程写出来,包括我踩过的每一个坑。步骤会写得很细,新手照着做就能跑通。
一、先看全貌:这套系统长什么样
动手之前,先花一分钟搞清楚我们要搭的东西是什么结构,不然做到一半容易迷失。
┌─────────────────┐
│ iPhone │
│ 微信 / 飞书/TG │
│ Termius(SSH) │
│ UU远程(备选) │
│ Tailscale App │
└────────┬────────┘
│ Tailscale (100.x.x.x)
┌──────────────┼──────────────┐
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ Mac mini(主脑) │ │ MacBook(操作端)│
│ · Hermes+Gateway│ │ · 本地开发/创作 │
│ · 微信(唯一) │ │ · Obsidian │
│ · 飞书/TG 可选 │ │ · 飞书/TG 另 Bot│
│ · Codex/ChatGPT │ │ · 需要时 SSH 到 │
│ · Obsidian │◄─Syncthing─►│ Mini │
│ · 不休眠+自启 │ └─────────────────┘
└─────────────────┘三台设备的分工,务必记住:
| 设备 | 角色 | 主要做什么 |
| --- | --- | --- |
| **Mac mini** | 主脑 | 跑 Hermes、微信入口、知识库服务、远程执行任务 |
| **MacBook** | 操作端 | 写代码、深度改稿、本地调试 |
| **iPhone** | 遥控器 | 下指令、看结果、SSH、轻量补充 |要达成这个状态,一共要做成 五件事:
- 用 Syncthing 让两台 Mac 的 Obsidian 知识库自动同步
- 让 Mac mini 常开不休眠,当 24 小时在线的主脑
- 用 Tailscale 把三台设备组成一个虚拟局域网(重点处理和国内代理的共存问题)
- 打开 SSH,让手机用 Termius 随时连进两台 Mac
- 在 Mac mini 上装 Hermes,接上微信,实现“发微信 = 下指令”
下面一件一件来。
开工前的准备清单
硬件:
- MacBook(已有你的开发环境和知识库)
- Mac mini(建议插电常开)
- iPhone
软件:
| 软件 | 用途 | 装在哪 |
| --- | --- | --- |
| Syncthing | Obsidian 同步 | 两台 Mac |
| Tailscale | 跨网络组网 | 两台 Mac + iPhone |
| Termius | 手机 SSH | iPhone |
| Hermes Agent | 常驻 AI Agent | 以 Mac mini 为主 |
| Obsidian | 知识库 | 两台 Mac |
| Clash Verge / Surge | 电脑代理 | 两台 Mac |
| 小火箭 Shadowrocket | 手机代理 | iPhone |
| ChatGPT / Codex 桌面端 | 编程与对话 | 建议 mini 也装 |账号原则(先记住,后面会用到):
- Tailscale:同一个账号登录所有设备
- 微信:只给 Mac mini 上的 Hermes,别两台电脑抢
- 飞书 / Telegram:需要多入口时,不同机器用不同的 Bot
二、第一件事:用 Syncthing 同步 Obsidian 知识库
为什么先做这一步
后面 Hermes 要读知识库、你要在两台电脑之间无缝写笔记,全都依赖这一步。
先说一个重要结论:代码项目不要用 Syncthing 当主同步方式,代码后面单独走 Git。Syncthing 只负责知识库。
步骤 1:两台 Mac 都装上 Syncthing
官网下载或者 Homebrew 安装都行。装好启动后,浏览器打开本机管理界面,地址一般是:
http://127.0.0.1:8384进去之后先把设备名改成好认的,比如我的两台分别叫:
- MacBook-Jason
- Mac-mini-Jason
步骤 2:让两台电脑互相认识(建立设备互信)
Syncthing 认设备靠的是一串 Device ID。流程是:一台复制自己的 ID,另一台添加它。
先在 MacBook 上,点右上角「操作」菜单,找到「显示 ID」:

弹出来的窗口里有一串设备标识和二维码,点「复制」把 ID 复制下来:

然后到 Mac mini 的 Syncthing 界面,点「添加远程设备」:

把刚才复制的 Device ID 粘进去,起个设备名,保存:

这时候另一台电脑会弹出一个「新设备」的连接请求,点「添加设备」接受:

确认设备信息,保存:

两边状态都变成 「已连接」,这一步就成了。
步骤 3:共享知识库文件夹
设备连上了,但文件还不会自动传——共享文件夹是另外一步,这是我踩的第一个坑,后面细说。
先在 MacBook(有完整知识库的那台) 上操作。
如果你不知道 Obsidian 库在哪,有个小技巧:在 Obsidian 里对着库名右键 →「复制路径」,直接拿到完整路径:

然后在 Syncthing 界面点「添加文件夹」:

在弹出的设置窗口里:
- 文件夹路径:粘贴刚才复制的 Obsidian Vault 路径
- 文件夹标签:起个名字,比如 Obsidian-Vault
- 切到「共享」标签页,勾选 Mac-mini-Jason
- 同步类型选 发送并接收(Send & Receive)

如果文件夹已经建过、只是没共享,就点文件夹的「编辑」,在共享页勾选目标设备再保存:

保存之后,Mac mini 那边会弹出共享邀请,点「共享」接受:

接受时选一个本地存放路径(建议单独目录,路径尽量简单),同步类型同样设为「发送并接收」:

搞定之后就能看到同步进度开始跑了:

第一次同步大库可能比较慢,要等索引和传输跑完,不要中途反复开关。
踩坑 1:设备「已连接」,文件夹却一直「非共享」
这是我遇到的第一个坑,症状长这样:
- 设备显示「已连接」甚至「已连接(未使用)」
- 文件夹状态是「非共享」
- 上传/下载长期停在 0 B 或 1 B
- Mac mini 上看不到 MacBook 的库内容
原因: 设备互信成功,只说明两台机器能看见对方。文件夹共享是另一步——必须一端 Share、另一端 Accept,还要选好本地路径。只加了设备、没走完文件夹共享流程,就会出现这种「连上了但不传文件」的状态。
处理:
- 回到有完整内容的那台(通常是 MacBook),打开该文件夹设置
- 确认「共享」里勾选了目标设备
- 同步模式确认是「发送并接收」
- 到 Mac mini 重新接受共享、指定本地目录
- 刷新两边界面,文件夹不再是「非共享」、开始出现同步进度,才算真的通了
一句话记住:「设备已连接」不等于「文件夹在同步」。
建议顺手做的两个设置
第一,加 <strong>.stignore</strong> 忽略无用文件,比如:
- .DS_Store
- 过大的附件缓存(按你的库结构定)
第二,给 AI 单独建一个子目录,别一上来就把整个私人库无限权限交给 Hermes:
Vault/
└── Hermes-Knowledge/
├── MEMORY.md
├── USER.md
├── Projects/
└── Daily/之后 Hermes 只指向 Hermes-Knowledge/ 这个目录。
重要提醒:Syncthing 是同步,不是备份。 一边删了文件,另一边也会跟着删。至少再加个 Time Machine,或者定期把库拷一份到硬盘/网盘。
三、第二件事:让 Mac mini 常开不休眠
Mac mini 是主脑,它一睡着,整套系统就瘫了。所以要把休眠彻底关掉。
打开终端,执行:
sudo pmset -a sleep 0
sudo pmset -a disablesleep 1再补一个后台 caffeinate 保险:
nohup caffeinate -dims >/dev/null 2>&1 &实际执行起来长这样:

这样 Mac mini 就会一直醒着,随时待命。
四、第三件事:Tailscale 组网(国内用户重点看代理共存)
Syncthing 解决了“同一个局域网里同步”,但你出门之后,手机和家里的 Mac mini 就不在一个网络里了。这时候就需要 Tailscale——它能把你所有设备组成一个虚拟局域网,不管设备在哪,都能像在家里一样互相访问。
步骤 1:两台 Mac 安装 Tailscale
官网下载安装包,一路继续:

安装过程中会弹出“Tailscale 想添加 VPN 配置”的系统提示,点「允许」:
接着是权限授予页面,点「Grant permissions」:

系统会跳到「登录项与扩展」设置,把 Tailscale 的网络扩展开关打开,点完成:

两台 Mac 都装好后,用同一个账号登录。然后在终端执行:
tailscale status确认两台设备都在列表里,并记下各自的 IP,比如我的:
- Mac mini:100.106.195.45
- MacBook:100.112.98.107
- iPhone:之后配置好也会出现一条 100.x.x.x
你也可以在 Tailscale 的管理后台网页看到所有设备和在线状态:

步骤 2:处理代理共存(国内用户必做,不做等于白装)
这是整套流程里最容易翻车的地方。
国内常见的 Clash / Surge 开 TUN 模式后,会接管全局路由。而 Tailscale 用的是 100.64.0.0/10 这个网段。如果不把这个网段排除出代理,就会出现一个非常迷惑的状态:
- Tailscale 显示在线 ✅
- 实际 ping 100.x.x.x 全部失败 ❌
- SSH 一直超时 ❌
看着在线,实际不通——因为流量被代理拐走了。
处理办法(Clash Verge / Mihomo 为例): 打开配置文件编辑:

在规则里加一条直连:
rules:
- IP-CIDR,100.64.0.0/10,DIRECT,no-resolve在 TUN 配置里加排除网段:
tun:
enable: true
stack: system
auto-route: true
auto-detect-interface: true
route-exclude-address:
- 100.64.0.0/10保存后重载配置,再 ping 对端的 Tailscale IP 测试。
用 Surge 的同理:在规则 / TUN 旁路里让 100.64.0.0/10 直连,不要进代理链。
踩坑 2:Clash 配置一保存就「订阅配置校验失败」
我改配置的时候还遇到过一保存就报错的情况,提示类似 payloadRule、某条 IP-CIDR6 不合法。
原因: 当前内核对某些 IPv6 写法不兼容,或者规则格式不严谨(缺 no-resolve、网段写错、缩进问题)。
处理:
- 先删掉有问题的 IPv6 相关行
- 只保留明确可用的这一条:- IP-CIDR,100.64.0.0/10,DIRECT,no-resolve
- TUN 的 route-exclude-address 也只先放这一段
- 保存成功后再逐步加别的规则,一次别改太多,不然出错都不知道是哪行的问题
踩坑 3:Tailscale DNS 和代理 DNS 打架
如果排除了网段之后还是时好时坏、部分域名解析异常、浏览器“什么都访问不了”,多半是 Tailscale 默认接管了 DNS(MagicDNS),和 Clash/Surge 的 DNS 方案叠在一起打架了。
在每台 Mac 上执行:
sudo tailscale set --accept-dns=false或者在 Tailscale Settings 里把「Use Tailscale DNS settings」取消勾选:

然后重新测试普通上网、tailscale status 和 ping。不是每个人都必须关,但在国内代理环境下,这是高频有效的手段。
五、第四件事:iPhone 上的 Tailscale(重点踩坑区)
手机这块的坑最多,我直接把结论和过程都告诉你。
核心限制:iOS 上 VPN 只能活一个
iOS 对 Network Extension 类 VPN 的限制很严,同一时间基本只能有一个真正生效。所以:
- 开官方 Tailscale → 小火箭被挤掉
- 开小火箭 → 官方 Tailscale 断线
远程和翻墙,没法同时稳住。
踩坑 4:小火箭内置 Tailscale,看着在线,实际不通
我试过一条“聪明”路线:不装官方 App,用小火箭自带的 Tailscale 功能 + Auth Key(在 Tailscale 后台 Settings → Keys → Auth keys 创建)登录,想着这样翻墙和组网就能共存了。
实际结果:
- 管理后台和 tailscale status 里确实出现了名为 node 的 iOS 设备,显示在线
- 但 Mac mini 去 ping 这个地址,全部 timeout
- Termius SSH 直接 Connection timed out
原因: 控制面(设备注册)成功,不代表数据面(真实发包)通。小火箭的内置实现和官方客户端在打洞/中继上有差异,国内网络下更容易出现「看着在、连不上」。
结论记住这句:列表“在线” ≠ 真的能通。以 ping 通、SSH 能进为准,不以设备列表好看为准。
目前最稳的用法:接受切换,不硬双开
| 场景 | 操作 |
| --- | --- |
| 要 SSH / 远程管电脑 | 打开**官方 Tailscale**,关闭小火箭 |
| 日常上网翻墙 | 打开**小火箭**,关闭官方 Tailscale |听起来不优雅,但接受「用哪个开哪个」这一次切换,成功率远高于折腾双开。别信“完美并行”的说法,至少目前的 iOS 上不现实。
怎么确认手机真的进组了
在 Mac mini 上执行:
tailscale status- 看是否有 iOS 设备 online
- 旧的 offline, last seen 2h ago 设备名可以忽略(那是以前的残留节点)
- 最终以能 ping 通、能 SSH 为准
六、第五件事:打开 SSH,让手机连上两台 Mac
组网通了,接下来让手机真正“遥控”电脑。
先说清楚 SSH 是干嘛的:安全的远程命令行控制。适合看日志、重启 Hermes、跑命令、改配置;它不是“远程桌面”,手机上是敲命令,不是拿鼠标点屏幕。
步骤 1:在 Mac 上打开远程登录
每台要被远程的 Mac 都做一遍:
- 系统设置 → 通用 → 共享
- 打开 远程登录
- 「允许访问」里加入你的用户
验证一下:
sudo systemsetup -getremotelogin
# 期望输出:Remote Login: On我当时 Mac mini 一直连不上,查了半天,就是因为远程登录压根没开(踩坑 5:Connection refused 基本都是这个原因)。
步骤 2:确认真实用户名(踩坑 6)
这个坑很阴间:macOS「用户与群组」里显示的是全名/显示名(比如 Orange),但 SSH 用的是短用户名(常见是小写,比如 orange)。按显示名硬填,密码怎么输都是错。
终端执行:
whoami这条命令的输出,才是 SSH 该填的用户名。
步骤 3:先在本机测 SSH 通不通
远程之前,先证明本机 SSH 服务是好的。在 Mac mini 上:
ssh orange@127.0.0.1首次出现指纹提示,输入 yes。
踩坑 7:本机都连不上,报 <strong>Broken pipe</strong>。 这说明 sshd 服务状态异常,重载一下:
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist再测,直到本机能登进 shell。记住排查原则:本机都挂,先修服务,别先怀疑手机端。
步骤 4:手机 Termius 添加主机
- 打开 Termius → New Host
- 填写:
| 字段 | 示例 |
| --- | --- |
| Label | `Mac Mini` |
| IP / Hostname | `100.106.195.45`(Mini 的 Tailscale IP) |
| Port | `22` |
| Username | `orange`(以 `whoami` 输出为准) |
| Password | Mac 登录密码 |- 保存并连接,首次信任 host key
同样的方法再加一条 MacBook(前提是 MacBook 上也开了远程登录)。
进阶:改用密钥登录(踩坑 8 在这)
先用用户名 + 密码跑通最省事。如果密码方式总失败,再上密钥:
- Termius 里 Generate Key(推荐 Ed25519)
- 复制公钥——就是 ssh-ed25519 AAAA... 开头的那一整行
- 在 Mac 上:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
# 粘贴公钥一整行
chmod 600 ~/.ssh/authorized_keysnano 保存方法:Ctrl+O → 回车 → Ctrl+X。如果底部在问 File Name to write,直接回车确认。
踩坑 8:把脚本碎片当成了公钥。 Termius 的 Export Key 页面有一堆自动安装脚本的参数,我一开始把那玩意粘进 authorized_keys 了,结果里面出现 Generated By Termius 之类的奇怪内容,登录必然失败。记住:公钥必须是以 <strong>ssh-ed25519</strong> 或 <strong>ssh-rsa</strong> 开头的一整行,别的都不是。
SSH 报错速查
| 报错 | 优先检查 |
| --- | --- |
| Connection refused | 远程登录没开 |
| Connection timed out | 代理没排除 Tailscale 网段;手机是否真在组网里(用官方 App) |
| Permission denied | 用户名(`whoami`)或密码错误 |
| 本机 127.0.0.1 也失败 | 先重载 `ssh.plist` 修本机 sshd |七、第六件事:Mac mini 装 Hermes,接上微信
到这一步,基础设施全通了。最后把“大脑”装上。
安装和账号(踩坑 9 预警)
按官方方式安装(Desktop 或 install.sh)。安装过程中如果出现 Nous Portal 套餐选择($0 / $20 / $200),注意:
- 这是模型与工具的订阅,不是“装成同一个 Agent”
- 选 $0 可以,但可能仍要求绑卡(防滥用,海外 SaaS 常见操作);不想绑卡可以改走 OpenRouter / DeepSeek 等 API Key 路线
踩坑 9:我一开始以为“同一个 Google 账号登录 = 同一个 Agent”,两边记忆自动打通。错。
| 内容 | 是否自动共享 |
| --- | --- |
| Portal 订阅额度 | ✅ 是 |
| 本地记忆 / 会话 | ❌ 否(都在各自机器的 `~/.hermes/` 里) |
| Obsidian 知识库 | ❌ 否(要靠 Syncthing / Git 自己解决) |登录同一个账号,只共享额度和计费,不会合并两台机器的本地状态。所以正确姿势是:以 Mac mini 为主实例,用 Obsidian + Syncthing 做跨设备的“外置记忆”——这正是我们第一步就做好知识库同步的原因。重要偏好、项目状态,写进 MEMORY.md / USER.md,两边都能读到。
主模型怎么选
| 场景 | 建议 |
| --- | --- |
| Mini 上常驻、微信高频调用 | DeepSeek 这类低成本模型 |
| 难任务、重要决策 | 临时切 Claude Sonnet 等 |
| 重编程 | 继续用 Codex,不必强行让 Hermes 包办 |接微信 / 飞书 / TG 的关键规则(踩坑 10、11)
这里有一条铁律:
| 平台 | 规则 |
| --- | --- |
| **个人微信** | 一个微信号对应一套 token,**同一时间只能被一个 Gateway 使用** |
| **飞书** | 可以创建多个应用,但**同一个 App ID 同时只能一个 Gateway** |
| **Telegram** | 可以创建多个 Bot,每个 Token 同时只能一个轮询方 |踩坑 10:我在两台电脑都起了微信 Gateway,第二台直接启动失败,日志提示已有 Gateway 正在使用该 token。个人微信的凭证同一时间只能被一个实例占用,两台机器抢必冲突。
踩坑 11:飞书/TG 同理,同一个 App ID 或 Bot Token 挂两个实例,第二个起不来。多机器 = 多个 Bot / 多个应用,不要共享凭证。
推荐落地方案:
- 微信:只接 Mac mini(这是手机的主入口)
- MacBook 如果也需要消息入口:用另一个飞书应用或另一个 TG Bot
- 社区的多微信号插件,那是“多个不同微信号”,不是“一个微信号挂多个 Agent”,别搞混
保持常驻 + 安全建议
- 按 Hermes 文档把 gateway 装成 launchd 服务,保证重启后微信入口还活着
- 微信 DM 策略用 allowlist,只放行你自己——别让陌生人也能指挥你家的 AI
- chmod 600 ~/.hermes/.env,保护好密钥文件
- 工具权限、可写目录尽量收窄到 Hermes-Knowledge/ 和指定项目目录
顺手把 ChatGPT / Codex 桌面端也装上
- Mini 上可以登录同一个 Codex 账号(官方支持多设备)
- 主要注意的是额度共享,不是“换个设备就封号”
- 合理用法:Mini 当 always-on 主机,MacBook 需要时再连
八、代码项目怎么办:用 Git,别用 Syncthing
结论先行:代码要同步到 Mini,但走 Git,不要用 Syncthing 当代码主同步。
原因很实在:
- 两边同时改,Syncthing 极易冲突
- node_modules、构建产物又大又脏,同步纯属浪费
- 没有提交历史,出问题没法回滚
推荐流程:
- 代码放 GitHub / GitLab 私有库
- Mac mini 上:
git clone <repo>
cd <project>
# npm install / pnpm i / pip install ...- Mini 上改完 → commit → push;MacBook → pull。反过来也一样
环境注意:
- Mini 上装和 MacBook 接近的 Node / Python 版本
- .env 各机单独配置,不进 Git、不强行同步
- 不用全搬,只把「经常要远程改、要让 Hermes 碰」的项目先弄过去
远程写代码的姿势:
- 人在家:MacBook 本地写,或 Remote SSH 到 Mini
- 人在外:手机发指令,让 Mini 上的 Hermes / Codex 执行
九、日常工作流:这套系统怎么用起来
配置完不是终点,说说我现在的实际用法。
写代码:
- 复杂功能:MacBook 本地写,或 Remote 到 Mini
- 小改动、跑脚本、查日志:微信发给 Mini 上的 Hermes 就行
- 源码真相永远在 Git
知识库:
- 正式内容只进 Obsidian
- 路上有灵感,微信丢给 Hermes,让它写入指定文件夹
- 手机负责补充和查看,回电脑再系统整理
自媒体创作:
- 微信/飞书随手丢链接、截图、一句话灵感
- Hermes 按模板生成初稿,写进知识库
- 回到任意一台 Mac,在 Obsidian 里改(反正是同步的)
- 成品归档,方便后续改写成多平台版本
十、故障排查:固定这个顺序,别盲改
远程突然挂了,别上来就重装软件、乱改配置。按这个顺序查,多数故障前三步就能定位:

配一张症状速查表,建议存进笔记:
| 症状 | 最先查什么 |
| --- | --- |
| Syncthing 不传文件 | 文件夹是否完成 Share / Accept |
| Tailscale 在线但 SSH 超时 | 代理是否排除 `100.64.0.0/10`;手机是否用官方 App |
| 小火箭与 Tailscale 互踢 | iOS VPN 互斥,接受场景切换 |
| Connection refused | 远程登录是否打开 |
| 密码总是错 | 用户名是否是 `whoami` 的输出 |
| 本机 SSH 也失败 | 重载 `ssh.plist` |
| 微信第二台挂不上 | 是否重复占用同一个 token |
| 两边 Hermes 记忆不通 | Portal 账号不合并本地 Agent,靠知识库同步 |十一、上线检查清单(复制到笔记里逐项打勾)
同步
- 两台 Mac 的 Syncthing 互为「已连接」
- Vault 为发送并接收,两边内容一致
- .stignore 已配置
- 有独立备份(Time Machine 或其他)
网络
- Tailscale 三端同一账号登录
- 记录了各设备的 100.x IP
- 电脑代理已排除 100.64.0.0/10
- 能 ping 通对端
SSH
- 两台 Mac 远程登录已打开
- 本机 ssh 用户@127.0.0.1 成功
- Termius 能连上 Mini 和 MacBook
Agent
- Mini 上 Hermes 可正常对话
- Gateway 已设为开机自启
- 微信只接 Mini,且开了 allowlist
- 飞书/TG 无 token 冲突
- 知识库路径指向同步目录
- Mini 防休眠已设置
代码(如需要)
- 主要项目已在 Git
- Mini 已 clone 并能跑起来
- 密钥没进仓库
最后
整套方案一句话总结:
用 Syncthing 同步知识库,用 Tailscale 组网,用 SSH 当手机遥控器,用 Mac mini 跑唯一的微信 Hermes;代码走 Git,代理给 Tailscale 让路,iOS 上接受「远程时切官方 Tailscale」。
配置一个晚上,之后出门只带手机:发条微信让家里的 AI 查资料写初稿,需要动手就 Termius 连上去敲两行命令,回家打开 MacBook,所有内容已经同步好等着你。
然后保险起见的话,还可以给每个设备安装一个UU远程,这样更加保险,使用起来更加便利。
这就是目前我这套多设备 AI 工作台里,相对可复现、也相对稳的做法。踩过的坑都写在上面了,照着做,你会比我顺利得多。