アプリケーション本体のリポジトリで管理したくない情報は、サーバの環境変数にもたせるのが一般的です。 この記事では、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
おわりに
環境変数を管理する方法はいくつかあると思いますが、上述した技術スタックを利用している際はぜひ参考にしてみてください。