Переменные окружения в Rails: dotenv, figaro и прочие
Использование переменных окружения – это рекомендуемый способ хранения конфигурации приложения. Таким подходом пользуются такие компании как, например, Heroku и AWS. Этот способ так же популяризирован в пределах методологии The Twelve-Factor App. Выпускник mkdev Алексей Грищенко в данной статье рассматривает несколько способов настраивать Rails приложения при помощи переменных окружения.
Переменные окружения (environment variable) используются для хранения общих значений переменных в пределах разных сценариев и программ. Такие переменные можно устанавливать на время, например на период работы конкретной оболочки терминала, или на период сессии пользователя, либо же установить переменную окружения на глобальном уровне - для всей системы.
В Rails они используются для хранения различных конфигурационных данных: конфигурация БД, ключи доступа к сторонним сервисам типа AWS, Google App Engine и пр.
Можно, конечно, записывать все эти данные напрямую в конфигурационный файл, но тогда они будут видны всем, у кого есть доступ к вашему репозиторию. С другой стороны, при работе в команде ваши локальные конфигурационные данные могут не подходить остальной команде. Для того чтобы не задавать их явно и используются переменные окружения.
Есть несколько мест, где можно хранить переменные окружения.
Использование из системы
В Linux переменные среды задаются в конфигурационных shell скриптах, таких как ~/.bashrc
, ~/.bash_profile
, ~/.profile
, в зависимости от вашей конфигурации. Указав там переменные окружения следующим образом:
export AWS_ACCESS_KEY_ID="EXAMPLEAWSACCESSKEYID"
export AWS_SECRET_ACCESS_KEY="exampleawssecretaccesskey"
export REGION="example_region"
мы сможем использовать их в нашем приложении следующим образом:
ENV['AWS_ACCESS_KEY_ID']
ENV['AWS_SECRET_ACCESS_KEY']
ENV['REGION']
Минус этого метода в том, что со временем вы получите беспорядок в своем системном файле.
Использование гема dotenv
Гем dotenv решает проблему использования конкретных переменных окружения для конкретного проекта.
Устанавливается он просто. В Gemfile прописываем gem 'dotenv-rails', :groups => [:development, :test]
и выполняем bundle install
.
Использование его тоже не отличается сложностью: просто задайте переменные окружение в файле .env
в корне вашего проекта и укажите там нужные переменные окружения:
#/my/rails/app/.env
export AWS_ACCESS_KEY_ID="EXAMPLEAWSACCESSKEYID"
export AWS_SECRET_ACCESS_KEY="exampleawssecretaccesskey"
export REGION="example_region"
И теперь мы можем обращаться к нашим переменным окружения так же как и в предыдущем примере: ENV['AWS_ACCESS_KEY_ID']
, ENV['AWS_SECRET_ACCESS_KEY']
и ENV['REGION']
. Естественно, не забываем добавить наш файл .env
в .gitignore
, так как значения в нём разные для каждого разработчика.
Использование гема figaro
Гем figaro похож на dotenv, только для хранения переменных окружения он использует не .env
файл, а config/application.yml
, который автоматически добавляется в .gitignore
при установке гема.
В Rails 4.1 появился файл config/secret.yml
, который похож на config/application.yml
гема figaro. Переменные заданные тут доступны через Rails.application.secrets
по всему приложению.