Scala + PlayFramework on Heroku + MongoDB

Scala + PlayFramework on Heroku + MongoDB
====

## 概要
HerokuでScala(Play)動かすのは[Getting Started with Scala on Heroku](https://devcenter.heroku.com/articles/getting-started-with-scala#introduction)読めばいいです。

けれど「やっぱりDB欲しいよなー」、「スキーマ定義するの面倒だなー」という人はMongoDB使うと良いと思います。

Heroku上で動作させる時のちょっとした手順をまとめました。

※今回はTypesafeの``play-mongo-knockout``というプロジェクトテンプレートを使用しました。

## はじめに
事前に以下のものがインストールされ、パスが通っていること。

- Typesafe Activator
- git（herokuを利用する場合）
- heroku toolbelt (herokuを利用する場合）

## テンプレート作成

### activatorでプロジェクト作成

Windowsの場合

- **activator.bat**を右クリックし、「開く」をクリックします。

Macの場合

- **activator**を右クリックし、「開く」をクリックします。

後は一緒です。

1. ブラウザでactivatorのGUIが起動します。
1. **Seeds**から``play-mongo-knockout``を選択します。  
1. 任意のディレクトリを選択し、「Create app」をクリックします。  
少し時間がかかるのでゆっくり待ちます。
1. プロジェクトの作成が完了すると、「Your application is ready!」が表示されます。

## MongoサーバをWindowsにインストール
下記サイトからダウンロードしてインストールします。
[Install MongoDB on Windows](http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/)

## Mongoサーバを起動
- dataディレクトリを作成

```
c:\> md c:\data\db
```

- Mongoサーバを起動(※mongod.exeの場所は適宜読み替えてください)

```
c:\> C:\Program Files\MongoDB\Server\3.0\bin\mongod.exe
```

実行すると下記のようなログが出力されればOKです。「connection accepted」という文言が表示されるはずです。

```
2015-03-27T08:36:36.181+0900 I CONTROL  Hotfix KB2731284 or later update is not installed, will zero-out data files
2015-03-27T08:36:36.190+0900 I JOURNAL  [initandlisten] journal dir=C:\data\db\journal
2015-03-27T08:36:36.191+0900 I JOURNAL  [initandlisten] recover : no journal files present, no recovery needed
2015-03-27T08:36:36.208+0900 I JOURNAL  [durability] Durability thread started
2015-03-27T08:36:36.209+0900 I CONTROL  [initandlisten] MongoDB starting : pid=8008 port=27017 dbpath=C:\data\db\ 64-bit host=ws-nagae-PC
2015-03-27T08:36:36.209+0900 I CONTROL  [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R2
2015-03-27T08:36:36.212+0900 I CONTROL  [initandlisten] db version v3.0.1
2015-03-27T08:36:36.216+0900 I CONTROL  [initandlisten] git version: 534b5a3f9d10f00cd27737fbcd951032248b5952
2015-03-27T08:36:36.219+0900 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.1j-fips 15 Oct 2014
2015-03-27T08:36:36.219+0900 I JOURNAL  [journal writer] Journal writer thread started
2015-03-27T08:36:36.223+0900 I CONTROL  [initandlisten] build info: windows sys.getwindowsversion(major=6, minor=1, build=7601, platform=2, service_pack='Service Pack 1') BOOST_LIB_VERSION=1_49
2015-03-27T08:36:36.229+0900 I CONTROL  [initandlisten] allocator: system
2015-03-27T08:36:36.232+0900 I CONTROL  [initandlisten] options: {}
2015-03-27T08:36:36.247+0900 I NETWORK  [initandlisten] waiting for connections on port 27017
2015-03-27T08:36:36.707+0900 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:50109 #1 (1 connection now open)
2015-03-27T08:36:36.708+0900 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:50110 #2 (2 connections now open)
2015-03-27T08:36:36.708+0900 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:50111 #3 (3 connections now open)
2015-03-27T08:36:36.712+0900 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:50113 #4 (4 connections now open)
2015-03-27T08:36:36.715+0900 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:50114 #5 (5 connections now open)
2015-03-27T08:36:36.718+0900 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:50115 #6 (6 connections now open)
2015-03-27T08:36:36.722+0900 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:50116 #7 (7 connections now open)
2015-03-27T08:36:36.725+0900 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:50117 #8 (8 connections now open)
2015-03-27T08:36:36.727+0900 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:50118 #9 (9 connections now open)
2015-03-27T08:36:36.730+0900 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:50119 #10 (10 connections now open)
```

## プロジェクトの起動
- コマンドプロンプロトを起動し、プロジェクトが存在するディレクトリまで移動します。

```
cd [プロジェクトのルートディレクトリ]
```

- activatorを起動します。

Windowsの場合

```
activator.bat
```

Macの場合

```
./activator
```

ここから一緒です。

- サーバを起動します。

```
[play-mongo-knockout] $ run
```

下記のように表示されれば成功です。

```
[play-mongo-knockout] $ run

--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)
```

- [http://localhost:9000/](http://localhost:9000/)にブラウザからアクセスし、画面が表示されることを確認します。
- **Add message**ボタンからメッセージが追加することが出来れば成功です。

## MongoDB用のGUIクライアント(Windows用)
必要であれば下記ツールでMongoDBのデータを確認出来ます。
[MongoVUE](http://www.mongovue.com/)

### Heroku 上にアップする

- コマンドプロンプロトを起動し、プロジェクトが存在するディレクトリまで移動します。

```
cd [プロジェクトのルートディレクトリ]
```

- gitリポジトリ作成

```
git init
git add .
git commit -m "init"
```

- Herokuにログインし、新規アプリケーションを作成する

```
heroku login
heroku create {appname}
```

- Heroku 上へpushする

```
git push heroku master
````

- Heroku上のアプリケーションを起動します。

```
heroku open
```

### アプリケーションへアクセスする

以下のURLでアクセスする

```
https://{appname}.herokuapp.com/
```

成功です！
...
...
...
...
と思いきや、**Add message**ボタンからメッセージを追加しようとしても、動作しないはずです。

ここでHeroku上のログを見てみましょう。

```
heroku logs
```

**MongoError['No primary node is available!']**

というエラーメッセージが表示されているはずです。

MongoDBのDBが無いとか、接続出来ないとこのエラーになります。
そういえば、そもそもDBの設定をしていなかったのでDBに接続出来るわけありませんでした。

次からDBの設定をします。

## Heroku上のMongoDBの設定
- HerokuにMongoDBのアドオン（無料）を追加。

```
heroku addons:add mongolab
```

(注意) 無料ですが、事前にクレジットカード情報を登録する必要があります。

- プロジェクトの直下に下記内容で「Procfile」というファイルを作成します。

```
web: target/universal/stage/bin/{appname} -Dhttp.port=${PORT} -Dmongodb.uri=$MONGOLAB_URI
```

(注意) appnameはheroku上の名前ではなく、build.sbtもしくはBuild.scalaのname(プロジェクト名)です。この場合には「play-mongo-knockout」でOKです。

具体例

```
web: target/universal/stage/bin/play-mongo-knockout -Dhttp.port=${PORT} -Dmongodb.uri=$MONGOLAB_URI
```

- 再度gitプッシュし、アプリケーションを起動します。

```
git add Procfile
git commit -m "add Procfile"
git push heroku master
heroku open
```

- 再度ブラウザからアプリケーションにアクセスして動作すれば成功です！

## Herokuのドキュメント
ここ読むとそのまま出来ます。コマンドとか分からない時はこれ見ると良いです。
自分のアプリが動作しない場合、一度深呼吸してgetting started通りにサンプルアプリケーションでやってみるのも手です。

[Getting Started with Scala on Heroku](https://devcenter.heroku.com/articles/getting-started-with-scala#introduction)

## 備考
MongoDBのデータベースの状況は
``heroku``にアクセス > 対象application > ``Add-ons`` > ``MongoLab`` で確認出来ます。