Capistrano で機密情報 (パスワードなど) を処理する方法は、一般的な処理方法と同じAPP_CONFIG
です。バージョン管理にチェックインされていない YAML ファイルから取得したハッシュを使用します。これは、RailsCast #226などでカバーされている古典的な手法です。または、この StackOverflow questionを参照してください。
Capistrano でこのアプローチを使用する場合、少し異なる方法で行う必要があることがいくつかあります。
通常APP_CONFIG
はあなたからロードされますconfig/application.rb
(そのため、他の場所で使用できるように十分早く発生します)。ただし、Capistranocap
タスクはそのファイルをロードしません。しかし、それをロードすることconfig/deploy.rb
もできます。config/deploy.rb
これは、ユーザー名/パスワードを必要とする HTTP リポジトリを使用した不自然なファイルの先頭です。
require 'bundler/capistrano'
APP_CONFIG = YAML.load_file("config/app_config.yml")
set :repo_user, APP_CONFIG['repo_user']
set :repo_password, APP_CONFIG['repo_password']
set :repository, "http://#{repo_user}:#{repo_password}@hostname/repositoryname.git/"
set :scm, :git
# ...
config/app_config.yml
ファイルはバージョン管理にチェックインされていません(そのパスをあなたのまたは類似のものに入れます).gitignore
。私は通常、config/app_config.yml.sample
構成する必要があるパラメーターを示す をチェックインします。
repo_user: 'usernamehere'
repo_password: 'passwordhere'
アプリケーションにを使用している場合APP_CONFIG
、デプロイ ホストごとに異なる値が必要になる可能性があります。そのため、Capistrano のセットアップで、shared/
チェックアウト後にディレクトリから各リリースへのシンボリック リンクを作成します。移行の適用にはデータベースのパスワードが必要になる場合があるため、デプロイ プロセスの早い段階でこれを行う必要があります。したがって、これをconfig/deploy.rb
入れてください:
after 'deploy:update_code', 'deploy:symlink_app_config'
namespace :deploy do
desc "Symlinks the app_config.yml"
task :symlink_app_config, :roles => [:web, :app, :db] do
run "ln -nfs #{deploy_to}/shared/config/app_config.yml #{release_path}/config/app_config.yml"
end
end
さて、質問の 2 番目の部分 (複数のホストへのデプロイについて) では、ホストごとに個別の Capistrano "ステージ" を構成する必要があります。すべてのステージに共通するすべてのものをconfig/deploy.rb
ファイルに入れ、次に各ステージに固有のものすべてをconfig/deploy/[stagename].rb
ファイルに入れます。config/deploy.rb
ステージを定義するセクションがあります。
# Capistrano settings
require 'bundler/capistrano'
require 'capistrano/ext/multistage'
set :stages, %w(preproduction production)
set :default_stage, 'preproduction'
(ステージの名前は自由に指定できます。Capistrano ステージ名は Rails 環境名とは別のものなので、ステージを「プロダクション」と呼ぶ必要はありません。) コマンドを使用するときは、ステージ名をとcap
の間に挿入します。cap
ターゲット名。例:
$ cap preproduction deploy #deploys to the 'preproduction' environment
$ cap production deploy #deploys to the 'production' environment
$ cap deploy #deploys to whatever you defined as the default