Recently, I got a few questions from my friends and colleagues about my blog. Specifically, about its internals. Not to repeat myself, answering the same questions over and over, here I am going to share the technical details on that.
Also, to whet your appetites, I spend less than $8 per month to keep it running. For that ridiculously low price, I have the pages loaded in less than 1 second, serve the traffic over encrypted HTTPS connections, monitor my site availability from multiple locations, and send out site updates via email to my subscribers.
So, let’s look under the hood.
When I was considering multiple CMS options for running the blog, I looked for a few particular things. Firstly, as I don’t consider myself an experienced web programmer, it was essential that I can install the engine in an easy manner without digging in into its source code. Secondly, I wanted it to be as simple as possible – it’s just a blog, man 😉 So, such heavyweight and multifunctional solutions as Umbraco or WordPress were out of scope.
Ghost was an emerging solution at that time, and I decided to give it a try to serve the content of my blog. This engine attracted my attention because it is free, open-source, lightweight, highly customizable and has lots of external integrations. Apart from that, I liked the option of either running it in a self-hosted environment or using it as a managed service.
To be honest, after a year of self-hosting (more on that later), I don’t consider Ghost to be a perfect solution for myself. On the one hand, it does its job well and works fast. On the other hand, I really don’t like its vendor lock for supported environments, and I would like to have more flexibility with OS and database options. Besides, from the IT Ops point of view, the breaking changes both in Ghost and Nodejs platforms are a pain in the ass. So, for me, it is still a tradeoff between the engine’s functionality and its maintenance cost.
As I didn’t expect to have significant traffic just from the start, I chose to be lean and self-host the blog as the pricing for Ghost managed service is a little bit overhead comparing, for instance, with the WordPress managed hosting. When the site reaches some considerable number of page views, the managed Ghost hosting will be an excellent choice to offload the infrastructure management.
From the list of suggested self-hosting options, I ended up with the Ghost Droplet by DigitalOcean, which is a Linux-based virtual machine. So, technically, I have full control over the operational environment. The pricing is extremely cheap, and for my purpose, the smallest droplet works just fine:
In total, it costs me $6 per month to host my blog: $5 for the droplet plus $1 for automated weekly backups.
I didn’t bother with the site design too much and used a slightly customized Casper theme – a default theme developed by the Ghost team. Despite it having some issues with post cover image scaling, which I’m currently looking into, it serves my purpose as of now and works relatively well both on desktop and mobile devices. In the upcoming year, I will probably change the design and switch to something new.
The domain name
I have been hosting all my registered domain names with DNSimple for years, and I’m pretty satisfied with their service quality and a wide range of technical features. Strictly speaking, DNSimple is a DNS hosting service, and the domains are registered by eNom, but that is more of technical nuance.
The domain name for my blog costs me $17 per year: I pay $14 for the domain itself plus a $3 fee for the WHOIS Privacy Protection.
As you might have already noticed from the performance metrics of my hosting, the utilization of public network bandwidth is relatively low compared to more than 1,000 active monthly users on my blog. Of course, 1k is not a huge audience. Still, fast page loading is an essential metric from the usability and search engine optimization points of view.
My average page load time is less than 1 second 🚀 and that is possible because of the Cloudflare CDN. They have a free plan for personal websites that provides you with worldwide CDN, network threat protection, and more.
Thanks to the CDN, almost 98% of the requests even don’t reach the server running the site, and I can save money on the hosting as I simply don’t need to use a more powerful and, therefore, more expensive server:
Sure, there is still room for improvement. For example, I consider migrating from the Facebook comment plugin to Discuss, as the Facebook script is quite heavy and cumbersome.
Apart from the offloading most of the traffic from my hosting, Cloudflare allows me to use SSL encryption for my blog and do it literally for free. The service automatically assigns a certificate to your Cloudflare logical endpoint plus you can also configure encryption between Cloudflare and your origin server:
Apart from the site security and speed improvements, that configuration also ultimately diminishes the need for certificate provisioning, configuration, and periodic rotation. For people who are familiar with the tedious annual process of updating certificates, it seems like a blessing 🙏
For usability and end-user monitoring, I use Google Analytics. As I’m not super focused on search optimization and user acquisition for my blog, I look into GA primary for some basic stats like the number of active users and the most visited web pages.
Recently, I have also instrumented the site with Application Insights to have better visibility over its internals and to monitor its availability from multiple locations. It adds approximately 50 cents to my monthly bill but provides me with valuable diagnostic information and notifies my if there is something wrong with the site:
Also, it would be interesting for me to compare the analytical data from Google Analytics and Application Insights side-by-side in a while.
To keep my readers updated, I provide them with an option to subscribe to the recent updates to my blog. When I was starting, Ghost introduced the Subscribers feature that allowed me to collect user emails and feed them to external email subscription services like MailChimp or Drip. After some consideration, I stick with MailChimp due to its free plan for up to 2,000 subscribers as I simply didn’t need most of the advanced features from the paid plans.
Also, to automate the subscription process, I used Zapier to monitor my Ghost instance for new subscribers and add them to my MailChimp list:
In MailChimp, I configured an ongoing weekly campaign based on my blog RSS feed. The campaign sends out all updates if there are any since the last campaign run:
Probably, the subscription configuration took me most time during the initial setup as it involved connecting multiple services. Lucky, now the whole process is fully automated – I just need to publish new posts on the site to be them delivered to my subscribers.
So, if you too want to be informed about my last blog posts, hit the subscribe button below and opt-in for your subscription in the follow-up email 👇
See you soon!