monolithic kernel

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

March 31, 2011

    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 # 64bittar -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.pywget http://dl.dropbox.com/u/340607/pyDropboxValues.pypython dropbox_set_lansync.py off

    起動スクリプトの配置

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

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

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

    # dropbox serviceDROPBOX_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" instart)  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 1esacexit 0

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

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

    cd ~mkdir bincd binwget -O dropbox.py http://www.dropbox.com/download?dl=packages/dropbox.pychmod +x dropbox.py

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

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

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

    cd ~/Dropboxdropbox exclude add documentsdropbox exclude add photos

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

    # 除外ディレクトリ一覧を表示dropbox exclude list# 除外ディレクトリのリストに追加dropbox exclude add ディレクトリ名# 除外ディレクトリのリストから削除dropbox exclude remove ディレクトリ名

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

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

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

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

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

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

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

    cd /path/to/backupvi backup.shchmod +x backup.sh
    
    
    #!/bin/shbackup_dir=/home/mono/Dropbox/backupbackup_file=backup.tar.gzcd /path/to/targettar cfz /tmp/$backup_file *mv /tmp/$backup_file $backup_dir

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

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

    cd /path/to/backupvi mysql.shchmod 700 mysql.sh
    
    
    #!/bin/shbackup_dir=/home/mono/Dropbox/backup/mysqlbackup_file=mysql.sql.gzmysqldump -uroot -pパスワード --opt --all-databases | gzip > /tmp/$backup_filemv /tmp/$backup_file $backup_dir

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

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

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

    cd /path/to/backupvi git.shchmod +x git.sh
    
    
    #!/bin/shbackup_dir=/home/mono/Dropbox/backupbackup_file=gitrepos.tar.gzrepos_dir=/path/to/gitreposcd $repos_dirtar cfz /tmp/$backup_file *mv /tmp/$backup_file $backup_dir

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

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

    #!/bin/shbackup_dir=/home/mono/Dropbox/backupbackup_file=svnrepos.dump.gzrepos_dir=/path/to/svnrepossvnadmin dump --quiet $repos_dir | gzip > /tmp/$backup_filemv /tmp/$backup_file $backup_dir

    cronの設定

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

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

    参考

    追記

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