Sharing Thoughts Through Words

Deploy Ghost with Dokku on Digitalocean (plus Letsencrypt)

Posted at — Feb 1, 2016

Choosing publishing platform might not be an easy task for some people including me, I have used Wordpress as my publishing platform but not for my personal blog tho. For example, like this website I have been deployed several years ago with Wordpress platform but it’s hard to focus on content since it has too many navigations and plugins. So I chose to use ghost with dokku on Digitalocean stack heres why:

Versions

Ubuntu 14.04 Dokku v0.4.12 Ghost 0.7.5 dokku-letsencrypt 0.6.0

Spawn Dokku on Digitalocean

Deploy dokku with Digitalocean one-click app dokku droplet.

1. Selecting Dokku Images Digitalocean Dokku Image

You will need to choose several options according to your needs and I just realized that Digitalocean also have ghost one click app, but its need separate install and manually configure nginx for each installation.

2. Configuring Dokku Host

After droplet created you can browse your droplet IP address and you will see the configuration.

Dokku Setup Screen

After all necessary field has been filled you can click the finish setup button and deploy your apps to dokku.

Creating Dokku Apps

Dokku has a command line administrative interface you can list all available command by ssh (ssh dokku@your-host.name) to your host with dokku username.

By running ==apps:create== command it will create your container and git endpoint, for example to create ==playground== app you will need to run ssh dokku@your-host.name apps:create playground and it will create git bare repository and it should look like ssh://dokku@your-host.name:playground. You can read more about dokku here. You can also add your desired domain name to your container.

$ ssh dokku@host.name apps:create playground
$ ssh dokku@host.name domains:add playground playground.rahono.xyz 

Deploy Ghost

1. Download Ghost Release
You can download latest ghost release on their download page and extract it to your desired folder and copy config.example.js file to config.js.

$ wget https://ghost.org/zip/ghost-0.7.5.zip
$ unzip -d playground ghost-0.7.5.zip
$ cd playground
$ cp config.example.js config.js

2. Configure Ghost
For production environment, you need to configure valid mail transport and change the host (production.server.host) configuration to '0.0.0.0' and the port to process.env.PORT this will use custom port assigned to your ghost container, your config file should look like.

// config.js
config = {
// ...
production: {
  url: 'http://playground.rahono.xyz',
  mail: {
    transport: 'SMTP',
    options: {
      service: 'Mailgun',
      auth: {
        user: process.env.MAILGUN_USERNAME,
        pass: process.env.MAILGUN_PASSWORD
      }
    }
  },
  database: {
    client: 'sqlite3',
    connection: {
      filename: path.join(__dirname, '/content/data/ghost.db')
    },
    debug: false
  },

  server: {
    host: '0.0.0.0',
    port: process.env.PORT
  }
}
// ...
}

I still use sqlite because according to Sqlite it still able to serve small to medium website and I was use low memory deployment so I prefer to not use full fledged SQL server.

3. Deploy Your Ghost
Your ghost application folder needs to be git repository to be able to deploy to dokku and exclude generated folders by npm and bower to your git, add necessary file to your git and push it to your dokku remote.

$ git init
$ echo 'node_modules' > .gitignore
$ git remote add dokku dokku@host.name:playground
$ git add .
$ git commit -am "Initial Commit"
$ git push dokku master

after the deploy command finish, you should be able to visit one of your domains linked to your dokku container.

$ ssh dokku@host.name domains playground
playground.host.name
playground.rahono.xyz

P.S if you got an error and you have small memory droplets it might be caused by out of memory error. you can add swap to your vm by following this guide.

Using Letsencrypt SSL Certificate

1. Install dokku-letsencrypt plugin
Installing plugin need root access to your dokku vm so you need to login to your vm with sudo or root access and install dokku-letencrypt plugin.

$ ssh root@host.name
#> dokku plugin:install https://github.com/dokku/dokku-letsencrypt letsencrypt

2. Generate Certificate for your hosts
Generating SSL letsencrypt ssl certificate to your host, simply run plugin command for your app and it will automatically generating CSR and sign your certificate. but you need to add your email to letsencrypt app plugin

$ ssh dokku@host.name letsencrypt:email playground your@email.tld
$ ssh dokku@host.name letsencrypt playground

Whats Next?

If you want to customize your casper theme you can read more on ghost guid here and theme are located under content/theme inside your the ghost directory.

You can signup to Digitalocean by using this link and get free 10$ credit upon signup.

comments powered by Disqus