一键部署到 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 部署
  • 管理应用(启动/停止/重启)
  • 自动设置数据库

Demo GIF

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,但对于家庭实验室和物联网项目来说,简洁往往更胜一筹。

如果你在运行家庭实验室或边缘设备,试一试并分享你的反馈吧!

Back to Blog

相关文章

阅读更多 »

你好,我是新人。

嗨!我又回到 STEM 的领域了。我也喜欢学习能源系统、科学、技术、工程和数学。其中一个项目是…