「Cloud Foundry 百日行」第24日目は,PHP製の CRM (Customer Relationship Management) ソフトウェア SugarCRM (日本語サイト) です。
オープンソースの CRM ソフトウェアとしては非常に有名なので,CRM に興味のある方なら一度は耳にされたこともあるかと思います。CRM に全く関わったことがない私も,名前だけは知っていました。
基本情報
-
公式サイト
http://www.sugarcrm.com/
(日本語サイト: http://www.sugarcrm.com/jp/micro) -
ソースコード
https://github.com/sugarcrm/sugarcrm_dev
実はソースコードの zip ファイルが ここ からダウンロードできるのですが,SCM (Source Code Management: ソースコード管理) ツールを使いたかったので,GitHub から取得しました。 -
参考情報
手順の概要は以下の通りです。
- ソースコードの取得
- Cloud Foundry 環境へのプッシュ
- Install Wizard の実行
- 動作確認(1)
- 再起動後もインストール前の状態に戻らないようにする
- 動作確認(2)
ソースコードの取得
$ git clone https://github.com/sugarcrm/sugarcrm_dev.git
$ cd sugarcrm_dev
Cloud Foundry 環境へのプッシュ
SugarCRM を Cloud Foundry 上で動かす際のポイントは
- 新しい PHP Buildpack (v3.0.4以降) を使う
- PHP 拡張モジュールを追加する
- Apache モジュールを追加する
の3点です。
- 新しい PHP buildpack (v3.0.4以降) を使う
今回検証に利用した v194 環境に標準で入っている PHP buildpack は v1.0.2 なのですが,Cloud Foundry の PHP buildpack は v3.0.4 で大幅なアーキテクチャ変更が入って一新されました。以下に述べる PHP 拡張モジュールや Apache モジュールを追加する機能を利用するために,今回は GitHub 上にある新しい buildpack の URL を指定して使います。
なお,v3.0.4 の PHP buildpack は,cf-release v201 で標準添付されるようになったので,最新版の Cloud Foundruy ではこの点を特に気にする必要はありません。
- PHP 拡張モジュールを追加する
今回利用する PHP buildpack では, .bp-config/options.json
というファイルを利用して PHP 拡張モジュールを追加できます。SugarCRM に必要な拡張モジュールについては, http://www.sugaruser.jp/Documentation/installation_and_upgrade_guide#PHP などを参考にしました。
- Apache モジュールを追加する
今回利用する PHP buildpack では, .bp-config/httpd/extra/
以下に httpd-*.conf
を置くことで, Apache の設定をカスタマイズできます。標準では SugarCRM に必要な mod_alias
が入っていなかったので,.bp-config/httpd/extra/httpd-modules.conf
を使って mod_alias
を有効にしました。
以上を踏まえて,SugarCRM を Cloud Foundry 上で起動させるまでの手順を見ていきます。
PHP 拡張モジュールの追加
アプリのトップ・ディレクトリーに .bp-config
ディレクトリーを作り,そこに以下の内容の options.json
ファイルを置きます。
$ mkdir .bp-config
$ emacs .bp-config/options.json
..
$ git diff -- .bp-config/options.json
diff --git a/.bp-config/options.json b/.bp-config/options.json
new file mode 100644
index 0000000..7384d69
--- /dev/null
+++ b/.bp-config/options.json
@@ -0,0 +1,3 @@
+{
+ "PHP_EXTENSIONS": ["mbstring", "zip", "mysql", "mysqli", "gd", "openssl", "bz2", "zlib", "curl", "mcrypt"]
+}
Apache モジュールの追加
http://docs.cloudfoundry.org/buildpacks/php/gsg-php-config.html#engine-configurations を参考に,このファイル を .bp-config/httpd/extra/httpd-modules.conf
に置いて,以下の変更を実施します。
$ mkdir -p .bp-config/httpd/extra/
$ cp ../php-buildpack/defaults/config/httpd/2.4.x/extra/httpd-modules.conf
$ emacs .bp-config/httpd/extra/httpd-modules.conf
..
$ git diff -- .bp-config/httpd/extra/httpd-modules.conf
diff --git a/.bp-config/httpd/extra/httpd-modules.conf b/.bp-config/httpd/extra/httpd-modules.conf
index 76f2c4c..1590421 100644
--- a/.bp-config/httpd/extra/httpd-modules.conf
+++ b/.bp-config/httpd/extra/httpd-modules.conf
@@ -111,4 +111,4 @@ LoadModule rewrite_module modules/mod_rewrite.so
#LoadModule actions_module modules/mod_actions.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule userdir_module modules/mod_userdir.so
-#LoadModule alias_module modules/mod_alias.so
+LoadModule alias_module modules/mod_alias.so
mod_alias
の行のコメントアウトを外すだけです。
アプリのプッシュ
$ cf push sugar -b https://github.com/cloudfoundry/php-buildpack.git --no-start
GitHub 上の PHP buildpack を使うようオプションを指定して,アプリをプッシュ します。この後 MySQL サービスを作成してバインドするので,この時点ではアプリが起動しないよう --no-start
を付けておきます。
MySQL サービスの作成とバインド
SugarCRM の標準では,データベースとして MySQL を使うようです。そこで MySQL サービスを作成し,SugarCRM アプリにバインドします。
$ cf create-service p-mysql 100mb-dev my4sugar
Creating service instance my4sugar in org nota-ja / space 100 as nota-ja...
OK
$ cf bind-service sugar my4sugar
Binding service my4sugar to app sugar in org nota-ja / space 100 as nota-ja...
OK
TIP: Use 'cf restage sugar' to ensure your env variable changes take effect
アプリの起動
アプリを起動する準備が整ったので,起動します。
$ cf start sugar
..
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: sugar.10.244.0.34.xip.io
last uploaded: Thu Jun 18 02:04:17 +0000 2015
stack: lucid64
state since cpu memory disk details
#0 running 2015-06-18 11:05:41 AM 0.0% 44.7M of 256M 0 of 1G
無事起動しました。
Install Wizard の実行
SugarCRM では,初回起動時に Install Wizard が走り,DB接続等の設定を行います。
この記事はあくまで SugarCRM を Cloud Foundry 上で動かすことが主眼であり,SugarCRM 自体のの解説は目的外なので,全ての手順について詳細な説明は省略し,幾つかポイントとなる画面のみを取り上げることにします。
初期画面
Install Wizard 実行前の注意
(略)
ライセンス同意
なぜかライセンスが表示されないのですが, ここ で確認済みなので,【I Accept】にチェックを入れて【Next】をクリックします。
なお,ここでエラーが出る場合は,必須 PHP 拡張モジュールが不足している可能性があります。
インストール・タイプの選択
【Typical Install】を選んで【Next】をクリックします。
データベース選択
MySQL一択です。
DB接続情報入力
この画面では,さきにバインドした MySQL サービスの接続情報に基づいて入力を行います。
MySQL サービスの接続情報は, cf env <アプリ名>
で表示される VCAP_SERVICES
の中に入っています:
$ cf env sugar
..
"VCAP_SERVICES": {
"p-mysql": [
{
"credentials": {
"hostname": "10.244.1.18",
"jdbcUrl": "jdbc:mysql://10.244.1.18:3306/cf_9c38e266_aad4_4c4d_b608_065648fd22f3?user=jfca0SfmmSh8c6TI\u0026password=UWE5ae2yK6znh0VN",
"name": "cf_9c38e266_aad4_4c4d_b608_065648fd22f3",
"password": "UWE5ae2yK6znh0VN",
"port": 3306,
"uri": "mysql://jfca0SfmmSh8c6TI:UWE5ae2yK6znh0VN@10.244.1.18:3306/cf_9c38e266_aad4_4c4d_b608_065648fd22f3?reconnect=true",
"username": "jfca0SfmmSh8c6TI"
},
"label": "p-mysql",
"name": "my4sugar",
"plan": "100mb-dev",
"tags": [
"mysql"
]
}
]
}
..
入力が終わって【Next】をクリックすると,「DBが既にあるので,中身を初期化するがいいか?」と尋ねるダイアログが出てくるので,【I Accept】をクリックします。指定した名前のDBが存在しない場合は新たにDBを作成してくれるようですが,Cloud Foundry の MySQL サービスの場合,常にDB作成済みの状態でアプリに渡されるので,処理の流れとしては必ずこうなります。
初期管理者のパスワード設定
(略)
設定確認画面
【Install】を押して先に進むと,セットアップ成功画面が表示されます:
ここで【Next】を押してエラーが出る場合,Apache のモジュールの設定に失敗している可能性があります。
製品登録(optional)画面
Optional ということで,何も入力せず次へいきます。するとついに最初のログイン画面に進みます。
動作確認(1)
引き続きログインして動作確認を行います。
SugarCRM では,管理者/ユーザーの最初のログイン時には Admin Wizard, User Wizard を通る必要があるようです。
最初のログイン画面
先ほど「初期管理者のパスワード設定」で入力したユーザー名/パスワードを入力してログインします。
Admin Wizard 画面
面倒なので【Skip】します。
ユーザー情報入力画面
(略)
Locale 設定画面
(略)
User Wizard 最終画面
これを終わると,ようやく使い始めの画面になります。
ログイン後のトップ画面
画面上に赤い文字で記述されている注記は,SMTP サーバーが設定されていないために出ているものです。今回はメイルを送るつもりはなかったので気にしないことにしました。
この後,ユーザー管理画面で一般ユーザーを作ったり(メイル送信が必要になったので,既存の SMTP サーバーを設定して試しました),作った一般ユーザーでログインしたりもしましたが,そのあたりは割愛させていただきます。
再起動後もインストール前の状態に戻らないようにする
通常ならここで終わりですが,今回はもう一歩踏み込んでみます。
SugarCRM は Install Wizard や User Wizard で設定した情報をローカルファイルに持っているため,再起動するとセットアップからやり直しになります。つまり(事実上)継続的には使えません。
そこで今回,これら Wizard で設定した情報が入っているファイルを取得・保存し,コードと一緒に再度プッシュすることで,再起動後もそれまで通り使い続けられるようにすることにトライしてみました。
アプリのリポジトリーのトップ・ディレクトリーは,今回使った PHP buildpack では,app/htdocs/
というディレクトリーに展開されます。そこで,この2つのディレクトリーを比較し,増えたファイルが以下であることを特定しました。
- .htaccess
- config.php
- config_override.php
- install.log
このうち,ログは不要であろうと判断し,残り3つのファイルを Cloud Foundry 環境からローカルに持ってきます:
$ cf files sugar app/htdocs/.htaccess
..
$ cf files sugar app/htdocs/config.php
..
$ cf files sugar app/htdocs/config_override.php
..
ファイルの内容が端末に表示されるので,コピーして同名のファイルに保存します。
$ ls -1a
..
.htaccess
..
config.php
config_override.php
..
この状態でアプリを再度プッシュします。
$ cf push sugar
Updating app sugar in org nota-ja / space 100 as nota-ja...
OK
.......
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: sugar.10.244.0.34.xip.io
last uploaded: Tue Jun 23 04:22:19 +0000 2015
stack: lucid64
state since cpu memory disk details
#0 running 2015-06-23 01:23:44 PM 0.0% 44.5M of 256M 0 of 1G
問題なく起動しました。
動作確認(2)
再起動直後の画面
Install Wizard / User Wizard を通ることなくログイン画面に到達しました。
ログイン直後の画面
再起動前に設定した admin ユーザーでログインしてみると,
問題なくログインできて,前回の続きから使うことができました。
今回使用したソフトウェア
- cf-release (v194)
https://github.com/cloudfoundry/cf-release/tree/v194
( https://github.com/cloudfoundry/cf-release/tree/345a8b3e1ea0005a3e9fced13f0bf6fa6f7ad981 ) - bosh-lite
https://github.com/cloudfoundry/bosh-lite/tree/01db9da7b4122f7d02858d92e0fe938e91256649 - CF CLI (v6.11.3-cebadc9-2015-05-20T19:00:58+00:00)
https://github.com/cloudfoundry/cli/releases/tag/v6.11.3 - php-buildpack
https://github.com/cloudfoundry/php-buildpack/tree/6c5d638e7800938e8b086900548cb36a81c752b0 - cf-mysql-release (v16)
https://github.com/cloudfoundry/cf-mysql-release/tree/v16
( https://github.com/cloudfoundry/cf-mysql-release/tree/63f0bc3914914ce469c80df07c9fa49c5b836f11 ) - SugarCRM
https://github.com/sugarcrm/sugarcrm_dev/tree/4af22e0e877bf369e61111a6f537f2cdd3a515bd