capistranoを使ってsymfonyデプロイ(capifonyのインストールと設定)


[まとめ] 現在開催中のKindleセール情報はこちら

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 user@192.168.1.11
  • 設定ファイルの編集
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プロジェクトをデプロイできるようになりました。

参考URL

[まとめ] 現在開催中のKindleセール情報はこちら