Переменные окружения в Rails: dotenv, figaro и прочие

Illustration of a person sitting on the ground, leaning against a wall with a light and dark background, absorbed in reading a book, and wearing casual clothing including orange shoes. Illustration of a person sitting on the ground, leaning against a wall with a light and dark background, absorbed in reading a book, and wearing casual clothing including orange shoes.

Использование переменных окружения – это рекомендуемый способ хранения конфигурации приложения. Таким подходом пользуются такие компании как, например, 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 по всему приложению.