Engineering

Node.js Deployment; Docker, Dokku & Digital Ocean

DigitalOcean is a really nice cloud hosting company that offers excellent performance at affordable rates

Docker is an abstraction on top of LXC Containers. Docker introduces a workflow that makes operating containers straightforward and lots of fun.

Dokku is a tiny program that allows you to easily deploy your applications. It was built by progrium (from localtunnel) on top of docker, Buildstep, gitreceive, pluginhook, nginx, Heroku BuildPacks,& sshcommand

DIY

Register with Digital Ocean and add your SSH key

Create a new droplet using the latest Ubuntu making sure you select your ssh key. Go for a 1GB+ droplet

As soon as your server is ready you can connect via SSH

ana@local: ssh root@123.456.678.9
If you get prompted for a password you forgot to add your SSH key to the server. You can still login in using a password (it’s in your email). Connect to your server using the root password and add your key to ~/.ssh/authorized_keys

Installing dokku is easy

root@dinospace: wget -qO- \
https://raw.github.com/progrium/dokku/master/bootstrap.sh \
| sudo bash


Dokku works best with a domain so applications can respond to foo.dinosaurspaceships.org instead of dinosaurspaceships.org:29842

Add these A records to your domain making sure they point to your server. You can even do this in the DigitalOcean Control Panel if you configured your domain to use their name servers

Type	Host				Answer		TTL   
-----------------------------------------------------------
A	dinosaurspaceships.org		123.456.678.9	30
A	*.dinosaurspaceships.org	123.456.678.9	30


You can now connect to your server using your domain name

ana@local: ssh root@dinosaurspaceships.org

Dokku uses the /home/dokku/VHOST file to store your domain name so make sure dinosaurspaceships.org is in there

root@dinospace: touch /home/dokku/VHOST
root@dinospace: echo dinosaurspaceships.org > /home/dokku/VHOST

To give yourself (and others) permission to deploy use the sshcommand program

ana@local: cat ~/.ssh/id\_rsa.pub | \
 ssh root@dinosaurspaceships.org \
 "sudo sshcommand acl-add dokku username"


Deploy your first application: Tiny; a node.js based url shortener

ana@local: git clone https://github.com/dscape/tiny.git
ana@local: cd tiny

Tiny responds to two kinds of HTTP requests

#
# minimize a url 
#  
POST /create&url=http://minimize.me
#
# get the redirect for a minimized url
#
GET  /hN1x


We can deploy tiny by git pushing from our machine to the server

On the server you can use docker to check if the process is running

root@dinospace: docker ps -a
ID		IMAGE
9f033c42189e	app/tiny:latest


Shorten your first URL. What better pick than dinosaurspaceships.org?

ana@local: curl -X POST \
 dinosaurspaceships.org/create?url\=http://dinosaurspaceships.org
 f0x


Resolving the shortened version

ana@local: curl -I dinosaurspaceships.org/f0x
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.2.6 (Ubuntu)
Date: Sat, 03 Aug 2013 01:54:40 GMT
Connection: keep-alive
Location: http://dinosaurspaceships.org


Voilá!

Docker provides you easy access to logs

root@dinospace: docker logs 9f033c42189e
 /create?url\=http://dinosaurspaceships.org
 /f0x


Environment variables are commonly used to store secrets such as api keys or passwords. Dokku support this functionality out of the box

root@dinospace: touch /home/git/tiny/ENV
echo "export FOO=BAR" >> /home/git/tiny/ENV


This is all for now

Node.js Deployment; Docker, Dokku & Digital Ocean
was originally published in YLD Blog on Medium.
Share this article: