Heroku needs to know how to communicate with a deployed application.
Hence a global PORT
environment variable is provided which needs to be injected into an application and
it should bind and listen to this port.
For development a default port (here 8080) should be set:
shared static this() {
// ...
auto settings = new HTTPServerSettings;
// Provide a default port in case of the $PORT variable isn't set.
settings.port = environment.get("PORT", "8080").to!ushort;
listenHTTP(settings, router);
}
Additionally create a Procfile
, which is a text file in the root directory of the application, which explicitly declares what command
should be executed to start the app.
The Procfile
in the example app looks like this:
web: ./hello-world
Before going further login to the Heroku Command Line by using the Heroku Toolbelt.
This provides access to the Heroku Command-Line Interface (CLI), which can be used for managing and scaling your applications and add-ons.
After installing the toolbelt run the following:
$ heroku login
Go to the heroku dashboard and create a new app. After doing this memorize the name of the created app, it will be useful later.
Or use the Command-Line like this:
$ heroku create
Creating app... done, ⬢ rocky-hamlet-67506
https://rocky-hamlet-67506.herokuapp.com/ | https://git.heroku.com/rocky-hamlet-67506.git
The app's name here is rocky-hamlet-67506.
To deploy the app directly use git
commands. A separate git remote endpoint should be added to which new releases can be pushed.
Thus the name of the newly created application
in the previous chapter needs to be passed as argument - here it is rocky-hamlet-67506.
$ heroku git:remote -a rocky-hamlet-67506
Notice the remote endpoint is added to the git config:
$ git remote -v
heroku https://git.heroku.com/rocky-hamlet-67506.git (fetch)
heroku https://git.heroku.com/rocky-hamlet-67506.git (push)
Buildpacks are responsible for generating assets or compiled code.
For more information browse the Heroku documentation
For deployement the Vibe.d buildpack can be used:
$ heroku buildpacks:set https://github.com/MartinNowak/heroku-buildpack-d
By default the buildpack uses the latest dmd
compiler.
It is possible to use GDC or LDC and to choose a specific compiler versions by adding a .d-compiler
file to your project.
Use dmd
, ldc
, or gdc
to select the latest or dmd-2.0xxx
, ldc-1.0xxx
, or gdc-4.9xxx
to
select a specific version of a compiler.
Proceed in your usual git habit and write awesome code.
To release a new version, just push the newest version to the Heroku endpoint.
$ git add .
$ git commit -am "My first vibe.d release"
$ git push heroku master
Counting objects: 9, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 997 bytes, done.
Total 9 (delta 0), reused 0 (delta 0)
-----> Fetching custom git buildpack... done
-----> D (dub package manager) app detected
-----> Building libevent
-----> Building libev
-----> Downloading DMD
-----> Downloading dub package manager
-----> Setting PATH:
-----> Initializing toolchain
-----> Building app
Running dub build ...
Building configuration "application", build type release
Running dmd (compile)...
Compiling diet template 'index.dt' (compat)...
Linking...
Build was successful
-----> Discovering process types
Procfile declares types -> web
-----> Compiled slug size: 3.5MB
-----> Launching... done, v4
https://rocky-hamlet-67506.herokuapp.com/ deployed to Heroku
To git@heroku.com:rocky-hamlet-67506.git
* [new branch] master -> master
Open the app in the browser with the following command
$ heroku open
After deploying, the app is running on a web dyno. Think of a dyno as a lightweight container that runs the command specified in the Procfile.
Using the ps
command allows checking how many dynos are running:
$ heroku ps
Free dyno hours quota remaining this month: 550h 0m (100%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping
No dynos on ⬢ rocky-hamlet-67506
By default, the app is deployed on a free dyno which doesn't accept requests by default. Free dynos will sleep after a half hour of inactivity. This causes a delay of a few seconds for the first request upon waking.
To start the dyno run the following:
$ heroku ps:scale web=1
Heroku treats logs as streams of time-ordered events aggregated from the output streams of all your app and Heroku components, providing a single channel for all of the events.
$ heroku logs --tail
After deploying the app to Heroku you can make it more awesome by using add-ons. For example :