Over the course of the last few years, I migrated my blog a few times:

  • Wordpress -> Jekyll
  • Jekyll -> Ghost (some 0.x version long before 1.0)
  • Ghost -> Wordpress
  • (nothing for a few years)
  • Wordpress -> Ghost (today)

What made me migrate to Ghost? Wordpress had been nagging me for a while to upgrade my PHP version (Debian 9's version was out of date). I decided to build a new (free) F1 micro Google Cloud instance with Debian 10. I would basically migrate my whole blog to a new instance. It was very simple and straightforward using the All-in-one Wordpress Migration plugin.

The problem? 583MB of RAM was not enough for a modern, up-to-date, responsive, basic Wordpress stack. It worked, but just barely. I had to enable swap space to make things stable, and that swap space would easily use 100MB. My Wordpress installation was pretty straightforward: Apache, PHP, and MariaDB (whatever versions came with Debian 10). I also use LetsEncrypt to get an SSL certificate. I'll say this again - it worked. But pages loaded pretty slowly and the memory usage hovered around 80% and 100MB of swap space was always in use.

I had a few options:

  • Switch to a lighter-weight HTTP server: nginx. Sure, it could be done, but it didn't seem to be well-supported.
  • Optimize, cache, etc. - I didn't really want to go down that rabbit-hole for a personal blog.
  • Use a bigger instance. I could get a server with 1GB RAM pretty much anywhere (DigialOcean, Linode, Vultr, AWS Lightsail, ...). My goal is to run this blog for free, so I wanted to stay on the free Google Cloud Platform F1 instance with 583MB of RAM.
  • Try something else. Jekyll and any number of static site generators could do the job and publish to GitHub for hosting or to my small instance running an HTTP server. But I really wanted a more full-featured CMS. That brought me to Ghost.

I ultimately went with Ghost which had matured since I last used it. I'm very happy with my current setup:

  • Debian 10
  • Nginx
  • LetsEncrypt + Certbot for SSL
  • Ghost (running via Docker!)

There was one manual thing I needed to do to maintain URLs like I had before - I needed to upload a custom routes.yaml file that set my post URLs to YYYY/MM/DD:

routes:

collections:
  /:
    permalink: /{slug}/
    template:
      - index

taxonomies:
  tag: /tag/{slug}/
  author: /author/{slug}/

I got the above YAML block from https://andrewaadland.me/2018-11-05-preserving-publish-date-in-url-ghost-2-0/

Things I still need to do:

  • I like seeing how many hits my posts have every day. It's maybe 5-10 a day, but I do like seeing it. Wordpress did this via the Jetpack plugin. I need to find some lightweight way to do with without Google Analytics.
  • Automate posting to LinkedIn. This isn't very important so I might skip it.
  • Backups! My current setup makes it very simple - I just need to copy the content folder somewhere. I need to automate that.

I'll publish a how-to on the technical details shortly - the process is a lot simpler than expected.