lsyncdでlocalとremoteのソースコードの同期をする

きっかけ

今使っているMacBookProのメモリは16G。dockerやらvagrantやらchromeやらslackやらを立ち上げていると、メモリがあっという間に枯渇してしまう。つらい...

32Gメモリ搭載のMacBookProを買うことも考えたものの、「dockerなどはLinuxの方がサクサク動く」という話をちらほら聞いたので、Linux機を買おうか自作しようかと悩んでいたところ...

ということでオススメ頂いたIntel NUCその他部品を購入し、Linux PCを半自作。メモリを32G載せました。

これに1TのSSDを買っても、合わせて10万円以下!素晴らしい。

で、一旦以下のような方針を立てた。

  • MacBook(= local)のエディタとか諸々の開発環境はそのまま使う
    • SlackとかiTunesとかその他便利ツールとかを一切放棄するのはまだつらい
  • docker、vagrantなどはNUC(= remote)に任せる

f:id:ginkouno:20190721193318j:plain

そこでlsyncd

ようやく本題。remoteとlocalとでソースコードを同期するため、lsyncdを使用した。

インターネット上を探すと、lsyncdに関する情報はいろいろあったが、ちょうど自分が使いたい設定でのサンプルが無かったので、ここにメモっておく。

前提

  • sshの鍵認証でremoteと接続する
  • 転送にはrsyncを用いる
  • remoteのOSはDebian 10 Buster

remote

rsyncを入れておく。

sudo apt-get install rsync

なおsshを用いた鍵認証を使っているが、そのあたりの設定はググるとたくさんあるので省略。

local

関連するものをHomeBrewでガバっとinstall。

brew install rsync lsyncd lua

luaはlsyncdの設定ファイルがluaで記述できるとのことで、とりあえず入れておいた。

なおこちらもsshでの鍵認証のやり方の詳細は省略する。

~/.lsyncd というフォルダを作り、そこにlsync.conf.lua というファイルを設置。

settings {
  logfile = "/tmp/lsyncd.log",
  statusFile = "/tmp/lsyncd.status",
  insist = true,
  nodaemon = true,
  statusInterval = 10,
  maxProcesses = 1,
}

sync {
  default.rsyncssh,
  delete = true,
  delay = 0,
  source = "/Users/ginkouno/project/awesome",
  host = "192.168.0.111",
  targetdir = "project",
  rsync = {
    binary = "/usr/local/bin/rsync",
    archive = true,
    compress = true,
    rsh = "/usr/bin/ssh -i /Users/ginkouno/.ssh/id_rsa -l ginkouno"
  }
}
  • Default Configはrsync接続、ssh key認証のためにdefault.ryncssh を指定しましたが、他の指定をする場合はsync の中での記載方法がだいぶ変わるので、それっぽいoptionを突っ込んで悩んだりせずにmanualを見るのが良いです(反省)

Lsyncd - Config Layer 4: Default Config

  • binary の指定ですが、これを指定しないと、元からinstallされている古〜い/usr/bin/rsyncを掴んで下記のようなエラーが起きてしまうことがあるため、先の手順にてHomeBrewでinstallした/usr/loca/bin/rsync を指定しておきます
    • ↓こんなエラーが出ることがある
rsync: -stl: unknown option
rsync error: syntax or usage error (code 1) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-52.200.1/rsync/main.c(1337) [client=2.6.9]
  • rsh ではssh接続時のコマンドラインの一部を記載しておきます。今回は鍵認証のために-iで鍵ファイルを、またremote側にはginkounouserでログインしたいので-loptionでuser nameを指定しています

実行

sudo lsyncd .lsyncd/lsync.conf.lua

これで、MacBook側のeditorでソースコードを編集しつつ、NUC上のdockerでテスト!などを行うための土台ができた。(なおdockerを動かす際には、remoteにsshでloginして動かすことを想定)

皆さんも潤沢なメモリを積んだLinuxマシンで、dockerをドッカ〜ンと動かしましょう。