読者です 読者をやめる 読者になる 読者になる

【Rails】Capistranoでデプロイするとき「Devise.secret_key was not set. Please add the following to your Devise initializer:」が発生する

はじめに

Webサービスを開発していて、ハマったところなのでメモ。

環境

前提条件

エラーが出るところ以外、デプロイできる状態とします。

原因(なぜ、今までできていたか?)

config/secret.ymlに文字列を直接記述していたため。

staging:
  secret_key_base: 'test'

さらにdevise.rbの記述でsecret_key_baseを使うようにしていたため。

Devise.setup do |config|
  # The secret key used by Devise. Devise uses this key to generate
  # random tokens. Changing this key will render invalid all existing
  # confirmation, reset password and unlock tokens in the database.
  # config.secret_key = aqwsedrftgyhujikolp;''

  ...以下略....

改修した経緯

さすがに直接書くのはどうなの?という疑問からとなります。

改修

config/secret.yml

staging:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

config/deploy.rb

# Default value for default_env is {}
set :default_env, {
  rbenv_root: "/usr/local/rbenv",
  path: "/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH",
  DEVISE_SECRET_KEY: ENV["DEVISE_SECRET_KEY"]
}

devise.rb

Devise.setup do |config|
  # The secret key used by Devise. Devise uses this key to generate
  # random tokens. Changing this key will render invalid all existing
  # confirmation, reset password and unlock tokens in the database.
  config.secret_key = ENV["DEVISE_SECRET_KEY"]

  ...以下略...

さらにWebサーバの環境変数にSECRET_KEY_BASE, DEVISE_SECRET_KEYの内容を記述する。

例:.bash_profile

export SECRET_KEY_BASE='secret_key'
export DEVISE_SECRET_KEY='devise_secret_key'

なぜ、このようにしたか?

改修は、見た通りやればいいと思うのですが、上記のようにした理由を書きます。
ある意味、ここからが本題です。

まず、すぐに思いつくのが以下のGemです。

github.com

自分も「これが手っ取り早いよなぁ?」と思っていたのですが、以下のエントリーを発見。

t-cyrill.hatenablog.jp

記事の最後の方に書いてありますが、StagingやProductionでは使われることは
望まれていないようです。確かに管理が簡単で.envに書けばすべて解決して、
わざわざ環境変数を設定する手間も省けてとても魅力的なものです。

ただ、運用するという面で見るとProduction環境は楽するよりも、
強固なシステムを作ることにウェイトを置くべきだと思うので、
これが今のところベストかな?と考えています。