Рельсы секретц.имл В.С., Дотен, В.С. Фигаро с Капистрано на АМС
Есть несколько вопросов о том, как управлять токенами API в SO и там, в Интернете, но я вижу много людей, которые просто повторяют то, что читают где-то в другом месте, и они часто не имеют большого смысла...
Мне интересно, как вы, ребята, имеете дело со всеми этими жетонами API и тому подобным.
Вот что я прочитал до сих пор, используя 3 разных драгоценных камня
secrets.yml
Представленный в Rails 4.1, должен стать конвенцией для хранения секретов.
Было (очевидно, нет?) Предназначено для того, чтобы быть помещенным в репозитории. Однако я часто вижу примеры использования переменных среды для производства
development:
secret_key_base: super_long_secret_key_for_development
...
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
...
И в этот момент кто-то спрашивает: "Почему мы используем ENV для производства?", Законный вопрос IMO. Но затем кто-то отвечает: "Мы не хотим, чтобы производственный токен был жестко запрограммирован в приложении" (может быть, это только я, но ХОЧУ СЕКРЕТ..Yml, это имя звучит как файл, который вы не хотите фиксировать, верно?), И конец никто на самом деле не отвечает на вопрос
Но мне все же удалось найти то и это:
PROs:
- Рельсовая конвенция.
- Простота развертывания с
capistrano-secrets
драгоценный камень иcap [stage] setup
(и это только разворачивает секреты сцены приятно) - Структура данных YML (массив / хэш в порядке) + можно использовать код Ruby
Недостатки:
- Нужно использовать
Rails.application.secrets.xxx
- Многие сервисы, такие как AWS, все еще читают из ENV для автоматической настройки своих драгоценных камней / сервисов.
- Разве это не 12 факторов (или это?)
- Совершенно новый, так что еще не очень?
Пчеловоды дотенв
Простое определение файла.env в корне, который читается Rails при запуске
С помощью capistrano-env
а также capistrano
PROs
- ENV в 12факторных правилах
- 3,5 тыс. Звезд... может быть, не зря?
ПРОТИВ
- Нет пользовательского кода, ограничено ключом строка-строка / val
Figaro
Какие-то гибридные секреты /ENV. Имея в виду 12factors/Rails/Heroku, но, в конце концов, не кажется лучше, чем остальные...
Исходя из вышесказанного и всего остального, что я не написал, казалось бы, что secretts.yml был бы отличным победителем, если бы эти секреты были помещены в ENV (и мне лень писать Rails.Application.secrets
каждый раз).
Итак, предположим, что я запускаю совершенно новое приложение на Rails, а также основываясь на вашем опыте. Какой из них вы бы выбрали?
(Мой конкретный стек использует AWS + Capistrano, но не Heroku)
2 ответа
Я лично считаю, что "правильный" подход зависит от вашей среды.
В моем случае у меня есть серверы, которые управляются ИТ, и у меня нет доступа к vhost или чему-либо еще для простой установки переменных среды. Из-за этого я совершаю secrets.yml
файл, который не содержит производственный раздел, а затем настройте Capistrano, чтобы добавить этот файл в shared_files
, На каждом сервере я добавляю файл.
Если бы у меня был легкий доступ к vhost, и я управлял серверными vhosts с помощью Puppet, Chef, Ansible или аналогичных, я бы использовал подход с переменным окружением, как по умолчанию secrets.yml
файл.
Ваш случай с AWS кажется последним. В конечном счете, любой из вариантов хорош. Есть небольшой недостаток в фиксации файла secrets.yml без производственной строфы.
Во-первых, все три метода могут быть совместимы с 12 факторами. Это совместимо, если вы передаете значение config переменной ENV вместо того, чтобы сначала копировать один файл на сервер.
Мои мысли - каждое из этих решений:
Рельсы секреты
Разработчики вынуждены использовать 12-факторный метод: либо вручную установить его на рабочем сервере, либо иметь другой файл на локальном компьютере, а затем каждый раз при развертывании передавать его как ENV. (Не знал о capistrano-secrets
наверно с этим справится)
(Я думаю, что то, что вы сказали в CON #2 и #3, является противоположностью решения secret.yml)
Accessor также довольно длинный, как вы упомянули.
dotenv
Это не поощряет 12-фактор, и не было первоначально разработано для env производства так или иначе. Либо вы пишете код для передачи его значения в качестве ENV в производство во время развертывания (что делает его совместимым с 12 факторами), либо копируете свой .env.production
файл на рабочий сервер.
Также это заставляет вас использовать плоский ключ: значение конфигурации. Нет вложенности.
Figaro
Хотя он использует YAML, он не допускает вложенный хэш.
Он совместим с 12 факторами, например, содержит код для переноса конфига в heroku.
Мое решение
Я написал гем, в котором настройки хранятся в gitignored YAML-файле. Вложение допускается. При доступе к некоторому значению Setting.dig(:fb,:api)
,
Он предоставляет механизм для развертывания 12-факторного приложения путем сериализации всего файла YAML в строку и передачи его в производство в формате ENV.
Мне больше не нужно различать секретный конфиг и несекретный конфиг. Они находятся в одном месте и по умолчанию являются секретными. Я получаю выгоду от 12-факторного приложения, используя простые в пространстве имен файлы YAML.