Stack: My Infrastructure

This is an actively updated list of what's powering my online presence.

Backbone: OVH Cloud VPS

Accessing my VPS via SSH with Termius.

A lot of things that I'm running right now requires some sort of server-side functionalities, for example, a simple SQL database, or automated cron jobs. Since my failure of trying to host a Ghost blog for free, I've been actively looking for an affordable VPS that I can host different services with. Eventually, I settled with OVH's Black Friday deal, getting myself a year worth of a 2 GHz, 2 GB RAM + 20 GB SSD, unlimited traffic for about $32 a year. Speed isn't great, I have to say, but I'm really not looking for performance at this point, rather just something usable.

Firewall + CDN: Cloudflare

There's really nothing I can complain about Cloudflare. It works, it saves lives, and it's free. It hides the IP address of my actual server, and wraps the site with an SSL certificate when I accentially dropped them. That's a few less things for me to worry about. So seriously – why not?

Web Proxy: Cloudflare Workers

The interface for my proxy.

Due to my school's internet restrictions, I sometimes find it necessary to use a web-based http proxy to quickly go around my school's internet filter (for education purposes, obviously – e.g. running a cybersecurity demo during club meetings). But I also don't really want to host the proxy on my own server since that might just cause the school to block my IP addresses and domains.

Luckily, the existence of Cloudflare Workers has made everything so much easier. I can proxy my traffic through Cloudflare with a script that looks something like this, and even modify the headers and data so the traffic looks more "educational". I won't be sharing what is actually deployed (since doing so might make it possible for the firewall to block my keywords – but honestly... really?)

Analytics: Fathom Lite

Fathom's analytics for this blog.

I've always been looking for a better analytics solution. The classic Google Analytics works, but it's way beyond what I need for my sites. All I want to collect from my audience are engagement information and referral sources, so I know what pages of my sites get the most clicks. Luckily, Fathom Lite (the open-source, self-hosted version of Fathom) works well for my use cases.  As the documentation of the project describes:

Fathom respects the privacy of your users and does not collect any personally identifiable information. All while giving you the information you need about your site, so you can make smarter decisions about your design and content.

I am also able to use this tracking solution for some of my side projects – for example, it is also providing tracking data for grant.executebig.org, helping us understand where our applicants learned about our program.

Blog: Ghost

The Ghost Admin Interface.

I wrote about why I decided to use Ghost instead of all other blogging solutions in the afformentioned entry. Aside from constructing the hosting environment, I also pulled together a few solutions to solve the tiny problems that came up along the way.

Blog Theme: 💫 Ganymede

I mentioned that I wanted a content-focused blog, so in order for it to be truly content-focused, I decided to cut out all the mess by customizing my own theme. Ganymede is the end product. It is based on a pre-constructed theme called Callisto, but aside from changing a ton of display and rendering logic, upgrading some of the outdated components that Ghost has decided to retire, and adding in support for some of the new components of Ghost 3.0, I also made quite a few changes to make the template truly work for me. The changes that I have made from the original template is listed on the README file of Ganymede.

itsmingjie/ganymede
💫 Content-focused, deploy-ready Ghost theme. Contribute to itsmingjie/ganymede development by creating an account on GitHub.

Deploying the Theme: GitHub Actions

Thanks to Ghost's GitHub Integration, I am able to have GitHub handle the building and deployment process of the theme everytime I push to the source. This has saved me hours – I no longer have to manually drag my contructed theme package into my server, since GitHub Actions basically handled it for me.

GitHub Action uploading my theme to my server.

Backing Up: Cron Task + GitHub

Frankly, I'm not very confident in my VPS. Yet I have no choice but to store my production database directly on the VPS to minimize the cost. But creating backups of this blog is simple – all I needed to do is dump the SQL database and make a copy of my static files periodically, and upload them programmatically to a private GitHub repository. In the unfortunate case that this server gets destroyed, I can just spin up a new instance and restore the database.

Link Shortener: Kutt

Interface to create and manage short URLs.

I find it very helpful to have a personal link shortener. A good while ago, I wrote a janky Airtable Based Link Shortener that worked quite well for me, but since I now have complete control of a server right now, I decided to use something that's a little more complicated than my script. The current script behind go.mingjie.info is based on the source code of kutt.it, yet because kutt.it is more commercial than my needs, I rewrote some routing logic so it truly becomes my personal link shortener.

I do want to mention that migrating from Airtable was a breeze.

itsmingjie/kutt
Free Modern URL Shortener. Contribute to itsmingjie/kutt development by creating an account on GitHub.

Email List: listmonk

I'm a huge fan of simplicity, and having to use services like Mailchimp really bothers me (they still haven't fixed their poor text editor after all these years). So instead, I decided to self-host my email list solution with a nice, open-source solution called listmonk. And here's an example of an email campaign sent from listmonk with my own custom template designed to match my blog.

Go subscribe to my infrequent email updates!

Editing an email campaign on listmonk.
Previewing an email campaign.

I no longer have to worry about campaign and list quotas (although the email is still sent through Mailgun, but it offers a generous quota of 20,000 emails per month). Listmonk has almost everything that a heavy email list management suite offers – even mail merging. It's really nice to have control.


This page is being actively maintained, and new content will be added as I have more useless things gets deployed.


Permalink: https://mingjie.dev/project/infrastructure/