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

2015-08-13

Tiny Tiny RSS を Cloud Foundry で動かす

「Cloud Foundry 百日行」中休み前の最終日である50日目は,個人的に探しているフィード・リーダーの第2弾,PHPベースの Tiny Tiny RSS です。

このアプリはかなりの人気を誇っているようで, AltenativeTo でも同種のアプリの中では一番人気ですし,開発も非常に活発で今回の記事で動作確認を行ったバージョンの後にもどんどんコミットが積まれています。またデフォルトのフィードとして入っている このアプリのフォーラム でも活発に投稿が行われていました。またこれまで百日行で紹介してきたアプリとしては珍しく操作メニュー等も含めて日本語対応が行われており,ソフトウェアとしての成熟を感じました。

そういうことで,私も動かして実際に見てみたいという期待があり,動作確認を頑張ってみた結果,本来の予定である昨日に間に合わず,記事公開が今日になってしまいました。繰り上げを承諾していただいた @tnaoto さんに感謝します。

基本情報

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

  • 1) ソースコードの取得
  • 2) サービスの作成とバインド
  • 3) Cloud Foundry 向け設定
  • 4) アプリの起動
  • 5) 初期設定&動作確認

1. ソースコードの取得

いつも同様 Git のリポジトリーなのですが,このアプリのソースコードは独自に立てたと思われる GitLab 上で提供されています。

$ git clone https://tt-rss.org/gitlab/fox/tt-rss.git
$ cd tt-rss

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

2.1. サービスの作成

このアプリはデータベースを使用するので,データベース・サービスを作成します。 https://tt-rss.org/gitlab/fox/tt-rss/wikis/home#server-side には,「PostgreSQL と MySQL (InnoDB必須) が使えるけど,PostgreSQL の方が tt-rss の性能はいいはず」(意訳) と書いてあるので,PostgreSQL を使います。

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

2.2. アプリの作成

サービスとバインドするために,アプリを停止状態で Cloud Foundry 環境にプッシュします。

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

2.3. アプリとサービスのバインド

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

3. Cloud Foundry 向け設定

アプリが Cloud Foundry 上で動作するよう,設定を行っていきます。今回は全て PHP Buildpack の機能である options.json の範囲内で対応できました。

PHP Buildpack 用の設定を格納するディレクトリー .bp-config を作り,そこに options.json ファイルを作ります。

$ mkdir .bp-config
$ touch .bp-config/options.json

options.json ファイルを編集します。

$ emacs .bp-config/options.json

できあがったファイルがこちらです。

$ cat .bp-config/options.json
{
    "PHP_EXTENSIONS": ["mbstring", "curl", "gd", "pgsql"],
    "ADDITIONAL_PREPROCESS_CMDS": "pushd $HOME/htdocs; ln -s ../lib .; ls -l; popd"
}

上の行の PHP_EXTENSIONS については, このページ を参考に必要/推奨される拡張モジュールを記述しています。 JSONposix については,それぞれ ここここ で「拡張ライブラリーの導入は不要」(意訳) と書かれていたので記載しませんでしたが,特に問題は起きませんでした。

下の行, ADDITIONAL_PREPROCESS_CMDS は,アプリの起動コマンドの前に実行したいコマンドを記述するためのものです。百日行では, 第34日目の Shaarli の記事 で一度紹介されていました。

今回は,アプリ内の PHP 及び JavaScript のライブラリーの参照関係が Cloud Foundry の PHP Buildpack によって壊されてしまうため,それを修復するシンボリック・リンクを作るのにこの機能を利用しています。

話が若干横道に逸れますが,なぜ PHP Buildpack によって参照関係が壊されることになったかというと,その理由は PHP Buildpack が持つ WEBDIR と LIBDIR という機能にあります。

WEBDIR は,アプリのドキュメント・ルートを指定する機能です。Cloud Foundry の PHP Buildpack のデフォルト動作では,アプリのルート・ディレクトリーの htdocs ディレクトリーがそれに該当し,存在しなければ作成されて,その中にルート・ディレクトリー内のファイルは原則として全て移動されます。

LIBDIR は,アプリのライブラリーを格納する場所を指定する機能です。Cloud Foundry の PHP Buildpack のデフォルト動作では,アプリのルート・ディレクトリーの lib ディレクトリーがそれに該当します。アプリのルート・ディレクトリーに lib ディレクトリーが存在する場合,それは htdocs 内には移動されません。これは,ライブラリーを外部から参照可能なドキュメント・ルートに置くことは,セキュリティ的にあまり良くないとされているためです。

以上をまとめると,以下の図のようになります。

ところが本アプリでは,アプリのルート・ディレクトリー=ドキュメント・ルートであり,かつ lib ディレクトリーはその直下にあるという前提で PHP / JavaScript のコードが書かれているので,いざライブラリーを参照しに行こうとすると,そこにそんなファイルはない,ということになってしまい,エラーが発生しました。

そこで今回は,(セキュリティ上はあまり良くない解決策ですが) ドキュメント・ルートである htdocs 内に,一つ上の階層にある lib へのシンボリック・リンクを張り,アプリが想定しているのと同じ状態を再現することで,エラーを回避することにしました。

4. アプリの起動

先ほど作成した .bp-config/options.json の内容を反映させるため,アプリをプッシュします。このとき同時にアプリの起動が行われます。

$ cf push tt-rss
..
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: tt-rss.10.244.0.34.xip.io
last uploaded: Wed Aug 12 07:31:33 UTC 2015
stack: cflinuxfs2
buildpack: PHP

     state     since                    cpu    memory          disk      details
#0   running   2015-08-12 04:35:03 PM   0.0%   38.9M of 256M   0 of 1G

起動しました。

5. 初期設定&動作確認

アプリのURLにブラウザーからアクセスすると,初期設定画面が表示されます:

cf env の情報

$ cf env tt-rss
..
 "VCAP_SERVICES": {
  "PostgreSQL": [
   {
    "credentials": {
     "uri": "postgres://6f48a232-6a74-46ec-9554-37756d0d07c2:n42qc10tb30u1q6lvq6nvo9pcr@192.168.15.91:5432/6f48a232-6a74-46ec-9554-37756d0d07c2"
    },
    "label": "PostgreSQL",
    "name": "pg4ttrss",
    "plan": "Basic PostgreSQL Plan",
    "tags": [
     "PostgreSQL",
     "Database storage"
    ]
   }
  ]
 }
..

をもとにデータベース接続情報を入力し,

【Test Configuration】ボタンを押します。

設定に問題がなければ,この後順次【Initialize database】でデータベースを初期化し,【Save configuration】で今行った設定をファイル (config.php) に保存します。最後に【loading tt-rss now】のリンクをクリックするとログイン画面が表示されるので, InstallationNotes の以下の記述

  1. After finishing with the installer, open your Tiny Tiny RSS installation at http://your.site.com/tt-rss/ and login with default credentials (username: admin, password: password).

を参考に,ユーザー名とパスワードを入力してログインします。

この後,場合によっては「データベース・アップデーター」のフローに入ることもありますが,指示に従って【更新の実行】, 【OK】を押したのち再ログインすることで,利用画面に到達できます。

ログイン後最初の画面はこんな感じです:

右側の【操作…】ボタンから【フィードを購読する…】をクリックして本ブログのフィードを追加し,

左の【カテゴリー割り当てなし】の中の,追加したフィードの名前をクリックすると,フィードの読み込み及び記事の表示もできました。

おまけ: config.php の保存

本アプリでは,データベース接続その他の設定がドキュメント・ルートの config.php ファイルに保存されています。

以前他の PHP アプリの記事( SugarCRM, Simple Machines Forum, Shaari )でもありましたが,Cloud Foundry ではファイルシステムが揮発性 (アプリが停止/再起動するとファイルが消えてしまう) なので,このファイルを保存しておかないと再起動時に初期設定のやり直しになります。

そこで再起動時に楽をするために,config.php ファイルを保存しておきます。ファイルの取得は cf files コマンドで行います。

$ cf files tt-rss app/htdocs/config.php > config.php

先頭3行ほど不要な情報が混ざってしまっているので消します。

$ emacs config.php
$ git diff --no-index -- config.php~ config.php
diff --git a/config.php~ b/config.php
index af838d8..c8488ad 100644
--- a/config.php~
+++ b/config.php
@@ -1,6 +1,3 @@
-Getting files for app tt-rss in org nota-ja / space 100 as nota-ja...
-OK
-
 <?php
        // *******************************************
        // *** Database configuration (important!) ***

これをアプリのルート・ディレクトリーに置いておけば,次回以降アプリを更新するときも初期設定を回避することができます。

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

2015-08-12

FulcrumをCloud Foundryで動かす

みなさんこんにちは。 日本Cloud Foundryグループのスーパサブ@tnaotoです。 先日のPublickeyさんの記事がスマッシュヒットして、ある一部で有名人と化しております。ありがとうございます

「Cloud Foundry 百日行」前半最終日の第50日目の予定が@notaさんが原稿飛ばしたので、急遽繰り上がりでお送ります。

ということで、第49日目は、アジャイル開発支援ツール「Fulcrum」のご紹介です。

Fulcrumは、Pivotal TrackerのOSSクローンで、ストーリーベースのアジャイル開発を支援するツールです。

アジャイル開発の詳細説明は行いませんが、本ツールは、アジャイル開発の中でもスクラム手法に適し、 ストーリやバックログ、タスクの進捗管理等をデジタルな面で支えてくれる最適なツールとなります。

もちろん、有償のPivotal Trackerには敵いませんが、アジャイルを始めてみる場合に気軽に試せる環境としては有効かと思います。

基本情報

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

  1. ソースコードの取得
  2. 事前準備

    2.1 データベースサービスを用意する

    2.2. メールサービスを用意する

  3. コード修正

    3.1. コード修正

    3.2. database.ymlを用意する

    3.3. メール送信コードを追加する

    3.4. テスト用ユーザの追加する(オプション)

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

    4.1. manifestファイルを用意する

    4.2. アプリケーションのプッシュ   

  5. 動作確認

1.ソースコードの取得

git clone https://github.com/fulcrum-agile/fulcrum

開発が落ち着いているようであり、2015/8頭の段階で最新masterで問題なく動いています 動作確認済みのコミットハッシュは以下の通りです

5093e05eacbaa985cc3aa1c764cc1619ba5dd44a

2.事前準備

コードをpushする前に、いくつかファイルを修正します。

今回利用するサービスは以下の通りです。

  • MySQL(データベース)
  • sendgrid(メール送信サービス)

2.1 データベースサービスを用意する

データベースサービスを検索します。(CF環境へのログイン等は省略します)

Pivotal Web Serviceの場合、MySQLサービスは「cleardb」を利用します。

cf marketplace   

cleardb     spark, boost*, amp*, shock*    Highly available MySQL for your Apps.

なお、Bluemixの場合にも、MySQLサービスは「cleardb」が利用です。

データベースサービスを生成します。 利用プランは無償の「spark」、インスタンス名は「mysql」とします

cf create-service cleardb spark mysql

また、Bluemixにはサービスカタログには出てこない実験的扱いで、OSSのMySQLも存在します

こちらを利用する場合には、以下ようにサービスを作成します

cf create-service mysql 100 mysql

2.2 メール送信サービスを用意する

 2.1.のデータベースと同様にcf marketplaceを用いて検索します。

cf marketplace   

sendgrid    free, bronze*, silver*    Email Delivery. Simplified.

利用プランは無償の「free」、サービス名は「mail」とします。  

3.コード修正

3.1. コード修正

READMEのDeploying to other platformsに従い、コードを修正します config/fulcrum.example.rbをconfig/fulcrum.rbとしてコピーします。 ファイル内はコメントアウトされていますがコメントアウトを外し、以下のように設定します

Configuration.for('fulcrum') do
  app_host 'fulcrum.cfapps.io'
  mailer_sender 'noreply@example.com'
  disable_registration false
  column_order 'progress_to_left'
end

何も考えなければ、app_hostとmaier_senderだけ修正すれば充分に思います。

app_hostはデプロイする環境、および、アプリケーション名によって変更してください

3.2. database.ymlを用意する

Cloud Foundryのデータベースのautoconfigを利用するため、テンプレートをコピーして置いておくだけとします。

cp config/database.yml.mysql config/database.yml

3.3. メール送信コードを追加する

メール送信を行うにあたり、こちらのコードを参考に、以下のようにコードを追加します。

config/envirnoment.rb

# get Sendgrid credentials from ENV variable
credentials = host = username = password = ''
if !ENV['VCAP_SERVICES'].blank?
  JSON.parse(ENV['VCAP_SERVICES']).each do |k,v|
    if !k.scan("sendgrid").blank?
      credentials = v.first.select {|k1,v1| k1 == "credentials"}["credentials"]
      host = credentials["hostname"]
      username = credentials["username"]
      password = credentials["password"]
    end
  end
end

# overwrite ActionMailer settings to send through SendGrid servers
ActionMailer::Base.smtp_settings = {
  :address        => host,
  :port           => '587',
  :authentication => :plain,
  :user_name      => username,
  :password       => password,
  :domain         => 'example.com',
  :enable_starttls_auto => true
}

環境変数からサービスの情報を取得し、それを代入しています。

なお、sendgridを利用せずに、上記のsmtpの設定をgmail等他のサービスで利用することも可能です。

3.4.テスト用ユーザの追加する(オプション)

こちらのセクションは、3.3.の設定が充分に行われていれば、コードを修正する必要はありません。

db/seed.rbの1行目を修正し、railsアプリケーションの動作モードに関わらずユーザを作成するようにします。

 if true #<= Rails.env.development?

そもそも条件式にする必要があるのかという感じですが、コード上の変更を減らす最小限の修正となります。

なお、Fulcrumにはユーザ管理の機能が貧弱で作成済みユーザを削除する機能が無いため、必要の無い方は不用意にユーザを作成しないことをおすすめします。

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

4.1. manifestを用意する

今回、デプロイにあたっては、manifest.ymlを用意し、一括処理でデプロイします。 push時における処理は以下の通りとしました。

bundle exec rake db:migrate && bundle exec rails server --port=$POR

また、今回2つのサービスを利用しています。

manifestを使わずにデプロイする場合には、一度-no-startでpush後にbind-serviceを行い、再度pushすることで、アプリケーションにサービスの情報を渡しますが、manifestにサービス情報を記載すれば一度のpush処理で完結することができます。

最終的に記載した内容は以下の通りになります。

applications:
  - name: fulcrum
    command: bundle exec rake db:schema:load && bundle exec rake db:migrate && bundle exec rake db:seed && bundle exec rails server --port=$PORT
    services:
    - mysql
    - mail

4.2. アプリケーションのプッシュ

今回は、manifestが存在するため、以下のコマンドのみですべての設定が完結します。

cf push fulcrum

結果が成功することを祈りましょう

4.3 アプリケーションプッシュの失敗の場合

だいたいの場合、4.2.の結果が失敗するのではないかと思います。 成功した方は、このままスルーして頂いて構いません。

失敗する場合には、おそらくテーブル作成処理あたりで失敗しているのではないかと思います。

2015-08-11T14:37:41.32+0900 [App/0]      OUT -- create_table(:users)
2015-08-11T14:37:41.33+0900 [App/0]      ERR rake aborted!
2015-08-11T14:37:41.33+0900 [App/0]      ERR StandardError: An error has occurred, all later migrations canceled:
2015-08-11T14:37:41.33+0900 [App/0]      ERR undefined method `database_authenticatable' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x007fd0f9ac05b8>/home/vcap/app/db/migrate/20110210082458_devise_create_users.rb:4:in `block in up'

原因はrails回りのバグかと思われますが、これを回避するために事前にテーブル作成のみ行います。

失敗した環境の場合には、まず以下のコマンドを打ってテーブルを作成してください。

cf push fulcrum -c 'bundle exec rake fulcrum:setup db:setup' --no-start

特にエラーもなく終了したら、最後アプリケーションをプッシュしてください

cf push fulcrum

5.動作確認

ブラウザを開き、アプリの動作を確認しましょう。

3.4.でユーザを作っている場合には、test@example.com/testpassでログインできます。

また、作ってない場合や新たなにユーザを作成したい場合には、「sing up」を押し、新規ユーザを作成してみましょう。

設定がうまく行われている場合には、指定したメールアドレスにメールが飛び、 添付されるURLをクリックすることで、新規ユーザが作成できます。

ログインが完了すると何も無いダッシュボードが現れます。

試しに、プロジェクトを作成し、ストーリを作成します。

ストーリを開始すると、In Progressに移行し、完了すると、[deliver]が現れます。 ストーリの受け入れの可否を選択し、受け入れの場合は終了し、拒否の場合には再度ストーリが開始されます。 一般的なストーリベースの開発と一緒ですね

Redmine等を駆使されている方は、試してみるのはいかがでしょうか


まとめ

PaaSを使って、アプリ開発スピードを上げていく場合に、アジャイル(スクラム手法)は非常に有効な手段であると、筆者は考えています。

その際に、fulcrumのようなアジャイル開発に特化したツールを使えば、生産性向上に一役買うことになるでしょう。

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

今回使用した改造付きソースコードは以下に置いてあります。 何かの参考にお使いください

2015-08-11

pimcore を Cloud Foundry で動かす

「Cloud Foundry 百日行」第48日目は、やたらと多機能なCMS pimcore です。

基本情報

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

  • 1) ソースコードの取得
  • 2) 事前準備
  • 3) Cloud Foundry 環境へのプッシュ
  • 4) 動作確認

1. ソースコードの取得

$ git clone https://github.com/pimcore/pimcore
$ cd pimcore
pimcore$ ls
3rd-party-licenses.md  composer.json  LICENSE.txt  plugins_example  tests   website_demo
build                  index.php      pimcore      README.md        update  website_example

PHPのアプリです。

2. 事前準備

データベースの準備

SeviceとしてMySQLのデータベースを準備します。

起動無しで一旦アプリをPushし、

pimcore$ cf push pimcore --no-start
Creating app pimcore in org ukaji / space default as ukaji...
OK
 
Creating route pimcore.10.244.0.34.xip.io...
OK
 
Binding pimcore.10.244.0.34.xip.io to pimcore...
OK
 
Uploading pimcore...
Uploading app files from: /home/ukaji/workspace/pimcore
Uploading 57.8M, 15020 files
Done uploading               
OK

MySQLのServiceを作り、

pimcore$ cf create-service p-mysql 100mb pimcore-db
Creating service instance pimcore-db in org ukaji / space default as ukaji...
OK

アプリとバインドします。

pimcore$ cf bind-service pimcore pimcore-db
Binding service pimcore-db to app pimcore in org ukaji / space default as ukaji...
OK
TIP: Use 'cf restage pimcore' to ensure your env variable changes take effect

必要モジュールの導入

ドキュメント を見ながら必要な環境を設定していきます。
必要なモジュール等は上記ページに列挙してくれているので、全て入れてしまいましょう。

pimcore$ mkdir .bp-config
pimcore$ vi .bp-config/options.json
{
        "PHP_MODULES": ["cli", "cgi"],
        "PHP_EXTENSIONS": ["mcrypt", "mysqli", "gd", "exif", "mbstring", "zlib", "zip", "bz2", "openssl", "imagick", "opcache", "memcache", "curl", "fileinfo"]
}

ドキュメント中にあるReauirementsの中で、 iconv dom simplexml の3つはPHP-Buildpackの追加モジュールのサポート対象に含まれておらずここには記述されていませんが、インストールは自動的に行われているためここでは特に記述の必要はありません。
逆に、 PHP_EXTENTIONS 末尾の fileinfo はRequirementsの中にはリストアップされていませんが、インストール手続きの途中で必要と言われるため、ここで入れてしまっています。

Permission設定

次に ファイルのPermission です。
こちらについても設定してしまいましょう。

pimcore$ chmod -R 777 website_demo/var/
pimcore$ chmod -R 777 website_example/var/
pimcore$ chmod -R 777 pimcore/

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

アプリをPushします。
比較的アプリのサイズも大きく必要とするモジュールも多いのでいつもより時間がかかると思いますが気長に待ちましょう。

pimcore$ cf push pimcore
(一部略)
-----> Uploading droplet (166M)

0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
1 of 1 instances running

App started


OK

App pimcore was started using this command `$HOME/.bp/bin/start`

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

requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: pimcore.10.244.0.34.xip.io
last uploaded: Mon Aug 10 09:34:54 UTC 2015
stack: cflinuxfs2
buildpack: Found

     state     since                    cpu    memory         disk      details
#0   running   2015-08-10 06:36:41 PM   0.0%   135M of 256M   0 of 1G

起動しました。

4. 動作確認

ブラウザからアクセスしてみると、

インストーラが起動しています。

cf env でDB接続のための環境変数

"VCAP_SERVICES": {
 "p-mysql": [
  {
   "credentials": {
    "hostname": "10.244.7.6",
    "jdbcUrl": "jdbc:mysql://10.244.7.6:3306/cf_04c1755c_47b9_4a22_87fe_a4b0f8ae8559?user=pFCLFDlYzcl27aDP\u0026password=uu7sdofZE42G8h09",
    "name": "cf_04c1755c_47b9_4a22_87fe_a4b0f8ae8559",
    "password": "uu7sdofZE42G8h09",
    "port": 3306,
    "uri": "mysql://pFCLFDlYzcl27aDP:uu7sdofZE42G8h09@10.244.7.6:3306/cf_04c1755c_47b9_4a22_87fe_a4b0f8ae8559?reconnect=true",
    "username": "pFCLFDlYzcl27aDP"
   },
   "label": "p-mysql",
   "name": "pimcore-db",
   "plan": "100mb",
   "tags": [
    "mysql"
   ]
  }
 ]
}

を参考にしつつ、フォームの必要な項目を埋めて右下の Install Now! を押下します。

Admin Userの箇所はお好きな文字列をどうぞ。

しばらくするとログインページに遷移するので、先ほどAdmin Userに登録した Username / Password でログインしましょう。

ログイン後のページはこちら。Dashboardです。

メニューの FileSeemode を選ぶと、一般ユーザからみたウェブサイトを閲覧することができ、

さらに右下の Edit this page を押下するとウェブサイトを見ながら編集を行う、といったことも可能です。

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

2015-08-10

「Cloud Foundry 百日行」中休みのお知らせ

「Cloud Foundry 百日行」中休みのお知らせ (8/14〜31)

6月4日に始めた,オープンソース PaaS “Cloud Foundry” 上にオープンソースのアプリケーションを百日間デプロイする試み「Cloud Foundry 百日行」も,今週の木曜日,8月13日で,50日目の折り返しを迎えます。

そこで,ちょうど世間が夏休みに入る時期でもあり,その50日目を公開した後,「百日行」も中休みを取らせていただきます。

中休みの目的は,主に動作確認済みアプリケーションのストックを増やすことです。記事の執筆前にはアプリケーションの動作確認を行っているのですが,この作業はアプリケーションによっては非常に時間がかかります。1日分の記事を書くのに,動作確認が3日かかることもあります。記事の執筆者はそれぞれ別に本業を持っていて,多くの時間を動作確認に割くこともできないので,ストックは記事公開開始から順調に減り続けていて,このままでは意図しない中断が発生する恐れもあります。そこで思い切って中休みを取り,動作確認済みアプリケーションのストックを増やそうと考えています。

記事公開の再開は9月1日(火)を予定しています。

それまで皆様しばしお待ちいただき,9/1になったら思い出していただけるとありがたく思います。

Shout を Cloud Foundry で動かす

「Cloud Foundry 百日行」第47日目は,WebベースIRCクライアントShout です。
ブラウザ上から簡単にIRC接続が可能な為、クライアントの準備や接続環境の制約で利用が困難な状況等で、お持ちのCloud Foundry環境へPushして頂くと便利です。

基本情報

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

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

1. ソースコードの取得

$ git clone https://github.com/erming/shout.git
$ cd shout/
$ ls
CHANGELOG.md  client  defaults  Gruntfile.js  index.js  package.json  README.md  src  test

2. アプリの起動

アプリのプッシュ

アプリをデプロイします。

$ cf push shout
:
1 of 1 instances running
 
App started
 
 
OK
 
App shout was started using this command `npm start`
 
Showing health and status for app shout in org morika-t / space morika-t as admin...
OK
 
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: shout.10.244.0.34.xip.io
last uploaded: Mon Aug 3 07:34:47 UTC 2015
stack: cflinuxfs2
buildpack: Node.js
 
     state     since                    cpu    memory          disk      details
#0   running   2015-08-03 04:36:41 PM   0.0%   73.9M of 256M   0 of 1G

成功しました。

3. 動作確認

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

動作確認のため、Cloud FoundryのIRCチャンネルに接続してみます。

フィールド
“Name” Freenode
“Server” irc.freenode.org : 6697
“Password” (空欄)
“Enable TLS/SSL” チェックボックスにチェック
“Nick” 任意のニックネーム
“Username” 任意のユーザ名
“Real name” 任意のネーム
“Channels” #cloudfoundry

“CONNECT”をクリックするとIRC Channelに接続します。

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



投稿者:NTTソフトウェア株式会社 森川 健

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 対応にするときも参考になるかもしれません。

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

2015-08-06

phpMyAdminをCloud Foundryで動かして、お手軽DBメンテナンス!


みなさんこんにちは。 日本Cloud Foundryグループのセカンドトップ、jacopenです。ちなみにセンターフォワードがhiroakiukajiでトップ下がozz会長、サイドバックがnota-jaです。

日本CFグループのフォーメーションはこの辺にしといて、今日はCloud Foundry百日行の45日目。紹介するのは、みんな大好きphpMyAdminです。

Cloud Foundryと相性がいいphpMyAdmin

Cloud Foundryをベースにしたサービスの多くは、ビルトインサービスという形で無償のMySQLを提供しています。このビルトインサービスを使って開発を進めていきたい人も多いでしょう。ですが、多くの人が最初に直面する大きな問題があります。

それは何かというと、外部から直接MySQLインタンスに接続することができないということ。つまり、手元のmysqlコマンドやMySQL Administratorを使ってインスタンスの操作ができないということです。

これは結構困りますね。Railsのように事前に定義しておいてdb migrateするだけで良いみたいな仕組みを作っていれば別として、自分でテーブルやカラムを作成しながら開発を進めていくといったやり方が出来なくなってしまいます。

じゃあどうすれば?というときに役に立つのが、phpMyAdminなわけです。

構成

phpMyAdminは有名なのでご存じの方が多いと思いますが、ブラウザから利用できるMySQLのクライアントツールです。その名の通り、PHPで書かれています。

今回はこのような構成を想定してCloud Foundryにデプロイしてみます。ひとつのService instanceに対して、開発中アプリケーションとphpMyAdmin両方からbindすることで、開発中アプリケーションに影響を及ぼすことなくMySQLのメンテナンスを行うことが出来ます。



phpMyAdminをデプロイする前に、以下のようにmysql serviceを作成しておきました。
$ cf create-service mysql default php-mysql-dev
OK

デプロイ

デプロイするphpMyAdminは、Cloud Foundry向けにカスタマイズされたバージョンを利用します。
https://github.com/cloudfoundry-community/phpmyadmin-cf

上記リポジトリから、zip版のアーカイブがダウンロードできるので手元で展開します。

$ wget https://github.com/cloudfoundry-community/phpmyadmin-cf/archive/cf-ready.zip
$ unzip cf-ready.zip
$ cd phpmyadmin-cf-cf-ready/

そして、おもむろにpushします。(※実験に使っているCloud(n) PaaSだとbuildpackが古かったため、-bでPHP buildpackを別途指定しています)

$ cf push -b https://github.com/cloudfoundry/php-buildpack.git#v3.2.2
Using manifest file /Users/jacopen/Downloads/phpmyadmin-cf-cf-ready/manifest.yml

Updating app phpmyadmin-cfready in org xxxxx / space default as xxxxxxxxxxxx...
OK
(中略)
     state     since                    cpu    memory      disk           details
#0   running   2015-08-02 05:12:42 PM   0.0%   16M of 1G   102.1M of 2G

push後、serviceにbindしてrestageします
$ cf bind-service phpmyadmin-cfready php-mysql-dev
Binding service php-mysql-dev to app phpmyadmin-cfready in org xxxxxxxxxx / space default as xxxxxxxxxxx...
OK
TIP: Use 'cf restage phpmyadmin-cfready' to ensure your env variable changes take effect
$ cf restage phpmyadmin-cfready
Restaging app phpmyadmin-cfready in org xxxxxxxxxx / space default as xxxxxxxxxxxxxxxx..

標準では以下のようなmanifest.ymlになっています。アプリ名を変更したい場合やメモリサイズを変えたい場合は、このmanifest.ymlを編集すると良いでしょう。
---
#Generated manifest
applications:
- name: phpmyadmin-cfready
  memory: 1G
  instances: 1

動いたようです。

大抵のサービスでは、builtin serviceのユーザー名、パスワードをコントロールパネルから取得できます。取得したら、phpmyadminに入力してログインしてみましょう。

無事、ログイン出来たようです。
これでbuiltin serviceのmysqlも自由自在に操作できますね。

認証があるとはいえ、phpmyadminを立ち上げたままにするのはセキュリティ的によろしくないため、利用が終わったらアプリを削除するか、停止しておくと良いでしょう。このあたりの公開・非公開が簡単にできるのも、PaaSの強みですね。

今回使用した環境

2015-08-05

AnchorCMS を Cloud Foundry で動かす

「Cloud Foundry 百日行」第44日目は、データベース付きのCMSツール Anchor CMS です。

基本情報

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

  • 1) ソースコードの取得
  • 2) 事前準備
  • 3) Cloud Foundry 環境へのプッシュ
  • 4) 動作確認

1. ソースコードの取得

$ git clone https://github.com/anchorcms/anchor-cms/
$ cd anchor-cms

さて、今回のアプリケーションですが、最新版のコードには一部 バグ が含まれており、現在開発元が対応中のようです。
今回は検証時に動かすことができたバージョンに git checkout して動かしてみます。

anchor-cms$ git checkout d3383dc
anchor-cms$ ls
anchor  composer.json  content  contributing.md  index.php  install  LICENSE  readme.md  system  themes

2. 事前準備

モジュールの追加

さて、GithubのReadmeにある Requirements によれば、このアプリケーションを起動するには

  • PHP 5.3.6+
    • curl
    • mcrypt
    • gd
    • pdo_mysql or pdo_sqlite
  • MySQL 5.2+

の環境が必要とのことです。

Cloud Foundry上でPHPのアプリを動かす際のモジュールの追加・拡張は、PHP-Buildpackの機能を使ってやっていきましょう。

anchor-cms$ mkdir .bp-config
anchor-cms$ vi .bp-config/options.json
{
    "PHP_EXTENSIONS": ["curl", "mcrypt", "gd", "pdo", "pdo_mysql", "mbstring"]
}

pdopdo_mysql を単体で用いようとすると警告を受けるため、 mbstring はマルチバイト文字に対応させるために追加しています。

.htaccessファイルの追加

このままアプリを起動するとhtaccessファイルを追加して下さい、という内容のWarningが表示されるので、予め追加してしまいましょう。

anchor-cms$ vi .htaccess
Options -indexes
 
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
 
    # Allow any files or directories that exist to be displayed directly
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
 
    # Rewrite all other URLs to index.php/URL
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>
 
<IfModule !mod_rewrite.c>
    ErrorDocument 404 index.php
</IfModule>

データベースの準備

MySQLのServiceを準備します。

アプリを起動無しモードでデプロイし、

anchor-cms$ cf push anchor-cms --no-start
Creating app anchor-cms in org ukaji / space default as ukaji...
OK

Creating route anchor-cms.10.244.0.34.xip.io...
OK

Binding anchor-cms.10.244.0.34.xip.io to anchor-cms...
OK

Uploading anchor-cms...
Uploading app files from: /home/ukaji/workspace/anchor-cms
Uploading 615.1K, 329 files
Done uploading               
OK

Serviceを作り、

anchor-cms$ cf marketplace
Getting services from marketplace in org ukaji / space default as ukaji...
OK

service      plans                     description   
PostgreSQL   Basic PostgreSQL Plan*    PostgreSQL on shared instance.   
p-mysql      100mb, 1gb                MySQL databases on demand   
p-redis      shared-vm, dedicated-vm   Redis service to provide a key-value store   

* These service plans have an associated cost. Creating a service instance will incur this cost.

TIP:  Use 'cf marketplace -s SERVICE' to view descriptions of individual plans of a given service.
anchor-cms$ cf create-service p-mysql 100mb anchor-cms-db
Creating service instance anchor-cms-db in org ukaji / space default as ukaji...
OK

アプリとServiceをバインドします。

anchor-cms$ cf bind-service anchor-cms anchor-cms-db
Binding service anchor-cms-db to app anchor-cms in org ukaji / space default as ukaji...
OK
TIP: Use 'cf restage anchor-cms' to ensure your env variable changes take effect

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

さて、アプリをPushしましょう。

anchor-cms$ cf push anchor-cms
(一部略)
-----> Uploading droplet (27M)

1 of 1 instances running

App started


OK

App anchor-cms was started using this command `$HOME/.bp/bin/start`

Showing health and status for app anchor-cms in org ukaji / space default as ukaji...
OK

requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: anchor-cms.10.244.0.34.xip.io
last uploaded: Tue Aug 4 01:06:44 UTC 2015
stack: cflinuxfs2
buildpack: Found

     state     since                    cpu    memory          disk      details   
#0   running   2015-08-04 10:09:20 AM   1.6%   40.6M of 256M   0 of 1G

無事起動しました。

4. 動作確認

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

インストーラのページに飛ぶので、 Run the installer ボタンを押下してそのまま進めていきます。
設定項目は言語とTime Zone、データベース、サイト情報、アカウント情報の4つです。

まずは言語とTime Zoneの設定から。

言語は英語、Time Zoneは東京を選択しました。

次にデータベースの設定。
少々設定項目が多いですが、アプリケーションの環境変数情報 cf env を見ながら進めていきましょう。

anchor-cms$ cf env anchor-cms
Getting env variables for app anchor-cms in org ukaji / space default as ukaji...
OK

System-Provided:
{
 "VCAP_SERVICES": {
  "p-mysql": [
   {
    "credentials": {
     "hostname": "10.244.7.6",
     "jdbcUrl": "jdbc:mysql://10.244.7.6:3306/cf_9e3ba864_bff3_4705_bd4b_c8e056c6359f?user=jJtCVAOsOLeZwJ6S\u0026password=QNop8epy7jps2pmF",
     "name": "cf_9e3ba864_bff3_4705_bd4b_c8e056c6359f",
     "password": "QNop8epy7jps2pmF",
     "port": 3306,
     "uri": "mysql://jJtCVAOsOLeZwJ6S:QNop8epy7jps2pmF@10.244.7.6:3306/cf_9e3ba864_bff3_4705_bd4b_c8e056c6359f?reconnect=true",
     "username": "jJtCVAOsOLeZwJ6S"
    },
    "label": "p-mysql",
    "name": "anchor-cms-db",
    "plan": "100mb",
    "tags": [
     "mysql"
    ]
   }
  ]
 }
}

{
 "VCAP_APPLICATION": {
  "application_name": "anchor-cms",
  "application_uris": [
   "anchor-cms.10.244.0.34.xip.io"
  ],
  "application_version": "77ee0038-74e1-460c-a712-459ead61a353",
  "limits": {
   "disk": 1024,
   "fds": 16384,
   "mem": 256
  },
  "name": "anchor-cms",
  "space_id": "03bf316f-df9e-442e-b127-589e673a5652",
  "space_name": "default",
  "uris": [
   "anchor-cms.10.244.0.34.xip.io"
  ],
  "users": null,
  "version": "77ee0038-74e1-460c-a712-459ead61a353"
 }
}

No user-defined env variables have been set

No running env variables have been set

No staging env variables have been set

Table Prefix、CollationはそのままでOKです。

次にサイト情報。ここは変更なしでも大丈夫です。

最後にアカウント設定。ここの項目は後々ログインで必要となるので覚えておきましょう。

Complete ボタンを押下すれば完了です。

サイトの見た目と管理者ページはこのようになっています。

記事の作成も簡単に実行できます。

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

2015-08-03

My Mind を Cloud Foundry で動かす

「Cloud Foundry 百日行」第42日目,今日のアプリは,マインドマップ作成ツール My Mind です。

同様のツールとしては, 9日目 に MindMup を紹介しましたが,MindMup が Ruby アプリであるのに対し,本アプリは基本的に JavaScript で構成されており,一部だけ PHP が使われているという構成になっています。

両方とも Cloud Foundry へのデプロイは割と簡単(特にこの My Mind は簡単)なので,どちらが好みに合うか,それぞれデプロイして較べてみるのもいいかもしれません。

基本情報

手順は以下の通りです。

  • 1) ソースコードの取得
  • 2) アプリのデプロイ
  • 3) 動作確認

1. ソースコードの取得

GitHub からソースコードをクローンします。いつも通りの手順です。

$ git clone https://github.com/ondras/my-mind.git
$ cd my-mind/

2. アプリのデプロイ

ただ cf push するだけです。

$ cf push my-mind
Creating app my-mind in org nota-ja / space 100 as nota-ja...
OK
..
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: my-mind.10.244.0.34.xip.io
last uploaded: Mon Aug 2 07:07:24 UTC 2015
stack: cflinuxfs2
buildpack: PHP

     state     since                    cpu    memory          disk      details
#0   running   2015-08-02 04:07:43 PM   1.5%   28.2M of 256M   0 of 1G

すんなりと起動しました。Buildpack としては PHP が自動で選ばれるようです。

3. 動作確認

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

起動直後の画面:

マインドマップを書いてみました:

【Browser storage】に保存してみました:

一度ブラウザーのウィンドウを閉じた後,保存したマップをロードしてみます:

先ほど書いたマップがちゃんと再現されました:

Browser storage を使う場合は,ほぼデスクトップ・アプリケーションと変わりなく使える感じです。

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