HOME / コンピュータTips / MacOSX / MacでWebDAVサーバに自動バックアップ(ファイル同期)する方法

Date: 2015/01/03 |  このエントリーをはてなブックマークに追加  |  Tags: MacOSX, webdav_sync, WebDAV, 自動同期

MacでWebDAVサーバに自動バックアップする方法

MacでWebDAVサーバに自動バックアップする方法を考えて見ました。どんなWebDAVサーバに対してもできるので、自宅サーバやVPSにWebDAVサーバを建てて使うことができますが、ここでは弊社、JUSTPLAYERが誇る高速WebDAVストレージクラウドでもある、Teraクラウドでテストしてみました。

※2015年1月4日現在、Teraクラウドでは、100G無料キャンペーンをやっているので、やってみたい方はチケットゲットして100G無料貰ってHOMEをバックアップしても良いかもしれません。

プログラムは、先日紹介したWebDAV-Syncを使います。わかる人には先日の記事だけで自動同期ができますが、OSXならではのlaunchdを使って、ちょっとエレガントにインストールしてみます。

WebDAV-syncのconfig作成

コマンドラインからWebDAV-syncが動くようにせねばなりません。

最初に、WebDAV-Syncをダウンロードします。

最新版のjarファイルをダウンロードしたら、次の様に実行します。

% java -jar  ~/Downloads/webdav_sync1_1_4.jar -h
be.re.webdav.cmd.Sync [-h] [-i seconds] [-reset] (-c config_file | [(-r|-no-recursion)] [-rename] [-rename-depth number] [-hidden-folder] [-e comma_separated_patterns] (-down|-up|-bi) -u URL -d directory)

無事、ヘルプが出てきています。

次に、launchctl用のファイルや、同期用のconfigファイル一式をアーカイブしたものをtarで固めておいたので、これをダウンロードします。

このファイルは、自分のHOMEから展開します。

cd ~/
tar xvf ~/Downloads/jp.teracloud.webdav-sync1_1_4_jp1.tar.bz2

すると、次の様なファイルが展開されます。

x Library/
x Library/Application Support/
x Library/LaunchAgents/
x Library/LaunchAgents/jp.teracloud.webdav-sync.plist
x Library/Application Support/jp.teracloud.webdav-sync/
x Library/Application Support/jp.teracloud.webdav-sync/webdav_sync.plist-dist
x Library/Application Support/jp.teracloud.webdav-sync/webdav_sync1_1_4_jp1.jar

ここに、先ほどダウンロードした、webdav_sync1_1_4.jarをコピーします。

cd ~/Library/Application\ Support/jp.teracloud.webdav-sync/
cp ~/Downloads/webdav_sync1_1_4.jar .
ln -s webdav_sync1_1_4.jar webdav_sync.jar

次にエディタで、Library/Application Support/jp.teracloud.webdav-sync/webdav_sync.plist-distを開き、Library/Application Support/jp.teracloud.webdav-sync/webdav_sync.plistという名前で、セーブします。

次の様なファイルになっているので、日本語の箇所を自分のもの、自分のサーバに書き換えます。下記の例では、Documentsをバックアップすることになっています。複数列挙したい場合は、<sync>〜</sync>を複数羅列するとうまくいくでしょう。

<?xml version="1.0"?>
<config>
   <sync>
    <directory>/Users/あなたのユーザ名/Documents/</directory>
    <url>https://テラクラウドのユーザ名:パスワード@収容サーバ名.teracloud.jp/dav/Documents/</url>
    <direction>up</direction>
    <!-- Optional ACL for upload. -->
    <acl xmlns="DAV:">
      <ace>
        <principal><authenticated/></principal>
        <grant>
          <privilege><read/></privilege>
        </grant>
      </ace>
    </acl>
    <exclude>^\.DS_Store$</exclude>
    <exclude>^\.DocumentRevisions-V100</exclude>
    <exclude>^\.TemporaryItems$</exclude>
    <exclude>^core$</exclude>
    <exclude>^.*\~$</exclude>
    <exclude>^\#</exclude>
    <exclude>^\.\#</exclude>
    <exclude>^\#.*\#$</exclude>
    <exclude>^\.Trashes$</exclude>
    <exclude>^\.csync</exclude>
    <hidden-folder-name>.Hidden</hidden-folder-name>
    <!-- The following two are mutually exclusive. -->
    <!-- recursive/ -->
  </sync>
</config>

ここで動作テストをかねて、最初の同期をしてみます。

テストは途中で止めても良いのですが、最初の1発目の同期なので一気に最後までやってしまった方が良いでしょう。データ容量に見合う、太く従量制ではない回線を用意して下さい。

% java -jar ~/Library/Application\ Support/jp.teracloud.webdav-sync/webdav_sync.jar -c ~/Library/Application\ Support/jp.teracloud.webdav-sync/webdav_sync.plist
〜ログはファイルがいっぱい出てくるだけなので割愛〜

最後まで動いたことを確認し、プロセスが終了したことも確認しておきます。

launchdで常駐させる

ここまでできたら、自動的に実行するだけです。launchdを使って同期させます。利用したい一般ユーザで行います。

% launchctl load ~/Library/LaunchAgents/jp.teracloud.webdav-sync.plist

何も出てきませんが、これで自動実行が開始しています。次のようにすると、実際に動作する過程が見れるはずです。

% tail -f ~/Library/Logs/jp.teracloud.webdav-sync.err

※このtailは、いつでもctrl+cで止めて構いません。

launchctlに登録していることを確認したいときは、下記の様にタイプします。sudoしてはいけません。

launchctl list | grep teracloud
-	0	jp.teracloud.webdav-sync

次に、jp.teracloud.webdav-syncサービスを起動する方法です。

launchctl start jp.teracloud.webdav-sync

すると、次の様に起動されます。

launchctl list | grep teracloud
24960  -       jp.teracloud.webdav-sync

実際にプログラムが起動してるかどうかは、下記の様に確認できます。

ps -aef | grep java
1004 25095   233   0 12:38AM ??         0:12.78 /usr/bin/java -jar /Users/kohju/Library/Application Support/jp.teracloud.webdav-sync/webdav_sync.jar -i 300 -c /Users/kohju/Library/Application Support/jp.teracloud.webdav-sync/webdav_sync.plist

launchdのマニフェスト

~/Library/LaunchAgents/jp.teracloud.webdav-sync.plistは、次の様に書かれています。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>jp.teracloud.webdav-sync</string>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/bin/java</string>
                <string>-jar</string>
                <string>/Users/kohju/Library/Application Support/jp.teracloud.webdav-sync/webdav_sync.jar</string>
                <string>-i</string>
                <string>300</string>
                <string>-c</string>
                <string>/Users/kohju/Library/Application Support/jp.teracloud.webdav-sync/webdav_sync.plist</string>
        </array>
        <key>LowPriorityIO</key>
        <true/>
        <key>Nice</key>
        <integer>1</integer>
        <key>StandardOutPath</key>
        <string>/Users/kohju/Library/Logs/jp.teracloud.webdav-sync.out</string>
        <key>StandardErrorPath</key>
        <string>/Users/kohju/Library/Logs/jp.teracloud.webdav-sync.err</string>
        <key>KeepAlive</key><true/>
</dict>
</plist>

※このplistの書き方は、下記のコマンドで詳しく調べることができます。

man launchd.plist

この設定では、-cオプションにて、300秒に1度、daemon modeとして実行しています。webdav_syncは決して軽いプログラムではないので時間に1度ぐらいにしても良いかも知れませんね。

TimeMachineは、1時間に1度ぐらいしかコピーしませんしね。

ファイルのリストア方法

1つ1つのファイルが壊れてしまった時等、個別にバックアップから復元する必要がある場合は、なんらかのWebDAVのクライアント(例:CyberduckやTransmitなど)を使うことで、ファイルの取り出しができるでしょう。

また、Teraクラウドを利用している場合は、誤って削除されてしまった状態で同期されてしまった場合でも、サーバ側でスナップショットを残すので、Webからログインしてスナップショットから救出をすれば、1日以内なら3時間ごと、1週間以内なら1日ごとでデータの救出ができます。

マシンがクラッシュした時など、まるまるリストアしたいときは、次の様にすればリストアができるでしょう。

java -jar ~/Library/Application\ Support/jp.teracloud.webdav-sync/webdav_sync.jar -down -u https://ユーザID:パスワード@収容ホスト名.teracloud.jp/dav/Documents/ -d ~/Documents/

もちろん先に~/Documentsではなく、別のフォルダにダウンロードしておき、必要な物だけコピーすることもできます。

その他のこと・・・

このwebdav-syncは、1つのインスタンスしか実行できないようです。したがってwebdav-syncをlaunchdで実行しているときは、他の用途でwebdav-syncを使えません。ちなみに、起動中のインスタンスがあると、何も言わずすぐに終了します。これがまた、なんで動かなくなったのかわからなくて、結構焦ります(笑)。

 

また、webdav-syncは、問題があると「IOException」をだしてすぐに止まる設計思想?のようです。ファイル名に特殊キャラクタがあったり、ファイル名の長さだったり、様々な理由でサーバから正しくお断り(403:Forbidden)されると、IOExceptionしてプログラムが停止し、その先のファイルコピーを完全に諦めてしまいます。

これではバックアップ用途には都合が悪いので、そのファイルのアップロードにはWarningをだして諦め、先に進むようにパッチを当てました。

実は配布アーカイブにいれてあります。この意外にも、「別のwebdav-syncがロックしているので動かない」ときのエラーメッセージなど、気になるIOExceptionを拾うようにしておきました。

パッチ版を利用するには次のようにします。

cd ~/Library/Application\ Support/jp.teracloud.webdav-sync/
rm webdav_sync.jar
ln -s webdav_sync1_1_4_jp1.jar webdav_sync.jar

webdav_syncは双方向同期機能があるようです。webdav_sync.jarは私のプログラムではないので、正直、どういうメカニズムで動いてるか確認していません。双方向同期はリスクがかならずつきまとうので、有効にする方はご注意を。


そんなわけで、これさえ仕込んでおけば、たまに

% tail -f ~/Library/Logs/jp.teracloud.webdav-sync.err

を使って確認する程度で、WebDAVサーバにバックアップしてることを確認でき、とても便利です。WebDAVサーバなら、スマフォやタブレットに沢山のクライアントがあるので、そこから好きなものを使えばデータの閲覧も容易です。

もちろんTeraクラウドならば、これ以外にもファイル単位のデータの公開など、様々な機能がありますので、WebDAVサーバを自分用に作るのはちょっとしんどいなぁ・・・なんて思う方は、是非、Teraクラウドのアカウントを作ってみてくださいね。


teracloud.png