Wharf: Dokku Web frontend

28 Feb 2018

Cloud  Python  Web 

Originally posted at https://tech.labs.oliverwyman.com/blog/2018/02/28/wharf-dokku-web-frontend/

As long-time readers of my posts may have noticed, most of the apps I talk about building here are deployed to Heroku. This is mainly because I’ve been a long-term user of theirs, and so when they changed their pricing model a couple of years ago, I got grandfathered in a ridiculous number of free hours. This meant I’ve been able to run many small apps on there, and never run out of hours. Except that apparently I’ve now built enough stuff that’s just popular enough, so now I’m running out. Admittedly, this doesn’t appear to have shut anything down yet (despite being now at 113% used of my free hours for this month), but it’s only a matter of time.

Therefore, I need another option. If this was a customer project, then these days we’d probably lean towards Kubernetes because it’s the big fish in the pond and can do basically anything we need of it. However, it’s overhead in terms of running services and the amount you need to do to make a simple app work is pretty substantial, and most of the stuff I build in these posts is very simple little web apps. I could just hand-tool everything, but that gets annoying fast. I started looking at a couple of the smaller options for this sort of thing: Flynn and Dokku. Both of them are like Kubernetes in certain ways: opinionated wrappers around Docker, but using Heroku Buildpacks which is exactly what I needed. But, both of them were limited in various ways. Flynn had Github webhook integration which I really wanted, and a decent web dashboard but it’s certificate story with Let’s Encrypt was still lacking. It also seemed to have the Kubernetes problem of “designed for many hosts, annoying for one”. Dokku had Let’s Encrypt support, but no web dashboard or Github integration. However, I started to realise that those problems were fixable, or at least capable of being worked around.

I’ve ended up building Wharf, which is a web frontend (in Django) for Dokku. Most of what it does is invoke various Dokku commands to do stuff and query the system, but that also means it does things like invoke Dokku when it gets webhooks in from Github. It’s still a bit rough-and-ready, but I’ve already used it to deploy Dawn and Gasconade on my own host, and the next step will be making the current versions of those on Heroku redirect to the new edition.

Previously: Sked: merged calendars as a service Next: Bazel: Fast, Correct, Usable – choose two