地方でリモートワーク

プログラミング、先物、fx,仮想通貨なんでもやります

backupとwheneverで自動バックアップ設定の方法

スポンサーリンク

f:id:ihatov08:20160927180515j:plain

まだ本番サーバーは立てていないのですが、本番環境でもほぼ同じなので、開発サーバーでbackup gemとwheneverの設定をしました。

今回の仕様

  • mysqlのデータベースバックアップ
  • Railsのcarrierwaveでpublic/uploads以下に保存してある画像ファイルのバックアップ
  • バックアップはローカルに保存(ローカル=開発サーバー)
  • wheneverで朝5:00にバッチ処理でバックアップするようにする

gem backup

github.com

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日と半分くらいかかりました! 特にディレクトリバックアップはサブディレクトリしか対象にならないことに注意してください!