読者です 読者をやめる 読者になる 読者になる

garbagetown

個人の日記です

capistrano (2)

rails

capistrano によるデプロイは、下図のようなディレクトリ構成を取ります。

リリース毎に releases 以下にタイムスタンプで名前付けしたディレクトリが作成され、アプリケーションサーバがドキュメントルートとして認識する current ディレクトリは、releases 配下の最新のリリースディレクトリを参照する単なるシンボリックリンクです。
逆に、リリース間で共通のログ情報などは、各リリース内の log ディレクトリが shared ディレクトリを参照するシンボリックリンクとなります。
このようなディレクトリ構成を取ることによって、リリース毎にモジュールを上書きしなくて済むようになり、リリースに失敗した際の切り戻しなども容易に行えるようになります。
すばらしい。早速やってみましょう。

ディレクトリの作成

何はなくともモジュールをデプロイするディレクトリを作成します。
以下では /var/rails ディレクトリにモジュール(上図の場合 myapp)をリリースするものとし、モジュールリリースには cap ユーザを使用するものとします。

$ cd /var/
$ sudo mkdir rails
$ sudo chown -R cap:cap rails
$ ls -la
total 56
drwxr-xr-x 16 root root  4096 2009-05-18 23:54 ./
drwxr-xr-x 20 root root  4096 2009-05-18 23:20 ../
(snip)
drwxr-xr-x  2 cap  cap   4096 2009-05-18 23:54 rails/
(snip)

deploy.rb

上記にて作成したディレクトリにモジュールをリリースするよう、deploy.rb を編集します。
こういうときは必要最低限の箇所だけ編集し、その効果をひとつずつ確実に確認するのが成功への近道です(分かっちゃいるけど面倒くさがっていい加減に書き換えてすぐにわけが分からなくなる人の戯言)。

set :application, "sample"
set :repository,  "set your repository location here"

# If you aren't deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
set :deploy_to, "/var/rails/#{application}"

# If you aren't using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion

set :user, "cap"
set :use_sudo, false

role :app, "appserver"
role :web, "appserver"
role :db,  "appserver", :primary => true

set :application にはアプリケーション名(上図の場合 myapp)を指定します。
set :repository はリポジトリのパスを指定しますが、これはまだ先の話なので取りあえず放置。
set :deploy_to はモジュールをデプロイするディレクトリパスです。上記にて作成したディレクトリパスを指定します。
set :user はデプロイに使用するユーザ名で、:use_sudo は mkdir などのコマンド実行時に sudo として実行するか否かを指定します。set :user と set :use_sudo はデフォルトでは記述されていないので追記します。*1
role :app, :web, :db には、それぞれアプリケーションサーバ、WEB サーバ、DB サーバのホスト名か IP アドレスを指定するのだと思いますが、全部同じマシンに入れてるので何が何だか分かりません。

cap deploy:setup

deploy.rb を保存したら、開発環境にて cap deploy:setup を実行します。このコマンドを実行すると本番環境上にモジュールをデプロイするディレクトリが作成されます。
コマンド実行途中に秘密鍵の読み出し認証があるので、鍵ファイル作成時に指定したパスワードを入力します。

% cap deploy:setup
  * executing `deploy:setup'
  * executing "mkdir -p /var/rails/sample (snip) && chmod g+w /var/rails/sample (snip)"
    servers: ["appserver"]
Enter passphrase for c:/Documents and Settings/garbagetown/.ssh/id_rsa:
    [appserver] executing command
    command finished

本番環境で確認。

$ find /var/rails -ls
3620903 4 drwxr-xr-x   3 cap cap 4096  5月 19 00:35 /var/rails
3620904 4 drwxrwxr-x   4 cap cap 4096  5月 19 00:35 /var/rails/sample
3620905 4 drwxrwxr-x   2 cap cap 4096  5月 19 00:35 /var/rails/sample/releases
3620906 4 drwxrwxr-x   5 cap cap 4096  5月 19 00:35 /var/rails/sample/shared
3620909 4 drwxrwxr-x   2 cap cap 4096  5月 19 00:35 /var/rails/sample/shared/pids
3620907 4 drwxrwxr-x   2 cap cap 4096  5月 19 00:35 /var/rails/sample/shared/system
3620908 4 drwxrwxr-x   2 cap cap 4096  5月 19 00:35 /var/rails/sample/shared/log

そしてここからが本番。安いテレビ番組では「このとき一向はまだ、この先に待ち受けている悲劇を知る由も無かった」などというナレーションが流れるポイントです。待て!次週!

*1:追記しなかったらどうなるんだろう、とか要らん好奇心を発揮してみるのは自由ですが、旺盛過ぎる好奇心は猫をも殺すって言うか死ぬほど疲れるのでお勧めしません。