エラー「「本番」環境の「secret_key_base」がない」を解決する方法(Rails 4.1)


169

Rails 4.1を使用して最初からRailsアプリケーションを作成しましたが、解決できない奇妙な問題に直面しています。

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_BASErake secretコマンドの結果を使用して " "環境変数を構成しました。を起動heroku configすると、正しい名前と値の変数が表示されます。

それでもこのエラーが発生するのはなぜですか?


1
私はまったく同じ問題を抱えており、なぜこれが起こっているのかを知りたいです。理由がわかれば、解決策を投稿します。
danielricecodes 2014

あなたの設定ファイルは呼ばれていますsecret.ymlsecrets.yml
James 14

2
Railsによって生成されたファイルを使用して.gitignoreファイルを再度構成したところ、すべて正常に動作しました
Paolo Laurenti

Rails 4にアップグレードしたときにもこの問題が発生しました。この場合、カスタム環境名があり、secrets.ymlに反映されていなかったためです。ファイルに非標準の名前の行を追加し、コミットして、再デプロイするだけで済みました。
whognu 2016年

将来の読者のために:この答えはおそらく最も簡単で正確です:stackoverflow.com/a/26541742/4880924
BKSpurgeon 2018

回答:


208

私は同じ問題を抱えており、本番サーバーにログインするたびにロードされる環境変数を作成してそれを解決し、それを構成する手順のミニガイドを作成しました:

Unicorn v4.8.2でRails 4.1を使用していて、アプリケーションをデプロイしようとすると、アプリケーションが正しく起動せず、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. サーバーにログインします

    • rootユーザーとしてログインする場合は、このファイルを見つけて編集します。

      $ vi /etc/profile

      viでShift+ G(大文字の「G」)を使用して、ファイルの下部に移動します。

      viに挿入するためGENERATED_CODEに押すと、環境変数を書き込みますi。ファイルの最後の新しい行にあることを確認してください:

      $ export SECRET_KEY_BASE=GENERATED_CODE

      変更を保存し、Esc:x」を使用してファイルを閉じ、Enter保存してviで終了します。

    • しかし、通常のユーザーとしてログインする場合はexample_user、この要点を「」と呼びましょう。これらの他のファイルの1つを見つける必要があります。

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

      これらのファイルは重要度の高いものです。つまり、最初のファイルがあれば、他のファイルを編集する必要はありません。あなたのディレクトリにこれらの2つのファイルを見つけた場合~/.bash_profile~/.profile、あなたは最初の1で記述する必要があります~/.bash_profileLinuxはこれだけを読み込みますし、他は無視されますので、。

      その後、我々は、使用してファイルの一番下に移動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、以前の状態が表示されます。最後に、すべての構成が完了すると、Unicornまたは他のツールを使用してRailsアプリケーションを問題なくデプロイできるようになります。

シェルを閉じて本番サーバーに再度ログインすると、この環境変数が設定され、使用できるようになります。

以上です!このミニガイドがこのエラーの解決に役立つことを願っています。

免責事項:私はLinuxやRailsの第一人者ではないため、何か問題やエラーを見つけた場合は、喜んで修正します。


11
Railsは環境変数SECRET_KEY_BASEを見ないようです。ENVを検査すると、printenvで表示され、rails cでの生成でも表示されます。しかし、Unicornを再起動しても効果がありません。これが機能する唯一の方法は、それをsecrets.ymlに直接貼り付けることです
AntonAL

1
これでうまくいきました。完全な説明ありがとうございます。アプリの環境変数を管理するためのgemが存在することを知りました。'Dotenv'はherokuの1つであり 'foreman'です。この方法で手動でエラーを修正することは教育でしたが、おそらくこれらの宝石のいずれかを使用するとプロセスが合理化されますか?
Nick Res 2015

私は:)主にサーバーを管理するためにカピストラーノまたは他の増分のツールを使用する人のために、私の答えは参考になりましたことをうれしく思い、ninja08 @宝石オプションのおかげで、彼らは決定的プロセスを容易に
デミ・メイガス

デミ・マグスのすばらしい指示に従って、私はこのようなことをしました:cd / var / www / rails; rvmはext-rbx-2.5.2@railsを使用します。SKB_FILE = / var / www / .secret_key_base; echo "SECRET_KEY_BASE = $(RAILS_ENV = production rake secret)をエクスポートする"> $ SKB_FILE; 。$ SKB_FILE; エコー "。$ SKB_FILE" | tee -a〜/ .bashrc〜/ .bash_profile; chmod o-rwx $ SKB_FILE;
David Winiecki

素敵な答え!!私は、これは私のために解決されていない理由は、私が質問を作成知らないstackoverflow.com/questions/33117318/...を
アドリアーノレゼンデ

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_secretsRailsがにSECRET_KEY_BASE住んでいることを知らない限り、何もしませんENV。Herokuに構成変数が存在する場合、Railsはそれが存在するという理由でそれを取得するだろうという考えに苦労してきましたが、今では、Railsがどこを見ればよいのかを知る必要があることは明らかです。秘密鍵ベースのことを気にすることなく、Githubでコードを作成する方法を知りたいと思っていました。今私は知っている。
フランジャー001 2015年

1
同意しました。secrets.ymlは、Figaroのような素晴らしい宝石では不要だと思います。
Joe

2
プロジェクトにgithubとherokuを使用する場合は、最良のオプションのようです。
flexus

1
であなたのsecrets.ymlをコミットすると間違っては何ですかproduction: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>。それは、実際の秘密鍵が公開されないことも意味しません。すべてがシードデータとテストデータである場合、コミットされたsecrets.ymlで開発キーとテストキーを公開するリスクはありますか?
ジェイ・キリーン、2016

これは、secrets.ymlがなくなったRails 6.0.2でも機能します。
土井健

54

config/secrets.ymlバージョン管理に追加して、再度デプロイします。.gitignoreファイルをコミットできるように、行を削除する必要がある場合があります。

これとまったく同じ問題があり.gitignore、Railsアプリケーション用に作成されたボイラープレートGithubが含まれていることがわかりましたconfig/secrets.yml


140
config / secrets.ymlは絶対にレポジトリに置かないでください。yml.sampleに偽のデータを入力できますが、セキュリティ上の理由から、レポジトリでは.ymlを行わないでください
user3379926

9
@ user3379926、HerokuのRailsアプリのコンテキスト内では、バージョン管理に含まれるファイルと含まれないファイルを選択することはできません。Rails 4.1はシークレット構成が存在することを想定しています。そうでない場合、アプリケーションは実行されません。Gitでsecrets.ymlファイルをコミットすることに頼らずに上記の質問で提起された問題を解決する方法がある場合は、そのアドバイスを提供してこのスレッドの改善にご協力ください。
danielricecodes 2014

9
@danielricecodesイニシャライザで値を手動で設定できます。のようなものRails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]が機能し、secrets.ymlソースに追加せずにエラーを削除します。
joshhepworth 14

11
@ user3379926:新しいRailsアプリケーションを生成するとrails new(この場合、railsgemのバージョンがGemfileであるGemfile が生成され4.2.4ます)、ファイルconfig/secrets.ymlが生成されます。開発環境とテスト環境用に事前に生成された秘密鍵が含まれ、本番環境用の秘密鍵を環境変数から読み取りますsecret_key_base: <%= ENV["SECRET_KEY_BASE"] %>。このsecrets.ymlファイルをバージョン管理下に置いておくことは、実際に秘密鍵を実際に定義することがない限り、完全に安全であり、実際に有用であると私には思えます。
Teemu Leisti 2015

2
@jasonleonhardなんで?とにかくenv varsから秘密鍵を読んでいる場合、何が問題なのでしょうか 秘密は公開されていません。
horseyguy 2016

13

これでうまくいきました。

cd運用サーバーと現在のディレクトリにSSHで接続して、bundle exec rake secretまたはrake secretを実行すると、出力として長い文字列が表示され、その文字列をコピーします。

実行しsudo nano /etc/environmentます。

ファイルの下部に貼り付けます

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

rake secretコピーした文字列はどこにあるか、コピーした文字列をの代わりに貼り付けますrake secret

サーバーを再起動し、を実行してテストしますecho $SECRET_KEY_BASE


3

他の回答と同様にイニシャライザを使用できますが、従来の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ダッシュボードでのSECRET_KEY_BASEの設定

次に、変更したビルドパック(または、自分のリンクへのリンクを歓迎します)をHerokuアプリ(Herokuのドキュメントを参照)に追加し、アプリを再デプロイします。

ビルドパックは、Herokuにアクセスするたびに、dyno config/secrets.ymlビルドプロセスの一部として環境変数からを自動的に作成しますgit push

編集:Herokuの独自のドキュメントでconfig/secrets.yml、環境変数から読み取るように作成することを推奨していますが、これは、このファイルをソース管理にチェックインする必要があることを意味しています。私の場合、チェックインしたくない開発環境とテスト環境のシークレットをハードコードしているため、これはうまく機能しません。


優れたソリューションである.dotenvと.foreman gemはこの問題を解決します。「開発環境とテスト環境にシークレットをハードコーディングしました」-これらのgemを使用すると、開発用のシークレットファイルでENV_VARを使用できるため、ビルドパックが不要になります。テストも
rmcsharry

環境変数はほとんどのインフラストラクチャによってログに記録されることに注意してください。つまり、暗号化されていない環境変数はログのプレーンテキストになります。私はRailsアプリにHerokuを使用していないため、推奨はありませんが、AWSでは、ビルド中にビルドコンテナー内からパラメーターストアから暗号化された値をプルし、暗号化を解除して、これらの種類の安全なアセットに入力します。
Daniel Nalbach

1

~/.bashrcまたは~/.bash_profileサーバーの環境変数として秘密鍵をエクスポートできます。

export SECRET_KEY_BASE = "YOUR_SECRET_KEY"

そして、あなたはあなたの.bashrcまたはを調達することができます.bash_profile

source ~/.bashrc 
source ~/.bash_profile

secrets.ymlをコミットしないでください


1

私の場合、問題はconfig/master.keyバージョン管理にありませんでした。別のコンピューターでプロジェクトを作成しました。

Railsが作成するデフォルトの.gitignoreは、このファイルを除外します。このファイルがないと展開できないため、任意のチームメンバーのコンピューターから展開できるように、バージョン管理する必要があります。

解決策:config/master.keyから行を削除し.gitignore、プロジェクトが作成されたコンピューターからファイルをコミットしますgit pull。これで、他のコンピューターでそれからデプロイできます。

人々は、代替のソリューションを提供することなく、これらのファイルのいくつかをバージョン管理にコミットしないように言っています。オープンソースプロジェクトに取り組んでいない限り、資格情報を含め、プロジェクトの実行に必要なすべてのことをコミットしない理由はありません。


マスターキーファイルをgitにコミットしないでください。これは、アプリの大きなセキュリティの脆弱性です。オープンソースの場合は難しいですが、お好みのパスワードマネージャーでパスワードボールトを作成することをお勧めします。
wsizoo

リポジトリが非公開の場合、なぜセキュリティ上の脆弱性になるのですか?権限のない人が私のプライベートリポジトリにアクセスできる場合、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

私がしたこと:私の運用サーバーで、Thin(私はそれを使用しています)の構成ファイル(confthin.yml)を作成し、次の情報を追加します。

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

次に、アプリを起動します

thin start -C /whereeveristhefieonprod/configthin.yml

魅力のように機能し、バージョン管理に秘密鍵を用意する必要はありません

それが役に立てば幸いですが、同じことがユニコーンや他の人でもできると確信しています。


1
これがなぜ/どのように機能しているのか説明できますか?問題はherokuに対するものでした。薄い代替品ですか、それともherokuと互換性がありますか?
ahnbizcad 14

-1

Rails 4.1アプリで使用したパッチを使用して、secret_key_baseを空白にできるようにすることで、レガシーキージェネレーター(したがって、Rails 3とのセッションの下位互換性)を引き続き使用できます。

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 :)

楽しい!





-3

https://github.com/github/gitignore/blob/master/Rails.gitignoreの .gitignoreファイルを使用した後も同じ問題が発生しました

.gitignoreファイルの次の行にコメントを書き込んだ後、すべてがうまくいきました。

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

1
どこでも繰り返されているように、secrets.ymlまたはsecret_token.rbをgitにコミットすることは推奨されません。
cofiem 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.