Heroku + Sinatra + MongoHQ

Heroku のアドオンに MongoHQ がある。16 MByte までではあるが、無料で MongoDB が使用できる。今回コレを初めて使用した。そのときのメモ。Mongoid 使用。

Herokuの設定

% heroku stack:migrate bamboo-mri-1.9.2
% heroku addons:add mongohq:free

Mongoid 設定ファイル作成

config/initializers/mongoid.rb を作成。Railsディレクトリ構成をパクパク。自動的に読み込まれるわけではないので自分で読み込むコードを書く必要あり。設定ファイルに切り出した理由は、cronを使うから。cron で行う処理でも MongoHQ に接続させる必要があるので。

require 'mongoid'

Mongoid.configure do |config|
  if ENV['MONGOHQ_URL']
    uri  = URI.parse(ENV['MONGOHQ_URL'])
    conn = Mongo::Connection.from_uri(ENV['MONGOHQ_URL'])
    config.master = conn.db(uri.path.gsub(/^\//, ''))
  else
    env = Sinatra::Application.environment rescue nil
    name = env == :test ? 'test' : 'development'
    host = 'localhost'
    config.master = Mongo::Connection.new.db(name)
  end
end

Sinatra 側はこんなコード。

configure do
  load File.expand_path('../config/initializers/mongoid.rb', __FILE__)
end

以上で、アプリ側の設定は終了。
次はマスタデータを投入したり、バックアップをするときの方法。

開発環境からMongoHQに接続

http://support.mongohq.com/discussions/community-tips/2-logging-in-to-mongohq-for-heroku-users に、MongoHQ へ接続するための情報の取得方法が書かれている。取得した情報を元に MongoHQ へ接続する。

% mongo -u heroku -p passwd flame.mongohq.com:12345/app12345
MongoDB shell version: 1.8.1
connecting to: flame.mongohq.com:12345/app12345
> 

開発環境の DB と MongoHQ の同期を取る (開発 → MongoHQ)

Clone Database

http://www.mongodb.org/display/DOCS/Clone+Database に DB の複製に関して書かれている。内容をよく見ると次の一文がある。

Must be run on the "destination" server.

どうやら MongoHQ 側で実行しなければいけないようだ。でも、開発環境は家庭内LANの中にあり MongoHQ から接続はできないので、この方法は使えなさそう。

mongodump / mongorestore

mongodump であればデータをファイルに落し、そのファイルを使ってデータを移すので、開発環境からでも使うことができそう (開発環境から MongoHQ へ接続しにいくという意味で)。
まずは開発環境でデータをダンプする。

% mongodump -d development

MongoHQ に取り込む。

% mongorestore -h flame.mongohq.com:12345 -d app12345 -u user -p passwd --drop dump/development                         

バックアップも同様に mongodump でOK.

% mongodump -h flame.mongohq.com:12345 -d 12345 -u heroku -p passwd -o mongohq