Symfony2 で作られたアプリケーションを capifony を使ってコマンド一発デプロイする方法を紹介します。デプロイを自動化しておくと後々すごく楽なので、プロジェクト発足時に仕組みを作っておくと良いと思います。
動作確認環境
- Mac OS X 10.9
- ruby 2.1
- Capistrano 2.15
- capifony 2.8
- Symfony 2.6
目次
- デプロイ先サーバに ssh 鍵認証でログインできるようにしておく
- デプロイコマンド実行マシンに ruby をインストール
- capifony をインストール
- deploy.rb を編集する
- 異なる環境にデプロイする
- デプロイ先サーバのセットアップ
- デプロイ実行
- データベースのマイグレーションも実行される
デプロイ先サーバに ssh 鍵認証でログインできるようにしておく
デプロイコマンド実行マシンからデプロイ先サーバに ssh 鍵認証でログインできるようにしておきます。パスワード認証方式でもデプロイできますが、今回は鍵認証方式でデプロイします。
手順は以前書いた記事が参考になるかもしれません。
お名前.com VPS を借りて最初にやったこと(1) ユーザ作成とSSH設定
デプロイコマンド実行マシンに ruby をインストール
デプロイコマンドを実行するマシンに ruby をインストールします。私は手元の Mac に ruby をインストールしてデプロイを実行しています。
Mac に ruby をインストールしたときの私のメモはこちら
MacにHomebrewでrbenvをインストールして複数バージョンのrubyを管理
capifony をインストール
ruby をインストールできたら RubyGems から capifony をインストールします。
$ gem install capifony
Symfony2 プロジェクトルートに移動して、capifony をセットアップします。
$ cd path/to/your/symfony2-project
$ capifony .
capifony コマンドを実行すると Capfile と app/config/deploy.rb が作成されます。
deploy.rb を編集する
作成された app/config/deploy.rb にデプロイ設定を記述します。
app/config/deploy.rb
# MAX_LEVEL, IMPORTANT, INFO, DEBUG
logger.level = Logger::INFO
default_run_options[:pty] = true
set :stage_dir, "app/config/deploy"
set :stages, %w(production, staging)
set :default_stage, "production"
require 'capistrano/ext/multistage'
set :use_sudo, false
set :keep_releases, 2
set :deploy_via, :remote_cache
set :use_composer, true
set :update_vendors, false
set :copy_vendors, true
set :app_path, "app"
set :shared_files, ["composer.phar", "app/config/parameters.yml"]
set :shared_children, [log_path, "vendor"]
set :assets_symlinks, true
set :dump_assetic_assets, true
set :permission_method, :acl
set :use_set_permissions, true
set :php_bin, "/usr/bin/php"
set :interactive_mode, false
before "symfony:cache:warmup", "symfony:doctrine:migrations:migrate"
after "deploy", "deploy:cleanup"
ざっくり解説すると
- composer はデプロイ時に self-update で自動更新。
- composer.phar は事前にダウンロードして shared フォルダに置いておく。
- composer.phar install コマンドで vender を更新。
- データベースのマイグレーション doctrine:migrations:migrate コマンド実行時に確認メッセージを表示しない。
- デプロイ後に古いリリースセットを 2 個残して削除。
- デプロイ時のログを詳細に表示。
異なる環境にデプロイする
通常、本番環境にいきなりデプロイすることは少なく、検証環境での動作確認を経て本番デプロイをします。production.rb, staging.rb にそれぞれの環境の設定を記述します。
app/config/deploy/production.rb
set :domain, "deploy host"
#set :domain, ["deploy host1", "deploy host2"]
role :web, domain
role :app, domain, :primary => true
set :deploy_to, "deploy directory"
set :repository, "repository url"
set :scm, :git
set :branch, "master"
set :user, "ssh user"
ssh_options[:port] = "22"
ssh_options[:keys] = [File.join(ENV["HOME"], ".ssh", "id_rsa")]
set :webserver_user, "www"
app/config のファイル構成はこんな感じ。
$ tree app/config
app/config
├── ...
├── deploy.rb
├── deploy/production.rb
├── deploy/production.rb.dist
├── ...
デプロイ先サーバのセットアップ
デプロイ元から cap deploy:setup コマンドを実行して、デプロイ先サーバをセットアップします。
$ cd path/to/your/symfony2-project
$ cap production deploy:setup
デプロイ先にログインして、作成された shared フォルダに app/config/parameters.yml と composer.phar を設置します。
$ cd /var/www/example.com/shared
$ mkdir -p app/config
$ touch parameters.yml
$ curl -sS https://getcomposer.org/installer | php
composer.phar を shared フォルダに事前ダウンロードしておくと、デプロイが若干早くなります。事前にダウンロードしていない場合、composer を毎回 curl コマンドでダウンロードするようになっているようです。
デプロイ先サーバでは、github から ソースコードを clone するので、デプロイ先サーバに git をインストールしておくこともお忘れなく。
デプロイ実行
準備は整いました。デプロイ元から cap deploy コマンドを実行します。
$ cap production deploy
--> Updating code base with remote_cache strategy
--> Creating cache directory................................✔
--> Creating symlinks for shared directories................✔
--> Creating symlinks for shared files......................✔
--> Normalizing asset timestamps............................✔
--> Copying vendors from previous release...................✔
--> Updating Composer.......................................✔
--> Installing Composer dependencies........................✔
--> Setting permissions.....................................✔
--> Dumping an optimized autoloader.........................✔
--> Warming up cache........................................✔
--> Dumping all assets to the filesystem....................✔
--> Clear controllers.......................................✔
--> Successfully deployed!
(文字数の都合上、詳細なログは消しています)
うまくデプロイできましたか。できなかった場合はエラーになった箇所をログから確認しましょう。デプロイ先サーバで tree コマンドを実行すると、こんな感じになっています。
tree /var/www/example.com -L 2
/var/www/example.com
├── current -> /var/www/example.com/releases/20140106001857
├── releases
│ ├── 20140101234317
│ └── 20140106001857
└── shared
├── app
├── cached-copy
├── composer.phar
└── vendor
データベースのマイグレーションも実行される
DoctrineMigrationsBundle でデプロイ時にデータベースのマイグレーションも実行しています。導入方法は以下の記事をどうぞ。
-
Symfony2のDoctrineMigrationsBundleで簡単マイグレーション
Symfony2 の DoctrineMigrationsBundle を使ってデータベースのマイグレーションを行う方法 ...
続きを見る
終わりに
capifony を使って Symfony2 アプリケーションをコマンド一発でデプロイする方法を紹介しました。今後は複数環境にデプロイする方法や、Jenkins からデプロイする方法など調べていきたいと思います。