Hello! 欢迎来Regret的小站!

DSH 大肥鱼手机部署教程:在安卓手机上养一只 AI


avatar
Regret 2026-10-26 1.21k
大肥鱼部署:五个环节
从一台安卓手机到能聊天,每一环都有一票否决权

面向:想在自己手机上养一只 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(一键)

  1. 下 dsh-phone-root-*.apk(root 机)或 dsh-phone-shizuku-*.apk(非 root)
  2. 装 APK → 打开 → 粘贴 API Key
  3. 点「一键部署」→ 允许超级用户 → 等它自己装完
  4. 自动进入界面

部署过程全自动:装 Termux(bootstrap 内置)→ 配镜像 → 装 Node/DSH → 注入插件与 Key → 授予硬件权限 → 启动服务。

Root 版 agent 拿的是 root 权限,强烈建议只装在备用机。

路线 C:DSHA(本文环境)

DSHA 是带内置 Ubuntu 环境的 Android 客户端。装好后:

  1. 打开 App,点「启动 Linux」
  2. 等 Ubuntu 起来(首次会初始化,几十秒)
  3. 在里面按 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 能自动登录
  • [ ] 预算脚本生效(手动改小额度测试熔断)
  • [ ] 人设文件写好了,它说话不像客服
  • [ ] 记忆能跨会话保持(第二天问它昨天聊了啥)

参考:DeepSeek 官网、NapCat(QQ 协议端,MIT)。

暂无评论

发表评论