오류 해결 방법 "'운영' 환경에 대한 '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)를.
프로덕션 서버의 터미널에서 다음을 실행합니다.
$ RAILS_ENV=production rake secret
문자와 숫자가 포함된 큰 문자열을 반환합니다.알았다, 우리는 그 코드를 다음과 같이 부를 것입니다.
GENERATED_CODE
.서버에 로그인
루트 사용자로 로그인하는 경우 다음 파일을 찾아 편집합니다.
$ vi /etc/profile
vi에서 +(대문자 "G")를 G사용하여 파일의 맨 아래로 이동합니다.
를 다을사환변작성수를과 .
GENERATED_CODE
를 눌러 vi에 삽입합니다.파일 끝에 새 줄이 있는지 확인합니다.$ export SECRET_KEY_BASE=GENERATED_CODE
변경 내용을 저장한 후 "를 사용하여 파일을 닫습니다.
:x
vi에서 저장하고 종료할 수 있습니다.하지만 당신이 일반 사용자로 로그인한다면, 그것을 "라고 부르자.
example_user
요지를 , 과 같은 파일들 중 할 것입니다: 요 점 위 을 다 찾 합 야 아 니 다 하 를 나 이 중 파 일 다 른 해 같 은 음 과 다 합 ▁for 니 : , 이 ▁files ▁one$ vi ~/.bash_profile $ vi ~/.bash_login $ vi ~/.profile
이러한 파일은 중요도 순으로 나열되므로 첫 번째 파일이 있으면 다른 파일을 편집할 필요가 없습니다. 에서 이 두 개의 파일을 ,
~/.bash_profile
그리고.~/.profile
것만 쓰면 됩니다.~/.bash_profile
Linux는 이 하나만 읽고 다른 하나는 무시하기 때문입니다.그런 다음 +를 G사용하여 파일의 맨 아래로 다시 이동하여 환경 변수를 작성합니다.
GENERATED_CODE
를 다시 사용하고 파일 끝에 새 행을 추가해야 합니다.$ export SECRET_KEY_BASE=GENERATED_CODE
코드를 작성한 후 변경 내용을 저장하고 "를 사용하여 파일을 닫습니다.
:x
저장하고 종료합니다.
다음 명령을 사용하여 환경 변수가 Linux에서 올바르게 설정되어 있는지 확인할 수 있습니다.
$ printenv | grep SECRET_KEY_BASE
또는 다음과 함께:
$ echo $SECRET_KEY_BASE
이 명령을 실행할 때 모든 것이 정상적으로 진행되면 다음과 같이 표시됩니다.
GENERATED_CODE
전터부 되면 Unicon 또는 응용 없이 할 수 .마지막으로 모든 구성이 완료되면 Unicon 또는 다른 도구를 사용하여 Rails 애플리케이션을 문제 없이 배포할 수 있습니다.
셸을 닫고 프로덕션 서버에 다시 로그인하면 이 환경 변수가 설정되어 사용할 준비가 됩니다.
그게 다야!이 미니 가이드가 이 오류를 해결하는 데 도움이 되길 바랍니다.
고지 사항:저는 Linux나 Rails의 구루가 아니기 때문에, 만약 당신이 잘못된 것이나 오류를 발견한다면 기꺼이 수정하겠습니다.
저는 당신이 당신의 것을 가지고 있지 않다고 가정할 것입니다.secrets.yml
소스 제어에 체크인됨(즉,그것은 에 있습니다..gitignore
file이 많은 키가 것을 않기 . 비록 이것이 당신의 상황이 아니더라도, 이 질문을 보는 많은 사람들은 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.yml
DATABASE_URL
그들의 빌드팩 for Ruby에서, 나는 결국 그들의 레포를 포킹하고 그것을 수정하여 만들었습니다.config/secrets.yml
SECRETS_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 앱에 추가하고(Heroku 설명서 참조) 앱을 다시 배포합니다.
으로 사용자의 빌드팩자생성다니를 합니다.config/secrets.yml
Dyno 빌드 프로세스의 일부로 사용자 환경 변수에서 사용할 수 있습니다.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
'programing' 카테고리의 다른 글
다음 작업을 수행할 수 있습니까?각각의 루프를 거꾸로? (0) | 2023.06.04 |
---|---|
응용 프로그램이 메인 스레드에서 너무 많은 작업을 수행하고 있을 수 있습니다. (0) | 2023.06.04 |
새 줄을 제거하지 않고 Ruby에서 여러 줄의 긴 문자열 분할 (0) | 2023.06.04 |
찾기를 사용하여 정규식으로 파일 이름을 검색하는 방법 (0) | 2023.06.04 |
postgresql 날짜 시간에 일 수를 추가하는 방법 (0) | 2023.06.04 |