Как решить ошибку "отсутствует" база секретных ключей " для "производственной" среды "(Rails 4.1)
Я создал приложение rails (rails 4.1) с нуля, и я столкнулся со странной проблемой, которую я не в состоянии решить.
каждый раз, когда я пытаюсь развернуть мое приложение на Heroku, я получаю сообщение об ошибке 500:
отсутствует
secret_key_baseдля рабочей среды установите это значение вconfig/secrets.yml
секрет.файл yml содержит следующую конфигурацию:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
на Heroku я настроил переменную окружения" SECRET_KEY_BASE " с помощью результат выполнения команды "rake secret". Если я запускаю "heroku config", я вижу переменную с правильным именем и значением.
почему я все еще получаю эту ошибку?
Спасибо большое
13 ответов:
у меня была та же проблема, и я решил ее, создав переменную среды, которая будет загружаться каждый раз, когда я вошел на рабочий сервер и сделал мини-руководство по его настройке:
https://gist.github.com/pablosalgadom/4d75f30517edc6230a67
я использовал Rails 4.1 с Unicorn v4.8.2, Когда я попытался развернуть свое приложение, оно не запустилось должным образом и в unicorn.файл журнала я нашел эту ошибку сообщение:
app error: Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml` (RuntimeError)после некоторых исследований я узнал, что Rails 4.1 изменил способ управления secret_key, так что если Вы читаете секреты.файл 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) на вашем производственном сервере:
в терминале вашего рабочего сервера выполните следующую команду:
$ RAILS_ENV=production rake secretэто возвращает большую строку с буквами и цифрами, скопируйте это (мы будем ссылаться на этот код как GENERATED_CODE).
вход на сервер
если вы входите в систему как пользователь root, найдите этот файл и отредактируйте его:
$ vi /etc/profileперейти к нижней части файла ("SHIFT + G " для капитала G в VI)
напишите переменную окружения с помощью GENERATED_CODE (нажмите клавишу " i " для записи в VI), обязательно в новой строке в конце файла:
$ export SECRET_KEY_BASE=GENERATED_CODEсохраните изменения и закройте файл (мы нажимаем клавишу "ESC", а затем пишем ":x" и "ENTER" для сохранения и выхода в VI).
но если вы входите в систему как обычный пользователь, давайте назовем его "example_user" для этой сути, вам нужно будет найти один из этих других файлы:
$ vi ~/.bash_profile $ vi ~/.bash_login $ vi ~/.profileэти файлы находятся в порядке важности, это означает, что если у вас есть первый файл, то вам не нужно будет писать в других. Итак, если вы нашли эти 2 файла в директории
~/.bash_profileи~/.profileвам только нужно будет написать в первом~/.bash_profile, потому что Linux будет читать только этот, а другой будет игнорироваться.затем мы переходим к нижней части файла ("SHIFT + G" для capital G в VI).
и мы напишем наш переменная окружения с нашим GENERATED_CODE (нажмите клавишу "i", чтобы написать в VI), обязательно будет в новой строке в конце файла:
$ export SECRET_KEY_BASE=GENERATED_CODEнаписав код, сохраните изменения и закройте файл (мы нажимаем клавишу "ESC", а затем пишем ":x" и "ENTER" для сохранения и выхода в VI).
вы можете проверить, что наша переменная окружения правильно установлена в Linux с помощью этой команды:
$ printenv | grep SECRET_KEY_BASEили с:
$ echo $SECRET_KEY_BASEпри выполнении этой команды, если все прошло нормально, он покажет вам GENERATED_CODE раньше. Наконец, со всей выполненной конфигурацией вы сможете без проблем развернуть свое приложение Rails с Unicorn или другим.
когда вы закроете терминал оболочки и снова войдете на рабочий сервер, у вас будет установлена эта переменная среды и готова к ее использованию.
и вот оно!! Я надеюсь, что это мини-руководство помочь вам решить эту ошибку.
отказ от ответственности: я не гуру Linux или Rails, поэтому, если вы найдете что-то не так или любую ошибку, я буду рад исправить это!
Я собираюсь предположить, что у вас нет своего
secrets.ymlпроверено в системе управления версиями (т. е. это в ). Даже если это не ваша ситуация, это то, что многие другие люди, просматривающие этот вопрос, сделали, потому что у них есть свой код, открытый на Github, и они не хотят, чтобы их секретный ключ плавал вокруг.если это не в системе управления версиями, Heroku не знает об этом. Так что рельсы ищет
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.
это работает для меня.
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"]'здесь
rake secret- это строка, которую вы просто скопировали, вставьте скопированные строкиrake secret.перезагрузите сервер и протестируйте его, запустив
echo $SECRET_KEY_BASE.
в то время как вы можете использовать инициализаторы, как и другие ответы, обычные рельсы 4.1+ способ заключается в использовании
config/secrets.yml. Причина, по которой команда Rails представила это, выходит за рамки этого ответа, но TL;DR-этоsecret_token.rbобъединяет конфигурацию и код, а также представляет угрозу безопасности, поскольку маркер проверяется в истории управления версиями, и единственная система, которая должна знать секретный маркер производства, - это производственная инфраструктура.вы должны добавить это файл в
.gitignoreтак же, как вы бы не добавилиconfig/database.ymlисточник контроля или.ссылка на собственный код Heroku для настройки
config/database.ymlСDATABASE_URLв своем Buildpack для Ruby, я закончил разветвляя их РЕПО и изменил его, чтобы создатьconfig/secrets.ymlСSECRETS_KEY_BASEпеременные среды.так как эта функция была введена в Rails 4.1, я чувствовал, что это было уместно редактировать
./lib/language_pack/rails41.rbи добавить эту функцию.в ниже приводится фрагмент из модифицированного пакета buildpack, который я создал в своей компании:
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перед повторным развертыванием приложения сначала установите переменную среды:
затем добавьте изменен buildpack-пакет (или вы более чем приветствуется, чтобы связаться с моей), чтобы ваше приложение в Heroku (см. в Heroku документация) и повторно развернуть приложение.
buildpack автоматически создаст ваш
config/secrets.ymlиз переменной среды как часть процесса сборки dyno каждый раз, когда выgit pushв Heroku.изменить: собственные в Heroku документация предполагает создание
config/secrets.ymlдля чтения из переменной среды, но это означает, что вы должны проверить этот файл в систему управления версиями. В моем случае это не работает хорошо, так как у меня есть жестко закодированные секреты для разработки и тестирования сред, которые я бы предпочел не проверять.
вы можете экспортировать секретные ключи в качестве переменных среды на
~/.bashrcили~/.bash_profileсервер:export SECRET_KEY_BASE = "YOUR_SECRET_KEY"и потом, вы можете источник
.bashrcили.bash_profile:source ~/.bashrc source ~/.bash_profileникогда не раскрывайте свои секреты.в формате YML
что я сделал : На моем рабочем сервере я создаю конфигурационный файл (confthin.yml) для Thin (я использую его) и добавьте следующую информацию:
environment: production user: www-data group: www-data SECRET_KEY_BASE: mysecretkeyproductionзатем я запускаю приложение с
thin start -C /whereeveristhefieonprod/configthin.ymlработать как шарм, а затем не нужно иметь секретный ключ на контроль версий
надеюсь, что это может помочь, но я уверен, что то же самое можно сделать с единорогом и другими.
У меня есть патч, который я использовал в приложении Rails 4.1, чтобы позволить мне продолжать использовать генератор устаревших ключей (и, следовательно, обратную совместимость сеанса с Rails 3), позволяя secret_key_base быть пустым.
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 в качестве запроса на вытягивание
Я создал
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 :)
наслаждайтесь!
это работает хорошо https://gist.github.com/pablosalgadom/4d75f30517edc6230a67 для пользователя root необходимо отредактировать
$ /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
ответ Деми мага работал для меня до Rails 5.
на Apache2 / Passenger / Ruby (2.4) / Rails (5.1.6), я должен был поставить
export SECRET_KEY_BASE=GENERATED_CODEиз ответа Demi Magus в /etc/apache2 /envvars, причина/etc / профиль, кажется, игнорируется.
Источник: https://www.phusionpassenger.com/library/indepth/environment_variables.html#apache
У меня была такая же проблема после того, как я использовал .gitignore файл из https://github.com/github/gitignore/blob/master/Rails.gitignore
все работало нормально, после того как я прокомментировал следующие строки .файла.gitignore
config/initializers/secret_token.rb config/secrets.yml

Comments