安心と安全を守る、簡単で良く効く方法。

サーバ機っていうのは様々な重要データを蓄えてる。開発中のシステムのレポジトリとか、Webアプリ上にポストされたデータとか。特にカケラの樹みたいなスタンドアロン・アプリケーションを置き換えるような類のWebアプリだと、ユーザ全ての文書データを一手に引き受けているわけでこれは死守する必要がある。
商用サービスならば高価なバックアップストレージを入れてたり、複数の機材で同期を取ったりとある程度コストを掛けて鉄壁の構えをしてるわけだけど、個人ベースでそれをやるには少し荷が重い。そこで考えたのがこれ。


使うのはBox.net。無償サービスで1GBのオンラインストレージを提供してくれる。
考え方は、以前に書いたオンラインストレージを使った安全なバックアップの方法とほぼ同じ。次のような簡単なスクリプトをサーバに合わせて書きます。

  1. 守りたいデータを1箇所に固める。"~/files"ディレクトリにコピーすることにします。
    • SVNレポジトリなら、svnadmin dump REPOS_PATH > ~/files/REPOS_NAME.dump
    • SQLite3データベースなら、echo '.dump' | sqlite3 /path/to/db.sqlite3 > ~/files/DB_NAME.dump
    • PostgreSQLデータベースなら、pg_dump DB_NAME > ~/files/DB_NAME.dump
  2. ~/filesをtarで固め、AESを掛けます。Box.netは最大ファイルサイズが10MBまでなので、収まるように分割までやっちゃいます。~/tempへ一時保存。
    • tar czf - ~/files/ | openssl aes-256-cbc -pass:PASSWORD | split -b 10000k - ~/temp/files.tar.gz.
  3. Box.netの自分のアカウントに転送。WebDAVサーバなので、次のように。
    • davfs2でマウントすればmvコマンドで転送OK。
    • ファイルシステムとしてマウントしなくても、WebDAVを喋れば転送できる。Rubyだとnet/httpで扱える。
      • BASIC認証なので、Net::HTTP::Putをnewした後でNet::HTTP::Put#basic_auth ユーザ名, パスワードとやればよい。
  4. 一時ファイルを消して出来上がり。

スクリプトが書けたら、crontabに記述して設置完了。
こうしておけば、自動的にバックアップがBox.netへ保管されることになる。外部にデータを吐き出すわけだけど、AESを掛けてあればよっぽどアホなパスワードを使わない限り問題はないでしょう。毎回全データを転送すると帯域が無駄なので、適宜diffを取るとかするといいね。


これでDCごと吹き飛んだとかいう場合でもデータはほぼ守られる。まさか自分のサーバとBox.netが一度にダメになるってことはないだろうから。