railsのアセットパイプラインと本番環境のデプロイについて

#アセットパイプライン
#####基本
開発者が作成したJsやCSSを最終的に統合して、HTMLソースに落とし込めるようにする仕組み。本番環境でのみ行う。アセットパイプラインの処理はSprocketsによって実行される。

流れ
高級言語のコンパイル(cofeeやSCSS)、本番環境ではここから最後までの処理を行う。
↓
アセットの結合(複数のjsファイルをapplication.jsに統合、cssも同様)、開発環境では行わない。
↓
アセット最小化(コメントや改行を無くして圧縮する)、開発環境では行わない。
↓
ダイジェストの付与(これをするとファイルにハッシュ値(暗号化された値？)をつけてpublic/assets下に反映される、イメージがつかなければ参考文献をみる)
↓
HTMLでapplication.jsとapplication.cssが読み込まれる

#####マニフェストファイル(application.jsとapplication.cssのこと)
ここに記述することはどのJsやCSSを自身に統合するかを記述したり、別ファイルに書かれた設定を適用させる。
↓
探索パス(どこを探すかを指定する)を設定することでファイルの統合が簡単になる。
app/asset/*とlib/assets/*とvender/assets/*に探索パスが設定されている。それらの場所に探索パスが設定されるので、マニフェストファイルはその場所に統合するべき指定のファイルがないかを探す。

```rails:application.js
//= require slider
```

この意味はapp/asset/*とlib/assets/*とvender/assets/*にslider.jsがあるか探し、application.jsに統合するということ

ちなみに探索パスを配置する場所の設定を追加したい時はconfig/initializers/assetes.rbで記述してやる。

参考文献は現場railsのP270

#####開発環境と本番環境
上記で示したように開発環境では高級言語のコンパイル(cofeeやSCSS)しか行わないため、jsやscssのファイルが別々に存在している。
↓
なぜならば開発環境では開発しやすいコードやファイルの配置を行うべきだから、ファイルを連結して、改行やコメントを無くしたりするべきではない。

しかし本番環境では人間が理解しやすいコードや配置をする必要がなく、むしろスピードが求められるため、ファイルを連結、圧縮している。

参考文献は[【Rails】デプロイに強くなるアセットパイプラインまとめ（アセットプリコンパイルで何が起きているか）
](https://whatsupguys.net/programming-school-dive-into-code-learning-43/)

#####config/environments
ここには開発、テスト、本番のアセットパイプラインの設定をする。
設定とは開発環境ではアセットの連結や圧縮を行わないとか。

#####アセットプリコンパイル
本番環境で行われるファイルの連結、圧縮のこと。何度も書きますが本番環境でのみ行われる。

#本番環境でのデプロイ
デプロイ時やらないといけないこと
＊アセットパイプラインをどうするか
＊データベースの設定
＊secret_key_baseの設定

#####アセットパイプライン設定
アセットパイプライン設定のconfig/environmentsを行い、探索パスを増やしたければ
config/initializers/assetes.rbに記述。
↓
アセットプリコンパイル(ファイル連結、圧縮)を実施するために以下のコマンドを実施。これで統合されたマニフェストファイルがハッシュ値を持った状態でpublic/assetsに保存されるようになる。

```terminal
rails assets:precompile
```


#####データベースの設定
config/database.ymlのなかで各環境でのdb設定を記述できる。主にdatabase名、user名、そのパスワード、socket(MySQLアクセスに必要)を記述する。
user名とは本番環境でのSQLに関するユーザーの名前のことであるため、まず本番環境のSQLでログインとデータベース作成が可能なユーザーを作成し、パスワードも設定する。(database.ymlにはパスワードは環境変数として記述して、~/.bash_profileで環境変数定義をしてやる)
EC2でのMySQL設定には以下を参照させていただきました
[AWSのEC2で行うAmazon Linux2（MySQL5.7）環境構築](https://qiita.com/2no553/items/952dbb8df9a228195189)
[EC2にMySQLインストールと設定確認](https://qiita.com/toshihirock/items/c5933d3628c7d4e81ffa)

#####secret_key_baseの設定
これは本番環境で作成される秘密鍵でcookies整合性確認に使用される。保存方法は環境変数としてSECRET_KEY_BASEに保存する方法とcredentials.yml.encに保存する方法がある。

#####秘密情報の管理
本番環境にアプリを置くということは外部にアプリを置くということである。しかし外部には後悔したくない秘密情報をアプリに記述したい場合がある。その時はconfig/credential.yml.encに記述してやる。config/credential.yml.encは暗号化されている。この内容をアプリ内で使用する際はcinfig/master.keyによって復号され使用される。
また開発者が記述した秘密情報を新たにcredential.yml.encに追加したい場合も、master.keyによって暗号化されcredential.yml.encに反映される。

しかしmaster_keyはgitigoreに登録されているため、githubに共有できない。githubから本番環境にcloneしてもそこにはmaster_keyはない状態。通常credential.yml.encに紐づくmaster_keyはrails newした時にできる。だから開発環境で使用していたmaster_keyをコピペして使用するやり方がある。

また無理やりcredential.yml.encに編集を加えようとすると勝手にmaster_keyができるがそれは使えないらしい。そこでcredential.yml.encに大事な情報がなければ一度今のcredential.yml.encを削除して新たに

```
EDITOR=vim rails credentials:edit
```

をうつとcredential.yml.encとそれに紐づいたmaster_keyが作成される

[Rails 5.2 で ActiveSupport::MessageEncryptor::InvalidMessage](https://qiita.com/scivola/items/cc06ddbfd94d3118f693)

参考文献は[[Rails]credentials.yml.encについてまとめる](https://qiita.com/yamamoto_shuji/items/5afd9ffe13f36ff29677)
[Rails5.2から追加された credentials.yml.enc のキホン](https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39)
[
【Rails5.2】秘匿情報はsecret.ymlではなくcredentials.yml.encで管理する【初心者】](https://qiita.com/15grmr/items/a687d0ed211ef60e751c)

実際に自分でなんとかした事例
[master failed to start, check stderr log for detailsを解決したい](https://teratail.com/questions/249527?reply=true)

#補足
#####railsにMySQLを導入する時
EC2でのMySQL設定には以下を参照させていただきました
[AWSのEC2で行うAmazon Linux2（MySQL5.7）環境構築](https://qiita.com/2no553/items/952dbb8df9a228195189)
[EC2にMySQLインストールと設定確認](https://qiita.com/toshihirock/items/c5933d3628c7d4e81ffa)
railsではデフォルトSQLはSQLiteなのでまず、 MySQLのためのデータベースを作らないといけない
[railsでデータベース作成＆マイグレート（MySQL）](https://qiita.com/zeppekipanda/items/9d7ecaff927b68143721)