monolithic kernel

Dropboxをサーバにインストールして簡単自動バックアップ

DropboxというとクライアントのPCにインストールして使うものというイメージがあると思いますが、サーバにインストールしてサーバ上のファイルをバックアップするのに使うのも便利です。この記事では、個人で使うVPSなどで自動バックアップにDropboxを使う方法を説明します。

今回やること

  • Dropboxのインストール
  • 定期的な自動バックアップの設定

Dropboxのインストールでは、GUIのないCLI環境にDropboxをインストールし、操作できるようにします。

定期的な自動バックアップの設定では、シェルスクリプトとcronを用いて自動的にバックアップが作成されるようにします。また、MySQL、GitおよびSubversionを例にバックアップを行ってみます。

環境

この記事の内容はUbuntu Server 10.04の環境で確認しました。

Dropboxのインストール

インストール部分はほぼこちらのままの方法で行いました。

ダウンロード

バイナリが公開されているのでダウンロードして展開するだけでインストールできます。

cd ~
wget -O dropbox.tar.gz http://www.dropbox.com/download/?plat=lnx.x86 # 32bit
#wget -O dropbox.tar.gz http://www.dropbox.com/download/?plat=lnx.x86 # 64bit
tar -zxof dropbox.tar.gz

起動

これだけでは自動的に起動する状態ではありませんが、初回は認証が必要なので手動で起動します。

~/.dropbox-dist/dropboxd

しばらくすると以下のようなメッセージが表示されるので、ブラウザでメッセージで示されたURLにアクセスします。アクセスするのは他のマシンからでOKです。

LAN Syncの無効化

DropboxにはLAN内のマシンとP2Pで同期する機能が実装されており、デフォルトで有効になっています。この機能はVPSでは意味が無いだけでなく、ほかのマシンに対してUDPのパケットを送信し続けるという問題があるため、無効化しておきます。

wget http://dl.dropbox.com/u/340607/dropbox_set_lansync.py
wget http://dl.dropbox.com/u/340607/pyDropboxValues.py
python dropbox_set_lansync.py off

起動スクリプトの配置

起動や終了を行うためのスクリプトを用意します。

sudo vi /etc/init.d/dropbox
sudo chmod +x /etc/init.d/dropbox
sudo update-rc.d dropbox defaults
sudo service dropbox start

DROPBOX_USERSには利用するユーザをスペース区切りで記述します。

# dropbox service

DROPBOX_USERS="user1 user2"
DAEMON=.dropbox-dist/dropbox

start() {
  echo "Starting dropbox..."
  for dbuser in $DROPBOX_USERS; do
    HOMEDIR=$(getent passwd $dbuser | cut -d: -f6)
    if [ -x $HOMEDIR/$DAEMON ]; then
      HOME="$HOMEDIR" start-stop-daemon -b -o -c $dbuser -S -u $dbuser -x $HOMEDIR/$DAEMON
    fi
  done
}

stop() {
  echo "Stopping dropbox..."
  for dbuser in $DROPBOX_USERS; do
    HOMEDIR=$(getent passwd $dbuser | cut -d: -f6)
    if [ -x $HOMEDIR/$DAEMON ]; then
      start-stop-daemon -o -c $dbuser -K -u $dbuser -x $HOMEDIR/$DAEMON
    fi
  done
}

status() {
  for dbuser in $DROPBOX_USERS; do
    dbpid=$(pgrep -u $dbuser dropbox)
    if [ -z $dbpid ] ; then
      echo "dropboxd for USER $dbuser: not running."
    else
      echo "dropboxd for USER $dbuser: running (pid $dbpid)"
    fi
  done
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart|reload|force-reload)
    stop
    start
    ;;
  status)
    status
    ;;
  *)
    echo "Usage: /etc/init.d/dropbox {start|stop|reload|force-reload|restart|status}"
    exit 1
    ;;
esac

exit 0

操作スクリプトのインストール

ここまでで~/Dropbox以下が勝手に同期される環境が構築できましたが、状態を確認したり設定することができません。そこで、操作用のスクリプトをインストールします。以下の例では~/binに置いていますが、適当にパスの通ったところに置いてください。

cd ~
mkdir bin
cd bin
wget -O dropbox.py http://www.dropbox.com/download?dl=packages/dropbox.py
chmod +x dropbox.py

同期するディレクトリの設定

Dropboxには同期するディレクトリを指定する機能があるので、容量に限りのあるVPSなどでも無駄にディスク領域を奪われることはありません。同期の対象を操作するときはdropbox excludeコマンドを利用します。

以下の例では、dropbox exclude addコマンドを利用してサーバに置く必要のないディレクトリを同期の対象から外しています。

cd ~/Dropbox
dropbox exclude add documents
dropbox exclude add photos

他にも同期対象を設定するコマンドとして以下のようなものが利用可能です。

# 除外ディレクトリ一覧を表示
dropbox exclude list

# 除外ディレクトリのリストに追加
dropbox exclude add ディレクトリ名

# 除外ディレクトリのリストから削除
dropbox exclude remove ディレクトリ名

定期的な自動バックアップの設定

~/Dropboxディレクトリ以下にバックアップしたいファイルを置けばとりあえずバックアップできますが、手作業でやるのはあり得ないので自動化します。

バックアップを行うスクリプト

今回は日付をファイル名としてバックアップを作成していき、ある程度古くなったら削除するようにします。

スクリプトの雛形は以下のようになります。コメントの部分でバックアップファイルを生成し、その後更新日時が古いファイルをfindコマンドで探して削除しています。

Dropboxには履歴管理の機能もあるので、単純に上書きしていけば問題なかったですね。

ただ、直接Dropboxのディレクトリに出力してしまうとファイルが作成された瞬間のファイルサイズ0の状態が履歴に残ってしまうので、まず/tmp以下に出力してからDropboxの管理下に移動するようにしています。

cd /path/to/backup
vi backup.sh
chmod +x backup.sh
#!/bin/sh

backup_dir=/home/mono/Dropbox/backup
backup_file=backup.tar.gz

cd /path/to/target
tar cfz /tmp/$backup_file *
mv /tmp/$backup_file $backup_dir

MySQLデータベースのバックアップ

MySQLのデータベースをバックアップする方法はいくつかありますが、小規模なデータベースであればmysqldumpコマンドを利用するのが簡単なようです。

cd /path/to/backup
vi mysql.sh
chmod 700 mysql.sh
#!/bin/sh

backup_dir=/home/mono/Dropbox/backup/mysql
backup_file=mysql.sql.gz

mysqldump -uroot -pパスワード --opt --all-databases | gzip > /tmp/$backup_file
mv /tmp/$backup_file $backup_dir

パスワードを書き込む必要があるのが気になるので、一応パーミッションを700にして他のユーザに読まれないようにしています。もっとよい方法があれば教えていただけるとうれしいです。

Gitリポジトリのバックアップ

Gitのリポジトリはtarで固めるだけでバックアップできます。

cd /path/to/backup
vi git.sh
chmod +x git.sh
#!/bin/sh

backup_dir=/home/mono/Dropbox/backup
backup_file=gitrepos.tar.gz
repos_dir=/path/to/gitrepos

cd $repos_dir
tar cfz /tmp/$backup_file *
mv /tmp/$backup_file $backup_dir

Subversionリポジトリのバックアップ

Subversionのリポジトリはsvnadmin dumpコマンドでダンプすることでバックアップできます。

#!/bin/sh

backup_dir=/home/mono/Dropbox/backup
backup_file=svnrepos.dump.gz
repos_dir=/path/to/svnrepos

svnadmin dump --quiet $repos_dir | gzip > /tmp/$backup_file
mv /tmp/$backup_file $backup_dir

cronの設定

最後に、作成したスクリプトが定期的に自動実行されるよう設定します。以下の例では4時ちょうどにMySQL、5分後にGit、さらに5分後にはSubversionのバックアップを実行するように設定しています。

crontab -e
0 4 * * * /path/to/mysql.sh 2>&1
5 4 * * * /path/to/git.sh 2&>1
10 4 * * * /path/to/subversion.sh 2>&1

参考

追記

  • 2010/04/01
    • 削除するファイルがないときにrmコマンドがエラーになるので、xargsの引数に—no-run-if-emptyを追加してrmコマンドが実行されないように変
    • LAN Syncの無効化について追記
  • 2010/04/02
    • 履歴管理部分が不要だったため削除