48小时用 TRAE 把闲置小米手机改造成全能家庭服务器
一句话总结:一台吃灰的小米 12,被我改造成了搭载博客、AI 助手、监控面板的 7×24 小时在线家庭服务器——硬件是闲置的,总花费 0 元。
为什么要做这个项目?
相信每个人手里都有一两台淘汰的旧手机——卖不了几个钱,扔了又可惜。我的小米 12 也在抽屉里躺了大半年。
但有一天我突然想到:安卓手机本质上就是一台 Linux 电脑,它有 8 核 CPU、8GB+ 内存、256GB 存储,比我大学时候的笔记本配置都高!能不能把它当成一台服务器来用?
于是,一个"疯狂"的想法诞生了:把小米 12 改造成我的个人家庭服务器,跑博客、AI 聊天、系统监控……让这台吃灰的设备重新发光发热。
最终实现了什么?
经过一番折腾,这台小米 12 上现在同时运行着 7 个服务:
| 服务 | 技术栈 | 功能 |
|---|---|---|
| Java 21 + MariaDB | 个人博客系统,支持 Markdown、主题切换 | |
| Vue 3 + Koa 2 + Socket.IO | 全功能 AI Agent,集成 DeepSeek 大模型,支持实时流式对话 | |
| Flask + Gunicorn | 自研 Dashboard,CPU/内存/磁盘/电池/温度/服务状态 | |
| Python | 实时进程、网络、磁盘 I/O 详情 | |
| frp | 通过云 VPS 将手机服务暴露到公网 | |
| Hermes Gateway | 钉钉、微信、飞书等多平台 AI 机器人 | |
| OpenSSH | 随时随地从外网 SSH 登录手机,远程运维 |
技术架构:四层模型
外网用户 → 云 VPS ────frp隧道────→ 小米 12
│ │
┌───────┴────────┐ ┌───────┴──────────┐
│ Layer 1: VPS │ │ Layer 2: Termux │
│ frps :7000 │ │ frpc 客户端 │
│ Nginx :80 │ │ SSHD :8022 │
└────────────────┘ └───────┬───────────┘
│
┌─────────────┴───────────┐
│ Layer 3: proot Ubuntu │
│ MariaDB :3306 │
│ Redis :6379 │
│ Nginx :8080 │
│ Flask :5000 │
│ Halo :8090 │
│ Glances :61208 │
│ Hermes Web UI :8648 │
└─────────────────────────┘
关键在于三层嵌套的虚拟化:
- Android 系统 → 提供硬件基础(Root + Magisk 实现开机自启)
- Termux → 在安卓上运行 Linux 终端,安装 frp、SSH
- proot-distro Ubuntu → 在 Termux 内运行完整 Ubuntu 用户态,部署数据库、Web 服务
流量路径:
- 外网请求 → VPS Nginx:80 → frp 隧道 → 手机 proot Ubuntu 内对应服务
/→ Halo 博客/web/→ Flask 监控面板/monitor/→ Glances 系统监控
TRAE Vibe Coding:一个人搞定全栈的秘诀
说实话,如果纯手写,光 Flask 监控面板那 803 行代码就够我写两天的。但有了 TRAE 的 Vibe Coding,整个开发效率提升了至少 5 倍。
什么是 Vibe Coding?
Vibe Coding 是一种开发方式——你描述需求,AI 帮你写代码,你负责把控方向和调优。不是简单的代码补全,而是深度的结对编程。
1. Flask 监控面板 —— 从零到上线,2 小时
传统方式下,我需要:
- 研究
/proc文件系统格式 - 手写 CPU 使用率计算逻辑
- 调试 psutil 在 ARM 上的兼容性问题
- 设计前端 HTML + CSS 布局
用 TRAE,我直接描述需求:
“帮我写一个 Flask Web 监控面板,深色主题,读取 /proc/stat、/proc/meminfo、/proc/net/dev 获取系统信息,前端用单页 HTML 展示:CPU 使用率进度条、内存饼图、磁盘挂载表、网络流量、电池电量、服务状态检测”
TRAE 直接生成了完整的 app.py,包含:
- 所有系统信息的采集函数
/proc文件解析逻辑(这个是体力活,AI 写太合适了)- Jinja2 模板的完整 HTML 页面
- Basic Auth 认证
- GPU 温度、电池状态等安卓特有指标
我只需要微调几个颜色值和布局,就能完美运行。
2. Shell 脚本编写 —— 批量生成运维工具
这个项目最费时间的是写各种启动脚本。手机环境特殊,每个服务都需要特殊处理:
# TRAE 生成的核心启动脚本(节选)
# 一键启动 MariaDB + Redis + Flask + Glances + Halo + Nginx + SSH
echo "🚀 正在启动所有服务..."
# 启动 MariaDB
mysqld_safe --datadir=/var/lib/mysql &
sleep 3
# 启动 Redis
redis-server --daemonize yes
# 启动 Flask (Gunicorn, 2 workers)
cd /opt/python && gunicorn -w 2 -b 0.0.0.0:5000 app:app --daemon
# 启动 Halo (Java 21, 128M 堆, MariaDB 方言)
java -Xms128m -Xmx256m -jar halo.jar \
--spring.r2dbc.url=r2dbc:pool:mariadb://localhost:3306/halo \
--spring.r2dbc.migrate.dialect=mariadb &
# 启动 Nginx
nginx -c /etc/nginx/nginx.conf
我把每个脚本的需求描述清楚,TRAE 就生成完整的 bash 代码,包括错误处理、日志输出、后台运行、进程保活等细节。整个项目我攒了 15 个运维脚本,覆盖启动、检查、修复、部署全流程。
3. 钉钉机器人修复 —— AI 排查 ARM 兼容问题
Hermes Gateway 接入钉钉机器人时,在 ARM 架构的 proot 环境下出现了各种诡异报错。我把完整的错误日志贴给 TRAE:
“这个报错是在 ARM64 proot Ubuntu 环境下运行 Python 钉钉 SDK 时出现的,帮我一键排查并修复”
TRAE 分析出是 cryptography 和 pycryptodome 在 ARM 下的预编译包不兼容,生成了一个 454 行的自动化修复脚本,包括:
- 检测 Python 依赖版本
- 钉钉凭证验证
- 适配器补丁注入
- 一键回滚机制
这种跨平台兼容问题,要是自己排查起码要一个下午,AI 几分钟就搞定了。
4. Nginx 反向代理配置 —— 一句话生成
"帮我写一个 Nginx 配置,把
/代理到 Halo :8090,/web/代理到 Flask :5000,/monitor/代理到 Glances :61208"
TRAE 秒出配置:
server {
listen 8080;
location / {
proxy_pass http://127.0.0.1:8090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /web/ {
proxy_pass http://127.0.0.1:5000/;
proxy_set_header Host $host;
}
location /monitor/ {
proxy_pass http://127.0.0.1:61208/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
这个配置一次通过,不用调试。
关键技术挑战与解决
挑战 1:开机自启
安卓默认会杀掉后台进程。解决方案:
- Magisk service.d:系统级开机脚本,手机重启后自动拉起 Termux → SSHD → frp → proot 内所有服务
- 用
termux-wake-lock防止 CPU 休眠 - 系统设置中锁定 Termux,防止被系统回收
挑战 2:内网穿透
家庭宽带有公网 IP?不存在的。解决方案:
- 云 VPS 运行 frps(服务端,端口 7000)
- 手机运行 frpc(客户端),建立多条隧道
- VPS Nginx 做统一入口反向代理
这样只需要一台最低配的云服务器做中转,手机上的所有服务都能从公网访问。
挑战 3:ARM 兼容性
Java、MariaDB、Redis 在 ARM64 下都能直接用,但 Python 的某些加密库需要特殊处理。TRAE 帮我排查并生成了修复脚本,大大节省了时间。
自研监控面板:手机服务器的"仪表盘"
这是我最得意的模块——用 Flask 从零写了一个系统监控面板(803 行代码):
- CPU:型号、核心数、频率、每核心使用率(进度条可视化)
- 内存:总量/已用/可用/缓存/Swap
- 磁盘:挂载表、读写速率
- 网络:各接口 IP 地址、实时收发流量(下载/上传)
- 电池:电量百分比、充电状态、温度(手机才有的特色指标!)
- 进程:TOP 10 进程排行,内存占用一目了然
- 服务状态:SSHD / Redis / MariaDB / Nginx / Gunicorn / Glances / frpc 一键检测
深色主题,手机和电脑都能完美浏览。访问 /web/ 就能看到这个仪表盘,所有关键指标一览无余。
# 电池信息采集(手机服务器专属功能)
def get_battery_info():
"""从 Android sysfs 读取电池信息"""
battery = {"level": 0, "status": "未知", "temperature": 0}
try:
with open('/sys/class/power_supply/battery/capacity') as f:
battery['level'] = int(f.read().strip())
with open('/sys/class/power_supply/battery/status') as f:
battery['status'] = f.read().strip()
with open('/sys/class/power_supply/battery/temp') as f:
battery['temperature'] = int(f.read().strip()) / 10
except:
pass
return battery
项目文件结构一览
安卓/
├── config/ # frp、Nginx 配置
├── docs/ # 完整文档(948行 README)
├── hermes-web-ui/ # AI 聊天前端+后端 (Vue3+Koa2+Socket.IO)
├── python/ # Flask 监控面板 (app.py, 803行)
├── scripts/ # 15+ 运维 Shell 脚本
├── platform-tools/ # ADB 工具 + 开机自启脚本
└── tools/ # Halo、frp 等二进制包
一个人开发的效率秘诀
1. 让 AI 写"体力活"
CRUD 逻辑、Shell 脚本、Nginx 配置、HTML 模板——这些重复性代码全部交给 TRAE,我专注于架构设计和问题排查。
2. 先跑通,再优化
不要追求完美架构,第一天就要让博客能访问。TRAE 快速出 MVP 的能力让我能持续获得正反馈,保持开发热情。
3. 描述需求,而非写代码
用 TRAE 的核心技巧是说清楚你想要什么,而不是亲自写代码。我的习惯是把需求描述得像产品文档一样清晰,AI 就能一次生成高质量的代码。
写在最后
这个项目从想法到跑通,用了大约 2 个周末(4天)。如果没有 TRAE,我估计至少要花 2-3 周——光是写 Shell 脚本和排查 ARM 兼容问题就要耗掉大半时间。
做这个项目的过程中,我深刻感受到 AI 编程工具带来的生产力革命。以前一个人做全栈项目,前后端来回切换,大量时间花在"写代码"上。现在有了 TRAE,我可以把更多精力放在产品设计、系统架构、运维策略上——这些才是真正创造价值的地方。
闲置手机 ≠ 电子垃圾。只要肯折腾,它完全可以变成一台 0 成本的迷你服务器。如果你也有吃灰的旧手机,不妨试试——配合 TRAE,难度真的没那么大 ![]()
项目中的凭据信息已在上线后更新替换,文中展示仅为示例。生产环境请务必修改默认密码和 API Key。