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/