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

2015-08-07

phpPgAdmin を Cloud Foundry で動かす

「Cloud Foundry 百日行」第46日目,今日のアプリは,昨日に引き続きデータベース管理ツール,と来れば当然 phpPgAdmin です。ただし実際に使うのは Cloud Foundry 用にカスタマイズされた phppgadmin-cf です。

基本情報

以下,基本的に README の記述に沿って手順を進めていきます。

  • 1) ソースコードの取得
  • 2) アプリのプッシュ
  • 3) サービスの作成とアプリとのバインド
  • 4) アプリの更新
  • 5) 動作確認

1. ソースコードの取得

README には zip ファイルを落としてきて展開するようにと書いてある(し, 前日の phpMyAdmin の記事 では実際そうしている)のですが,後述するオリジナルとの差分を見てみたかったこともあり,いつも通り GitHub からソースコードをクローンすることにしました。

$ git clone https://github.com/cloudfoundry-community/phppgadmin-cf.git

なお,念のためzipを展開したものと比較してみましたが, git clone した側のみに,

  • tests がある
  • git 関連ファイルがある(ある意味当然ですね)

以外の差分はありませんでした。

$ diff -r phppgadmin-cf/ phppgadmin-cf-cf-ready/
Only in phppgadmin-cf: .git
Only in phppgadmin-cf: .gitattributes
Only in phppgadmin-cf: .gitignore
Only in phppgadmin-cf: tests
Only in phppgadmin-cf/vendor/arhframe/util: .gitignore
Only in phppgadmin-cf/vendor/cloudfoundry-community/cf-helper-php: .gitignore
Only in phppgadmin-cf/vendor/myclabs/php-enum: .gitattributes
Only in phppgadmin-cf/vendor/myclabs/php-enum: .gitignore
Only in phppgadmin-cf/vendor/ocramius/proxy-manager: .gitignore
Only in phppgadmin-cf/vendor/psr/log: .gitignore
Only in phppgadmin-cf/vendor/romaricdrigon/metayaml: .gitignore
Only in phppgadmin-cf/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher: .gitignore
Only in phppgadmin-cf/vendor/symfony/expression-language/Symfony/Component/ExpressionLanguage: .gitignore
Only in phppgadmin-cf/vendor/symfony/yaml/Symfony/Component/Yaml: .gitignore

したがって,配布されている zip ファイルは最新の git リポジトリーから tests と git 関連ファイルを取り除いて zip で固めたもののようです。

2. アプリのプッシュ

クローンしたリポジトリーのディレクトリーに入って cf push します。

$ cd phppgadmin-cf

いよいよプッシュ,ですがその前に。

実は今回, pphppgadmin-cf.10.244.0.34.xip.io の URL が別のユーザーに取られていたので,URL をランダムに設定してくれるオプションを manifest.yml に追加しました。

$ emacs manifest.yml
..
$ git diff
diff --git a/manifest.yml b/manifest.yml
index 47a698f..1695179 100644
--- a/manifest.yml
+++ b/manifest.yml
@@ -4,3 +4,4 @@ applications:
 - name: phppgadmin-cfready
   memory: 1G
   instances: 1
+  random-route: true

プッシュします。manifest.yml があるので,引数は不要です。

$ cf push
..
requested state: started
instances: 1/1
usage: 1G x 1 instances
urls: phppgadmin-cfready-nondebating-creatine.10.244.0.34.xip.io
last uploaded: Tue Aug 4 01:25:30 UTC 2015
stack: cflinuxfs2
buildpack: Found

     state     since                    cpu    memory      disk      details
#0   running   2015-08-04 10:25:54 AM   1.7%   44M of 1G   0 of 1G

起動しました。 urls のところを見ると,アプリ名の後に何か不思議な英単語が2つ付いたホスト名になっています。これが random-route の効果です。

3. サービスの作成とアプリとのバインド

次に,管理対象となる PostgreSQL サービスをこのアプリにバインドします。 README には,「管理したいサービスをいくつでも」と書いてありますが,今回は検証なので1つだけです。

PostgreSQL サービスを作成して,

$ cf create-service PostgreSQL "Basic PostgreSQL Plan" pg4phppgadmin-cfready
Creating service instance pg4phppgadmin-cfready in org nota-ja / space 100 as nota-ja...
OK

Attention: The plan `Basic PostgreSQL Plan` of service `PostgreSQL` is not free.  The instance `pg4phppgadmin-cfready` will incur a cost.  Contact your administrator if you think this is in error.

バインドします。

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

4. アプリの更新

先ほど表示された TIP にしたがって, cf restage します。

$ cf restage phppgadmin-cfready
requested state: started
instances: 1/1
usage: 1G x 1 instances
urls: phppgadmin-cfready-nondebating-creatine.10.244.0.34.xip.io
last uploaded: Tue Aug 4 01:25:30 UTC 2015
stack: cflinuxfs2
buildpack: Found

     state     since                    cpu    memory        disk      details
#0   running   2015-08-04 10:35:50 AM   1.6%   36.8M of 1G   0 of 1G

問題なく起動しました。

5. 動作確認

ブラウザーでアクセスしてみます。

起動直後の画面:

左上の【pg4phppgadmin-cfready】をクリックすると,ログイン画面が表示されるので,ログインします。

Username / Password は, cf env で環境変数を表示させ, VCAP_SERVICES"uri" から抜き出します。

$ cf env phppgadmin-cfready
..
 "VCAP_SERVICES": {
  "PostgreSQL": [
   {
    "credentials": {
     "uri": "postgres://7ebfd63f-9f1f-4ca3-975e-94bd58db9637:i64nacfq314pt0cuvgqicktcp4@192.168.15.91:5432/7ebfd63f-9f1f-4ca3-975e-94bd58db9637"
    },
..

"uri"2日目の cf100apps-002-postgresql-cf-service-broker の記事 で述べた DATABASE_URL 形式

<scheme>://<username>:<password>@<host>:<port>/<database>

になっているので,この例では Username = 7ebfd63f-9f1f-4ca3-975e-94bd58db9637 / Password = i64nacfq314pt0cuvgqicktcp4 になります。

【Login】をクリックしてログインすると,次のような画面が見えます:

アクセス権があるのは Username と同じ名前のデータベース 7ebfd63f-9f1f-4ca3-975e-94bd58db9637 だけなので,それをクリックして詳細を表示してみます:

【Create schema】をクリックして, demo という名前のスキーマを作ってみます:

【Create】をクリックすると, スキーマが作成されました:

スキーマ demo 内にテーブル hundred-day-challenge を作ってみます:

まずテーブル名とカラム数その他を入力します:

次いで各カラムの情報を入力して,【Create】をクリックします:

テーブル hundred-day-challenge が作成されました:

テーブル名をクリックして詳細を表示させると,各カラムの情報を見ることができます:

動作確認としてはここまでです。使い方の詳細は, phpPgAdmin の本家公式サイト 等をご覧ください。

おまけ: オリジナルCF版 の差分

今回使用した Cloud Foundry 対応版 phpPgAdmin と,それが ベースにしているオリジナル版 との差分は,以下の2コミットのみです。

前者は,更新の行数は多いのですが,基本的に追加ライブラリーの実体を vendor/ 下に vendoring するコミットで,更新の内容よりもどういうライブラリーが vendoring されたかだけが重要そうです。

後者は追加的な設定を書き込むファイル conf/config.inc.php をコミットするもので,ここで \CfCommunity\CfHelper\CfHelper というライブラリーを読み込んでいるのが大きなポイントのようです。特に,このファイルの前半部は環境変数 VCAP_SERVICES からデータベース接続情報を取り出してアプリのデータベース接続設定に書き込むコードになっているので,データベースを使うような他の PHP アプリを Cloud Foundry 対応にするときも参考になるかもしれません。

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