Skip to content
iwhurtafly edited this page Jun 16, 2012 · 11 revisions

このクイックスタートは、Cedar stack上の Rails 3.x より開始します。 Rails 3.1ガイドは、こちらです。http://devcenter.heroku.com/articles/rails31_heroku_cedar Sinatraまたは、その他Rubyアプリは、Ruby quickstartを参照して下さい。

前提条件

  • Ruby/Railsの基礎知識、Ruby 1.9.2, Rubygems, Bundler, Rails 3がインストール済みであること。
  • Gitの基礎知識
  • アプリケーションは、 Ruby (/wiki/MRI) 1.9.2上で実装する必要があります。

ローカル端末のセットアップ

Heroku Toolbeltをローカル端末へインストールして下さい。 インストールすることで、Heroku command-line client、 Foreman、Gitのリビジョン管理システムへのアクセスが保証されます。

一度、インストールを行うと、シェルからherokuコマンドを使用することが出来るようになります。 Herokuアカウント作成時のemailアドレスとパスワードを使用してログインして下さい。(以下、実行例)

:::term
$ heroku login
Enter your Heroku credentials.
Email: adam@example.com
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キーの作成を行いますので、 enterキーを押して下さい。sshキーは、コードをHerokuへpushする際に使用されます。

アプリの作成

既存のアプリから始めることになるでしょうが、既存のアプリが存在しない場合、一般的なRails3アプリがサンプルアプリとして 最適でしょう。(以下、作成例):

:::term
$ rails new myapp
$ cd myapp
開発期間中は、PostgreSQLを使用することを強く推奨します。開発環境とディプロイ環境の同期を保つことで、 環境依存による微少な違いで発生するバグを見つけることの煩わしさから解放されます。

Herokuは、PostgreSQLのデータベースを提供するため、Gemfileの以下の箇所を編集して下さい。: (追記:Rails3のデフォルトデータベースは、SQLiteのため)

:::ruby
gem 'sqlite3'

上記内容をこちらに変更:

:::ruby
gem 'pg'

依存関係を再インストールします。(新たにGemfile.lockを作成するため):

:::term
$ bundle install

Gitへのアプリ格納

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

Heroku/Cedarへのディプロイ

Cedar stack上へアプリの作成:

:::term
$ heroku create --stack cedar
Creating severe-mountain-793... done, stack is cedar
http://severe-mountain-793.herokuapp.com/ | git@heroku.com:severe-mountain-793.git
Git remote heroku added

コードをディプロイ:

:::term
$ git push heroku master
Counting objects: 67, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (52/52), done.
Writing objects: 100% (67/67), 86.33 KiB, done.
Total 67 (delta 5), reused 0 (delta 0)

-----> Heroku receiving push
-----> Rails app detected
-----> Installing dependencies using Bundler version 1.1
       Checking for unresolved dependencies.
       Unresolved dependencies detected.
       Running: bundle install --without development:test --path vendor/bundle --deployment
       Fetching source index for http://rubygems.org/
       Installing rake (0.8.7)
       ...
       Installing rails (3.0.5)
       Your bundle is complete! It was installed into ./vendor/bundle
-----> Rails plugin injection
       Injecting rails_log_stdout
       Injecting rails3_serve_static_assets
-----> Discovering process types
       Procfile declares types -> (none)
       Default types for Rails -> console, rake, web, worker
-----> Compiled slug size is 8.3MB
-----> Launching... done, v5
       http://severe-mountain-793.herokuapp.com deployed to Heroku

To git@heroku.com:severe-mountain-793.git
 * [new branch]      master -> master

作成されたアプリをウェブ上で閲覧する前に、アプリのプロセスの状態を確認しましょう:

:::term
$ heroku ps
Process       State               Command
------------  ------------------  ------------------------------
web.1         up for 5s           bundle exec rails server -p $PORT

webプロセスが起動しています。ログでより詳細な情報をレビューしてみましょう:

:::term
$ heroku logs
2011-03-10T11:10:34-08:00 heroku[web.1]: State changed from created to starting
2011-03-10T11:10:37-08:00 heroku[web.1]: Running process with command: `bundle exec rails server -p 53136`
2011-03-10T11:10:40-08:00 app[web.1]: [2011-03-10 19:10:40] INFO  WEBrick 1.3.1
2011-03-10T11:10:40-08:00 app[web.1]: [2011-03-10 19:10:40] INFO  ruby 1.9.2 (2010-12-25) [x86_64-linux]
2011-03-10T11:10:40-08:00 app[web.1]: [2011-03-10 19:10:40] INFO  WEBrick::HTTPServer#start: pid=12198 port=53136
2011-03-10T11:10:42-08:00 heroku[web.1]: State changed from starting to up

いい感じです。heroku openコマンドで、webアプリを訪問することが出来ます。

コンソール

Cedarは、あなたのアプリの環境で試験を行えるようにするために、ローカルターミナルからRailsのコンソールを使用可能とします:

:::term
$ heroku run console
Running `bundle exec rails console` attached to terminal... up, ps.1
Loading production environment (Rails 3.0.4)
irb(main):001:0>

Rake

レイクはコンソールと同様に付加プロセスとして実行することが出来ます:

:::term
$ heroku run rake db:migrate

Webサーバー

デフォルトで、rails serverコマンドで使用されるWebサーバーは、Webrickとなります。これはテスト環境では良いかもしれません。 ですが、本番環境ではもっと堅牢なWebサーバーへ切り替えたくなるかもしれません。我々は、Thinを推奨します。

ThinをRails3で使用するには、Gemfileへ以下のものを追加して下さい。:

:::ruby
gem 'thin'

bundle installコマンドを実行し、ローカルのバンドルをセットアップして下さい。

Procfile(プロックファイル)

Procfileを以下のようにクリエイトすることで、webプロセスを起動するために使われるコマンド(rails server) を変更して下さい。:

web: bundle exec rails server thin -p $PORT -e $RACK_ENV

あなたの環境のRACK_ENVへ開発用(development)をセットして下さい。

$ echo "RACK_ENV=development" >>.env

Foremanを使い、ローカルでプロックファイルをテストして下さい。

$ foreman start
11:35:11 web.1     | started with pid 3007
11:35:14 web.1     | => Booting thin
11:35:14 web.1     | => Rails 3.0.4 application starting in development on http://0.0.0.0:5000
11:35:14 web.1     | => Call with -d to detach
11:35:14 web.1     | => Ctrl-C to shutdown server
11:35:15 web.1     | >> Thin web server (v1.2.8 codename Black Keys)
11:35:15 web.1     | >> Maximum connections set to 1024
11:35:15 web.1     | >> Listening on 0.0.0.0:5000, CTRL+C to stop

いい感じです。さて、Ctrl-Cを押して、exitしましょう。 変更をHerokuへディプロイしましょう。:

$ git add .
$ git commit -m "use thin via procfile"
$ git push heroku

psコマンドで確認して下さい。webプロセスが、Thinをwebサーバーとして使用していることを確認出来るでしょう:

:::term
$ heroku ps
Process       State               Command
------------  ------------------  ------------------------------
web.1         starting for 3s     bundle exec rails server thin -p $..

ログにもThinを使用していることが反映されています:

:::term
$ heroku logs
2011-03-10T11:38:43-08:00 heroku[web.1]: State changed from created to starting
2011-03-10T11:38:47-08:00 heroku[web.1]: Running process with command: `bundle exec rails server thin -p 34533`
2011-03-10T11:38:50-08:00 app[web.1]: => Booting Thin
2011-03-10T11:38:50-08:00 app[web.1]: => Rails 3.0.4 application starting in production on http://0.0.0.0:34533
2011-03-10T11:38:50-08:00 app[web.1]: => Call with -d to detach
2011-03-10T11:38:50-08:00 app[web.1]: => Ctrl-C to shutdown server
2011-03-10T11:38:50-08:00 app[web.1]: >> Thin web server (v1.2.7 codename No Hup)
2011-03-10T11:38:50-08:00 app[web.1]: >> Maximum connections set to 1024
2011-03-10T11:38:50-08:00 app[web.1]: >> Listening on 0.0.0.0:34533, CTRL+C to stop
2011-03-10T11:38:55-08:00 heroku[web.1]: State changed from starting to up

Rails 3.1とアセットパイプライン

Herokuへディプロイする際、Rails 3.1+ asset pipeline の呼び出しには、いくつかのオプションがあります。 詳細は、Rails 3.1+ Asset Pipeline on Heroku Cedar を参照して下さい。

トラブルシューティング

アプリをプッシュしたけれども、それがクラッシュしてしまった場合(heroku psコマンドがcrashedの状態を返す場合)、 何が悪いのかを発見するために、ログを確認して下さい。

ソースファイルのrequireに失敗する場合

もし、ソースファイルのrequireに失敗する場合、ローカル環境でRuby 1.9.1、または1.8を使用しているのであれば、 解決する可能性が高いです。ロードパスがRuby 1.9で変更となっています。あなたのアプリをRuby 1.9.2へ移行して下さい。 Cedarへプッシュする前にローカルで動作することを確認して下さい。

エンコーディングのエラー

Ruby 1.9では、より洗練されたエンコーディングサポートを機能付加しています。全てのgemsがRuby 1.9で動作するわけではありません。 (特定のgemの情報は、こちらを参照して下さい。isitruby19) もし、エンコーディングのエラーが発生するのであれば、あなたのローカル環境で、Ruby 1.9.2を使用した十分なテストが行えていません。 あなたのアプリをRuby 1.9.2へ移行して下さい。Cedarへプッシュする前にローカルで動作することを確認して下さい。

gemの紛失

もし、gemの紛失により、アプリがクラッシュしてしまった場合、ローカルでは、そのgemをインストールしているものの、 Gemfileの中に明記されていない可能性があります。**全てのローカル上でのテストは、bundle execコマンドを使用し、 分離する必要があります。例えば、ruby web.rbと実行するのではなく、bundle exec ruby web.rbと実行して下さい。 rake db:migrateと実行するのではなく、bundle exec rake db:migrateと実行して下さい。

その他のアプローチとして、どのインストール済みのgemsにも触れていないことを確実にするために、 ブランクのRVM gemsetをクリエイトする方法があります。:

:::term
$ rvm gemset create myapp
$ rvm gemset use myapp

開発とテストのgemsにおけるランタイムの依存関係

それでも、ディプロイ時に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へプッシュして下さい。

Clone this wiki locally