トーマスプログラム

プログラミングやデザインのメモ

Rails5で作ったアプリをHerokuでデプロイする手順

Herokuにデプロイする度に一から調べなおすのも面倒なので、メモがてら書いていきます。

ちなみに、今回はHeroku CLIを既に入れているという前提で紹介するので、あしからず。

1、HerokuにRailsアプリを入れる準備をする

まずは、Herokuに自身のアプリを入れるための準備をしよう。

まず、Herokuに新しいappを作るために、以下を入力する。(ちなみに、以下のコードを実行しなくても、herokuの画面上にある「new app」からでも同じように、新しいアプリが作れる)

    $ heroku create sample

cd myapp(自分のアプリ名)を入力して、以下のコードを入力。

git remote -v

おそらく、英語で「remoteできるバージョンは何もないよ」と言う文章が表示されるので、gitを初期化して、以下のコードを実行。

    git init
    heroku git:remote -a sample

これで、アプリにデプロイできるようになった。

2、アプリをデプロイする

1の作業が終わった後は、本番環境でアセットパイプラインが通るようにする。

アセットパイプラインとは、Railsの機能の1つで、本番環境においてファイルの読み込みを早くしてくれる機能のこと

開発環境では、cssファイルやjsファイルが「header.css」とか「post.css」のように小分けされているが、本番環境ではこれらのファイルを1つにまとめることで、より早く読み込ませるのがアセットパイプラインの役割だ。

アセットパイプラインを実行するためには、以下のコマンドを開発環境内で行う。

    rails assets:precompile RAILS_ENV=production

その後は、アプリをHerokuにデプロイしよう。全てのファイルのデプロイが完了するまで時間がかかる。

    git add .
    git commit -m "make it better"
 ```
git push heroku master
 

もし、以上の設定をしても上手くアプリが表示されない場合は、何かしらのエラーが発生している可能性が高いので、以下のコマンドを実行してエラーを確認&対策法を見つけよう。
heroku logs
### Gemfileにrubyのバージョンに関する警告の対処法

上記の方法でherokuのでデプロイを行うと、以下の様な警告が起こる。
remote: ###### WARNING:
remote: You have not declared a Ruby version in your Gemfile.
remote: To set your Ruby version add this line to your Gemfile:
remote: ruby '2.3.7'
上記のエラー(と言うより警告)は、「Gemfile内にRubyのバージョンを指定していないよ」と言うもの。  
特にRubyのバージョンを指定していなくても問題なくデプロイはできるが、念のためにRubyのバージョンを指定してもOK。
//Gemfile
ruby "~> 2.4.2"
  
今回はruby 2.4.2を使用していたので、上記のような一行を追記した。

### Procfileに関する警告の対処法

また、上記の方法でデプロイすると、以下のような警告も表示されると思う。
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.
上の警告文は「Procfileを設定してね。Procfileを設定してどのwebサーバーを使うか宣言することをおススメするよ」と言うもの。

Procfileとは、**どのwebサーバーを使うかを指定できるもの**だが、HerokuのデフォルトだとWeblickと言うサーバーを使っており、これをPumaに指定すると警告文が解消される。

(PumaはRailsに最初から入っているgemで、Herokuも使用を推奨している)

Pumaの設定をするためには、アプリのルートディレクトリにProcfileを作る。  
(アプリ名がsampleだとすると、Gemfileと同じようにsample/Procfileに作る。また、txtなどの拡張子は不要)

そして、Procfileに以下を記述。
//Procfile
web: bundle exec puma -C config/puma.rb
  
これだけで警告文がすべて無くなったはず。また、Rails5以上のバージョンでは最初からpuma.rbの設定が完了しているが、以前のバージョンでは自分でpuma.rbをカスタマイズする必要がある。

### gem 'devise'を入れている場合にエラーが起きた時の対処法

もし、アプリにgemに'devise'が入っていれば、以下のエラー文が発生する可能性がある。
Devise.secret_key was not set. Please add the following to your Devise initializer:
config.secret_key = '適当な文字列'

```

その時は、initializers/devise.rbに以下のコードを入れよう。

    config.secret_key = '適当な文字列'

これで、再度アセットパイプラインを実行すれば上手くいくはず。

3、Heroku上でのタイムゾーンとか文字コードの設定とか

Heroku上でのタイムゾーンは初期設定ではUTCになっているので、これを日本時刻に変更する。

    heroku config:add TZ=Asia/Tokyo

そして、ついでに文字コード等も設定しておく。

    heroku config:add LANG=ja_JP.UTF-8

4、Mysql2を使えるようにする

次に、Gemfileにmysql2を入れる。バージョンを指定する必要はないかもしれないが、私の場合はバージョンを指定しないと上手く動作しなかった。

gem 'mysql2', '>= 0.3.18', '< 0.5'

そして、config/database.ymlを以下の様に書き換える。(と言うより、これらの方法は開発時点でやるべきですね。)

ruby default: &default adapter: mysql2 encoding: utf8 pool: 5 username: root password: パスワード socket: /var/lib/mysql/mysql.sock development: <<: *default database: hello_rails_development test: <<: *default database: hello_rails_test production: <<: *default database: hello_rails_production username: パスワード password: <%= ENV['APP_DATABASE_PASSWORD'] %>

その後、bundle install をして、rails db:createをする。

ここまで終われば、今度はHeroku内でもMysql2を使えるようにする。(HerokuのデフォルトDBはPGなので、MYSQLを使う場合は設定する必要がある。)

まずは、以下のコマンドを実行。

    heroku addons:add cleardb:ignite

 

そして、heroku内のmysqlの設定内容を以下のコマンドで調べる。

    heroku config |  grep CLEARDB_DATABASE_URL

 

    CLEARDB_DATABASE_URL: mysql://[ユーザ名]:[パスワード]@[ホスト名]/[スキーマ名]?reconnect=true

上記のような表示が出ると思うので、この表示を参考に以下のコマンドを実行。

    heroku config:set DATABASE_URL='mysql2://[ユーザ名]:[パスワード]@[ホスト名]/[スキーマ名]?reconnect=true' 
    heroku config:set DATABASE_PASSWORD='[パスワード]'

もし、「DATABASE_PASSWORD is invalid. Must be in the format FOO=bar.」と言うエラーが発生する場合は

  • =の隣を半角空けていないか?(半角空けているとエラーになる)
  • パスワードは正しいか?

などをチェックする必要がある。

そして、上記の内容を参考に、config/database.ymlを書き直す。

    production: 
      <<:
      *default database: [スキーマ名]
      username: [ユーザ名] 
      password: <%= ENV['DATABASE_PASSWORD'] %>

その後は、git commitを行う。

最後に、以下のコマンドを実行してデータベースの作成は終わり。

    heroku run rails db:create
    heroku run rails db:migrate

補足:gem`rails_12factor'は入れなくて良いのか?

railsアプリをherokuにデプロイする解説記事を見ていると大半の記事は「rails_12factorを入れようね」と言う解説をしているが、結論から言うと、rails5以上のバージョンであれば、rails_12factorを入れる必要はない

実際にheroku公式の解説を見てみると、以下のように書かれている。

Previous versions of Rails required you to add a gem to your project rails_12factor to enable static asset serving and logging on Heroku. If you are deploying a new application this gem is not needed. If you are upgrading an existing application you can remove this gem provided you have the appropriate configuration in your config/environments/production.rb file:

(以前のRailsのバージョンではrails_12factorを入れる必要があったが、あなたが新しいアプリをデプロイする場合はその必要はない。

ただし、Rails4以下からRails5以上にバージョンアップする場合は、config/environments/production.rbに以下のコードを追記してね。)

参考記事:Getting Started with Rails 5.x on Heroku | Heroku Dev Center

かなりザックリと翻訳したが、要はRails5であればrails_12factorは不要だ、と言うのが分かる。