背景
個人でRailsアプリをHerokuへデプロイしようした際に、つまづいたポイントが2点あったので記事にします。
- DBをMySQLで作成してしまった。
- 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
# 以下の記述を削除
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
# 以下の記述を削除
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
# 以下の記述を削除
export RAILS_MASTER_KEY="################################"
% source ~/.zprofile
初歩的なミスで数日時間を取られてしました。
エラー解決のきっかけは、たまたま同じ事をしている記事が見つけたからです。
小さなエラー解決の記事でも、誰かの助けになる事が身に沁みました。だから私もこの記事を書くことに決めました。