社長BLOG
Linuxサーバ、Dropboxバックアップの黒魔術
- 2010-12-22 (水)
- 社長BLOG
※反響が大きければ追記します。@tejimaに連絡下さい。
プライベートでLinuxサーバをいくつも借りている。
こういうサーバのバックアップが一番困る。お金も手間もかけられない。
信頼性は商用レベルまで行かなくても、とにかくお金がかからず、お手軽なバックアップの仕掛けを完成させたい。
コンセプトは
・流行りのクラウド
・お手軽
・ローコスト、できればタダ
クラウドファイル共有といえばDropbox。これをうまいことLinuxサーバのバックアップに使えないだろうか?
DropboxはちょうどVer1.0正式版になったところだし、チャレンジしてみよう。
全体のイメージ
ServerA ServerB2つのLinuxサーバにバックアップ専用のユーザ(backup)を作成し、
backupユーザーにたいして、Dropboxをそれぞれインストール。
ファイルとデータベースをbackupユーザーのDropboxディレクトリに定期的に上書き保存されるようにし、
Dropboxのクラウド上に転送する。
このように構成はいたってシンプル。
手順1:Linux版Dropboxのセットアップ
GUIを使わないCLI版Dropboxをセットアップする。
差分バックアップがついた2GBの無料ストレージがもらえるので、個人目的としてはかなりの量のバックアップがこなせる。
手順2:Linuxサーバのバックアップファイルづくり
バックアップを取るべきディレクトリとデータベースを圧縮し、ひとつのファイルになるようにシェルスクリプトを書く。
tar cvfz /home/backup/Dropbox/ServerA.com/allfiles.tar.gz /var/www/OpenPNE
mysqldump -u xxxx -p xxxx –default-caracter-set=utf8 -A | gzip -9 > /home/backup/Dropbox/ServerA.com/alldatabases.sql.gz
このような書き方になる。
手順3:CRONでデイリーバックアップが取られるように設定
crontabを編集し、ファイル、データベースが /home/backup/Dropbox/sitename以下に毎日上書きされるように設定する。
10 4 * * * sh /home/backup/Dropbox/ServerA.com/backup.sh
手順3:SelectiveSync 別のサーバのバックアップが転送されないようにする
デフォルトではDropboxは全サーバのすべてのファイルを共有しようとする。
複数サーバのバックアップを取りたいときは、SelectiveSync機能を使って、別サーバは除外されるようにしよう。
./dropbox.py exclude コマンドを使う。
手順4:バックアップ状況の確認
正しくバックアップが取れている。
Dropboxは無料プランでも30日の世代バックアップをとってくれるので、同一のファイル名にして上書き保存すれば、この写真のように世代バックアップをきっちり取ってくれる。
※反響が大きければ追記します。@tejimaに連絡下さい。
【OP3TIPS】イベントフックの方法
- 2010-06-23 (水)
- 社長BLOG
※自分の技術メモとして
OpenPNE3では、取り付けるプラグイン側からOpenPNE本体の挙動を変えることができるようになる。
その中でも便利だと思うのがイベントフック。
たとえば、
・日記が書かれたらメールで通知したい
・メンバーが参加したら紹介文を書きたい
・退会したら連動して外部のデータも削除したい
こんな拡張をしたいとする。
Ver3からは、プラグインを追加することでこうしたイベントが発生する前後にフックをかけ、機能を付け足すことができるようになる。
それもOpenPNE3本体のソースコードをいじらずに。
本体のソースをいじらないということは、OpenPNEのバージョンアップに追従するカスタマイズが可能ということ。
さて、イベントフックの方法だが、これがかなり簡単。
以下のサンプルでイメージがつかめるのではないか?
$this->dispatcher->connect(‘op_action.post_execute_communityTopicComment_create’,’func_a’);
// communityTopicComment モジュールの create アクション のpost_execute (実行後フック)
function func_a(sfEvent $event){
$request = $event[‘actionInstance’]->getRequest();
$p = $request->getParameter(‘xxxx’);
}
OpenPNE3のこの部分を見れば、イベント名がどのように命名されているかがわかる。
http://github.com/openpne/OpenPNE3/blob/master/lib/filter/opExecutionFilter.class.php#L47
symfonyのイベント機構を採用しているので、本家の詳しい解説が参考になる。
http://www.symfony-project.org/reference/1_4/ja/15-Events