2
1

More than 3 years have passed since last update.

Rails6.0をHerokuにデプロイした時の失敗話

Last updated at Posted at 2020-05-28

背景

 個人でRailsアプリをHerokuへデプロイしようした際に、つまづいたポイントが2点あったので記事にします。

  1. DBをMySQLで作成してしまった。
  2. master.keyの設定をミスっていた。

1. DBをMySQLで作成してしまった。

 結論:HerokuへデプロイするならPostgreSQLを使うべきです。

なぜMySQLだといけないのか

 Herokuの無料枠でMySQLを使う場合、ストレージが5 MBの制限があります。一方PostgreSQLの場合、ストレージ制限ではなく、10,000行使用可能になります。個人アプリで5 MB、使用すことはあっても10,000レコード使うことは少ないと思うのでPostgreSQLを使用することをお勧めします。

MySQL ⇒ PostgreSQL へ変更

Rails6.0からデータベースの変更は簡単に行えるようになりました。ターミナルで以下のコマンドを実行すると

ターミナル
rails db:system:change --to=postgresql

PostgreSQLのデータをGUIで操作する。

 MySQLではSequel Proを使ってデータをGUI操作していました。
 PostgreSQLではPosticoを使ってデータをGUI操作します。
 参考:PostgreSQLのデータをGUIでいじる
 本番環境のPostgreSQLへのアクセスは次の記事がとても参考になりました。
How to Set Up Postico 3 to Connect to a Remote PostgreSQL Server (Heroku)

2. master.keyの設定をミスっていた。

Herokuにデプロイする

 公式サイトをGetting Started on Heroku with Rails 6.x を参考にしながら行いました。
 Herokuアカウントを所持していたのと、rails db:system:changeコマンドを実行済みであったので、Deploy your application to Herokuから手順を進めました。

エラーの発生

 git push heroku masterでprecompile assets faildのエラー発生。ログを読んで見ると、ActiveSupport::MessageEncryptor::InvalidMessageの文字。
早速のググると、直ぐに原因は分かりました。
 Herokuの環境変数にmaster.keyをセットしていなかった。次のコマンドを打って再トライ。

ターミナル
heroku config:set RAILS_MASTER_KEY= <ご自身のmaster.key内の値>

 私の場合は、ここでエラーが解決せず数日間悩みました。
 原因は、ローカルの~/.bash_profileに別のRailsアプリケーションのRAILS_MASTER_KEYを設定していた為でした。
 本アプリケーションのmaster.keyよりも優先してENV[RAILS_MASTER_KEY]が、credentials.yml.enc のペアになっていました。

対処

ターミナル
vim ~/.bash_profile
.bash_profile
# 以下の記述を削除
export RAILS_MASTER_KEY="################################"

config/credentials.yml.encとconfig/master.keyを削除

ターミナル
EDITOR=vim rails credentials:edit

を実行して、config/credentials.yml.encとconfig/master.keyを再生成。
新しいmaster.keyの値をHerokuの環境変数に設定する。

ターミナル
heroku config:set RAILS_MASTER_KEY= <ご自身のmaster.key内の値>

 再びコマンドを打ち込むと、無事デプロイに成功しました。

ターミナル
git push heroku master

余談

.bash_profileから消した環境変数が反映されないと思ったらbashではなくzshを使っていた件

ここではターミナルをbashを使って説明しましたが、実際にはzshに変更していた為にさらに時間がかかりました。

症状

ターミナル
% printenv
 :
RAILS_MASTER_KEY="################################"
 : 
% vim ~/.bash_profile
.bash_profile
# 以下の記述を削除
export RAILS_MASTER_KEY="################################"
ターミナル
% source ~/.bash_profile
% printenv
 :
#RAILS_MASTER_KEYが消えています。
 : 

一旦は環境変数が消えますが、ターミナルを再起動すると、なぜか消したはずの環境変数が復活していました。what's!?

ターミナル
% printenv
 :
RAILS_MASTER_KEY="################################"
 : 

原因

ターミナルをbashではなくzshを使っていた。

環境変数はターミナルごとで管理しているので、bashとzshで記述するファイルが異なります。

  • bashでは、~/.bash_profile
  • zshでは、~/.zprofile

対処

 上記の操作を~/.zprofileに変更して行うと、うまくいきました。

ターミナル
% printenv
 :
RAILS_MASTER_KEY="################################"
 : 
% vim ~/.zprofile
.zprofile
# 以下の記述を削除
export RAILS_MASTER_KEY="################################"
ターミナル
% source ~/.zprofile

 初歩的なミスで数日時間を取られてしました。
 エラー解決のきっかけは、たまたま同じ事をしている記事が見つけたからです。
 小さなエラー解決の記事でも、誰かの助けになる事が身に沁みました。だから私もこの記事を書くことに決めました。

参考

.bash_profileに書いた環境変数が反映されないと思ったらbashではなくzshを使っていた件

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1