share facebook facebook twitter menu hatena pocket slack

2012.03.05 MON

FuelPHPってなんじゃ?(Capistranoでデプロイ編)

三浦 悟

WRITTEN BY 三浦 悟

前回は、FuelPHPってなんじゃ?(Git管理編)の記事を紹介しましたが、
今回は、CapistranoでFuelPHPをデプロイしてみたいと思います。

構成は以下の通りで、全てEC2インスタンスになります。
また今回はDBに関しての説明は省きます。

  • repository(git): vvv.vvv.vvv.vvv
  • admin(capistrano): xxx.xxx.xxx.xxx
  • hoge1(web+app): yyy.yyy.yyy.yyy
  • hoge2(web+app): zzz.zzz.zzz.zzz

各インスタンスでのアクセス関係は以下の通りです。

admin→(deploy)→ hoge1,hoge2 → (git clone) → repotitory
└→ (git ls-remote) → repotitory

まず、各インスタンス間でアクセスできるように設定します。
adminからhoge1, hoge2, repositoryへ、またhoge1, hoge2からrepositoryへSSHできるように
セキュリティグループの設定を行なっておきます。

次にadminからhoge1,hoge2, repositoryへアクセスできるよう、adminの公開鍵を
hoge1, hoge2, repositoryに保存します。

○admin

# su - memorycraft
$ ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAslxvqb3fg7IA8qjrKbLanetaTcoESWznl9BrjmygSlUEaKlaqd5FRM1R4mGgJSHFOVV3rBArvRw1V14FW6QKaG6oVNBd6PVryXVWQufC0eSi+FBhkkdgISXUdpLApdx01ZxmMha9HvGl04Y+bSj0lz8oggfdBJrMAxGiUe3POy9dJA6Hw79FMVhBTcycxQ6aJ5PNxd/jOeiI/Npcwved/s7Y8DFwDTJAIz9uiCzdQrPmrM75gyrwis2I2kmeLANQ+d2pcsM8zZf7kglBTifmcegWTQkCkbu4WFO1BL8/JjaoWj7KIXFlHzstkPyn1duvbCBBmkR0HabbU+zNU4J/hw== memorycraft@ip-10-146-69-156

この出力内容をコピー(1)

GitlabもしくはGithubへ(1)の公開鍵を登録します。GUIがない場合はgitユーザーの~/.ssh/authorized_keysに
登録します。

○hoge1, hoge2

# su - memorycraft
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/memorycraft/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/memorycraft/.ssh/id_rsa.
Your public key has been saved in /home/memorycraft/.ssh/id_rsa.pub.
The key fingerprint is:
b5:6d:1b:f9:e6:ee:c8:86:a3:a6:27:b8:d0:54:2d:ad memorycraft@ip-10-146-93-65
The key's randomart image is:
+--[ RSA 2048]----+
| |
| o |
| o o . |
| . o . o . |
| . E S . = |
| o . + |
| . .. .. o |
| .. . o o..+ |
| ...=.. ooo+ |
+-----------------+
$ vi ~/.ssh/authorized_keys
コピーした(1)をペースト
$ chmod 600 ~/.ssh/authorized_keys

次にhoge1, hoge2からrepositoryにSSHアクセスできるよう、hoge1, hoge2の公開鍵をrepositoryに
登録します。

○hoge1, hoge2

$ cat ~/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzOkvpSWfge0pzSsfbIkVpPZU8xZ+XXoDr+NhWCVVD4iC+F3bh69C90FSGbEDLF1hrgQGcaU6THSmXgozm0uPp0uP2vbjsFgxyklEEDhZrr7kBWIpVx5k2uhzp9xFI1Ijd+xXm1BW1/w1pSvuo0IAvpKMT0Pr5JA5x/1jvQ2JWNSMuZEp19bAQjGA1kgy82BbmX8bQxcnNMKaewiMAT8DrORBFH+yzagvKIcJDhi2/8z5Fp9P0Yxq1clLHEQBnU2g8918Zq5KMkRNnwQEqSrl1KrLVNpuTxh3IdqBXDPxlrdMYDfqdOAfH92f5Mq1cpThJJV2Kv+iej4bkUFcm/CGBQ== memorycraft@ip-10-146-93-65

この出力内容をコピー(2)

capistranoのconfigで登録したリポジトリサーバーにこの内容(2)を登録します。
GitlabやGithubの場合は管理画面のSSH Keysで、gitだけの場合はgitユーザーの~/.ssh/authorized_keysに
追加します。

必要なライブラリをインストールしておきます。

# yum install -y make openssh-clients gcc libxml2 libxml2-devel libxslt libxslt-devel python-devel wget readline-devel ncurses-devel gdbm-devel glibc-devel tcl-devel openssl-devel db4-devel byacc httpd gcc-c++ curl-devel openssl-devel zlib-devel httpd-devel apr-devel apr-util-devel sqlite-devel libicu-devel pcre-devel git-core python-setuptools python-devel libicu-devel python-setuptools python-devel libicu-devel git patch libtool php

またホスト登録のyes/noのダイアログを解消しておくため、それぞれ一度sshでログインを試みます。

○admin

# su - memorycraft
$ ssh memorycraft@yyy.yyy.yyy.yyy
$ ssh memorycraft@zzz.zzz.zzz.zzz

○hoge1, hoge2

#su - memorycraft
$ ssh memorycraft@vvv.vvv.vvv.vvv

ここでcapistrano用にディレクトリを作成し、capistranoディレクトリの中でcapifyコマンド実行します。
capifyはcapistranoのタスクなどを定義するためのひな形を作成するためのコマンドです。

○admin

$ mkdir ~/capistrano
$ cd ~/capistrano
$ capify .
$ tree ~/capistrano
capistrano
|-- Capfile
`-- config
`-- deploy.rb

作成されたCapfileを以下のように修正します。

load 'deploy' if respond_to?(:namespace)
Dir['vendor/gems/*/recipes/*.rb','vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }
load 'config/deploy' # remove this line to skip loading any of the default tasks

またconfig/deploy.rbを以下のように修正します。

set :application, "bookstore" #アプリケーション名
set :user, "memorycraft" #SSHアクセスする際のユーザー
set :use_sudo, false #sudoは使用しない

set :deploy_to, "/home/memorycraft/bookstore" #デプロイ先
set :scm, :git #今回はgitを使用
set :repository, "git@vvv.vvv.vvv.vvv:bookstore.git" # gitリポジトリ
set :branch, "master" # ブランチはmasterを選択
set :git_enable_submodules, 1 #サブモジュールを使用するか
set :deploy_via, :remote_cache #

role :web, "yyy.yyy.yyy.yyy","zzz.zzz.zzz.zzz"

set :keep_releases, 3

namespace :deploy do
task :start do ; end
task :stop do ; end
task :restart, :roles => :app, :except => { :no_release => true } do
end
end

ここでcap deploy:setupを行います。

$ cd ~/capistrano
$ cap deploy:setup

上記により、hoge1, hoge2にデプロイ用のリリース管理ディレクトリが作成されます。
capistranoはこのディレクトリを使用してデプロイの世代管理等も行うことが可能です。

○hoge1, hoge2

$ tree bookstore/
bookstore/
├── releases
└── shared
├── log
├── pids
└── system

これで準備ができたので、デプロイを行います。

admin

$ cd ~/capistrano
$ cap deploy

これにより、タスク処理の進捗結果が出力されます。
デフォルトのdeployタスクは、Railsアプリのデプロイを想定しているため、結果には、例えばgitサーバーの
EIPの正引き逆引きの不一致やRailsに特化したjavascript, stylesheet, images等のディレクトリの検索等の
エラーが表示されていますが、最終行にfailedという項目が表示されていなければ全体的には成功しているようです。

○hoge1, hoge2

ここではhttpdでホストするために、/var/www/html/bookstoreにリンクします。
capistranoはcurrentというディレクトリに最新のデプロイを保存しているので、そこをリンクターゲットにします。

# cd /home
# chmod 755 /home/memorycraft
# cd /var/www/html
# ln -s /home/memorycraft/bookstore/current/public bookstore

httpdでホストします。

# /etc/init.d/htpd start

hoge1,hoge2をブラウザ画面で確認してみます。
共にFuelPHPがホストされているのが確認できます。

次に、開発環境でfuel/app/views/welcome/index.phpの中身を変えてpushします。

$ cd ~/bookstore
$ vi fuel/app/views/welcome/index.php

Welcome!



Welcome!(version 2)



$ git add .
$ git commit -m 'change welcome message to version 2'
$ git push origin master

そして、deployします。

$ cd ~/capistrano
$ cap deploy

こちらをブラウザで確認してみます。

正しくデプロイされています。

次に、これをひとつ前のバージョンに戻してみます。
デプロイを前のバージョンに戻すには、deploy:rollbackタスクを実行します。

$ ~/capistrano
$ cap deploy:rollback

上記のように、元に戻っていました。
これで、アプリケーションのデプロイコントロールがとても楽になりました。
次回はcapistranoでマイグレーションを行いたいと思います。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら

三浦 悟

三浦 悟

高円寺在住のなんじゃ系男子 またの名をmemorycraftといいます。 炭水化物大好き 日々の「なんじゃ?」を記事にしてます。