March 31, 2011
DropboxというとクライアントのPCにインストールして使うものというイメージがあると思いますが、サーバにインストールしてサーバ上のファイルをバックアップするのに使うのも便利です。この記事では、個人で使うVPSなどで自動バックアップにDropboxを使う方法を説明します。
Dropboxのインストールでは、GUIのないCLI環境にDropboxをインストールし、操作できるようにします。
定期的な自動バックアップの設定では、シェルスクリプトとcronを用いて自動的にバックアップが作成されるようにします。また、MySQL、GitおよびSubversionを例にバックアップを行ってみます。
この記事の内容はUbuntu Server 10.04の環境で確認しました。
インストール部分はほぼこちらのままの方法で行いました。
バイナリが公開されているのでダウンロードして展開するだけでインストールできます。
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です。
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のデータベースをバックアップする方法はいくつかありますが、小規模なデータベースであれば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のリポジトリは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のリポジトリは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
最後に、作成したスクリプトが定期的に自動実行されるよう設定します。以下の例では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