Никогда не кодируйте конфиденциальную информацию (учетные данные, пароли и т . Д.) . Вместо этого создайте файл для хранения этой информации в виде переменных среды (пары ключ / значение) и исключите этот файл из системы управления исходным кодом. Например, с точки зрения Git (система управления исходным кодом), исключите этот файл, добавив его в. gitignore :
-bash> echo '/config/app_environment_variables.rb' >> .gitignore
/config/app_environment_variables.rb
ENV['HTTP_USER'] = 'devuser'
ENV['HTTP_PASS'] = 'devpass'
Также добавьте следующие строки /config/environment.rb
между require
линией и Application.initialize
линией:
app_environment_variables = File.join(Rails.root, 'config', 'app_environment_variables.rb')
load(app_environment_variables) if File.exists?(app_environment_variables)
Это оно!
Как говорится в комментарии выше, сделав это, вы загрузите свои переменные среды раньше environments/*.rb
, что означает, что вы сможете ссылаться на свои переменные внутри этих файлов (например environments/production.rb
). Это большое преимущество перед помещением файла переменных среды внутрь /config/initializers/
.
Внутри app_environment_variables.rb
нет необходимости различать окружающую среду, насколько это развитие или производство , потому что вы никогда не совершите этот файл в системе управления исходным кодом, следовательно, для развития контекста по умолчанию. Но если вам нужно установить что-то особенное для тестовой среды (или для тех случаев, когда вы тестируете производственный режим локально ), просто добавьте условный блок под всеми другими переменными:
if Rails.env.test?
ENV['HTTP_USER'] = 'testuser'
ENV['HTTP_PASS'] = 'testpass'
end
if Rails.env.production?
ENV['HTTP_USER'] = 'produser'
ENV['HTTP_PASS'] = 'prodpass'
end
При каждом обновлении app_environment_variables.rb
перезапускайте сервер приложений. Предполагая, что вы используете Apache / Passenger или rails server
:
-bash> touch tmp/restart.txt
В своем коде обращайтесь к переменным среды следующим образом:
def authenticate
authenticate_or_request_with_http_basic do |username, password|
username == ENV['HTTP_USER'] && password == ENV['HTTP_PASS']
end
end
Обратите внимание, что внутри app_environment_variables.rb
вы должны указать логические значения и числа в виде строк (например, ENV['SEND_MAIL'] = 'false'
не только false
и ENV['TIMEOUT'] = '30'
не только 30
), иначе вы получите ошибки can't convert false into String
и can't convert Fixnum into String
, соответственно.
Хранение и обмен конфиденциальной информацией
Последний узел, который нужно связать: как поделиться этой конфиденциальной информацией с вашими клиентами и / или партнерами? В целях обеспечения непрерывности бизнеса (например, когда вас поразит падающая звезда, как ваши клиенты и / или партнеры возобновят полноценную работу сайта?) Вашим клиентам и / или партнерам необходимо знать все учетные данные, необходимые для вашего приложения. . Отправка таких сообщений по электронной почте или Skype небезопасна и приводит к беспорядку. Хранить его в общих Документах Google неплохо (если все используют https), но приложение, предназначенное для хранения и обмена небольшими кусочками, такими как пароли, было бы идеальным.
Как установить переменные среды на Heroku
Если у вас единая среда на Heroku:
-bash> heroku config:add HTTP_USER='herouser'
-bash> heroku config:add HTTP_USER='heropass'
Если у вас несколько сред на Heroku:
-bash> heroku config:add HTTP_USER='staguser' --remote staging
-bash> heroku config:add HTTP_PASS='stagpass' --remote staging
-bash> heroku config:add HTTP_USER='produser' --remote production
-bash> heroku config:add HTTP_PASS='prodpass' --remote production
Форман и .env
Многие разработчики используют Foreman (установленный вместе с Heroku Toolbelt ) для локального запуска своих приложений (в отличие от Apache / Passenger или rails server
). Foreman и Heroku используют его Procfile
для объявления команд, выполняемых вашим приложением , поэтому переход от локального разработчика к Heroku в этом отношении не вызывает затруднений. Я использую Foreman и Heroku в каждом проекте Rails, так что это удобство велико. Но вот в чем дело ... Форман загружает переменные среды, хранящиеся в, /.env
через dotenv, но, к сожалению, dotenv, по сути, только разбирает файл на key=value
пары; эти пары не становятся переменными сразу же, поэтому вы не можете ссылаться на уже установленные переменные (чтобы сохранить СУХИЕ вещи), а также не можете использовать там «Ruby» (как указано выше с условными операторами), что вы можете делать в /config/app_environment_variables.rb
. Например, что касается сохранения СУХИХ вещей, я иногда делаю такие вещи:
ENV['SUPPORT_EMAIL']='Company Support <support@company.com>'
ENV['MAILER_DEFAULT_FROM'] = ENV['SUPPORT_EMAIL']
ENV['MAILER_DEFAULT_TO'] = ENV['SUPPORT_EMAIL']
Следовательно, я использую Foreman для локального запуска своих приложений, но не использую его .env
файл для загрузки переменных среды; скорее я использую Foreman в сочетании с /config/app_environment_variables.rb
подходом, описанным выше.
export admin_password="secret"
, а неexport admin_password = "secret"
.