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

2015-07-27

OpenDocMan を Cloud Foundry で動かす

本日の第37回「Cloud Foundry 百日行」は、PHP 製のドキュメント管理アプリ OpenDocMan です。

基本情報

はじめに

本日のアウトラインは以下の通りです。

  1. 手順の確認とソースコードの取得
  2. MySQL DB の作成
  3. SQL Buddy を使ったデータ登録(および編集)
  4. config.php の作成
  5. その他デプロイ前の準備
  6. Cloud Foundry へデプロイ
  7. 動作確認
  8. まとめ

1. 手順の確認とソースコードの取得

こちらの手順 を踏まえてデプロイしていきます。
Requirements については、まずは Cloud Foundry 環境にお任せとして、 5 Minute Install のポイントを確認してみると、以下のようになっています。

  1. ソースコードの取得
  2. MySQL DB の作成
  3. データ格納用フォルダの作成
  4. データ格納用フォルダへのアクセス権限設定
  5. 必要に応じて Web サーバの権限設定
  6. ソフトウェアのデプロイ
    • OpenDocMan をアクセスする URL のルートで使いたい場合は、ソフトウェアを Web サーバのルートディレクトリに配置
    • サブディレクトリを切って使いたい場合は、Web サーバのルートディレクトリ直下にそのディレクトリを作成して、ソフトウェアを配置
    • templates_c ディレクトリが書き込み可能になっているか確認
  7. ブラウザから OpenDocMan にアクセスし、インストールスクリプトを実行
  8. インストールスクリプト実行の中で、必要情報をフォームに入力
  9. 最後のページにて、”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 リネームしておきます。

また上記から、 pdopdo_mysql の PHP 拡張モジュールのロードが必要になるようにコーディングされているので、デプロイ前にこれらの設定もしておきましょう。

database.sql は SQL のスクリプトで、DB 対して実行して、データを流し込む必要があるようです。
DB へのデータの初期登録の方法はいくつかありますが、今回は、 SQL Buddy を使うことにします。

上記の手順にあった templates_c ディレクトリの権限設定もそのままで大丈夫そうです。

これらを加味して、Cloud Foundry へデプロイするための計画手順を今一度整理すると、以下のようになります。

(Cloud Foundryへデプロイする際の手順)

  1. ソースコードの取得(済み)
  2. MySQL DB の作成
  3. SQL Buddy を使ったデータ登録(および編集)
  4. config.php の作成
  5. install ディレクトリの削除(リネーム)
  6. データ格納用フォルダの作成とアクセス権限設定
  7. PHP 拡張モジュール設定
  8. 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 の右側に付いている “→” をクリックします。
以下の画面となりました。

上記画面に表示されている設定項目の中で、 dataDirbase_url の値を今回の環境に合わせて修正する必要があります。
それぞれ、 /home/vcap/app/htdocs/datahttp://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 をご参照のこと)。

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