We use Heroku to deploy our own and our clients’ web applications. We find much value in how Heroku simplifies and standardizes app deployment. However in our internal disputes there used to be an unbeatable argument agains Heroku: it is not always possible to deploy an arbitrary open-source component to Heroku. To provide the missing building bricks there is Heroku Elements marketplace with more than a hundred SaaS add-ons. In most cases this is just enough, but whenever we wanted to use some open-source tool not present in Elements, we had to deploy it to AWS manually:
Maintaining numerous AWS instances (prod/staging/dev/qa) is a pain, and we were looking for a unified deployment procedure for both the Heroku applications and their AWS-hosted counterparts. We wanted the AWS instances to be provisioned and de-provisioned via Heroku Dashboard just like other Heroku add-ons do. With this idea in mind, we created Dockhero — an add-on which brings Docker to Heroku and simplifies lifecycle management for custom open-source backing services we used in our apps.
If you think of add-ons in general as of boxes with some useful mechanisms inside (like databases, log analyzers, messengers etc.), then DockHero is an empty box where you can put your own microservice described by docker-compose.yml:
Under the hood we decided to use Docker, because:
- it is a de-facto standard supported by most continuous integration platforms like Semaphore or Circle CI
- it simplifies dev/prod parity (which is a general problem of proprietary SaaS add-ons)
- there are 100k+ dockerized open-source tools at hub.docker.com and numerous well-documented example YAML stacks
We also built a Heroku CLI plugin to transparently use native
docker-compose tools with DockHero. Here’s a 2-minute demo:
DockHero is generally available as a Heroku add-on and we encourage you to give it a try. Also we prepared some examples of cool things which you can do with DockHero. Probably the most outstanding is Enabling Cloudflare Railgun for a Heroku app.