§Herokuへのデプロイ
Heroku はクラウドアプリケーションプラットフォームであり、Webアプリを構築およびデプロイする方法です。
はじめに
Herokuへのデプロイ方法は2つあります
- リモートGitリポジトリにプッシュします。
- sbt-herokuプラグインを使用します。
§リモートGitリポジトリへのデプロイ
§アプリケーションをgitに保存する
$ git init
$ git add .
$ git commit -m "init"
§Herokuに新しいアプリケーションを作成する
$ heroku create
Creating warm-frost-1289... done, stack is cedar-14
http://warm-frost-1289.herokuapp.com/ | [email protected]:warm-frost-1289.git
Git remote heroku added
これにより、アプリケーションのHTTP(およびHTTPS)エンドポイントとGitエンドポイントを使用して、新しいアプリケーションがプロビジョニングされます。 Gitエンドポイントは、Gitリポジトリの設定でheroku
という名前の新しいリモートとして設定されます。
§アプリケーションをデプロイする
Herokuにアプリケーションをデプロイするには、Gitを使用してheroku
リモートリポジトリにプッシュします
$ git push heroku main
Counting objects: 93, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (84/84), done.
Writing objects: 100% (93/93), 1017.92 KiB | 0 bytes/s, done.
Total 93 (delta 38), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Play 2.x - Scala app detected
remote: -----> Installing OpenJDK 1.8... done
remote: -----> Priming Ivy cache (Scala-2.11, Play-2.4)... done
remote: -----> Running: sbt compile stage
...
remote: -----> Dropping ivy cache from the slug
remote: -----> Dropping sbt boot dir from the slug
remote: -----> Dropping compilation artifacts from the slug
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing... done, 93.3MB
remote: -----> Launching... done, v6
remote: https://warm-frost-1289.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/warm-frost-1289.git
* [new branch] main -> main
Herokuはsbt stage
を実行してアプリケーションを準備します。最初のデプロイでは、すべての依存関係がダウンロードされます。これには時間がかかります(ただし、今後のデプロイのためにキャッシュされます)。
RequireJSを使用していて、アプリケーションがこの手順でハングすることがわかった場合
[info] Optimizing JavaScript with RequireJS
Heroku Dev CenterのPlayおよびScalaアプリケーションのJavaScript最適化にNode.jsを使用するの手順を試してください。これにより、Javascriptエンジンのパフォーマンスが大幅に向上します。
§アプリケーションがデプロイされたことを確認する
それでは、アプリケーションのプロセスの状態を確認しましょう
$ heroku ps
=== web (Free): `target/universal/stage/bin/sample-app -Dhttp.port=${PORT}`
web.1: up 2015/01/09 11:27:51 (~ 4m ago)
Webプロセスが稼働しています。ログを表示して詳細情報を取得できます
$ heroku logs
2015-07-13T20:44:47.358320+00:00 heroku[web.1]: Starting process with command `target/universal/stage/bin/myapp -Dhttp.port=${PORT}`
2015-07-13T20:44:49.750860+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx384m -Xss512k -Dfile.encoding=UTF-8
2015-07-13T20:44:52.297033+00:00 app[web.1]: [warn] application - Logger configuration in conf files is deprecated and has no effect. Use a logback configuration file instead.
2015-07-13T20:44:54.960105+00:00 app[web.1]: [info] p.a.l.c.ActorSystemProvider - Starting application default Pekko system: application
2015-07-13T20:44:55.066582+00:00 app[web.1]: [info] play.api.Play$ - Application started (Prod)
2015-07-13T20:44:55.445021+00:00 heroku[web.1]: State changed from starting to up
2015-07-13T20:44:55.330940+00:00 app[web.1]: [info] p.c.s.PekkoHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
...
通常のファイルと同様に、ログをtailすることもできます。これはデバッグに役立ちます
$ heroku logs -t --app warm-frost-1289
2015-07-13T20:44:47.358320+00:00 heroku[web.1]: Starting process with command `target/universal/stage/bin/myapp -Dhttp.port=${PORT}`
2015-07-13T20:44:49.750860+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx384m -Xss512k -Dfile.encoding=UTF-8
2015-07-13T20:44:52.297033+00:00 app[web.1]: [warn] application - Logger configuration in conf files is deprecated and has no effect. Use a logback configuration file instead.
2015-07-13T20:44:54.960105+00:00 app[web.1]: [info] p.a.l.c.ActorSystemProvider - Starting application default Pekko system: application
2015-07-13T20:44:55.066582+00:00 app[web.1]: [info] play.api.Play$ - Application started (Prod)
2015-07-13T20:44:55.445021+00:00 heroku[web.1]: State changed from starting to up
2015-07-13T20:44:55.330940+00:00 app[web.1]: [info] p.c.s.PekkoHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
...
問題ありません。次のコマンドを実行することで、アプリにアクセスできるようになりました
$ heroku open
§トラブルシューティング
アプリにbuild.gradle
ファイルが含まれている場合、Herokuはそれを検出し、Scala sbtプロジェクトではなくGradleプロジェクトとしてアプリをビルドしようとします。次のコマンドを実行することで、Herokuにsbtを使用させることができます
$ heroku buildpacks:set heroku/scala
Scalaビルドパックは、リポジトリ内のbuild.sbt
ファイルを使用してアプリをビルドします。
§最新のJavaバージョンを使用するアプリケーションのデプロイ
HerokuはデフォルトでOpenJDK 8を使用してJavaアプリケーションを実行します。別のバージョンが必要かどうかを自動的に判断できないため、新しいJavaバージョンを使用するアプリケーションをデプロイすると、サーバーでコンパイルエラーが発生します。 Java 8より新しいバージョンを使用する場合は、プロジェクトのルートディレクトリにあるsystem.properties
ファイルで宣言する必要があります。例:
java.runtime.version=11
詳細については、herokuドキュメントを参照してください。
§sbt-herokuプラグインを使用したデプロイ
Heroku sbtプラグインはAPIを利用して、事前にパッケージ化されたスタンドアロンWebアプリケーションをHerokuに直接デプロイします。これは、コンパイルに時間がかかるアプリケーションや、Travis CIやJenkinsなどの継続的インテグレーションサーバーからデプロイする必要があるアプリケーションに適したアプローチです。
§プラグインの追加
Heroku sbtプラグインをプロジェクトに含めるには、project/plugins.sbt
ファイルに次を追加します
addSbtPlugin("com.heroku" % "sbt-heroku" % "2.0.0")
次に、プラグインがデプロイするHerokuアプリケーションの名前を設定する必要があります。しかし、最初に新しいアプリを作成します。 Heroku Toolbeltをインストールし、createコマンドを実行します。
$ heroku create
Creating obscure-sierra-7788... done, stack is cedar-14
http://obscure-sierra-7788.herokuapp.com/ | [email protected]:obscure-sierra-7788.git
次に、build.sbt
に次のようなものを追加しますが、「obscure-sierra-7788」を作成したアプリケーションの名前に置き換えます(または、ローカルでGitを使用している場合はこれをスキップできます)。
Compile / herokuAppName := "obscure-sierra-7788"
sbt-herokuプロジェクトのドキュメントには、プラグインの実行の構成に関する詳細が含まれています。
§プラグインを使用したデプロイ
プラグインを追加したら、このコマンドを実行することでHerokuにデプロイできます
$ sbt stage deployHeroku
...
[info] -----> Packaging application...
[info] - app: obscure-sierra-7788
[info] - including: target/universal/stage/
[info] -----> Creating build...
[info] - file: target/heroku/slug.tgz
[info] - size: 30MB
[info] -----> Uploading slug... (100%)
[info] - success
[info] -----> Deploying...
[info] remote:
[info] remote: -----> Fetching custom tar buildpack... done
[info] remote: -----> sbt-heroku app detected
[info] remote: -----> Installing OpenJDK 1.8... done
[info] remote: -----> Discovering process types
[info] remote: Procfile declares types -> console, web
[info] remote:
[info] remote: -----> Compressing... done, 78.9MB
[info] remote: -----> Launching... done, v6
[info] remote: https://obscure-sierra-7788.herokuapp.com/ deployed to Heroku
[info] remote:
[info] -----> Done
[success] Total time: 90 s, completed Aug 29, 2014 3:36:43 PM
そして、このコマンドを実行することでアプリケーションにアクセスできます
$ heroku open -a obscure-sierra-7788
このコマンドを実行することで、アプリケーションのログを確認できます
$ heroku logs -a obscure-sierra-7788
Gitを使用している場合、-a
オプションを省略できます。アプリ
名前は、実行時に設定に追加されたGitリモートから検出されますheroku create
。
§データベースへの接続
Herokuは、Herokuアドオンを通じて、多数のリレーショナルデータベースとNoSQLデータベースを提供しています。 HerokuのPlayアプリケーションには、Heroku Postgresデータベースが自動的にプロビジョニングされます。 PlayアプリケーションがHeroku Postgresデータベースを使用するように設定するには、最初にPostgreSQL JDBCドライバーをアプリケーションの依存関係(build.sbt
)に追加します
libraryDependencies += "org.postgresql" % "postgresql" % "9.4-1201-jdbc41"
次に、プロジェクトのルートディレクトリに、次を含むProcfile
(大文字の「P」)という名前の新しいファイルを作成します(myapp
をプロジェクトの名前に置き換えます)
web: target/universal/stage/bin/myapp -Dhttp.port=${PORT} -Dplay.evolutions.db.default.autoApply=true -Ddb.default.driver=org.postgresql.Driver -Ddb.default.url=${DATABASE_URL}
これは、web
という名前のプロセスに対して、Playを実行し、play.evolutions.db.default.autoApply
、db.default.driver
、およびdb.default.url
設定パラメータをオーバーライドするようにHerokuに指示します。 Procfile
コマンドは最大255文字です。または、本番環境設定ページに記載されている-Dconfig.resource=
または-Dconfig.file=
を使用してください。
また、DATABASE_URL
はプラットフォームに依存しない形式であることに注意してください
vendor://username:password@host:port/db
組み込みのデータベース接続プールのいずれかを使用している場合、Playはこれを自動的にJDBC URLに変換します。ただし、SlickやHibernateなどの他のデータベースライブラリやフレームワークは、この形式をネイティブにサポートしていない場合があります。
その場合は、設定でDATABASE_URL
の代わりに動的 JDBC_DATABASE_URL
を使用してみてください。このように
db.default.url=${?JDBC_DATABASE_URL}
db.default.username=${?JDBC_DATABASE_USERNAME}
db.default.password=${?JDBC_DATABASE_PASSWORD}
HerokuはPlayアプリケーションのconfディレクトリでapplication.conf
ファイルを探してPlayアプリケーションであると判断するため、Procfileの作成はHerokuでは実際には必要ありません。
§その他の学習リソース
- HerokuでのScalaとPlayの使用方法
- Heroku sbtプラグインを使用したScalaおよびPlayアプリケーションのデプロイ
- Node.jsを使用してPlayおよびScalaアプリケーションのJavaScript最適化を実行する
- Travis CIからHerokuにScalaおよびPlayアプリケーションをデプロイする
- Jenkins CIからHerokuにScalaおよびPlayアプリケーションをデプロイする
- ScalaまたはPlayアプリケーションのリモートsbtコンソールの実行
- JavaとPlay Frameworkを使用してHerokuでWebSocketsを使用する
- PlayとHerokuのシードプロジェクト
- JavaのPlayチュートリアル
- Play、Heroku、およびCloudFrontを使用したエッジキャッシング
- データベース駆動型アプリのPlayの最適化
- Herokuでスケジュールされたジョブを実行するPlayアプリ
- JavaとPlayでAmazon S3をファイルアップロードに使用する
このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスがありますか?コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。