Rails
unicorn
dotenv

dotenvは本番で使う時に

環境

  • Rails 5.0.3
  • ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin17]
  • dotenv-rails (2.2.1)

背景

使いやすさで、dotenvを使ってる方もいらっしゃると思いますが、本番で使ってしまってハマったことをメモします。

本当に本番の利用は勧めされてないですが、https://github.com/bkeepers/dotenv#can-i-use-dotenv-in-production

事故

ステージング環境を増やして、redisのDBを番号を変更した。

.env.staging
REDIS_ENDPOINT=redis://staging-host:6379/10 -> REDIS_ENDPOINT=redis://staging-host:6379/1

すると、unicornを再起動してもSidekiqのダッシュボードに反映されなく、古いredis DBの方に指していた(Sidekiqのダッシュボードの「完了」のジョブ数からがわかる)。

原因

dotenvは再起動する時に、新しい環境変数は読み込めますが、すでにある環境変数だと読み込まず更新されないです。

By default, it won't overwrite existing environment variables as Dotenv assumes the deployment environment has more knowledge about configuration than the application does. To overwrite existing environment variables you can use Dotenv.overload.

https://github.com/bkeepers/dotenv#why-is-it-not-overriding-existing-env-variables

対策

一時対策 unicorn stop && unicorn start

  • Dotenv.overloadを使う ただし、それでも開発変数を消す時はすでにあるものをそのまま残してしまう。
config/unicorn.rb
before_exec do |_server|
  ENV['BUNDLE_GEMFILE'] = File.expand_path('Gemfile', current_path)
  Dotenv.overload ".env.#{Rails.env}"
end
  • 本番でDotenvをやめる ansibleを使う

参照