For this to make sense, you need to understand The Seonwoo Way (I should probably call it the JFK way, but I just think I'm that important)

There is no strife, no prejudice, no national conflict in outer space as yet. Its hazards are hostile to us all. Its conquest deserves the best of all mankind, and its opportunity for peaceful cooperation may never come again. But why, some say, the Moon? Why choose this as our goal? And they may well ask, why climb the highest mountain? Why, 35 years ago, fly the Atlantic? Why does Rice play Texas?
We choose to go to the Moon! We choose to go to the Moon...We choose to go to the Moon in this decade and do the other things, not because they are easy, but because they are hard; because that goal will serve to organize and measure the best of our energies and skills, because that challenge is one that we are willing to accept, one we are unwilling to postpone, and one we intend to win, and the others, too

~ John F. Kennedy, September 12, 1962, asking for public support for the Apollo program

Sometimes (usually?) I don't do things the normal or easy way because I want to force myself to learn new skills. A simple example is how I finally started photo editing. The photos that come out of my camera or phone are usually fine, but sometimes they just don't look quite right. For months I wanted to learn to edit photos, but I never got around to it because it's easy just to accept the photos as they are. Upon mentioning this to my friend, I was told the best way to force myself to learn is to shoot my photos in RAW to force myself to edit them (shooting in RAW (which really means the raw sensor data, without being subjected to lossy compression aka JPEG) can lead to better photos in the end, but unedited, the colors in RAW photos are duller than both real life and the typical JPEG photo). And just like that, I learned how to edit photos.

Additionally, now that I have a better understanding of what I can and cannot edit in a photo, it's made me better at taking photos, if I may say so myself. Two of my favorite shots (more photos, and these in their full resolution versions at https://gallery.seonwoolee.com):

Ways I Sabotage My Blogging Efforts

Using Ghost, not Wordpress, and using my own virtual private server, instead of a managed hosting solution like Siteground or Bluehost that handles everything but writing the actual content for you, are the sources of most of my blogging woes. This is further compounded by my strong views on privacy (which is a story for a different post, but for now just accept the fact that I do not want my blog or my readers to be subjected to data collection from the likes of companies such as Google).

A Broken Comment System

The Ghost blogging platform doesn't have any comments built in. If you want comments, you have to add them in yourself.

If you know your way around running a webserver, installing Disqus appears relatively straightforward. However, I do not approve of their privacy policy, so I don't use Disqus.

Instead I (well, try) to use Hashover, a free and open source commenting system that is completely self hosted. Any comments on this blog made using Hashover are never shared with any third parties, unlike Disqus. There was a time when Hashover did actually work on my blog (and there are some comments on some earlier posts to prove it), but currently it's broken - it never approves any comments no matter what name you use, and the page for the administrative backend where I can approve and delete comments returns a 404 error.

A Broken Analytics System

Ghost also has no analytics built in (nor do they provide a plugin for you). There is a third party solution specifically tailored for Ghost known as Ghostboard, but I'm not willing to pay $7/month to get blog analytics (that's literally more than what I pay for my domain and hosting), especially when there are several free and open self hosted source analytics solutions out there.

Google provides an analytics solution for free, but I don't want to subject my readers to data collection by Google.

I tried installing Matomo, one of these free and open source analytics solutions, but I couldn't figure out how to install it correctly. I was able to install Open Web Analytics, but I clearly made a mistake somewhere, because this is what my installation looks like:

When it's supposed to look like

Email Subscriptions Aren't Included Either

Ghost by default includes a subscribe link on your blog, but literally all that does is it collects a list of emails. It doesn't actually send any email notifications whenever you publish a new post.

Now to Ghost's credit, it does provide integration with apps such as Zapier, which, like IFTTT, can link different apps together to automate different tasks based on custom triggers. However, this requires you to set up an account with the likes of MailChimp.

In all fairness, based on my limited experience with Wordpress, this doesn't actually seem all that much different from the Wordpress platform, which requires a plugin to email subscribers.


I keep asking my blog support to fix all these blogging issues, but every time I get the excuse of trying to graduate from school. Lazy bastard.

Server Configuration and Maintenance

I use a virtual private server (VPS) from Vultr, (referral link) a web services provider, to host my blog. This means I'm effectively renting a server in some data center somewhere, except I'm sharing a physical server with many other virtual private servers. I had to install an operating system, set up the web server, and then install Ghost, all before I could write a single word on my blog.

What I've Learned From My Self Sabotage

Let's start from the ground up.

Some of the Details of Alpine Linux

My VPS at Vultr only has 1 GB of RAM. I don't know what CPU it uses exactly, but lscpu tells me it's a 2.4 GHz Intel CPU that supports AVX2 instructions, which means it is of the Haswell generation or later. The model name is only given as Virtual CPU a7769a6388d5 (if you didn't understand any of that, don't worry about it). The point is it's not a particularly powerful server (though it definitely beats the likes of Bluehost, which would host multiple customers' sites on a server with similar hardware). This makes it a perfect candidate for Alpine Linux, which while not a mainstream Linux distribution like Ubuntu, is designed to be very light and fast (for example, typically in the time that Ubuntu updates its list of packages when executing sudo apt-get update, Alpine Linux has already updated its list of packages and upgraded the relevant packages). While I use Arch Linux for my computers at home, Alpine Linux has some quirks (namely, it uses musl libc instead of glibc). Working with Alpine Linux definitely helps me when learning how to use Docker (a containerization technology), as Alpine is growing in popularity for Docker images because of its small size.

Setting Up a Web Server with nginx

The Apache web server seems to be more popular than nginx (this is purely based on my personal experience with the frequency and quality of guides on installing webapps when using Apache instead of nginx), but I decided to use nginx instead. Because The Seonwoo Way decrees it.[1].
Regardless of my choice of web server software, the fact that I had to set up the web server myself meant learning how to do so. This included setting up SSL certificates with the free Let's Encrypt certificate authority. Oh yeah, and remember how I decided to use Alpine Linux instead of a more mainstream Linux distribution? The provided scripts for installing Let's Encrypt certificates on Linux servers don't work on Alpine Linux, so I learned how to do it manually (and then created a cron job to automate renewing it).

I also learned how to set up a proxy passthrough with nginx, because Ghost runs its own web server, instead of just providing HTML files for nginx to handle directly.

Configuring a Web Server to Work with Webapps

I was hopeful that installing webapps like Hashover would be as simple as just copying the files into the appropriate directory on my server, but nope. I learned how to configure my server to work with these apps (namely, I have to make sure my permissions are set correctly, the appropriate PHP extensions are enabled, and the appropriate packages - such as the postgres database - are installed). Now granted, my comments are currently broken, but that just means more opportunities to learn how to configure a server.

I Should Use Docker

I definitely considered using Docker on my server from the beginning, but I decided against it because there is a (small) performance penalty and I was concerned about the fact that I'm running a shared virtual private server. But some things you just have to learn the hard way - I should have just used Docker in the first place. It's too easy to cross contaminate my settings.

There Are Other Benefits Too

Cost

I pay $15/yr for my domain from Hover (affiliate link, thank you for supporting my blog) and just $5/mo for my VPS. I haven't come across any cheaper blog hosting solution that's managed for you.

(But obviously if you aren't willing to maintain it yourself then the savings are nowhere near worth it.)

Blog Redirection

Initially I had my blog at https://seonwoolee.com. I later decided that I may want to have some other content at https://seonwoolee.com, and I should move my blog to https://blog.seonwoolee.com. But doing so would break all the links that I shared previously.

Luckily, when you manage your server yourself, handling something like this is easy. I downloaded a backup of my Ghost blog, parsed all the urls, and then manually added redirection statements in my nginx configuration, like so:

        location /fafsa-auto-zero-efc/ {
		return 301 $scheme://blog.seonwoolee.com$request_uri;
	}

	location /how-paycheck-withholding-works/ {
		return 301 $scheme://blog.seonwoolee.com$request_uri;
	}

	location /529s-as-college-coupon/ {
		return 301 $scheme://blog.seonwoolee.com$request_uri;
	}

This way https://seonwoolee.com/fafsa-auto-zero-efc/ redirects to https://blog.seonwoolee.com/fafsa-auto-zero-efc/. (Currently I actually redirect https://seonwoolee.com itself to https://blog.seonwoolee.com, so redirection of all old blog post links would still happen despite the above configuration. However, I have tested hosting a separate webpage at https://seonwoolee.com, and I am able to both load that separate webpage and redirect the old blog post links).

Is this the most efficient way? Possibly not. But I know it gets the job done.

I doubt any managed hosting solution would do this for you (though if you know of one, let me know so I can recommend the managed hosting solutions that go above the call of duty).

Theme

I really like my blog's theme. It's clean, simple, has a space for a synopsis of each post in the little card, estimates the reading time for each post, and even has a progress bar as you're scrolling through a post. Granted, there could possibly be a similar theme on Wordpress. I used to have this blog under a different URL that used Wordpress, and while I didn't look very hard for a theme at the time, I didn't find a theme like this one.

A VPS Provides the Ultimate Flexibility

This ties in with my earlier point about blog redirection, but I have root access to my server and can do whatever I want with it. I installed Lychee, a free and open source self hosted photo management tool, to share my photos at https://gallery.seonwoolee.com. I can run as many sites as I want on this server (though with enough traffic, it would slow to a crawl. But I can very easily upgrade my VPS to a faster one).

And I'm not limited just to using it as a website host. I could use it as my personal VPN or SSH server for tunneling when I'm at a coffee shop. I could use it as a file server and backup files to it (though I only have 25 GB of space on there, so I'd have to choose the files accordingly). I could use it as a game server if I actually played multiplayer games. The possibilities are virtually (haha, get it?) endless.

But Self Sabotage Definitely Has Its Low Points

Don't get me wrong - I love The Seonwoo Way (I don't call it The Seonwoo Way for nothing). But some days, I want comments to work. I want analytics to work. I want automatic subscription emails to work. Sometimes, I just want to focus on the actual blog content and not deal with this server admin crap.

The lack of proper analytics is probably my biggest pain point. While the primary reason I blog is not for the sake of blogging but to practice writing, especially writing of a technical nature, which is required for my PhD (and honestly for the rest of my career), like most people I'm at least a little vain (if you're not one of these people, consider me jealous). I want to know that I'm not just shouting into the void, that my work is in fact appreciated. Fortunately (from one point of view), I primarily seem to get readers from Facebook and Twitter (where I always share my posts), which at least provide them an alternative way to engage with me. However, because my analytics don't seem to work, I don't even know how many page views I get.

I can tell myself all I want that I primarily blog to practice writing, but ultimately if nobody ever engaged with me, I'm not so sure that I would keep blogging.

Measured Self Sabotage Is Good For You, and Not Just as a Blogger

The key word being measured. If you go too far you would spend too much time learning new skills than actually getting anything done, but some measured self sabotage is an excellent way to continue stepping out of my comfort zone and learning new skills.


  1. Okay practically speaking, there really wasn't a compelling reason to choose nginx over Apache. It seems nginx is more performant than Apache, but that advantage only manifests itself when experiencing high traffic ↩︎