programing

오류 해결 방법 "'운영' 환경에 대한 'secret_key_base' 누락"(레일 4.1)

copysource 2023. 6. 4. 18:30
반응형

오류 해결 방법 "'운영' 환경에 대한 'secret_key_base' 누락"(레일 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정확한 이름과 값을 가진 변수를 볼 수 있습니다.

이 오류가 계속 발생하는 이유는 무엇입니까?

같은 문제가 발생하여 운영 서버에 로그인할 때마다 로드할 환경 변수를 생성하고 구성 단계에 대한 미니 가이드를 작성하여 해결했습니다.

4하려고 할 때 Unicon v4.8.에서 Rails 4.1을 사용했습니다.unicorn.log파일 다음 오류 메시지를 찾았습니다.

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

4 4.1의 하여 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운영 서버에 있습니다.서버에(Ubuntu의 Ubuntu)를.

  1. 프로덕션 서버의 터미널에서 다음을 실행합니다.

    $ RAILS_ENV=production rake secret
    

    문자와 숫자가 포함된 큰 문자열을 반환합니다.알았다, 우리는 그 코드를 다음과 같이 부를 것입니다.GENERATED_CODE.

  2. 서버에 로그인

    • 루트 사용자로 로그인하는 경우 다음 파일을 찾아 편집합니다.

      $ vi /etc/profile
      

      vi에서 +(대문자 "G")를 G사용하여 파일의 맨 아래로 이동합니다.

      를 다을사환변작성수를과 .GENERATED_CODE를 눌러 vi에 삽입합니다.파일 끝에 새 줄이 있는지 확인합니다.

      $ export SECRET_KEY_BASE=GENERATED_CODE
      

      변경 내용을 저장한 후 "를 사용하여 파일을 닫습니다.:xvi에서 저장하고 종료할 수 있습니다.

    • 하지만 당신이 일반 사용자로 로그인한다면, 그것을 "라고 부르자.example_user요지를 , 과 같은 파일들 중 할 것입니다: 요 점 위 을 다 찾 합 야 아 니 다 하 를 나 이 중 파 일 다 른 해 같 은 음 과 다 합 ▁for 니 : , 이 ▁files ▁one

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

      이러한 파일은 중요도 순으로 나열되므로 첫 번째 파일이 있으면 다른 파일을 편집할 필요가 없습니다. 에서 이 두 개의 파일을 ,~/.bash_profile그리고.~/.profile 것만 쓰면 됩니다.~/.bash_profileLinux는 이 하나만 읽고 다른 하나는 무시하기 때문입니다.

      그런 다음 +를 G사용하여 파일의 맨 아래로 다시 이동하여 환경 변수를 작성합니다.GENERATED_CODE를 다시 사용하고 파일 끝에 새 행을 추가해야 합니다.

      $ export SECRET_KEY_BASE=GENERATED_CODE
      

      코드를 작성한 후 변경 내용을 저장하고 "를 사용하여 파일을 닫습니다.:x저장하고 종료합니다.

  3. 다음 명령을 사용하여 환경 변수가 Linux에서 올바르게 설정되어 있는지 확인할 수 있습니다.

    $ printenv | grep SECRET_KEY_BASE
    

    또는 다음과 함께:

    $ echo $SECRET_KEY_BASE
    

    이 명령을 실행할 때 모든 것이 정상적으로 진행되면 다음과 같이 표시됩니다.GENERATED_CODE전터부 되면 Unicon 또는 응용 없이 할 수 .마지막으로 모든 구성이 완료되면 Unicon 또는 다른 도구를 사용하여 Rails 애플리케이션을 문제 없이 배포할 수 있습니다.

셸을 닫고 프로덕션 서버에 다시 로그인하면 이 환경 변수가 설정되어 사용할 준비가 됩니다.

그게 다야!미니 가이드가 이 오류를 해결하는 데 도움이 되길 바랍니다.

고지 사항:저는 Linux나 Rails의 구루가 아니기 때문에, 만약 당신이 잘못된 것이나 오류를 발견한다면 기꺼이 수정하겠습니다.

저는 당신이 당신의 것을 가지고 있지 않다고 가정할 것입니다.secrets.yml소스 제어에 체크인됨(즉,그것은 에 있습니다..gitignorefile이 많은 키가 것을 않기 . 비록 이것이 당신의 상황이 아니더라도, 이 질문을 보는 많은 사람들은 Github에 그들의 코드가 노출되어 있고 그들의 비밀 키가 돌아다니는 것을 원하지 않기 때문에 그렇게 했습니다.

소스 컨트롤에 없으면 헤로쿠는 모를 겁니다레일즈가 찾는 건Rails.application.secrets.secret_key_base그리고 레일즈가 확인하여 설정하기 때문에 설정되지 않았습니다.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파일을 커밋할 수 있습니다.

똑같은 문제가 있었는데 보일러 플레이트가.gitignore Rails 프로그램을 에는 Rails 애위해들만어진함내포플을션이케리가 포함되었습니다.config/secrets.yml.

이것은 저에게 효과가 있었습니다.

를 연결하고 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"]'

에▁where디rake secret입니다. 을 대신 . 복사한 문자열을 대신 붙여넣습니다.rake secret.

서버를 다시 시작하고 다음을 실행하여 테스트합니다.echo $SECRET_KEY_BASE.

를 사용할 수 4은 Rails 4.1+를 입니다.config/secrets.yml이 답변을 도입한 이은 다음과 같습니다.DR »secret_token.rb에서는 토큰이 소스 제어 기록으로 체크인되고 프로덕션 비밀 토큰을 알아야 하는 시스템은 프로덕션 인프라뿐이므로 보안 위험뿐만 아니라 구성 및 코드를 통합합니다.

은 이 을 이파을다합니다에 ..gitignore당신이 덧붙일 수 없는 것과 마찬가지로config/database.yml소스 제어에 사용할 수 있습니다.

자체 하여 헤로쿠를 합니다.config/database.ymlDATABASE_URL그들의 빌드팩 for Ruby에서, 나는 결국 그들의 레포를 포킹하고 그것을 수정하여 만들었습니다.config/secrets.ymlSECRETS_KEY_BASE환경 변수입니다.

4에, 저는 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.ymlDyno 빌드 프로세스의 일부로 사용자 환경 변수에서 사용할 수 있습니다.git push헤로쿠에게.

편집: Heroku의 문서는 다음을 제안합니다.config/secrets.yml이 파일을 소스 제어로 확인해야 합니다.제 경우에는 체크인하지 않는 개발 및 테스트 환경에 대한 암호를 하드 코딩했기 때문에 이 방법은 제대로 작동하지 않습니다.

레일 6의 경우 다음 파일이 누락된 것과 동일한 문제에 직면했습니다.추가하면 문제가 해결됩니다.

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

이 파일들을 가지고 있는지 확인하세요!

는 에 수 .~/.bashrc또는~/.bash_profile서버의 경우:

export SECRET_KEY_BASE = "YOUR_SECRET_KEY"

그런 다음 소스를 제공할 수 있습니다..bashrc또는.bash_profile:

source ~/.bashrc 
source ~/.bash_profile

절대 비밀을 범하지 마세요.yml

작업: 프로덕션 서버에서 씬(사용 중)에 대한 구성 파일(confthin.yml)을 생성하고 다음 정보를 추가합니다.

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

그런 다음 앱을 실행합니다.

thin start -C /whereeveristhefieonprod/configthin.yml

매력적으로 작동하며 버전 제어에 비밀 키가 필요하지 않습니다.

도움이 되길 바라지만, 유니콘과 다른 사람들에게도 같은 일이 일어날 수 있다고 확신합니다.

secret_key_base를 비워두는 방식으로 기존 키 생성기를 계속 사용할 수 있도록 Rails 4.1 앱에서 사용한 패치가 있습니다(따라서 Rails 4.1 앱에서 사용한 패치가 있습니다.

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

그 이후로 다시 포맷한 패치는 끌어오기 요청으로 레일에 제출됩니다.

내가만을 .config/initializers/secret_key.rb파일과 저는 다음 줄의 코드만 작성했습니다.

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

하지만 는 @Erik Trautman이 올린 해결책이 더 우아하다고 생각합니다;)

편집: 아, 그리고 마침내 헤로쿠에서 이 조언을 찾았습니다: https://devcenter.heroku.com/changelog-items/426 :)

맛있게 드세요!

이것은 루트 사용자가 편집해야 할 좋은 https://gist.github.com/pablosalgadom/4d75f30517edc6230a67 입니다.

$ /etc/profile

그러나 루트가 아닌 경우 다음에 생성 코드를 입력해야 합니다.

$ ~/.bash_profile

$ ~/.bash_login

$ ~/.profile

Nginx/Passenger/Ruby(2.4)/Rails(5.1.1)에서는 다음을 제외하고는 작동하지 않았습니다.

passenger_env_var/etc/nginx/sites-available/default서버 블록에 있습니다.

출처: https://www.phusionpassenger.com/library/config/nginx/reference/ #passenger_env_var

데미 매거스의 대답은 레일즈 5까지 저에게 효과가 있었습니다.

Apache2/Passenger/Ruby(2.4)/Rails(5.1.6)에서, 저는 다음과 같이 입력해야 했습니다.

export SECRET_KEY_BASE=GENERATED_CODE

/etc/apache2/envars의 Demi Magus 응답에서 /etc/profile이 무시되는 것 같습니다.

출처: https://www.phusionpassenger.com/library/indepth/environment_variables.html#apache

의 경우,는 제경, 는제입니다.config/master.key버전 관리 상태가 아니었으며 다른 컴퓨터에서 프로젝트를 생성했습니다.

Rails가 생성하는 기본 .gitignore는 이 파일을 제외합니다.이 파일 없이 배포하는 것은 불가능하므로 팀 구성원의 컴퓨터에서 배포할 수 있도록 버전 관리 상태에 있어야 합니다.

: 삭제config/master.key에서 줄을 잇다..gitignore프로젝트가 생성된 컴퓨터에서 파일을 커밋하면 이제git pull배포할 수 있습니다.

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

https://github.com/github/gitignore/blob/master/Rails.gitignore 의 .gitignore 파일을 사용한 후에도 동일한 문제가 발생했습니다.

.gitignore 파일에 다음 행을 코멘트한 후 모든 것이 잘 해결되었습니다.

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

언급URL : https://stackoverflow.com/questions/23180650/how-to-solve-error-missing-secret-key-base-for-production-environment-rai

반응형