154 lines
5.0 KiB
Markdown
154 lines
5.0 KiB
Markdown
# 边缘节点部署
|
||
|
||
> *“真正需要管理工具的,往往不是机房里那台 64 核 256GB 的服务器,而是弱电箱里那块连散热片都没有的 ARM 开发板。”*
|
||
|
||
---
|
||
|
||
## 真实场景
|
||
|
||
frpc-console 对边缘节点的支持,不是来自“市场调研”。
|
||
|
||
它来自以下设备:
|
||
|
||
- **全志 H3**(256MB / 512MB 内存),运行社区的精简版 ARMbian 或官方剪枝版 Debian,放在弱电箱里跑 frp 穿透
|
||
- **RK3506**(128MB / 256MB 版本共存),没有 Docker,甚至没有 systemd
|
||
- 老旧 ARM 开发板(ARMv7l / ARM-HF),原本可能是一块电视盒子,刷上 ARMbian 之后被重新利用
|
||
|
||
这些设备的共同特征:
|
||
|
||
- 存储介质:SD 卡 / eMMC(便宜,容量大,但读写速度不敏感)
|
||
- 内存:128MB ~ 512MB(**没有任何拓展条件**)
|
||
- 系统环境:极简化,不常用的工具基本都被剪枝,极端情况下很可能只有 Kernel + BusyBox + init
|
||
- 网络环境:长期在线,但带宽有限
|
||
- 物理位置:没有理由长期触及(弱电箱、吊顶、室外机柜)
|
||
|
||
它们承担的工作却并不边缘:
|
||
|
||
- 内网穿透
|
||
- 远程维护通道
|
||
- IoT 设备接入
|
||
- 边缘计算节点
|
||
|
||
---
|
||
|
||
## 边缘环境特征
|
||
|
||
### 存储 vs 内存:成本结构的倒挂
|
||
|
||
在边缘设备上,存储和内存的成本结构与服务器完全不同:
|
||
|
||
| | 服务器 | 边缘设备 |
|
||
|---|---|---|
|
||
| 存储 | 昂贵(NVMe SSD) | 便宜(SD 卡 / eMMC) |
|
||
| 内存 | 便宜(可扩展) | 昂贵(不可扩展,BGA 焊接) |
|
||
|
||
这意味着:
|
||
|
||
**镜像大几十 MB,可以接受。内存多占 10MB,不能接受。**
|
||
|
||
所以 frpc-console 的 Docker 镜像虽然包含了完整的构建环境和依赖,但它不会在运行时消耗额外内存。镜像大小和运行时内存占用,在边缘场景下是两个独立且优先级完全不同的指标。
|
||
|
||
### 缺失的依赖
|
||
|
||
边缘设备可能缺失以下内容:
|
||
|
||
- **Docker**:很多 ARMHF 设备跑不动 Docker,或者根本没有 Docker 的预编译包
|
||
- **systemd**:精简系统中可能只有 init 或 busybox-init
|
||
- **glibc**:某些环境只提供 uClibc 或 musl
|
||
- **包管理器**:内存小到一定程度的时候,它的存在堪称奢望
|
||
|
||
因此,**二进制部署是边缘节点的唯一可行方案**。
|
||
|
||
---
|
||
|
||
## frpc-console 对边缘节点的适配
|
||
|
||
### 1. 二进制静态编译
|
||
|
||
frpc-console 采用 Go 编写,编译时使用 `CGO_ENABLED=0`:
|
||
|
||
- 不依赖 glibc
|
||
- 单一二进制文件
|
||
- 可运行于 musl 环境(Alpine、BusyBox)
|
||
- 不需要任何运行时依赖
|
||
|
||
### 2. 多架构支持
|
||
|
||
| 架构 | 说明 |
|
||
|---|---|
|
||
| x86_64 / AMD64 | 标准服务器 |
|
||
| ARM64 / Aarch64 | 现代 ARM 设备(树莓派 3/4/5) |
|
||
| ARMHF / ARMv7l | 老旧 ARM 设备(全志 H3、RK3506) |
|
||
|
||
### 3. 无 systemd 运行方式
|
||
|
||
在只有 init + BusyBox 的环境中:
|
||
|
||
```bash
|
||
# 直接运行
|
||
./frpc-console &
|
||
|
||
# 或通过 init 启动(写入 /etc/init.d/)
|
||
```
|
||
|
||
frpc-console 自身会通过 `Setsid` 为 frpc 创建独立会话,确保 frpc 在 console 退出后仍被 PID 1 接管。
|
||
|
||
### 4. 数据目录设计
|
||
|
||
```
|
||
/opt/frpc-console/data/
|
||
├── frpc-console.db # SQLite 数据库
|
||
├── frpc.toml # FRP 配置文件
|
||
├── frpc # FRP 二进制(内置,无需额外下载)
|
||
├── frpc.pid # frpc 进程 PID
|
||
├── frpc.log # frpc 日志(可选)
|
||
└── version.ini # 当前版本标识
|
||
```
|
||
|
||
所有数据在同一个目录下,备份只需复制整个文件夹。
|
||
|
||
### 5. 无日志默认策略
|
||
|
||
边缘设备存储有限,所以:
|
||
|
||
- 默认不写入日志文件
|
||
- 日志仅在用户明确开启时写入
|
||
- 避免 SD 卡被日志写满导致设备不可用
|
||
|
||
---
|
||
|
||
## 部署注意事项
|
||
|
||
### 推荐的最小硬件规格
|
||
|
||
| 场景 | CPU | 内存 | 存储 |
|
||
|---|---|---|---|
|
||
| 最小运行 | ARMv7 / ARM-HF | 128MB | 50MB(二进制 + 数据库) |
|
||
| 推荐运行 | ARMv7 / ARM64 | 256MB | 100MB |
|
||
| 舒适运行 | ARM64 / x86_64 | 512MB | 200MB |
|
||
|
||
### 不建议部署的场景
|
||
|
||
- **内存低于 64MB**:很极限,需要系统本身有极强的剪枝水准,以保证基础内存消耗不高于20M,但这并不现实
|
||
- **存储低于 20MB**:没有足够的空间存放二进制和数据
|
||
- **内核版本过低**(< 3.x):某些系统调用可能不支持
|
||
- **刷了OpenWRT的软/硬路由**:这种建议去下opkg的源包,而不是看向我们这个项目。
|
||
|
||
### 网络要求
|
||
|
||
- 边缘节点的网络出口带宽一般有限,首次访问 WebUI 时加载的静态资源(约 1-2MB)可能需要稍长时间
|
||
- 后续操作仅传输 JSON 数据,流量极小
|
||
|
||
---
|
||
|
||
## 为什么这件事值得单独记录?
|
||
|
||
因为主流开源项目在讨论 ARM 支持时,讨论的是“树莓派 4B(4GB 版本)”。
|
||
|
||
而真正部署在边缘的设备,可能只有 256MB 内存,甚至连 Docker 都没有。
|
||
|
||
frpc-console 对 ARMHF 的支持,不是“支持的架构列表里多了一项”,而是:
|
||
|
||
**这个工具可以跑到那些真正藏在弱电箱里、承担网络基础设施工作的小板子上。**
|
||
|
||
这才是边缘节点部署的意义。 |