アプリケーション本体のリポジトリで管理したくない情報は、サーバの環境変数にもたせるのが一般的です。 この記事では、Ruby on Railsアプリケーションで環境変数を管理する方法について解説します。

技術スタック

この記事では、以下の技術を利用することを想定しています。

  • Ruby on Rails
  • dotenv
  • Capistrano
  • Itamae

方法

以下の手順で環境変数を設定していきます。 各技術の詳細な導入方法までは言及しませんので、各ドキュメント等を参照してください。

1. dotenvをインストールする

Gemfileに以下を追加し、bundle installします。

gem 'dotenv-rails'

dotenvは、.envファイルの内容を環境変数に設定するためのライブラリです。 これはリポジトリで管理したくないので、.gitignoreに登録します。

.gitignore:

.env

2. Itamaeで.envを配置する

環境変数は、サーバを構築するための構成管理ツール側で管理します。 以下のようなレシピで配置すればよいでしょう。

template '/.../shared/.env' do
  action :create
  source 'templates/.env.erb'
end

パスワードなどの機密情報は、itamae-secretsで管理します。 その際、鍵情報を管理しないよう.gitignoreへの登録を忘れないようにします。

3. Capistranoの設定をする

.envはItamae側でsharedディレクトリに配置するので、Capistranoのlinked_filesに追加します。

config/deploy.rb:

set :linked_files, fetch(:linked_files, []).push('.env')

注意事項

Unicorn利用時

アプリケーションをホットデプロイ(restartではなくreload)すると、前のプロセスでの環境変数がそのまま引き継がれます。 つまり、.envが更新されていても、新しい内容が読まれません。

これは、Unicornの設定を変えることで対応可能です。

config/unicorn.rb:

before_exec do |server|
  Dotenv.overload
end

おわりに

環境変数を管理する方法はいくつかあると思いますが、上述した技術スタックを利用している際はぜひ参考にしてみてください。