If you’ve used Heroku you’ll be familiar with the convenience of using “git push” to deploy your Ruby application. Here’s how you can do the same on YOUR VPS using Dokku - a simple system that allows quick deployment of packaged applications, or “buildpacks”.
Dokku uses software called Buildstep and contains your applications using Docker. That’s a lot of buzzwords to put onto your own server, but we’ll get you from those to pushing your application in about 10 minutes.
In this blog post, we’ll show you how to deploy a simple example application (to make sure everything is working). In our next post, we’ll show you how to deploy a more complex ‘real’ application – the code collaboration platform Gitlab.
For our first post, we’ll use simplest-sinatra-heroku. We’ve chosen this simple example of an existing third party Ruby application because it has few other dependencies, and should work really quickly.
Some basics
We assume you have a Terminal program handy – if you’re using Windows we’d recommend installing Cygwin to and using its terminal to follow this through. Linux and Mac systems have a Terminal program built-in.
If you don’t use SSH very often, you may not have an SSH key handy. This is a really useful alternative to passwords, and means you can log in to new servers very quickly.
It’s simple to create one at your terminal, just run:
Install your SSH key on the remote server to avoid having to re-type your password over and over:
Run this at your new server’s root prompt:
One more command will complete our install, and then we’re on to getting configured and deploying:
At the end of this process, we will have a new UNIX user on the system called ‘dokku’. Its home directory will be at /home/dokku and it will be the user running our applications.
So if you’ve copied your SSH key earlier, you can simply run this on the server, replacing your_username with your usual UNIX username:
So we’re going to use the simple example program mentioned earlier before attempting something more substantial.
Back on your local system, where you might want to develop and test, clone the example application’s repository with a command like this (or use your favourite Git front-end):
You’ll see some fairly long output, like this:
from http://blog.bytemark.co.uk/2014/05/12/git-push-ruby-applications-dokku-server-bigv
Dokku uses software called Buildstep and contains your applications using Docker. That’s a lot of buzzwords to put onto your own server, but we’ll get you from those to pushing your application in about 10 minutes.
In this blog post, we’ll show you how to deploy a simple example application (to make sure everything is working). In our next post, we’ll show you how to deploy a more complex ‘real’ application – the code collaboration platform Gitlab.
For our first post, we’ll use simplest-sinatra-heroku. We’ve chosen this simple example of an existing third party Ruby application because it has few other dependencies, and should work really quickly.
Some basics
We assume you have a Terminal program handy – if you’re using Windows we’d recommend installing Cygwin to and using its terminal to follow this through. Linux and Mac systems have a Terminal program built-in.
If you don’t use SSH very often, you may not have an SSH key handy. This is a really useful alternative to passwords, and means you can log in to new servers very quickly.
It’s simple to create one at your terminal, just run:
ssh-keygenYou can just accept the defaults, and leave the password empty for the purposes of this tutorial. But if that’s interesting you might want to follow github’s slightly more informative guide, or look around for articles on more advanced SSH usage.
Install your SSH key on the remote server to avoid having to re-type your password over and over:
ssh-copy-id root@urhost.com ssh root@urhost.comYou’ll need to replace the hostname with ur own hostname, enter the password once, then you won’t need to use it again.
Installing Dokku
You can now start to install Dokku, which is the software to supervise your applications, and allows you to deploy with git. First we need to install Dokku’s (pleasantly minimal) dependencies.Run this at your new server’s root prompt:
Once those are installed, grab the Dokku repository from github:apt-get install -y git make curl software-properties-common python-software-properties sudo
We’ll want to check out a specific version of Dokku that works with the version of Ubuntu that we picked. You do this by running:git clone https://github.com/progrium/dokku.git
And you can check this worked by running:cd dokku # to change to the newly cloned dokku directory git fetch origin git checkout v0.2.3
Which should show:git status
This means we’re on the version of Dokku currently suggested for use with Ubuntu 12.04 by its author.# Not currently on any branch. nothing to commit (working directory clean)
One more command will complete our install, and then we’re on to getting configured and deploying:
make installThis takes around five minutes and will download quite a few other dependencies.
At the end of this process, we will have a new UNIX user on the system called ‘dokku’. Its home directory will be at /home/dokku and it will be the user running our applications.
Configuring Dokku
Dokku has its own system of users which are separated by separate SSH keys. So in the long run you can set up deployment capabilities for lots of people, but for now we’ll reuse the SSH key you’re using as our deployment key.So if you’ve copied your SSH key earlier, you can simply run this on the server, replacing your_username with your usual UNIX username:
You’ll then see some output a little like this if it went right:cat /root/.ssh/authorized_keys | sshcommand acl-add dokku your_username
This should give you access rights to the running Dokku system.7e:fa:49:78:24:6b:12:52:e0:60:2b:4f:09:62:06:da
Adding the first application
This is the part where we add a git repository. This can’t just be any repository, it needs to contain a valid buildpack for your application, the part that interfaces with Dokku.So we’re going to use the simple example program mentioned earlier before attempting something more substantial.
Back on your local system, where you might want to develop and test, clone the example application’s repository with a command like this (or use your favourite Git front-end):
Still on your local machine, go into the repository:git clone https://github.com/cluesque/simplest-sinatra-heroku.git
What we do now is set our local git repository up with a new “remote”, a reference to our deployment host. We’ll call the new remote ‘sinatra’. So this comand sets itup:cd simplest-sinatra-heroku
And this command does the push to our new host, which will pick it up as a live deployment:git remote add sinatra dokku@dokku.default.bytemark.uk0.bigv.io:sinatra
(‘master’ is the git branch that we’re deploying – again this is just an easy default for this tutorial).git push sinatra master
You’ll see some fairly long output, like this:
The first time you do this you might actually get slightly different output suggesting a failure; that’s OK, and if you run the “git push sinatra master” command again it should work on the second attempt.$:~/simplest-sinatra-heroku$ git push sinatra master Counting objects: 56, done. Delta compression using up to 12 threads. Compressing objects: 100% (48/48), done. Writing objects: 100% (56/56), 12.02 KiB, done. Total 56 (delta 21), reused 0 (delta 0) -----> Cleaning up ... -----> Building sinatra ... remote: warning: You appear to have cloned an empty repository. remote: HEAD is now at ca04467... Use the actblue public bignumber.js Ruby app detected -----> Compiling Ruby/Rack -----> Using Ruby version: ruby-2.0.0 -----> Installing dependencies using 1.5.2 Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment The source :rubygems is deprecated because HTTP requests are insecure. Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not. Fetching gem metadata from http://rubygems.org/......... Fetching additional metadata from http://rubygems.org/.. Installing multi_json (1.0.4) Installing multi_xml (0.4.1) Installing rack (1.3.5) Installing tilt (1.3.3) Using bundler (1.5.2) Installing temple (0.3.4) Installing httparty (0.8.1) Installing rack-protection (1.1.4) Installing slim (1.0.4) Installing sinatra (1.3.1) Installing json (1.6.3) Installing redcarpet (2.0.1) Your bundle is complete! Gems in the groups development and test were not installed. It was installed into ./vendor/bundle Post-install message from httparty: When you HTTParty, you must party hard! Bundle completed (23.80s) Cleaning up the bundler cache. The source :rubygems is deprecated because HTTP requests are insecure. Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not. -----> WARNINGS: You have not declared a Ruby version in your Gemfile. To set your Ruby version add this line to your Gemfile: ruby '2.0.0' # See https://devcenter.heroku.com/articles/ruby-versions for more information. -----> Discovering process types Default process types for Ruby -> rake, console, web -----> Releasing sinatra ... -----> Deploying sinatra ... =====> Application deployed: http://sinatra.dokku.default.bytemark.uk0.bigv.ioTo dokku@dokku.default.bytemark.uk0.bigv.io:sinatra * [new branch] master -> master
Checking our work
The example application should now be live! You can check out the Sinatra application’s URLs like so, again replacing “dokku.default.bytemark.uk0.bigv.io” with your server’s hostname:This should work with any valid buildpack. Where external services (databases, for instance) are required, you’ll need to specify those in the application repository as usual.http://sinatra.dokku.default.bytemark.uk0.bigv.io/hi http://sinatra.dokku.default.bytemark.uk0.bigv.io/page ...and everything else in app.rb.
Making Dokku work with your domain
You probably want your Dokku-hosted apps to appear on a more memorable domain. If you have one, and can delegate a wildcard record to your host, you only need to update one file with the domain name. So e.g. if you have example.com as your domain, and you want to find your new app at sinatra.example.com you would simply type this on your server:That should be all. From now you should be able to add new repositories, and once they’re sent to Dokku, you’ll be able to access them through application-name.example.com.echo example.com > /home/dokku/VHOST
Part 2: Deploying Gitlab – preparing for a real application
In part 2 of this blog post, we’ll show you how to prepare Dokku for a ‘real’ application – Gitlab – a web based git repository manager that’s often described as a “host your own” Github equivalent.from http://blog.bytemark.co.uk/2014/05/12/git-push-ruby-applications-dokku-server-bigv