2015-11-12

Mconf-Web を Cloud Foundry で動かす

「Cloud Foundry 百日行」第98日目は、RailsベースのWeb会議システム、Mconf-Webです。
Mconf-Webは、会議ごとに参加するユーザ間での情報共有やビデオ会議が行えるアプリです。
ビデオ会議の機能については、残念ながら、今回の検証時間内で動かすことができませんでしたが、会議自体の管理や会議毎の情報共有をする目的で利用する場合、便利だと思います。

基本情報

デプロイ準備から動作確認までの手順は以下の通りです。

  • 1) ソースコードの取得
  • 2) サービスの作成
  • 3) ファイルの修正
  • 4) 設定ファイルの準備
  • 5) デプロイ
  • 6) 動作確認
  • 7) まとめ

1. ソースコードの取得

Mconf-Webのソースを、GitHubから取得します。
最新版はv2.0.0なので、チェックアウトします。

$ git clone https://github.com/mconf/mconf-web.git
$ cd mconf-web
mconf-web$ git checkout v2.0.0 -b mc-v2
Switched to a new branch 'mc-v2'
mconf-web$ ls -a
.    Cheffile       cookbooks-local  Gemfile.lock  LICENSE  .rails_footnotes  .ruby-version  tmp
..   Cheffile.lock  db               .git          log      Rakefile          .rvmrc         .travis.yml
app  config         doc              .gitignore    private  README.rdoc       script         Vagrantfile
bin  config.ru      Gemfile          lib           public   .rspec            spec           vendor

2. サービスの作成

Mconf-WebはMySQLRedisを使用するため、作成しておきます。

mconf-web$ cf create-service p-mysql 100mb mw-mysql
:
OK
mconf-web$ cf create-service p-redis shared-vm mw-redis
:
OK
mconf-web$ cf services
:
name       service   plan        bound apps   last operation
mw-mysql   p-mysql   100mb                    create succeeded
mw-redis   p-redis   shared-vm                create succeeded

後ほど、Redisの接続設定を取得するため、no-startcf pushした本アプリに作成したRedisサービスをバインドしておきます。
MySQLについては、Cloud Foundryのauto-reconfiguration機能で自動的に接続設定されるため、この操作は不要です。

mconf-web$ cf push --no-start mconf-100
:
Uploading 3.3M, 1708 files
Done uploading
OK
mconf-web$ cf bind-service mconf-100 mw-redis
:
OK

3. ファイルの修正

3-1. Gemfileファイルの修正

RailsアプリをCloud Foundryで動かす場合、画面が予期したスタイルにならない等などの不具合を解消するため、Gemfilerails_12factorを追加します。

mconf-web$ git diff --no-prefix Gemfile
diff --git Gemfile Gemfile
index c828719..9495583 100644
--- Gemfile
+++ Gemfile
@@ -100,6 +100,9 @@ gem "logstash-event"
 gem 'fineuploader-rails', git: 'https://github.com/mconf/fineuploader-rails.git'
 gem 'filesize'

+# for Cloud Foundry
+gem "rails_12factor"
+
 #
 # TODO: Gems to review if we can remove/update
 #

3-2. Gemfile.lockファイルの生成

修正したGemfileから、Gemfile.lockを再生成します。
.ruby-version2.2.0が指定されているので、予め環境にインストールしておいて下さい。

mconf-web$ bundle install --path vendor/bundle
mconf-web$ git diff --no-prefix Gemfile.lock
diff --git Gemfile.lock Gemfile.lock
index cf80c96..99952ac 100644
--- Gemfile.lock
+++ Gemfile.lock
@@ -397,8 +397,13 @@ GEM
       sprockets-rails (~> 2.0)
     rails-footnotes (4.0.2)
       rails (>= 3.2)
+    rails_12factor (0.0.3)
+      rails_serve_static_assets
+      rails_stdout_logging
     rails_autolink (1.1.6)
       rails (> 3.1)
+    rails_serve_static_assets (0.0.4)
+    rails_stdout_logging (0.0.4)
     railties (4.1.11)
       actionpack (= 4.1.11)
       activesupport (= 4.1.11)
@@ -622,6 +627,7 @@ DEPENDENCIES
   rack (~> 1.5.4)
   rails (~> 4.1.11)
   rails-footnotes
+  rails_12factor
   rails_autolink (~> 1.1.0)
   rake
   resque
@@ -658,3 +664,6 @@ DEPENDENCIES
   yui-compressor
   zip-zip
   zonebie
+
+BUNDLED WITH
+   1.10.6

副産物のvendor/bundle配下のファイルは、アプリのデプロイには不要ですので、削除するか、第89日目でも記述されているように.cfignoreでプッシュ対象から除外して下さい。

4. 設定ファイルの準備

デプロイに必要な各種設定ファイルの作成を行っていきます。

4-1. setup_conf.ymlの設定

Mconf-Web用の設定ファイル setup_conf.yml を作成します。
ベースは、Mconf-WebのDeploymentマニュアルに従って、用意されているsetup_conf.yml.exampleをコピーして作成します。

mconf-web$ cp config/setup_conf.yml.example config/setup_conf.yml

次に、RedisのCredential情報を設定します。
cf envで、RedisのCredential情報を確認します。

mconf-web$ cf env mconf-100
:
System-Provided:
{
 "VCAP_SERVICES": {
  "p-redis": [
   {
    "credentials": {
     "host": "10.244.3.46",
     "password": "1e03a94f-5bb1-42cd-9bd4-ce289b6f6dea",
     "port": 50120
    },
    "label": "p-redis",
    "name": "mw-redis",
    "plan": "shared-vm",
    "tags": [
     "pivotal",
     "redis"
    ]
   }
  ]
 }
}

config/setup_conf.ymlに、取得したCredential情報を設定します。

mconf-web$ git diff --no-prefix config/setup_conf.yml
diff --git config/setup_conf.yml config/setup_conf.yml
index 4ab5da0..6fba9b6 100644
--- config/setup_conf.yml
+++ config/setup_conf.yml
@@ -47,11 +47,11 @@ default:

   # If you're running redis on the same server and without a password, you
   # can leave this block commented
-  # redis:
-  #   host: 'localhost'
-  #   port: '6379'
-  #   db: 0
-  #   password: '1234567890'
+  redis:
+    host: '10.244.3.46'
+    port: '50120'
+    db: 0
+    password: '1e03a94f-5bb1-42cd-9bd4-ce289b6f6dea'

 # Configurations for each environment
 # You can find below the sections for each environment available.

4-2. Aptfileファイルの作成

Mconf-WebのDeploymentマニュアルに記述されているaptパッケージの中で、RootFSに入っていないと思われるものから、入れる必要があるパッケージをピックアップしてデプロイ時にインストールするようにします。
インストールは、heroku-buildpack-aptを使って行います。
インストールするパッケージは、本アプリのルートディレクトリにAptfileファイルを作成して定義します。

mconf-web$ vi Aptfile
aspell-es
aspell-en
nfs-common
libreadline-dev
libffi-dev
openjdk-7-jre
libapache2-mod-xsendfile

4-3. .buildpacksファイルの作成

複数のBuildPackを指定してデプロイをする必要があるため、heroku-buildpack-multiを使ってデプロイを行います。
使用するBuildPackは、アプリのルートディレクトリに.buildpacksファイルを作成して定義します。
ruby-buildpackのバージョンは、今回の検証環境として使用しているcf-release v211admin buildpack と同じものを指定しています。

mconf-web$ vi .buildpacks
https://github.com/ddollar/heroku-buildpack-apt.git
https://github.com/cloudfoundry/ruby-buildpack.git#v1.6.7

4-4. manifes.tymlファイルの作成

デプロイ用のマニフェストを作成します。

mconf-web$ vi manifest.yml
applications:
- name: mconf-100
  memory: 1G
  buildpack: https://github.com/ddollar/heroku-buildpack-multi.git
  command: 'bundle exec rake db:migrate && bundle exec rake db:seed && bundle exec rackup --port $PORT'
  domain: 192.168.15.91.xip.io
  timeout: 180
  services:
    - mw-mysql
    - mw-redis
  env:
    PATH: '$PATH:/tmp/staged/app/.apt/usr/lib/jvm/java-7-openjdk-amd64/bin'

設定について、特徴的な箇所について記述します。
* memory: デプロイ直後でメモリがデフォルトの256MBでギリギリでしたので、念のため1Gとしました。
* buildpack: heroku-buildpack-multiを指定します。
* timeout: 起動に若干時間がかかるため、Max値の180秒を指定しました。
* env: Aptfileで指定したjava-7の展開先が、heroku-buildpack-aptの想定箇所と異なるため、手動で指定します。

5. デプロイ

デプロイ準備が完了したら、cf pushします。

mconf-web$ cf push
:
OK

requested state: started
instances: 1/1
usage: 1G x 1 instances
urls: mconf-100.192.168.15.91.xip.io
last uploaded: Wed Nov 11 10:23:21 UTC 2015
stack: cflinuxfs2
buildpack: https://github.com/ddollar/heroku-buildpack-multi.git

     state     since                    cpu    memory         disk      details
#0   running   2015-11-11 07:34:33 PM   0.0%   271.8M of 1G   0 of 1G

無事、デプロイは成功しました。

6. 動作確認

ブラウザから払いだされたアプリのURLへアクセスすると、トップページが表示されます。
初期ユーザは admin/adminなのでSign in to your account のほうに入力してログインすると、ホーム画面が表示されます。

まずは、上段にあるManageをクリックし、Site ManagementページからMconf-Webの設定を行ってみます。
各ユーザからの会議への参加申し込み・承認等ではメール通知が行われるため、SMTPサーバ等の設定が必要です。ただ、今回はGmailのアカウントを登録してみましたが、上手くメールが配信出来ませんでした。

次に、Spaceを作っていきます。Mconf-Webでは、各会議(Conference)はSpaceという単位で管理します。
ホーム画面の右側にあるCreate a new spaceボタンをクリックし、Spaceを作成します。

Space作成用のフォームに会議名や説明を入力し、Createボタンをクリックすると、Spaceが作成されます。

今度は、新しくユーザを作成してみます。ログアウトしてトップ画面に戻り、Create a new accountからユーザを作成すると、ホーム画面が表示されます。

自分で会議(Space)を新規作成することもできますが、公開されている会議があれば、へ参加申し込み(Join this space)を出すことができます。

各会議のページでは、コメント共有やビデオ会議(上手く起動しませんでしたが…)などが行えます。
コメントの共有は、Wallからメッセージを登録します。登録されたメッセージは、参加メンバーのホームにも表示されます。

ビデオ会議は、WebconferenceStartボタンを押すと開催できるはずですが、今回はエラーとなってしましました。

7. まとめ

公式サイトGithubの説明をみると、ビデオ会議を行うには Mconf-LiveBigBlueButton サーバが必要なようです。
今回、Docker Hubに登録されているBigBlueButtonで立ち上げ、以下のようにSite Managementページから設定しましたが、残念ながら上手く接続できない状態でタイムアップとなってしまいました…

今後、もう少し検証しよい結果がでましたら、本ページのほうを更新したいと思います。
もしも何か知見をお持ちの方は、 Twitter で @horiu_jnにmentionを飛ばして頂ければと思います。

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



投稿者:NTTソフトウェア株式会社 堀内 純