Scala + PlayFramework on Heroku + MongoDB
概要
HerokuでScala(Play)動かすのはGetting Started with Scala on Heroku読めばいいです。
けれど「やっぱりDB欲しいよなー」、「スキーマ定義するの面倒だなー」という人はMongoDB使うと良いと思います。
Heroku上で動作させる時のちょっとした手順をまとめました。
※今回はTypesafeのplay-mongo-knockout
というプロジェクトテンプレートを使用しました。
はじめに
事前に以下のものがインストールされ、パスが通っていること。
- Typesafe Activator
- git(herokuを利用する場合)
- heroku toolbelt (herokuを利用する場合)
テンプレート作成
activatorでプロジェクト作成
Windowsの場合
- activator.batを右クリックし、「開く」をクリックします。
Macの場合
- activatorを右クリックし、「開く」をクリックします。
後は一緒です。
- ブラウザでactivatorのGUIが起動します。
-
Seedsから
play-mongo-knockout
を選択します。 - 任意のディレクトリを選択し、「Create app」をクリックします。
少し時間がかかるのでゆっくり待ちます。 - プロジェクトの作成が完了すると、「Your application is ready!」が表示されます。
MongoサーバをWindowsにインストール
下記サイトからダウンロードしてインストールします。
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/にブラウザからアクセスし、画面が表示されることを確認します。
- Add messageボタンからメッセージが追加することが出来れば成功です。
MongoDB用のGUIクライアント(Windows用)
必要であれば下記ツールでMongoDBのデータを確認出来ます。
MongoVUE
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
備考
MongoDBのデータベースの状況は
heroku
にアクセス > 対象application > Add-ons
> MongoLab
で確認出来ます。