Я создал приложение Rails с использованием Rails 4.1 с нуля и столкнулся со странной проблемой, которую не могу решить.
Каждый раз, когда я пытаюсь развернуть свое приложение на 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
, я могу видеть переменную с правильным именем и значением.
Почему я все еще получаю эту ошибку?
ruby-on-rails
ruby
heroku
ruby-on-rails-4
Паоло Лауренти
источник
источник
secret.yml
илиsecrets.yml
?Ответы:
У меня была та же проблема, и я решил ее, создав переменную среды, которая будет загружаться при каждом входе на рабочий сервер, и сделал мини-руководство по его настройке:
Я использовал Rails 4.1 с Unicorn v4.8.2, и когда я попытался развернуть свое приложение, оно не запустилось должным образом, и в
unicorn.log
файле я обнаружил это сообщение об ошибке:После некоторых исследований я обнаружил, что Rails 4.1 изменил способ управления
secret_key
, поэтому, если вы прочитаетеsecrets.yml
файл, расположенный в,exampleRailsProject/config/secrets.yml
вы найдете что-то вроде этого:Это означает, что Rails рекомендует вам использовать переменную среды для
secret_key_base
вашего рабочего сервера. Чтобы устранить эту ошибку, вы должны выполнить следующие шаги, чтобы создать переменную среды для Linux (в моем случае Ubuntu) на вашем производственном сервере:В терминале вашего производственного сервера выполните:
Это возвращает большую строку с буквами и цифрами. Скопируйте то, что мы будем ссылаться на этот код как
GENERATED_CODE
.Войдите на ваш сервер
Если вы вошли в систему как пользователь root, найдите этот файл и отредактируйте его:
Перейти в конец файла с помощью Shift+ G(заглавная "G") в vi.
Напишите переменную окружения
GENERATED_CODE
, нажав, iчтобы вставить в vi. Будьте уверены, чтобы быть в новой строке в конце файла:Сохраните изменения и закройте файл, используя, Escа затем "
:x
" и Enterдля сохранения и выхода в vi.Но если вы войдете как обычный пользователь, давайте назовем это "
example_user
" для этой сути, вам нужно будет найти один из следующих файлов:Эти файлы расположены в порядке важности, что означает, что если у вас есть первый файл, вам не нужно редактировать остальные. Если вы нашли эти два файла в своем каталоге
~/.bash_profile
и~/.profile
вам нужно будет записать только первый~/.bash_profile
, потому что Linux будет читать только этот, а другой будет игнорироваться.Затем мы снова переходим в конец файла с помощью Shift+ и Gснова записываем переменную окружения,
GENERATED_CODE
используя наше использование i, и обязательно добавляем новую строку в конце файла:Написав код, сохраните изменения и закройте файл, используя Escснова и "
:x
", Enterчтобы сохранить и выйти.Вы можете проверить, что наша переменная окружения правильно установлена в Linux с помощью этой команды:
или с:
Когда вы выполните эту команду, если все прошло хорошо, она покажет вам
GENERATED_CODE
ранее. Наконец, со всей выполненной конфигурацией вы сможете без проблем развернуть свое Rails-приложение с Unicorn или каким-либо другим инструментом.Когда вы закроете свою оболочку и снова войдете в систему на производственном сервере, у вас будет установлена эта переменная среды, и она будет готова к ее использованию.
И это все! Я надеюсь, что это мини-руководство поможет вам решить эту ошибку.
Отказ от ответственности: я не гуру Linux или Rails, поэтому, если вы обнаружите что-то не так или любую ошибку, я буду рад это исправить.
источник
Я собираюсь предположить, что у вас нет вашего
secrets.yml
зарегистрированного в системе контроля версий (т.е. она находится в.gitignore
файле). Даже если это не ваша ситуация, это то, что сделали многие другие люди, просматривающие этот вопрос, потому что они выставили свой код на Github и не хотят, чтобы их секретный ключ плавал вокруг.Если это не в системе контроля версий, Heroku не знает об этом. Поэтому Rails ищет,
Rails.application.secrets.secret_key_base
и он не был установлен, потому что Rails устанавливает его, проверяяsecrets.yml
файл, который не существует. Простой обходной путь - перейти в вашconfig/environments/production.rb
файл и добавить следующую строку:Это говорит вашему приложению установить секретный ключ, используя переменную окружения, а не искать его в
secrets.yml
. Это сэкономило бы мне много времени, чтобы узнать это заранее.источник
Figaro
иheroku_secrets
ничего не делать, если Rails не знает, чтоSECRET_KEY_BASE
живет вENV
. Я боролся с этим мнением, что если бы существовала переменная конфигурации на Heroku, Rails подхватил бы ее только благодаря ее существованию, но теперь кажется очевидным, что Rails нужно знать, где искать. Мне было интересно, как я могу иметь код на Github, не беспокоясь о секретной базе ключей; теперь я знаю.production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
. Разве это не означает, что фактический секретный ключ не раскрывается. Существует ли риск раскрытия ключей dev и test в зафиксированном secretts.yml, если это всего лишь начальные и тестовые данные?Добавьте
config/secrets.yml
к контролю версий и разверните снова. Возможно, вам придется удалить строку,.gitignore
чтобы вы могли зафиксировать файл.У меня была точно такая же проблема, и оказалось, что шаблон
.gitignore
Github, созданный для моего приложения Rails, включенconfig/secrets.yml
.источник
Rails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]
сработало бы и убрало ошибку, не добавляяsecrets.yml
в источник.rails new
(производящим, в данном случае, Gemfile, у которого вrails
геме есть версия4.2.4
),config/secrets.yml
создается файл . Она включает в себя pregenerated секретных ключей для сред разработки и тестирования, и читает SecretKey для производственной среды с переменным окружением:secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
. Мне кажется, что совершенно безопасно и действительно полезно хранить этотsecrets.yml
файл в системе контроля версий при условии, что никто никогда не определит секретный ключ там.Это сработало для меня.
SSH на ваш рабочий сервер и
cd
в ваш текущий каталог, запуститеbundle exec rake secret
илиrake secret
, вы получите длинную строку в качестве вывода, скопируйте эту строку.Теперь беги
sudo nano /etc/environment
.Вставить внизу файла
Где
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 для Ruby , я закончил разветвление их репозитория и изменил его для созданияconfig/secrets.yml
изSECRETS_KEY_BASE
переменной среды.Поскольку эта функция была представлена в Rails 4.1, я счел целесообразным отредактировать
./lib/language_pack/rails41.rb
и добавить эту функцию.Ниже приведен фрагмент измененного билда, который я создал в своей компании:
Конечно, вы можете расширить этот код, добавив другие секреты (например, ключи API сторонних производителей и т. Д.) Для считывания из переменной среды:
Таким образом, вы можете получить доступ к этому секрету очень стандартным способом:
Перед повторным развертыванием приложения обязательно сначала установите переменную среды:
Затем добавьте ваш измененный сборочный пакет (или вы можете добавить ссылку на мой) в свое приложение Heroku (см. Документацию Heroku ) и повторно разверните свое приложение.
Пакет компоновки автоматически создает
config/secrets.yml
вашу переменную среды как часть процесса сборки dyno каждый раз, когда выgit push
подключаетесь к Heroku.РЕДАКТИРОВАТЬ: собственная документация Heroku предлагает создать
config/secrets.yml
для чтения из переменной среды, но это означает, что вы должны проверить этот файл в системе контроля версий. В моем случае это не работает, так как у меня есть жестко закодированные секреты для сред разработки и тестирования, которые я бы предпочел не регистрировать.источник
Вы можете экспортировать секретные ключи в качестве переменных состояния окружающей среды на
~/.bashrc
или~/.bash_profile
ваш сервере:И тогда вы можете получить ваш
.bashrc
или.bash_profile
:Никогда не передавайте свои секреты.
источник
В моем случае проблема была в том, что
config/master.key
не было контроля версий, и я создал проект на другом компьютере..Gitignore по умолчанию, который создает Rails, исключает этот файл. Поскольку невозможно развернуть без этого файла, он должен быть в управлении версиями, чтобы иметь возможность развертывания с компьютера любого члена команды.
Решение: удалите
config/master.key
строку.gitignore
, зафиксируйте файл с компьютера, на котором был создан проект, и теперь вы можете выполнить егоgit pull
на другом компьютере и выполнить развертывание с него.Люди говорят не передавать некоторые из этих файлов для контроля версий, не предлагая альтернативного решения. Пока вы не работаете над проектом с открытым исходным кодом, я не вижу причин не фиксировать все, что требуется для запуска проекта, включая учетные данные.
источник
secrets.yml
файлу, которая устарела для нескольких последних версий Rails. На этот вопрос о переполнении стека есть масса ответов, и почти все они используют этот древний API.Для rails6 я столкнулся с той же проблемой, так как мне не хватало следующих файлов, после того как я их добавил, проблема решена:
Убедитесь, что у вас есть эти файлы. !!!
источник
Что я сделал: На своем производственном сервере я создаю файл конфигурации (confthin.yml) для Thin (я его использую) и добавляю следующую информацию:
Затем я запускаю приложение с
Работайте как шарм и тогда не нужно иметь секретный ключ для контроля версий
Надеюсь, это поможет, но я уверен, что то же самое можно сделать с Unicorn и другими.
источник
У меня есть патч, который я использовал в приложении на Rails 4.1, чтобы позволить мне продолжать использовать устаревший генератор ключей (и, следовательно, обратную совместимость сеанса с Rails 3), позволяя secret_key_base быть пустым.
С тех пор я переформатировал патч и отправил его в Rails как Pull Request
источник
Я создал
config/initializers/secret_key.rb
файл и написал только следующую строку кода:Но я думаю, что решение, опубликованное @Erik Trautman , более элегантно;)
Изменить: О, и, наконец, я нашел этот совет на Heroku: https://devcenter.heroku.com/changelog-items/426 :)
Наслаждайтесь!
источник
это хорошо работает https://gist.github.com/pablosalgadom/4d75f30517edc6230a67 для пользователя root следует отредактировать
но если вы не root, поместите сгенерированный код в следующее
источник
На 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) мне пришлось поставить
из ответа Деми Магуса в / etc / apache2 / envvars, причина / etc / profile, похоже, игнорируется.
Источник: https://www.phusionpassenger.com/library/indepth/environment_variables.html#apache
источник
У меня была такая же проблема после того, как я использовал файл .gitignore с https://github.com/github/gitignore/blob/master/Rails.gitignore
Все работало нормально после того, как я прокомментировал следующие строки в файле .gitignore.
источник