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

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

1. 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からデータベースの変更は簡単に行えるようになりました。ターミナルで以下のコマンドを実行すると

```ruby:ターミナル
rails db:system:change --to=postgresql
```
## PostgreSQLのデータをGUIで操作する。
　MySQLではSequel Proを使ってデータをGUI操作していました。
　PostgreSQLではPosticoを使ってデータをGUI操作します。
　参考：[PostgreSQLのデータをGUIでいじる](https://qiita.com/junara/items/8ee572151727288f6576 "PostgreSQLのデータをGUIでいじる")
　本番環境のPostgreSQLへのアクセスは次の記事がとても参考になりました。
[How to Set Up Postico 3 to Connect to a Remote PostgreSQL Server (Heroku)](https://medium.com/@danielnmai/how-to-set-up-postico-3-to-connect-to-a-remote-postgresql-server-heroku-f9704e1b7643)

# 2. master.keyの設定をミスっていた。
## Herokuにデプロイする
　公式サイトを[Getting Started on Heroku with Rails 6.x](https://devcenter.heroku.com/articles/getting-started-with-rails6#run-the-rails-console)　を参考にしながら行いました。
　Herokuアカウントを所持していたのと、`rails db:system:change`コマンドを実行済みであったので、[Deploy your application to Heroku](https://devcenter.heroku.com/articles/getting-started-with-rails6#deploy-your-application-to-heroku)から手順を進めました。

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

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

　私の場合は、ここでエラーが解決せず数日間悩みました。
　原因は、ローカルの~/.bash_profileに別のRailsアプリケーションのRAILS_MASTER_KEYを設定していた為でした。
　本アプリケーションのmaster.keyよりも優先して```ENV[RAILS_MASTER_KEY]```が、credentials.yml.enc のペアになっていました。
## 対処
```ruby:ターミナル
vim ~/.bash_profile
```
```ruby:.bash_profile
# 以下の記述を削除
export RAILS_MASTER_KEY="################################"
```
config/credentials.yml.encとconfig/master.keyを削除

```ruby:ターミナル
EDITOR=vim rails credentials:edit
```
を実行して、config/credentials.yml.encとconfig/master.keyを再生成。
新しいmaster.keyの値をHerokuの環境変数に設定する。

```ruby:ターミナル
heroku config:set RAILS_MASTER_KEY= <ご自身のmaster.key内の値>
```
　再びコマンドを打ち込むと、無事デプロイに成功しました。

```ruby:ターミナル
git push heroku master
```

# 余談

### .bash_profileから消した環境変数が反映されないと思ったらbashではなくzshを使っていた件
 ここではターミナルをbashを使って説明しましたが、実際にはzshに変更していた為にさらに時間がかかりました。
#### 症状
```bash:ターミナル
% printenv
 :
RAILS_MASTER_KEY="################################"
 : 
% vim ~/.bash_profile
```
```vim:.bash_profile
# 以下の記述を削除
export RAILS_MASTER_KEY="################################"
```
```bash:ターミナル
% source ~/.bash_profile
% printenv
 :
#RAILS_MASTER_KEYが消えています。
 : 
```
一旦は環境変数が消えますが、ターミナルを再起動すると、なぜか消したはずの環境変数が復活していました。what's!?

```bash:ターミナル
% printenv
 :
RAILS_MASTER_KEY="################################"
 : 
```
#### 原因
#####ターミナルをbashではなくzshを使っていた。
 環境変数はターミナルごとで管理しているので、bashとzshで記述するファイルが異なります。

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

#### 対処

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

```zsh:ターミナル
% printenv
 :
RAILS_MASTER_KEY="################################"
 : 
% vim ~/.zprofile
```
```vim:.zprofile
# 以下の記述を削除
export RAILS_MASTER_KEY="################################"
```
```bash:ターミナル
% source ~/.zprofile
```
　初歩的なミスで数日時間を取られてしました。
　エラー解決のきっかけは、たまたま同じ事をしている記事が見つけたからです。
　小さなエラー解決の記事でも、誰かの助けになる事が身に沁みました。だから私もこの記事を書くことに決めました。

# 参考
[.bash_profileに書いた環境変数が反映されないと思ったらbashではなくzshを使っていた件](http://pixelbeat.jp/bash_profile_not_working/)