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

2015-07-21

Simple Machines Forum を Cloud Foundry で動かす

「Cloud Foundry 百日行」第33日目は,PHP 製の BBS アプリ Simple Machines Forum です。 AlternativeTo で見ると,同種の OSS の中では比較的人気が高いもののようです。開発も活発に継続しているようで,最新安定版が今年(2015年)の4月に出ています。

基本情報

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

  • 1) ソースコードの取得・展開
  • 2) PHP 拡張の設定
  • 3) データベース・サービスの作成・バインドとアプリのプッシュ
  • 4) インストール・ウィザード
  • 5) 動作確認
  • 6) 初期設定の保存&動作確認

1. ソースコードの取得・展開

$ wget http://download.simplemachines.org/index.php/smf_2-0-10_install.tar.bz2
$ mkdir smf
$ cd smf
$ tar xjf ../smf_2-0-10_install.tar.bz2

落としてきた tarball は,展開すると今居るディレクトリーにファイルが展開されるので要注意です。あらかじめ空のディレクトリーを作り,そこに移動してから展開するほうが良いと思います。

2. PHP 拡張の設定

http://wiki.simplemachines.org/smf/SMF2.0:Requirements_and_recommendations を参考に,必要な PHP 拡張を .bp-config/options.json に記していきます。この作業については,以前 別の PHP アプリ の記事でも書いたので,詳細はそちらをご覧ください。

今回の options.json は,けっきょく以下のようになりました。

$ cat .bp-config/options.json
{
    "PHP_EXTENSIONS": ["mysql", "mysqli", "gd", "mbstring"]
}

データベースとして MySQL を使うのでそれ関係の拡張を追加し,上記のドキュメントに GD が必要と書かれていたのでそれも追加,さらに日本語の入力にたぶん必要だろうということで Multibyte String の拡張も追加しました。

3. データベース・サービスの作成・バインドとアプリのプッシュ

いよいよ Cloud Foundry 上の操作に入っていきます。

まずはデータベース・サービスの作成です。 この文書 によると,本アプリは MySQL, PostgreSQL, SQLite に対応しているということですが,PHP と組み合わせるなら安定の MySQL だろうということで MySQL にします。

$ cf create-service p-mysql 100mb my4smf
Creating service instance my4smf in org nota-ja / space 100 as nota-ja...
OK

次に,アプリを停止状態で Cloud Foundry にプッシュします。

$ cf push smf --no-start
Creating app smf in org nota-ja / space 100 as nota-ja...
OK
..
Done uploading
OK

アプリと MySQL サービスをバインドします。

$ cf bind-service smf my4smf
Binding service my4smf to app smf in org nota-ja / space 100 as nota-ja...
OK
TIP: Use 'cf restage smf' to ensure your env variable changes take effect

アプリを起動すると,ステージングが行われてアプリが起動します。

$ cf start smf
Starting app smf in org nota-ja / space 100 as nota-ja...
..
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: smf.10.244.0.34.xip.io
last uploaded: Thu Jul 16 12:01:44 UTC 2015
stack: cflinuxfs2
buildpack: PHP

     state     since                    cpu    memory          disk      details
#0   running   2015-07-16 09:02:34 PM   1.5%   31.8M of 256M   0 of 1G

無事起動しました。

4. インストール・ウィザード

起動後の最初の画面はこうなっています。

PHP のアプリではおなじみのインストール・ウィザードです。
以下,全て説明するのは面倒なので,キーになる画面だけ解説します。

【Step 3】で,データベース接続情報の入力を求められますので,先ほどバインドしたサービスの情報を cf env で取得して入力します。

$ cf env smf
Getting env variables for app smf in org nota-ja / space 100 as nota-ja...
OK

System-Provided:
{
 "VCAP_SERVICES": {
  "p-mysql": [
   {
    "credentials": {
     "hostname": "10.244.7.6",
     "jdbcUrl": "jdbc:mysql://10.244.7.6:3306/cf_06aed91b_25f5_46b8_a13b_5b683325cec9?user=8kV9FdQJsJ6pX60R\u0026password=woXGzdBNGf7mQGhg",
     "name": "cf_06aed91b_25f5_46b8_a13b_5b683325cec9",
     "password": "woXGzdBNGf7mQGhg",
     "port": 3306,
     "uri": "mysql://8kV9FdQJsJ6pX60R:woXGzdBNGf7mQGhg@10.244.7.6:3306/cf_06aed91b_25f5_46b8_a13b_5b683325cec9?reconnect=true",
     "username": "8kV9FdQJsJ6pX60R"
    },
    "label": "p-mysql",
    "name": "my4smf",
    "plan": "100mb",
    "tags": [
     "mysql"
    ]
   }
  ]
 }
}
..

【Step 4】の【Forum URL】には,Cloud Foundry 上にデプロイしたアプリのURLを入力してください。

【Step 6】でもデータベース・パスワードの入力を求められますが,【Step 3】と同じ値を入れればOKです。

5. 動作確認

インストール・ウィザードの設定が正常に終わると,そこで入力した admin account でログインした状態でトップ画面に遷移します。

【General Discussion】をクリックすると,最初の投稿として Welcome メッセージが投稿されている状態になっています。

最初の投稿を読んで,返信を書いてみました。

日本語も問題ありません。

6. 初期設定の保存&動作確認

単に動かしてみるだけならここまでで良いのですが,使い続けることを考えて, SugarCRM の時 と同様,初期設定ファイルをダウンロードして保存し,プッシュ時に一緒にアップロードすることで設定の再初期化を避けることを試みます。

今回は app/htdocs/Settings.php に設定が保存されているようなので,これをダウンロードして保存します。

$ cf files smf app/htdocs/Settings.php

内容をファイルに保存して差分を取ると,先ほど入力した値が見えるので,これで間違いないようです。

$ git diff
diff --git a/Settings.php b/Settings.php
index 7a8ae98..2bc786c 100644
--- a/Settings.php
+++ b/Settings.php
@@ -18,18 +18,18 @@ $mtitle = 'Maintenance Mode';               # Title for the Maintenance Mode message.
 $mmessage = 'Okay faithful users...we\'re attempting to restore an older backup of the database...news will be

 ########## Forum Info ##########
-$mbname = 'My Community';              # The name of your forum.
+$mbname = 'Cloud Foundry';             # The name of your forum.
 $language = 'english';         # The default language file set for the forum.
-$boardurl = 'http://127.0.0.1/smf';            # URL to your forum's folder. (without the trailing /!)
-$webmaster_email = 'noreply@myserver.com';             # Email address to send emails from. (like noreply@yourd
-$cookiename = 'SMFCookie11';           # Name of the cookie to set for authentication.
+$boardurl = 'http://smf.10.244.0.34.xip.io';           # URL to your forum's folder. (without the trailing /!)
+$webmaster_email = '3bgmhc@ahk.jp';            # Email address to send emails from. (like noreply@yourdomain.co
+$cookiename = 'SMFCookie67';           # Name of the cookie to set for authentication.

 ########## Database Info ##########
 $db_type = 'mysql';
-$db_server = 'localhost';
-$db_name = 'smf';
-$db_user = 'root';
-$db_passwd = '';
+$db_server = '10.244.7.6';
+$db_name = 'cf_06aed91b_25f5_46b8_a13b_5b683325cec9';
+$db_user = '8kV9FdQJsJ6pX60R';
+$db_passwd = 'woXGzdBNGf7mQGhg';
 $ssi_db_user = '';
 $ssi_db_passwd = '';
 $db_prefix = 'smf_';
@@ -38,18 +38,14 @@ $db_error_send = 1;

 ########## Directories/Files ##########
 # Note: These directories do not have to be changed unless you move things.
-$boarddir = dirname(__FILE__);         # The absolute path to the forum's folder. (not just '.'!)
-$sourcedir = dirname(__FILE__) . '/Sources';           # Path to the Sources directory.
-$cachedir = dirname(__FILE__) . '/cache';              # Path to the cache directory.
+$boarddir = '/home/vcap/app/htdocs';           # The absolute path to the forum's folder. (not just '.'!)
+$sourcedir = '/home/vcap/app/htdocs/Sources';          # Path to the Sources directory.
+$cachedir = '/home/vcap/app/htdocs/cache';             # Path to the cache directory.

 ########## Error-Catching ##########
 # Note: You shouldn't touch these settings.
 $db_last_error = 0;

-if (file_exists(dirname(__FILE__) . '/install.php'))
-{
-       header('Location: http' . (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on' ? 's' : ''
-}

 # Make sure the paths are correct... at least try to fix them.
 if (!file_exists($boarddir) && file_exists(dirname(__FILE__) . '/agreement.txt'))
@@ -59,4 +55,5 @@ if (!file_exists($sourcedir) && file_exists($boarddir . '/Sources'))
 if (!file_exists($cachedir) && file_exists($boarddir . '/cache'))
        $cachedir = $boarddir . '/cache';

-?>
\ No newline at end of file
+$db_character_set = 'utf8';
+?>

さらに, install.php を削除します。

$ git rm install.php
rm 'install.php'

これを削除しないと,再起動後にアプリにアクセスした後,警告付きで再初期化しようとしたり,トップ画面に警告が表示されたりすることがあります。

この状態でアプリを更新します。

$ cf push smf
Updating app smf in org nota-ja / space 100 as nota-ja...
OK
..
     state     since                    cpu    memory          disk      details
#0   running   2015-07-17 10:25:43 PM   1.6%   31.7M of 256M   0 of 1G

再ステージング・再起動が行われますが,ブラウザーのトップ画面をリロードしても,インストール・ウィザードは実行されませんでした。

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