capistranoを使ってsymfonyデプロイ(capifonyのインストールと設定)
Railsのデプロイツールであるcapistranoを使って、symfonyのプロジェクトをデプロイできるcapifonyというgemを使ってみたのでそのインストールと設定方法をメモしておきます。
前提条件
- ruby 2.0.0 を使用
- symfony1.4 で検証
- バージョン管理ツールはsvnを想定
- デプロイ先が複数ある(今回の例では2台)
- database.ymlはsharedディレクトリではなくnfs上に設置して管理
capifonyインストール
- gemでインストール
gem install capifony
gem install capistrano_colors
gem install capistrano_rsync_with_remote_cache
デプロイ設定
- deployディレクトリ作成
mkdir ~/deploy
- symfonyプロジェクトをチェックアウト
svn co http://example.com/svn/sample/trunk .
- capifony初期設定
capifony .
config/deproy.rbが生成される
- deploy.rbを編集
vi confg/deploy.rb
set :application, "sample"
set :stage_dir, "config/deploy"
# デプロイ環境が複数ある場合
set :stages, %w(production staging)
# デフォルトのデプロイはstagingを使用
set :default_stage, "staging"
# 複数環境にデプロイ可能にするモジュール
require 'capistrano/ext/multistage'
# コマンド実行時の色を見やすくするモジュール
require 'capistrano_colors'
set(:deploy_to) { "#{deploy_to}" }
# バージョン管理にsvnを使用
set :repository, "http://example.cpm/svn/sample/trunk"
set :scm, :subversion
set :scm_username, "sample"
set :scm_password, "xxxx"
# Or: `accurev`, `bzr`, `cvs`, `darcs`, `subversion`, `mercurial`, `perforce`, or `none`
# ssh設定を読み込む(後述)
load "config/deploy/user_password"
set :use_sudo, false
# デプロイ方法 (今回はcapistranoサーバからアプリケーションサーバへのデプロイをrsyncで行う)
set :deploy_via, :rsync_with_remote_cache
# デプロイ対象外のものを指定
set :copy_exclude, [
".git",
"**/.git",
".DS_Store",
".svn",
"**/.svn",
"Capfile",
"config/deploy.rb",
"config/deploy/"
]
# rsync時に上記excludeを適応するための設定
set :rsync_options, '-rtlvz --delete --delete-excluded ' +
copy_exclude.map{|e| "--exclude='#{e}'"}.join(' ')
# 環境設定(変数に関しては後述)
set(:domain) { "#{domain}" }
role(:web) { domain } # Your HTTP server, Apache/etc
role(:app) { domain } # This may be the same as your `Web` server
role(:db, :primary => true) { domain } # This is where symfony migrations will run
# 世代管理数を3つに設定
set :keep_releases, 3
set(:release_name) {
set :deploy_timestamped, true; Time.now.strftime("%Y%m%d%H%M%S")
}
# 検証環境では use_ormをfalseに設定しないとエラーが発生
set :use_orm, false
# 共通ファイルはshared_filesに指定するが今回はnfs上に設定を置くのでコメントアウト
# set :shared_files, %w(
# config/databases.yml
# )
# symfony ccを実行する前にシンボリックリンクを設定できるようにする
after "deploy:share_childs", "deploy:set_sym_links"
namespace :deploy do
task :set_sym_links do
# nfs上にあるdatabase.ymlに対するシンボリックリンクを設定
run "rm -f #{latest_release}/config/databases.yml && ln -s #{nfs_dir}/config/databases.yml #{latest_release}/config/databases.yml"
end
end
- 環境毎の設定を保存するディレクトリ追加
mkdir config/deploy
- staging環境の設定
vi config/deploy/staging.rb
# 環境変数設定
set :symfony_env_prod, "staging"
# デプロイ先のドメインを設定
# サーバが複数の場合は配列として記述
set :domain, ["192.168.1.10", "192.168.1.11"]
# 単一サーバの場合
# set :domain, "192.168.1.10"
# デプロイ先のpath
set :deploy_to, "/var/www/sites/stg.sample"
# nfsのpath
set :nfs_dir, "/var/www/nfs_dir"
- production環境の設定
vi config/deploy/production.rb
set :symfony_env_prod, "production"
set :domain, ["192.168.1.10", "192.168.1.11"]
set :deploy_to, "/var/www/sites/sample"
set :nfs_dir, "/var/www/nfs_dir"
- sshログイン情報を設定
vi config/deploy/user_password.rb
set :user, "user"
# sudoを使う場合に必要(ログイン時に使うものではない模様)
set :password, "password"
- デプロイ環境の初期化(stg)
※ sshログインユーザに対して、予めdeploy_toに指定してあるディレクトリに書き込み権限を与えておく
sudo mkdir /var/www/sites
sudo chown user.user /var/www/sites
cap deploy:setup
/var/www/sites/stg.sample以下に
- releases
- shared
ディレクトリが追加される
- ssh公開鍵設定
# デプロイ実行ユーザでsshキーを生成
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub
## 公開鍵内容が表示される ##
# config/deploy/user_password.rbに記載したuserでログインし上記catで表示された内容を保存
vi ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# デプロイ実行ユーザからsshログインできることを確認
ssh [email protected]
- 設定ファイルの編集
sudo vim /var/www/nfs_dir/stg.sample/shared/config/database.yml
#config/database.ymlの内容をコピーしておく
database.ymlはデプロイ毎に変更する必要がないのでnfs上のディレクトリで管理。
デプロイ実行の度にシンボリックリンクを設定するようにする。
通常だとsharedディレクトリで管理するが、今回はデプロイ先が複数あったのでnfs上から共通のdatabase.ymlを参照するように設定。
- staging環境にデプロイ
cap deploy
- production環境にデプロイ
cap production deploy
これでcapifonyを使ってsymfonyプロジェクトをデプロイできるようになりました。