だから私はRailsアプリを本番モードでデプロイしようとしていますが、エラーが発生します:Missing secret_token
およびsecret_key_base
「本番」環境では、これらの値をconfig/secrets.yml
私のsecrets.ymlファイルは期待どおりです:
development:
secret_key_base: xxxxxxx
test:
secret_key_base: xxxxxxx
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
しかし、グーグルと研究の後でも、生産秘密鍵ベースをどうすればいいのか分かりません。そこにある情報のほとんどは、私が特定の背景知識を持っていることを前提としていますが、現実には私は初心者です。
誰かが私の秘密鍵を設定し、これを本番モードで動作させる方法を説明できますか?
次のコマンドを使用してキーを生成できます
$ irb
>> require 'securerandom'
=> true
>> SecureRandom.hex(64)
=> "3fe397575565365108556c3e5549f139e8078a8ec8fd2675a83de96289b30550a266ac04488d7086322efbe573738e7b3ae005b2e3d9afd718aa337fa5e329cf"
>> exit
表示されるエラーは、サーバー上で_secret_key_base
_の環境変数が適切に設定されていないことを示しています。
アプリケーションを実行する前にこれらを設定するプロセスを自動化するcapistranoなどのさまざまなスクリプトを使用できます。
簡単な修正については、これを試してください:
_export SECRET_KEY_BASE=YOUR SECRET BASE
_
環境変数を検証し、これらが設定されているかどうかを確認します。
コマンド:
_env | grep -E "SECRET_TOKEN|SECRET_KEY_BASE"
_
値が表示される場合、これらは本番サーバーで設定されています。
また、ENV.fetch(SECRET_KEY)
を使用することをお勧めします。これは、アプリが起動を試みる前に例外を発生させるためです。
この答えはとても助けになりました。彼は、本番環境でsecrets.ymlファイルを設定する方法と、環境からそれを読み取る方法を示します。
元のリンク: https://stackoverflow.com/a/26172408/496276
私は同じ問題を抱えていたので、実稼働サーバーにログインするたびにロードされる環境変数を作成し、それを構成する手順のミニガイドを作成して解決しました。
https://Gist.github.com/pablosalgadom/4d75f30517edc6230a67
Unicorn v4.8.2でRails 4.1を使用していたときに、アプリをデプロイしようとしても正常に起動せず、Unicorn.logファイルで次のエラーメッセージが見つかりました。
「アプリエラー:「プロダクション」環境のsecret_key_baseがありません。config/ secrets.ymlでこの値を設定してください(RuntimeError)」
いくつかの調査の後、Rails 4.1はsecret_keyの管理方法を変更したため、[exampleRailsProject] /config/secrets.ymlにあるsecrets.ymlファイルを読むと、このようなもの:
リポジトリに本番の秘密を保持しないでください。
代わりに、環境から値を読み取ります。 production:secret_key_base:<%= ENV ["SECRET_KEY_BASE"]%>これは、Rails
実稼働サーバーでsecret_key_baseに環境変数を使用することをお勧めします。このエラーを解決するには、次の手順に従って実稼働サーバーにLinux(私の場合はUbuntu)の環境変数を作成する必要があります。
1.-本番サーバーのターミナルで次のコマンドを実行します。
$ Rails_ENV = production rake secretこれは、文字と数字を含む大きな文字列を返し、それをコピーします(そのコードをGENERATED_CODEと呼びます)。
2.1-サーバーにrootユーザーとしてログインし、このファイルを見つけて編集します:$ vi/etc/profile
ファイルの最後に移動します(VIの大文字Gの場合は「SHIFT + G」)
GENERATED_CODEを使用して環境変数を記述し(「i」キーを押してVIに書き込みます)、ファイルの最後の新しい行にあることを確認してください。
export SECRET_KEY_BASE = GENERATED_CODE変更を保存してファイルを閉じます(「ESC」キーを押してから、VIで保存および終了するために「:x」および「ENTER」キーを書き込みます)。
2.2ただし、通常のユーザーとしてログインし、このGistのexample_userと呼べば、この他のファイルの1つを見つける必要があります。
$ vi〜/ .bash_profile $ vi〜/ .bash_login $ vi〜/ .profileこれらのファイルは重要度順です。つまり、最初のファイルがあれば、他のファイルに書き込む必要はありません。したがって、ディレクトリ "〜/ .bash_profile"および "〜/ .profile"でこの2つのファイルが見つかった場合、最初の1つ "〜/ .bash_profile"に書き込むだけで済みます。これは、Linuxがこのファイルと他のファイルのみを読み取るためです。無視されます。
次に、ファイルの一番下に移動します(VIの大文字Gの場合は「SHIFT + G」)
そして、GENERATED_CODEを使用して環境変数を書き込みます(VIに書き込むには「i」キーを押します)。ファイルの最後に必ず新しい行を入れてください。
export SECRET_KEY_BASE = GENERATED_CODEコードを作成したら、変更を保存してファイルを閉じます(「ESC」キーを押してから、VIで保存および終了するために「:x」および「ENTER」キーを書き込みます)。
3.-次のコマンドを使用して、Linuxで環境変数が適切に設定されていることを確認できます。
$ printenv | grep SECRET_KEY_BASEまたは:
$ echo $ SECRET_KEY_BASEこのコマンドを実行すると、すべてがうまくいった場合、以前のGENERATED_CODEが表示されます。最後に、すべての設定が完了したら、問題なくデプロイできますRails Unicornまたはその他のアプリ。
シェルターミナルを閉じて運用サーバーに再度ログインすると、この環境変数が設定され、使用できる状態になります。
以上です!!このミニガイドがこのエラーの解決に役立つことを願っています。
免責事項:私はLinuxまたはRails第一人者ではないので、何かおかしい点やエラーを見つけた場合は修正できて嬉しいです!
ご覧のとおり、development
およびtest
環境にはハードコードされた値がありますが、production
の値は変数に由来します。まず第一に、なぜこのように?これはセキュリティ機能です。このように、このファイルをgitやsvnなどのバージョン管理にチェックインすると、development
とtest
の値は共有されますが、これは問題ありませんが、production
の値(実際のWebサイトで使用されるもの)はそうではありません。ソースを見て誰もその秘密を知ることはできません。
使用される変数ENV["SECRET_KEY_BASE"]
に関して、これはRailsが実行される環境の環境変数です(development
、test
などのRails "environment"と混同しないでください)。およびproduction
)。これらの環境変数は、シェルから取得されます。 JensD の投稿で述べたように、この環境変数は一時的に次のように設定できます。
export SECRET_TOKEN=YOUR SECRET TOKEN
export SECRET_KEY_TOKEN=YOUR SECRET BASE
新しいシークレットトークンを生成するには、コマンドラインでrake secret
コマンドを使用します。
ただし、これは一時的なものであり、最終的な解決策としては適切ではありません。最終的な解決策については、 この記事 を確認してください。これは、 dotenv の実装シークレットをロードするための実装の終わり近くにあります。バージョン管理を使用する場合は、.env
ファイルをチェックインから除外してください。
Dotenvの設定には少し手間がかかりますが、これらの環境変数を手動で設定しようとするよりも強くお勧めします。
最近(Rails 6)Rails tmp/development_secret.txt
で秘密鍵ベースを生成します。
実稼働環境では、SECRET_KEY_BASE
をen環境変数として使用するのが最適です。これはRailsによって選択されます。
Rails.application.secret_key_base
で確認できます。
'a'から 'f'までの数字と文字の長い文字列(128文字の16進エンコード文字列)が必要です