CodeIgniterアプリをデプロイするときのCapistranoレシピ

CodeIgniterアプリをデプロイするときのCapistranoレシピを考えてみた。

deploy.rb

set :application, "my.domain.com"
set :deploy_to, "/home/httpd/#{application}"
set :repository, "http://path_to_myproject"
set :scm, :subversion
set :use_sudo, false

role :web, "myhostname"

after "deploy", "deploy:create_app_symlink"
after "deploy:setup", "deploy:chown_log_dir"

namespace :deploy do
  task :create_app_symlink, :roles => :web do
    run "rm -f #{deploy_to}/application; ln -s #{deploy_to}/current/application #{deploy_to}/application"
    run "rm -f #{deploy_to}/html; ln -s #{deploy_to}/current/html #{deploy_to}/html"
    run "rm -f #{deploy_to}/system; ln -s #{deploy_to}/current/system #{deploy_to}/system"
  end

  task :chown_log_dir, :roles => :web do
    run "sudo chown httpd #{deploy_to}/shared/log"
  end
end

このレシピを使ってcap deploy:setup、cap deployを実行すると、デプロイ先に下記のディレクトリ構成でアプリケーションがデプロイされます。

$ tree -L 3 /home/httpd/my.domain.com/
/home/httpd/my.domain.com/
├── application -> /home/httpd/my.domain.com/current/application
├── current -> /home/httpd/my.domain.com/releases/20130224145516
├── html -> /home/httpd/my.domain.com/current/html
├── releases
│   └── 20130224145516
│       ├── Capfile
│       ├── REVISION
│       ├── application
│       ├── html
│       ├── log -> /home/httpd/my.domain.com/shared/log
│       ├── public
│       ├── system
│       └── tmp
├── shared
│   ├── log
│   ├── pids
│   └── system
└── system -> /home/httpd/my.domain.com/current/system

16 directories, 2 files

以下、補足です。

設定ファイルの置き場所について

CapfileをCodeIgniterのルートディレクトリ、deploy.rbをapplication/config/に置いています。
capifyコマンドの実行手順は下記のとおりです。

まずCodeIgniterのルートディレクトリで、application/を指定してcapifyコマンドを実行します。

$ capify application/
[add] writing 'application/Capfile'
[add] writing 'application/config/deploy.rb'
[done] capified!

実行後、Capfileをルートディレクトリに移動させます。

$ mv application/Capfile .

そして、Capfileを編集して、application/config/deploy.rbを読み込めるように変更します。

$ diff Capfile.org Capfile
4c4
< load 'config/deploy' # remove this line to skip loading any of the default tasks
\ No newline at end of file
---
> load 'application/config/deploy' # remove this line to skip loading any of the default tasks

application/config/に.phpファイルにまぎれて1つだけ.rbファイルがあって違和感がすごいですが、気にしないことにします。

CodeIgniterへのシンボリックリンクについて

create_app_symlinkタスクで、current/application、current/html、current/systemへのシンボリックリンクを作成しています。これはindex.phpをhtml/に配置して、ドキュメントルートとして/home/httpd/my.domain.com/html/を指定しているためです*1
ドキュメントルートに直接/home/httpd/my.domain.com/current/html/を指定すればシンボリックリンクが不要になりますが、Capistranoを使う環境(productionサーバやstagingサーバ)と使わない環境(developサーバ)とでドキュメントルートを揃えておきたかったのでこうしました。

ログディレクトリについて

ログファイルは、CodeIgniterのデフォルトのログディレクトリ(application/logs/)ではなくcurrent/logに出力するようにしています。current/logはshared/log/へのシンボリックリンクで、デプロイ時にCapistranoが作成してくれます。ここにログを出力することで、すべての世代のアプリケーションでログファイルを共有可能になります。

config.phpでは、Capistranoを使わない環境も想定して、下記のようにAPPPATHからの相対パスを指定しています。

$ diff config.php.org config.php
194c194
< $config['log_path'] = '';
---
> $config['log_path'] = APPPATH . '../log/';

なお、上記レシピでは、deploy:setup実行時にshared/log/の所有者をApacheユーザに変更しています。

まとめ

CodeIgniterアプリをデプロイするときのCapistranoレシピを考えてみました。
まだlocalhostで検証しただけなので、実際に運用を始めるといろいろ改善点が出てくると思いますが、とりあえずこのレシピでCapistranoを使ってみようと思います。

*1:index.phpをhtml/に置いている理由は、ドキュメントルートにapplication/やsystem/があるのがセキュリティ上よろしくないためです。http://www.ci-guide.info/basic/install/