§Deploying to Heroku
Heroku is a cloud application platform – a way of building and deploying web apps.
To get started:
There are two methods of deployment to Heroku:
- Pushing to a remote Git repository.
- Using the sbt-heroku plugin.
§Deploying to a remote Git repository
§Store your application in git
$ git init
$ git add .
$ git commit -m "init"
§Create a new application on 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
This provisions a new application with an HTTP (and HTTPS) endpoint and Git endpoint for your application. The Git endpoint is set as a new remote named heroku
in your Git repository’s configuration.
§Deploy your application
To deploy your application on Heroku, use Git to push it into the heroku
remote repository:
$ git push heroku master
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: -----> Downloading SBT... done
remote: -----> Priming Ivy cache (Scala-2.11, Play-2.3)... done
remote: -----> Running: sbt update
...
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] master -> master
Heroku will run sbt clean stage
to prepare your application. On the first deployment, all dependencies will be downloaded, which takes a while to complete (but will be cached for future deployments).
§Check that your application has been deployed
Now, let’s check the state of the application’s processes:
$ heroku ps
=== web (1X): `target/universal/stage/bin/sample-app -Dhttp.port=${PORT}`
web.1: up 2015/01/09 11:27:51 (~ 4m ago)
The web process is up. Review the logs for more information:
$ heroku logs
2011-08-18T00:13:41+00:00 heroku[web.1]: Starting process with command `target/universal/stage/bin/myapp`
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
...
We can also tail the logs in the same manner as we could do at a regular command line. This is useful for debugging:
$ heroku logs -t --app warm-frost-1289
2011-08-18T00:13:41+00:00 heroku[web.1]: Starting process with command `target/universal/stage/bin/myapp`
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
...
Looks good. We can now visit the app by running:
$ heroku open
§Deploying with the sbt-heroku plugin
The Heroku sbt plugin utilizes an API to provide direct deployment of prepackaged standalone web applications to Heroku. This may be a preferred approach for applications that take a long time to compile, or that need to be deployed from a Continuous Integration server such as Travis CI or Jenkins.
§Adding the plugin
To include the plugin in your project, add the following to your project/plugins.sbt
file:
resolvers += Resolver.url("heroku-sbt-plugin-releases", url("http://dl.bintray.com/heroku/sbt-plugins/"))(Resolver.ivyStylePatterns)
addSbtPlugin("com.heroku" % "sbt-heroku" % "0.3.0")
Next, we must configure the name of the Heroku application the plugin will deploy to. But first, create a new app. Install the Heroku Toolbelt and run the create command with the -n
flag, which will prevent it from adding a Git remote.
$ heroku create -n
Creating obscure-sierra-7788... done, stack is cedar-14
http://obscure-sierra-7788.herokuapp.com/ | [email protected]:obscure-sierra-7788.git
Now add something like this to your build.sbt
, but replace “obscure-sierra-7788” with the name of the application you created.
herokuAppName in Compile := "obscure-sierra-7788"
The sbt-heroku project’s documentation contains details on configuring the execution of the plugin.
§Deploying with the plugin
With the plugin added, you can deploy to Heroku by running this command:
$ sbt stage deployHeroku
...
[info] ---> Packaging application...
[info] - including: ./target/universal/stage
[info] ---> Creating slug...
[info] - file: ./target/heroku/slug.tgz
[info] - size: 63MB
[info] ---> Uploading Slug...
[info] - id: 73c1f7f2-75a4-4bb9-a3ce-e7ec2d70fa96
[info] - stack: cedar-14
[info] - process types: web
[info] ---> Releasing...
[info] - version: 65
[success] Total time: 90 s, completed Aug 29, 2014 3:36:43 PM
And you can visit your application by running this command:
$ heroku open -a obscure-sierra-7788
You can see the logs for you application by running this command:
$ heroku logs -a obscure-sierra-7788
§Connecting to a database
Heroku provides a number of relational and NoSQL databases through Heroku Add-ons. Play applications on Heroku are automatically provisioned a Heroku Postgres database. To configure your Play application to use the Heroku Postgres database, first add the PostgreSQL JDBC driver to your application dependencies (build.sbt
):
libraryDependencies += "postgresql" % "postgresql" % "9.1-901-1.jdbc4"
Then create a new file in your project’s root directory named Procfile
(with a capital “P”) that contains the following (substituting the myapp
with your project’s name):
web: target/universal/stage/bin/myapp -Dhttp.port=${PORT} -DapplyEvolutions.default=true -Ddb.default.driver=org.postgresql.Driver -Ddb.default.url=${DATABASE_URL}
This instructs Heroku that for the process named web
it will run Play and override the applyEvolutions.default
, db.default.driver
, and db.default.url
configuration parameters. Note that the Procfile
command can be maximum 255 characters long. Alternatively, use the -Dconfig.resource=
or -Dconfig.file=
mentioned in production configuration page.
Note that the creation of a Procfile is not actually required by Heroku, as Heroku will look in your play application’s conf directory for an application.conf file in order to determine that it is a play application.
§Further learning resources
- Getting Started with Scala on Heroku
- Deploying Scala and Play Applications with the Heroku sbt Plugin
- Deploy Scala and Play Applications to Heroku from Travis CI
- Deploy Scala and Play Applications to Heroku from Jenkins CI
- Running a Remote sbt Console for a Scala or Play Application
- Using WebSockets on Heroku with Java and the Play Framework
- Seed Project for Play and Heroku
- Play Tutorial for Java
- Getting Started with Play, Scala, and Squeryl
- Edge Caching With Play, Heroku, and CloudFront
- Optimizing Play for Database-Driven Apps
- Play App with a Scheduled Job on Heroku
- Using Amazon S3 for File Uploads with Java and Play
Found an error in this documentation? The source code for this page can be found here. After reading the documentation guidelines, please feel free to contribute a pull request. Have questions or advice to share? Go to our community forums to start a conversation with the community.