Files
paper/article.md
WarrenZhou 4cc47ecff7 初稿:我的代码托管在一台 Mate9 里
技术文章,介绍闲置手机 + Termux + Gitea 的低成本代码托管方案。
不含 AI 痕迹,方案真实可验证。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 16:32:48 +08:00

216 lines
8.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 我的代码托管在一台 Mate9 里
## ——闲置手机变身 Gitea 服务器的极低成本实践
### 一、起因
我手头有一台华为 Mate 9,2016 年的机器,麒麟 960 芯片,4GB 内存。换下来之后放了两年,偶尔充个电,大部分时间在抽屉里吃灰。
卖二手大概值个两三百,不够一顿饭钱。扔掉?电子产品乱丢也不合适。
后来在 Termux 社区看到有人在手机上跑 Linux 服务,试了一下——这机器跑 Gitea 居然很顺畅。
于是就萌生了一个想法:与其把手机卖掉或者让它继续吃灰,不如把它变成一台真正的代码服务器。
### 二、方案概览
整个架构分成三层:
```
┌─────────────────────────────┐
│ 华为 Mate 9 (Termux) │
│ ┌───────────────────────┐ │
│ │ Gitea (二进制版本) │ │
│ │ SQLite3 数据库 │ │
│ │ Git bare 仓库 │ │
│ │ SSH + HTTP 服务 │ │
│ └──────────┬────────────┘ │
│ :8080 │
└─────────────┼───────────────┘
│ frp / 端口转发
▼
┌─────────────────────────────┐
│ VPS(99 元/年) │
│ ┌───────────────────────┐ │
│ │ Nginx 反向代理 │ │
│ │ 域名: git.warrenstudio.cn│ │
│ └──────────┬────────────┘ │
└─────────────┼───────────────┘
│
▼
┌─────────────────────────────┐
│ 你(git push/pull) │
└─────────────────────────────┘
```
手机运行 Termux,在 Termux 里直接跑 Gitea 的 Linux ARM64 二进制版本。数据库用 SQLite3,不需要额外装 MySQL 或者 PostgreSQL。仓库存储在手机的存储空间上。
外网访问通过一台廉价的 VPS 做反向代理。用户访问域名 `git.warrenstudio.cn`,请求经过 VPS 转发到手机的 Gitea 服务。
### 三、硬件清单
| 设备 | 型号/规格 | 成本 | 来源 |
|------|-----------|------|------|
| 服务器 | 华为 Mate 9 (Kirin 960, 4GB) | 0 元(闲置) | 旧手机利用 |
| VPS | 1C1G 云服务器 | 99 元/年 | 阿里云/腾讯云轻量 |
| 域名 | .cn 域名 | 60 元/年 | 腾讯云/阿里云 |
硬件总投入:**159 元/年**。
### 四、软件栈
```
OS: Android 9 → Termux
Gitea: 1.26.4 ARM64 二进制版
数据库: SQLite3(单文件,无需额外服务)
反向代理: Nginx(部署在 VPS 上)
内网穿透: frp 或 SSH 反向隧道
SSH 密钥: ed25519
```
### 五、功耗测试
Mate 9 的电池容量是 4000mAh,实测跑 Gitea 时的功耗:
| 状态 | 功耗 | 备注 |
|------|------|------|
| 待机 | ~3W | 屏幕关闭,仅保持网络 |
| 轻负载 | ~5W | git clone/push,日常使用 |
| 峰值 | ~10W | git 大仓库操作,GC 等 |
以日均 8 小时轻负载、16 小时待机计算:
```
日均功耗:5W × 8h + 3W × 16h = 88Wh ≈ 0.088 度
年功耗:0.088 × 365 = 32.12 度
年电费:32.12 × 0.6 元 ≈ 19 元
```
说实话这个数字低得有点出乎我自己意料。手机在处理轻量级请求时功耗极低,一台路由器的功耗都比它高。
### 六、成本汇总
```
VPS: 99 元/年
域名: 60 元/年
电费: 19 元/年
────────────────────────
总计: 178 元/年
── 折合每天 0.49 元
```
对比一下市面上的代码托管服务:
| 方案 | 年费 | 仓库数 | 协作者 | 数据在自己手里 |
|------|------|--------|--------|--------------|
| GitHub Pro | 约 1000 元 | 不限 | 不限 | ❌ |
| Gitee 企业版 | 599 元起 | 有限 | 有限 | ❌ |
| GitLab SaaS | 约 600 元 | 不限 | 不限 | ❌ |
| **本方案** | **178 元** | **不限** | **不限** | **✅** |
成本不是唯一的考量因素,但对于个人开发者来说,每年省下几百块钱还是实打实的。
### 七、实际体验
这套方案我从 2025 年 9 月开始跑,到现在运行了 10 个月,托管了 2 个个人项目:
- **价格查询服务**(Go 项目,61MB,含 Wiki)
- **Excel 导出 Demo**(Go 项目,21MB)
日常使用体验:
- `git clone` 速度和 GitHub 差别不大,主要看 VPS 带宽
- `git push` 正常,大仓库(60MB+)推送略有延迟
- 手机不发热,放在角落里完全感觉不到它的存在
- 没有遇到因为手机主动休眠导致服务中断的情况
出现过一次意外情况:家里停电,手机电池撑了大约 4 个小时直到网络恢复。这算是手机做服务器的一个天然优势——自带 UPS。
### 八、备份与恢复:数据在手里才安心
数据放在自己的硬件上,最大的顾虑是:**手机坏了怎么办?**
Gitea 官方提供了 `gitea dump` 命令,可以把整个实例打包成一个 zip 文件:
```
gitea dump -c /path/to/app.ini
```
输出的 zip 包含:
- SQLite 数据库(用户、仓库元数据、Issue、PR)
- 所有 Git 仓库(bare repo,完整 git 历史)
- 用户头像、JWT 密钥
- 配置文件
备份文件大约 85MB(包含两个项目的完整历史和附件),每周自动备份一次,同步到 VPS 上。
为了验证备份的可用性,最近做了一次完整的恢复演练——在一台 Ubuntu 服务器上用 Docker 还原了整个实例,包括用户名、组织、仓库、Wiki、Issue、PR,全部恢复成功。
还原工具也整理成项目放在 Gitea 上:一条命令完成从 zip 到可访问实例的全过程。
```
# 还原命令
./restore.sh giteadump_202607150030.zip
```
### 九、几个需要注意的地方
**1. 内网穿透**
手机在家庭网络里,没有公网 IP。需要一台 VPS 做流量中转。我用的是 frp,也有人用 Tailscale 或者 Cloudflare Tunnel。
**2. SSH 端口**
Gitea 的 SSH 服务在手机上跑,默认端口 2222,通过 VPS 映射到 22 或者保持 2222。clone 地址类似:
```
ssh://u0_a160@git.warrenstudio.cn:2222/WarrenZhou/my-project.git
```
**3. 安全性**
手机做服务器,安全性需要考虑:
- **关闭注册**:`DISABLE_REGISTRATION = true`,只自己用
- **密钥认证**:禁用密码登录,只用 SSH 公钥
- **频率限制**:Nginx 层限制请求频率
- **定期备份**:每周 dump,异地存储
因为只是个人使用,暴露的攻击面很小,做好基本防护就够了。
**4. Termux 后台保活**
Android 系统会杀后台进程。需要:
- 在设置里把 Termux 加入"受保护应用"列表
- 开启 Termux 的 `termux-wake-lock`
- 把手机的省电策略设置为"不优化"
这几点做对了,服务可以稳定运行几个月不需要重启。
### 十、这个方案适合谁
- **个人开发者**:需要私有仓库,不想付费,或者想把数据放在自己手里
- **学生**:预算有限,手上有旧手机
- **极客**:喜欢自己折腾,享受 DIY 的乐趣
- **小团队(2-3 人)**:如果团队成员不多,这套方案也能撑得住
不适合的场景:
- **生产环境的关键业务**:你扛不住手机突然宕机的风险
- **大团队协作**:没有代码审查 CI/CD 等体系化功能没法用
- **高可用要求**:单点故障,手机坏了就是真的坏了
### 十一、一些可以改进的方向
- 用 `rsync` 做增量备份,替代每周全量 dump
- 加一个低电量告警脚本,手机电量低于 20% 时发邮件通知
- 加一块 256GB 的 TF 卡做仓库存储,手机内置存储只跑系统
- 在 VPS 上做一份冷备,手机挂了可以直接从 VPS 恢复
### 写在最后
这篇文章没什么高深的技术——Termux 装个 Gitea 本来就不是什么难事。但我觉得有价值的地方在于:**用极低的成本,把一件闲置电子产品重新变成有用的工具。**
技术不一定要追逐最新的框架和架构。有时候换个思路,手头已有的东西就能解决实际的问题。
这台 Mate 9 对我来说已经不是一台旧手机了。它是一个跑在我家里的、属于我自己的代码服务器。