BackupライブラリでプロジェクトのバックアップもD.R.Y化しよう このエントリをはてなブックマークに登録

2010年08月23日

func09func09 / , , ,

はじめに

こんにちは芳賀@func09です。

何かプロジェクトをリリースする時、必ずといっていいほど必要なのはデータの定期バックアップですね。
必ずといっていいほど必要なのに、必ずといっていいほど忘れがちで、後回しにされがちで、
リリース前に「あ、バックアップのバッチ処理書かなきゃ・・」みたいな感じで、毎回同じようなシェルスクリプトを書いてませんか?僕はそんな感じです。

バックアップだってD.R.Y(Don’t repeat yourself)ということで、サクっと労力をかけずに終わらせたいなぁと思っていた時に見つけたのがBackupという名前のGemです。そのまんまですね。

Backup(RubyGem)とは?

Backuphttp://github.com/meskyanichi/backup )はRubyで書かれたUnixとRails環境のためのライブラリです。
データベースの内容をダンプして、gzで固めて、別のサーバに転送するような処理を、Rubyで書かれた設定ファイルを基に実行するためのものです。

Railsプロジェクトのバックアップにも使えますし、そうでないプロジェクトでも使えます。
バックアップ対象となるデータベースは、MySQLPostgreSQLSQLite、それからローカルのファイルやディレクトリ
バックアップ先は、AmazonS3SCPSFTPFTPといったリモートサーバ、あるいはローカルサーバです。
圧縮保管暗号化過去のバックアップのクリーニングといった処理、Eメールによる通知をサポートします。

インストールとセットアップ

BackupはRailsに限らず、Unix環境上のあらゆるプロジェクトに対応できますが、今回はRailsのプロジェクトをバックアップする場合を想定して説明させていただきます。

Backupはgemコマンドでインストールできます。

[cc lang='bash']
% gem install backup
[/cc]

config/environment.rbに追加する

[cc lang='ruby']
config.gem "backup"
[/cc]

ジェネレーターコマンドを実行する

[cc lang='bash']
% ./script/generate backup
[/cc]

以下のファイルが生成される。

[cc lang='bash']
db/migrate/create_backup_tables
config/backup.rb
lib/tasks/backup/backup.rake
[/cc]

データベースをマイグレートする

[cc lang='bash']
% rake db:migrate
[/cc]

backupテーブルが作成される。

ここまででセットアップは終わりです。

設定ファイル

先ほどの作成された、config/backup.rb というファイルを編集してバックアップの設定を用意します。

[cc lang='ruby']
backup 'mysql-backup-s3' do
adapter :mysql do
user 'user'
password 'password'
database 'database'
end
storage :s3 do
access_key_id 'access_key_id'
secret_access_key 'secret_access_key'
bucket '/bucket/backups/mysql/'
use_ssl true
end
keep_backups 25
encrypt_with_password 'my_password'
notify true
end

backup 'archive-backup-ftp' do
adapter :archive do
files ["#{RAILS_ROOT}/log", "#{RAILS_ROOT}/public/system"]
end
storage :ftp do
ip 'example.com'
user 'user'
password 'password'
path '/var/backups/archive/'
end
keep_backups 10
encrypt_with_password false
end
[/cc]

設定ファイルの中身はRubyのDSLで記述します。
設定ファイルの記述の仕方はこちらのWikiに詳しく書いてあります。

backup トリガー名 do ... end のブロックの中で、adapter(バックアップ対象)、strage(バックアップ保管先)などを設定します。

ひとつの設定ファイルの中に、複数のバックアップを定義することが可能です。

上記の例では、MySQLのダンプをS3に保存する設定と、Railsのログファイルやアップロードファイル(通常public/system)をFTPに保存する設定の2種類を用意しました。

バックアップの実行

用意した設定ファイルを使って、バックアップを実行する場合、rake backup:run コマンドをtriggerオプションつきで叩きます。トリガー名は、設定ファイルのbackup 'mysql-backup-s3' do .. end の文字列の部分です。

[cc lang='bash']
% rake backup:run trigger=mysql-backup-s3
[/cc]

cron登録

毎朝04:30に定期的にバックアップを取る場合、下記のような感じで登録します。

[cc lang='text']
30 4 * * * cd /path/to/app && RAILS_ENV=production /usr/bin/env rake backup:run trigger='mysql-backup-s3' >> /path/to/app/log/cron.log 2>&1
[/cc]

Whenever & Capistrano との組み合わせ

定期バックアップのCRON登録までをプロジェクトのコードの中に含めて管理し、デプロイ時に自動的にCRONをセットするようにしたい場合は、CapistranoとWhenever( http://github.com/javan/whenever )の組み合わせがよろしいです。

Wheneverは定期的な処理をRubyのDSLで記述して、CRONへの登録・削除を管理してくれるGemです。

[cc lang='ruby']
every 1.day, :at => '4:30 am' do
rake "backup:run trigger='my-backup-trigger' "
end
[/cc]

このような設定ファイルを用意しておくと、先ほどのCRONと同じタスクの登録がデプロイ時に自動的に行われます。

設定方法などはこちらをご覧ください。

http://wiki.github.com/meskyanichi/backup/capistrano-whenever

設定ファイルもう少しくわしく

設定ファイルの各オプションの説明

encrypt_with_password(暗号化)

バックアップしたファイルを暗号化する場合は

[cc lang='ruby']
backup "my-trigger" do
encrypt_with_password "my-secret-password"
end
[/cc]

のようにします。「my-secret-password」は暗号化用のパスワードです。バックアップしたファイルをデコードする場合、

[cc lang='bash']
sudo backup --decrypt /path/to/my-backup-file.gz.enc
[/cc]

この後のプロンプトでパスワードを入力します。

暗号化したくない場合は、encrypt_with_password オプションを設定しないか、falseを設定します。

[cc lang='ruby']
backup "my-trigger" do
encrypt_with_password false
end
[/cc]

keep_backups(バックアップファイルをキープする数)

ストレージにバックアップをいくつまで溜めておくか設定する場合は、keep_backupsオプションを設定します。

[cc lang='ruby']
backup "my-trigger" do
keep_backups 25
# OR
keep_backups :all
end
[/cc]

整数値(integer)もしくは :all が設定できます。

notifier_settings(Eメール通知)

バックアップの通知をEメールで受け取りたい場合はnotifyオプションとnotifier_settingsブロックの設定をします。

[cc lang='ruby']
backup "my-trigger" do
notify true
# OR
notify false
end
[/cc]

通知する or 通知しない

[cc lang='ruby']
notifier_settings do

to "example1@gmail.com"
from "example2@gmail.com"

smtp do
host "smtp.gmail.com"
port "587"
username "example1@gmail.com"
password "example1password"
authentication "plain"
domain "localhost.localdomain"
tls true
end

end
[/cc]

メールの送信先、SMTPサーバの設定。

バックアップ対象の設定

バックアップ対象(Adapter)の設定方法。

MySQL

[cc lang='ruby']
backup "my-trigger" do
adapter :mysql do
user 'user'
password 'password'
database 'database'
skip_tables ['table1', 'table2', 'table3']
options do
host '123.45.678.90'
port '80'
socket '/tmp/socket.sock'
end
additional_options '--single-transaction --quick'
end
end
[/cc]

PostgreSQL

[cc lang='ruby']
backup "my-trigger" do
adapter :postgresql do
user 'user'
database 'database'
skip_tables ['table1', 'table2', 'table3']
options do
host '123.45.678.90'
port '80'
socket '/tmp/socket.sock'
end
additional_options '--clean --blobs'
end
end
[/cc]

アーカイブ

アーカイブしたいファイル、ディレクトリを files オプションに対して、文字列または配列で設定できます。

[cc lang='ruby']
backup "my-trigger" do
adapter :archive do
files "#{RAILS_ROOT}/log"
# OR
files ["#{RAILS_ROOT}/log", "#{RAILS_ROOT}/public/assets"]
end
end
[/cc]

バックアップ先

Amazon S3

[cc lang='ruby']
backup "my-trigger" do
storage :s3 do
access_key_id 'access_key_id'
secret_access_key 'secret_access_key'
bucket '/bucket/backups/'
use_ssl true
end
end
[/cc]

SCP

[cc lang='ruby']
backup "my-trigger" do
storage :scp do
ip 'example.com'
user 'user'
password 'password'
path '/var/backups/'
end
end
[/cc]

SFTP

[cc lang='ruby']
backup "my-trigger" do
storage :sftp do
ip 'example.com'
user 'user'
password 'password'
path '/var/backups/'
end
end
[/cc]

FTP

[cc lang='ruby']
backup "my-trigger" do
storage :ftp do
ip 'example.com'
user 'user'
password 'password'
path '/var/backups/'
end
end
[/cc]

さいごに

今回はプロジェクトのバックアップをサポートするBackupを紹介しました。

Backupのほかにも、Safe(http://github.com/astrails/safe)という同じ目的のライブラリもあり、こちらはより細かい制御が可能のようでしたが、設定ファイルがシンプルなBackupの方を採用しています。

バックアップ処理はそんなに難しいもんじゃないのだから、なにもこんなツール使わなくても・・と思う方もおられることと思いますが、個人的にはバックアップの設定から定期実行の設定から、デプロイ時の設定まで全部プロジェクト配下に置いて、バージョン管理できるわかりやすさが気に入っています。

  1. メモからはじめる情報共有 DocBase 無料トライアルを開始
  2. DocBase 資料をダウンロード

「いいね!」で応援よろしくお願いします!

このエントリーに対するコメント


トラックバック
  1. WEBデザイン Tips2011/05/20, 3:18 PM

    RailsアプリのMySQL、PostgreSQLを自動バックアップ

    Railsで運用中のデータベース(MySQL、PostgreSQL)をwhenever + backupを使ってcronでバックアップする。

we use!!Ruby on RailsAmazon Web Services

このページの先頭へ