Heroku Alternative: Dokku
Dokku is advertising itself as a self hosted Platform as a service and it lives up to its promise. You can fairly easily deploy a range of applications like Ruby, Node.js, Go and so on. Basically everything beyond your standard PHP CMS like WordPress (but also that ;)).
Dokku is easy to install and maintain. Under the hood it uses docker containers to run your apps. Dokku also comes as a pre-built app as a one click installer on Digital Ocean*. Since Dokku is very easy to install, there's a couple of alternatives for you, for example Linode* or Vultr*.
Note: Dokku recommends at least 1GB or RAM.
Installing Dokku
Installing Dokku feels a bit like installing WordPress, except it just asks you for which domain you want to use and what your favourite ssh key is.
Afterwards you have a powerful, but simple command line interface available on your server, dokku
:
Usage: dokku [--quiet|--trace|--rm-container|--rm|--force] COMMAND <app> [command-specific-options]
Primary help options, type "dokku COMMAND:help" for more details, or dokku help --all to see all commands.
Commands:
apps Manage Dokku apps
config Pretty-print an app or global environment
domains Manage vhost domains used by the Dokku proxy
help Print the list of commands
ls Pretty listing of deployed applications and containers
[...] [redacted many more]
Community plugin commands:
letsencrypt Plugin for managing letsencrypt app integration
You can always read more about a command by appending help
to a sub-command like:
dokku apps:help
Usage: dokku apps[:COMMAND]
Manage Dokku apps
Example:
$ dokku apps:list
=====> My Apps
example
example2
Additional commands:
apps:clone <old-app> <new-app> Clones an app
apps:create <app> Create a new app
apps [DEPRECATED] Alias for apps:list
apps:destroy <app> Permanently destroy an app
apps:list List your apps
apps:rename <old-app> <new-app> Rename an app
apps:report [<app>] [<flag>] Display report about an app
Creating a Dokku App
Creating an app takes two commands and a git push to the right remote, so it's really painless:# on your dokku server
dokku apps:create clacks
dokku domains:add clacks clacks.jonathanmh.com
git remote add dokku dokku@$YOURSERVERNAME:clacks
git push dokku
and your application will start to deploy!
It will probably fail, because you'll need to define some additional settings, but they're very simple and just tell Dokku with which application your code should be started like node
or which executable to run in your go project.
For Ruby it can be as simple as adding a Procfile
with:
web: bundle exec puma -C config/puma.rb
See the official documentation for more: Deploying to Dokku
Note about the $YOURSERVERNAME
, check out: how to define a server alias in your .ssh file
Deploying to Dokku
When deploying applications you can pick multiple methods, but they'll most likely be triggered by agit push dokku
regardless of your language of choice. The two main options are using buildpacks or to use a Dockerfile.
Buildpacks (herokuish) or Dockerfiles
Since Dokku is heavily inspired by [heroku][], you can have a look at the official list of buildpacks which also are supported inside dokku. If you're not familiar with Docker, you'll probably want to make use of the buildpacks and let some automagic happen for your deployments.On top of that, if you have very specific needs, you can even link your custom buildpacks via github / other URL to a repository.
Summary
I have not yet explored all features with Dokku and I bet I'll break my brain on one or two things along the way, but so far it's been a ton of fun!For me Dokku is an amazing place to gather all my weird web projects in different languages without having to think about custom deployment for each server / droplet / vps they run on.
Let me know if you're interested in more in depth examples for Node, Go and other things!
- indicates a referral link referral link