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 X(Yosemite)
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 [email protected]: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:[email protected]/heroku_4997236885829fc?reconnect=true
mysql のバージョンが mysql になっているので、gem に合わせて mysql2 に変更します。
$ heroku config:set DATABASE_URL=mysql2://b3096b57ab2c31:[email protected]/heroku_4997236885829fc?reconnect=true $ heroku run rake db:migrate
で、マイグレーションが成功しました。
アプリケーションについての情報を確認
$ heroku apps:info === aqueous-peak-8185 Addons: cleardb:ignite Dynos: web: 1 Git URL: [email protected]: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