他の回答と同様にイニシャライザを使用できますが、従来のRails 4.1以降の方法ではを使用しconfig/secrets.yml
ます。Railsチームがこれを紹介する理由はこの回答の範囲を超えていますが、TL; DRはsecret_token.rb
、トークンがソース管理履歴にチェックインされ、本番シークレットトークンが本番インフラストラクチャであることを確認します。
ソース管理にも.gitignore
追加config/database.yml
しない場合と同じように、このファイルを追加する必要があります。
セットアップするためのHerokuの独自のコードを参照するconfig/database.yml
からDATABASE_URL
自分でRubyのためBuildpack、私は終わった彼らのレポをフォークし、作成するためにそれを修正config/secrets.yml
からSECRETS_KEY_BASE
環境変数。
この機能はRails 4.1で導入されたので、この機能を編集./lib/language_pack/rails41.rb
して追加するのが適切だと感じました。
以下は、私の会社で作成した変更済みビルドパックのスニペットです。
class LanguagePack::Rails41 < LanguagePack::Rails4
# ...
def compile
instrument "rails41.compile" do
super
allow_git do
create_secrets_yml
end
end
end
# ...
# writes ERB based secrets.yml for Rails 4.1+
def create_secrets_yml
instrument 'ruby.create_secrets_yml' do
log("create_secrets_yml") do
return unless File.directory?("config")
topic("Writing config/secrets.yml to read from SECRET_KEY_BASE")
File.open("config/secrets.yml", "w") do |file|
file.puts <<-SECRETS_YML
<%
raise "No RACK_ENV or RAILS_ENV found" unless ENV["RAILS_ENV"] || ENV["RACK_ENV"]
%>
<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
SECRETS_YML
end
end
end
end
# ...
end
もちろん、このコードを拡張して、環境変数から読み取る他のシークレット(サードパーティのAPIキーなど)を追加できます。
...
<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
third_party_api_key: <%= ENV["THIRD_PARTY_API"] %>
このようにして、非常に標準的な方法でこのシークレットにアクセスできます。
Rails.application.secrets.third_party_api_key
アプリを再デプロイする前に、まず環境変数を設定してください。
次に、変更したビルドパック(または、自分のリンクへのリンクを歓迎します)をHerokuアプリ(Herokuのドキュメントを参照)に追加し、アプリを再デプロイします。
ビルドパックは、Herokuにアクセスするたびに、dyno config/secrets.yml
ビルドプロセスの一部として環境変数からを自動的に作成しますgit push
。
編集:Herokuの独自のドキュメントではconfig/secrets.yml
、環境変数から読み取るように作成することを推奨していますが、これは、このファイルをソース管理にチェックインする必要があることを意味しています。私の場合、チェックインしたくない開発環境とテスト環境のシークレットをハードコードしているため、これはうまく機能しません。