2016-09-21 5 views
8

Я развертываю приложение для рельсов с Capistrano. Я хочу сохранить некоторые ключи API на сервере в качестве переменной среды. Эти ключи API должны быть доступны для моего приложения rails, которое развертывается с Capistrano. Эти ключи API также должны быть доступны для отдельного рубинового файла, который запускается как демон.Ключи Capistrano и API в переменных ENV?

Установка ключей API в переменных окружения представляется идеальным решением, однако я не могу получить к ним доступ в моем приложении с рельсами с ENV["SOME_KEY"].

В соответствии с this post, поскольку capistrano работает как не интерактивный, а не логин, ~/.bashrc и ~/.bash_profile не загружены. Блок-схема предполагает, что я должен использовать $BASH_ENV.

Могу ли я просто добавить ключи api в $BASH_ENV и получить к ним доступ в моем приложении rails и в рубиновом файле, который является демоном с ENV["SOME_KEY"]?

Я также думаю о простое добавление ключей api к файлу где-то на сервере и символическое привязывание его к файлу dir и rails файла ruby ​​и просто открытию и чтению. Возможно ли это?

+0

Я лично предпочел хранить секреты и такие в файлах в директории, которая не включена в систему управления версиями после экспериментов с получением переменные окружения, которые будут должным образом распространяться. Просто будь осторожен! – ollpu

+0

Оформить заказ драгоценного камня dotenv, он в основном делает то, что сказал @ollpu. https://github.com/bkeepers/dotenv – Teddy

+0

@ollpu: Таким образом, в основном добавление файлов вручную в рельсы после развертывания? Как вы читаете эти файлы после добавления их в каталог? – MeesterPatat

ответ

12

Есть несколько способов, которые хорошо работают с Capistrano, по моему опыту.

rbenv-вары

Если вы используете Ruby, с помощью Rbenv на сервере, то вам повезло. Существует плагин Rbenv под названием rbenv-vars, который автоматически вставляет переменные среды в любой процесс Ruby, который будет включать ваше приложение Rails. Просто добавьте переменные в ~/.rbenv/vars на сервере, используя синтаксис KEY=value. Вот и все.

dotenv

dotenv самоцвет аналогичное решение, но оно работает как драгоценный камень вы добавляете в приложение Rails и не требует Rbenv или каких-либо других вспомогательных средств. Добавьте dotenv-rails в свой Gemfile и разверните. Dotenv автоматически ищет файл .env.production в корне вашего приложения Rails. Для Capistrano создайте файл .env.production на сервере в каталоге shared Capistrano, а затем добавьте на номер :linked_files. Теперь каждое развертывание будет ссылаться на него. Объявите свои переменные, используя синтаксис KEY=value.

.bashrc

Объявите переменные с export KEY=value синтаксиса в самом верху ~/.bashrc файла на сервере. В Ubuntu этот файл оценивается даже во время неинтерактивного сеанса SSH. Просто убедитесь, что вы размещаете объявления на верхней части, до этого случая утверждение:

# If not running interactively, don't do anything 
case $- in 
    *i*) ;; 
     *) return;; 
esac 

CentOS может быть другая история, так YMMV.

+0

dotenv звучит неплохо, но как его проверить локально перед развертыванием? – MeesterPatat

+0

dotenv работает так же локально. Просто введите KEY = значения переменных в '.env.development' в корневой каталог вашего проекта Rails, а затем запустите приложение обычно с помощью сервера rails. Эти переменные будут загружены и доступны через 'ENV'. Возможно, вам понадобится сначала запустить «spring stop», чтобы гарантировать холодную загрузку. –

1

Я сделал плагин Capistrano capistrano-env_config некоторое время назад для управления и синхронизации переменных среды в кластере Capistrano, который работает путем изменения файла /etc/environment, чтобы сделать переменные среды доступными по всей системе. Он прост в использовании и похож на то, как вы можете установить переменные среды с инструментальной панелью Heroku.Вот некоторые примеры:

cap env:list 
cap env:get[VARIABLE_NAME, VARIABLE_NAME, ...] 
cap env:unset[VARIABLE_NAME, VARIABLE_NAME, ...] 
cap env:set[VARIABLE_NAME=VALUE, VARIABLE_NAME=VALUE, ...] 
cap env:sync