コマンドは許可されてるけど訳ありでFTP/SCPアップロードから逃れられない、でもComposerだって普通に使いたい、vendorディレクトリ以下を一括アップロードなんてしたくない…。
そこで、手動シンボリックリンク切り替えデプロイを断行してみました。
以下の例は Gehirn RS2 で動かしている自分用サンプルサイト www.k-holy.net の構成です。
| home
|-- kholy
|-- config
|-- public_html
|-- k-holy
|-- releases
| |-- 2014080801
| | |-- app
| | | |-- cache
| | | |-- config -> /home/kholy/config
| | | |-- log -> /home/kholy/public_html/k-holy/shared/app/log
| | | |-- session -> /home/kholy/public_html/k-holy/shared/app/session
| | | |-- templates_c
| | |
| | |-- public
| | |-- src
| | |-- vendor
| |
| |-- 2014080802
| |-- app
| | |-- cache
| | |-- config -> /home/kholy/config
| | |-- log -> /home/kholy/public_html/k-holy/shared/app/log
| | |-- session -> /home/kholy/public_html/k-holy/shared/app/session
| | |-- templates_c
| |
| |-- public
| |-- src
| |-- vendor
|
|-- shared
| |-- app
| |-- log
| |-- session
|
|-- staging
| |-- public -> /home/kholy/public_html/k-holy/releases/2014080802/public
| |-- app -> /home/kholy/public_html/k-holy/releases/2014080802/app
|
|-- current
|-- public -> /home/kholy/public_html/k-holy/releases/2014080801/public
|-- app -> /home/kholy/public_html/k-holy/releases/2014080801/app
ステージングのドキュメントルート
/home/kholy/public_html/k-holy/staging/public
プロダクションのドキュメントルート
/home/kholy/public_html/k-holy/current/public
ステージングと言っても省エネ運用のため、同じサーバでVirtualHostを使い分ける想定です。
(Gehirn RS2 + Gehirn DNS であればドメインへのCNAMEの設定とWebサーバの設定が同じコントロールパネル上で操作できるので楽です。 k-holy.netドメインを取得してGehirn DNSとRS2に登録したメモ)
ログファイルやセッションファイル等、切り替え後も物理的に同じファイルを継続して扱うディレクトリについては、リリース単位のディレクトリとは独立した共有ディレクトリを作成し、リリース単位のディレクトリからシンボリックリンクを張ります。
ステージングへのデプロイ作業はこんな感じ。
$ cd /home/kholy/public_html/k-holy/releases/2014080802/app $ chmod 777 log $ chmod 777 session $ chmod -R 777 cache $ chmod 777 templates_c $ ln -sfn /home/kholy/config config $ cd /home/kholy/public_html/k-holy/releases/2014080802 $ composer self-update $ composer install --no-dev --optimize-autoloader --no-interaction $ cd /home/kholy/public_html/k-holy/staging $ ln -sfn /home/kholy/public_html/k-holy/releases/2014080802/public public $ ln -sfn /home/kholy/public_html/k-holy/releases/2014080802/app app
ステージングで問題なく動くことを確認したら、シンボリックリンクを張り替えて、そのままプロダクションに移行します。
$ cd /home/kholy/public_html/k-holy/releases/2014080802/app $ rm -rf log $ rm -rf session $ ln -sfn /home/kholy/public_html/k-holy/shared/app/log log $ ln -sfn /home/kholy/public_html/k-holy/shared/app/session session $ cd /home/kholy/public_html/k-holy/current $ ln -sfn /home/kholy/public_html/k-holy/releases/2014080802/public public $ ln -sfn /home/kholy/public_html/k-holy/releases/2014080802/app app
データベースの切り替えは、ステージング用とプロダクション用の設定ファイルをそれぞれ用意して、アプリケーションの初期スクリプトで php_uname('n') やHTTPホスト名を見て切り替えてます。
(コマンドでリンク張り替えてもいいんですが、Windows開発環境の設定ファイルもあるのでめんどくさくて…)
あと、今回の環境には入ってませんが、Zend OPcache を使っている場合は opcache_reset() とかもやります。
Fabricなど何らかのツールを使えば、ファイル転送も含めて1コマンドでやれそうですが、それは次の段階ということで…。