I've just switched my blog over from WordPress to Ghost, a newer, more responsive, lighter platform. I've opted to start again from scratch rather than copy all the fragmented articles from when I first started blogging during my undergraduate years back in 2012.

The WordPress site wasn't as fast as I wanted it to be... site load times were averaging 750ms with Apache Bench. This was caused by a few factors, including the bloat of WordPress and the need to run an MySQL instance too. I had added a caching layer, but this didn't yield the improvements I wanted.

The new site running on Ghost is a lot more responsive. Median response times are down to 105ms. I've also ditched the MySQL back-end and opted for an sqlite database instead. This is handy as I only have one server running the site - if I need to scale up, I could sync this from a master.

To get Ghost running, I simply used a docker image that sits behind a reverse proxy running nginx. This allows me to serve other content from port 80 and force all traffic to use HTTPS. You can check out the reverse-proxy docker image I made here: https://github.com/j6mes/reverse-proxy

The site is just a simple docker-compose script which I can use to boot both services, setting the CERTS_DIR and CONTENT_DIR environment variables to mount the docker volume endpoints.

version: '3.1'

services:
  ghost:
    image: ghost
    hostname: ghost
    restart: always
    environment:
      url: https://jamesthorne.co.uk
    volumes:
      - $CONTENT_DIR:/var/lib/ghost/content
  proxy:
    image: j6mes/reverse-proxy
    links:
      - ghost
    depends_on:
      - ghost
    ports:
      - "80:80"
      - "443:443"
    restart: "always"
    environment:
      TARGET_URL: "ghost"
      SERVER_NAME: "jamesthorne.co.uk"
      TARGET_PORT: 2368
      LISTEN_PORT: 80
      LISTEN_PORT_SSL: 443
      STATUS_IP: $STATUS_IP
    volumes:
      - $CERTS_DIR:/etc/nginx/certs

So this is all I needed to get the site up and running on my server, I guess now I need to start writing some higher quality blog posts.