Techioz Blog

本番環境で Rails アプリを起動するときに SECRET_KEY_BASE 環境変数はどこにありますか

概要

Rails 4 In Action Book には、他のセットアップを行った後、Rails アプリを本番モード (Web ブリックを使用) で起動するための最終セットアップは、ターミナルで次のコマンドを入力することであると記載されています。

SECRET_KEY_BASE='rake secret' rails s -e production

SECRET_KEY_BASEの環境変数がどこに保存されているかを確認しようとしています。

/app/config/secrets.yml 内では、secret_key_base 変数が環境変数であることが示されています。

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

しかし、.bashrc と .bash_profile 内を調べたところ、変数 SECRET_KEY_BASE がありませんでした。

最終的に知りたいのは、環境変数とその値はどこにあるのかということです。 Rails アプリのどこかに保存されていますか?このアプリを github にプッシュする場合、セキュリティ目的ではないことを願います。アプリではなくコンピューターシステムのどこかに保存されていると思います。別の端末ウィンドウ内で echo を実行しますが、何も返されません。

不足している部分を理解するのを手伝ってくれてありがとう。

補足: この質問は知っていますが、質問はそれほど詳細ではなく、回答も提供されていません。

解決策

これを実行すると:

SECRET_KEY_BASE='rake secret' rails s -e production

実際には、将来のために秘密鍵を「保存」しているわけではありません。 1 回限りで定義します。 Ruby コマンドを実行するたびに、一時的な環境変数を設定できます。

# from shell
KEY="VAL" OTHER_KEY=OTHER_VAL ruby my_command.rb

# from the ruby script
puts ENV["KEY"] # => "VAL"
puts ENV["OTHER_KEY"] # => "OTHER_VAL"

環境変数を永続化するには、いくつかのオプションがあります。これらをソース コードにハードコーディングすることもできますが、コードを Github にプッシュすると誰でも見ることができるため、これはおそらく良い考えではありません。とにかく、環境変数をシステム固有に保持できるのは、環境変数の重要な点のようなものです。

オプションA

.bashrc または .bash_profile で設定できます。

まず、rake シークレットの結果 (ランダムな文字列になります) を取得し、シェル変数を設定します。

KEY=`rake secret` # uses backticks to get command result

次に、bashrc にエクスポートする行を追加します。

echo -e "export SECRET_KEY_BASE=$KEY" >> ~/.bashrc

オプション B

これは私がお勧めする方法です。dotenv または figaro を使用すると、アプリ固有の方法で、つまり bashrc を乱雑にすることなく環境変数を管理できます。

たとえば、dotenv を使用すると、次の内容を含む .env ファイルを作成します。

# change this to the result of rake secret  
SECRET_KEY_BASE=j3e2dd293d 

これは、gitignore に追加することでソース管理から除外されます。

次に、Ruby アプリで呼び出します

require 'dotenv'
Dotenv.load

ENV[“SECRET_KEY_BASE”] が設定されます。

必要に応じて、どの環境変数を定義する必要があるかを示す .env.example ファイル (ソース管理に含まれています) を作成できます。次に、アプリのクローンを作成するときに、 mv .env.example .env を実行して、.env をカスタマイズできます。