한 번의 명령으로 Raspberry Pi에 배포하기: Rust 기반 배포 도구 만들기

발행: (2026년 1월 12일 오후 04:59 GMT+9)
5 분 소요
원문: Dev.to

I’m happy to translate the article for you, but I’ll need the full text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source link at the top and preserve all formatting, code blocks, URLs, and technical terms as you requested.

문제

저는 여러 대의 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 하면 배포되길 원했습니다.

솔루션

I built Flare – a lightweight deployment tool in Rust that:

  • Auto‑discovers devices on your network
  • Deploys from GitHub/Gitea with one command
  • Manages apps (start/stop/restart)
  • Sets up databases automatically

Demo GIF

작동 방식

1. 라즈베리 파이에서 데몬 시작

# 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

기술 세부 사항

  • Discovery: 포트 7001에서 UDP 브로드캐스트
  • Authentication: Argon2‑해시 토큰 (자동 생성)
  • Transport: TLS 암호화 TCP (자체 서명 인증서)
  • Protocol: 길이 접두사 메시지
  • Isolation: 선택적 systemd 스코프

Stack: 비동기를 위한 Tokio와 Rust, TLS를 위한 rustls, CLI를 위한 clap, 직렬화를 위한 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 이상)이 필요하고, 플레이북 실행에 몇 분이 걸리며 인벤토리 관리도 필요합니다.

현재 제한 사항 📝

  • 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:

다음은 무엇인가요?

  • 웹 대시보드
  • 다중 데이터베이스 지원
  • 지표 수집
  • 플러그인 시스템

결론

Flare는 내가 “그냥 라즈베리 파이에 배포하고 싶다”는 문제를 해결해 주었습니다. Kubernetes는 아니지만, homelabs와 IoT 프로젝트에서는 단순함이 종종 승리합니다.

homelab이나 edge 디바이스를 운영하고 있다면, 한번 사용해 보고 피드백을 공유해주세요!

Back to Blog

관련 글

더 보기 »

안녕, 뉴비 여기요.

안녕! 나는 다시 S.T.E.M. 분야로 돌아가고 있어. 에너지 시스템, 과학, 기술, 공학, 그리고 수학을 배우는 것을 즐겨. 내가 진행하고 있는 프로젝트 중 하나는...