私も最近これを調べています。オープン ソース コードを Github にプッシュし、テストのためにTravis CIに自動的にプッシュし、Travis からHerokuに自動的にデプロイするプロセス全体で、機密情報を隠しておきたいと考えていました。これまでにさまざまな StackOverflow の Q&A やブログなどを調べて見つけたすべての詳細を以下に示します。Rails アプリ内の構成のみであっても、参照として役立つことを願っています (表示されているものはすべて省略し{{ ... }}
てください)。
免責事項: 私は決してここの専門家ではないので、私が試している方法よりも良い方法がある可能性が高いことを覚えておいてください。この Q&A スレッドでいくつかの新しいトリックを学ぶことができれば幸いです。
Rails アプリの内部
現在、環境変数に機密情報を隠すためにFigaro gemを使用しています。ENV
私の ( .gitignore
d) 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 にプッシュされ、これらの変数を参照するファイルは次のようになります。
config/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
config/initializers/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
(さらに、 -type キーを参照するすべてのファイル。)
Travis CI でのテスト
Travis gemを使用して、暗号化された travis 変数を作成します。Travis ワーカーから Heroku に直接デプロイする場合は、Heroku API キーと Heroku Git URL が必要です (詳細については、この StackOverflow Q&Aを参照してください)。
$ 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}}
次に、展開を試みます。
それが今のところ私が持っているすべてです。もっと情報を隠す必要があるのか、それとも十分に隠していないのかは現時点ではわかりませんが、それは進行中の作業です.