“'Üretim' ortamı için eksik 'secret_key_base` hatası nasıl giderilir (Rails 4.1)


169

Rails 4.1'i kullanarak sıfırdan bir Rails uygulaması oluşturdum ve çözemediğim garip bir sorunla karşılaşıyorum.

Uygulamamı Heroku üzerinde dağıtmaya çalıştığımda 500 hatası alıyorum:

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

secret.ymlDosya aşağıdaki yapılandırmayı içerir:

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

Heroku'da " SECRET_KEY_BASE" ortam değişkenini rake secretkomutun sonucuyla yapılandırdım . Başlatılırsam heroku configdeğişkeni doğru ad ve değerle görebilirim.

Neden hala bu hatayı alıyorum?


1
Aynı problemi yaşıyorum ve bunun neden olduğunu bilmek isterim. Nedenini anlarsam, çözümümle geri gönderirim.
danielricecodes

Senin yapılandırma dosyası denir mi secret.ymlyoksa secrets.yml?
James

2
Yine .gitignore dosyasını raylar tarafından oluşturulan dosyayla yapılandırdım ve şimdi her şey iyi çalışıyor
Paolo Laurenti

Rails 4'e yükselttiğimizde de bu sorunu yaşadık. Bizim durumumuzda, özel bir ortam adımız vardı ve bu secrets.yml'ye yansıtılmadı. Sadece standart olmayan bir isim, taahhüt ve yeniden dağıtımı ile dosyaya bir satır eklemek zorunda kaldı.
whognu

Gelecekteki okuyucular için: Bu cevap muhtemelen en kolay ve en doğrudur: stackoverflow.com/a/26541742/4880924
BKSpurgeon

Yanıtlar:


208

Aynı sorunu yaşadım ve üretim sunucusuna her giriş yaptığımda yüklenecek bir ortam değişkeni oluşturarak çözdüm ve yapılandırmak için adımların bir mini kılavuzunu yaptım:

Unicorn v4.8.2 ile Rails 4.1 kullanıyordum ve uygulamamı dağıtmaya çalıştığımda düzgün başlamadı ve unicorn.logdosyada bu hata mesajını buldum:

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

Biraz araştırma yaptıktan sonra, Rails 4.1'in yönetim yolunu değiştirdiğini öğrendim secret_key, bu nedenle secrets.ymlbulunan dosyayı okursanız şöyle bir exampleRailsProject/config/secrets.ymlşey bulacaksınız:

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

Bu, Rails'in secret_key_baseüretim sunucunuzdaki ortam değişkenini kullanmanızı tavsiye ettiği anlamına gelir . Bu hatayı çözmek için üretim sunucunuzda Linux (benim durumumda Ubuntu) için bir ortam değişkeni oluşturmak üzere şu adımları izlemelisiniz:

  1. Üretim sunucunuzun terminalinde şunları yürütün:

    $ RAILS_ENV=production rake secret

    Bu, harf ve rakam içeren büyük bir dize döndürür. Kodu kopyalayacağız, ki bu koddan bahsedeceğiz GENERATED_CODE.

  2. Sunucunuza giriş yapın

    • Kök kullanıcı olarak oturum açarsanız, bu dosyayı bulun ve düzenleyin:

      $ vi /etc/profile

      Vi'de Shift+ G(büyük harf "G") kullanarak dosyanın altına gidin .

      Vi değişkenini eklemek için GENERATED_CODEtuşuna basarak ortam değişkeninizi yazın i. Dosyanın sonunda yeni bir satırda olduğunuzdan emin olun:

      $ export SECRET_KEY_BASE=GENERATED_CODE

      Değişiklikleri kaydedin Escve sonra " :x" ile dosyayı kapatın ve Entervi'da kaydedip çıkın.

    • Ancak normal kullanıcı olarak giriş yaparsanız, example_userbu öz için " " diyelim , şu diğer dosyalardan birini bulmanız gerekecek:

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

      Bu dosyalar önem sırasına göre sıralanır, yani ilk dosyanız varsa, diğerlerini düzenlemenize gerek yoktur. Bu iki dosyayı dizininizde bulduysanız ~/.bash_profileve ~/.profileyalnızca birincisinde yazmak zorunda kalırsanız ~/.bash_profile, çünkü Linux yalnızca bunu okuyacak ve diğeri yok sayılacaktır.

      Sonra tekrar Shift+ kullanarak dosyanın altına gidip Gtekrar GENERATED_CODEkullanarak bizim ortam değişkenini yazıyoruz ive dosyanın sonuna yeni bir satır eklediğinizden emin olun:

      $ export SECRET_KEY_BASE=GENERATED_CODE

      Kodu yazdıktan sonra, değişiklikleri kaydedin ve dosyayı Esctekrar kapatın ve " :x" Enterile kaydedin ve çıkın.

  3. Ortam değişkenimizin Linux'ta bu komutla düzgün şekilde ayarlandığını doğrulayabilirsiniz:

    $ printenv | grep SECRET_KEY_BASE

    veya:

    $ echo $SECRET_KEY_BASE

    Bu komutu yürüttüğünüzde, her şey yolunda giderse size daha GENERATED_CODEönce gösterecektir . Son olarak, tüm konfigürasyon tamamlandığında, Rails uygulamanızı Unicorn veya başka bir araçla sorunsuz bir şekilde dağıtabilirsiniz.

Kabuğunuzu kapatıp tekrar üretim sunucusuna giriş yaptığınızda, bu ortam değişkenini ayarlamış ve kullanmaya hazır olacaksınız.

Ve bu kadar! Umarım bu mini kılavuz bu hatayı çözmenize yardımcı olur.

Yasal Uyarı: Ben bir Linux ya da Rails gurusu değilim, bu yüzden yanlış bir şey ya da herhangi bir hata bulursanız düzeltmekten memnuniyet duyarız.


11
Görünüşe göre Rails, SECRET_KEY_BASE ortam değişkenini görmüyor. printenv bunu gösteriyor, ENV'yi incelersem raylar üretimi de görüntüler. Ancak, Unicorn'u yeniden başlattığımda hiçbir etkim yok. Şimdi çalışan tek yol, doğrudan
secrets.yml'e

1
Bu benim için çalıştı. Açıklamanız için teşekkür ederiz. Bir uygulamanın ortam değişkenlerini yönetmek için var olan bir mücevher olduğunu öğrendim. 'Dotenv' heroku için bir ve 'ustabaşı'. Hatayı bu şekilde manuel olarak düzeltmek eğitim olsa da, belki de bu mücevherlerden birini kullanmak süreci kolaylaştırır?
Nick Res

Cevabımın yararlı olduğuna sevindim, @ ninja08 mücevher seçenekleri için teşekkürler, kesinlikle sunucuyu yönetmek için capistrano veya diğer artımlı aracı kullananlar için işlemi kesinlikle kolaylaştırıyorlar :)
Demi Magus

Demi Magus'un mükemmel talimatlarını izleyerek böyle bir şey yaptım: cd / var / www / rails; rvm ext-rbx-2.5.2@rails kullanın; SKB_FILE = / var / www / .secret_key_base; echo "dışa aktar SECRET_KEY_BASE = $ (RAILS_ENV = üretim komisyonu sırrı)"> $ SKB_FILE; . $ SKB_FILE; echo ". $ SKB_FILE" | tee -a- / .bashrc ~ / .bash_profile; chmod o-rwx $ SKB_FILE;
David Winiecki

Güzel cevap !! Bunun neden benim için çözülmediğini bilmiyorum, soru oluşturuyorum stackoverflow.com/questions/33117318/…
Adriano Resende

84

Ben secrets.ymlkontrol kaynak kontrol (yani .gitignoredosyada) olmadığını varsayalım . Bu sizin durumunuz olmasa bile, bu soruyu görüntüleyen diğer birçok kişi yapmıştır, çünkü kodları Github'da açıktadır ve gizli anahtarlarının etrafında dolaşmasını istemezler.

Kaynak kontrolünde değilse, Heroku bunu bilmiyor. Bu yüzden Rails arıyor Rails.application.secrets.secret_key_baseve ayarlanmadı çünkü Rails secrets.ymlmevcut olmayan dosyayı kontrol ederek ayarlıyor . Basit çözüm, config/environments/production.rbdosyanıza gidip aşağıdaki satırı eklemektir:

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

Bu, uygulamanıza gizli anahtarı aramak yerine ortam değişkenini kullanarak ayarlamasını söyler secrets.yml. Bunu önceden tanımak bana çok zaman kazandıracaktı.


15
Bu en iyi cevap. Figarove heroku_secretsRails'in içinde SECRET_KEY_BASEyaşadığını bilmediği sürece hiçbir şey yapmayın ENV. Yapılandırma Heroku'da var olsaydı, Rails'in mevcut olması nedeniyle onu alacağı düşüncesiyle mücadele ediyorum, ancak şimdi Rails'in nereye bakacağını bilmesi gerektiği açıkça gözüküyor. Ben gizli anahtar temel şey hakkında endişelenmenize gerek kalmadan Github kod nasıl olabilir merak ediyordum; şimdi biliyorum.
flanger001

1
Kabul ediyorum, bence secrets.yml, Figaro gibi büyük mücevherlerle gereksizdir.
Joe

2
Projeniz için github ve heroku kullanıyorsanız en iyi seçenek gibi görünüyor.
flexus

1
Sırlarınızı taahhüt etmenin nesi yanlış production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>. Bu da gerçek gizli anahtarın açıkta kalmadığı anlamına gelmez. Tümü sadece tohum ve test verisi ise, dev ve test anahtarlarını taahhüt edilen secrets.yml'de gösterme riski var mı?
Jay Killeen

Bu, artık secrets.yml olmadığında Rails 6.0.2'de bile çalışır.
Ken Tsoi

54

config/secrets.ymlSürüm kontrolüne ekleyin ve tekrar konuşlandırın. 'Den bir satırı kaldırmanız gerekebilir.gitignoreDosyayı işleyebilmeniz için .

Aynı sorunu yaşadım ve .gitignoreRails uygulamam için oluşturulan ortak Github'un dahil olduğu ortaya çıktı config/secrets.yml.


140
config / secrets.yml sen do.yml.sample ve sahte verilerle olarak doldurmaya ancak güvenlik için, repo içinde .yml yapmak asla repo olması ASLA
user3379926

9
@ user3379926, Heroku'daki bir Rails uygulaması bağlamında, sürüm denetimine dahil olan ve olmayan dosyaları seçemez ve seçemezsiniz. Rails 4.1 gizli yapılandırmanın var olmasını bekler, aksi takdirde uygulama çalışmaz. Git'te secrets.yml dosyasını teslim etmeye başvurmadan yukarıdaki Soruda ortaya çıkan sorunu çözmenin bir yolu varsa, lütfen bu tavsiyeyi sağlayarak bu konuyu geliştirmeye yardımcı olun.
danielricecodes

9
@danielricecodes, değeri bir başlatıcıda manuel olarak ayarlayabilirsiniz. Gibi bir Rails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]şey işe yarar secrets.ymlve kaynağa eklemeden hatayı kaldırır .
joshhepworth

11
@ user3379926: Yeni bir Rails uygulaması oluşturduğumda rails new(bu durumda, bir Gemfile üreten)rails sürümü4.2.4 ), dosya config/secrets.ymlüretiliyor. Bu geliştirme ve test ortamları için gizli anahtarları pregenerated ve bir ortam değişkeni gelen üretim ortamı için SecretKey okur içerir: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>. Bana orada secrets.ymlgizli anahtarı asla tanımlamaması şartıyla, bu dosyayı sürüm kontrolünde tutmanın tamamen güvenli ve gerçekten yararlı olduğunu görünüyor .
Teemu Leisti

2
@jasonleonhard neden? Zaten env vars'ın gizli anahtarını okuyorsan, önemli olan ne? açığa çıkan sır yoktur.
horseyguy

13

Bu benim için çalıştı.

SSH'yi üretim sunucunuza ve cdgeçerli dizininize, çalıştırın bundle exec rake secretveyarake secret çıktı olarak uzun bir dize alırsınız, bu dizeyi kopyalayın.

Şimdi koş sudo nano /etc/environment .

Dosyanın altına yapıştır

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

rake secretKopyaladığınız dize nerede , kopyalanan dizeyi yerine yapıştırınrake secret .

Sunucuyu yeniden başlatın ve çalıştırarak test edin echo $SECRET_KEY_BASE.


3

Başlatıcıları diğer yanıtlar gibi kullanabilirsiniz, ancak geleneksel Rails 4.1+ yolu config/secrets.yml. Rails ekibinin bunu tanıtmasının nedeni bu cevabın kapsamı dışındadır, ancak TL; DR, secret_token.rbtoken kaynak kontrol geçmişine ve ihtiyaç duyulan tek sisteme kontrol edildiğinden, bir güvenlik riski olmanın yanı sıra konfigürasyon ve kodu da birleştirir. üretim gizli belirtecinin üretim altyapısı olduğunu bilir.

Bu dosyayı , kaynak denetimine .gitignoreeklemeyeceğiniz gibi eklemelisiniz config/database.yml.

Kurma Heroku kendi kodunu referans config/database.ymlgelen DATABASE_URLkendi içinde Ruby Buildpack , ben bitti onların repo bölmek ve oluşturmak için modifiye config/secrets.ymlgelen SECRETS_KEY_BASEortam değişkeni.

Bu özellik Rails 4.1'de tanıtıldığından, ./lib/language_pack/rails41.rbbu işlevselliği düzenlemenin ve eklemenin uygun olduğunu hissettim .

Şirketimde oluşturduğum değiştirilmiş yapı paketindeki snippet :

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

Elbette bu kodu, ortam değişkeninizden okunacak diğer sırları (örn. Üçüncü taraf API anahtarları, vb.) Eklemek için genişletebilirsiniz:

...
<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
  third_party_api_key: <%= ENV["THIRD_PARTY_API"] %>

Bu şekilde, bu sırra çok standart bir şekilde erişebilirsiniz:

Rails.application.secrets.third_party_api_key

Uygulamanızı yeniden konuşlandırmadan önce ortam değişkeninizi ayarladığınızdan emin olun: Heroku Panosunda SECRET_KEY_BASE ayarı

Ardından, değiştirilmiş derleme paketinizi (veya benimkine bağlanmaktan daha fazlası) Heroku uygulamanıza ekleyin (Heroku'nun belgelerine bakın) ) ve uygulamanızı yeniden konuşlandırın.

Buildpack, Heroku'ya config/secrets.ymlher gittiğinizde dyno oluşturma işleminin bir parçası olarak ortam değişkeninizden otomatik olarak oluşturur git push.

EDIT: Heroku'nun kendi belgelericonfig/secrets.yml , ortam değişkeninden okumak için oluşturmayı önerir , ancak bu, bu dosyayı kaynak denetiminde denetlemeniz gerektiği anlamına gelir. Benim durumumda, kontrol etmek istemediğim geliştirme ve test ortamları için sabit kodlu sırlarım olduğundan bu iyi çalışmıyor.


Harika bir çözüm .dotenv ve .foreman mücevherleri bu sorunu çözerken: "Geliştirme ve test ortamları için sabit kodlu sırlarım var" - yani bu mücevherleri kullanmak, geliştiriciler için sır dosyalarınızda ENV_VAR'ı kullanabileceğiniz için buildpack'e ihtiyacınız olmadığı anlamına gelir ve Ayrıca test
rmcsharry

Ortam değişkenlerinin çoğu altyapı tarafından günlüğe kaydedildiğini, yani şifrelenmemiş ortam değişkenlerinin günlüklerde düz metin olacağı anlamına gelir. Heroku'yu Rails uygulamalarım için kullanmıyorum, bu yüzden herhangi bir öneri yok, ancak AWS ile, inşa konteynerinin içinden inşa sırasında Parametre Deposu'ndan şifrelenmiş değerleri alıyoruz ve bu tür güvenli varlıkları doldurmak için şifrelemeyi kaldırıyoruz.
Daniel Nalbach

1

Gizli anahtarları sunucunuzda ~/.bashrcveya ~/.bash_profilesunucunuzda ortam değişkenleri olarak dışa aktarabilirsiniz :

export SECRET_KEY_BASE = "YOUR_SECRET_KEY"

Ve sonra, kaynak olabilir .bashrcya .bash_profile:

source ~/.bashrc 
source ~/.bash_profile

Sırlarınızı asla taahhüt etmeyin.


1

Benim durumumda, sorun config/master.keysürüm kontrolünde değildi ve projeyi farklı bir bilgisayarda yaratmıştım.

Rails tarafından oluşturulan varsayılan .gitignore bu dosyayı içermez. Bu dosya olmadan dağıtım yapmak imkansız olduğu için, herhangi bir ekip üyesinin bilgisayarından dağıtılabilmesi için sürüm kontrolünde olması gerekir.

Çözüm: config/master.keySatırı buradan kaldırın, .gitignoredosyayı projenin oluşturulduğu bilgisayardan teslim edin ve şimdi git pulldiğer bilgisayarda da dağıtabilirsiniz.

İnsanlar bu dosyaların bir kısmını alternatif bir çözüm sunmadan sürüm kontrolüne tabi tutmamalarını söylüyorlar. Açık kaynaklı bir proje üzerinde çalışmadığınız sürece, kimlik bilgileri de dahil olmak üzere projeyi çalıştırmak için gereken her şeyi yerine getirmemek için hiçbir neden göremiyorum.


Ana anahtar dosyanızı asla git'e taahhüt etmeyin. Bu, uygulamanız için dev bir güvenlik açığıdır. Açık kaynak için zor, ancak tercih ettiğiniz şifre yöneticisiyle bir şifre kasası oluşturmak daha iyi bir seçenektir.
wsizoo

Repo özelse neden güvenlik açığı olur? Yetkisiz bir kişi özel repoma erişebiliyorsa, API anahtarlarından sızıntı yapmaktan daha büyük problemlerim var. Her proje açık kaynak değildir.
Andrew Koster

Herkesin bunu tekrarladığını hissediyorum, çünkü açık kaynaklı bir proje için bir eğitimde gördüler.
Andrew Koster

Tüm bu secrets.ymldosya çok kafa karıştırıcıdır, çünkü eski dosya hakkında geçmişte birkaç Rails sürümü için kullanımdan kaldırılmış çok eski belgeler vardır. Bu Yığın Taşması sorusunun kendisinin bir ton cevabı var ve neredeyse hepsi bu eski API'yi kullanıyor.
Andrew Koster

1

Rails6 için, aşağıdaki dosyaları eksik olduğum için aynı sorunla karşı karşıya kaldım, onları ekledikten sonra sorun çözüldü:

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

Bu dosyalara sahip olduğunuzdan emin olun. !!!


0

Ne yaptım: Üretim sunucumda, Thin (kullanıyorum) için bir yapılandırma dosyası (confthin.yml) oluşturuyorum ve aşağıdaki bilgileri ekliyorum:

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

Daha sonra uygulamayı

thin start -C /whereeveristhefieonprod/configthin.yml

Bir cazibe gibi çalışın ve daha sonra sürüm kontrolünde gizli anahtara gerek yok

Umarım yardımcı olabilir, ama eminim aynı şey Unicorn ve diğerleri için de yapılabilir.


1
bunun neden / nasıl çalıştığını açıklayabilir misiniz? Soru heroku içindi. İnce bir alternatif mi, yoksa heroku ile uyumlu mu?
ahnbizcad

-1

Secret_key_base boş olmasına izin vererek, eski anahtar üreteci kullanmaya devam etmek için bir Rails 4.1 uygulamasında kullandığım bir yama var (ve bu nedenle Rails 3 ile geriye doğru uyumluluk).

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

O zamandan beri yamayı yeniden biçimlendirdim, Çekme Talebi olarak Rails'e gönderdim


-1

config/initializers/secret_key.rbDosya oluşturdum ve sadece aşağıdaki kod satırını yazdım:

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

Ama @Erik Trautman tarafından gönderilen çözümün daha zarif olduğunu düşünüyorum ;)

Edit: Oh, ve sonunda bu tavsiyeyi Heroku'da buldum: https://devcenter.heroku.com/changelog-items/426 :)

Zevk almak!





-3

Https://github.com/github/gitignore/blob/master/Rails.gitignore adresinden .gitignore dosyasını kullandıktan sonra aynı sorunu yaşadım.

.Gitignore dosyasında aşağıdaki satırları yorumladıktan sonra her şey iyi çalıştı.

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

1
Her yerde tekrarlandığı gibi, git için secrets.yml veya secret_token.rb komutlarının verilmesi önerilmez.
cofiem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.