まだ本番サーバーは立てていないのですが、本番環境でもほぼ同じなので、開発サーバーでbackup gemとwheneverの設定をしました。
今回の仕様
- mysqlのデータベースバックアップ
- Railsのcarrierwaveでpublic/uploads以下に保存してある画像ファイルのバックアップ
- バックアップはローカルに保存(ローカル=開発サーバー)
- wheneverで朝5:00にバッチ処理でバックアップするようにする
gem backup
目次
sshでサーバーにログインする
backup gemはGemfileに書かず、ローカルで直接gem install backup
するのがお作法のようです。依存関係がややこしいみたいです。
$ ssh ユーザー名:IPアドレス -p ポート番号(大抵は22)
backupのインストール
[root@hoge]# $ gem install backup
バックアップファイルの作成
設定ファイルを作成します。generaterがあるので、Documentationに習って打ち込んでいきます。
Getting Started · Backup Documentation
[root@hoge]# backup generate:model --trigger my_backup --databases="mysql" --storages="local" --compressor="gzip" # my_backupは任意の名前をつける # 2つのファイルが生成される。 Generated configuration file: '/root/Backup/config.rb'. Generated model file: '/root/Backup/models/my_backup.rb'.
これでmy_backup.rbとconfig.rbファイルが生成されます。
主にmy_backupファイルをいじっていくことになります。
設定ファイルに記述
設定ファイルを記述していきます。
今回はデータベースバックアップと画像ファイルバックアップを1つのファイルに記述してみました。これで つの.tarにバックアップされます。それぞれでファイルを分けても問題ないです。
mysqlの設定はRailsアプリのconfig/database.yml
を見ればわかります。
portがわからない時は
$ nmap IPアドレス
と打ち込めば表示されます。
command not foundとなる場合は
$ yum install nmap
socketがわからない時は
ps ax | grep mysqld
と打ち込めばわかります。
画像ファイルのバックアップはarchive :my_archive do |archive| end
ブロックの中にarchive.add ファイル名orディレクトリ名
と記載すると指定したファイル、もしくはディレクトリがバックアップ対象になります。
注意することは、ディレクトリを指定した場合に、指定したディレクトリならびにサブディレクトリしか対象にならないということです。
今回、rails_root/public/uploads以下のすべてのディレクトリと画像ファイルをバックアップ対象にしたいのです。
そのため、RubyのDir.globメソッドでディレクトリを検索しています。
*2回で動的にファイル名を取得できるようにしています。
直接文字列で指定してしまうと、新たにcarrierwaveで保存するモデルを追加した時に、この設定ファイルにも新たに記述しなくてはいけなくなります。
そのため、このように動的にしています。
ローカル保存の設定はbackupsディレクトリに最新5つが保存されるようにしています。これをローカルではなく、外部ストレージサービスに保存することもできます。
ruby
store_with Local do |local|
local.path = "~/backups/"
local.keep = 5
# local.keep = Time.now - 2592000 # Remove all backups older than 1 month.
end
今回、.gzで圧縮するように設定しました。
.bz2に最初設定していたのですが、圧縮に時間がかかるため変更しました。
# Gzip [Compressor]
compress_with Gzip
そして今回はslackにバックアップ結果を通知するように設定しました。
slackのwebhook_urlの取得は以下urlから可能です。
https://slack.com/services/new/incoming-webhook
notify_by Slack do |slack| slack.on_success = true slack.on_warning = true slack.on_failure = true slack.webhook_url = 'slackのwebhook_urlを入力' end
# encoding: utf-8 ## # Backup Generated: my_backup Model.new(:my_backup, 'Description for database_and_image_backup') do # MySQL [Database] database MySQL do |db| # To dump all databases, set `db.name = :all` (or leave blank) # railsアプリディレクトリのconfig/database.yml参照 db.name = "データベース名" db.username = "データベースユーザー名" db.password = "データベースパスワード" db.host = "データベースホスト" db.port = データベースポート番号 db.socket = "/var/lib/mysql/mysql.sock(ソケットの場所)" db.additional_options = ["--quick", "--single-transaction"] end # ImageArchive [rails_root/public/uploads] archive :my_archive do |archive| Dir.glob('current/public/uploads/*/*').each do |f| archive.add "#{f}" end end store_with Local do |local| local.path = "~/backups/" local.keep = 5 # local.keep = Time.now - 2592000 # Remove all backups older than 1 month. end # Gzip [Compressor] compress_with Gzip notify_by Slack do |slack| slack.on_success = true slack.on_warning = true slack.on_failure = true slack.webhook_url = 'slackのwebhook_urlを入力' end end
設定ファイルのチェック
$ backup check
このコマンドでbackupファイルのスペルミスなどのチェックを行えます。
バックアップコマンド
$ backup perform --trigger my_backup
このコマンドでバックアップを行うことができます。
wheneverの設定
バックアップを自動化したいのでgem wheneverを使います。
Gemfile
gem 'whenever', require: false
$ bundle install
設定ファイルを作成します。
$ wheneverize . [add] writing `./config/schedule.rb' [done] wheneverized!
これでconfig/schedule.rbが作成されます。
今回は毎日朝、5時にバックアップを実行したいと思います。
# config.schedule.rb every 1.day, :at => '5:00 am' do command 'backup perform --trigger database_backup' end
バックアップファイルがちゃんと生成されているか確認
ちゃんとバックアップファイルが生成されているか開発サーバーからvagrantにファイルをコピーして実行してみたいと思います。
ファイルをコピー
[vagrant@localhost ~]$ scp ユーザー名@IPアドレス:/root/backups/my_backup/タイムスタンプ/my_backup.tar /home/vagrant(コピーする場所を指定) # passwordを入力する
.tarを展開するコマンドはtar xvf ファイル名.tar
開発サーバーのDBをリセット
$ rake db:migrate:reset
.tarファイルを展開するとmy_backup/databases/MySQL.sql
が作成されるはずです。
このファイルを適用します。
[vagrant@localhost databases]$ mysql -u データベースユーザー名 -p 適用したいデータベース名 < /home/vagrant/my_backup/databases/MySQL.sql
画像ファイルはarchivesディレクトリが.tarを展開した際に生成されているはずです。これをvagrant上のrailsアプリに適用します。
Pオプションでpathも適用されるので、Railsアプリのpublic/uploads以下に自動で反映されます。
tar xvzPf my_archive.tar.gz
これでbackup設定と確認が終わりました!
1日と半分くらいかかりました!
特にディレクトリバックアップはサブディレクトリしか対象にならないことに注意してください!
コメントを残す