Capistrano3でRails5+Unicornのアプリをデプロイしたときに環境変数SECRET_KEY_BASEが読み込まれない
現象
Capistrano3を利用して、Rails5のアプリをデプロイしたときに、SECRET_KEY_BASEが指定されていないという以下のエラーメッセージが表示される。
Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml`前提
- Rails 5.0.0.1
- Capistrano Version: 3.6.1 (Rake Version: 11.3.0)
- ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
- unicorn v5.2.0
解決策
Capistrano3は、.bash_profileではなく.bashrcを読み込むため、いくら.bash_profileにexport SECRET_KEY_BASE=hogehogeと書いても読み込んでもらえなかった。
.bashrcにexport SECRET_KEY_BASE=hogehogeと記載することで、上手く読み込まれた。
SECRET_KEY_BASEに定義する値は、bundle exec rake secretで生成するのが流儀のようです。
そもそも SECRET_KEY_BASEって何?
However, since Rails 4, the default store is EncryptedCookieStore. With EncryptedCookieStore the session is encrypted before being stored in a cookie. This prevents the user from accessing and tampering the content of the cookie. Thus the session becomes a more secure place to store data. The encryption is done using a server-side secret key secrets.secret_key_base stored in config/secrets.yml .
http://guides.rubyonrails.org/security.html
railsガイドを読んだところ以下の理解です。
- セッションハイジャックを防ぐため、
EncryptedCookieStoreでは、セッションは暗号化されてからクッキーに格納される - この暗号化を行う際の秘密鍵が、
SECRET_KEY_BASE - 秘密鍵
SECRET_KEY_BASEによる暗号化を行っているため、このSECRET_KEY_BASEが盗まれると復号化されてしまう
Ruby on Rails Security Guide — Ruby on Rails Guides
secret_key_baseとは - DesignAssembler