Rails5.2では新規アプリを作成した時にconfig/secrets.ymlが生成されず
代わりにconfig/credentials.yml.encが生成されるようになったみたいです。
既に本番環境などでRailsの古いバージョンで運用していてRails5.2にアップグレードする場合は
config/secrets.ymlではなく、config/credentials.yml.encの仕組みが使われるみたいです。
Rails5.2までは従来のconfig/secrets.ymlを使用するやり方などもあるみたいですが
Rails6アップグレードのことも考えconfig/credentials.yml.encを導入してみましたので
忘備録のために投稿します。
1. credentials.yml.encとmaster.keyの生成と設定
credentials.yml.encは直接エディタから編集する事はできないので、ターミナルでエディタを指定して作成、編集する。
$ EDITOR=vim bundle exec credentials:edit
ちなみに、.bash_profileなどに以下のように設定しておけば、EDITOR="vim"の指定は不要になります。
~/.bash_profile
$ echo 'export EDITOR="vim"' >> ~/.bash_profile
$ source ~/.bash_profile
$ bundle exec credentials:edit
上記のコマンドを実行すると、config/credentials.yml.encとconfig/master.keyが生成される。
config/master.keyはgitで管理しないため必ず.gitignoreに追加する。
.gitignore
# Ignore master key for decrypting credentials and more.
/config/master.key
生成されたconfig/credentials.yml.encを以下のように修正する。
config/credentials.yml.enc
# aws:
# access_key_id: 123
# secret_access_key: 345
# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base:
- 今回はsecret_keyだけ設定する。AWSの設定は既存のままいくのでコメントアウトのまま
- 上記の画面にawsのaccess_key_idやsecret_access_key、その他APIキーなどを入力すれば暗号化されて保存される
- 環境変数など使用せず、直接入力して問題ない
- シングルクオーテーションやダブルクオーテーションは不要
本番環境ではcredentialを使うので config/environments/production.rb で次の変数にtrueをセットする
config/environments/production.rb
config.require_master_key = true
2.Capistranoによる自動デプロイ
本番環境のshared/configにmaster.keyを配置しないとデプロイできない。
本番環境のサーバーにscpコマンドなどで、config/master.keyを転送する。
$ scp -i ~/.ssh/example.pem config/master.key ec2-user@x.x.x.x:/var/www/AppName/shared/config/master.key
ex. /var/www/AppName/shared/config/master.key
もしくは、本番環境サーバーのbashファイルにRAILS_MASTER_KEY環境変数を設定する。
Capistranoは.bash_profileに書いても読み込まれないので、~/.bashrcに記載する必要がある。
config/master.keyをRAILS_MASTER_KEYとしてexportします。つまり、.bashrcに以下のように設定する。
~/.bashrc
export RAILS_MASTER_KEY='XXXXXXXXXXXXXXXXXXX'
次に、config/deploy.rbでデプロイ時の設定ファイルにシンボリックリンクを指定する。
set :linked_files, fetch(:linked_files, []).push('config/master.key')
3.Capistranoを使ってデプロイできれば完了。
$ bundle exec cap production deploy