symfony project:deploy on Windows
symfonyを使って小さなシステムを作っている。手元のテスト環境(Windows 7, XAMPP)ではとりあえず動くレベルまで来たので、本番環境のLinuxに載せることにした。
symfony project:deploy というコマンドで簡単に本番環境への配備が行えるらしいので、その設定のやりかた。コマンドに関する説明は、本家のチュートリアルページを参照。
■まずは環境
- サーバー:CentOS 5.5
- クライアント:XAMPP 1.7.3, Windows 7
- symfony 1.4.5
■必要なソフトのインストール
project:deployは内部でrsyncコマンドを使用している。Linuxであれば問題ないけど、Windowsの場合はわざわざインストールする必要があるので、こちらのページよりcwrsyncをダウンロードしてインストールする。
しかしこのcwrsyncが曲者で、ssh経由だとうまく動かない(場合がある?)らしい。結論から言うと、このページからダウンロードできるcygnativeというプログラムを使えばOK。解凍してcwrsyncと同じフォルダに置く。(ちなみにこのダウンロードページはたまに落ちていることがあるっぽい)
■PuTTYの設定
別にPuTTYの設定なんて特に必要ないじゃん、と思うんだけど、これはやっておいた方がいい。と言っても大した事はなくて、以下の情報を指定してセッションの「保存」をする。ここで保存したセッション名はとりあえずsession1としておく。
- 接続するサーバーのホスト名
- ポート番号
- ログインユーザー名(これ重要)
後は、自分の公開鍵をサーバーの.ssh/authorized_keysに登録しておく。これに関してはSSHの基本なのでここでは省略。
Pageantに鍵を読み込ませた状態でPuTTYを立ち上げ、「セッション一覧」に表示されてるセッション名をダブルクリックするとそのサーバーにログインできるようになっていればOK。
■symfonyのソース修正
1つはバグ修正で、1つは公開鍵認証を使う為の機能追加。それぞれのtracでのチケットはここ(#8177)とここ(#6193)。前者は修正は完了してるけどまだ最新版(1.4.5)に取込まれていないっぽい。後者に関しては、symfonyはマイナーバージョンアップでは機能追加は取込まない方針なので、1.4系ではソース書き換えしか手がない。
#8177の最後の方にも書いてあるけど、symfony/task/sfFilesystem.class.phpの291行目付近を以下のように(stderrのモードを"w"から"a"に)する。ちなみに#8177の最初のほうに書いてある修正は行う必要はない。
$descriptorspec = array( 1 => array('pipe', 'w'), // stdout 2 => array('pipe', 'a'), // stderr );
もう1つは#6193に添付されているパッチをsymfony/task/project/sfProjectDeployTask.class.phpに適用する。
■properties.iniの修正
<appname>/application/config/properties.ini を修正。これは相当試行錯誤したけど、結局は以下のようにすればOKだった。
[production] ;ホスト名、ポート番号、ユーザー名はPuTTYのセッションを使うので不要 ;ただし、hostは空欄にする host= ;port=22 ;user=foo dir=/var/www/html/appname ;sshコマンドの代わりにcygnativeとplinkを組み合わせて使う。 ;session1というのはPuTTYの保存されたセッション ssh="'cygnative plink -load session1'"
これで完了。後は次のコマンドを実行するとデプロイされる。
# symfony project:deploy --go production
※追記
properties.iniのコメントに # を使うと、symfony doctrine:generate-module とかを実行した時に以下のような警告が出る。iniファイルのコメントは ; (セミコロン)で始める。
Deprecated: Comments starting with '#' are deprecated in
■補足
※1 途中で起こった色々な問題
上を見てもらえれば分かる通り、実際にやることはそれ程難しくないが、そこに至るまでは結構試行錯誤をした。問題は3つあった。
1つめはWindows上でssh+rsyncがうまく動かないらしい。symfony以前の話。cwrsync sshでググると沢山のページが出てくる。解決方法はいくつかあるみたいだけど、上述の通りcygnativeというプログラムを使う。
もう1つはsymfonyのdeployタスクがWindowsではうまく動かない問題。上に書いた通り、ソース修正("w"→"a")で乗り切る。
最後の問題は、deployタスクはパスワード認証にしか対応していないこと。これはソース修正+properties.iniへの設定追加で解決。
※2 トラブルシューティング中に発見した便利な技(?)
自分用メモ。
http://blog.symfony.jp/2008/04/17/161
symfony project:deploy –rsync-options="-azv –force –delete" production