ENV変数をbashで設定できることを知っています。
export admin_password = "secret"
しかし、私のRailsソースコードのどこかにそれを行う方法はありますか?私の最初の試みはこのようなものでしたenvironment/development.rb
ENV['admin_password'] = "secret"
しかし、それはうまくいきませんでした。これを行う方法はありますか?
回答:
[更新]
「古い答え」の下の解決策は一般的な問題に対しては機能しますが、このセクションでは、コメントから明確にした後、特定の質問に答えます。
質問で指定したとおりに環境変数を設定できるはずです。例として、HTTP基本認証を使用するHerokuアプリがあります。
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :authenticate
def authenticate
authenticate_or_request_with_http_basic do |username, password|
username == ENV['HTTP_USER'] && password == ENV['HTTP_PASS']
end
end
end
# config/initializers/dev_environment.rb
unless Rails.env.production?
ENV['HTTP_USER'] = 'testuser'
ENV['HTTP_PASS'] = 'testpass'
end
だからあなたの場合はあなたが使うでしょう
unless Rails.env.production?
ENV['admin_password'] = "secret"
end
構成が再ロードされるように、サーバーを再起動することを忘れないでください!
【旧回答】
アプリ全体の構成では、次のようなソリューションを検討できます。
config/application.yml
アクセスできるようにするオプションのハッシュを使用してファイルを作成します。
admin_password: something_secret
allow_registration: true
facebook:
app_id: application_id_here
app_secret: application_secret_here
api_key: api_key_here
次に、ファイルconfig/initializers/app_config.rb
を作成し、以下を含めます。
require 'yaml'
yaml_data = YAML::load(ERB.new(IO.read(File.join(Rails.root, 'config', 'application.yml'))).result)
APP_CONFIG = HashWithIndifferentAccess.new(yaml_data)
これで、アプリケーションのどこからでも、APP_CONFIG[:admin_password]
他のすべてのデータとともににアクセスできます。(イニシャERB.new
ライザーにはが含まれているため、YAMLファイルにERBマークアップを含めることができることに注意してください。)
dev_environment.rb
コードを削除して自分のものに置き換える際に回答を編集する場合は、はるかに徹底的な回答に喜んでマークを付けます。
config/environments/development.rb
ファイルでより意味がありませんか?
機密情報(アカウントの資格情報、パスワードなど)をハードコーディングしないでください。代わりに、その情報を環境変数(キーと値のペア)として保存するファイルを作成し、そのファイルをソースコード管理システムから除外します。たとえば、Git(ソースコード管理システム)の観点から、そのファイルをに追加して除外します。gitignore:
-bash> echo '/config/app_environment_variables.rb' >> .gitignore
/config/app_environment_variables.rb
ENV['HTTP_USER'] = 'devuser'
ENV['HTTP_PASS'] = 'devpass'
同様に、次の行を/config/environment.rb
、require
行と行の間に追加しますApplication.initialize
。
# Load the app's custom environment variables here, so that they are loaded before environments/*.rb
app_environment_variables = File.join(Rails.root, 'config', 'app_environment_variables.rb')
load(app_environment_variables) if File.exists?(app_environment_variables)
それでおしまい!
上記のコメントが言うように、これを行うことにより、前environments/*.rb
に環境変数をロードすることになります。つまり、これらのファイル内の変数を参照できるようになります(例environments/production.rb
)。これは、環境変数ファイルをに入れるよりも大きな利点です/config/initializers/
。
内部app_environment_variables.rb
では、このファイルをソースコード管理システムにコミットすることは決してないため、開発または本番まで環境を区別する必要はありません。したがって、デフォルトでは開発コンテキスト用です。ただし、テスト環境(または本番モードをローカルでテストする場合)に特別なものを設定する必要がある場合は、他のすべての変数の下に条件付きブロックを追加するだけです。
if Rails.env.test?
ENV['HTTP_USER'] = 'testuser'
ENV['HTTP_PASS'] = 'testpass'
end
if Rails.env.production?
ENV['HTTP_USER'] = 'produser'
ENV['HTTP_PASS'] = 'prodpass'
end
更新するたびにapp_environment_variables.rb
、アプリサーバーを再起動してください。Apache / Passengerなどを使用していると仮定しますrails server
。
-bash> touch tmp/restart.txt
コードで、次のように環境変数を参照します。
def authenticate
authenticate_or_request_with_http_basic do |username, password|
username == ENV['HTTP_USER'] && password == ENV['HTTP_PASS']
end
end
内部app_environment_variables.rb
では、ブール値と数値を文字列として指定する必要があることに注意してください(たとえばENV['SEND_MAIL'] = 'false'
、だけfalse
でなく、だけではありENV['TIMEOUT'] = '30'
ません30
)。そうしないcan't convert false into String
とcan't convert Fixnum into String
、それぞれエラーとが発生します。
機密情報の保存と共有
最後の結び目は、この機密情報をクライアントやパートナーと共有する方法です。ビジネス継続性の目的で(つまり、流れ星に見舞われた場合、クライアントやパートナーはどのようにしてサイトの完全な運用を再開しますか?)、クライアントやパートナーはアプリに必要なすべての資格情報を知っている必要があります。これらのものを電子メールで送信/スキップすることは安全ではなく、混乱を招きます。共有のGoogleドキュメントに保存するのは悪くありませんが(全員がhttpsを使用している場合)、パスワードなどの小さな情報を保存して共有するための専用アプリが理想的です。
Herokuで環境変数を設定する方法
Herokuに単一の環境がある場合:
-bash> heroku config:add HTTP_USER='herouser'
-bash> heroku config:add HTTP_USER='heropass'
Herokuに複数の環境がある場合:
-bash> heroku config:add HTTP_USER='staguser' --remote staging
-bash> heroku config:add HTTP_PASS='stagpass' --remote staging
-bash> heroku config:add HTTP_USER='produser' --remote production
-bash> heroku config:add HTTP_PASS='prodpass' --remote production
フォアマンと.env
多くの開発者は、(Apache / Passengerなどを使用するのではなく)Foreman(Heroku Toolbeltとともにインストール)を使用してアプリをローカルで実行しますrails server
。ForemanとHerokuはProcfile
、アプリケーションで実行されるコマンドを宣言するために使用するため、ローカル開発からHerokuへの移行はその点でシームレスです。私はすべてのRailsプロジェクトでForemanとHerokuを使用しているので、この便利さは素晴らしいです。しかし、これが問題です。Foremanは、dotenvを/.env
介して格納された環境変数をロードしますが、残念ながら、dotenvは基本的にファイルのkey=value
ペアのみを解析します。; それらのペアはその場で変数にならないので、すでに設定されている変数を参照することはできません(物事をドライに保つため)。また、そこで「Ruby」を実行することもできません(上記の条件文で説明)。で行います/config/app_environment_variables.rb
。たとえば、物事を乾いた状態に保つという点で、私は時々次のようなことをします:
ENV['SUPPORT_EMAIL']='Company Support <support@company.com>'
ENV['MAILER_DEFAULT_FROM'] = ENV['SUPPORT_EMAIL']
ENV['MAILER_DEFAULT_TO'] = ENV['SUPPORT_EMAIL']
したがって、Foremanを使用してアプリをローカルで実行し.env
ますが、そのファイルを環境変数の読み込みには使用しません。むしろ、私/config/app_environment_variables.rb
は上記のアプローチと組み合わせてフォアマンを使用します。
私の質問でこれを行おうとしている方法は実際に機能します!
# environment/development.rb
ENV['admin_password'] = "secret"
サーバーを再起動する必要がありました。reload!
Railsコンソールで実行するだけで十分だと思いましたが、Webサーバーも再起動する必要がありました。
これはENV変数を配置および設定するのに適した場所だと思うので、私は自分の答えを選んでいます
config/application.rb
しconfig/environments/*.rb
てセットアップしたり、他の方法を使用してアプリケーション環境をセットアップしたりするのが好きですが、それが唯一の方法(または「正しい」方法です:)
最善の方法は、それらをymlファイルに保存してから、このコマンドを使用してinitializerファイルにそのファイルをロードすることだと思います。
APP_CONFIG = YAML.load_file("#{Rails.root}/config/CONFIG.yml")[Rails.env].to_hash
環境関連の構成変数に簡単にアクセスできます。
Ymlファイルのキー値構造:
development:
app_key: 'abc'
app_secret: 'abc'
production:
app_key: 'xyz'
app_secret: 'ghq'
システム環境とレールの環境は別物です。ENV
Railsの環境で作業してみましょう。ただし、実行時にシステムの環境を変更する場合は、コマンドをバッククォートで囲むことができます。
# ruby code
`export admin_password="secret"`
# more ruby code
export
スペースについて文句を言うだけのメモ。試してみてくださいexport admin_password="secret"
カスタム.env
ファイルをロードするためのスクリプト:次の行を/config/environment.rb
、require
行と行の間に追加しますApplication.initialize
。
# Load the app's custom environment variables here, so that they are loaded before environments/*.rb
app_environment_variables = File.join(Rails.root, 'config', 'local_environment.env')
if File.exists?(app_environment_variables)
lines = File.readlines(app_environment_variables)
lines.each do |line|
line.chomp!
next if line.empty? or line[0] == '#'
parts = line.partition '='
raise "Wrong line: #{line} in #{app_environment_variables}" if parts.last.empty?
ENV[parts.first] = parts.last
end
end
そしてconfig/local_environment.env
(あなたは.gitignore
それをしたいと思うでしょう)次のようになります:
# This is ignored comment
DATABASE_URL=mysql2://user:psw@0.0.0:3307/database
RACK_ENV=development
(@ user664833のソリューションに基づく)
export admin_password="secret"
ではなく、である必要があることに注意してくださいexport admin_password = "secret"
。