低成本"养虾"之使用安卓旧手机部署

前言

最近 OpenClaw[1] 的热度很高,作为一个开源的 AI 私人助手,它能在本地运行、对接各种 IM 平台(飞书、钉钉、QQ 等),全天候帮你处理消息、管理任务。社区里大家把部署 OpenClaw 戏称为“养虾”——因为它的 logo 是只🦞。

“养虾”需要一台 24 小时运行的服务器,且听说对于内存的要求比较大,所以要部署搞不好还得去开个单独的云服务器。不过正好家里有一台闲置的红米 Note4X(骁龙 625、3GB 内存、4100mAh 电池),一直在吃灰。后来在 B 站上看到有人用PostmarketOS把旧安卓手机刷成了 Linux 服务器 [2],骁龙 625 又恰好是 PostmarketOS 支持较好的芯片平台之一,于是我决定试试在这台旧手机上跑 Docker 来部署 OpenClaw。

TLDR

最终成功在红米 Note4X 上通过 PostmarketOS + Docker 部署了OpenClaw-Docker-CN-IM[3] 服务。日常通过飞书等 IM 平台与 OpenClaw 交互,如果需要在外网访问管理界面可以额外配置 Tailscale。整个过程主要踩了这几个坑:

  1. fastboot 版本不兼容,刷写 userdata 分区时报错 std::bad_alloc
  2. Docker 的 containerd 可执行文件路径与 systemd 配置不匹配,导致 Docker 无法启动
  3. 需要给 Docker 配置网络代理才能正常拉取镜像
  4. OpenClaw Gateway 在非本地回环地址访问时需要配置 allowedOrigins

image.png

拔剑四顾心茫然

在还没有进入技术细节部分之前,我不得不说一些扫兴的话。尽管我通过上述方案成功地在内网手机上部署了一个 OpenClaw 服务,但最大的问题就是——找不到使用它的需求。目前(2026-03)这一波“龙虾”热有点过头了,大家都是处于拿着锤子找钉子的状态,并非真正有需求才去使用它,而是一方面觉得它是阿拉丁神灯,一方面觉得不用可能会落后于时代。

OpenClaw 作为一个产品来说,现阶段仍处于很早期的阶段,有很多不完善的地方(比如安全性和产品易用性),最重要的是目前基于 Skills + 记忆机制,实际上就是把工作流(可固化为一套 SOP 的工作流程)转换成了一大段 AI 提示词。好处就是工作流复用门槛变得很低了,不再需要使用编程或者低代码方式进行固化,代价自然就是 token 数量暴增。而我习惯把工作流放到 n8n 这类低代码平台上面进行实现,好处就是基于低代码节点执行逻辑需要的 token 就很少了。

总之,除非你对于 token 的花费完全不在意且极其不喜欢借助编程和低代码的方式来搭建工作流,不然现阶段我不是很推荐使用 OpenClaw😅。

刷入 PostmarketOS

什么是 PostmarketOS

PostmarketOS[4] 是一个基于 Alpine Linux 的移动端 Linux 发行版,目标是为旧手机提供长期维护的 Linux 系统。红米 Note4X 所用的骁龙 625(MSM8953)是其支持较好的芯片平台之一,WiFi、触屏、USB、蓝牙、音频等基础功能都能正常工作。刷入之后手机就变成了一台完整的 aarch64 Linux 设备,可以 SSH 连接、跑 Docker,甚至装桌面环境。

准备工作

主要参考了 B 站上的两个教程视频 [2:1][5],整体流程大致如下:

  1. 解 BL 锁:红米 Note4X 需要先用小米官方的解锁工具解 Bootloader 锁
  2. 下载 PostmarketOS 镜像:从清华镜像站 [6] 下载预编译的镜像,选择 qcom-msm8953 通用设备
  3. 准备 fastboot 工具:下载 Android Platform Tools,用 fastboot 把镜像刷入手机各分区

详细刷机步骤可以参考上面这个视频,其中包含怎么开启 SSH。

而这个视频后面讲了很多有关 linux 服务器实用工具的安装,也推荐看看。

IMG_20260313_171602.jpg

其中 1 和 2 都比较顺利,坑出在了第 3 步。

fastboot 的“版本陷阱”

按照教程,进入手机的 fastboot 模式后,用 fastboot 把镜像依次刷入各个分区。前面的 bootsystem 分区都刷得很顺利,结果刷 userdata 分区的时候报错了:

1
libc++abi: terminating due to uncaught exception of type std::bad_alloc: std::bad_alloc

一开始以为是镜像文件损坏,重新下载了一遍,还是同样的报错。又怀疑是电脑内存不足,关了一堆程序释放内存,问题依旧。

后来搜了一圈才发现,问题根源是fastboot 工具版本与手机不兼容。通过 fastboot getvar all 查询手机信息:

1
2
3
version: 0.5
product: mido
max-download-size: 0x20000000

红米 Note4X 的 fastboot 协议版本是0.5(安卓 7/8 时代的老协议),而我用的是最新版 Platform Tools(适配协议 2.0)。新版工具在处理大容量 userdata 分区(约 24GB)时会出现内存分配异常。

解决方案:下载旧版 Platform Tools 28.0.0,这个版本兼容 0.5 协议。换了旧版工具之后,所有分区一次刷写成功。

注:红米 Note4X 的 max-download-size 为 512MB,如果 userdata.img 较大,可以用 fastboot flash -S 512M userdata xxx.img 进行分块刷写。另外建议使用电脑后置的 USB 2.0 接口,USB 3.0 口可能会出现断连的问题。

安装 Docker

PostmarketOS 基于 Alpine Linux,所以包管理器用的是 apk。Docker 和 docker-compose 都可以直接安装:

1
2
3
sudo apk add docker docker-compose
sudo systemctl enable docker
sudo systemctl start docker

但执行 systemctl start docker 后,Docker 并没有正常启动。

containerd 路径不匹配

查看 Docker 服务状态:

1
systemctl status docker.service -l

核心报错信息:

1
2
failed to start daemon: failed to get containerd plugins: Unavailable: 
connection error: desc = "transport: Error while dialing: dial unix:///run/containerd/containerd.sock: timeout"

Docker 依赖的containerd服务没有运行,导致无法连接到 /run/containerd/containerd.sock 套接字。

继续排查 containerd 本身的状态:

1
systemctl status containerd.service -l

实际原因在这里:

1
ExecStart=/usr/local/bin/containerd (code=exited, status=203/EXEC)

状态码 203/EXEC 表示 systemd 找不到要执行的文件。通过 apk 安装的 containerd 实际路径是 /usr/bin/containerd,但 systemd 的 service 文件里写的是 /usr/local/bin/containerd——路径不匹配。(应该是 PostmarketOS 打包时遗留的问题)

解决方案:修改 containerd 的 systemd service 文件:

1
2
3
4
5
6
# 确认containerd实际安装路径
which containerd
# 输出: /usr/bin/containerd

# 修改service文件
sudo vi /usr/lib/systemd/system/containerd.service

ExecStart 的路径从 /usr/local/bin/containerd 改为 /usr/bin/containerd

1
2
3
4
5
# 修改前
ExecStart=/usr/local/bin/containerd

# 修改后
ExecStart=/usr/bin/containerd

然后重新加载并启动:

1
2
3
4
5
6
sudo systemctl daemon-reload
sudo systemctl start containerd
sudo systemctl start docker

# 验证
docker run --rm hello-world

这次 Docker 正常启动了。

配置 Docker 镜像代理

Docker 服务起来了,但拉镜像又是个问题——手机连的是家里 WiFi,直接访问 Docker Hub 速度很慢。好在家里电脑上有代理服务,在 Docker 的 systemd service 文件中添加代理配置即可:

1
sudo vi /etc/systemd/system/multi-user.target.wants/docker.service

[Service] 段落中添加环境变量:

1
2
3
Environment="HTTP_PROXY=http://192.168.x.x:7890"
Environment="HTTPS_PROXY=http://192.168.x.x:7890"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.x.0/24"

其中 192.168.x.x 替换为运行代理的电脑 IP。改完之后重启 Docker:

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

现在 docker pull 可以正常加速拉取镜像了。

需要注意的是你电脑上使用的代理软件需要开启允许局域网访问,如果是 Clash 类的软件,最好开启增强

部署 OpenClaw

为什么用 Docker 部署

OpenClaw 本身支持直接安装运行,但我选择基于 Docker 来部署,除了方便之外还有一个重要原因:安全隔离

OpenClaw 作为 AI 助手,具备执行代码、运行 Shell 命令、读写文件等能力。如果直接跑在宿主系统上,一旦 AI 做出什么意料之外的操作(比如误删文件、修改系统配置),后果可能比较麻烦——尤其是在这台手机上,PostmarketOS 的环境本身就比较脆弱,恢复起来不像普通服务器那么方便。

Docker 容器提供了一层天然的隔离:OpenClaw 的所有操作都被限制在容器内部,即使出了问题也不会直接影响到宿主系统。对于这种需要赋予 AI 较多权限的应用来说,跑在容器里是比较稳妥的做法。

OpenClaw-Docker-CN-IM

OpenClaw 官方提供了多种部署方式,但对于国内用户来说,社区维护的OpenClaw-Docker-CN-IM[3:1] 是比较省心的选择。这个项目预装并配置了飞书、钉钉、QQ 机器人、企业微信等主流 IM 平台的插件。

部署步骤:

1
2
3
4
5
6
7
8
9
10
# 创建工作目录
mkdir ~/openclaw && cd ~/openclaw

# 下载配置文件
wget https://raw.githubusercontent.com/justlovemaki/OpenClaw-Docker-CN-IM/main/docker-compose.yml
wget https://raw.githubusercontent.com/justlovemaki/OpenClaw-Docker-CN-IM/main/.env.example

# 配置环境变量
cp .env.example .env
vi .env

.env 文件中至少需要配置以下几项:

1
2
3
4
5
6
7
# AI模型配置(必填)
MODEL_ID=你的模型ID
BASE_URL=你的API地址
API_KEY=你的API密钥

# Gateway令牌(必填)
OPENCLAW_GATEWAY_TOKEN=你的gateway令牌

配置完成后启动服务:

1
2
docker-compose up -d
docker-compose logs -f

image.png

Gateway 启动报错

容器启动后,查看日志发现 Gateway 报错:

1
2
3
Gateway failed to start: Error: non-loopback Control UI requires 
gateway.controlUi.allowedOrigins (set explicit origins), or set
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true

image.png

image.png

原因是我通过局域网 IP(而不是 localhost)来访问 OpenClaw 的 Control UI,而 Gateway 出于安全考虑 [7] 默认不允许非本地回环地址的访问。

解决方案:在 .env 文件中添加允许的访问来源:

1
OPENCLAW_GATEWAY_ALLOWED_ORIGINS=http://你的手机局域网IP:18789

18789 是 Gateway 的默认端口。修改后重启容器:

1
docker-compose up -d

重启后 Gateway 正常运行。通过浏览器访问 http://手机IP:18789 可以进入 OpenClaw 的 Control UI。

关于内网穿透

到这里 OpenClaw 服务已经在手机上跑起来了。但手机连的是家里 WiFi,没有公网 IP,可能有人会问:外网访问不了怎么办?

实际上,对于大多数使用场景来说,内网穿透并不是必须的

为什么纯内网部署就够了

OpenClaw 的架构决定了日常交互并不依赖直接访问 Gateway 端口。配置好飞书、钉钉等 IM 平台之后,消息的流转路径是这样的:

  1. 用户在 IM 客户端(如飞书)发送消息
  2. IM 平台的服务器将消息推送给 OpenClaw Gateway(通过长连接)
  3. OpenClaw 处理后,将回复通过 IM 平台的 API 返回

局部截取_20260313_171110.png

整个过程中,IM 平台充当了中间节点,用户始终通过 IM 客户端来与 OpenClaw 交互。只要手机能正常联网(连上家里 WiFi 即可),OpenClaw 就能通过 IM 平台收发消息,不需要从外网直接访问手机上的任何端口。

而 Gateway 的 Control UI(18789 端口)本质上是一个管理和调试界面,并不是日常使用的入口。在家里通过局域网 IP 访问就够了。

不建议随意暴露端口到外网

从安全角度来说,如果没有明确需求,不建议将 Gateway 的管理端口暴露到外网。Control UI 提供了对 OpenClaw 的完整控制权限,将其暴露到公网会带来不必要的安全风险。

确实需要外网访问管理界面的情况

如果你确实有在外网访问 Control UI 的需求(比如经常需要在外面调整配置或排查问题),可以通过Tailscale[8] 来实现。Tailscale 是一个基于 WireGuard 的虚拟组网工具,所有加入同一账号的设备会组成一个私有加密局域网(使用 100.x.x.x 网段),不需要公网 IP,也不需要改路由器设置。

在 PostmarketOS 上安装:

1
2
3
4
5
6
sudo apk add tailscale
sudo systemctl enable tailscaled
sudo systemctl start tailscaled

# 登录
sudo tailscale up

执行 tailscale up 后会输出一个登录链接,在浏览器中打开完成认证即可。认证成功后手机会获得一个 Tailscale IP,之后在装了 Tailscale 客户端的设备上可以通过这个 IP 访问管理界面。

相比直接暴露端口到公网,Tailscale 组建的是私有加密网络,只有同一账号下的设备才能互相访问,安全性上要好很多。如果想进一步限制,可以通过 Tailscale 后台的 ACL 策略或 iptables 只放行特定端口:

1
2
sudo iptables -A INPUT -s 100.64.0.0/10 -p tcp --dport 18789 -j ACCEPT
sudo iptables -A INPUT -s 100.64.0.0/10 -p tcp --dport 18790 -j ACCEPT

局部截取_20260313_165919.png

通过 Tailscale 的管理后台,可以在访问控制模块新增一个端口过滤规则,在 ip 中设置暴露的端口即可。

后话

折腾完之后,这台 2017 年的红米 Note4X 算是有了新的用途——作为一台 7×24 小时运行的 OpenClaw 服务器。骁龙 625 的性能跑 OpenClaw Gateway 足够了,4100mAh 的电池在断电时也能撑一段时间。

整个方案的成本基本就是一台闲置旧手机和家里的 WiFi,算是比较低成本的“养虾”方式了。

不过这个方案也有明显的局限性:3GB 的内存只能用来跑 Gateway,没法在手机上运行本地大模型。如果想在 OpenClaw 里用本地模型推理,还是得靠一台有独显的电脑来运行 LMStudio 之类的推理服务,手机只负责消息转发和调度。

如果你也有闲置的旧手机(尤其是骁龙 625 平台的机型,如红米 Note4X、小米 5X、小米 A1 等),可以考虑试试这个方案。

关于 AstrBot

其实一开始我并不是直接上的 OpenClaw,而是先在手机上部署了AstrBot[9]。AstrBot 是一个国产的 IM 聊天机器人框架,核心功能和 OpenClaw 差不多——对接各种 IM 平台、调用大模型、支持插件扩展,但整体更轻量,在手机上跑 Docker 也不会占用太多资源。

image.png

相比 OpenClaw,AstrBot 有一个明显的优势:管理界面好用得多。AstrBot 的 Web 面板设计得比较直观,配置 IM 平台、切换模型、管理插件这些操作都很容易上手。而 OpenClaw 目前的 Control UI 说实话不太好用,很多操作都不太直观,配置项也不容易找到,上手门槛比较高。

image.png

如果你不需要 OpenClaw 那些比较高级的功能(比如长期记忆),只是想在旧手机上跑一个能对接 IM 的 AI 机器人,AstrBot 可能是一个更友好的选择。

Termux

Termux 就是一个能在安卓手机上直接跑 Linux 系统的终端模拟器

不用 root、不用刷机,装上就能用:

  • 可以装 git、python、node、java、docker 等命令行工具
  • 能写代码、跑脚本、搭服务、做开发
  • 把手机变成一台随身 Linux 小服务器

简单说:手机秒变 Linux 电脑,纯命令行、超强、轻量、免费。

如果你的旧手机无法安装 PostmarketOS,可以推荐试试 Termux,社区也有基于 Termux 一键部署 OpenClaw 的脚本:


  1. OpenClaw - GitHub ↩︎

  2. 旧手机刷入linux!秒变小服务器!骁龙625通用!- B站 ↩︎ ↩︎

  3. OpenClaw-Docker-CN-IM - GitHub ↩︎ ↩︎

  4. PostmarketOS官网 ↩︎

  5. 旧手机变身个人服务器,以红米6Pro刷PostmarketOS为例 - B站 ↩︎

  6. PostmarketOS清华镜像站 ↩︎

  7. OpenClaw Gateway Security文档 ↩︎

  8. Tailscale - GitHub ↩︎

  9. AstrBot - GitHub ↩︎