Heroku スターターガイド (Rails 4.x)
最終更新日 2020年06月12日(金)
Table of Contents
Rails の利用可能な最新バージョンは Rails 5 です。新しいアプリケーションを開始する場合は、最新リリースバージョンを使用することをお勧めします。
Ruby on Rails は、Ruby で記述され、広く使われている Web フレームワークです。このガイドでは、Heroku での Rails 4 の使用について説明します。Heroku での Rails 旧バージョンの実行の詳細については、「Heroku スターターガイド (Rails 3.x)」を参照してください。
すでに Heroku および Rails に詳しい場合は、シンプルな Heroku (Rails 4) のガイドを参照してください。Heroku で使用するためにアプリを開発および設計する方法の一般的な情報については、「Architecting Applications for Heroku」 (Heroku のアプリケーション設計) を参照してください。
このガイドでは、以下が必要となります。
- Ruby/Rails に関する基本的な知識
- Ruby 2.0.0+、Rubygems、Bundler、Rails 4 のローカルにインストールされたバージョン+
- Git に関する基本的な知識
- Heroku ユーザーアカウント: 無料ですぐにサインアップできます
ローカルワークステーションの設定
Heroku Toolbelt をローカルワークステーションにインストールします。これにより、Heroku コマンドラインクライアント、Foreman、Git リビジョン管理システムにアクセスできるようになります。Ruby と Rails をインストールする必要もあります。
インストールすると、コマンドシェルから $ heroku
コマンドにアクセスできます。Heroku アカウントを作成したときに使用したメールアドレスとパスワードでログインします。
コマンドの前にある $
シンボルは、これらのコマンドはコマンドライン、プロンプト、ターミナルで適切なアクセス許可で実行する必要があることを示しています。$
シンボルはコピーしないでください。
$ heroku login
Enter your Heroku credentials.
Email: schneems@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
プロンプトで Enter キーを押し、後でコードのプッシュに使用するため、既存の ssh
キーをアップロードするか新しいキーを作成します。
アプリの記述
Heroku でアプリを実行するには、Postgres データベースで使用できるようにアプリを設定し、Gemfile
ですべての依存関係を宣言し、rails_12factor
gem が Gemfile
の本番環境グループにあるようにする必要があります。
既存のアプリで始める場合は、Rails 4 にアップグレードしてから続行してください。そうでない場合、vanilla Rails 4 は適切なサンプルアプリとして機能します。新しいアプリを構築するには、$ rails -v
を使用して、Rails 4.x を使用していることを確認してください。Rails の新しいバージョンは、以下を実行すると取得できます。
$ gem install rails -v 4.2.9 --no-document
Successfully installed rails-4.2.9
1 gem installed
注意: Rails のより新しいバージョンが利用可能な場合があります。常に最新の Rails を実行することをお勧めします。Rails 5 を Heroku で実行できます。
次に、新しいアプリを作成します。
作成したら、アプリケーションのディレクトリに移動します。
$ cd myapp
問題が発生したり、このチュートリアルで先に進むことができなくなったりした場合、このドキュメントで解決方法が後述されている可能性があります。問題が発生したら、ドキュメント全体を読んでから現在の手順に戻ってみてください。これまでの手順がすべて正しく行われているかを確認することも、解決に役立つ場合があります。
--database=postgresql
を指定せずに作成されたアプリがある場合は、Rails プロジェクトに pg
gem を追加する必要があります。Gemfile
を編集し、以下の行を変更します。
gem 'sqlite3'
変更後は次のようになります。
gem 'pg'
開発には PostgreSQL を使用することを強くお勧めします。処理中の開発と開発環境を一致させることで、環境の違いによる微妙なバグの発生が阻止されます。Postgres はローカルにインストールしてください (まだシステムにない場合)。
(新しい Gemfile.lock
を生成するために) 依存関係を再インストールします。
$ bundle install
この変更が必要な理由、および postgres がローカルで実行されるようにアプリを設定する方法の詳細については、「why you cannot use Sqlite3 on Heroku」 (Heroke で Sqlite3 を使用できない理由) を参照してください。
pg
gem の使用に加えて、config/database.yml
で postgresql
アダプターが使用されていることも確認する必要があります。
config/database.yml
ファイルの開発セクションの外観は次のようになります。
$ cat config/database.yml
# PostgreSQL. Versions 8.2 and up are supported.
#
# Install the pg driver:
# gem install pg
# On OS X with Homebrew:
# gem install pg -- --with-pg-config=/usr/local/bin/pg_config
# On OS X with MacPorts:
# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
# gem install pg
# Choose the win32 build.
# Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem 'pg'
#
default: &default
adapter: postgresql
encoding: unicode
# For details on connection pooling, see rails configuration guide
# http://guides.rubyonrails.org/configuring.html#database-pooling
pool: 5
adapter
セクションの postgresql
の末尾で sql
を省略するとアプリケーションが機能しないため、注意してください。
ウェルカムページ
Rails 4 の本番環境には静的なインデックスページがありません。新しいアプリを使用するとき、本番環境にはルートページがないため、ルートページを作成する必要があります。最初に、welcome
と呼ばれるコントローラーを作成し、ホームページが本番稼働するようにします。
$ rails generate controller welcome
次に、インデックスページを追加します。
ファイル app/views/welcome/index.html.erb
で、以下のように記述します。
<h2>Hello World</h2>
<p>
The time is now: <%= Time.now %>
</p>
その後、Rails をこのアクションにルーティングする必要があります。config/routes.rb
を編集して、新しいメソッドにインデックスページを設定します。
ファイル config/routes.rb
の 2 行目に以下を追加します。
root 'welcome#index'
サーバーを実行して、このページが存在することを検証できます。
$ rails server
さらに、ブラウザで http://localhost:3000 にアクセスします。ページが表示されない場合、サーバーに出力されたログを使用してデバッグします。
Heroku gem
これまで、Heroku の統合は Rails プラグインシステム (Rails 4 で削除) の使用に依存していました。静的なアセットの提供やログ記録などの機能を Heroku で有効にするには、Gemfile
に rails_12factor
gem を追加してください。
Gemfile
の末尾に以下を追加します。
gem 'rails_12factor', group: :production
次に、以下を実行します。
$ bundle install
Rails の統合については、Ruby サポートページでより詳細に説明されています。
アプリでの Ruby バージョンの指定
Rails 4 では、Ruby 1.9.3 以上が必要です。Heroku にはデフォルトで Ruby の最新バージョンがインストールされていますが、Gemfile
で ruby
DSL を使用して、特定のバージョンを指定することができます。このガイドでは、Ruby 2 を使用します。
Gemfile
の末尾に以下を追加します。
ruby "2.3.4"
同じ Ruby のバージョンをローカルでも実行している必要があります。これは、$ ruby -v
を実行して確認できます。ここから、Heroku での Ruby バージョンの指定に関する詳細を確認できます。
Git でのアプリの保存
Heroku では、プロジェクトのデプロイを分散型ソース管理ツールである Git に依存しています。プロジェクトがまだ Git で管理されていない場合は、システムに git
があることを検証してください。
$ git --help
usage: git [--version] [--help] [-C <path>] [-c name=value]
[--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>]
<command> [<args>]
出力がない、または command not found
が出力される場合は、システムへのインストールが必要です。Heroku Toolbelt がインストールされていることを確認してください。
Git が機能することを検証した後、$ ls
を実行して Rails アプリのディレクトリにいることを確認してください。
出力は以下のようになります。
$ ls
Gemfile
Gemfile.lock
README.rdoc
Rakefile
app
bin
config
config.ru
db
lib
log
public
test
tmp
vendor
次に、Rails アプリのディレクトリで以下のコマンドを実行し、コードを初期化して Git にコミットします。
$ git init
$ git add .
$ git commit -m "init"
以下を実行し、すべてが正しくコミットしているかどうかを確認できます。
$ git status
On branch master
nothing to commit, working tree clean
アプリケーションが Git にコミットされ、Heroku にデプロイできるようになりました。
Heroku へのアプリケーションのデプロイ
Rails アプリが含まれるディレクトリにいることを確認してから、Heroku でアプリを作成します。
$ heroku create
Creating app... done, secret-taiga-10886
https://secret-taiga-10886.herokuapp.com/ | https://git.heroku.com/secret-taiga-10886.git
以下を実行して、リモートがプロジェクトに追加されていることを確認できます。
$ git config --list | grep heroku
remote.heroku.url=https://git.heroku.com/secret-taiga-10886.git
remote.heroku.fetch=+refs/heads/*:refs/remotes/heroku/*
fatal: not in a git directory
が表示される場合は、ディレクトリが正しくない可能性があります。表示されなければ、コードをデプロイできます。コードをデプロイした後、データベースを移行する必要があります。データベースが適切にスケールされていることを確認し、問題はログを使用してすべてデバッグしてください。
コードをデプロイします。
$ git push heroku master
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.3.4
remote: -----> Installing dependencies using bundler 1.15.2
remote: Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
remote: Warning: the running version of Bundler (1.15.2) is older than the version that created the lockfile (1.15.4). We suggest you upgrade to the latest version of Bundler by running `gem install bundler`.
remote: Fetching gem metadata from https://rubygems.org/..........
remote: Fetching version metadata from https://rubygems.org/..
remote: Fetching dependency metadata from https://rubygems.org/.
remote: Fetching rake 12.0.0
remote: Fetching i18n 0.8.6
remote: Fetching minitest 5.10.3
remote: Installing i18n 0.8.6
remote: Installing rake 12.0.0
remote: Installing minitest 5.10.3
remote: Fetching thread_safe 0.3.6
remote: Installing thread_safe 0.3.6
remote: Fetching builder 3.2.3
remote: Fetching erubis 2.7.0
remote: Installing builder 3.2.3
remote: Fetching mini_portile2 2.2.0
remote: Installing erubis 2.7.0
remote: Installing mini_portile2 2.2.0
remote: Fetching rack 1.6.8
remote: Fetching mime-types-data 3.2016.0521
remote: Installing rack 1.6.8
remote: Installing mime-types-data 3.2016.0521
remote: Fetching arel 6.0.4
remote: Installing arel 6.0.4
remote: Using bundler 1.15.2
remote: Fetching coffee-script-source 1.12.2
remote: Installing coffee-script-source 1.12.2
remote: Fetching execjs 2.7.0
remote: Fetching thor 0.20.0
remote: Installing execjs 2.7.0
remote: Fetching concurrent-ruby 1.0.5
remote: Installing thor 0.20.0
remote: Fetching ffi 1.9.18
remote: Installing concurrent-ruby 1.0.5
remote: Fetching multi_json 1.12.1
remote: Installing multi_json 1.12.1
remote: Fetching json 1.8.6
remote: Installing json 1.8.6 with native extensions
remote: Fetching pg 0.21.0
remote: Installing ffi 1.9.18 with native extensions
remote: Installing pg 0.21.0 with native extensions
remote: Fetching rails_serve_static_assets 0.0.5
remote: Installing rails_serve_static_assets 0.0.5
remote: Fetching rails_stdout_logging 0.0.5
remote: Installing rails_stdout_logging 0.0.5
remote: Fetching rb-fsevent 0.10.2
remote: Installing rb-fsevent 0.10.2
remote: Fetching rdoc 4.3.0
remote: Installing rdoc 4.3.0
remote: Fetching tilt 2.0.8
remote: Installing tilt 2.0.8
remote: Fetching turbolinks-source 5.0.3
remote: Installing turbolinks-source 5.0.3
remote: Fetching tzinfo 1.2.3
remote: Installing tzinfo 1.2.3
remote: Fetching nokogiri 1.8.0
remote: Installing nokogiri 1.8.0 with native extensions
remote: Fetching mime-types 3.1
remote: Installing mime-types 3.1
remote: Fetching rack-test 0.6.3
remote: Installing rack-test 0.6.3
remote: Fetching coffee-script 2.4.1
remote: Installing coffee-script 2.4.1
remote: Fetching uglifier 3.2.0
remote: Installing uglifier 3.2.0
remote: Fetching sprockets 3.7.1
remote: Installing sprockets 3.7.1
remote: Fetching rails_12factor 0.0.3
remote: Installing rails_12factor 0.0.3
remote: Fetching turbolinks 5.0.1
remote: Installing turbolinks 5.0.1
remote: Fetching activesupport 4.2.9
remote: Installing activesupport 4.2.9
remote: Fetching rb-inotify 0.9.10
remote: Installing rb-inotify 0.9.10
remote: Fetching mail 2.6.6
remote: Installing mail 2.6.6
remote: Fetching rails-deprecated_sanitizer 1.0.3
remote: Installing rails-deprecated_sanitizer 1.0.3
remote: Fetching globalid 0.4.0
remote: Installing globalid 0.4.0
remote: Fetching activemodel 4.2.9
remote: Installing activemodel 4.2.9
remote: Fetching jbuilder 2.7.0
remote: Installing jbuilder 2.7.0
remote: Fetching sass-listen 4.0.0
remote: Installing sass-listen 4.0.0
remote: Fetching activejob 4.2.9
remote: Installing activejob 4.2.9
remote: Fetching activerecord 4.2.9
remote: Installing activerecord 4.2.9
remote: Fetching sass 3.5.1
remote: Installing sass 3.5.1
remote: Fetching rails-dom-testing 1.0.8
remote: Fetching loofah 2.0.3
remote: Installing rails-dom-testing 1.0.8
remote: Installing loofah 2.0.3
remote: Fetching rails-html-sanitizer 1.0.3
remote: Installing rails-html-sanitizer 1.0.3
remote: Fetching sdoc 0.4.2
remote: Fetching actionview 4.2.9
remote: Installing sdoc 0.4.2
remote: Installing actionview 4.2.9
remote: Fetching actionpack 4.2.9
remote: Installing actionpack 4.2.9
remote: Fetching railties 4.2.9
remote: Fetching actionmailer 4.2.9
remote: Fetching sprockets-rails 3.2.0
remote: Installing sprockets-rails 3.2.0
remote: Installing actionmailer 4.2.9
remote: Installing railties 4.2.9
remote: Fetching jquery-rails 4.3.1
remote: Fetching rails 4.2.9
remote: Fetching coffee-rails 4.1.1
remote: Installing coffee-rails 4.1.1
remote: Fetching sass-rails 5.0.6
remote: Installing sass-rails 5.0.6
remote: Installing jquery-rails 4.3.1
remote: Installing rails 4.2.9
remote: Bundle complete! 13 Gemfile dependencies, 58 gems now installed.
remote: Gems in the groups development and test were not installed.
remote: Bundled gems are installed into ./vendor/bundle.
remote: The latest bundler is 1.15.4, but you are currently running 1.15.2.
remote: To update, run `gem install bundler`
remote: Bundle completed (27.77s)
remote: Cleaning up the bundler cache.
remote: -----> Installing node-v6.11.1-linux-x64
remote: -----> Detecting rake tasks
remote: -----> Preparing app for Rails asset pipeline
remote: Running: rake assets:precompile
remote: I, [2017-08-22T14:43:37.636715 #1379] INFO -- : Writing /tmp/build_2c1df257010d0249b8e774d0a81661c0/public/assets/application-da9278e46ebce38e9f8d754b05bbae46591ded89a2ae20880119fd551853710d.js
remote: I, [2017-08-22T14:43:37.637329 #1379] INFO -- : Writing /tmp/build_2c1df257010d0249b8e774d0a81661c0/public/assets/application-da9278e46ebce38e9f8d754b05bbae46591ded89a2ae20880119fd551853710d.js.gz
remote: I, [2017-08-22T14:43:37.648501 #1379] INFO -- : Writing /tmp/build_2c1df257010d0249b8e774d0a81661c0/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css
remote: I, [2017-08-22T14:43:37.648845 #1379] INFO -- : Writing /tmp/build_2c1df257010d0249b8e774d0a81661c0/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css.gz
remote: Asset precompilation completed (5.59s)
remote: Cleaning assets
remote: Running: rake assets:clean
remote:
remote: ###### WARNING:
remote: No Procfile detected, using the default web server.
remote: We recommend explicitly declaring how to boot your server process via a Procfile.
remote: https://devcenter.heroku.com/articles/ruby-default-web-server
remote:
remote: -----> Discovering process types
remote: Procfile declares types -> (none)
remote: Default types for buildpack -> console, rake, web, worker
remote:
remote: -----> Compressing...
remote: Done: 40.5M
remote: -----> Launching...
remote: Released v5
remote: https://secret-taiga-10886.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/secret-taiga-10886.git
* [new branch] master -> master
出力に警告やエラーがないかどうかを必ず確認してください。何も問題がなければ、データベースを移行できます。
データベースの移行
アプリケーションでデータベースを使用している場合は、以下を実行して手動でデータベースを移行する必要があります。
$ heroku run rake db:migrate
heroku run
の後のコマンドはすべて Heroku dyno で実行されます。$ heroku run bash
を実行して、対話型シェルセッションを取得できます。
アプリケーションへのアクセス
コードが Heroku にデプロイされ、プロセスタイプを実行するように Heroku に指示できるようになりました。Heroku では、これは dyno (Heroku の構成の基本単位である軽量コンテナ) で関連付けられているコマンドを実行して行われます。
1 つの dyno によって web
プロセスタイプが実行されていることを確認します。
$ heroku ps:scale web=1
アプリの dyno の状態をチェックできます。heroku ps
コマンドにより、アプリケーションで実行中の dyno の一覧が表示されます。
$ heroku ps
Free dyno hours quota remaining this month: 996h 46m (99%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping
=== web (Free): bin/rails server -p $PORT -e $RAILS_ENV (1)
web.1: starting 2017/08/22 09:43:52 -0500 (~ 6s ago)
ここでは、1 つの dyno が実行中です。
heroku open
を使用して、ブラウザでアプリにアクセスできます。
$ heroku open
すると、先ほど挿入したテキスト「Hello World」が表示されます。
Heroku では、開発中の複雑さをなくすため、デフォルトの URL が提供されます。スケールアップして Heroku を本番環境で使用する準備が整っている場合は、独自のカスタムドメインを追加できます。
ログの表示
アプリが適切に機能しないような問題が発生した場合は、ログをチェックする必要があります。
ログコマンドの 1 つである heroku logs
を使って、実行中のアプリに関する情報を表示できます。
$ heroku logs
2017-08-22T14:42:54.468569+00:00 app[api]: Release v1 created by user developer@example.com
2017-08-22T14:42:54.468569+00:00 app[api]: Initial release by user developer@example.com
2017-08-22T14:42:54.685326+00:00 app[api]: Enable Logplex by user developer@example.com
2017-08-22T14:42:54.685326+00:00 app[api]: Release v2 created by user developer@example.com
2017-08-22T14:42:57.000000+00:00 app[api]: Build started by user developer@example.com
2017-08-22T14:43:48.157491+00:00 app[api]: Set LANG, RACK_ENV, RAILS_ENV, RAILS_SERVE_STATIC_FILES, SECRET_KEY_BASE config vars by user developer@example.com
2017-08-22T14:43:48.157491+00:00 app[api]: Release v3 created by user developer@example.com
2017-08-22T14:43:51.934541+00:00 app[api]: Release v4 created by user developer@example.com
2017-08-22T14:43:51.934541+00:00 app[api]: Attach DATABASE (@ref:postgresql-polished-22293) by user developer@example.com
2017-08-22T14:43:52.475133+00:00 app[api]: Deploy 867eb0fa by user developer@example.com
2017-08-22T14:43:52.494644+00:00 app[api]: Scaled to console@0:Free rake@0:Free web@1:Free worker@0:Free by user developer@example.com
2017-08-22T14:43:52.475133+00:00 app[api]: Release v5 created by user developer@example.com
2017-08-22T14:42:57.000000+00:00 app[api]: Build succeeded
2017-08-22T14:43:55.571309+00:00 heroku[web.1]: Starting process with command `bin/rails server -p 26139 -e production`
2017-08-22T14:43:59.605221+00:00 app[web.1]: [2017-08-22 14:43:59] INFO WEBrick 1.3.1
2017-08-22T14:43:59.605237+00:00 app[web.1]: [2017-08-22 14:43:59] INFO ruby 2.3.4 (2017-03-30) [x86_64-linux]
2017-08-22T14:43:59.605560+00:00 app[web.1]: [2017-08-22 14:43:59] INFO WEBrick::HTTPServer#start: pid=4 port=26139
2017-08-22T14:43:59.989962+00:00 heroku[web.1]: State changed from starting to up
以下のように --tail
フラグオプションを使用してログコマンドを実行することで、完全なログストリームを入手することもできます。
$ heroku logs --tail
dyno のスリープおよびスケーリング
デフォルトでは、アプリは Free dyno でデプロイされます。Free dyno はアイドル状態が 30 分続くとスリープし、スリープする前のアクティブな (トラフィックを受信する) 状態でいられるのは、一日あたり 18 時間未満です。 Flee dyno がスリープ状態で、18 時間を超過していない場合は、Web リクエストによってスリープ解除されます。スリープすると、スリープ解除するときの最初のリクエスト時に数秒の遅延が発生します。その後のリクエストは正常に処理されます。
$ heroku ps:scale web=1
dyno がスリープしないようにするには、「dyno タイプ」の記事で紹介されている Hobby または Professional の dyno タイプにアップグレードできます。たとえば、アプリを Professional dyno に移行すると、Heroku に特定の数の dyno の実行を指示するコマンドを実行し、各 dyno で Web プロセスタイプを実行させて、アプリを簡単にスケールすることができます。
コンソール
Heroku では、heroku run
コマンドを使用して、One-off dyno (必要な場合にのみ実行するスクリプトおよびアプリケーション) でコマンドを実行できます。これを使用して、アプリの環境で試行するためにローカルターミナルにアタッチされた Rails コンソールプロセスを起動します。
$ heroku run rails console
irb(main):001:0> puts 1+1
2
Rake
Rake は、コンソールと同様に、アタッチされたプロセスとして実行できます。
$ heroku run rake db:migrate
Web サーバー
デフォルトで、アプリの Web プロセスでは、Webrick を使用する rails server
が実行されます。テストにはこれで十分ですが、本番環境のアプリではより堅牢な Web サーバーに切り替えてください。Cedar の場合、Web サーバーには Puma をお勧めします。選択した Web サーバーには関係なく、本番環境のアプリでは Procfile
で明示的に Web サーバーが常に指定される必要があります。
最初に、Puma をアプリケーションの Gemfile
に追加します。
Gemfile
の末尾に以下を追加します。
gem 'puma'
次に、以下を実行します。
$ bundle install
これで、アプリで Puma が使用されるように設定する準備が整いました。このチュートリアルでは Puma のデフォルト設定を使用しますが、config/puma.rb
ファイルを生成し、Puma のドキュメントを読んでパフォーマンスを最大限にするためのアプリケーションの設定について確認することをお勧めします。
最後に、アプリケーションディレクトリのルートで Procfile
を作成し、Rails の実行方法を Heroku に伝える必要があります。
Procfile
Procfile を呼ばれるファイルを作成し、以下を入力して、Web プロセスを起動するのに使用するコマンドを変更します。
ファイル Procfile
で、以下のように記述します。
web: bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-development}
注意: Procfile
の大文字と小文字は区別されます。最初の文字は大文字でなければなりません。
パフォーマンスを最大限にするために、Puma のドキュメントに基づいて設定ファイルを生成することをお勧めします。
環境で RACK_ENV
を開発に設定し、接続先の PORT
を設定します。Heroku にプッシュする前に、Heroku アプリが実行される環境となる本番環境に設定された RACK_ENV
でテストする必要があります。
$ echo "RACK_ENV=development" >>.env
$ echo "PORT=3000" >> .env
さらに、ローカル環境の設定として、.env
を .gitignore
に追加する必要があります。
$ echo ".env" >> .gitignore
$ git add .gitignore
$ git commit -m "add .env to .gitignore"
Foreman を使用して、Procfile をローカルでテストします。
$ gem install foreman
これで、以下を実行して Web サーバーを起動できます。
$ 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 を押して終了し、変更を Heroku にデプロイできます。
$ git add .
$ git commit -m "use puma via procfile"
$ git push heroku master
ps
をチェックすると、Web プロセスによって、Web サーバーとして Puma を指定している新しいコマンドが使用されていることが分かります。
$ heroku ps
Free dyno hours quota remaining this month: 996h 46m (99%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping
=== web (Free): bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-development} (1)
web.1: starting 2017/08/22 09:44:31 -0500 (~ 3s ago)
ログにも、Puma が使用されていることが反映されています。
$ heroku logs
Rails アセットパイプライン
Heroku へのデプロイ時に Rails アセットパイプラインを起動する方法は複数あります。アセットパイプラインに関する一般的な情報については、「Rails 3.1+ Asset Pipeline on Heroku Cedar」 (Heroku Ceder での Rails 3.1 およびアセットパイプライン) の記事を参照してください。
config.assets.initialize_on_precompile
オプションは削除済みであり、Rails 4 では必要ありません。また、アセットコンパイルにおけるエラーはプッシュが失敗する原因となります。Rails 4 アセットパイプラインのサポートについては、Ruby サポートページを参照してください。
トラブルシューティング
プッシュしたアプリがクラッシュした (heroku ps
でステータス crashed
が表示された) 場合は、ログをチェックしてクラッシュの原因を見つけてください。一般的な問題には、たとえば以下があります。
開発/テスト gem でのランタイムの依存関係
デプロイ時に gem がない場合は、Bundler グループをチェックしてください。Heroku では、アプリは development
や test
グループなしで構築されます。アプリの実行がこれらのグループのいずれかからの gem に依存している場合、これをグループから除外します。
最もよくある例の 1 つとして、Rakefile
で Rspec タスクを使用する場合があります。Heroku のデプロイで以下が表示されます。
$ 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
そして、以下の問題が発生します。最初に、問題をローカルにコピーします。
$ bundle install --without development:test
…
$ bundle exec rake -T
rake aborted!
no such file to load -- rspec/core/rake_task
これらの Rake タスクを gem のロード時に条件付きにすることで、問題を解消できます。たとえば、次のようになります。
Rakefile
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 にプッシュします。
完了
これで、最初のアプリケーションが Heroku にデプロイされました。次のステップは、独自のアプリケーションのデプロイです。より詳細な情報については、「Ruby on Heroku at the Dev Center」 (Dev Center における Heroku での Ruby の使用) を参照してください。