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

2015-07-10

KADOS を Cloud Foundry で動かす

本日の第27回「Cloud Foundry 百日行」は KADOS です。
公式ホームページには”KADOS is web-based tool for managing SCRUM projects and other Agile projects”と書かれており、スクラム開発やアジャイル開発に用いられるカンバンをWEBのダッシュボードで提供してくれるアプリです。
アプリはPHPとMySQLで構成されており、第10回の記事で紹介した方法で簡単に利用が可能です。
なお事前にお知らせしておくと”Kados is available in French, English,Spanish and soon German version”となっており、ヨーロッパ圏向けのサポートとなっているので、一部言語ではメニューが文字化けを起こします。チケットなどの入力は日本語でも動作させることが出来ましたので実行上はEnglishで進めれば普通に利用は可能です。

基本情報

デプロイ

手順
  • 0) ソースコードの取得
  • 1) アプリの起動
  • 2) 動作確認

ソースコードの取得

今回は公式のホームページからzipファイルをダウンロードし解凍します。
解凍するとnew_installとupgrade用のディレクトリが現れますので今回はnew_installを選びましょう。
$ wget http://downloads.sourceforge.net/project/kados/kados_r8-SilverBird.zip
$ unzip kados_r8-SilverBird.zip -d kados_work
$ rm kados_r8-SilverBird.zip
$ cd kados_work
$ ls
kados_changelog_r8.txt  new_install_r8  upgrade_from_v1.7.1_to_r8
$ cd new_install_r8/
$ ls
install_EN.txt install_FR.txt kados  licence sql
とりあえずEnglish版のインストールマニュアルがあるので確認します。
手順はこんな感じです。
  • 0) DBの接続情報を準備(サポートはMySQL database version 5)
  • 1) /kadosディレクトリをWebServerにrootか/kadosとして配置
  • 2) SQLスクリプトをMySQL databaseに実行
  • 3) confフォルダを開く
  • 4) connect.conf にパラメータを設定(MySQLの接続情報)
  • 5) サイトにアクセスしてadmin/adminでログイン
  • 6) メールでユーザのアクティベーションするなら以下を設定(以下略)
  • 7) ヘルプは ドキュメント を参照、あるいは http://www.kados.info/en へ問い合わせ
なお今回は6のメール連携は利用しない方法で進めます。
機会があればそちらも試してみます。

アプリの起動

手順通りcf pushする対象のkadosディレクトリに移動します。
そして次の手順に備えて--no-startオプションをつけてcf pushしてしまいましょう。
$ cd kados
$ cf push kados --no-start
あとはいつも通りMySQLをServiceで準備しましょう。
$ cf marketplace

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

$ cf create-service p-mysql 100mb-dev kados_db
$ cf bind-service kados kados_db
$ cf env kados
System-Provided:
{
 "VCAP_SERVICES": {
  "p-mysql": [
   {
    "credentials": {
     "hostname": "10.244.1.18",
     "jdbcUrl": "jdbc:mysql://10.244.1.18:3306/cf_6eafb097_998c_4d32_beb1_96b1a6bc0db4?user=yPoaMwFiVm4kjatg\u0026password=9Y6e4ZAhaRbIWozF",
     "name": "cf_6eafb097_998c_4d32_beb1_96b1a6bc0db4",
     "password": "9Y6e4ZAhaRbIWozF",
     "port": 3306,
     "uri": "mysql://yPoaMwFiVm4kjatg:9Y6e4ZAhaRbIWozF@10.244.1.18:3306/cf_6eafb097_998c_4d32_beb1_96b1a6bc0db4?reconnect=true",
     "username": "yPoaMwFiVm4kjatg"
    },
    "label": "p-mysql",
    "name": "kados_db",
    "plan": "100mb-dev",
    "tags": [
     "mysql"
    ]
   }
  ]
 }
}
:

次にcf pushしたkadosディレクトリにあるconf/connect.confを編集します。
編集内容は
<?php
 
/* -----------*********  Base de donnees   ***********-------*/
// param?tres de connexion
  $PARAM_host="10.244.1.18";
  $PARAM_db="cf_6eafb097_998c_4d32_beb1_96b1a6bc0db4";
  $PARAM_user="vUWLGrGDkn8aDT66";
  $PARAM_password="3NZE7vIOAH50DTPc";
  $PARAM_charset='utf8';
?>
または
<?php
 
/* -----------*********  Base de donnees   ***********-------*/
// paramètres de connexion
  $services = getenv("VCAP_SERVICES");
  $services_json = json_decode($services,true);
  $mysql_config = $services_json["p-mysql"][0]["credentials"];
 
  $PARAM_host= $mysql_config["hostname"];
  $PARAM_db= $mysql_config["name"];
  $PARAM_user= $mysql_config["username"];
  $PARAM_password= $mysql_config["password"];
  $PARAM_charset='utf8';
?>
になります。
あとはcf pushをするだけ。
おっとその前にSQLスクリプトの実行を忘れていました。あぶない、あぶない。
このSQLスクリプトはkadosディレクトリの1つ上のsqlディレクトリの中にcreate_database_r8.sqlのファイル名で準備されています。
今回は以前紹介した同じPHPアプリの第17回 SQL Buddyを使いました。
  • デプロイ手順は過去の記事を確認して戴きたいのですが、そこで使われる外部のphp-buildpackはデフォルトサポートバージョンが変更されておりますので、エラーの出る方はtag v3.2.2を指定して利用してみて下さい(過去の百日行記事で、staticfile-buildpackを使うアプリでも同じような事象がありました)。
  • SQLスクリプトのインポートの際には1箇所insert into framework_parameters_values_listsのコマンドが長過ぎてエラーになるので中盤あたりでコマンドを2つに分割して下さい。
スクリプト変更方法
該当コマンドの中盤あたりで
),(
を
); \n insert into `framework_parameters_values_lists`(`parameter_tag_id_fk`,`parameter_value_label`,`parameter_value`) values (

に置き換えます。大体コマンドが半分くらいになれば問題ないと思います。
SQLスクリプトの修正が終われば、それをSQL Buddyでデータベースを指定して上部メニューの”Import” の機能を使って読み込ませます。
エラーまたはアプリがダンマリにならなければ成功です。
ではあらためてcf pushしましょう。
$ cf push kados

:
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: kados.10.244.0.34.xip.io
last uploaded: Thu Jul 2 07:54:12 +0000 2015
stack: lucid64
 
     state     since                    cpu    memory          disk      details   
#0   running   2015-07-02 04:54:55 PM   0.0%   96.2M of 256M   0 of 1G      
デプロイ完了です。

動作確認

URL kados.10.244.0.34.xip.io にアクセスしてみます。
ログインはID admin/PASS admin。
ログイン出来ればDB接続も問題なく出来ています。
文字化けしている場合は左上のイギリスの国旗を選んで英語に変更。

ユーザ追加やプロジェクト作成などいろいろ試して見て下さい。

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

2015-07-09

tty.js を Cloud Foundry で動かす

本日の第26回「Cloud Foundry 百日行」はブラウザ上で動作するターミナル tty.js です。

昨日の第25回「Cloud Foundry 百日行」で、ブラウザ上で動作するターミナル ButterFly を試しましたが、ログインが必要なので実運用で問題になりそうでした。今回はログインがいらないターミナル "tty.js" を試してみます。

基本情報


デプロイ

"tty.js" のソースコードを入手してデプロイもできるかと思いますが、"tty.js"  は npm パッケージ化されているので、Cloud Foundry へのデプロイ過程にて取得し、実行する方法をとりました。

1. 準備

"tty.js" は Node.jsランライムで実行されるアプリケーションです。package.json に "tty.js" を dependency として記述すると Node.js ビルドパックがデプロイ時に取得してくれます。


$ cat package.json
{
  "dependencies": {
        "tty.js": "0.2.14-1"
  }
}

用意するファイルは package.json だけです。簡単ですね。


2. デプロイ

npm パッケージは node_modules ディレクトリに保管されるので、実行コマンドを "node node_modules/tty.js/bin/tty.js -p $PORT" とします。


$ cf push amnttty -c 'node node_modules/tty.js/bin/tty.js -p $PORT' -m 256M

App amnttty was started using this command `node node_modules/tty.js/bin/tty.js -p $PORT`



requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: amnttty.mybluemix.net
last uploaded: Wed Jul 8 04:46:34 UTC 2015
stack: lucid64

     state     since                    cpu    memory          disk          details
#0   running   2015-07-08 01:47:30 PM   0.0%   36.6M of 256M   58.8M of 1G

なお今回の Cloud Foundry は Bluemix を利用しました。

動作確認

正常にデプロイできたら、アプリケーションURL にアクセスします。




"tty.js" のバナーに "Open Terminal"ボタンがあるのでそれをクリックします。するとターミナルが開きます。Open Terminal をクリックすると複数のターミナルが起動するようです。

いくつかコマンドを動かしてみました。



vi エディターも動くようです。




なお、"tty.js" の課題として、文字のコピーはできるがペーストする手段がないことがあげられています。ここは将来のバージョンで修正して欲しいところです。


まとめと余談

Cloud Foundry のコンテナに端末として入りたいという理由がいくつかあります。
  • コンテナで使われている rootfs の内容が知りたい
  • 自分のPCは Windows だが急遽 Linux が必要になった
  • ネットワークが不調なので、別のマシンからアクセスさせてみたい (curl の利用等)
"cf-ssh" などを利用した端末アクセス方法がありますが、今回紹介した tty.js では、ペーストできないという欠点を除けば、比較的簡単にアクセスできるようになると思われます。しかしながら、ログインしないでアクセス出来てしまうので、目的を達成したらアプリケーションは停止しておくことを推奨します。


余談

この記事を書いた1週間前には、package.json ファイルの dependencies の記述を "tty.js": "*" のようにしていたのですが、再度確認しようと思った時に動かなくなってしまいました。よくみると最新版だと思っていた "0.2.14"が依存する複数のパッケージが npm リポジトリから削除されているのがわかりました。有志があつまりいろいろ検索してくれた結果、-1 を付ければよいということが判明し、無事記事として出せるようになった顛末があります。Node.js で npm リポジトリからパッケージが削除されることがあるという良い経験になりました。


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


  • cf-release Bluemix (v210)

  • tty.js v0.2.14-1
    https://github.com/chjj/tty.js/tree/v0.2.14-1



2015-07-08

Butterfly を Cloud Foundry で動かすことはできたが,使えなかった

「Cloud Foundry 百日行」第25日目は,ブラウザー上で動作するターミナル Butterfly です。

タイトルからわかるように,今回,百日行シリーズ初の「失敗」を述べる記事になります。Cloud Foundry も万能ではなく,当然動作に適さないアプリも中にはあるのですが,それを明らかにすることもまた有益であると考え,今回記事として公開する次第です。

基本情報

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

  • 1) ソースコードの取得
  • 2) コードの修正
  • 3) Cloud Foundry 環境へのプッシュ
  • 4) 動作確認
  • 5) (おまけ) Cloud Foundry 環境の管理者権限を使っての動作確認

1. ソースコードの取得

$ git clone https://github.com/paradoxxxzero/butterfly.git
$ cd butterfly/

いつも通りです。

2. コードの修正

requirements.txt の修正

プッシュする前に,requirements.txt に不足しているライブラリーがあるので,それを追加します。

$ emacs requiments.txt
..
$ git diff
diff --git a/requirements.txt b/requirements.txt
index e20c23a..9117c11 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1 +1,2 @@
 tornado>=3.2
+tornado_systemd

3. Cloud Foundry 環境へのプッシュ

このアプリは Python ベースなのですが,bosh-lite 環境にプッシュすると NodeJS アプリと判定され,NodeJS buildpack でステージングが行われてしまいます。

これは,NodeJS buildpack の detect (buildpack を適用するかどうかを判定するスクリプト) が「アプリのトップ・ティレクトリーに package.json というファイルがあるか」を判定基準にしていて,

https://github.com/cloudfoundry/nodejs-buildpack/blob/a65dd4c348923ac63f0f436bf890b583c5aa3ea9/bin/detect#L4

if [ -f $1/package.json ]; then

かつ,実際にこのアプリのトップ・ディレクトリーに package.json があり,

https://github.com/paradoxxxzero/butterfly/blob/ed03f94c8447fc186bfd9eb44f6c678e059fa35a/package.json

さらに,NodeJS buildpack の適用順位が Python buildpack よりも前にあるために起きる現象です。

$ cf buildpacks
Getting buildpacks...

buildpack              position   enabled   locked   filename
java_buildpack         1          true      false    java-buildpack-v3.0.zip
ruby_buildpack         2          true      false    ruby_buildpack-cached-v1.4.2.zip
nodejs_buildpack       3          true      false    nodejs_buildpack-cached-v1.3.1.zip
go_buildpack           4          true      false    go_buildpack-cached-v1.3.1.zip
python_buildpack       5          true      false    python_buildpack-cached-v1.3.2.zip
php_buildpack          6          true      false    php_buildpack-cached-v3.2.1.zip
staticfile_buildpack   7          true      false    staticfile_buildpack-cached-v1.0.0.zip
binary_buildpack       8          true      false    binary_buildpack-cached-v1.0.0.zip

そこで,プッシュ時に陽に Python buildpack を使うよう指定します。

さらに今回は,アプリの起動コマンドも指定して,アプリをプッシュします。

$ cf push butterfly -b python_buildpack -c 'python butterfly.server.py --port=$PORT --host=$VCAP_APP_HOST --unsecure'
..
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: butterfly.10.244.0.34.xip.io
package uploaded: Tue Jul 7 11:46:07 UTC 2015
stack: cflinuxfs2

     state     since                    cpu    memory          disk      details
#0   running   2015-07-07 08:46:46 PM   0.0%   58.8M of 256M   0 of 1G

アプリが起動しました。

4. 動作確認

ブラウザーからアプリにアクセスします。

最初の画面はこんな感じです:

GitHub の README に貼ってあるのとよく似た画面が表示されています。

「起動した!」と思ったのですが,ここで問題発生。

Cloud Foundry のアプリは,Warden というコンテナー内で起動するのですが,その際のユーザーは vcap になっています。そこで login: プロンプトに vcap と打ち込んで enter を押したところでハタと気づきました。

「パスワードがわからない」

そうなのです。パスワードがわからないと,ログインできませんし,当然何のコマンドも実行できません。

ということで,今回のアプリ Butterfly は,起動まではできたのですが,残念ながら「使えない」という結果になりました。

なお,時期は未定ですが,Cloud Foundry の次のメジャー・リリースである v3 では, アプリのインスタンスにSSHでアクセスできる機能が追加される予定 です。この機能があれば,Butterfly が「使える」ようになるかもしれません。

5. (おまけ) Cloud Foundry 環境の管理者権限を使っての動作確認

ここからは完全におまけですが,Cloud Foundry 環境の管理者権限を使って,コンテナー内の vcap ユーザーにパスワードを設定し,そのパスワードでログインして本当にアプリが動作しているかを試してみます。

百日行シリーズの「ユーザーの視点から Cloud Foundry の使い方を示す」という趣旨からは外れますが,個人の興味の範囲で試してみました。

各コマンドの詳細な説明は省略しますので,質問等あれば,別途ご連絡ください。

  • Warden コンテナーが動作している DEA にログインします
$ bosh ssh runner_z1/0

  • スーパーユーザーになって,
bosh_4xqfadsn8@dab3959e-f426-4ef6-8602-34be08a31058:~$ sudo -s
  • アプリのインスタンスが動作しているコンテナーを特定し,
root@dab3959e-f426-4ef6-8602-34be08a31058:~# find /var/vcap/data/warden/depot/ -name butterfly.server.py
/var/vcap/data/warden/depot/18q8si997t6/tmp/rootfs/home/vcap/app/butterfly.server.py
root@dab3959e-f426-4ef6-8602-34be08a31058:~# ps -ef | grep 18q8si997t6
root      7312     1  0 11:46 ?        00:00:00 wshd: 18q8si997t6
root      7349   148  0 11:46 ?        00:00:00 /var/vcap/data/packages/warden/88b0ad837f313990ce408e50cd904f7025983213.1-95fe39abd3b1f23126ab20be93fc7de85b7bec0e/warden/src/oom/oom /tmp/warden/cgroup/memory/instance-18q8si997t6
root      7523   148  0 11:46 ?        00:00:00 /var/vcap/data/warden/depot/18q8si997t6/bin/iomux-spawn /var/vcap/data/warden/depot/18q8si997t6/jobs/47 /var/vcap/data/warden/depot/18q8si997t6/bin/wsh --socket /var/vcap/data/warden/depot/18q8si997t6/run/wshd.sock --user vcap /bin/bash
root      7524  7523  0 11:46 ?        00:00:00 /var/vcap/data/warden/depot/18q8si997t6/bin/wsh --socket /var/vcap/data/warden/depot/18q8si997t6/run/wshd.sock --user vcap /bin/bash
root      7529   148  0 11:46 ?        00:00:00 /var/vcap/data/warden/depot/18q8si997t6/bin/iomux-link -w /var/vcap/data/warden/depot/18q8si997t6/jobs/47/cursors /var/vcap/data/warden/depot/18q8si997t6/jobs/47
root     11131 10869  0 12:19 pts/0    00:00:00 grep --color=auto 18q8si997t6
  • コンテナーに入ります
root@dab3959e-f426-4ef6-8602-34be08a31058:~# /var/vcap/data/warden/depot/18q8si997t6/bin/wsh --socket /var/vcap/data/warden/depot/18q8si997t6/run/wshd.sock /bin/bash
  • コンテナー内で vcap ユーザーのパスワードを変更します
root@18q8si997t6:~# passwd vcap
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root@18q8si997t6:~# exit
  • ここで,先ほどの画面から vcap ユーザーでログインします
    パスワードは先ほど設定したものを使います

    ログインできました!

  • いろいろやってみました

ということで,irregular な方法ですが,動くことは確認できました。

なお次回は,この結果を受けて,別のターミナル・アプリについて,Takehiko Amano さんが書いてくださる予定です。

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

2015-07-07

SugarCRM を Cloud Foundry で動かす

「Cloud Foundry 百日行」第24日目は,PHP製の CRM (Customer Relationship Management) ソフトウェア SugarCRM (日本語サイト) です。

オープンソースの CRM ソフトウェアとしては非常に有名なので,CRM に興味のある方なら一度は耳にされたこともあるかと思います。CRM に全く関わったことがない私も,名前だけは知っていました。

基本情報

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

  1. ソースコードの取得
  2. Cloud Foundry 環境へのプッシュ
  3. Install Wizard の実行
  4. 動作確認(1)
  5. 再起動後もインストール前の状態に戻らないようにする
  6. 動作確認(2)

ソースコードの取得

$ git clone https://github.com/sugarcrm/sugarcrm_dev.git
$ cd sugarcrm_dev

Cloud Foundry 環境へのプッシュ

SugarCRM を Cloud Foundry 上で動かす際のポイントは

  • 新しい PHP Buildpack (v3.0.4以降) を使う
  • PHP 拡張モジュールを追加する
  • Apache モジュールを追加する

の3点です。

  • 新しい PHP buildpack (v3.0.4以降) を使う

今回検証に利用した v194 環境に標準で入っている PHP buildpack は v1.0.2 なのですが,Cloud Foundry の PHP buildpack は v3.0.4 で大幅なアーキテクチャ変更が入って一新されました。以下に述べる PHP 拡張モジュールや Apache モジュールを追加する機能を利用するために,今回は GitHub 上にある新しい buildpack の URL を指定して使います。
なお,v3.0.4 の PHP buildpack は,cf-release v201 で標準添付されるようになったので,最新版の Cloud Foundruy ではこの点を特に気にする必要はありません。

  • PHP 拡張モジュールを追加する

今回利用する PHP buildpack では, .bp-config/options.json というファイルを利用して PHP 拡張モジュールを追加できます。SugarCRM に必要な拡張モジュールについては, http://www.sugaruser.jp/Documentation/installation_and_upgrade_guide#PHP などを参考にしました。

  • Apache モジュールを追加する

今回利用する PHP buildpack では, .bp-config/httpd/extra/ 以下に httpd-*.conf を置くことで, Apache の設定をカスタマイズできます。標準では SugarCRM に必要な mod_alias が入っていなかったので,.bp-config/httpd/extra/httpd-modules.conf を使って mod_alias を有効にしました。

以上を踏まえて,SugarCRM を Cloud Foundry 上で起動させるまでの手順を見ていきます。

PHP 拡張モジュールの追加

アプリのトップ・ディレクトリーに .bp-config ディレクトリーを作り,そこに以下の内容の options.json ファイルを置きます。

$ mkdir .bp-config
$ emacs .bp-config/options.json
..
$ git diff -- .bp-config/options.json
diff --git a/.bp-config/options.json b/.bp-config/options.json
new file mode 100644
index 0000000..7384d69
--- /dev/null
+++ b/.bp-config/options.json
@@ -0,0 +1,3 @@
+{
+    "PHP_EXTENSIONS": ["mbstring", "zip", "mysql", "mysqli", "gd", "openssl", "bz2", "zlib", "curl", "mcrypt"]
+}

Apache モジュールの追加

http://docs.cloudfoundry.org/buildpacks/php/gsg-php-config.html#engine-configurations を参考に,このファイル を .bp-config/httpd/extra/httpd-modules.conf に置いて,以下の変更を実施します。

$ mkdir -p .bp-config/httpd/extra/
$ cp ../php-buildpack/defaults/config/httpd/2.4.x/extra/httpd-modules.conf
$ emacs .bp-config/httpd/extra/httpd-modules.conf
..
$ git diff -- .bp-config/httpd/extra/httpd-modules.conf
diff --git a/.bp-config/httpd/extra/httpd-modules.conf b/.bp-config/httpd/extra/httpd-modules.conf
index 76f2c4c..1590421 100644
--- a/.bp-config/httpd/extra/httpd-modules.conf
+++ b/.bp-config/httpd/extra/httpd-modules.conf
@@ -111,4 +111,4 @@ LoadModule rewrite_module modules/mod_rewrite.so
 #LoadModule actions_module modules/mod_actions.so
 #LoadModule speling_module modules/mod_speling.so
 #LoadModule userdir_module modules/mod_userdir.so
-#LoadModule alias_module modules/mod_alias.so
+LoadModule alias_module modules/mod_alias.so

mod_alias の行のコメントアウトを外すだけです。

アプリのプッシュ

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

GitHub 上の PHP buildpack を使うようオプションを指定して,アプリをプッシュ します。この後 MySQL サービスを作成してバインドするので,この時点ではアプリが起動しないよう --no-start を付けておきます。

MySQL サービスの作成とバインド

SugarCRM の標準では,データベースとして MySQL を使うようです。そこで MySQL サービスを作成し,SugarCRM アプリにバインドします。

$ cf create-service p-mysql 100mb-dev my4sugar
Creating service instance my4sugar in org nota-ja / space 100 as nota-ja...
OK
$ cf bind-service sugar my4sugar
Binding service my4sugar to app sugar in org nota-ja / space 100 as nota-ja...
OK
TIP: Use 'cf restage sugar' to ensure your env variable changes take effect

アプリの起動

アプリを起動する準備が整ったので,起動します。

$ cf start sugar
..
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: sugar.10.244.0.34.xip.io
last uploaded: Thu Jun 18 02:04:17 +0000 2015
stack: lucid64
 
     state     since                    cpu    memory          disk      details
#0   running   2015-06-18 11:05:41 AM   0.0%   44.7M of 256M   0 of 1G

無事起動しました。

Install Wizard の実行

SugarCRM では,初回起動時に Install Wizard が走り,DB接続等の設定を行います。

この記事はあくまで SugarCRM を Cloud Foundry 上で動かすことが主眼であり,SugarCRM 自体のの解説は目的外なので,全ての手順について詳細な説明は省略し,幾つかポイントとなる画面のみを取り上げることにします。

初期画面

起動後最初の画面は以下のようになっています:

Install Wizard 実行前の注意

(略)

ライセンス同意

なぜかライセンスが表示されないのですが, ここ で確認済みなので,【I Accept】にチェックを入れて【Next】をクリックします。

なお,ここでエラーが出る場合は,必須 PHP 拡張モジュールが不足している可能性があります。

インストール・タイプの選択

【Typical Install】を選んで【Next】をクリックします。

データベース選択

MySQL一択です。

DB接続情報入力

この画面では,さきにバインドした MySQL サービスの接続情報に基づいて入力を行います。

MySQL サービスの接続情報は, cf env <アプリ名> で表示される VCAP_SERVICES の中に入っています:

$ cf env sugar
..
"VCAP_SERVICES": {
 "p-mysql": [
  {
   "credentials": {
    "hostname": "10.244.1.18",
    "jdbcUrl": "jdbc:mysql://10.244.1.18:3306/cf_9c38e266_aad4_4c4d_b608_065648fd22f3?user=jfca0SfmmSh8c6TI\u0026password=UWE5ae2yK6znh0VN",
    "name": "cf_9c38e266_aad4_4c4d_b608_065648fd22f3",
    "password": "UWE5ae2yK6znh0VN",
    "port": 3306,
    "uri": "mysql://jfca0SfmmSh8c6TI:UWE5ae2yK6znh0VN@10.244.1.18:3306/cf_9c38e266_aad4_4c4d_b608_065648fd22f3?reconnect=true",
    "username": "jfca0SfmmSh8c6TI"
   },
   "label": "p-mysql",
   "name": "my4sugar",
   "plan": "100mb-dev",
   "tags": [
    "mysql"
   ]
  }
 ]
}
..

入力が終わって【Next】をクリックすると,「DBが既にあるので,中身を初期化するがいいか?」と尋ねるダイアログが出てくるので,【I Accept】をクリックします。指定した名前のDBが存在しない場合は新たにDBを作成してくれるようですが,Cloud Foundry の MySQL サービスの場合,常にDB作成済みの状態でアプリに渡されるので,処理の流れとしては必ずこうなります。

初期管理者のパスワード設定

(略)

設定確認画面

【Install】を押して先に進むと,セットアップ成功画面が表示されます:

ここで【Next】を押してエラーが出る場合,Apache のモジュールの設定に失敗している可能性があります。

製品登録(optional)画面

Optional ということで,何も入力せず次へいきます。するとついに最初のログイン画面に進みます。

動作確認(1)

引き続きログインして動作確認を行います。

SugarCRM では,管理者/ユーザーの最初のログイン時には Admin Wizard, User Wizard を通る必要があるようです。

最初のログイン画面

先ほど「初期管理者のパスワード設定」で入力したユーザー名/パスワードを入力してログインします。

Admin Wizard 画面

面倒なので【Skip】します。

ユーザー情報入力画面

(略)

Locale 設定画面

(略)

User Wizard 最終画面

これを終わると,ようやく使い始めの画面になります。

ログイン後のトップ画面

画面上に赤い文字で記述されている注記は,SMTP サーバーが設定されていないために出ているものです。今回はメイルを送るつもりはなかったので気にしないことにしました。

この後,ユーザー管理画面で一般ユーザーを作ったり(メイル送信が必要になったので,既存の SMTP サーバーを設定して試しました),作った一般ユーザーでログインしたりもしましたが,そのあたりは割愛させていただきます。

再起動後もインストール前の状態に戻らないようにする

通常ならここで終わりですが,今回はもう一歩踏み込んでみます。

SugarCRM は Install Wizard や User Wizard で設定した情報をローカルファイルに持っているため,再起動するとセットアップからやり直しになります。つまり(事実上)継続的には使えません。

そこで今回,これら Wizard で設定した情報が入っているファイルを取得・保存し,コードと一緒に再度プッシュすることで,再起動後もそれまで通り使い続けられるようにすることにトライしてみました。

アプリのリポジトリーのトップ・ディレクトリーは,今回使った PHP buildpack では,app/htdocs/ というディレクトリーに展開されます。そこで,この2つのディレクトリーを比較し,増えたファイルが以下であることを特定しました。

  • .htaccess
  • config.php
  • config_override.php
  • install.log

このうち,ログは不要であろうと判断し,残り3つのファイルを Cloud Foundry 環境からローカルに持ってきます:

$ cf files sugar app/htdocs/.htaccess
..
$ cf files sugar app/htdocs/config.php
..
$ cf files sugar app/htdocs/config_override.php
..

ファイルの内容が端末に表示されるので,コピーして同名のファイルに保存します。

$ ls -1a
..
.htaccess
..
config.php
config_override.php
..

この状態でアプリを再度プッシュします。

$ cf push sugar
Updating app sugar in org nota-ja / space 100 as nota-ja...
OK
.......
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: sugar.10.244.0.34.xip.io
last uploaded: Tue Jun 23 04:22:19 +0000 2015
stack: lucid64
 
     state     since                    cpu    memory          disk      details
#0   running   2015-06-23 01:23:44 PM   0.0%   44.5M of 256M   0 of 1G

問題なく起動しました。

動作確認(2)

再起動直後の画面

Install Wizard / User Wizard を通ることなくログイン画面に到達しました。

ログイン直後の画面

再起動前に設定した admin ユーザーでログインしてみると,

問題なくログインできて,前回の続きから使うことができました。

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

2015-07-06

IPython Notebook を Cloud Foundry で動かす


本日の第23回「Cloud Foundry 百日行」は IPython Notebook です。

最近、データサイエンティストという役職がちらほら聞かれるようになり、ベイズの定理なんて言葉も飛び交ってきているようです。

科学計算に R言語 や Python などが利用されており、以前から SciPy は気になっておりました。キャリアのひとつとして身に着けておくと便利かなと常々おもっているのですが、のびのびになっています。特に、データサイエン ティスト界隈では今回紹介する IPython Notebook をよく使うという情報が散見されます。Bluemix で IPython Notebook を動かす方法(リンク)は知られているのですが、なかなか煩雑そうだなと思っていました。しかし、より簡単な方法で動かすことが出来ることがわかったので、ご紹介したい と思っています。

基本情報


  • 公式サイト
    http://ipython.org/notebook.html
     
  • ソースコード(ビルドパック)
    https://github.com/ihuston/ipython-notebook-buildpack.git
     
  • 参考情報
    http://www.scipy.org/
    http://www.slideshare.net/ihuston/python-on-cloud-foundry

 

デプロイ


1. ソースの入手なし


今回の手法は、ビルドパックのみという手法をとっています。ビルドパックだけでアプリケーションがデプロイできるというのは素晴らしいですね。

2. デプロイ


利用するビルドパックには、デフォルトでは数学関係のモジュールが入っていないようなので、追加のモジュールを requirements.txt ファイルに記述します。


$ cat requirements.txt
numpy
pandas
matplotlib

その上で、Cloud Foundry 上にデプロイします。今回は、Bluemix を利用しております。

$ cf push amntip -b https://github.com/ihuston/ipython-notebook-buildpack.git -m 512M

requested state: started
instances: 1/1
usage: 512M x 1 instances
urls: amntip.mybluemix.net
last uploaded: Wed Jul 1 07:14:35 UTC 2015
stack: lucid64

     state     since                    cpu    memory           disk           details
#0   running   2015-07-01 04:17:11 PM   0.0%   119.3M of 512M   254.4M of 1G


Cloud Foundry のビルドパックは実行環境を構築するのにつかわれ、その上にソースファイルやバイナリをユーザーが提供するというのが一般的です。

しかし、今回のケースのようにアプリケーションそのものを導入することもできます。ビルドパックの compile スクリプトがソフトウェアを導入するスクリプトなのですが、今回のビルドパックのコンパイルスクリプト を見てみるとさほど難しいことをしているわけではないです。単純に普段ユーザーが導入スクリプトを書くように自然に記述されています。このあたりの自由度は Cloud Foundry 特有でしょう。ある意味、Docker スクリプトを書くよりも簡単かもしれません。

さて、動かしてみましょう。

動作確認


はじめはやはり Hello World ですね! New ボタンから Python 2 を選択します。



In の部分に、print "Hello"と入力して、動かします。



Hello と出ました。せっかくなので、プロットも試してみます。次の命令を入力して実行します。


%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 3*np.pi, 500)
plt.plot(x, np.sin(x**2))
plt.title('A simple chirp');

表示されました。



参考情報のリンクにあるチャートにて、 Ian Huston 氏はデータサイエンティスト達にとって以下のメリットがあると述べています(拙訳)

- WEBアプリケーション(IPython:訳注)を簡単に動かすことができる
- 必要なデータサービスを簡単にバインドすることができる
- ひとつのクラウドベンダーにロックインされない
- Python は公式にサポートされいる

たしかにたとえば少し計算してみたいと思えば、数分で IPython の実行環境が得られるのはメリットがあると思います。

おまけ


なお、今回は動かすのみで、あまりアプリケーションに対して様々な動作検証を行うというまでにはたどり着けませんでした。スキル習得の難しさを実感しています。千里の道も一歩から。お気軽に動作できる環境ができたので、暇をみつけてスキルを磨こうと思っております。


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

  •  cf-release Bluemix (v210)
  •  IPython Notebook buildpack
    https://github.com/ihuston/ipython-notebook-buildpack/tree/02ca4d69805ba50f4afa77e6a4db5e75287b046f




2015-07-03

ZenPen を Cloud Foundry で動かす

本日の第22回「Cloud Foundry 百日行」は、ZenPenです。

ZenPen基本情報

デプロイ

手順

  • 0) 準備
  • 1) アプリの起動
  • 2) 動作確認

0.準備

恒例のソースコードの取得から。

$ git clone https://github.com/tholman/zenpen
$ cd zenpen/
zenpen$ ls
css  index.html  js  license.md  readme.md

1.アプリの起動

おなじみHTML+JavaScriptでStaticfile-buildpackのパターンです。
先にmanifestファイルを作ってしまいましょう。

zenpen$ vi manifest.yml
applications:
- name: zenpen
  buildpack: https://github.com/cloudfoundry/staticfile-buildpack.git#v1.1.1
  env:
    CF_STACK: lucid64

あとはpushするだけです。

zenpen$ cf push
Using manifest file /home/ukaji/workspace/zenpen/manifest.yml

Creating app zenpen in org ukaji / space default as ukaji...
OK

Using route zenpen.10.244.0.34.xip.io
Binding zenpen.10.244.0.34.xip.io to zenpen...
OK

Uploading zenpen...
Uploading app files from: /home/ukaji/workspace/zenpen
Uploading 69.3K, 21 files
Done uploading               
OK

Starting app zenpen in org ukaji / space default as ukaji...
-----> Downloaded app package (32K)
Cloning into '/tmp/buildpacks/staticfile-buildpack'...
Note: checking out 'd00d45d43dcdb3bfa75b1445533c6fda5035ef3b'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
  git checkout -b new_branch_name
Submodule 'compile-extensions' (https://github.com/cloudfoundry-incubator/compile-extensions.git) registered for path 'compile-extensions'
Cloning into 'compile-extensions'...
Submodule path 'compile-extensions': checked out 'f752ecf4b27d2f31bb082dfe7a47c76fefc769d7'
grep: Staticfile: No such file or directory
-----> Using root folder
-----> Copying project files into public/
-----> Setting up nginx
grep: Staticfile: No such file or directory
-----> Uploading droplet (2.2M)

1 of 1 instances running

App started


OK

App zenpen was started using this command `sh boot.sh`

Showing health and status for app zenpen in org ukaji / space default as ukaji...
OK

requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: zenpen.10.244.0.34.xip.io
last uploaded: Tue Jun 30 07:26:57 +0000 2015
stack: lucid64

     state     since                    cpu    memory         disk      details   
#0   running   2015-06-30 04:27:14 PM   0.0%   2.4M of 256M   0 of 1G

無事に起動しました。

2.動作確認

動作確認です。URLにアクセスしてみると・・・

確かに全画面モードで背景を黒にしてしまえば余計なものが一切表示されないためかなり集中することができそうです。

おまけ

さて、今回も少しStatic-buildpackの機能で遊んでみます。
非常に簡単なBasic認証の機能を追加してみましょう。
Readmeの説明通りに行ってみます。

  • 0.アプリのルートディレクトリにStaticfile.auth というファイルを作成。
  • 1.Htpasswd Generatorにアクセスし、UsernameとPasswordを入力。(この2つが後でアプリにアクセスする際に要求されます。)
  • 2. Create .htpasswd file を押すと文字列を返してくれるので、先ほど作った Staticfile.auth ファイルに書き込み。

今回は

Username=hiroakiukaji
Password=mypassword

から

hiroakiukaji:$apr1$1Nm9vAi1$e7wR1mchH0oZnHrP0q5/2/

という文字列が返されたので、これを Staticfile.auth にそのまま書き込んでおきましょう。

zenpen$ vi Staticfile.auth
hiroakiukaji:$apr1$1Nm9vAi1$e7wR1mchH0oZnHrP0q5/2/

この状態で再びpushします。

zenpen$ cf push
Using manifest file /home/ukaji/workspace/zenpen/manifest.yml

Updating app zenpen in org ukaji / space default as ukaji...
OK

Uploading zenpen...
Uploading app files from: /home/ukaji/workspace/zenpen
Uploading 69.4K, 22 files
Done uploading               
OK

Stopping app zenpen in org ukaji / space default as ukaji...
OK

Starting app zenpen in org ukaji / space default as ukaji...
-----> Downloaded app package (32K)
-----> Downloaded app buildpack cache (4.0K)
Cloning into '/tmp/buildpacks/staticfile-buildpack'...
Note: checking out 'd00d45d43dcdb3bfa75b1445533c6fda5035ef3b'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
  git checkout -b new_branch_name
Submodule 'compile-extensions' (https://github.com/cloudfoundry-incubator/compile-extensions.git) registered for path 'compile-extensions'
Cloning into 'compile-extensions'...
Submodule path 'compile-extensions': checked out 'f752ecf4b27d2f31bb082dfe7a47c76fefc769d7'
grep: Staticfile: No such file or directory
-----> Using root folder
-----> Copying project files into public/
-----> Setting up nginx
-----> Enabling basic authentication
       hiroakiukaji:$apr1$1Nm9vAi1$e7wR1mchH0oZnHrP0q5/2/
       PRO TIP: Learn about basic authentication
       Visit https://github.com/drnic/staticfile-buildpack#basic-authentication
grep: Staticfile: No such file or directory
-----> Uploading droplet (2.2M)

1 of 1 instances running

App started


OK

App zenpen was started using this command `sh boot.sh`

Showing health and status for app zenpen in org ukaji / space default as ukaji...
OK

requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: zenpen.10.244.0.34.xip.io
last uploaded: Tue Jun 30 08:44:02 +0000 2015
stack: lucid64

     state     since                    cpu    memory         disk      details   
#0   running   2015-06-30 05:44:19 PM   0.0%   3.4M of 256M   0 of 1G

アクセスを行ってみると・・・

認証機能が追加されています。

先ほど設定したUsernameとPasswordを入力すると、

認証が通りアプリを使うことができます。
アプリに対してちょっとしたアクセス制限をかけたい時には便利な機能ですね。

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

2015-07-02

wysiwygetize を Cloud Foundry で動かす

本日の第21回「Cloud Foundry 百日行」は wysiwygetize です。
ホームページにアクセスしていただければお分かりの通りこのアプリはテキストの入力エリアと「view source」、「full screnn」の選択肢があるだけです。
これで何が出来るかというとアプリ名からお気付きの方もいるかもしれませんがWYSIWYG(ウィジウィグ)エディタとして利用が出来ます。

ググってみるとWYSIWYGとは「What You See Is What You Get」の頭文字をあわせたもので、ディスプレイに表示される状態(文字サイズや色など)を確認が出来る技術みたいです。
例えばhtmlやdocなど書いた時、ブラウザでの表示や印刷のイメージが思っていたものと違うことがよくあると思います。そこを解消する為に最終的に表示される状態を確認しながら編集出来るツールがWYSIWYGエディタといわれるもののようですね。

また今回のエディタは最低限の機能に絞ることでアプリのサイズが他の同様のエディタと比べても小さいのでWEBアプリ向きといえますね。

基本情報

ソースコードの取得

$ git clone https://github.com/Spharian/wysiwygetize
$ cd wysiwygetize
$ ls
css  index.html  js  README.md

シンプル!わかりやすい!
見た目も操作も機能をシンプルにしてあるだけあって迷いどころがないですね。今回も staticfile-buildpack を使っていきましょう。

アプリのpush

手始めにアプリのルートディレクトリにStaticfileを作成します。

$ touch Staticfile

そしてデプロイする前に第16回と同じ失敗を踏まないように manifest.yml に env を設定したものを作成しましょう。また外部のBuildpackを利用する場合は前回のようにリリースなどで変更が入る可能性があるので、下記のようにバージョンを含めて指定する方法も有効です。前回利用したバージョン v1.1.1 を指定します。

vi manifest.yml

applications:
- name: wysiwygetize
  buildpack: https://github.com/cloudfoundry/staticfile-buildpack.git#v1.1.1
  env:
    CF_STACK: lucid64

ちなみに上記ではBuildpackのタグを指定していますが、branchやcommitを指定することも可能です。

よし、これで準備完了。デプロイしましょう。

$ cf push
Using manifest file /home/k-nagai/nagai-work/wysiwygetize/manifest.yml

Creating app wysiwygetize in org k-nagai / space work as k-nagai...
OK

Creating route wysiwygetize.10.244.0.34.xip.io...
OK

Binding wysiwygetize.10.244.0.34.xip.io to wysiwygetize...
OK

Uploading wysiwygetize...
Uploading app files from: /home/k-nagai/nagai-work/wysiwygetize
Uploading 102.6K, 8 files
Done uploading               
OK

Starting app wysiwygetize in org k-nagai / space work as k-nagai...
-----> Downloaded app package (40K)
Cloning into '/tmp/buildpacks/staticfile-buildpack'...
Note: checking out 'd00d45d43dcdb3bfa75b1445533c6fda5035ef3b'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
  git checkout -b new_branch_name
Submodule 'compile-extensions' (https://github.com/cloudfoundry-incubator/compile-extensions.git) registered for path 'compile-extensions'
Cloning into 'compile-extensions'...
Submodule path 'compile-extensions': checked out 'f752ecf4b27d2f31bb082dfe7a47c76fefc769d7'
-----> Using root folder
-----> Copying project files into public/
-----> Setting up nginx
-----> Uploading droplet (2.3M)

1 of 1 instances running

App started


OK

App wysiwygetize was started using this command `sh boot.sh`

Showing health and status for app wysiwygetize in org k-nagai / space work as k-nagai...
OK

requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: wysiwygetize.10.244.0.34.xip.io
last uploaded: Tue Jun 30 05:30:25 +0000 2015
stack: lucid64

     state     since                    cpu    memory         disk      details   
#0   running   2015-06-30 02:30:47 PM   0.0%   3.5M of 256M   0 of 1G 

デプロイ完了。

動作確認

URL wysiwygetize.10.244.0.34.xip.io にアクセスしてみます。

入力欄に試し書きをして・・・
書いた文字を反転選択するとメニューが出てきていろいろ試す。

できた。

ソースも確認。改行が無いから見にくいですが良しとして、

最後にフルスクリーンもOK。

確かに参考ページにあるとおりちょっとした確認や編集なら十分かも知れません。

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