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

2015-10-22

Fat Free CRM を Cloud Foundry で動かす

「Cloud Foundry 百日行」第84日目,今日は SugarCRM (記事URL) 以来の CRM アプリ Fat Free CRM です。「Sugar」に対抗して「Fat Free」という名前の通り,シンプルさが特徴の CRM のようですが,CRM に詳しくない自分にとっては充分多機能に見えました。

Ruby on Rails ベースのアプリで, Heroku でのデプロイも考慮されている ので,Cloud Foundry でも簡単に動かす事ができました。

基本情報

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

  • 1) ソースコードの取得
  • 2) 起動スクリプトの作成
  • 3) サービスの作成とバインド
  • 4) アプリのデプロイ
  • 5) 動作確認

1. ソースコードの取得

GitHub からソースコードを clone して,ディレクトリーを移動します。

$ git clone https://github.com/fatfreecrm/fat_free_crm.git
..
$ cd cd fat_free_crm/

2. 起動スクリプトの作成

http://guides.fatfreecrm.com/Setup-Heroku.html の「Set up a Fat Free CRM Instance on Heroku」に合わせて起動スクリプトを作成します。

このアプリには Procfile があるので,それを使えばよさそうに見えますが,上のページを読むと,アプリの起動前に

heroku run rake db:migrate
heroku run rake ffcrm:demo:load (if you want demo data)
heroku run rake ffcrm:setup:admin USERNAME=admin PASSWORD=admin EMAIL=admin@example.com

の3つの操作が行われています。 Cloud Foundry には, heroku run に相当する機能がないので,これらは起動時にまとめて実行する必要があります。Procfile を変更する方法もあるのですが,起動スクリプトの方がデバッグがしやすいので,私はそちらを好んで用いています。

最終的な起動スクリプト (ファイル名は start.sh) は以下のようになりました。

$ emacs start.sh
..
$ cat start.sh
#!/bin/bash
 
set -x
 
bundle exec rake db:migrate
bundle exec rake ffcrm:demo:load
bundle exec rake ffcrm:setup:admin USERNAME=admin PASSWORD=admin EMAIL=admin@example.com

bundle exec unicorn -p $PORT -c ./config/unicorn.rb

【注記】

なお, bundle exec rake ffcrm:demo:load はデータベースを初期化してしまうので,実用に供する場合はこの行を削除してください。

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

本アプリはデータの永続化に DBMS を使います。 http://guides.fatfreecrm.com/Setup-Linux-or-Mac-OS.html の「Set Up Configuration (Database & Settings)」を読むと,対応しているデータベースは PostgreSQL, MySQL, SQLite の3つですが,ソースコードの config.rake というファイルを見ると,

      filename = "config/database.#{ENV['DB'] || 'postgres'}.yml"

となっていて,デフォルトでは PostgreSQL を使うことを想定しているようなので,今回は PostgreSQL を使うことにしました。

以下,いつものように,アプリのアップロード→サービスの作成→アプリとサービスのバインドという手順を実施します。

アプリのアップロード

アプリを停止状態で Cloud Foundry 上に push します。アプリ名は ffcrm としました。

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

サービスの作成

PostgreSQL サービスを作成します。サービス・インスタンス名は pg-ffcrm としました。

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

サービスのバインド

アプリとサービスをバインドします。

$ cf bind-service ffcrm pg-ffcrm
Binding service pg-ffcrm to app ffcrm in org nota-ja / space 100 as nota-ja...
OK
..

今回のアプリではサービスの auto-reconfiguration が機能するので,接続情報を別途ファイルや環境変数に転記する必要はありません。

4. アプリのデプロイ

準備が整ったので,アプリをデプロイします。

調査の結果,

  • メモリを少し多めに取った方が良さそう
  • デモデータのロードに時間がかかるので,タイムアウトを長めに取る必要がある

ということがわかったので,push コマンドのオプションは以下のようになりました。

$ cf push ffcrm -c './start.sh' -m 384m -t 180
Updating app ffcrm in org nota-ja / space 100 as nota-ja...
OK`
..
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
1 of 1 instances running

App started


OK

App ffcrm was started using this command `./start.sh`

Showing health and status for app ffcrm in org nota-ja / space 100 as nota-ja...
OK

requested state: started
instances: 1/1
usage: 384M x 1 instances
urls: ffcrm.10.244.0.34.xip.io
last uploaded: Wed Oct 21 06:16:04 UTC 2015
stack: cflinuxfs2
buildpack: Ruby

     state     since                    cpu     memory           disk      details
#0   running   2015-10-21 03:18:48 PM   34.1%   210.9M of 384M   0 of 1G

先ほど述べたように,起動に時間がかかるため, 0 of 1 instances running, 1 starting が続いてドキドキしますが,しばらくすると起動するはずです。

【注記】

この cf push の最中に,以下の2種類のメッセージが出力されると思いますが,

       fatal: Not a git repository (or any of the parent directories): .git
       rake aborted!
       PG::ConnectionBad: could not connect to server: Connection refused
       Is the server running on host "192.168.15.91" and accepting
       TCP/IP connections on port 5432?
       /tmp/staged/app/vendor/bundle/ruby/2.2.0/gems/activerecord-4.2.4/lib/active_record/connection_adapters/postgresql_adapter.rb:655:in `initialize'
..

両方ともアプリのデプロイ/実行上問題にはなりません。

前者については,bundle コマンドが実行される際,fat_free_crm.gemspec ファイルが評価されて,その中の

https://github.com/fatfreecrm/fat_free_crm/blob/0424d3ee1d9073f322d60a4b97d71dfc703a16a4/fat_free_crm.gemspec#L12

  gem.files = `git ls-files`.split("\n")

という行で git コマンドが実行されることが原因なのですが,この gemspec ファイルは Cloud Foundry 上でアプリをデプロイする際は使われていないので,このメッセージを気にする必要はありません。

実際,Fat Free CRM の Issues でも何度か取り上げられていますが,

  • https://github.com/fatfreecrm/fat_free_crm/issues/389
  • https://github.com/fatfreecrm/fat_free_crm/issues/352

アプリの作者側はこのメッセージを問題視していないようです。

後者のデータベース接続エラーも,やはり無視しても大丈夫です。

このエラーは,アプリのステージング中にデータベースに接続しようとして, Cloud Foundry の Application Security Group 設定で接続が許可されていないために発生しているものです。しかし,今回データベース周りの処理はアプリの起動時に行っているので,ステージング時にデータベース接続できなくても問題ありません。

5. 動作確認

アプリ起動後,ブラウザーでアプリのURLにアクセスすると,ログイン画面に遷移するので,ユーザー名とパスワードを入力してログインします:

ユーザー名とパスワードは,start.sh の以下の行に書いたものを使います:

bundle exec rake ffcrm:setup:admin USERNAME=admin PASSWORD=admin EMAIL=admin@example.com

ログインに成功すると以下の画面ような画面になります:

【Campaigns】タブを表示させてみました:

【Tasks】タブに移動して【Create new task】をクリックし:

新しいタスクを作ってみます:

タスクが作られました:

タスク名の左のチェックボックスにチェックを入れるとタスクは自動的に消えます:

左ペインの【Completed】をクリックすると,完了したタスクが表示されます:

以上で動作確認は終わりです。

Heroku へのデプロイ手順が提供されているだけあって,Cloud Foundry でも簡単に動きました。データベース接続も自動設定で済むので,本当に簡単です。

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