2015-06-17

b2evolution を Cloud Foundry で動かす

本日の第10回「Cloud Foundry 百日行」は、b2evolutionです。
多言語複数ユーザー対応のブログb2evolutionはphpで書かれており、加えてMySQL環境が必要となります。

[b2evolution]基本情報

デプロイ

手順

  • 0) 準備
  • 1) アプリの起動
  • 2) DBのインストーラーによる初期設定
  • 3) 動作確認

0.準備

まずはソースコードの取得をしましょう。
github上から取得する場合はこちら
公式サイトからも圧縮ファイルで取得可能。

github上から取得する場合はtagでstable版のものを確認してcheckoutして下さい。
今回は5.2.2のstable版を利用します。

$ git clone https://github.com/b2evolution/b2evolution.git
$ cd b2evolution
$ git tag -l
$ git checkout 5.2.2
b2evolution$ ls
blogs  bower.json  doc  gettext  Gruntfile.js  index.de-DE.html  index.fr-FR.html  index.html  index.pt-BR.html  
index.ru-RU.html  index.src.html  package.json  readme.md  Templates  tests

今回のアプリをデプロイする前に参考サイトにも記載したインストールマニュアルを確認していきます。
手順を簡単にいうと下記の通り

  • 1) ファイルをダウンロードしてblogsディレクトリをFTPでWEBサーバにアップロード
  • 2) MySQLを準備
  • 3) サイト/install/index.phpにアクセスしてDBのインストールを実行

ここで重要となるのはblogsディレクトリ以外のファイルはデプロイに使用しないということと、
DBの初期設定をサイト経由で行うので事前のDBのセットアップが不要であることです

1.アプリの起動

ではCloud Foundry上にアプリをデプロイしてみましょう。

b2evolution$ cd blogs

上記ではまず公式サイトのインストールマニュアルどおりデプロイするblogsディレクトリに移動します。
そしてMySQLの接続情報を得る為に一旦–no-startオプションをつけてアプリをプッシュします。

b2evolution/blogs$ cf push b2evo -b https://github.com/cloudfoundry/php-buildpack.git --no-start

そしてMySQLを準備します。
なお今回利用するMySQLは#003 EtherSheetでも紹介したcf-mysql-releaseを利用します。

b2evolution/blogs$ cf marketplace

service      plans                     description   
p-mysql      100mb-dev, 1gb-dev        A MySQL service for application development and testing   

b2evolution/blogs$ cf create-service p-mysql 100mb-dev b2evodb
b2evolution/blogs$ cf bind-service b2evo b2evodb
b2evolution/blogs$ cf env b2evo
System-Provided:
{
 "VCAP_SERVICES": {
  "p-mysql": [
   {
    "credentials": {
     "hostname": "10.244.1.18",
     "jdbcUrl": "jdbc:mysql://10.244.1.18:3306/cf_a40fd514_30ba_427a_87c0_e413f61d21e2?user=0AmHUBPfncwD7MKp\u0026password=kcCByptiOfyqavRC",
     "name": "cf_a40fd514_30ba_427a_87c0_e413f61d21e2",
     "password": "kcCByptiOfyqavRC",
     "port": 3306,
     "uri": "mysql://0AmHUBPfncwD7MKp:kcCByptiOfyqavRC@10.244.1.18:3306/cf_a40fd514_30ba_427a_87c0_e413f61d21e2?reconnect=true",
     "username": "0AmHUBPfncwD7MKp"
    },
    "label": "p-mysql",
    "name": "b2evodb",
    "plan": "100mb-dev",
    "tags": [
     "mysql"
    ]
   }
  ]
 }
:

(参考)上記コマンドは以下の通り。

  • cf marketplace) MySQLが利用できる環境なのか、planとして何が提供されているかの確認
  • cf create-service <利用するサービス名> <プラン名> <作成するサービスに付与する名前>) サービスの作成
  • cf bind-service <アプリ名> <サービス名>) アプリとサービスの関連付け
  • cf env <アプリ名>) 環境情報

ここまで準備が出来たら今回はバインドしたサービスの接続情報を環境変数でアプリに受け渡す為の編集を行います。

このアプリはデプロイ後にDB初期設定においてMySQLへの接続情報をブラウザから入力することになるのですが、その際の接続情報の初期値はconf/_basic_config.phpから渡されています。
そこで下記の方法でファイルを編集し接続情報を受け渡します。

以下はMySQLの接続情報を各変数に入力している箇所の後に環境変数から取得した値を上書きする設定を追記しています。

b2evolution/blogs$ cp conf/_basic_config.template.php conf/_basic_config.php
b2evolution/blogs$ vi conf/_basic_config.php
b2evolution/blogs$ diff conf/_basic_config.template.php conf/_basic_config.php 
61a62,69
> $services = getenv("VCAP_SERVICES");
> $services_json = json_decode($services,true);
> $mysql_config = $services_json["p-mysql"][0]["credentials"]; 
> 
> $db_config['user'] = $mysql_config["username"];
> $db_config['password'] = $mysql_config["password"];
> $db_config['name'] = $mysql_config["name"];
> $db_config['host'] = $mysql_config["hostname"];

上記の追記した箇所は環境により少し違う箇所があるので”cf envの出力結果”にあわせて下さい。

ここまで出来たら次に.bp-config/options.jsonを作成します。

b2evolution/blogs$ mkdir .bp-config/
b2evolution/blogs$ vi .bp-config/options.json
{
    "PHP_EXTENSIONS": ["mysql"]
}

これは今回利用しているPHP Buildpackのオプション設定用ディレクトリと設定ファイルになります。

実はこの作業についてはエラーの先回り対処になっています。
このファイルを作成せずに進むとPHPにMySQLのモジュールが読み込まれていない状態となりDBの初期設定時にエラーが発生します。

MySQL error!
The PHP MySQL module could not be loaded.
Error: dl(): Dynamically loaded extensions aren't enabled
You probably have to edit your php configuration (php.ini) and enable this module (mysql.so).
Do not forget to restart your webserver (if necessary) after editing the PHP conf.

その為、PHPにMySQLモジュールの追加する対応を行っています。

ここまで来たら再度ファイルをプッシュするだけです。

b2evolution/blogs$ cf push b2evo -b https://github.com/cloudfoundry/php-buildpack.git

:
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: b2evo.10.244.0.34.xip.io
last uploaded: Mon Jun 15 06:46:54 +0000 2015
stack: lucid64

     state     since                    cpu    memory          disk      details   
#0   running   2015-06-15 03:51:52 PM   0.0%   27.3M of 256M   0 of 1G      

上記のようなログが見えればデプロイ成功です。

2.DBのインストーラーによる初期設定

b2evo.10.244.0.34.xip.ioにブラウザでアクセスしてみます。

インストールの実行を促されるのでメッセージのいちばん下にあるhereいずれか(どちらも同じところに転送されます)をクリックします。

ここで設定したMySQLの環境変数がうまくとれていれば_basic_config.phpの設定は成功です。
とれていない場合は再度編集し直してアプリをデプロイし直すか、あきらめてcf envの情報を手入力して下さい。

問題なければ”Update config file”ボタンをクリックします。

ここでは初期設定なので”New install”を選択し”Go!”をクリックします。

ここでエラーが発生します。

実はこの画面ではいくつかの設定のチェックを行うプロセスが設定されており、そのうちの一つにアプリのURLに外部(Internet上)からアクセス可能なのかを自動チェックする機能が入っています。しかしbosh-lite環境はプライベートIPアドレス(10.*.*.*)を利用しているので外部からのアクセスが出来ずにエラーが返されてしまいます。
これについては正しく外部からアクセスできるCloudFoundry環境であればエラーが発生しないことが確認できている為、今回のbosh-lite環境ではエラーを無視して進めます。

次は “Continue installation»” をクリックします。

DBの初期設定が動き出します。

login情報が表示されたら完了です。

3.動作確認

管理画面にアクセスしましょう。
先のログイン情報の上にある”login”をクリックして管理画面に入ります。

好きなように設定してみて下さい。
その後、再度b2evo.10.244.0.34.xip.ioにブラウザでアクセスしてみます。

ちゃんとブログが出来上がっています。
好きな言語で構築できるようなので試してみて下さい。

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