Heroku を使い倒す(バックアップ編)

» 1時間でツイッターサービスを作ろう! | KRAY Inc

のおかげもあり、Heroku がブレイクしそうだ。

つくる社でも Libron とその姉妹サービスの Libreq を Hreoku で動かしています。個人でも エンドレス・スピッツ などいくつかのサービスを Heroku に乗せており、ノウハウも少しずつ溜まってきたので、自分のメモがわりにも少しずつ紹介していこうと思います。

Heroku には Bundles という便利なバックアップの仕組みが用意されており、これを使えばソースコードとデータベースの中身をまとめて一個のファイルに固めておくことができます。

使い方は Heroku らしく非常に簡単。Add-ons から Bundle を選択し、自分のアプリで有効にしたあとは、

heroku bundles:capture --app myapp

で bundle をひとつ heroku 上に作成します。

heroku bundles:download --app myapp

を実行すれば、できた bundle をローカルマシンにダウンロードできます。

ただし、Bundle は無料プランでは2個以上作成できない(月$20の有料プランだと無制限)ので、次のバックアップをとるには、

heroku bundles:destroy <bundle名>

で heroku 上から削除してから、新しい bundle を作成、ダウンロードしなければなりません。

つまり、作成・ダウンロード・サーバーから削除、を繰り返せば無料プランでも充分使えるということです。

そこでこの一連のタスクをスクリプトにしようと思ったら、すでに rake タスクを作っている方がいました。

» Scripting Heroku Backups : b#

を参考に、アプリ名がハードコードされていた部分を修正したものがこちら↓

heroku 上のアプリ名が myapp とすると、ローカルでのアプリのフォルダ名もそれにあわせてあると思うので、

app_name =  RAILS_ROOT.split('/').last

で、アプリのパスからアプリ名を抽出しています。

これを各 rails アプリケーションの lib/tasks 以下に myapp.rake といったファイル名で保存、backups というフォルダを RAILS_ROOT 直下に作ったあと、

rake myapp:backup

を実行すれば、backups 以下にバックアップファイルをダウンロードできます。

backups 以下は git レポジトリ管理下に入れない方がいいと思うので、.gitignore に

backups/*

を追加。

あとはローカルマシンが Mac であれば cron に

30 0 * * * cd /Users/myname/rails/myapp && /usr/bin/rake myapp:backup

などとバックアップタスクを登録しておけば、自動でバックアップを取ることができて、快適な Heroku ライフを送ることができるようになります。

このページの先頭へ