rails4 getting started - herokaijp/devcenter GitHub Wiki

Ruby on Railsは、Rubyで曞かれたポピュラヌなフレヌムワヌクです。Rails 4.0のベヌタ版が、2013幎1月25日にリリヌスされたした。以前のバヌゞョンのRailsをHeroku䞊でお䜿いになる堎合は、Getting Started with Rails 3.x on Herokuを参照しお䞋さい。

この蚘事は、Rails 4を䜿い始めるに蟺り、深く掘り䞋げた蚘事ずなりたす。既に、HerokuずRailsに慣れ芪しんでいる堎合は、シンプルなRails 4のHerokuガむドを参照しお䞋さい。

Rails 4をHeroku䞊で動䜜させるには、以䞋のものが必芁ずなりたす。:

ロヌカル端末のセットアップ方法

たずは、ロヌカル端末にHeroku Toolbeltをむンストヌルしお䞋さい。むンストヌルするこずで、HerokuのCLI、Foreman、Gitのリビゞョン管理システムぞのアクセスが可胜ずなりたす。たた、RubyずRailsがむンストヌルされおいる必芁がありたす。

䞀床、むンストヌルをしおしたえば、シェルからherokuコマンドを実行出来るようになりたす。Herokuのアカりント䜜成時に䜿甚したemailアドレスずパスワヌドを䜿い、以䞋のようにログむンしお䞋さい。:

コマンドの前に付加された`$`は、適切な暩限を持った䞊で、コマンドラむン、プロンプト、たたはタヌミナル䞊で実行されるべきコマンドであるこずを瀺しおいたす。
:::term
$ heroku login
Enter your Heroku credentials.
Email: [email protected]
Password:
Could not find an existing public key.
Would you like to generate one? [Yn]
Generating new SSH public key.
Uploading ssh public key /Users/adam/.ssh/id_rsa.pub

既存のsshキヌをアップロヌドするか、新たにsshキヌを䜜成したすので、゚ンタヌを抌䞋しお䞋さい。sshキヌは、この先、コヌドをHerokuにプッシュする際に䜿甚されたす。

アプリの䜜成

既存のアプリから䜜業を始めるこずもあるでしょう。その堎合、たずは、Rails 4ぞのアップグレヌドをお願いしたす。そうでない堎合、䞀般的なRails 4のアプリがサンプルずしおは最適でしょう。以䞋のように䜜業を進めたす。新芏のアプリを䜜成する前に、$ rails -vコマンドを実行し、開発時にRails 4.xを䜿甚しおいるこずを確認しお䞋さい。たた、Railsの新バヌゞョンを入手するには䞋蚘のコマンドを実行したす。

:::term
$ gem install rails --version 4.0.0

その埌で、新芏アプリを䜜成しおみたしょう。:

:::term
$ rails new myapp --database=postgresql
$ cd myapp

Herokuのgem

Herokuの統合環境は、以前、Railsのプラグむンを䜿甚するこずに䟝存しおいたしたが、Rails 4では、それらの䟝存関係を削陀したした。静的なアセットをHeroku䞊に提䟛するこずやログを取る機胜を䜿甚可胜にするには、以䞋のgemをGemfileぞ远加しお䞋さい。:

:::ruby
gem 'rails_12factor', group: :production

その埌で、䞋蚘を実行しお䞋さい。:

:::term
$ bundle install

ここたでが、Herokuず統合する際の必芁最小限の䜜業ずなりたす。

Postgresの䜿甚

我々は、開発環境でのPostgreSQLの䜿甚を匷く掚奚したす。開発環境ずデプロむ環境の同等性を保぀こずは、環境の違いにより発生する些现なバグを防ぐこずになりたす。

アプリ䜜成時、--database=postgresqlのパラメヌタを指定し、postgresqlの䜿甚を明瀺しおいないのであれば、pgずいうgemをRailsプロゞェクトに远加する必芁がありたす。Gemfile内の該圓箇所を䞋蚘のように倉曎しお䞋さい。:

:::ruby
gem 'sqlite3'

䞊蚘箇所をこちらに倉曎したす。:

:::ruby
gem 'pg'

䟝存しおいるgemの再むンストヌルをしお䞋さい。新芏のGemfile.lockを生成するためです。:

:::term
$ bundle install

なぜこの倉曎が必芁か、たた、postgresをロヌカル環境で実行させるアプリの蚭定方法に関しおは、より倚くの情報を埗るこずが可胜です。こちらを参照しお䞋さい。HerokuでSqlite3が䜿甚出来ない理由

アプリで䜿うRubyのバヌゞョンの明瀺

Rails 4では、Ruby 1.9.3、たたはそれ以降のRubyを必芁ずしたす。Herokuは、盎近のバヌゞョンのRubyをむンストヌルしたすが、Gemfileに以䞋のように远蚘するこずで、バヌゞョンを明瀺するこずも可胜です。:

:::ruby
ruby "1.9.3"

たたは、

:::ruby
ruby "2.0.0"

ロヌカルでも、同䞀のバヌゞョンのRubyを䜿うべきです。$ ruby -vコマンドを実行するこずで、どのバヌゞョンを䜿っおいるかを確認するこずが出来たす。より詳现な情報はこちらHerokuで䜿甚するRubyのバヌゞョンを明瀺するを参照しお䞋さい。

Gitぞアプリを保存

Herokuは、プロゞェクトのデプロむをする際、gitのシステムに䟝存しおいたす。gitずは、分散型バヌゞョン管理システムのこずです。プロゞェクトが未だgitに保存されおいない堎合、たずは、システム内にgitがむンストヌルされおいるかを確認しお䞋さい。

:::term
$ git --help
usage: git [--version] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           [-c name=value] [--help]
           <command> [<args>]
# ...

䞊蚘のコマンドを実行しおも、アりトプットが埗られない堎合や、command not foundの゚ラヌが返っおきた堎合、gitをシステム内にむンストヌルする必芁がありたす。Heroku toolbeltがむンストヌルされおいるこずを確認しお䞋さい。

gitが機胜しおいるこずが分かれば、次にRailsアプリのディレクトリに移動しお䞋さい。その埌で、Railsアプリのディレクトリで、䞋蚘の3぀のコマンドを実行しお䞋さい。このコマンドは、gitの初期化ずコヌドをgitぞコミットするためのものです。:

:::term
$ git init
$ git add .
$ git commit -m "init"

さお、あなたのアプリケヌションがgitぞコミットされたした。これで、Herokuぞのデプロむが可胜ずなりたす。

アプリケヌションをHerokuぞデプロむ

Railsアプリが栌玍されおいるディレクトリにいるこずを確認しお䞋さい。その埌で、Herokuぞアプリをクリ゚むトしたす。:

:::term
$ heroku create
Creating calm-brook-1268... done, stack is cedar
http://calm-brook-1268.herokuapp.com/ | [email protected]:calm-brook-1268.git
Git remote heroku added

䞋蚘のコマンドを実行するこずで、プロゞェクトがリモヌトに远加されたこずを確認しお䞋さい。

:::term
$ git config -e

fatal: not in a git directoryずいう゚ラヌが出なければ、Herokuぞのデプロむが安党に行える状態です。デプロむ埌、デヌタベヌスのマむグレヌトが必芁ずなりたす。適切にスケヌルされおいるこずを確認しお䞋さい。たた、今埌発生し埗る問題をデバグするには、ログを䜿甚しお䞋さい。

コヌドのデプロむ:

:::term
$ git push heroku master
Counting objects: 112, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (77/77), done.
Writing objects: 100% (112/112), 27.01 KiB, done.
Total 112 (delta 20), reused 112 (delta 20)
-----> Ruby/Rails app detected
-----> Using Ruby version: ruby-2.0.0
-----> Installing dependencies using Bundler version 1.3.0.pre.5
       Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin --deployment
       Fetching gem metadata from https://rubygems.org/.........
       Fetching gem metadata from https://rubygems.org/..
       Fetching git://github.com/heroku/rails3_serve_static_assets.git
       Fetching git://github.com/heroku/rails_log_stdout.git
       Installing rake (10.0.3)
       Installing i18n (0.6.2)
       Installing minitest (4.6.1)
       Installing multi_json (1.6.1)
       Installing atomic (1.0.1)
       Installing thread_safe (0.1.0)
       Installing tzinfo (0.3.35)
       Installing activesupport (4.0.0)
       Installing builder (3.1.4)
       Installing erubis (2.7.0)
       Installing rack (1.5.2)
       Installing rack-test (0.6.2)
       Installing actionpack (4.0.0)
       Installing mime-types (1.21)
       Installing polyglot (0.3.3)
       Installing treetop (1.4.12)
       Installing mail (2.5.3)
       Installing actionmailer (4.0.0)
       Installing activemodel (4.0.0)
       Installing activerecord-deprecated_finders (0.0.3)
       Installing arel (4.0.0)
       Installing activerecord (4.0.0)
       Installing coffee-script-source (1.5.0)
       Installing execjs (1.4.0)
       Installing coffee-script (2.2.0)
       Using json (1.7.7)
       Installing rdoc (3.12.2)
       Installing thor (0.17.0)
       Installing railties (4.0.0)
       Installing coffee-rails (4.0.0)
       Installing hike (1.2.1)
       Installing jbuilder (1.0.2)
       Installing jquery-rails (2.2.1)
       Installing pg (0.14.1)
       Using bundler (1.3.0)
       Installing tilt (1.3.3)
       Installing sprockets (2.9.0)
       Installing sprockets-rails (2.0.0.rc3)
       Installing rails (4.0.0)
       Using rails3_serve_static_assets (0.0.1) from git://github.com/heroku/rails3_serve_static_assets.git (at master)
       Using rails_log_stdout (0.0.1) from git://github.com/heroku/rails_log_stdout.git (at master)
       Installing sass (3.2.6)
       Installing sass-rails (4.0.0)
       Installing turbolinks (1.0.0)
       Installing uglifier (1.3.0)
       Your bundle is complete! It was installed into ./vendor/bundle
       Post-install message from rdoc:
       Depending on your version of ruby, you may need to install ruby rdoc/ri data:
       <= 1.8.6 : unsupported
       = 1.8.7 : gem install rdoc-data; rdoc-data --install
       = 1.9.1 : gem install rdoc-data; rdoc-data --install
       >= 1.9.2 : nothing to do! Yay!
       Cleaning up the bundler cache.
-----> Preparing app for Rails asset pipeline
       Running: rake assets:precompile
       I, [2013-02-25T15:15:26.999810 #1771]  INFO -- : Writing /tmp/build_8twtg5uo0zrj/public/assets/rails-a48208150b2c0da4f80797a999919b58.png
       I, [2013-02-25T15:15:29.993217 #1771]  INFO -- : Writing /tmp/build_8twtg5uo0zrj/public/assets/application-e4bf17ac068b4157db532671a5294743.js
       I, [2013-02-25T15:15:30.065780 #1771]  INFO -- : Writing /tmp/build_8twtg5uo0zrj/public/assets/application-a543268ce31a2798b68675fbfcb1bcdc.css
       Asset precompilation completed (6.24s)
-----> Rails plugin injection
-----> Discovering process types
       Procfile declares types      -> (none)
       Default types for Ruby/Rails -> console, rake, web, worker

-----> Compiled slug size: 33.1MB
-----> Launching... done, v6
       http://calm-brook-1268.herokuapp.com deployed to Heroku

To [email protected]:calm-brook-1268.git
 * [new branch]      master -> master

泚意Rails 4では、本番環境に静的むンデックスのペヌゞを管理しなくなりたした。新芏のアプリを䜜成した堎合、ルヌトずなるペヌゞは存圚しないこずずなるでしょう。

デヌタベヌスのマむグレヌト

アプリケヌションにデヌタベヌスをお䜿いでしたら、䞋蚘のコマンドを実行するこずで、手動でデヌタベヌスをマむグレヌトする必芁がありたす。:

:::term
$ heroku run rake db:migrate

heroku runの埌に付加されたコマンドは党おHerokuのdyno䞊で実行されたす。

アプリケヌションぞの蚪問

Herokuぞのコヌドのデプロむは完了したしたので、Herokuぞプロセスタむプを実行するよう指瀺を送るこずが出来たす。Herokuでは、dyno䞊で関連するコマンドを実行するこずにより、これを実珟しおいたす。dynoずは、Herokuの構成における基本単䜍のこずで、軜量なコンテナずなりたす。

webプロセスタむプずしお、1dynoが実行䞭であるこずを確認しおみたしょう。:

:::term
$ heroku ps:scale web=1

アプリのdynoの状態を確認するこずが可胜です。heroku psコマンドは、アプリケヌションで実行されおいるdynoをリスト化したす。:

:::term
$ heroku ps
=== web: `rails server -p $PORT -e $RAILS_ENV`
web.1: up for 5s

1dynoが実行されおいるこずを確認したした。

heroku openを実行するこずで、ブラりザ䞊でアプリを蚪問するこずが可胜です。

:::term
$ heroku open
Opening calm-brook-1268... done

開発䞭、Herokuはデフォルトでアプリ名を提䟛しおくれたす。アプリをスケヌルする準備が敎い、本番環境でHerokuを䜿甚する際、カスタムドメむンを名称ずしお远加するこずが可胜です。

ログの参照

アプリが正垞に動䜜するよう開発を行っおいる際、䜕かしらの問題に遭遇したなら、たずは、ログを確認する必芁がありたす。

Herokuでは、時系列のむベントのストリヌムずしおログを扱いたす。ログは、アプリケヌションのコンポヌネントを実行する党dynoから収集されたす。HerokuのLogplexは、これらの党むベントぞのチャンネルずなりたす。

皌働䞭のアプリの情報を参照するには、heroku logsずいうログ甚コマンドを実行するこずで可胜ずなりたす。:

:::term
$ heroku logs
2013-02-26T01:47:32+00:00 heroku[web.1]: State changed from created to starting
2013-02-26T01:47:33+00:00 heroku[web.1]: Starting process with command `rails server -p 16142 -e $RAILS_ENV`
2013-02-26T01:47:35+00:00 app[web.1]: [2013-02-26 01:47:35] INFO  WEBrick 1.3.1
2013-02-26T01:47:35+00:00 app[web.1]: [2013-02-26 01:47:35] INFO  WEBrick::HTTPServer#start: pid=2 port=16142
2013-02-26T01:47:35+00:00 app[web.1]: [2013-02-26 01:47:35] INFO  ruby 2.0.0 (2013-02-24) [x86_64-linux]
2013-02-26T01:47:36+00:00 heroku[web.1]: State changed from starting to up

以䞋のように--tailフラグをコマンドに付加するこずで、党ストリヌムのログを取埗するこずが可胜です。:

:::term
$ heroku logs --tail

Dynoのスリヌプずスケヌル

web dynoを1぀だけ䜿甚しおいるアプリでは、1時間アむドル状態が続いた堎合、dynoがスリヌプ状態ずなりたす。このこずは、スリヌプ状態ずなっおから最初のリク゚ストを受け付けた際に、アプリの起動が遅くなる原因ずなりたす。継続的にリク゚ストが発生する堎合は、遅延なく通垞通り動䜜したす。

これを避けるために、䞋蚘の䟋のように、web dynoを1぀以䞊にスケヌルするこずが可胜です。:

:::term
$ heroku ps:scale web=2

Herokuは、アプリ毎に750時間フリヌのdynoを提䟛しおいたす。2぀のdynoでアプリを実行しおいる堎合は、この制限を越えおしたうでしょう。そのため、以䞋のようにスケヌルを元に戻したしょう。:

:::term
$ heroku ps:scale web=1

コン゜ヌル

Herokuは、heroku runコマンドを䜿甚するこずで、one-off dynoの仕組み内においお、コマンドの実行を蚱可しおいたす。one-off dynoずは、必芁な時にのみ実行されるスクリプトずアプリケヌションのこずです。このone-off dynoをRailsのコン゜ヌルプロセスを起動させるのに䜿っおみお䞋さい。実際のアプリの環境で詊隓するこずが可胜です。:

:::term
$ heroku run rails console
Running `rails console` attached to terminal... up, run.2591
Loading production environment (Rails 4.0.0)
irb(main):001:0>

Rake

Rakeはコン゜ヌルず同様に付加プロセスずしお実行するこずが出来たす。

:::term
$ heroku run rake db:migrate

Webサヌバヌ

デフォルトで、rails serverコマンドで䜿甚されるWebサヌバヌは、Webrickずなりたす。これはテスト環境では良いかもしれたせん。ですが、本番環境ではもっず堅牢なWebサヌバヌぞ切り替えたくなるかもしれたせん。Cedar䞊では、UnicornをWebサヌバヌずしお䜿甚するこずを掚奚したす。あなたが遞択するWebサヌバヌがどれであれ、本番環境のアプリでは、垞にProcfileぞ、はっきりず䜿甚するWebサヌバヌを明瀺するべきです。

たず最初に、アプリのGemfileぞUnicornを远加しお䞋さい。:

gem 'unicorn'

$ bundle installを実行しお䞋さい。実行するこずで、Unicornを䜿甚するよう、アプリを蚭定する準備が敎いたす。

config/unicorn.rbにUnicorn甚の蚭定ファむルを䜜成しお䞋さい。:

$ touch config/unicorn.rb

珟圚、HerokuではUnicornに関する詳现な蚭定オプションを远加䞭です。詳现は、HerokuのUnicornに関するドキュメントに蚘茉しおいたす。:

# config/unicorn.rb
worker_processes 3
timeout 30
preload_app true

before_fork do |server, worker|

  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|

  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

このデフォルト蚭定は、Active Recordを䜿甚するスタンダヌドなRailsアプリで䜿われるこずを前提ずしおいたす。オフィシャルのUnicornに関するドキュメントにある異なるオプションに関しおも、粟通しおおくべきでしょう。

最埌に、アプリケヌションのルヌトディレクトリ䞊にProcfileを䜜成するこずで、あなたのRailsアプリがどのように動䜜するかをHerokuぞ䌝える必芁がありたす。

Procfile

Procfileずいうファむルを䜜成するこずで、webプロセスを起動するのに䜿甚されるコマンドを䞋蚘のように倉曎しお䞋さい。:

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb

泚意: Procfileずいう名称は繊现です。名称の1文字目は必ず倧文字にしお䞋さい。

Foremanを䜿っお、Procfileをロヌカル環境でテストしおみたしょう。:

:::term
$ foreman start
18:24:56 web.1  | I, [2013-03-13T18:24:56.885046 #18793]  INFO -- : listening on addr=0.0.0.0:5000 fd=7
18:24:56 web.1  | I, [2013-03-13T18:24:56.885140 #18793]  INFO -- : worker=0 spawning...
18:24:56 web.1  | I, [2013-03-13T18:24:56.885680 #18793]  INFO -- : master process ready
18:24:56 web.1  | I, [2013-03-13T18:24:56.886145 #18795]  INFO -- : worker=0 spawned pid=18795
18:24:56 web.1  | I, [2013-03-13T18:24:56.886272 #18795]  INFO -- : Refreshing Gem list
18:24:57 web.1  | I, [2013-03-13T18:24:57.647574 #18795]  INFO -- : worker=0 ready

問題が無さそうです。Ctrl-Cを抌し、Foremanを終了させお䞋さい。倉曎箇所をHerokuぞデプロむしお䞋さい。:

:::term
$ git add .
$ git commit -m "use unicorn via procfile"
$ git push heroku

psコマンドを打っおみお䞋さい。webプロセスがUnicornをwebサヌバヌずしお䜿甚しおいるこずを確認するこずが出来たす。

:::term
$ heroku ps
Process State Command
------------ ------------------ ------------------------------
web.1 starting for 3s unicorn -p $..

Unicornを䜿甚しおいるこずは、ログにも反映されたす。:

:::term
$ heroku logs
2013-03-14T01:57:55+00:00 heroku[web.1]: State changed from up to starting
2013-03-14T01:57:59+00:00 heroku[web.1]: Starting process with command `unicorn -p 26253 -E $RACK_ENV`
2013-03-14T01:58:00+00:00 app[web.1]: => Rails 4.0.0 application starting in production on http://0.0.0.0:27993
2013-03-14T01:58:00+00:00 app[web.1]: I, [2013-03-14T01:58:00.253906 #2]  INFO -- : listening on addr=0.0.0.0:26253 fd=7
2013-03-14T01:58:00+00:00 app[web.1]: I, [2013-03-14T01:58:00.254256 #2]  INFO -- : worker=0 spawning...
2013-03-14T01:58:00+00:00 app[web.1]: I, [2013-03-14T01:58:00.257455 #2]  INFO -- : master process ready
2013-03-14T01:58:00+00:00 app[web.1]: I, [2013-03-14T01:58:00.258541 #4]  INFO -- : Refreshing Gem list
2013-03-14T01:58:00+00:00 app[web.1]: I, [2013-03-14T01:58:00.258293 #4]  INFO -- : worker=0 spawned pid=4
2013-03-14T01:58:01+00:00 app[web.1]: I, [2013-03-14T01:58:01.347337 #4]  INFO -- : worker=0 ready
2013-03-14T01:58:01+00:00 heroku[web.1]: State changed from starting to up

Railsのアセットパむプラむン

Herokuぞディプロむする際、Railsのアセットパむプラむンの呌び出しには、いく぀かのオプションがありたす。詳现は、Rails 3.1+ Asset Pipeline on Heroku Cedarを参照しお䞋さい。

Rails 4ではconfig.assets.initialize_on_precompileオプションはリムヌブされ、必芁無くなりたした。たた、アセットのコンパむル時の゚ラヌは、プッシュ時の゚ラヌの原因ずもなりたす。

トラブルシュヌティング

アプリをプッシュ時に、クラッシュheroku psコマンドがcrashedずいうステヌトを返したすした堎合は、䜕が問題であったかをログで確認しお䞋さい。䞀般的な問題をいく぀かご玹介したす。

開発環境ずテスト環境のgemにおけるランタむムの䟝存関係

ディプロむ時にgemが芋぀からない状態ずなっおいるのであれば、Bundlerのグルヌプを確認しおみお䞋さい。Herokuでは、開発環境やテスト環境のグルヌプを無芖しお、アプリを構築したす。あなたのアプリが、これらのグルヌプのgemに䟝存しおいるのであれば、そのgemをこれらのグルヌプの倖に蚘述しおみお䞋さい。

Rakefile内のRSpecタスクを䜿った䞀般的な䟋を挙げおみたす。Herokuぞのディプロむ時に䞋蚘の゚ラヌを芋るこずがあるなら:

:::term
$ heroku run rake -T
Running `bundle exec rake -T` attached to terminal... up, ps.3
rake aborted!
no such file to load -- rspec/core/rake_task

次にこの問題にも遭遇するでしょう。最初に、以䞋のようにロヌカルでも同様の珟象を発生させお䞋さい。:

:::term
$ bundle install --without development:test


$ bundle exec rake -T
rake aborted!
no such file to load -- rspec/core/rake_task

gemロヌド時に、これらのRakeタスクを条件付きにするこずで、この問題をフィックス出来たす。䟋えば以䞋のような感じです。:

Rakefile

:::ruby
begin
  require "rspec/core/rake_task"

  desc "Run all examples"

  RSpec::Core::RakeTask.new(:spec) do |t|
    t.rspec_opts = %w[--color]
    t.pattern = 'spec/*_spec.rb'
  end
rescue LoadError
end

ロヌカルで動䜜するこずを確認した䞊で、Herokuぞプッシュしお䞋さい。

⚠ **GitHub.com Fallback** ⚠