Padrino+MySQL環境をcloudControlに構築してみた

以前、HerokuにLokkaを入れてみる記事を書きました。
VirtualBox上のUbuntu12.04にLokkaを入れて、Herokuへデプロイしてみた - メモ的な思考的な


Lokkaについて調べていくと、Sinatraベースであるということを知りました。
次に、Sinatraについて調べていくと、SinatraベースのフレームワークPadrinoの存在を知りました。
Padrino で素敵なウェブ開発を - Padrino Ruby Web Framework


一方、Heroku以外でRubyを扱えるクラウドプラットフォームがないかを調べたところ、cloudControlがありました。


以前はPHPのみだったようですが、最近Rubyや他の言語にも対応したようです。また、Herokuとは異なり、フリーで使えるDBはMySQLでした。
CloudControl - Wikipedia, the free encyclopedia


そこで、それらをまとめて試したいと考え、Padrino+MySQL環境をcloudControlに構築してみることにしました。



開発環境

  • OS: ホスト・ゲストとも、Lokkaを構築した時のもの
  • Ruby: 同上
  • Git: 同上
  • Padrino: 0.10.7
  • DB: ローカルはSQLite、cloudControlはMySQLs


Padrinoは以下の構成でジェネレートしました(使っていないものもありますが...)。

オプション 別名
adapter -a sqlite *1
orm -d activerecord
test -t rspec
script -s jquery
renderer -e haml
stylesheet -c sass

cloucControlのアカウント作成

cloudControl » Cloud App Platform » Supercharge development and scale applications in the Cloud. の右上にある「Console Login」ボタンの中の「Register」リンクから、アカウントを作成します。



Padrinoのインストール

sudo gem install padrino

Padrinoのプロジェクトを作成

padrino g project -a sqlite -d activerecord -t rspec -s jquery -e haml -c sass -b

development/test環境をSQLite、production環境をMySQLとするための修正

Gemfileの修正

Gemfileの「gem 'sqlite3'」という部分を修正します。
なお、ORMにActiveRecordを使用している関係上、MySQLのAdapterはMysql2となります。PadrinoのページにはMysql2の記載は見えませんでしたが、Mysql2でも問題なく動作しました。
参考:ActiveRecordとmysql2のバージョン問題 - tetsuwan blog


Gemfile

group :development, :test do
  gem 'sqlite3'
end

group :production do
  gem 'mysql2'
end
config/database.rbの修正

ActiveRecord::Base.configurations[:production]の設定を、SQLite向けからMySQL向けへと変更します。
なお、MySQLの設定は、Add-Onsの「Credentials」の値をコピペするのではなく、環境変数を設定すれば良いようです(portは数字にしないとエラーとなるので、to_iメソッドで数字化します)。
参考:https://www.cloudcontrol.com/dev-center/Guides/Ruby/Databases


config/database.rb

ActiveRecord::Base.configurations[:production] = {
  adapter:   'mysql2',
  encoding:  'utf8',
  reconnect: true,
  pool:      5,
  database: ENV["MYSQLS_DATABASE"],
  username: ENV["MYSQLS_USERNAME"],
  password: ENV["MYSQLS_PASSWORD"],
  host: ENV["MYSQLS_HOSTNAME"],
  port: ENV["MYSQLS_PORT"].to_i
}

#ActiveRecord::Base.configurations[:production] = {
#  :adapter => 'sqlite3',
#  :database => Padrino.root('db', 'creative_aid_production.db')
#}

Padrino + RSpecのIssueを修正するパッチ

Padrino 0.10.7でRSpecを使用している場合、「ar:migrate」を行うと、ローカル(development)環境では問題なく動作しますが、cloudControl(production)環境では以下のエラーとなります。

Connecting...
=> Executing Rake ar:migrate ...
/srv/www/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.11/lib/active_support/dependencies.rb:251:in `require': cannot load such file -- rspec/core/rake_task (LoadError)
from /srv/www/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.11/lib/active_support/dependencies.rb:251:in `block in require'


そのため、以下を参考にして、spec/spec.rake にパッチします。
参考:https://github.com/padrino/padrino-framework/issues/514#issuecomment-8448872


spec/spec.rake

# 先頭行に追加
if ENV['PADRINO_ENV'] == 'test'

# 最終行に追加
end

Gemfile.lockの作成

以上でGemfileなどの修正が完了したので、Gemfile.lockを作成します。
なお、MySQL関連のgemはローカル(development)環境では不要なため、「without」オプションを利用します。

cd ./
bundle install --without production

管理画面の作成

MySQLが使えるかどうかの確認のため、Blogチュートリアルにある管理画面作成の作業を行います。
Guides Blog Tutorial - Padrino Ruby Web Framework

padrino g admin
bundle install
padrino rake ar:migrate
padrino rake seed

動作確認

問題なく管理画面が作成されているかを確認するため、Padrinoを起動します。

padrino s


ちなみに、Padrinoを環境指定で起動するには、eオプションを付けます。

padrino s -e development


ポート3000で起動していると思いますので、ブラウザで以下にアクセスし、管理者画面が表示されるかを確認します。

http://localhost:3000/admin

Gitへコミット

無事、管理者画面を確認できた場合、cloudControlにデプロイするため、Gitにコミットしておきます。

git init
git add .
git commit -m 'first'

cloudControlの環境設定

公式ドキュメントを参考に、cloudControlの環境を設定します。
cloudControl » Cloud App Platform » Quickstart


ツールを準備します。

sudo easy_install pip
sudo pip install cctrl


2013/2/13 追記
Ubuntuで easy_install がない場合には、以下の方法でpipを入れることもできます。

sudo apt-get install python-pip

参考:UbuntuのPythonでeasy_installやpipを使いたい場合 - id:rx7(@namikawa)の技術メモ - 技術日記
2013/02/13 ここまで追記




Public Keyを作成します。

cctrluser key.add

cloudControlアプリの作成・MySQLsアドオンの追加・デプロイ

cloudControlアプリを作成します。

cctrlapp create ruby


MySQLsアドオンの追加と、アドオンの確認をします。

cctrlapp /default addon.add mysqls.free
cctrlapp /default addon


Gitの内容をPushしてデプロイします。

cctrlapp /default push
cctrlapp /default deploy

DBのMigrate

デプロイ後でないとMigrateが行えないことに注意します。
なお、Padrinoのコマンドライン実行は、以下の公式ドキュメントにありました(Railsのものでしたが、Padrinoでも動作しました)。
cloudControl » Cloud App Platform » Guides

cctrlapp /default run "padrino rake ar:migrate"
cctrlapp /default run "padrino rake seed"


ここまでにより、cloudControlでのデプロイは完了です。以下のURLにて動作を確認できます。
http://.cloudcontrolled.com/




使ってみての感想

  • Herokuと同じような感覚でデプロイまでたどり着いた。
  • *.cloudcontrolled.comドメインであれば、SSLも使うことができた。
  • Herokuと同じように、いろいろなAdd-Onがあった。
  • フリーなAdd-Onについては、クレジットカードが不要だった。
  • フリーなAdd-Onに、Aliasが含まれていたので、独自ドメインの設定も行うことができる。
  • deploy実行後、「Deploying...」のログを残したまま完了しないことが何回かあった。deploy時のエラーが原因なのか、cloudControl自体が原因なのか、分かりづらい。
  • Deployingで止まったものは、いつまでも終わらないので、アプリ自体を廃棄して対応した。
  • 公式ドキュメント以外では、cloudControl + Ruby の情報が少なめ。


デプロイ時のログについて少々不明瞭なところはありますが、個人的なものを手軽に使うにはちょうどよい環境なのかもしれません。



*1:なお、後述の通り、MySQL分は自力で追加