2015-06-19

Etherpad を Cloud Foundry で動かす

Etherpad 基本情報

  • 公式サイト
    http://etherpad.org/
  • ソースコード
    https://github.com/ether/etherpad-lite
  • 関連情報
    https://en.wikipedia.org/wiki/Etherpad

Etherpad とは?

Etherpad は日本ではあまりなじみがないかもしれませんが、複数の開発者がよってたかって文章を編集できるソフトウェアで、オープンソースです。文書を校正したい場合には、文書のレビュー機能を使って電子メールでまわすというのはよく実施されていると思いますが、ちょっとした文書を少しレビューしてほしい場合には、Etherpad はうってつけです。なおこのソフトウェアは Google によって会社が買収された後にオープンソース化されたようですね。

それでは動かしてみましょう。

デプロイ

今回はデプロイに Bluemix を利用しましたが、独自機能は利用していないので、Cloud Foundry でも動作すると思います。

1. ソースの入手

今回は Etherpad-lite を導入します。ソースは GitHub で公開されています。


% git clone https://github.com/ether/etherpad-lite
Cloning into 'etherpad-lite'...
remote: Counting objects: 26649, done.
remote: Total 26649 (delta 0), reused 0 (delta 0), pack-reused 26649
Receiving objects: 100% (26649/26649), 18.94 MiB | 180.00 KiB/s, done.
Resolving deltas: 100% (18848/18848), done.
Checking connectivity... done.
% cd etherpad-lite/
% ls
CHANGELOG.md     LICENSE   README.md  doc                     src        tests
CONTRIBUTING.md  Makefile  bin        settings.json.template  start.bat  var


GitHub のページにローカルの環境で動作させるための手順が書いてあります。それによると "bin/run.sh" を動かせばよいとあります。今回は、Cloud Foundry 上で動作させるため、このコマンドを実施しないで、その内容を Cloud Foundry で実現するための修正を行います。

2. Cloud Foundry 上で動作させるための修正

Ehterpad-lite は Node.js で稼働するアプリケーションです。Node.js アプリケーションをCloud Foundry で動かすための重要なポイントは:
  • 固定ポートを指定している場合には、PORT環境変数を読み取るように修正する
  • シンボリックリンクを利用しないようにファイル・ディレクトリ(フォルダー)情報を修正する
  • package.json ファイルを用意する
があります。Etherpad-lite も上記を修正する必要がありました。

固定ポートですが、Etherpad-lite は固定ポートを指定していない場合には、PORT環境変数を読み取ってくれるようです。したがって、固定ポートを指定している settings.json.template を書き換えます。

% diff settings.json.template.original settings.json.template
16c16
<   "port" : 9001,
---
>   // "port" : 9001,


次に、"bin/run.sh" の中身をみると "bin/installDeps.sh" ではシンボリックリンク作成処理とnpm コマンド実行行があるので、これを "cp -r "とnpm コマンド実行行をコメントアウトします。


% cp installDeps.sh installDeps.sh.original
% vi installDeps.sh
% diff installDeps.sh.original installDeps.sh
78c78
<   [ -e ep_etherpad-lite ] || ln -s ../src ep_etherpad-lite
---
>   [ -e ep_etherpad-lite ] || cp -r ../src ep_etherpad-lite
80c80
<   npm install --loglevel warn
---
> #  npm install --loglevel warn


npmコマンドをコメントアウトするのは、Cloud Foundryへアプリケーションを "push"するときに自動的に行ってくれるようにするためです。package.json は src フォルダーにあるものを再利用できます。


% cp src/package.json .


installDeps.sh を実行して、必要なファイル (ただし npm パッケージは除く)を入手します。jQueryなどのプラグインを入手するようです。


% bin/installDeps.sh
Copy the settings template to settings.json...
Ensure that all dependencies are up to date...  If this is the first time you have run Etherpad please be patient.
Ensure jQuery is downloaded and up to date...
Clearing minified cache...
Ensure custom css/js files are created...

3. Cloud Foundryにアプリケーションをプッシュ。

準備ができたら、Cloud Foundry へプッシュします。ここでは installDeps.sh でコメントアウトした npm installを実行します。今回は Bluemix を使うため Bluemix にログインします。

% cf login -a https://api.ng.bluemix.net
login: <bluemix-id>
password: <bluemix-password>
% cf push etherpad-lite -c "cd node_modules/ep_etherpad-lite; npm install ; cd ../../; node node_modules/ep_etherpad-lite/node/server.js"

     state     since                    cpu    memory           disk          details
#0   running   2015-06-17 10:55:23 AM   0.0%   125.3M of 256M   97.9M of 1G
%


正常にプッシュできたらアプリケーションは稼働中というメッセージが出てくるでしょう。 本来であれば "npm install" もスキップできるように工夫できると思いますが、 まだそこまでソースの修正ができませんでした。なお Bluemixの利用についてはここを参照してください。

4. 動作確認



動作を確認してみましょう! アプリケーションのURLを開きます。


新規作成ボタンをクリックすると。新しい画面に移動します。指定された URLを 他の人と共有することで、協同作業ができるようになります。



たとえば二人が作業すると入力メッセージの色がかわりお互いどのように作業しているか わかるようになります。



5. その他、注意事項等

今回は説明していませんが、データベースには Cloud Foundry がサポートしている "MySQL"を使うことができます。 情報を破棄してもよいのであれば、このままで良いのです が、破棄されては困る!といった場合には MySQL データベースを利用した方がよいでしょう。

また、"cf push" 時には Node.js のビルドパックを指定していません。この場合、Bluemix が提供する Node.js ビルドパックが使われます。Bluemix が提供する Node.js ビルドパックは Cloud Foundry が提供するビルドパックを含み、独自の拡張をしています。もし気になる場合には、"cf push -b" にて Cloud Foundry のビルドパックを指定してもよいと思います。


余談



実は、Etherpad-lite の Cloud Foundry 版が Cloud Foundry Foundation の コミュニティー に作成されています(ココをクリック)。

今回は、あえてオリジナルの Etherpad-lite を使ったわけですが、この記事を読んで 頂ければ、どのように既存の Node.js アプリケーションを Cloud Foundry で稼働させる ように移植できるか?について大まかにご理解いただけたのではないかと思っております。

今回の環境

  • cf-release (v205)  (IBM Bluemix)
  • etherpad-lite
    https://github.com/ether/etherpad-lite/tree/a0aa9470a383e5361e544a9ba76fad06f69fd628