[ruby-on-rails] “ ‘생산’환경에 대한`secret_key_base` 누락”오류를 해결하는 방법 (Rails 4.1)

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_BASE“환경 변수를 rake secret명령 결과로 구성했습니다 . 를 시작 heroku config하면 올바른 이름과 값으로 변수를 볼 수 있습니다.

왜이 오류가 계속 발생합니까?



답변

프로덕션 서버에 로그인 할 때마다로드 될 환경 변수를 작성하여 동일한 문제가 발생하여이를 해결하기 위한 단계를 안내 했습니다.

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. 서버에 로그인

    • 루트 사용자로 로그인 한 경우이 파일을 찾아서 편집하십시오.

      $ vi /etc/profile

      vi에서 Shift+ G(대문자 “G”)를 사용하여 파일의 맨 아래로 이동하십시오 .

      vi에 삽입 하려면 GENERATED_CODE을 눌러 환경 변수를 작성하십시오 i. 파일 끝에서 새 줄에 있어야합니다.

      $ export SECRET_KEY_BASE=GENERATED_CODE

      변경 사항을 저장하고을 사용하여 파일을 닫은 Esc다음 ” :x“를 사용하여 Entervi에서 저장하고 종료하십시오.

    • 그러나 일반 사용자로 로그인 한 example_user경우이 요점을 ” ” 라고 부르면 다음 파일 중 하나를 찾아야합니다.

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

      이 파일들은 순서가 중요하므로 첫 번째 파일이 있으면 다른 파일을 편집 할 필요가 없습니다. 당신이 당신의 디렉토리에이 두 파일을 발견하는 경우 ~/.bash_profile그리고 ~/.profile당신은 단지 첫 번째로 작성해야합니다 ~/.bash_profile리눅스는이 하나를 읽을 것이며, 다른 하나는 무시되기 때문.

      그럼 우리가 사용하는 파일의 맨 아래로 이동 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 전문가가 아니므로 잘못된 점이나 오류가 있으면 문제를 해결하게되어 기쁩니다.


답변

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. 이것을 미리 알기 위해 많은 시간을 절약했을 것입니다.


답변

config/secrets.yml버전 관리에 추가 하고 다시 배포하십시오. .gitignore파일을 커밋 할 수 있도록 줄을 제거해야 할 수도 있습니다 .

나는이 똑같은 문제가 있었고 .gitignoreGithub이 Rails 애플리케이션을 위해 만든 상용구가 포함되어 있음을 알게 되었습니다.config/secrets.yml .


답변

이것은 나를 위해 일했습니다.

프로덕션 서버 및 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.


답변

다른 답변과 마찬가지로 이니셜 라이저를 사용할 수 있지만 기존 Rails 4.1 이상은을 사용하는 것 config/secrets.yml입니다. Rails 팀이이를 도입 한 이유는이 답변의 범위를 벗어 났지만 TL; DR은 secret_token.rb토큰이 소스 제어 히스토리와 체크인해야하는 유일한 시스템에 체크인되기 때문에 구성 및 코드 를 병합하고 보안 위험이 있기 때문입니다. 생산 비밀 토큰이 생산 인프라라는 것을 알고 있습니다.

소스 컨트롤에 .gitignore추가하지 않는 것처럼 이 파일을 추가해야 config/database.yml합니다.

설정을위한 Heroku가 자신의 코드를 참조하기 config/database.yml에서 DATABASE_URL자신의 루비 Buildpack , 나는 결국 자신의 repo를 분기 만들고 그것을 수정 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의 설명서 참조) ) 앱을 다시 배포하십시오.

config/secrets.yml빌드 git push팩은 Heroku에 갈 때마다 dyno 빌드 프로세스의 일부로 환경 변수에서 자동으로 생성합니다 .

편집 : Heroku 자체 문서config/secrets.yml 에는 환경 변수에서 읽도록 작성 하는 것이 좋지만 이것은이 파일을 소스 제어로 체크인해야 함을 의미합니다. 필자의 경우 체크인하지 않을 개발 및 테스트 환경에 대한 비밀을 하드 코딩했기 때문에 이것은 잘 작동하지 않습니다.


답변

당신은에 환경 변수로 비밀 키를 내보낼 수 있습니다 ~/.bashrc또는 ~/.bash_profile서버의 :

export SECRET_KEY_BASE = "YOUR_SECRET_KEY"

그리고, 당신은 .bashrc또는 .bash_profile:

source ~/.bashrc
source ~/.bash_profile

비밀을 저 지르지 마십시오.


답변

필자의 경우 문제는 config/master.key버전 관리가 아니었고 다른 컴퓨터에서 프로젝트를 만들었습니다.

Rails가 생성하는 기본 .gitignore는이 파일을 제외합니다. 이 파일이 없어도 배포 할 수 없으므로 모든 팀 구성원의 컴퓨터에서 배포 할 수 있으려면 버전을 제어해야합니다.

솔루션 :에서 config/master.key행을 제거하고 .gitignore프로젝트가 작성된 컴퓨터에서 파일을 커미트하십시오. 이제 git pull다른 컴퓨터에서 파일을 배치 할 수 있습니다.

사람들은 대체 솔루션을 제공하지 않고 이러한 파일 중 일부를 버전 제어에 커밋하지 말라고 말합니다. 오픈 소스 프로젝트에서 작업하지 않는 한 자격 증명을 포함하여 프로젝트를 실행하는 데 필요한 모든 것을 커밋하지 않을 이유가 없습니다.