LinuxやFreeBSDのリモートサーバを自動的にバックアップする仕組みを構築したときのメモ。
- リモートサーバ上の特定ディレクトリを1日1回程度自動バックアップする。
- バックアップには tar を使う。
- 定期実行には crontab を使う。
- 手元のサーバにも、バックアップのコピーを自動で送り込む。
最初sftpを使おうと思ったのですが(参考資料)、ftpのようにputのみの許可にできないのでやめました。ftpでも良いのですが、今更(この時代に)ftpのサービスなんて起動したくない。
色々考えた結果。
- 手元サーバにWebDavを入れて、PUTメソッドでファイルを送り込む。
- 転送ファイルの秘匿が必要なときは暗号化する。
WebDav(HTTP PUT)を実行できるツールを探すのにひと苦労しました。cadaverというツールが有名なのですが、対話的プログラムなので自動化全く向かない。色々探していると、ndという小粒なツールを発見。ありがたいことです。
ファイルの暗号化には openssl コマンド。
リモートサーバ内にもバックアップを保存するので、古いバックアップを削除するためのツールとして tmpreaper(tmpwatchの代わり)を使用しました。
# apt-get install tmpreaper
# apt-get install nd
Apache に mod_dav と mod_dav_fs を入れました。
まず次のスクリプトを仕込み ~/bin/backup.sh として保存しました。
#!/bin/sh
#-------------------------------------------------------------------
# Automation backup script
#-------------------------------------------------------------------
TMPREAPER=/usr/sbin/tmpreaper
DIR=~/backup
DATE=`date '+%Y%m%d'`
FILE=$DATE-public_html.tar.gz
# 30日経過したファイルを削除
$TMPREAPER -m 30d $DIR
cd ~/
tar zcf $DIR/$FILE.tmp public_html/
# OpenSSLを使用してファイル暗号化
openssl enc -e -AES256 -k 'PASSWORD' -in $DIR/$FILE.tmp -out $DIR/$FILE
rm $DIR/$FILE.tmp
# 手元サーバに送り込む
nd -p $DIR/$FILE http://(local-server)/davput/$FILE
~/backup は chmod 700 としておきます。
自動実行させるため、crontab -e として組み込みます。
# m h dom mon dow command
0 4 * * * ~/bin/backup.sh
Debian系(Ubuntu)を前提として話しますが、他サーバの時は適当に読み替えてください。
まずWebDavを有効にします。
# cd /etc/apache2/mod-enable/
# ln -s ../mods-available/dav.load
# ln -s ../mods-available/dav_fs.load
# ln -s ../mods-available/dav_fs.conf
続いて dav_fs.conf を編集します。
Alias /davput /home/dav/davput
<Directory "/home/dav/davput">
DAV on
AllowOverride None
Options None
order deny,allow
deny from all
<Limit PUT>
order deny,allow
deny from all
allow from 127.0.0.1
allow from (リモートサーバのIP)
</Limit>
</Directory>
リモートサーバのIPに対してPUTのみを許可します。GETなどを許可するといらぬデータ盗用を招きかねないので注意。より強固にするならパスワードもかけると良いでしょう。
保存場所である /home/dav/davput を www 権限で書き込みできるようにしておきます。
# chmod 700 /home/dav/davput
# chown www-data:www-data /home/dav/davput
リモートサーバに入り、backup.sh を手動で叩きます。エラーがでず、手元サーバおよびバックアップディレクトリにアーカイブがおかれていれば成功です。
手元サーバにはバックアップファイルがたまり続けるので、定期的に削除するか、tmpreaperをcrontabに仕込むと良いでしょう。
tmpwatchを使おうとしたらそんなパッケージは無いと怒られたので。
debian系だと /usr/sbin/tmpreaper にたぶん入る。
# 最終更新日時で10秒経過したものを削除
$ /usr/sbin/tmpreaper -m 10s ~/dir
# 最終更新日時で10分経過したものを削除
$ usr/sbin/tmpreaper -m 10m ~/dir
# 最終更新日時で10時間経過したものを削除
$ usr/sbin/tmpreaper -m 10h ~/dir
# 最終更新日時で10日経過したものを削除
$ usr/sbin/tmpreaper -m 10d ~/dir
ndコマンドは VirtualHost に対応していない(Hostヘッダを送信しない)ので、curlに変更しました。
curl -s -X PUT -H "Host: example.com" -T $DIR/$FILE http://example.com/davput/$FILE >/dev/null