Deploy a private Github repository with whiskey_disk
whiskey_disk
makes it very easy to quickly deploy a new version of your site to one or more servers. It’s very efficient, as files are copied directly from your git repository to the server. This means you can very quickly make large deployments even when you are on a slow internet connection. You do need a secure way for your server to access the git repository while the deploy is going on, read on to see how this is easily done.
For this example, I’m going to deploy a small static site from a private Github repository to a server via ssh using whiskey_disk
. There are a few steps in getting this all setup, but once you have the ssh infrastructure playing nicely, a complete deployment of a small static site takes on the order of 2-5 seconds. Stay with me, and I’ll show how all the pieces fit together.
To begin with, I’ll assume you have a site or application already pushed to a private Github reposity that you now want to do a deploy of. You also have ssh access to the server you are deploying to for this to work. For this example, I’m deploying the master
branch of the following private git repository:
git@github.com:rud/whiskey_disk-demo.git
Adding the configuration file
Make sure you have your appropriate code pushed to Github, then we’ll add the whiskey_disk config file config/deploy.yml
to the project:
This is a simple YAML file (indentation matters), you will need to adjust the domain and paths as appropriate. I use the name demo
for the environment, other common examples would be staging
, production
, etc. A lot more options are available, see the official whiskey_disk readme, but this all we need to get started.
Running whiskey_disk setup
whiskey_disk has two commands: a setup
command, for doing the initial repository clone, and the deploy
command used for all subsequent deploys.
With the config/deploy.yml
file in place inside the project, we’re going to just try and run the setup
command from the local computer, seeing what happens. For now, this errors out:
Okay, we’re not quite ready to do deployments just yet.
Resolving all ssh issues
Github hangs up on us - what’s happening? Testing from my local machine as described in the github ssh guide:
That’s the kind of success we’re looking for on the server as well. Ssh to the server as the deploy user, and try the same command there:
Try the command again, now that the host key is trusted:
Notice how we get a new error later in the connection process, a Permission denied (publickey)
instead of Host key verification failed
.
For the sake of completeness, this is what this situation looks like from whiskey_disk:
ssh-agent to the rescue
The root cause for this difference is Github knows my public key and has access to the corresponding private key, but this key is not available to my server, so it cannot authenticate against Github. The solution is fortunately simple. Do this on your local machine:
This prompts you for the password for your private key, then keeps the private key unlocked in memory for automated access. You need to do this after each time you restart before you can do new deployments, as the unlocked key is only stored in memory. We also need to enable ssh-agent support for the connection to the server - as ssh-agent gives a server the possibility to use our private key without further prompting, you need to trust the administrator of servers you deploy to. With that caveat out of the way, open your ~/.ssh/config
file, and add a config block like this:
Adjust the hostname to taste, obviously. You can also add port-number here, if your admin moved ssh access from the default port. While you have that file open, also check out these extremely handy ssh productivity tips for a lot of extra ssh goodness.
Close the previous connection to your server, open a new one (so ssh-agent can do its magic), then re-run the test:
We have ssh-win!
Deploying
Time to re-try the deployment setup
from the local machine:
This means the repository was successfully cloned into place. We only have to do this once, from now on deployments are just a matter of:
I’m seeing a total time taken for a deployment in the area of 2-5 seconds. Remember to push to Github before running your deployment, as it is from Github your server is pulling versions.
This method for deployment is extremely awesome, and the amount of awesome grows with the size of your deployments, as server-server connections are most likely a lot faster than your own internet connection.
Next steps
There is a lot more to whiskey_disk that I’ve shown here. In particular I’d like to highlight the “Configuration Repository” section of the official whiskey_disk readme. Editing per-application configuration files on individual servers is effectively a thing of the past.
Hi, I'm Laust Rud Jacobsen, an experienced webapp developer specializing in Elixir, Ruby and PostgreSQL-based solutions. You can hire me to build awesome stuff for you. If you have any questions or comments, reach out at @laustrud or privately at work@valuestream.io.