Herokuデプロイ最速手順(MySQL)


ようやくHerokuを使ってデプロイが出来ました。
AWSよりは簡単にデプロイ出来ましたが、少し詰まったところもありましたので、
Herokuへのデプロイ最速手順を備忘録として残します。

参考にさせていただいたページ

事前準備

  • Herokuアカウントを取得しておきましょう
    Heroku公式サイト
  • HerokuでMySQLを使用するためにクレジットカードを登録しておきましょう
    (Herokuの右上のユーザー情報から"Account Setting" → "Billing"にてクレジットカードを設定できます)
    ※ 超過しない限り請求されることはありません。
  • gitへデプロイするアプリの保存をしておきましょう

HerokuのCLIを導入

ターミナル
$ brew install heroku/brew/heroku

Herokuコマンドが使えるか確認

ターミナル
$ heroku -v
herokuのバージョンが出てくればherokuコマンドが使えるので問題ありません

 ›   Warning: heroku update available ・・・・・
と表示された場合は下記コマンド入力してherokuをバージョンアップしましょう

$ heroku update

Herokuのリポジトリ用のアプリを作成

ターミナル
$ cd <デプロイしたいアプリ>

$ heroku create <アプリ名>
#ここで入力したアプリ名がURLに入ります(https://<アプリ名>.herokuapp.com)

$ heroku rename <変更したいアプリ名>
#アプリ名を変更した場合はこちらを入力

Herokuホームページでもリポジトリは作成できますが、
今回はCLIでのデプロイ方法となりますので割愛いたします。

Databeseを設定

config/database.yml
production:
  <<: *default
  url: <%= ENV['DATABASE_URL'] %>
  database: <%= ENV['DATABASE_USERNAME'] %>
  username: <%= ENV['DATABASE_PASSWORD'] %>
  password: <%= ENV['RAILS_MASTER_KEY'] %>

プリコンパイルの設定

※こちらはアプリケーションのパフォーマンスに悪影響を及ぼす場合はあるため設定しないでください。

以下Herokuのヘルプページより引用

本番環境でアプリケーションの config.assets.compile = true を有効にすると、アプリケーションが非常に低速になる場合があります。
(中略)
この設定は、実行時にその他の不安定な動作の原因になることも知られているため、通常は推奨されません。

Heroku での Rails アセットパイプライン | Heroku Dev Center

config/environments/production.rb
config.assets.compile = true

Railsは本番環境での動的な画像の表示(プリコンパイル)がデフォルトでオフになっています。
画像を表示するために以下の記述をfalseからtrueに変更してください。
この記述により、assets以下のフォルダから動的にコンパイルしながらページを読み込みます。
また、以下の内容も指定のディレクトリに記述してください。

※以下も現在は使われない設定値のため、特に記述する必要はありません。

config/application.rb
config.assets.initialize_on_precompile = false

こちらは本番環境にて、プリコンパイルのタスクをRailsの起動無しで実行するように指定します。

尚、Herokuにデプロイ後、ブラウザで画像が表示されない場合は、以下記事を参考に画像の拡張子やパスを再度確認してみましょう。

(@jnchitoさんありがとうございます)

HerokuでRailsが使えるようgemを導入

※Rails 5以降ではこのgemのインストールは必要ありません。

Gemfile
gem 'rails_12factor', group: :production

入力後bundle installも忘れずに。

HerokuでMySQLを使用するため、環境変数を設定

ターミナル
$ heroku addons:create cleardb:ignite
#CLEARDB_DATABASE_URL: mysql://ユーザー名:パスワード@サーバー名/データベース?reconnect=true

cleardbというのがherokuでmysqlを使うためのアドオンになります。

環境変数を追加

ターミナル
$ heroku config:set DATABASE_URL=""
""の間に値を入れて追加していきます
(DATABASE_URLの部分をDB_PASSWORDやDB_USERNAMEに変える)

$ heroku config:set DB_USERNAME=""  #任意
$ heroku config:set DB_PASSWORD=""  #任意
$ heroku config:set SECRET_KEY_BASE="" #下記のコマンドを入力して確認
ターミナル
$ bundle exec rake secret RAILS_ENV=production
ここに出てくるデータがSECRET_KEY_BASEの値になります

環境変数はheroku configコマンドで確認が出来ます。
heroku configを入力し、入力した内容が反映されていれば完了です。

データベースのバージョンに注意

heroku configで環境変数を確認すると以下の様に出力されます。

ターミナル
=== <アプリ名> Config Vars
CLEARDB_DATABASE_URL:     mysql://bc***********f:9******6@us***********************05.cleardb.net/heroku_**************36?reconnect=true
DATABASE_URL:             mysql://bc***********f:9******6@us***********************05.cleardb.net/heroku_**************36?reconnect=true
DB_PASSWORD:              **********
DB_USERNAME:              **********
LANG:                     en_US.UTF-8
RACK_ENV:                 production
RAILS_ENV:                production
RAILS_LOG_TO_STDOUT:      enabled
RAILS_SERVE_STATIC_FILES: enabled
SECRET_KEY_BASE:          e1b523***************89c41048d********************dd7f24****************f38bce8f************bbb*************0462bcf5*************cb052e7

CLEARDB_DATABASE_URLDATABASE_URLmysqlを使用する設定となっておりますが、
デプロイするアプリがmysql2を使用する場合は、どちらもmysql2に変更しないとページが表示されないので注意してください。

変更する際はHerokuのマイページより対象のアプリを選択、ダッシュボード内のsettingの中にあるConfig VarsReveal Config Varsをクリックすると環境変数が表示されますので、そこで変更しましょう。

Herokuにpushし自動デプロイを行います

ターミナル
$ git push heroku master
ターミナル
remote: -----> Discovering process types
remote:        Procfile declares types     -> (none)
remote:        Default types for buildpack -> console, rake, web
remote: 
remote: -----> Compressing...
remote:        Done: 51.6M
remote: -----> Launching...
remote:        Released v26
remote:        https://<アプリ名>.com/ deployed to Heroku
remote: 
remote: Verifying deploy... done.
To https://git.heroku.com/<アプリ名>.git
   6d73aed..b64f81f  master -> master

このような表示が出てきたら、ひとまずデプロイは完了です!

デプロイが完了したら本番環境でアプリを開きましょう

ターミナル
$ heroku open

ちゃんと本番環境で表示がされているか確認してみましょう。

本番環境上のログを確認するコマンド

ターミナル
$ heroku logs

本番環境でのログが確認できます。
ページが表示できない時や遷移したページが表示されない時は、
入力してエラー内容を確認してみましょう。

その他使用したコマンド

ターミナル
$ heroku run rake db:migrate 
# ローカルでマイグレーションファイルを追加した際は再度デプロイ後マイグレーションファイルの更新が必要

$ heroku run rake db:reset
# ローカルでのコマンド同様、本番環境でデータベースをリセットしたい時に使用

$ heroku run rake db:seed
# seedに初期データを登録していて本番環境のデータベースをリセットした際、再度seedを読み込むために必要

Heroku ClearDBとSequel Proを繋げる方法

本番環境のデータベースのレコードを見たい時ありますよね。
そんな時はSequel Proに繋いじゃいましょう!

ターミナル
$ heroku config --app <アプリ名>
=== アプリ名 Config Vars
CLEARDB_DATABASE_URL: mysql://ユーザー名:パスワード@ホスト/データベース?reconnect=true
〜〜〜〜

CLEARDB_DATABASE_URLの中身は上記のようなルールになっています。
これをSequel Proを立ち上げた際の接続情報に入力してあげればいいわけです。

ホストユーザー名パスワードの部分はCLEARDB_DATABASE_URLからコピー、
データベースポートは入力しなくても構いません。
名前は任意ですのでわかりやすい名前をつけて接続をクリックすれば完了です。