blog @arfyasu

プログラミングとか趣味のこととか

Rails4 + MySQL のアプリケーションを Heroku で動かすまで

去年の10月頃から、Ruby on Rails(以降Rails) でWebサービスを開発するプロジェクトにジョインしました。

Rails は、言わずと知れた Ruby の Webアプリケーションフレームワークです。

Rails に出会ったのはもう随分前で、Rails 2.1 の頃。
会社でWeb サービスを1つ作ってリリースしました。
すごいフレームワークだなと思った記憶がありますが、リリース以降は別のプロジェクトにアサインされ、それ以降触る機会がほとんどありませんでした。

Rails で開発を始めて約3ヶ月(週3日程度)が経ちますが、実力不足は否めずそろそろやばい感があるので、しばらく Rails 周辺の技術を中心にエントリーを書きながら勉強したいと思います。

レベル的には、初心者に毛が生えたようなものだと思います、はい。

ということで、今日は 新規に Rails のアプリケーションを作って Heroku で動かしてみようと思います。

開発環境

Mac OS XYosemite
git 2.5.4
MySQL 5.6.26
rbenv 1.0.0
rbenv gemset 0.4.0
ruby 2.3.0 (rbenv にてインストール済)
heroku toolbelt

準備

リポジトリを作成

githubリポジトリを作成し clone します。
リポジトリ名は mytodo としました。

$ git clone git@github.com:arfyasu/mytodo.git
$ cd mytodo
rbenv, gemset ファイル作成

今回使用する ruby のバージョンと gemset 用の設定ファイルを作成します。

$ rbenv local 2.3.0
$ rbenv version
2.3.0 (set by /path/to/mytodo/.ruby-version)
$ rbenv gemset create 2.3.0 mytodo
created mytodo for 2.3.0
$ rbenv gemset init mytodo
created mytodo for 2.3.0
created and initialized the following gemset for use with 2.3.0
=====
mytodo
=====
$ rbenv gemset active
mytodo global

アプリケーション作成

システムの gem に rails はインストールしない形で Rails のアプリケーションを作成します。
プロジェクトで使用する gem は、 vendor/bundle に格納します。

bundler をインストールしGemfile を作成
$ gem install bundler

Gemfile を作成し、gem "rails" の行をコメントアウトします。

$ bundle init
Writing new Gemfile to /path/to/project/Gemfile
$ vi Gemfile
# A sample Gemfile
source "https://rubygems.org"

gem "rails"

rails インストール&アプリケーション作成

bulder を使って rails をインストールします。

$ bundle install --path vendor/bundle
...

インストールが完了したら、プロジェクトを作成します。
作成時のオプションは、test::unit は組み込まない -T、myql を使用するために -d mysql を指定。
コマンドを実行すると .gitignore と Gemfile を上書きするか確認されるので、Gemfile のみ上書きします。
プロジェクトが作成されると、bundle install が実行されます。

$ bundle exec rails new . -T -B -d mysql
...
Overwrite /path/to/mytodo/.gitignore? (enter "h" for help) [Ynaqdh] n
Overwrite /path/to/mytodo/Gemfile? (enter "h" for help) [Ynaqdh] Y
...
         run  bundle install
...
動作確認

DBを作成し、http://localhost:3000/ をブラウザで開いて表示されることを確認します。
DBの設定は、config/database.yml で確認。

$ bin/rake db:create
$ bin/rails s
task コントローラを追加

scaffold コマンドを使います。

$ bin/rails g scaffold task name:string deadline:date memo:text
$ bin/rake db:migrate
$ bin/rails s

http://localhost:3000/tasks にアクセスすると、taskのCRUD が確認できます。

Heroku へデプロイ

次に、作成したアプリケーションを Heroku にデプロイしていきます。
デプロイには、Gemfile と Procfile というファイルが必要です。
まず、デプロイに必要な gem をインストールします。

rails_12factor インストール
$ vi Gemfile
group :production do
  gem 'rails_12factor'
end
$ bundle install
Procfile 作成

次に Procfile を作成します。

$ vi Procfile
web: bundle exec rails server -p $PORT
Heroku にアプリケーションを作成しデプロイ
$ heroku create
Creating aqueous-peak-8185... done, stack is cedar-14
https://aqueous-peak-8185.herokuapp.com/ | https://git.heroku.com/aqueous-peak-8185.git
Git remote heroku added
$ git push heroku master
Heroku のDB設定とマイグレーション

Heroku の標準DBは PostreSQL です。
MySQL を使用するためには ClearDB アドオンを使うのですが、そのためにはクレジットカードの登録が必要です。
未登録の場合、addons:create コマンドが失敗するので注意。

$ heroku addons:create cleardb:ignite
$ heroku run rake db:migrate
Running rake db:migrate on aqueous-peak-8185... up, run.6965
rake aborted!
Mysql2::Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

接続エラー!?
ドキュメントを見ながらDBの接続情報を確認。

$ heroku config | grep CLEARDB_DATABASE_URL
CLEARDB_DATABASE_URL:     mysql://b3096b57ab2c31:fcf25b09@us-cdbr-iron-east-03.cleardb.net/heroku_4997236885829fc?reconnect=true

mysql のバージョンが mysql になっているので、gem に合わせて mysql2 に変更します。

$ heroku config:set DATABASE_URL=mysql2://b3096b57ab2c31:fcf25b09@us-cdbr-iron-east-03.cleardb.net/heroku_4997236885829fc?reconnect=true
$ heroku run rake db:migrate

で、マイグレーションが成功しました。

アプリケーションについての情報を確認
$ heroku apps:info
=== aqueous-peak-8185
Addons:        cleardb:ignite
Dynos:         web: 1
Git URL:       git@heroku.com:aqueous-peak-8185.git
Region:        us
Repo Size:     41 kB
Slug Size:     29 MB
Stack:         cedar-14
Web URL:       https://aqueous-peak-8185.herokuapp.com/
動作確認

https://aqueous-peak-8185.herokuapp.com/tasks にアクセスして終了と思いきや、以下のエラー。

Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml`

config/secrets.yml を追加してあげないといけないとのことなので、.gitignore から config/secrets.yml を削除し、secrets.yml をソースに追加してデプロイします。

再び https://aqueous-peak-8185.herokuapp.com/tasks にアクセスし動作確認OK。

SECRET_KEY_BASE には新しい値をセットする際には、以下のコマンドを実行します。

$ heroku config:set SECRET_KEY_BASE=`ruby -rsecurerandom -e "puts SecureRandom.hex(64)"`

今回のソースは、以下です。参考までに、、、
https://github.com/arfyasu/mytodo

参考サイト

http://qiita.com/youcune/items/222777415f00d19cccb4 http://qiita.com/beta_chelsea/items/34ccd2b7ad48163c55f8 https://devcenter.heroku.com/articles/getting-started-with-rails4