I've been playing around with DigitalOcean lately, specifically the pre-rolled Applications they have setup. I'm just blown away at how simple things have become: including setting up your own private Heroku
Dokku is one of those projects that I’ve been hearing about, but haven’t had the time to look into. I did that today, finally, and I have to say it’s… pretty impressive.
It’s 100 lines of shell scripts that manage Docker for you - creating a Heroku-like experience where you can deploy your application using Git. There’s a lot to it - but have a read on Jeff Lindsay’s blog (he’s the creator of Dokku) - he has an interesting screencast that will give you more of an idea.
In summary form: you push your git repo to Dokku and it figures out what to do with it. Let’s say it’s a Node app - Dokku will create a Docker container for your app (Docker is sort of like a VM, but it uses your processor and memory) and install everything needed for it to run.
For Node, it does this by analyzing your package.json. For Ruby/Rails, your Gemfile. You can also use with Java if you like - but I have no idea how that works.
The whole process takes about 10 seconds, and when you’re done… you have a working deployment.
In my last post about Gitlab I basically summarized DigitalOcean’s online walkthrough. I did that because I wanted to underscore just how bleedingly simple this stuff has become.
For setting up Dokku - just have a read of this post and follow what it says.
I used a quick Node app and it almost worked perfectly the first time, but I had to jigger a few things:
Make sure you have a Procfile in the root of your app that tells Docker how to start your app. This can be as simple as web: npm start
or a longer Rails incantation. Don’t forget the web:
key in there.
Make sure you specify which node and npm version to use in your package.json file. These go in the “engines” setting.
Here’s the package.json I used for a successful deployment:
{
"name": "application-name",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"engines": {
"node": "0.10.26",
"npm": ">=1.3"
},
"dependencies": {
"express": "~4.0.0",
"static-favicon": "~1.0.0",
"morgan": "~1.0.0",
"cookie-parser": "~1.0.1",
"body-parser": "~1.0.0",
"debug": "~0.7.4",
"jade": "~1.3.0"
}
}
Yes, absolutely. If you’re working with Node/Ruby/Python/Whatever Heroku Supports - you’ll likely have client demos or just public goof-off code you’ll want to share. As a web developer these days, it’s really important to have a “playground” where you can publicly play with ideas too.
Heroku is amazing, but it’s also pretty expensive when you ramp things up. Deployment can take forever as well! I’m a big fan of owning as much of your content as you can - your blog included (DigitalOcean does Wordpress too).
At the very least - see what Dokku can do, and be amazed at what’s possible these days.