asopi tech
asopi techIndie Developer

Asopitech With · ファイル同期

Syncthing with Alopex Chirps

Syncthingは、2台以上の機器の間でファイルを同期するオープンソースのファイル同期ツールです。これをAlopex Chirpsを応用して再現すると…?

更新: 2026/10/13

どんなサービスか

Syncthingは、2台以上の機器の間でファイルを同期する、オープンソースのツールです。機器は、暗号鍵から作られる機器IDで互いを指定し、両方が相手を登録したときだけつながります。扱うデータは、同期する機器と、共有するフォルダのファイルです。

通信の組み立て

  • 機器の結び付け:各機器に証明書を持たせ、信頼する相手の証明書を設定します。Chirpsは信頼すると設定した証明書だけを受け入れるので、登録した機器どうしがつながります。
  • メンバーシップ:gossipで、同期の相手がいまalive・suspect・deadのどれかを知ります。戻ってきた相手に、たまった変更を送ります。
  • ファイルの同期:ファイルごとに、送る、受け取る、双方向の同期を選べます。両側で変わったときは、新しい方、送り側、受け側のどれを優先するかを決められます。

フォルダを見張り、どのファイルを同期にかけるかを決めるのは、アプリのコードです。

配置の形

各機器のアプリにChirpsを組み込み、シードのリストに、いつも動いている機器を入れます。機器どうしは、QUICで直接つながります。

Alopex Chirpsが合う理由

ファイルの同期は、登録した相手だけとつながること、相手の生死を知ること、確かに同期することの3つでできています。Chirpsは、相互TLSの認証、gossipのメンバーシップ、ハッシュを確かめる同期を、まとめて持ちます。

コードで見る

両機器の変更の新旧を一貫して判断する、ハイブリッド論理時計の中心だけを取り出したコードです(Rust)。

use alopex_chirps_gossip_swim::hlc::{Clock, LocalHlc};
use std::sync::atomic::{AtomicU64, Ordering};
use std::sync::Arc;
use std::time::Duration;

// 説明用の手動クロック(実際はシステム時計)
struct ManualClock(AtomicU64);
impl Clock for ManualClock {
    fn now_millis(&self) -> u64 {
        self.0.load(Ordering::SeqCst)
    }
}

fn main() {
    let skew = Duration::from_secs(1);
    // 同期する 2 つの機器 A / B。時計が多少ずれていてもよい
    let mut a = LocalHlc::with_clock(skew, Arc::new(ManualClock(AtomicU64::new(100))));
    let mut b = LocalHlc::with_clock(skew, Arc::new(ManualClock(AtomicU64::new(90))));

    // A 側でファイルを変更するたびに時計を進める
    let change1 = a.tick();
    let change2 = a.tick();
    println!("A: change1={change1:?} change2={change2:?}");

    // A の変更を B が受け取ると、B の時計は A を追い越す
    let seen = b.receive(change2).expect("receive");
    println!("B receives A: {seen:?}");

    // その後 B 側で起きた変更は、A の変更より新しいと一貫して判断できる
    let b_change = b.tick();
    println!("B next: {b_change:?}");
    assert!(b_change > change2);
    println!("OK: 両機器が、どちらの変更が新しいかを一貫して判断できる");
}

時計のずれがあっても、両機器のどちらの変更が新しいかを一貫して判断でき、両側で変わったときの優先を決められます。相互TLSの認証とgossipのメンバーシップは、本文のとおりChirpsが受け持ちます。

登録した機器どうしだけでファイルを双方向に同期できるAlopex Chirpsで、同期のアプリを作ってみよう。GitHubのクイックスタートから始められます。

関連リンク