ในขณะที่คุณสามารถใช้ initializers เหมือนคำตอบอื่น ๆ วิธีการชุมนุมทางรถไฟ 4.1 config/secrets.yml
ขึ้นไปคือการใช้ เหตุผลสำหรับทีม Rails ในการแนะนำสิ่งนี้อยู่นอกเหนือขอบเขตของคำตอบนี้ แต่ TL; DR คือsecret_token.rb
การกำหนดค่าและรหัสรวมถึงความเสี่ยงด้านความปลอดภัยเนื่องจากโทเค็นถูกตรวจสอบในประวัติการควบคุมแหล่งและระบบเดียวที่ต้องการ โทเค็นลับการผลิตคือโครงสร้างพื้นฐานการผลิต
คุณควรเพิ่มไฟล์นี้ให้.gitignore
เหมือนกับว่าคุณจะไม่เพิ่มconfig/database.yml
การควบคุมแหล่งที่มา
การอ้างอิงรหัสของ Heroku สำหรับการตั้งค่าconfig/database.yml
จากDATABASE_URL
ในBuildpack สำหรับ Rubyของพวกเขาฉันสิ้นสุดการฟอเรกต์ repoและแก้ไขเพื่อสร้างconfig/secrets.yml
จากSECRETS_KEY_BASE
ตัวแปรสภาพแวดล้อม
ตั้งแต่ฟีเจอร์นี้ถูกนำเสนอใน Rails 4.1 ฉันรู้สึกว่ามันเหมาะสมที่จะแก้ไข./lib/language_pack/rails41.rb
และเพิ่มฟังก์ชั่นนี้
ต่อไปนี้เป็นตัวอย่างข้อมูลจาก buildpack ที่ฉันสร้างขึ้นที่ บริษัท ของฉัน:
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
ก่อนที่จะปรับใช้แอพของคุณอีกครั้งโปรดตั้งค่าตัวแปรสภาพแวดล้อมของคุณก่อน:
จากนั้นเพิ่ม buildpack ที่ปรับเปลี่ยนแล้วของคุณ (หรือคุณยินดีที่จะเชื่อมโยงไปยังเหมืองแร่) ไปยังแอพ Heroku ของคุณ (ดูเอกสารของ Heroku ) และปรับใช้แอปของคุณ
buildpack จะสร้างconfig/secrets.yml
ตัวแปรสภาพแวดล้อมของคุณโดยอัตโนมัติซึ่งเป็นส่วนหนึ่งของกระบวนการสร้าง dyno ทุกครั้งที่คุณgit push
ไปที่ Heroku
แก้ไข: เอกสารของ Heroku แนะนำให้สร้างconfig/secrets.yml
เพื่ออ่านจากตัวแปรสภาพแวดล้อม แต่สิ่งนี้บอกเป็นนัยว่าคุณควรตรวจสอบไฟล์นี้ในแหล่งควบคุม ในกรณีของฉันสิ่งนี้ใช้งานไม่ได้เนื่องจากฉันมีความลับแบบฮาร์ดโค้ดสำหรับการพัฒนาและสภาพแวดล้อมการทดสอบที่ฉันไม่ต้องการเช็คอิน