PHPアプリをAWSにCapistranoで自動Deploy

最近インフラをコード化するのが流行りっぽい。
Chef、Capistranoとかjenkinsとか。

その中で自動DeployツールのCapistranoを使ってみた。

デプロイ先のサーバはAWSのEC2。
EC2は起動するたびに、IPが変わるのでElastic IP設定済みとする。


まずCapistranoをgemでインストール

capistrano_colors

capistrano実行時の結果に色を付けてくれる

capistrano-ext

deploy先の環境を切り分けることができる

・railsless-deploy

Rails以外のアプリをDeployするのに必要

インストール

$ sudo gem install capistrano
$ sudo gem install capistrano_colors
$ sudo gem install capistrano-ext
$ sudo gem install railsless-deploy


ルートディレクトリで以下実行

$ capify .

Capfileと
configディレクトリと、その中にdeploy.rb、
が生成されます。

・実行結果
[add] making directory ‘./config’
[add] writing ‘./config/deploy.rb’
[add] writing ‘./Capfile’
[done] capified!


deploy先の環境を切り分けるための環境ファイルを作ります。
今回はproduction環境にdeployすると仮定します。

まず、configディレクトリの中にdeployディレクトリを作ります。
その中にproduction.rbを生成。

$ mkdir config/deploy
$ touch config/deploy/production.rb


設定ファイルを書き換えます。
今回はgitを使用することを想定します。

deploy.rb

require "capistrano/ext/multistage"
require "capistrano_colors"
require "railsless-deploy"
require "rubygems"

# ↓アプリケーションのルートディレクトリ名となります
set :application, "APP_NAME"
set :user, "ec2-user"
set :deploy_to, "/var/www/html/#{application}"
set :deploy_via , :copy
set :use_sudo, true

set :scm, :git
set :repository,  "git@github.com:FOO/HOGE.git"

set :ssh_options, :port=>22, :forward_agent=>true, :keys=>"PUBLIC KEY FILE", :passphrase => "PASSPHRASE"

default_run_options[:pty] = true


# deploy後、/var/www/html/にcpするのに、
# ディレクトリの所有者をec2-userに変える。↓
namespace :setup do
  task :fix_permissions do
    sudo "chown -R #{user}:#{user} #{deploy_to}"
  end
end
after "deploy:setup", "setup:fix_permissions"

なお、deployするディレクトリは先に作成しておく。

次に環境先ファイルの設定。

/config/production.rb

role :web, "Elastic IP"
role :app, "Elastic IP"
role :db,  "Elastic IP", :primary => true

set :branch, "master"

以上で設定終了。
1番最初だけ以下を実行

$ cap production deploy:setup

その後からは以下で可能

$ cap production deploy


するとターミナルにバーっと実行結果が流れて、deployできます。
あと適宜、ディレクトリの実行権限変更してください



nayamagu