Что должно быть удалено из общедоступного контроля исходного кода в Ruby on Rails?
Я искал в Интернете, и я не могу найти хороших / недавних примеров того, что исключить из нового общедоступного приложения rails. Я ищу приложение с открытым исходным кодом на GitHub и мне интересно, какие типы данных должны быть удалены из системы контроля версий.
Из того, что я могу сказать, должно быть config/config.yml
файл, который имеет личную информацию. Я просматривал другие файлы, и это выглядит как config/database.yml
, config/intializers/secret_token.rb
а также config/initializers/session_store.rb
также должны быть исключены?
Рекомендуется ли исключать все эти файлы отдельно? Или есть способ получить всю информацию в config/config.yml
и называться в каждом из этих файлов? Кроме того, какие файлы и данные должны быть конфиденциальными и скрытыми? Это все из них?
Мне просто интересно, какой подход я должен использовать и какова лучшая практика. Спасибо за любую помощь!
2 ответа
Я тоже давно в этом разбираюсь; Я хотел, чтобы конфиденциальная информация оставалась скрытой на протяжении всего процесса передачи открытого исходного кода на Github, затем автоматически отправлялась в Travis CI для тестирования, а затем из Travis автоматически развертывалась в Heroku. Вот все подробности того, что я нашел до сих пор, рассматривая различные вопросы и ответы Stackru, блоги и т. Д., Которые, как мы надеемся, послужат вам справочной информацией, даже если только для конфигурации внутри приложения Rails (пропустите любой {{ ... }}
ты видишь)
Отказ от ответственности: я ни в коем случае не эксперт здесь, поэтому, пожалуйста, имейте в виду, что, вероятно, есть лучшие способы сделать это, чем то, что я пытаюсь. Я бы хотел научиться новым трюкам в этой теме вопросов и ответов.
Приложение Inside the Rails
В настоящее время я использую драгоценный камень Figaro, чтобы скрыть конфиденциальную информацию в ENV
переменные среды В моем (.gitignore
г) config / application.yml, я храню следующую информацию:
# App keys
SECRET_TOKEN: # your rake secret generated token
development:
DB_NAME: # your dev db name here
DB_USER: # your dev db username here
DB_PASSWORD: # your dev db password here
test:
DB_NAME: # your test db name here
DB_USER: # your test db username here
DB_PASSWORD: # your test db password here
production:
DB_NAME: # your prod db name here
DB_USER: # your prod db username here
DB_PASSWORD: # your prod db password here
# Third Party keys that you will reference in their relevant files
THIRD_PARTY_API_OR_LICENSE_KEY: # list of whatever api/license keys you use
(DB_NAME
, DB_USER
, а также DB_PASSWORD
будет использоваться динамически в зависимости от среды, в которой работает ваше приложение).
Пустая версия вышеупомянутого файла (config / application.example.yml) отправляется на Github с некоторыми инструкциями по его заполнению.
Файлы, которые помещаются в Github и ссылаются на эти переменные, выглядят так:
конфиг / database.yml
(Postgresql используется здесь, но вы должны иметь возможность изменить настройки для любой базы данных, которую вы используете)
postgresql: &postgresql
adapter: postgresql
database: <%= ENV['DB_NAME'] %>
username: <%= ENV['DB_USER'] %>
password: <%= ENV['DB_PASSWORD'] %>
min_messages: ERROR
defaults: &defaults
pool: 5
timeout: 5000
host: localhost
<<: *<%= ENV['DB'] || "postgresql" %>
development:
<<: *defaults
test:
<<: *defaults
production:
<<: *defaults
конфиг / Инициализаторы / secret_token.rb
if Rails.env.production? && ENV['SECRET_TOKEN'].blank?
raise 'SECRET_TOKEN environment variable must be set!'
end
YourApp::Application.config.secret_token =
ENV['SECRET_TOKEN'] || {{WHATEVER_SECRET_TOKEN_RAILS_GENERATED_BY_DEFAULT}}
(Кроме того, на любые файлы будут ссылаться THIRD_PARTY_API_OR_LICENSE_KEY
ключи типа.)
Тестирование на Travis CI
Создайте зашифрованные переменные travis, используя гем Travis. Ключ API Heroku и URL-адрес Heroku Git необходимы, если вы развертываете напрямую в Heroku от работника Travis (подробности см. В этом разделе " Вопросы и ответы по Stackru"), в противном случае вы можете пропустить их, если просто используете его для тестирования:
$ gem install travis
$ travis encrypt your_username/your_repo HEROKU_API_KEY={{YOUR_HEROKU_API_KEY}}
$ travis encrypt HEROKU_GIT_URL={{YOUR_HEROKU_GIT_URL}} # eg git@heroku.com:your_app.git
$ travis encrypt DB_NAME={{YOUR_DB_NAME_UNDER_TEST}} # eg your_app_test
$ travis encrypt DB_USER={{YOUR_DB_USER_UNDER_TEST}}
$ travis encrypt DB_PASSWORD={{YOUR_DB_PASSWORD_UNDER_TEST}}
(Кроме того, шифруйте любые другие ключи, которые могут вам понадобиться во время тестирования, если таковые имеются...)
Затем добавьте их в .travis.yml
(еще раз сфокусирован на Postgresql, но вы сможете изменить настройки для любой используемой вами базы данных)
env:
global:
- secure: {{YOUR_ENCRYPTED_HEROKU_API_KEY}}
- secure: {{YOUR_ENCRYPTED_HEROKU_GIT_URL}}
- secure: {{YOUR_ENCRYPTED_DB_NAME}}
- secure: {{YOUR_ENCRYPTED_DB_USER}}
- secure: {{YOUR_ENCRYPTED_DB_PASSWORD}}
matrix:
- DB: postgresql
before_script:
- psql -c "create database $DB_NAME;" -U $DB_USER
- RAILS_ENV=test bundle exec rake db:migrate
script:
- bundle exec rspec spec/
after_success:
- gem install heroku
- git remote add heroku $HEROKU_GIT_URL
# ... see link above for the rest of the config content
Несколько переменных, отмеченных одним и тем же именем secure
в порядке; они будут отображаться в конфиге как HEROKU_API_KEY=[secure] HEROKU_GIT_URL=[secure]
и т.п.
Развертывание в Heroku
Используйте задание Figaro Heroku rake, чтобы автоматически установить переменные среды, которые Heroku должен видеть в рабочей среде:
$ rake figaro:heroku
Или установите их вручную:
$ heroku config:set SECRET_TOKEN={{YOUR_SECRET_TOKEN}}
$ heroku config:set DB_NAME={{YOUR_DB_NAME_UNDER_PRODUCTION}} # eg your_app_production
$ heroku config:set DB_USER={{YOUR_DB_USER_UNDER_PRODUCTION}}
$ heroku config:set DB_PASSWORD={{YOUR_DB_PASSWORD_UNDER_PRODUCTION}}
$ heroku config:set THIRD_PARTY_API_OR_LICENSE_KEY={{YOUR_THIRD_PARTY_API_OR_LICENSE_KEY}}
Затем попытайтесь выполнить развертывание.
Это все, что у меня есть сейчас. В данный момент я не уверен, стоит ли мне скрывать больше информации или я недостаточно хорошо это скрываю, но эта работа еще не завершена.
Вы получите разные мнения. ИМХО, рекомендуется включать эти файлы, но не включать в них секретный контент. Документируйте, что вы делаете, чтобы разработчики, которые являются новичками в вашем проекте, знали, что им нужно заполнить.
У Phusion есть хороший пост в блоге о том, как обращаться с секретом сеанса Rails, и о компромиссах, которые вы можете сделать, чтобы включить или исключить информацию:
http://blog.phusion.nl/2013/01/04/securing-the-rails-session-secret/
Мой любимый способ документировать это - использовать задачу "rake setup". У вас может быть задание напечатать, что нужно сделать разработчику - другими словами, вам не нужно автоматизировать все это (хотя это хорошо, если вы можете это сделать).
Если вы хотите стать модным, попросите ваши файлы прочитать секретные настройки из общего каталога /, что также позволяет использовать символьные ссылки для развертывания. Это также описано в блоге Phusion. Вот как я создаю приложения, которые необходимо часто развертывать.