Setting up this blog

November 12, 2015
Getting Started ghost blogg

Introduction

I have had this blog brewing for a while, but have not really had the time to finish it before - I might get back to why in a later post.

Anyway here goes:

I started out hosting it on Heroku. It’s a great way of hosting web applications and you can start out on their free tier which also has a lot of free add-ons like Postgres and New Relic. How ever i like to tinker and a Pluralsight course - Mastering Your Own Domain by Rob Conery - inspired me to be more in control. For instructions on how to run Ghost on Heroku I used this guide by Greg Bergé.

The basics

The blogging software is Ghost, which is based in node and I use Postgres as datastore and have an nginx server running in front of node. The whole thing runs on a Ubuntu 15.10 server on DigitalOcean.

The how

The Pluralsight course mentioned earlier basically describes how to setup Ghost on a new server droplet on DigitalOcean. So for detailed description have a look at that.

Setting up the server

Create droplet

Head over to Digital, create an account if you don’t already have one and then create a new virtual machine which at Digital Ocean is called a Droplet. I use the smallest instance they provide with Ubuntu 15.10. Remember to check the backup checkbox, it’s $1 more a month but having a backup is nice. Last thing; add a SSH key for convenience when logging on to the machine. When the machine is ready (usually takes around 1 minute) ssh into it to get working.

Setup a user

adduser ghost
visudo	     # And then assign super user privileges to ghost user
#Add ssh key to the new user (Install ssh-copy-id with homebrew first
ssh-copy-id <username>@<host> 

Now install all the necessary software

Install nginx

sudo apt-get install nginx -y

Intstall Postgres and dev lib

sudo apt-get install postgresql libpq-dev

Add ghost user to postgress

sudo su postgres # Switch to postgress user
psql             # Open terminal to postgres
create database <ghost-db-name>;
create role <db-user> with password '<uder-pw>' LOGIN; #Create role and grant login
alter database <ghost-db-name> owner to <db-user>; #transfer ownership

Install Node

sudo apt-get install curl # Install curl to obtain node
curl --silent --location https://deb.nodesource.com/setup_0.12 | sudo bash -
sudo apt-get install --yes nodejs npm
sudo ln -s /usr/bin/nodejs /usr/bin/node # Add symlink

Install Ghost

wget https://ghost.org/zip/ghost-0.7.1.zip # Version 0.7.1 is latest at the time of writing
unzip ghost-0.7.1.zip -d <folde-to-run-ghost-from>

Prepare and start Ghost

npm install --production
npm start

Now this will starts ghost on the server running the default configuration, so we’ll need to edit the config.js in the root of the ghost installation to user Postgres instead of SQLite and for it to know the blog root url. The configuration should be changed to something like this:

  production: {
    url: '<blog-url>',
    database: {
      client: 'postgres',
      connection: {
          host     : 'localhost',
          user     : '<db-user>',
          password : '<user-pw>',
          database : '<db-name>',
          charset  : 'utf8'
      },
      debug: false
  },

Since I would like to hand over the webserver part to nginx (and have it runnign on port 80) i need to configure it to proxy to node. There are different ways to do so and since I’m no nginx wizard I chose the one I have used before.

Add config file to nginx

sudo touch /etc/nginx/sites-available/ghost
sudo vim /etc/nginx/sites-available/ghost

Configure proxying in nginx

server {
    listen 80;
    server_name your_domain.tld;
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_pass         http://127.0.0.1:2368;
    }
}

Symlink to sites-enabled and restart nginx

sudo ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost
sudo service nginx restart

Keep ghost up and running with pm2

sudo npm install pm2 -g 	# Install
pm2 startup 				# Ensure pm2 starts the app in system startup
NODE_ENV=production pm2 start index.js # Startup production instance

That’s it

That concludes my basic setup of this blog. Next up:

  • Adding comments with Discus and insights with Google Analytics
  • Setting up deployment with git
  • Running and maintaining a Ghost blog with Docker
comments powered by Disqus