다른 답변과 마찬가지로 이니셜 라이저를 사용할 수 있지만 기존 Rails 4.1 이상은을 사용하는 것 config/secrets.yml
입니다. Rails 팀이이를 도입 한 이유는이 답변의 범위를 벗어 났지만 TL; DR은 secret_token.rb
토큰이 소스 제어 히스토리와 체크인해야하는 유일한 시스템에 체크인되기 때문에 구성 및 코드 를 병합하고 보안 위험이 있기 때문입니다. 생산 비밀 토큰이 생산 인프라라는 것을 알고 있습니다.
소스 컨트롤에 .gitignore
추가하지 않는 것처럼 이 파일을 추가해야 config/database.yml
합니다.
설정을위한 Heroku가 자신의 코드를 참조하기 config/database.yml
에서 DATABASE_URL
자신의 루비 Buildpack , 나는 결국 자신의 repo를 분기 만들고 그것을 수정 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의 설명서 참조) ) 앱을 다시 배포하십시오.
config/secrets.yml
빌드 git push
팩은 Heroku에 갈 때마다 dyno 빌드 프로세스의 일부로 환경 변수에서 자동으로 생성합니다 .
편집 : Heroku 자체 문서config/secrets.yml
에는 환경 변수에서 읽도록 작성 하는 것이 좋지만 이것은이 파일을 소스 제어로 체크인해야 함을 의미합니다. 필자의 경우 체크인하지 않을 개발 및 테스트 환경에 대한 비밀을 하드 코딩했기 때문에 이것은 잘 작동하지 않습니다.