วิธีแก้ไขข้อผิดพลาด“ ที่ขาดหายไป 'secret_key_base` สำหรับสภาพแวดล้อม' การผลิต '(Rails 4.1)


169

ฉันสร้างแอปพลิเคชั่น Rails โดยใช้ Rails 4.1 ตั้งแต่เริ่มต้นและฉันประสบปัญหาแปลก ๆ ที่ฉันไม่สามารถแก้ไขได้

ทุกครั้งที่ฉันพยายามปรับใช้แอปพลิเคชันของฉันใน Heroku ฉันพบข้อผิดพลาด 500:

Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`

secret.ymlไฟล์มีการกำหนดค่าต่อไปนี้:

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

ใน Heroku ฉันตั้งค่าSECRET_KEY_BASEตัวแปรสภาพแวดล้อมด้วย "" ผลลัพธ์ของrake secretคำสั่ง ถ้าฉันเรียกใช้heroku configฉันจะเห็นตัวแปรพร้อมชื่อและค่าที่ถูกต้อง

เหตุใดฉันยังคงได้รับข้อผิดพลาดนี้


1
ฉันมีปัญหาเดียวกันแน่นอนและอยากจะรู้ว่าทำไมสิ่งนี้ถึงเกิดขึ้นเช่นกัน ถ้าฉันคิดว่าทำไมฉันจะโพสต์กลับด้วยโซลูชันของฉัน
danielricecodes

ไฟล์ config ของคุณชื่อsecret.ymlหรือsecrets.ymlไม่?
James

2
ฉันกำหนดค่าไฟล์. gitignore อีกครั้งด้วยไฟล์ที่สร้างโดยทางรถไฟและตอนนี้ทุกอย่างทำงานได้ดี
Paolo Laurenti

เรายังมีปัญหานี้เมื่อเราอัพเกรดเป็น Rails 4 ในกรณีของเรามันเป็นเพราะเรามีชื่อสภาพแวดล้อมที่กำหนดเองและนั่นไม่ได้ปรากฏใน secret.yml ฉันแค่ต้องเพิ่มบรรทัดลงในไฟล์ด้วยชื่อที่ไม่ได้มาตรฐานกระทำและปรับใช้ใหม่
whognu

สำหรับผู้อ่านในอนาคต: คำตอบนี้น่าจะง่ายและแม่นยำที่สุด: stackoverflow.com/a/26541742/4880924
BKSpurgeon

คำตอบ:


208

ฉันมีปัญหาเดียวกันและแก้ไขได้โดยการสร้างตัวแปรสภาพแวดล้อมที่จะโหลดทุกครั้งที่ฉันเข้าสู่เซิร์ฟเวอร์การผลิตและทำคู่มือขนาดเล็กของขั้นตอนในการกำหนดค่า:

ฉันใช้ Rails 4.1 กับ Unicorn v4.8.2 และเมื่อฉันพยายามปรับใช้แอปพลิเคชันของฉันมันไม่เริ่มทำงานอย่างถูกต้องและในunicorn.logไฟล์ฉันพบข้อความแสดงข้อผิดพลาดนี้:

app error: Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml` (RuntimeError)

หลังจากการวิจัยบางอย่างฉันพบว่า Rails 4.1 เปลี่ยนวิธีการจัดการsecret_keyดังนั้นหากคุณอ่านsecrets.ymlไฟล์ที่อยู่ที่exampleRailsProject/config/secrets.ymlคุณจะพบสิ่งนี้:

# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

ซึ่งหมายความว่า Rails แนะนำให้คุณใช้ตัวแปรสภาพแวดล้อมสำหรับsecret_key_baseเซิร์ฟเวอร์การผลิตของคุณ เพื่อแก้ไขข้อผิดพลาดนี้คุณควรทำตามขั้นตอนเหล่านี้เพื่อสร้างตัวแปรสภาพแวดล้อมสำหรับ Linux (ในกรณีของฉัน Ubuntu) ในเซิร์ฟเวอร์การผลิตของคุณ:

  1. ในเทอร์มินัลของเซิร์ฟเวอร์ที่ใช้งานจริงของคุณจะทำงาน:

    $ RAILS_ENV=production rake secret

    ส่งคืนสตริงขนาดใหญ่ที่มีตัวอักษรและตัวเลข GENERATED_CODEคัดลอกที่ซึ่งเราจะอ้างถึงรหัสที่เป็น

  2. เข้าสู่ระบบเซิร์ฟเวอร์ของคุณ

    • หากคุณเข้าสู่ระบบในฐานะผู้ใช้รูทให้ค้นหาไฟล์นี้และแก้ไข:

      $ vi /etc/profile

      ไปที่ด้านล่างของไฟล์โดยใช้Shift+ G(ตัวใหญ่ "G") ใน vi

      เขียนตัวแปรสภาพแวดล้อมของคุณด้วยGENERATED_CODE, กดiเพื่อแทรกใน vi ต้องแน่ใจว่าอยู่ในบรรทัดใหม่ที่ท้ายไฟล์:

      $ export SECRET_KEY_BASE=GENERATED_CODE

      บันทึกการเปลี่ยนแปลงและปิดไฟล์โดยใช้Escจากนั้น " :x" และEnterสำหรับการบันทึกและออกใน vi

    • แต่ถ้าคุณเข้าสู่ระบบในฐานะผู้ใช้ปกติลองเรียกมันว่า " example_user" สำหรับส่วนสำคัญนี้คุณจะต้องค้นหาไฟล์อื่น ๆ อย่างใดอย่างหนึ่งต่อไปนี้:

      $ vi ~/.bash_profile
      $ vi ~/.bash_login
      $ vi ~/.profile

      ไฟล์เหล่านี้มีความสำคัญซึ่งหมายความว่าหากคุณมีไฟล์แรกคุณไม่จำเป็นต้องแก้ไขไฟล์อื่น หากคุณพบไฟล์ทั้งสองนี้ในไดเรกทอรีของคุณ~/.bash_profileและ~/.profileคุณจะต้องเขียนในไฟล์แรก~/.bash_profileเพราะ Linux จะอ่านไฟล์นี้เพียงไฟล์เดียวส่วนอีกไฟล์จะถูกละเว้น

      จากนั้นเราไปที่ด้านล่างของไฟล์โดยใช้Shift+ Gอีกครั้งและเขียนตัวแปรสภาพแวดล้อมด้วยการGENERATED_CODEใช้ ของเราiอีกครั้งและให้แน่ใจว่าเพิ่มบรรทัดใหม่ที่ท้ายไฟล์:

      $ export SECRET_KEY_BASE=GENERATED_CODE

      ต้องเขียนรหัสบันทึกการเปลี่ยนแปลงและปิดไฟล์โดยใช้Escอีกครั้งและ " :x" และEnterเพื่อบันทึกและออก

  3. คุณสามารถตรวจสอบว่าตัวแปรสภาพแวดล้อมของเราได้รับการตั้งค่าอย่างเหมาะสมใน Linux ด้วยคำสั่งนี้:

    $ printenv | grep SECRET_KEY_BASE

    หรือด้วย:

    $ echo $SECRET_KEY_BASE

    เมื่อคุณรันคำสั่งนี้หากทุกอย่างเรียบร้อยก็จะแสดงให้คุณเห็นGENERATED_CODEก่อนหน้านี้ สุดท้ายด้วยการกำหนดค่าทั้งหมดที่ทำคุณควรจะสามารถปรับใช้โดยไม่มีปัญหากับแอปพลิเคชัน Rails ของคุณด้วย Unicorn หรือเครื่องมืออื่น ๆ

เมื่อคุณปิดเชลล์และล็อกอินอีกครั้งไปยังเซิร์ฟเวอร์ที่ใช้งานจริงคุณจะได้ตั้งค่าตัวแปรสภาพแวดล้อมนี้และพร้อมใช้งาน

และนั่นมัน! ฉันหวังว่าคู่มือมินินี้จะช่วยคุณแก้ไขข้อผิดพลาดนี้

คำเตือน: ฉันไม่ใช่กูรู Linux หรือ Rails ดังนั้นหากคุณพบสิ่งผิดปกติหรือมีข้อผิดพลาดใด ๆ ฉันยินดีที่จะแก้ไข


11
ดูเหมือนว่า Rails จะไม่เห็นตัวแปรสภาพแวดล้อม SECRET_KEY_BASE printenv แสดงให้เห็นว่าการผลิตทางรถไฟยังแสดงถ้าฉันตรวจสอบ ENV แต่ฉันไม่มีผลเมื่อรีสตาร์ทยูนิคอร์น วิธีเดียวที่ใช้งานได้ในขณะนี้คือการวางโดยตรงไปยัง
secret.yml

1
สิ่งนี้ใช้ได้สำหรับฉัน ขอบคุณสำหรับคำอธิบายแบบเต็ม ฉันเพิ่งเรียนรู้ว่ามีอัญมณีที่มีอยู่สำหรับการจัดการตัวแปรสภาพแวดล้อมของแอป 'Dotenv' เป็นหนึ่งและ 'โฟร์แมน' สำหรับ heroku ในขณะที่การศึกษาเพื่อแก้ไขข้อผิดพลาดด้วยตนเองด้วยวิธีนี้อาจใช้หนึ่งในอัญมณีเหล่านั้นจะปรับปรุงกระบวนการ
Nick Res

ฉันดีใจที่คำตอบของฉันเป็นประโยชน์ขอบคุณสำหรับตัวเลือกอัญมณี @ ninja08 พวกเขาแตกหักให้กระบวนการง่ายขึ้นส่วนใหญ่สำหรับผู้ที่ใช้ Capistrano หรือเครื่องมือที่เพิ่มขึ้นอื่น ๆ ในการจัดการเซิร์ฟเวอร์ :)
Demi หมอผี

ทำตามคำแนะนำที่ยอดเยี่ยมของ Demi Magus ฉันทำสิ่งนี้: cd / var / www / rails; rvm ใช้ ext-rbx-2.5.2@rails; SKB_FILE = / var / www / .secret_key_base; echo "ส่งออก SECRET_KEY_BASE = $ (RAILS_ENV = ความลับคราดการผลิต)"> $ SKB_FILE; . $ SKB_FILE; echo ". $ SKB_FILE" | tee -a ~ / .bashrc ~ / .bash_profile; chmod o-rwx $ SKB_FILE;
David Winiecki

คำตอบที่ดี !! ฉันไม่ทราบว่าทำไมสิ่งนี้จึงไม่ได้รับการแก้ไขสำหรับฉันฉันสร้างคำถามstackoverflow.com/questions/33117318/…
Adriano Resende

84

ฉันจะสมมติว่าคุณไม่ได้มีsecrets.ymlการตรวจสอบของคุณในการควบคุมแหล่งที่มา (เช่นมันอยู่ใน.gitignoreไฟล์) แม้ว่านี่ไม่ใช่สถานการณ์ของคุณ แต่คนอื่น ๆ ที่ดูคำถามนี้ได้ทำเพราะพวกเขามีรหัสของพวกเขาใน Github และไม่ต้องการรหัสลับของพวกเขาลอยไปมา

ถ้ามันไม่ได้อยู่ในแหล่งควบคุม Heroku ก็ไม่รู้ ดังนั้น Rails กำลังค้นหาRails.application.secrets.secret_key_baseและไม่ได้ตั้งค่าไว้เนื่องจาก Rails ตั้งค่าโดยการตรวจสอบsecrets.ymlไฟล์ที่ไม่มีอยู่ วิธีแก้ปัญหาง่ายๆคือเข้าไปที่config/environments/production.rbไฟล์ของคุณและเพิ่มบรรทัดต่อไปนี้:

Rails.application.configure do
    ...
    config.secret_key_base = ENV["SECRET_KEY_BASE"]
    ...
end

secrets.ymlนี้จะบอกแอพลิเคชันของคุณเพื่อตั้งคีย์ลับโดยใช้ตัวแปรสภาพแวดล้อมแทนที่จะมองหามันใน มันจะช่วยให้ฉันมีเวลามากที่จะรู้เรื่องนี้ล่วงหน้า


15
นี่คือคำตอบที่ดีที่สุด Figaroและheroku_secretsอย่าทำอะไรเลยเว้นแต่ Rails จะรู้ว่ามีSECRET_KEY_BASEชีวิตอยู่ในENVนั้น ฉันต้องดิ้นรนกับความคิดนี้ว่าหากมี var config บน Heroku Rails จะหยิบมันขึ้นมาโดยอาศัยมัน แต่ตอนนี้ดูเหมือนว่าจะเห็นได้อย่างชัดเจนว่า Rails จะต้องรู้ว่าจะต้องมองตรงไหน ฉันสงสัยว่าฉันจะมีรหัสใน Github ได้อย่างไรโดยไม่ต้องกังวลเกี่ยวกับสิ่งที่เป็นรหัสลับ ตอนนี้ฉันรู้.
flanger001

1
เห็นด้วยฉันคิดว่า secret.yml ฟุ่มเฟือยกับอัญมณีที่ดีเช่น Figaro
Joe

2
ดูเหมือนว่าตัวเลือกที่ดีที่สุดถ้าคุณใช้ GitHub และ Heroku สำหรับโครงการของคุณ
flexus

1
production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>มีอะไรผิดปกติกับการกระทำของคุณด้วย secrets.yml เป็น ไม่ได้หมายความว่าจะไม่มีการเปิดเผยรหัสลับที่แท้จริง มีความเสี่ยงที่จะเปิดเผยคีย์ dev และทดสอบใน secret.yml ที่มุ่งมั่นหรือไม่หากเป็นเพียงข้อมูลเริ่มต้นและการทดสอบ
Jay Killeen

สามารถใช้งานได้ใน Rails 6.0.2 เมื่อไม่มีความลับอีกต่อไป
Ken Tsoi

54

เพิ่มconfig/secrets.ymlการควบคุมเวอร์ชันและปรับใช้อีกครั้ง คุณอาจจำเป็นต้องลบบรรทัดออก.gitignoreเพื่อให้คุณสามารถส่งไฟล์ได้

ฉันมีปัญหาเดียวกันนี้และเพิ่งพบว่า.gitignoreGithub ที่สร้างขึ้นสำหรับแอพพลิเคชั่น Rails ของฉันนั้นรวมอยู่config/secrets.ymlด้วย


140
config / secret.yml ไม่ควรอยู่ใน repo คุณสามารถทำได้. eml.sample และกรอกด้วยข้อมูลปลอม แต่เพื่อความปลอดภัยอย่าทำ. syml ใน repos
user3379926

9
@ user3379926 ภายในบริบทของแอพ Rails บน Heroku คุณไม่สามารถเลือกและเลือกไฟล์ที่จะรวมอยู่ในการควบคุมเวอร์ชันและไฟล์ใดที่ไม่ได้ Rails 4.1 คาดว่าการกำหนดค่าความลับจะมีอยู่ไม่เช่นนั้นแอปพลิเคชันจะไม่ทำงาน หากคุณมีวิธีแก้ไขปัญหาที่เกิดขึ้นในคำถามข้างต้นโดยไม่ต้องหันไปใช้ไฟล์ secret.yml ใน Git โปรดช่วยปรับปรุงกระทู้นี้โดยให้คำแนะนำนั้น
danielricecodes

9
@danielricecodes คุณสามารถตั้งค่าด้วยตนเองใน initializer สิ่งที่ต้องการRails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]จะทำงานและลบข้อผิดพลาดโดยไม่ต้องเพิ่มsecrets.ymlแหล่งที่มา
joshhepworth

11
@ user3379926: เมื่อฉันสร้างแอปพลิเคชั่น Rails ใหม่ด้วยrails new(ในกรณีนี้คือ Gemfile ซึ่งเป็นrailsgem ที่มีเวอร์ชัน4.2.4) ไฟล์config/secrets.ymlจะถูกสร้างขึ้น ซึ่งจะรวมถึงกุญแจลับ pregenerated สำหรับการพัฒนาและการทดสอบสภาพแวดล้อมและอ่าน secretkey secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>สำหรับสภาพแวดล้อมการผลิตจากตัวแปรสภาพแวดล้อม: ดูเหมือนว่าฉันจะปลอดภัยอย่างสมบูรณ์และมีประโยชน์จริง ๆ เพื่อให้secrets.ymlไฟล์นี้อยู่ในการควบคุมเวอร์ชันหากไม่มีใครกำหนดคีย์ลับในนั้น
Teemu Leisti

2
@jasonleonhard ทำไมล่ะ หากคุณกำลังอ่านคีย์ลับจาก env vars อยู่ดีเรื่องใหญ่คืออะไร? ไม่มีความลับถูกเปิดเผย
horseyguy

13

สิ่งนี้ใช้ได้สำหรับฉัน

SSH ไปยังเซิร์ฟเวอร์ที่ใช้งานจริงของคุณและcdในไดเรกทอรีปัจจุบันของคุณเรียกใช้bundle exec rake secretหรือrake secretคุณจะได้รับสตริงยาวเป็นผลลัพธ์คัดลอกสตริงนั้น

sudo nano /etc/environmentเรียกใช้ตอนนี้

วางที่ด้านล่างของไฟล์

export SECRET_KEY_BASE=rake secret
ruby -e 'p ENV["SECRET_KEY_BASE"]'

ที่ไหนเป็นสตริงที่คุณเพียงแค่คัดลอกวางที่สตริงคัดลอกในสถานที่ของrake secretrake secret

echo $SECRET_KEY_BASEรีสตาร์ทเซิร์ฟเวอร์และการทดสอบโดยการทำงาน


3

ในขณะที่คุณสามารถใช้ 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

ก่อนที่จะปรับใช้แอพของคุณอีกครั้งโปรดตั้งค่าตัวแปรสภาพแวดล้อมของคุณก่อน: การตั้งค่า SECRET_KEY_BASE ใน Heroku Dashboard

จากนั้นเพิ่ม buildpack ที่ปรับเปลี่ยนแล้วของคุณ (หรือคุณยินดีที่จะเชื่อมโยงไปยังเหมืองแร่) ไปยังแอพ Heroku ของคุณ (ดูเอกสารของ Heroku ) และปรับใช้แอปของคุณ

buildpack จะสร้างconfig/secrets.ymlตัวแปรสภาพแวดล้อมของคุณโดยอัตโนมัติซึ่งเป็นส่วนหนึ่งของกระบวนการสร้าง dyno ทุกครั้งที่คุณgit pushไปที่ Heroku

แก้ไข: เอกสารของ Heroku แนะนำให้สร้างconfig/secrets.ymlเพื่ออ่านจากตัวแปรสภาพแวดล้อม แต่สิ่งนี้บอกเป็นนัยว่าคุณควรตรวจสอบไฟล์นี้ในแหล่งควบคุม ในกรณีของฉันสิ่งนี้ใช้งานไม่ได้เนื่องจากฉันมีความลับแบบฮาร์ดโค้ดสำหรับการพัฒนาและสภาพแวดล้อมการทดสอบที่ฉันไม่ต้องการเช็คอิน


ในขณะที่ทางออกที่ยอดเยี่ยมอัญมณี. doten และ. foreman จะแก้ปัญหานี้: "ฉันมีความลับ hardcoded สำหรับการพัฒนาและทดสอบสภาพแวดล้อม" - ดังนั้นการใช้อัญมณีเหล่านั้นหมายความว่าคุณไม่จำเป็นต้องใช้ buildpack เพราะคุณสามารถใช้ ENV_VAR ในไฟล์ลับของคุณสำหรับ dev และ ทดสอบด้วย
rmcsharry

โปรดทราบว่าตัวแปรสภาพแวดล้อมถูกบันทึกไว้โดยโครงสร้างพื้นฐานส่วนใหญ่ซึ่งหมายความว่าตัวแปรสภาพแวดล้อมที่ไม่ได้เข้ารหัสจะเป็นข้อความธรรมดาในบันทึก ฉันไม่ได้ใช้ Heroku สำหรับแอพ Rails ของฉันดังนั้นจึงไม่มีคำแนะนำสำหรับมัน แต่ด้วย AWS เราจึงดึงค่าที่เข้ารหัสจาก Parameter Store ระหว่างการสร้างจากภายในคอนเทนเนอร์สร้างและไม่เข้ารหัสเพื่อสร้างสินทรัพย์ที่ปลอดภัยประเภทนี้
Daniel Nalbach

1

คุณสามารถส่งออกคีย์ลับไปเป็นตัวแปรสภาพแวดล้อมบน~/.bashrcหรือ~/.bash_profileของเซิร์ฟเวอร์ของคุณ:

export SECRET_KEY_BASE = "YOUR_SECRET_KEY"

จากนั้นคุณสามารถระบุแหล่งที่มาของคุณ.bashrcหรือ.bash_profile:

source ~/.bashrc 
source ~/.bash_profile

ไม่เคยกระทำความลับของคุณ


1

ในกรณีของฉันปัญหาคือconfig/master.keyไม่ได้อยู่ในการควบคุมเวอร์ชันและฉันได้สร้างโครงการบนคอมพิวเตอร์เครื่องอื่น

. gitignore เริ่มต้นที่ Rails สร้างไม่รวมไฟล์นี้ เนื่องจากไม่สามารถปรับใช้โดยไม่ต้องมีไฟล์นี้จึงจำเป็นต้องอยู่ในการควบคุมเวอร์ชันเพื่อให้สามารถปรับใช้จากคอมพิวเตอร์ของสมาชิกในทีม

วิธีแก้ไข: ลบconfig/master.keyบรรทัดออกจากคอม.gitignoreมิตไฟล์จากคอมพิวเตอร์ที่สร้างโครงการและตอนนี้คุณสามารถทำได้git pullบนคอมพิวเตอร์เครื่องอื่นและปรับใช้จากมัน

ผู้คนกำลังบอกว่าจะไม่ส่งมอบไฟล์เหล่านี้ให้กับการควบคุมเวอร์ชันโดยไม่ต้องเสนอทางเลือกอื่น ตราบใดที่คุณไม่ได้ทำงานในโครงการโอเพ่นซอร์สฉันเห็นว่าไม่มีเหตุผลที่จะไม่ยอมรับทุกสิ่งที่จำเป็นในการเรียกใช้โครงการรวมถึงข้อมูลประจำตัว


อย่าส่งไฟล์มาสเตอร์คีย์ของคุณเพื่อคอมไพล์ นี่เป็นช่องโหว่ด้านความปลอดภัยที่ยิ่งใหญ่สำหรับแอปของคุณ สำหรับโอเพ่นซอร์สมันเป็นเรื่องยาก แต่การสร้างรหัสผ่านตู้นิรภัยด้วยตัวจัดการรหัสผ่านที่คุณต้องการเป็นตัวเลือกที่ดีกว่า
wsizoo

ทำไมจึงเป็นช่องโหว่ด้านความปลอดภัยหาก repo เป็นส่วนตัว หากบุคคลที่ไม่ได้รับอนุญาตสามารถเข้าถึง repo ส่วนตัวของฉันได้ฉันมีปัญหาใหญ่กว่าการรั่วไหลของคีย์ API ไม่ใช่ทุกโครงการที่เป็นโอเพ่นซอร์ส
Andrew Koster

ฉันรู้สึกเหมือนทุกคนเพิ่งทำสิ่งนี้ซ้ำเพราะพวกเขาเห็นในบทช่วยสอนสำหรับโครงการโอเพนซอร์ส
Andrew Koster

สิ่งทั้งหมดนี้ทำให้เกิดความสับสนเป็นพิเศษเพราะมีเอกสารเก่าล้าสมัยเกี่ยวกับsecrets.ymlไฟล์เก่าซึ่งเลิกใช้แล้วสำหรับ Rails รุ่นต่างๆที่ผ่านมา คำถาม Stack Overflow นี้มีคำตอบมากมายและเกือบทั้งหมดใช้ API โบราณนี้
Andrew Koster

1

สำหรับ rails6 ฉันประสบปัญหาเดียวกันเนื่องจากฉันพลาดไฟล์ต่อไปนี้เมื่อฉันเพิ่มพวกเขาปัญหาได้รับการแก้ไข:

1. config/master.key
2. config/credentials.yml.enc

ตรวจสอบให้แน่ใจว่าคุณมีไฟล์นี้ !!!


0

สิ่งที่ฉันทำ: บนเซิร์ฟเวอร์ที่ใช้งานจริงของฉันฉันสร้างไฟล์ปรับแต่ง (confthin.yml) สำหรับ Thin (ฉันใช้มัน) และเพิ่มข้อมูลต่อไปนี้:

environment: production
user: www-data
group: www-data
SECRET_KEY_BASE: mysecretkeyproduction

ฉันเปิดแอพด้วย

thin start -C /whereeveristhefieonprod/configthin.yml

ทำงานเหมือนมีเสน่ห์และไม่จำเป็นต้องมีรหัสลับในการควบคุมเวอร์ชัน

หวังว่ามันจะช่วยได้ แต่ฉันแน่ใจว่าสิ่งเดียวกันนี้สามารถทำได้กับยูนิคอร์นและคนอื่น ๆ


1
คุณช่วยอธิบายได้ว่าทำไม / ทำงานอย่างไร? คำถามคือสำหรับ heroku มันบางเป็นทางเลือกหรือเข้ากันได้กับ heroku?
ahnbizcad

-1

ฉันมีแพทช์ที่ฉันใช้ในแอพ Rails 4.1 เพื่อให้ฉันใช้ตัวสร้างคีย์เดิมได้ (และด้วยเหตุนี้ความเข้ากันได้ของเซสชันย้อนหลังกับ Rails 3) โดยให้ secret_key_base ว่างเปล่า

Rails::Application.class_eval do
  # the key_generator will then use ActiveSupport::LegacyKeyGenerator.new(config.secret_token)
  fail "I'm sorry, Dave, there's no :validate_secret_key_config!" unless instance_method(:validate_secret_key_config!)
  def validate_secret_key_config! #:nodoc:
    config.secret_token = secrets.secret_token
    if config.secret_token.blank?
      raise "Missing `secret_token` for '#{Rails.env}' environment, set this value in `config/secrets.yml`"
    end 
  end 
end

ฉันได้ทำการฟอร์แมทแพทช์ใหม่แล้วและส่งไปยัง Rails เป็นคำขอดึง


-1

ฉันได้สร้างconfig/initializers/secret_key.rbไฟล์ขึ้นมาแล้วและฉันเขียนบรรทัดโค้ดต่อไปนี้เท่านั้น:

Rails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]

แต่ฉันคิดว่าโซลูชันที่โพสต์โดย@Erik Trautmanนั้นดูสง่างามกว่า;)

แก้ไข: โอ้และในที่สุดฉันก็พบคำแนะนำนี้ใน Heroku: https://devcenter.heroku.com/changelog-items/426 :)

สนุก!




-1

คำตอบ Demi Magus ทำงานให้ฉันจนถึง Rails 5

สำหรับ Apache2 / Passenger / Ruby (2.4) / Rails (5.1.6) ฉันต้องใส่

export SECRET_KEY_BASE=GENERATED_CODE

จาก Demi Magus ให้คำตอบใน / etc / apache2 / envvars ดูเหมือนว่าสาเหตุ / etc / profile จะถูกละเว้น

ที่มา: https://www.phusionpassenger.com/library/indepth/environment_variables.html#apache


-3

ฉันมีปัญหาเดียวกันหลังจากฉันใช้ไฟล์. gitignore จากhttps://github.com/github/gitignore/blob/master/Rails.gitignore

ทุกอย่างทำงานได้ดีหลังจากฉันแสดงความคิดเห็นบรรทัดต่อไปนี้ในไฟล์. gitignore

config/initializers/secret_token.rb
config/secrets.yml

1
เช่นเดียวกับการทำซ้ำทุกที่ไม่แนะนำให้ใช้ secret.yml หรือ secret_token.rb to git
cofiem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.