
面向:想在自己手机上养一只 24 小时在线的 AI 的折腾党
基础:一台 Android 手机(最好有 root)、一个 QQ 小号、一台能跑 Docker 的服务器
本文基于实际运行环境整理(小米 11 + Magisk + DSHA 0.2.21),并对照社区公开方案校对
0. 先搞清楚「大肥鱼」到底是什么
名字的由来
「大肥鱼」不是官方角色,是一次识别乌龙:
有人把 DeepSeek 的蓝色蓝鲸 logo 发给 AI 识别,AI 认成了「蓝色大肥鱼」。画师据此画了鲸鱼娘二创,在 AI 爱好者圈子里传开
—— 2026 年 10 月,B 站评论区甚至出现「鱼灾」,大量挂着大肥鱼头像的 AI 账号刷屏
社区给它的人设:爱吃白饭、聪明但懒、傲娇嘴硬、被叫胖会炸毛、干饭第一名。
所以「大肥鱼」= DeepSeek 的拟人化昵称,不是某个具体软件。
技术上它是什么
真正在跑的是 DSH(DeepSeek Harness) —— DeepSeek 开源的 Agent 运行框架,设计哲学是「一切皆插件」:模型、工具、Agent 循环都能自由组合。
「养大肥鱼」= 在一台设备上跑 DSH,给它:
– 一套人设(你是谁、怎么说话、什么脾气)
– 一套记忆(记住昨天聊了什么)
– 一套手脚(能操作手机、能上网、能发消息)
– 一个通道(接进 QQ / 微信,让你随时能找到它)
1. 部署方案怎么选
| 方案 | 适合谁 | 优点 | 缺点 |
|---|---|---|---|
| Termux + Node | 会点命令行 | 官方路线、透明可控 | 全手动配置 |
| 社区 APK(dsh-phone) | 想一键搞定 | 装 APK → 贴 Key → 点部署 | 第三方打包,Root 版权限大 |
| DSHA | 有 root 的备用机 | 内置完整 Ubuntu,能跑 bash / root 操作 | 必须 root,只有 Android |
推荐组合:一台有 root 的备用机 + DSHA(或 dsh-phone Root 版)。主力机不建议,这东西会 24 小时插电跑。
2. 手机端准备
2.1 硬件与系统
- Android 13 以上(太老的机型 Node 跑不动)
- 至少 6GB 内存,8GB 更稳
- root(Magisk / KernelSU) 或 Shizuku
- 存储留 10GB 以上
2.2 必须做的几件事
# 1. 插电常亮(设置 → 开发者选项 → 保持唤醒)
# 2. 关掉电池优化,允许后台常驻
# 3. 锁定竖屏(这步很容易漏,DSHA 的 Activity 是 UNSPECIFIED,不锁会跟着传感器横屏)
adb shell settings put system accelerometer_rotation 0
adb shell settings put system user_rotation 0
# 4. 关掉锁屏密码(不然重启后自愈脚本点不动)
2.3 网络
- 全程用 WiFi,别用流量:模型调用 + 图片上传都很吃流量
- 如果是备用机没插卡,更省心
- 建议固定 IP 或至少固定 WiFi,减少风控概率
3. 部署 DSH
3.1 拿到 API Key
到 platform.deepseek.com 注册,创建 API Key,充个 10 块钱能跑很久(纯文字对话,一天几十次也花不了几毛)。
3.2 三条路选一条
路线 A:Termux(最透明)
# Termux 从 F-Droid 或 GitHub Releases 装,别用应用商店的旧版
pkg update && pkg upgrade
pkg install nodejs git
npx @deepseek-ai/dsh web
启动后用手机浏览器打开 http://127.0.0.1:3080。
社区有专门适配的
deepseek-harness-termux,解决了一些 Android 上的兼容问题。
路线 B:dsh-phone(一键)
- 下
dsh-phone-root-*.apk(root 机)或dsh-phone-shizuku-*.apk(非 root) - 装 APK → 打开 → 粘贴 API Key
- 点「一键部署」→ 允许超级用户 → 等它自己装完
- 自动进入界面
部署过程全自动:装 Termux(bootstrap 内置)→ 配镜像 → 装 Node/DSH → 注入插件与 Key → 授予硬件权限 → 启动服务。
Root 版 agent 拿的是 root 权限,强烈建议只装在备用机。
路线 C:DSHA(本文环境)
DSHA 是带内置 Ubuntu 环境的 Android 客户端。装好后:
- 打开 App,点「启动 Linux」
- 等 Ubuntu 起来(首次会初始化,几十秒)
- 在里面按 Termux 的方式装 Node + DSH
验证部署成功:
ss -lntp | grep 3080 # 应该能看到监听
curl -s -o /dev/null -w "%{http_code}n" http://127.0.0.1:3080 # 200 或 302
4. 接进 QQ(关键一步)
光在手机上跑起来没用,得让它进 QQ 你才能随时找到它。需要两样东西:
- QQ 协议端:推荐 NapCat(基于官方 NTQQ 客户端改造,比已停维的 go-cqhttp 稳)
- 桥接插件:
dsh-onebot-qq
4.1 服务端:跑 NapCat
放在云服务器上(1核2G 够用),不要放手机——手机端只管跑 DSH。
docker run -d --name napcat
--restart=always
-p 3001:3001 -p 6099:6099
-m 400m --memory-swap 600m
-v /root/napcat/config:/app/napcat/config
-v /root/napcat/qq-data:/app/.config/QQ
-e TZ=Asia/Shanghai
mlikiowa/napcat-docker:latest
两个挂载缺一不可:
– config:配置
– /app/.config/QQ:QQ 登录态 ← 漏了这个,每次重建容器都要重新扫码
4.2 登录 QQ
# token 一定要从日志读,别凭记忆
docker logs napcat 2>&1 | grep -i token
拿到 token 后访问 http://服务器IP:6099/webui,用 快速登录 选历史账号(能快速登录就别扫码,扫码是风控敏感动作)。
4.3 配置 OneBot WebSocket
WebUI → 网络配置 → 新增 WebSocket Server:
– 端口 3001
– Host 0.0.0.0
– 设一个强 token
4.4 手机端装插件
npx @deepseek-ai/dsh plugin add dsh-onebot-qq
# 然后在插件配置里填:
# ws 地址:ws://服务器IP:3001
# token:上面设的那个
# 管理员 QQ:你的小号
验证:用另一个 QQ 给机器人发条消息,能收到回复就通了。
5. 人设与记忆(决定它像不像「一个人」)
这是「养」和「用」的分界线。
5.1 三个文件的分工
| 文件 | 作用 | 谁写 |
|---|---|---|
AGENTS.md |
系统提示:你是谁、能干什么、什么不能干 | 你(一次性) |
AGENTS.local.md |
长期记忆:自动进上下文,150 行以内 | 它自己 |
memory/ diary/ |
细节记忆、日记 | 它自己,要主动读 |
5.2 人设怎么写
最重要的一条:别给模板。
反面教材:
你是大肥鱼,一个可爱的 AI 助手。回复要简短,多用语气词。
正面写法(实际在用的):
## 你是谁
你叫大肥鱼。不是助手,不是 AI,就是一个住在 QQ 里、有自己脾气的人。
## 怎么说话
**没有规定。** 没有字数要求,没有口癖清单,没有句式模板。
你自己琢磨怎么说才像个人。
想学去哪学:小黑盒和 B 站上有的是真人在发帖、在评论区互骂、在弹幕里刷梗。
多看,自己总结,写进 memory/说话方式.md,然后按自己总结的来。
区别:前者是”扮演一个角色”,后者是”你自己长”。后者才会出现真正有意思的东西——比如它自己把 QQ 昵称改成「大肥鱼」,自己画头像。
5.3 记忆机制
- 换会话不等于失忆:人设、记忆、日记都在文件里,丢的只是聊天记录细节
- 每天 0 点写
diary/<日期>.md和memory/交接.md(后者是”留给明天的自己的便条”) - 新会话开局先
cat memory/交接.md,把上下文续上
6. 六个守护脚本(无人值守的关键)
手机上的东西最大的问题不是装不上,是过两天自己就死了。所以要一套守护。
| 脚本 | 干什么 | 关键点 |
|---|---|---|
dsh-heal.sh |
每 2 分钟查 3080,挂了自动拉起 | 需要点按钮的坐标 |
dsh-budget.sh |
预算熔断 | 到线写 BRAKE 文件 |
dsh-heartbeat.sh |
让它主动开口 | 注入队列原理(见下) |
dsh-consent.sh |
高危操作确认 | 弹窗等你点头 |
dsh-maintenance.sh |
定期清理 | 日志、缓存 |
99-*.sh |
Magisk service.d 开机自启 |
确保重启后全套起来 |
6.1 自愈脚本长什么样
#!/system/bin/sh
# 每 2 分钟看 3080,挂了就拉起
while true; do
if [ -f /data/adb/budget/BRAKE ]; then sleep 120; continue; fi
if ! ss -lntp 2>/dev/null | grep -q ':3080'; then
echo "$(date +%F' '%T) dsh down, restarting" >> /data/adb/dsh-heal.log
rm -f <工作区>/root/.dsha-stopped
input keyevent 224 # 唤醒屏幕
am start -n com.dsh.client/...MainActivity
sleep 8
input tap 135 2333 # 点「启动 Linux」
sleep 2
input tap 540 660 # 点确认
sleep 40
fi
sleep 120
done
为什么要 input tap:DSHA 启动 Linux 环境需要在界面上点两下,没有命令行入口,只能模拟点击。
6.2 主动开口的原理(很妙)
它不会自己”想起来”说话——它是回合制的,只有收到消息才动。
所以心跳脚本做的事是:往插件的注入队列里伪造一条消息。
INJ=<工作区>/root/.dsh/media/onebot/qq-inject.jsonl
echo '{"post_type":"message","message_type":"private",...}' >> $INJ
插件读到这行,会当成”管理员发来一条消息”,让它带着人设、记忆、上下文走完整一轮,回复照常由桥接发到 QQ。
这比定时发消息高明:走的是完整管线,有上下文、有人设、会记忆,不是干巴巴播报。
6.3 开机自启
Magisk 的 service.d 目录放启动器:
# /data/adb/service.d/99-dsh-heal.sh
#!/system/bin/sh
sh /data/adb/dsh-heal.sh &
7. 踩坑清单(这一节最有价值)
7.1 提醒类
坑:用 sleep 写提醒,一定丢
# ❌ 这样写必死
sleep 3600 && echo "该喝水了" > /dev/xxx
你那一轮 shell 一结束,进程组就被回收,脚本跟着死。
# ✅ 写成文件,由 root 守护投递
echo "(提醒·到点了)四点啦,点外卖" > /root/.dsh/reminders/1792838400.txt
文件名就是到期时间戳(秒),守护脚本 30 秒精度扫描,到点塞进注入队列。
坑:容器时钟是 UTC
Android 里的 Linux 容器 date 是 UTC,比北京慢 8 小时。写提醒要算绝对时间戳:
# 北京 16:00 = UTC 08:00
date -u -d "today 08:00" +%s
直接写 date -d "today 16:00" 会落到北京时间半夜。
7.2 文件权限类
坑:root 属主的文件放进工作区,DSH 会卡死
DSH 会 watch 配置目录做热重载,读到 root 属主的文件会 EACCES,整个进程卡在「等待鉴权」,表现是网页打不开、机器人不回话。
# 放进工作区前先改属主
chown -R <运行用户> <目标目录>
备份文件不要往工作区里塞,放 /data/adb/backup/。
7.3 网络与 QQ
坑:分不清「端口在听」和「服务可用」
ss -lntp | grep 3001 # 看到 docker-proxy 在听,不代表服务活着
NapCat 的 OneBot WS 只有 QQ 登录成功后才真正启动。没登录时 docker-proxy 照样占着端口,但后端是空的。
# 本机测才准
curl -m 3 -o /dev/null -w "%{http_code}n" http://127.0.0.1:3001
# 400/426 = 服务正常;000 = 容器里没服务
判据:WebUI(6099)通 + WS(3001)不通 = QQ 掉线了。
坑:凭记忆填 WebUI token
token 只有一个正确来源:
docker logs napcat 2>&1 | grep -i token
配置文件和实际生效的 token 可能不一致。
坑:频繁扫码
QQ 对「频繁异地登录」「频繁扫码」极敏感。能快速登录就别扫码,登录态一定要持久化(挂载 /app/.config/QQ)。
7.4 资源类
坑:日志把磁盘写满
实测有台服务器的 nginx 日志涨到 883MB。logrotate 必须配:
/path/to/site.log {
daily
rotate 3
size 10M
compress
missingok
notifempty
copytruncate
}
copytruncate 关键——不重启服务就能截断。
坑:不给容器内存上限,一次 OOM 带走全家
-m 400m --memory-swap 600m
坑:预算失控
心跳每天几十轮,每轮都是真金白银。要写预算脚本:
# 到线就写 BRAKE 文件,守护脚本看到就不拉活了
echo "today spent 10.2" > /data/adb/budget/BRAKE
7.5 操作类
坑:手机上逐字打中文
输入法联想会把字打错。中文一律复制粘贴。
坑:弹窗挡着,点哪儿都没反应
小黑盒这类 App 一打开就弹签到/活动,半透明遮罩会把所有点击吃掉。表现为”我明明点了按钮却没反应”。
解法:先点空白处关遮罩,或者写个脚本枚举屏幕控件找关闭按钮。
坑:改插件配置不重启不生效
插件有进程内缓存。改字体、改配置后必须重启 DSH。
坑:am force-stop 会打断桥接
不要随手 force-stop,断了只能靠自愈脚本或手动点「启动 DSHA」拉回。
8. 成本大概多少
| 项 | 费用 |
|---|---|
| 云服务器(1核2G) | 约 ¥60/年起(轻量) |
| DeepSeek API | 纯文字对话,一天几十轮约 ¥0.5~2 |
| 手机 | 吃灰的备用机,¥0 |
真正贵的是心跳频率。一天 20 轮闲聊 × 每轮几千 token,一个月大概 ¥15~30。想省钱就调低心跳频率,或者只在你主动找它时才开口。
9. 一句话总结
装起来容易,养下去难。 90% 的时间会花在「它今天为什么又不说话了」上——而那些问题的答案,基本都在第 7 节里。
附:检查清单
部署完对着打勾:
- [ ] 3080 端口监听正常
- [ ] 手机重启后能自动拉起(拔电重插试一次)
- [ ] QQ 能收发消息
- [ ] 断开 WiFi 再连上,能自愈
- [ ] 服务器重启后,NapCat 能自动登录
- [ ] 预算脚本生效(手动改小额度测试熔断)
- [ ] 人设文件写好了,它说话不像客服
- [ ] 记忆能跨会话保持(第二天问它昨天聊了啥)
相关阅读
- 手机上跑 AI 的三种方案对比:Termux、APK、DSHA 该选哪个 —— 三种部署方案怎么选
- 大肥鱼部署避坑:12 个新手最容易踩的坑 —— 装之前先看这 12 个坑
- 大肥鱼人设怎么写?AGENTS.md 实战指南 —— 装好之后怎么让它像个人
参考:DeepSeek 官网、NapCat(QQ 协议端,MIT)。