40

私の個人的な Rails プロジェクトでは、config/environments/production.yml と development.yml にグローバル変数として API キー/シークレットを保存するいくつかの API を使用しています。私は今、このプロジェクトを他の人が使用できるように github にプッシュしたいと思っていますが、それらの機密データを彼らに持たせたくありません。また、アプリの実行に必要なため、このファイルを .gitignore に入れたくありません。それらをDBのどこかに置くことを検討しましたが、より良い解決策を見つけたいと思っています。

4

5 に答える 5

50

TLDR : 環境変数を使用してください!

@Bryce のコメントが答えを提供していると思います。Heroku が推奨する1 つのアプローチは、環境変数を使用して機密情報 (API キー文字列、データベース パスワード) を保存することです。そのため、コードを調べて、機密データが含まれている場所を確認してください。次に、機密データ値を格納する環境変数を (たとえば、.bashrc ファイルに) 作成します。たとえば、データベースの場合:

export MYAPP_DEV_DB_DATABASE=myapp_dev
export MYAPP_DEV_DB_USER=username
export MYAPP_DEV_DB_PW=secret

これで、ローカル ボックスでは、機密データが必要なときはいつでも環境変数を参照するだけです。たとえば、 database.yml では次のようになります。

development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: <%= ENV["MYAPP_DEV_DB_DATABASE"] %>
  pool: 5
  username: <%= ENV["MYAPP_DEV_DB_USER"] %>
  password: <%= ENV["MYAPP_DEV_DB_PW"] %>
  socket: /var/run/mysqld/mysqld.sock

アプリの初期化または再起動時に database.yml が解析されると思うので、これはパフォーマンスに影響を与えるべきではありません。したがって、これにより、ローカル開発とリポジトリの公開が解決されます。機密データが削除されたので、非公開で使用するのと同じリポジトリを公開で使用できるようになりました。また、VPS を使用している場合の問題も解決します。開発ボックスで行ったように、それに ssh して、本番ホストで環境変数を設定するだけです。

一方、Heroku の場合のように、本番サーバーに ssh できないハンドオフ デプロイメントが本番環境のセットアップに含まれている場合は、環境変数をリモートで設定する方法を検討する必要があります。Heroku の場合、これは で行われheroku config:addます。したがって、同じ記事によると、S3 をアプリに統合し、機密データを環境変数から取得した場合は、次のようになります。

AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],
  :secret_access_key => ENV['S3_SECRET']
)

Heroku に環境変数を作成させるだけです。

heroku config:add S3_KEY=8N022N81 S3_SECRET=9s83159d3+583493190

このソリューションのもう 1 つの長所は、Rails だけでなく、言語に中立であることです。すべてのアプリが環境変数を取得できるため、どのアプリでも機能します。

于 2012-07-02T20:27:17.807 に答える
3

これはどう...

新しいプロジェクトを作成し、product.yml ファイルと development.yml ファイルのプレースホルダー値を使用して GitHub にチェックインします。

production.yml と development.yml を含めるように .gitignore を更新します。

プレースホルダーの値をシークレットに置き換えます。

これで、シークレットを危険にさらすことなく、コードを GitHub にチェックインできます。

また、不足しているファイルを作成するための追加の手順を実行しなくても、誰でもレポを複製できます (プレースホルダーの値を置き換えるだけです)。

それはあなたの目標を満たしていますか?

于 2011-05-24T18:48:23.277 に答える
1

それらはおそらく初期化子 (config/initializers/api.yaml) に入れるのが最適ですが、あなたが調理したものは問題ないと思います。実際のキーを .gitignore ファイルに追加し、実行git rm config/environments/production.ymlして機密データをリポジトリから削除します。当然の警告ですが、そのファイルも削除されるため、最初にバックアップしてください。

次に、実際のファイルの隣に config/environments/production.yml.example ファイルを作成し、関連する詳細を記載しますが、機密データは省略します。実稼働環境に引き出すときは、.example なしでファイルをコピーし、適切なデータに置き換えてください。

于 2011-05-24T15:46:34.203 に答える