本日の第37回「Cloud Foundry 百日行」は、PHP 製のドキュメント管理アプリ OpenDocMan です。
基本情報
はじめに
本日のアウトラインは以下の通りです。
- 手順の確認とソースコードの取得
- MySQL DB の作成
- SQL Buddy を使ったデータ登録(および編集)
config.php
の作成- その他デプロイ前の準備
- Cloud Foundry へデプロイ
- 動作確認
- まとめ
1. 手順の確認とソースコードの取得
こちらの手順 を踏まえてデプロイしていきます。
Requirements については、まずは Cloud Foundry 環境にお任せとして、 5 Minute Install のポイントを確認してみると、以下のようになっています。
- ソースコードの取得
- MySQL DB の作成
- データ格納用フォルダの作成
- データ格納用フォルダへのアクセス権限設定
- 必要に応じて Web サーバの権限設定
- ソフトウェアのデプロイ
- OpenDocMan をアクセスする URL のルートで使いたい場合は、ソフトウェアを Web サーバのルートディレクトリに配置
- サブディレクトリを切って使いたい場合は、Web サーバのルートディレクトリ直下にそのディレクトリを作成して、ソフトウェアを配置
templates_c
ディレクトリが書き込み可能になっているか確認
- ブラウザから OpenDocMan にアクセスし、インストールスクリプトを実行
- インストールスクリプト実行の中で、必要情報をフォームに入力
- 最後のページにて、”New installation…” のリンクをクリックして初期設定実施
5番の Web サーバ設定については、Cloud Foundry 環境にお任せとしましょう。
6番のデプロイについては、アプリのルートディレクトリから直接 Cloud Foundry へプッシュ、といういつもの手順を考えます。
では何はともあれ、まずは最初の手順、ソースコードを取得し、中身を確認していきましょう。
~$ wget http://sourceforge.net/projects/opendocman/files/opendocman/1.3.2/opendocman-1.3.2.tar.gz
~$ tar xzvf opendocman-1.3.2.tar.gz
~$ cd opendocman-1.3.2/
~/opendocman-1.3.2$ ls
AccessLog_class.php classHeaders.php Department_class.php file_ops.php includes odm-header.php reports udf_help.html
access_log.php class.tree department.php FileTypes_class.php index.php odm-init.php Reviewer_class.php udf.php
add.php config-sample.php Dept_Perms_class.php filetypes.php in.php odm-load.php search.php User_class.php
admin.php CONTRIBUTING.md details.php forgot_password.php install out.php Settings_class.php UserPermission_class.php
ajax_udf.php COPYING docs FormCheck.js ldap.inc Plugin_class.php settings.php User_Perms_class.php
Category_class.php CREDITS.txt edit.php functions.js LICENSE.txt plug-ins signup.php user.php
category.php crumb.php Email_class.php functions.php linkcontrol.css profile.php templates version.php
check_exp.php databaseData_class.php error.php help.html logout.php README templates_c view_file.php
check-in.php database.sql File_class.php history.php magic README.md toBePublished.php view.php
check-out.php delete.php FileData_class.php images mimetypes.php rejects.php udf_functions.php
index.php
を開いてみると、以下のようにあります。
~/opendocman-1.3.2$ cat index.php
:
if(!file_exists('config.php'))
{
if (
!extension_loaded('pdo')
|| !extension_loaded('pdo_mysql')
) {
echo "<p>PHP pdo Extensions not loaded. <a href='./'>try again</a>.</p>";
exit;
}
// A config file doesn't exist
?>
<html><head><link rel="stylesheet" href="templates/common/css/install.css" type="text/css" /></head>
<body>Looks like this is a new installation because we did not find a config.php file. We need to create a config.php file now: <p><a href="install/setup-config.php" class="button">Create a Configuration File</a></p></body>
</html>
<?php
exit;
}
:
上のソースファイルで参照されている config.php
ですが、本来は上記の手順の7〜9で作成されるようです。
今回はあらかじめ config.php
ファイルを作成しておき、デプロイが完了した時点でアプリが利用可能になるような修正を行いました。
また、後々余分な初期設定スクリプト等を走らせないために、 install
ディレクトリ自体は削除 or リネームしておきます。
また上記から、 pdo
と pdo_mysql
の PHP 拡張モジュールのロードが必要になるようにコーディングされているので、デプロイ前にこれらの設定もしておきましょう。
database.sql
は SQL のスクリプトで、DB 対して実行して、データを流し込む必要があるようです。
DB へのデータの初期登録の方法はいくつかありますが、今回は、 SQL Buddy を使うことにします。
上記の手順にあった templates_c
ディレクトリの権限設定もそのままで大丈夫そうです。
これらを加味して、Cloud Foundry へデプロイするための計画手順を今一度整理すると、以下のようになります。
(Cloud Foundryへデプロイする際の手順)
- ソースコードの取得(済み)
- MySQL DB の作成
- SQL Buddy を使ったデータ登録(および編集)
config.php
の作成install
ディレクトリの削除(リネーム)- データ格納用フォルダの作成とアクセス権限設定
- PHP 拡張モジュール設定
- Cloud Foundry へデプロイ
2. MySQL DB の作成
上記の手順の2番から進めていきましょう。
まずはアプリを --no-start
で push しておいてから、MySQL サービスを作成し、そして、アプリとそのサービスをバインド、といつもの手順で進めていきます。
~/opendocman-1.3.2$ cf push opendocman --no-start
~/opendocman-1.3.2$ cf create-service p-mysql 100mb odm-msql
~/opendocman-1.3.2$ cf bind-service opendocman odm-msql
3. SQL Buddy を使ったデータ登録(および編集)
先ほどアプリとバインドした DB にアクセスして操作するために、別アプリとして SQL Buddy をデプロイします。
デプロイ手順は、 百日行第17回の記事 に詳しいので、そちらをご参照ください。ただし、SQL Buddy と MySQL サービスとのバインドは、今回は必要ありませんので、実行不要です。
SQL Buddy がデプロイできたら、それを使って、前章で作成した MySQL DB にアクセスしますが、そのためには、その DB に関する “Host”、”Username”、”Password” の各情報が必要です。
その情報取得のため、 opendocman
アプリの環境変数を確認します。
~/opendocman-1.3.2$ cf env opendocman
Getting env variables for app opendocman in org ueno / space test1 as ueno...
:
System-Provided:
{
"VCAP_SERVICES": {
"p-mysql": [
{
"credentials": {
"hostname": "10.244.7.6",
"jdbcUrl": "jdbc:mysql://10.244.7.6:3306/cf_d044277f_8a28_49ce_b13e_271929e7af23?user=OoCb8001U9wpFegv\u0026password=Cn6Wl14YTlpFQk6Z",
"name": "cf_d044277f_8a28_49ce_b13e_271929e7af23",
"password": "Cn6Wl14YTlpFQk6Z",
"port": 3306,
"uri": "mysql://OoCb8001U9wpFegv:Cn6Wl14YTlpFQk6Z@10.244.7.6:3306/cf_d044277f_8a28_49ce_b13e_271929e7af23?reconnect=true",
"username": "OoCb8001U9wpFegv"
},
"label": "p-mysql",
"name": "odm-msql",
"plan": "100mb",
"tags": [
"mysql"
]
}
]
}
}
:
上記の "hostname"
、 "username"
、 "password"
の各値を用いて、SQL Buddy にログインします。
database.sql
をこの SQL Buddy を使って読み込ませ、DB に対して実行させますが、 SQL Buddy は、ブラウザが動いている環境のローカルファイルしか読んでくれないため、 database.sql
をあらかじめその環境にコピーしておきましょう。
ログインしたら、初期画面の左側に当該の DB 名(上記の "name"
の値)が表示されているはずですから、それをクリックします。
そして、画面上段にある “Import” のリンクをクリックし、「ファイルを選択」をクリックし、 database.sql
を読み込ませます。
“Submit” をクリックすることで、スクリプトが実行されて、DB 内に各テーブルが作成され、値が入っていきます。
実行後に DB の画面を確認すると、以下のようになっています。

続いて、アプリ起動のために必要な登録データの修正を、この SQL Buddy 上で行います。
上記画面の中に表示されている表の中の odm_settings
の右側に付いている “→” をクリックします。
以下の画面となりました。

上記画面に表示されている設定項目の中で、 dataDir
と base_url
の値を今回の環境に合わせて修正する必要があります。
それぞれ、 /home/vcap/app/htdocs/data
、 http://opendocman.10.244.0.34.xip.io
を登録し、以下のようになりました。

4. config.php
の作成
続いての手順は、 config.php
の作成です。
元のファイルは、 config-sample.php
として用意されていますので、それをコピーして編集します。
~/opendocman-1.3.2$ cp -p config-sample.php config.php
このファイル内の DB 設定について、VCAP_SERVICES 環境変数から DB 接続情報を取得して、動的に DB 接続させるため、以下の修正を加えました。
~/opendocman-1.3.2$ vi config.php
~/opendocman-1.3.2$ diff config-sample.php config.php
20a21,24
> $vcap = getenv("VCAP_SERVICES");
> $vcap_json = json_decode($vcap,true);
> $mysql_config = $vcap_json["p-mysql"][0]["credentials"];
>
30c34
< define('DB_NAME', 'database_name_here');
---
> define('DB_NAME', $mysql_config["name"]);
33c37
< define('DB_USER', 'username_here');
---
> define('DB_USER', $mysql_config["username"]);
36c40
< define('DB_PASS', 'password_here');
---
> define('DB_PASS', $mysql_config["password"]);
41c45
< define('DB_HOST', 'localhost');
---
> define('DB_HOST', $mysql_config["hostname"]);
5. その他デプロイ前の準備
Cloud Foundry へデプロイする前に残りの必要な手順 5〜7番を片付けてしまいましょう。
まず、 install
ディレクトリをリネームし、アプリへのアクセス時に参照されないようにします。
~/opendocman-1.3.2$ mv install install.org
次に、データ格納用フォルダ data
を作成し、手順 通りに chmod
しておきます。
~/opendocman-1.3.2$ mkdir data
~/opendocman-1.3.2$ ls -ld data
drwxrwxr-x 2 ueno ueno 4096 Jul 23 11:52 data
~/opendocman-1.3.2$ chmod 770 data
~/opendocman-1.3.2$ ls -ld data
drwxrwx--- 2 ueno ueno 4096 Jul 23 11:52 data
そしてこのフォルダ、まだこのままではダメなのです。
実は中身が空っぽなので、Cloud Foundry にプッシュする際にフォルダが消されてしまいます。
なので、このフォルダ内にダミーファイルを作って置いておきましょう。
~/opendocman-1.3.2$ touch data/.keep
そして最後の準備として、PHP 拡張モジュールの設定をして、 pdo
, pdo_mysql
がロードされるようにしておきます。
PHP 拡張モジュールの設定については、これまでの百日行記事でも何度か出てきたので、既におなじみになっていると思いますが、最近では、 第33日目 に出てきてますので、参考にしてください。
~/opendocman-1.3.2$ mkdir .bp-config
~/opendocman-1.3.2$ vi .bp-config/options.json
~/opendocman-1.3.2$ cat .bp-config/options.json
{
"PHP_EXTENSIONS": ["pdo", "pdo_mysql"]
}
6. Cloud Foundry へデプロイ
ようやく準備が整ったので、いよいよデプロイ(再度のプッシュによるアプリ起動)です。
~/opendocman-1.3.2$ cf push opendocman
Updating app opendocman in org ueno / space test1 as ueno...
:
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: opendocman.10.244.0.34.xip.io
last uploaded: Thu Jul 23 04:44:39 UTC 2015
stack: cflinuxfs2
buildpack: PHP
state since cpu memory disk details
#0 running 2015-07-23 01:45:00 PM 1.6% 30.1M of 256M 0 of 1G
デプロイ成功し、ついにアプリが起動しました!
7. 動作確認
http://opendocman.10.244.0.34.xip.io
にアクセス。

“admin” でログインします。

画面上段の “Admin” リンクを辿り、Admin 機能によって、一般ユーザ “taro” を作成して一旦ログアウト。
今後はその “taro” でログインし、このアプリを使って、何かローカルのファイルをアップロードしてみます。
適当なファイルを選択し、フォーム入力し、

そして、”Submit” をクリックすると、

ファイル追加完了のメッセージが出ました。
“Home” に戻って、追加したファイルのリストを確認してみると、

追加したファイルが格納されていることが確認できました。
8. まとめ
今回のアプリのデプロイ手順は、デプロイする前の準備作業が多いことが特徴でした。
それらを大別すると、以下の種類のものでした。
(1) DB の作成とデータ登録
(2) DB 接続設定
(3) フォルダ作成や PHP 拡張モジュール対応等の環境設定
(2) の DB 接続設定は、これまでの記事にもよく出てきましたが、今回も、VCAP_SERVICES 環境変数から情報を読み取ることで、動的な DB 接続を実現させました。
これは、アプリを運用する環境が変わっても、それに動的に対応し、スケールさせるものであり、クラウドネイティブアプリの開発における基本的なテクニックです(クラウドネイティブアプリ開発の方法論として、 Twelve-Factor App をご参照のこと)。
今回使用したソフトウェア
- cf-release (v211)
https://github.com/cloudfoundry/cf-release/tree/v211
( https://github.com/cloudfoundry/cf-release/tree/2121dc6405e0f036efa4dba963f7f49b07e76ffa ) - bosh-lite
https://github.com/cloudfoundry/bosh-lite/tree/552dc6869600c5350eb7ffb4fb9c9c5e79e3889d - CF CLI (v6.12.0-8c65bbd-2015-06-30T00:10:31+00:00)
https://github.com/cloudfoundry/cli/tree/v6.12.0 - cf-mysql-release (v20)
https://github.com/cloudfoundry/cf-mysql-release/tree/v20 - OpenDocMan v1.3.2
http://sourceforge.net/projects/opendocman/files/opendocman/1.3.2/opendocman-1.3.2.tar.gz