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のクイックスタートから始められます。