オープンソースのPaaSソフトウェア CloudFoundry の技術情報やイベント告知などを掲載します

2015-07-07

SugarCRM を Cloud Foundry で動かす

「Cloud Foundry 百日行」第24日目は,PHP製の CRM (Customer Relationship Management) ソフトウェア SugarCRM (日本語サイト) です。

オープンソースの CRM ソフトウェアとしては非常に有名なので,CRM に興味のある方なら一度は耳にされたこともあるかと思います。CRM に全く関わったことがない私も,名前だけは知っていました。

基本情報

手順の概要は以下の通りです。

  1. ソースコードの取得
  2. Cloud Foundry 環境へのプッシュ
  3. Install Wizard の実行
  4. 動作確認(1)
  5. 再起動後もインストール前の状態に戻らないようにする
  6. 動作確認(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 ユーザーでログインしてみると,

問題なくログインできて,前回の続きから使うことができました。

今回使用したソフトウェア