Nic Lin's Blog

喜歡在地上滾的工程師

如何使用 whenever 排程每天自動備份 Database 到 Dropbox 雲端

備份對於任何人都是需要的,難免會有不如預期的事情發生,機器說壞就壞,如果養成備份的好習慣,可以讓你免於意外發生的驚慌

備份就像幫你的程式買保險,在Rails上做其實很簡單!

初始化設定

首先請先進入正式端的機器,然後因為正式端已經掛載你的project production,理所當然你會有Ruby環境,既然有環境就可以安裝Gem 直接於任何地方執行 gem install backup

這裡其實並不需要在你的Gemfile上面加上這隻Gem,只要在機器上做就可以了,因為你的專案並不需要「執行」這個Gem。

接下來他會安裝所有依賴的套件,請耐心等候

螢幕快照 2016-08-02 上午10.02.54.png

大概幾分鐘過後可以看到安裝完成的訊息

螢幕快照 2016-08-02 上午10.04.18.png

裝完之後我們依照backup這隻Gem的douctmation進行初始化,我們必須建立一個設定檔來做我們想要做的事情

輸入 backup generate:model --trigger db_backup \ --storages='local' --compressor='gzip' --notifiers='mail' --databases='mysql'

這邊的設定檔是以我的database去做設定的,可以看到我在database上面寫到我所使用的mysql,如果你們家的設定不一樣,請看官方的文件,進行設定。

所以我們打開設定檔 vi /root/Backup/models/my_backup.rb 大概會長這樣


Model.new(:db_backup, 'Description for db_backup') do

  database MySQL do |db|

    db.name               = "db_name" #填入你要備份的資料庫名稱
    db.username           = "db_user" #填入你的資料庫使用者
    db.password           = "password" #填入密碼
    db.host               = "127.0.0.1"
    db.port               = 3306
    db.additional_options = ["--quick", "--single-transaction"]
  end

  store_with Local do |local|
    local.path       = "~/backups/"
    local.keep       = 5
  end

  store_with Dropbox do |db|
    db.api_key     = "api_key" #填入dropbox給你的key
    db.api_secret  = "api_secret" #填入api 密碼
    db.cache_path  = ".cache"
    db.access_type = :app_folder
    db.path        = "/path/to/my/backups"
    db.keep        = 25
  end

  compress_with Gzip

  notify_by Mail do |mail|
    mail.on_success           = true
    mail.on_warning           = true
    mail.on_failure           = true

    mail.from                 = "sender@email.com"
    mail.to                   = "your_email"
    mail.cc                   = "cc@email.com"
    mail.reply_to             = "reply_to@email.com"
    mail.address              = "mail_service" # 填入maile address ex: smtp.mailgun.org
    mail.port                 = 587
    mail.domain               = "domain" #電子郵件服務的domain
    mail.user_name            = "user" #該服務上的帳號
    mail.password             = "password" #以及密碼
    mail.authentication       = "plain"
    mail.encryption           = :starttls
  end

end

這邊我已經稍微更改過設定,這份檔案除了會在機器的本地以Gzip的格式壓縮並且備份一份資料以外,還會上傳一份到dropbox上面。

DropboxAPI設定

需要用Dropbox備份你至少需要 1. 一個Dropbox的帳號 (免費註冊位置:dropbox.com) 2. 一個Dropbox的App (免費創建App:developer.dropbox.com)

建立Dropbox直接點選Create APP之後設定參照如下:

螢幕快照 2016-08-02 下午2.21.49.png

將你的Key以及secret輸入到剛剛的 /root/Backup/models/my_backup.rb這隻檔案裡面dropbox的部分

  store_with Dropbox do |db|
    db.api_key     = "api_key" #填入dropbox給你的key
    db.api_secret  = "api_secret" #填入api 密碼
    db.cache_path  = ".cache"
    db.access_type = :app_folder
    db.path        = "/path/to/my/backups"
    db.keep        = 25
  end

第一次測試執行腳本

輸入 backup perform --trigger db_backup

看看Log訊息出現了什麼?如果是Dropbox進行第一次應用程式連接時,會需要先手動認證,如下圖

螢幕快照_2016-08-02_下午2_26_59.jpg

接下來我們打開瀏覽器,輸入log裡出現的驗證網址

螢幕快照 2016-08-02 上午10.17.37.png

螢幕快照 2016-08-02 上午10.17.31.png

手動確認連接之後,回到command line上面鍵入Enter,backup會繼續執行腳本,確認應用程式接口已經建立,往後不需要在手動連接。

如果設定都沒有錯誤,照理說會出現兩份備份並且發一封Email到你的信箱。

設定Whenver

既然每次執行backup腳本都只是下一行backup perform --trigger db_backup指令,那我們就可以輕而易舉靠linux的corntab排程來完成每天自動備份這件事情。

在你的Whenever Gem安裝完之後,編輯schedule.rb,加入如下:

every 1.day, :at => '04:00 am' do
  command "backup perform --trigger db_backup"
end

這裡我設定的是每天機器上的凌晨四點自動執行備份,至於有沒有成功,時間到看有沒有收到信以及檢查該出現備份的地方是否都有對的檔案,就可以安心入眠了

參考文章:

Backup Gem Douctmation

Setting backup

Automatic system backups with backup gem and some shell scripting - part 2, using backup gem

comments powered by Disqus