§Heroku へのデプロイ
Heroku は Web アプリケーションの構築とデプロイを効率化する、クラウド・アプリケーション・プラットフォームです。
§Procfile の作成
Heroku を利用するにあたって、アプリケーションのルートディレクトリに Procfile
という特別なファイルを作成する必要があります。次のような内容のテキストファイルを作成してください。
web: target/start -Dhttp.port=${PORT} ${JAVA_OPTS}
§アプリケーションを git で保存する
開発中アプリケーションの git レポジトリを作成してください。
$ git init
$ git add .
$ git commit -m "init"
§Heroku 上で新規アプリケーションを作成する
事前に Heroku のアカウント登録、 heroku gem のインストールが必要です。
$ heroku create --stack cedar
Creating warm-frost-1289... done, stack is cedar
http://warm-1289.herokuapp.com/ | [email protected]:warm-1289.git
Git remote heroku added
§アプリケーションをデプロイする
Heroku にアプリケーションをデプロイするため、ローカルレポジトリを heroku
という名前のリモートレポジトリへ git push してください。
$ git push heroku master
Counting objects: 34, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (20/20), done.
Writing objects: 100% (34/34), 35.45 KiB, done.
Total 34 (delta 0), reused 0 (delta 0)
-----> Heroku receiving push
-----> Scala app detected
-----> Building app with sbt v0.11.0
-----> Running: sbt clean compile stage
...
-----> Discovering process types
Procfile declares types -> web
-----> Compiled slug size is 46.3MB
-----> Launching... done, v5
http://8044.herokuapp.com deployed to Heroku
To [email protected]:floating-lightning-8044.git
* [new branch] master -> master
git push が完了すると、 Heroku は sbt clean compile stage
を実行して、アプリケーションをビルドします。初回のデプロイ時には、全ての依存モジュールがダウンロードされるため、多少の時間がかかります。(2回目以降のデプロイ時はキャッシュが使われます。)
§アプリケーションがデプロイされたことを確認する
では、デプロイしたアプリケーションの状態を確認してみましょう。
$ heroku ps
Process State Command
------------ ------------------ ----------------------
web.1 up for 10s target/start
Web プロセスが起動しています。次は、詳細を確認するため、ログを見てみましょう。
$ heroku logs
2011-08-18T00:13:41+00:00 heroku[web.1]: Starting process with command `target/start`
2011-08-18T00:14:18+00:00 app[web.1]: Starting on port:28328
2011-08-18T00:14:18+00:00 app[web.1]: Started.
2011-08-18T00:14:19+00:00 heroku[web.1]: State changed from starting to up
...
問題なしのようです。さらに heroku open
コマンドを実行すると、ブラウザが起動してデプロイした Web アプリにアクセスすることができます。
もし Web プロセスが起動しておらず、 Error H14 (No web processes running)
というエラーがログに出力されているようであれば、 web dynamo を追加する必要があるでしょう。
heroku ps:scale web=1
heroku restart
§サーバ上で play コマンドを実行する
Cedar では、サーバ上で起動した REPL プロセスにローカルの端末を接続して、アプリケーションの実行環境をテストすることができます。
$ heroku run sbt play
Running sbt play attached to terminal... up, run.2
[info] Loading global plugins from /app/.sbt_home/.sbt/plugins
[info] Updating {file:/app/.sbt_home/.sbt/plugins/}default-0f55ac...
[info] Set current project to My first application (in build file:/app/)
_ _
_ __ | | __ _ _ _| |
| '_ \| |/ _' | || |_|
| __/|_|\____|\__ (_)
|_| |__/
play! 2.0-beta, http://www.playframework.org
> Type "help" or "license" for more information.
> Type "exit" or use Ctrl+D to leave this console.
[My first application] $
§微調整
シンプルなアプリケーショであっても、容量が Heroku の slug size の最大である 100MB をすぐ超えてしまいます。
理由は、 .ivy キャッシュが slug に含まれてしまっているからです。カスタムの heroku “build pack” を利用すると、この問題は簡単に解決できます。build pack とはリモート git レポジトリに保存される多数のスクリプトをセットにしたもののことです。スクリプトは、 git で取得されて、コンパイル時に実行されます。標準の build pack は こちら で公開されています。
具体的には、 GitHub で build pack のレポジトリを fork して、 bin/compile
スクリプトの後半を次のように変更します。
...
mkdir -p $CACHE_DIR
for DIR in $CACHED_DIRS ; do
rm -rf $CACHE_DIR/$DIR
mkdir -p $CACHE_DIR/$DIR
cp -r $DIR/. $CACHE_DIR/$DIR
echo "-----> Dropping ivy cache from the slug: $DIR"
rm -rf $SBT_USER_HOME/.ivy2
done
同じ方法で、別の問題ー Heroku で Scala テンプレートをコンパイルする際に文字コードとして UTF8 を明示しなければならないーにも対応できます。これも、 build pack を次のように修正します。
...
echo "-----> Running: sbt $SBT_TASKS"
test -e "$SBT_BINDIR"/sbt.boot.properties && PROPS_OPTION="-Dsbt.boot.properties=$SBT_BINDIR/sbt.boot.properties"
HOME="$SBT_USER_HOME_ABSOLUTE" java -Xmx512M -Dfile.encoding=UTF8 -Duser.home="$SBT_USER_HOME_ABSOLUTE" -Divy.default.ivy.user.dir="$SBT_USER_HOME_ABSOLUTE/.ivy2" $PROPS_OPTION -jar "$SBT_BINDIR"/$SBT_JAR $SBT_TASKS 2>&1 | sed -u 's/^/ /'
if [ "${PIPESTATUS[*]}" != "0 0" ]; then
echo " ! Failed to build app with SBT $SBT_VERSION"
exit 1
fi
...
実際に動作する build pack は こちら にあります。
最終ステップ: build pack のアドレスを Heroku の config var に設定します。
heroku config:add BUILDPACK_URL='[email protected]:joergviola/heroku-buildpack-scala.git'
このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。