webネタ

技術系ブログ。web系SE。1988。♂。@rhong_

デプロイツールCapistranoいいよー

正月だし書き溜めてある記事を除々に投下していく(。´ω`。)

デプロイについて

開発環境で作ったものを本番環境にUPするときデプロイとか言いますが、色々な方法があります。
優劣的には、WinSCP <<< rsync <<<<<<<<<<<<<<<<< Capistrano です。
rsyncだけとかもうツライです。

Capistranoのインストール

簡単インストール

sudo gem update --system
sudo gem install capistrano
sudo gem install capistrano_colors
sudo gem install capistrano-ext
sudo gem install capistrano_rsync_with_remote_cache

デプロイ先の設定ファイルを生成

mkdir ~/deploy
cd ~/deploy
capify .

以下のような構成ができます。

-- Capfile
`-- config `-- deploy.rb

productionやstagingなど環境の差分を記述できるファイルを作ります。
capistrano-extモジュールで実現されています。

mkdir config/deploy
touch config/deploy/{production.rb,staging.rb,development.rb}

すると以下のような構成になります。

-- Capfile
`-- config |-- deploy | |-- development.rb | |-- production.rb | `-- staging.rb `-- deploy.rb

Capistranoの設定

config/deploy.rbに設定(レシピ)を書いていきます。
参考

自分的には、rsyncみたいに差分アップロードがよかったのでcapistrano_rsync_with_remote_cacheモジュールをいれています。
http://d.hatena.ne.jp/sotarok/20110726/capistrano_rsync_deploy

# モジュールの読み込み
require 'capistrano/ext/multistage'
require 'capistrano_colors'

#--------------------------------------------------------------

# 基本設定
set :application,   "sample"
set :use_sudo,      false
set :deploy_to,     "/var/www/vhosts/#{application}"
set :deploy_via,    :copy
set :keep_releases, 3 #クリーンアップ時に残すソースの世代数

# リポジトリの設定
set :scm,           :git
set :repository,    "file:///var/git/#{application}.git"
set :branch,        "master"

# SSHの設定
set :user,           "ryo"
ssh_options[:port] = "10022"
ssh_options[:keys] = "~/.ssh/production.key"

# role (全部同じでok)
role :web, "xxx.xxx.xxx.xxx"
role :app, "xxx.xxx.xxx.xxx"
role :db,  "xxx.xxx.xxx.xxx", :primary => true

# 不要なタスクをスキップする
namespace :deploy do
  task :restart do end
  task :start do end
  task :stop do end
  task :cold do end
  task :migrate do end
  task :migrations do end
end

一番最初だけ:setupをつけます。

cap production deploy:setup

次回からは以下のようにしてdeployできます。

cap production deploy

デプロイすると、デプロイ先のサーバーは以下のような状態になります。

sample/
 |- current/ (release/中の最新のものへのシンボリックリンクです。
 |- release/
    |- 20111228135018 (この中にデプロイしたファイルが入っています。)
    |- 20111229003050 (過去にデプロイしたものが溜まっていきます。こうやって残しておくことで、すぐにロールバックできるんですね。)
 |- shared/

鍵を登録すると楽になった。

ssh-agent bash
ssh-add ~/.ssh/production.sh

ロードアベレージやメモリ量、HDD量を取得してみる。

config/deploy.rbに以下の設定を追加。

task :monitor, :roles => :web do
    run "uptime"
    run "free -m"
    run "df -h"
end

実行

cap production monitor
  * 20:07:30 == Currently executing `production'
    triggering start callbacks for `monitor'
  * 20:07:30 == Currently executing `multistage:ensure'
  * 20:07:30 == Currently executing `monitor'
  * executing "uptime"
    servers: ["xxx.xxx.xxx.xxx"]
    [xxx.xxx.xxx.xxx] executing command
 ** [out :: xxx.xxx.xxx.xxx] 20:07:31 up 3 days,  2:05,  0 users,  load average: 0.00, 0.00, 0.00
    command finished in 92ms
  * executing "free -m" 
    servers: ["xxx.xxx.xxx.xxx"]
    [xxx.xxx.xxx.xxx] executing command
 ** [out :: xxx.xxx.xxx.xxx] total       used       free     shared    buffers     cached
 ** [out :: xxx.xxx.xxx.xxx] Mem:           497        287        210          0         46        185 
 ** [out :: xxx.xxx.xxx.xxx] -/+ buffers/cache:         55        441 
 ** [out :: xxx.xxx.xxx.xxx] Swap:         2000          0       2000
    command finished in 45ms
  * executing "df -h" 
    servers: ["xxx.xxx.xxx.xxx"]
    [xxx.xxx.xxx.xxx] executing command
 ** [out :: xxx.xxx.xxx.xxx] Filesystem          サイズ  使用  残り 使用% マウント位置
 ** [out :: xxx.xxx.xxx.xxx] /dev/hda2              17G  2.7G   14G  17% /
 ** [out :: xxx.xxx.xxx.xxx] /dev/hda1              99M   18M   76M  19% /boot
 ** [out :: xxx.xxx.xxx.xxx] tmpfs                 249M     0  249M   0% /dev/shm
    command finished in 46ms

メンテナンスページの切り替え

そのほかにも、メンテナンスページへ切り替えることもできます。
以下の設定を自分でapacheに加えます。

ErrorDocument 503 /system/maintenance.html
RewriteEngine On
RewriteCond %{REQUEST_URI} !.(css|gif|jpg|png)$
RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$  -  [redirect=503,last]

デフォルトの動作としては、maintenance.htmlがある場合は、503にリダイレクト。503のレスポンスページはmaintenance.htmlとしているようです。

なので

cap production deploy:web:disable

と実行すると、maintenance.htmlが生成されるので、mod_rewriteの判定にひっかかり503を返すようになります。

逆に

cap production deploy:web:enisable

と実行すると、maintenance.htmlが削除されて503にならなくなります。