一键部署到 Raspberry Pi:构建基于 Rust 的部署工具
发布: (2026年1月12日 GMT+8 15:59)
5 分钟阅读
原文: Dev.to
Source: Dev.to
问题
我在家里运行一个小型 homelab,拥有多台 Raspberry Pi:
- 客厅的 Pi:家庭自动化
- 车库的 Pi:温度监测
- 地下室的 Pi:博客和个人站点
每次我想部署更新时,都必须运行类似以下的命令:
ssh pi@192.168.1.50
cd ~/apps/temperature-monitor
git pull
npm install
sudo systemctl restart temp-monitor
ssh pi@192.168.1.51
# ... repeat ...
ssh pi@192.168.1.52
# ... and again ...
Ansible 觉得太笨重,Docker Swarm 对三台 Pi 来说又显得过度。我只想要 git push → 自动部署。
解决方案
我构建了 Flare —— 一个用 Rust 编写的轻量级部署工具,具备以下功能:
- 自动发现网络中的设备
- 只需一条命令即可从 GitHub/Gitea 部署
- 管理应用(启动/停止/重启)
- 自动设置数据库

Source: …
工作原理
1. 在你的 Pi 上启动守护进程
# On Raspberry Pi
flared
# Listening on :7530
2. 从笔记本电脑发现设备
# On your laptop
$ flare discover
[0] 192.168.1.50:7530 (new)
[1] 192.168.1.51:7530 (new)
$ flare sync 0
Name: pi-living-room
Flare 使用 UDP 广播自动查找设备——无需静态 IP。
3. 向项目添加配置
在仓库中创建 flare.toml:
[app]
name = "temp-monitor"
version = "1.0.0"
[run]
command = "python sensor.py"
port = 8080
[database]
type = "sqlite"
name = "readings.db"
4. 部署!
flare deploy github-user/temp-monitor --device pi-living-room
实际案例
传感器代码 (sensor.py)
import time
import sqlite3
from flask import Flask, jsonify
from w1thermsensor import W1ThermSensor
app = Flask(__name__)
sensor = W1ThermSensor()
@app.route('/temperature')
def get_temp():
temp = sensor.get_temperature()
# Store in SQLite
conn = sqlite3.connect('readings.db')
c = conn.cursor()
c.execute('INSERT INTO readings VALUES (?, ?)', (time.time(), temp))
conn.commit()
return jsonify({'temperature': temp})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
对应的 flare.toml
[app]
name = "temperature-monitor"
version = "1.0.0"
[build]
command = "pip install -r requirements.txt"
[run]
command = "python sensor.py"
port = 8080
[database]
type = "sqlite"
name = "readings.db"
preseed = "schema.sql"
[health]
url = "http://localhost:8080/temperature"
timeout = 10
一次性部署到所有树莓派:
flare deploy my-github/temp-monitor --device all
技术细节
- 发现: UDP 在端口 7001 上广播
- 认证: Argon2‑hashed tokens(自动生成)
- 传输: TLS 加密的 TCP(自签名证书)
- 协议: 长度前缀消息
- 隔离: 可选的 systemd scopes
技术栈: Rust 与 Tokio 用于异步,rustls 用于 TLS,clap 用于 CLI,serde 用于序列化。
安全
Flare 在同步过程中为每个设备生成唯一令牌:
// CLI generates random token
let token = generate_random_token();
// Hashes with Argon2
let hash = argon2::hash(token);
// Sends hash to daemon
daemon.register(hash);
// Future deploys use this token
deploy_with_token(token);
无需管理密码;令牌可以随时轮换。
性能
在 Raspberry Pi Zero W 上:
- 二进制大小:约 10 MB
- RAM 使用量:空闲时约 20 MB,部署期间约 40 MB
- 部署时间:5–15 秒(取决于仓库大小)
- CPU:空闲时约 5 %,部署期间约 30 %
与 Ansible 对比:
- Ansible 需要 Python(100 MB 以上),运行 playbook 需要数分钟,并且还需维护 inventory。
当前限制 📝
- v0.2 状态
- 网关反向代理未完成(静态站点可用,API 即将推出)
- 暂未支持 Windows 守护进程
- 每个应用仅一个数据库
- 仅基本健康检查
试一试!
# Install
cargo install flare-cli flare-daemon
# Or download binaries from GitHub
# Quick test
flared &
flare discover
flare deploy your-github/your-app
GitHub:
接下来是什么?
- Web 仪表板
- 多数据库支持
- 指标收集
- 插件系统
结论
Flare 解决了我“我只想部署到 Pi”的问题。它不是 Kubernetes,但对于家庭实验室和物联网项目来说,简洁往往更胜一筹。
如果你在运行家庭实验室或边缘设备,试一试并分享你的反馈吧!