the blog went down... oh no!
If you're my weekly visitor1, you may have noticed the website went down for a few weeks… When hosting a website using DDNS (dynamic DNS) on your home WiFi, your ISP (internet service provider) may not be a huge fan.
an aside on DNS2:
Accessing a website is tantamount to accessing files hosted by or on a computer, often called a server, through the Internet. Your computer, often called the client, can talk to the server is through the use of an IP (Internet Protocol) address, the Internet version of a mailing address. However, it would be a pain if you had to remember every website’s IP address you want to use on a daily basis.
The solution comes in the form of DNS (Domain Name System). DNS allows you to use a human-friendly domain name, or URL, instead of the computer's IP address. DNS servers store DNS records which include the associated IP addresses for domains. DNS records are sets of instructions vital to the success of a DNS lookup. Web browsers communicate with DNS servers, through what is called a DNS lookup, whenever you look up a URL to find the website’s associated IP address.
Previously, when I had my website’s related files on my Raspberry Pi, I used DDNS through the company No-IP. No-IP provides domains, free of charge, and a DDNS application for the website’s server. I configured No-IP’s DDNS application to run every five to ten minutes on the Raspberry Pi to communicate changes in my public IP address to No-IP’s DNS servers. If the IP address changes, No-IP will publish new DNS records providing the new IP address my website should point toward.
an aside on DDNS:
Every computer in a home network talks to the internet using the home router. The home router has an external, or public-facing, IP address used to access the Internet. This IP address can be changed by an ISP without warning. In order to utilize DNS, it’s important to know what your IP address is at all times and rely on the fact that it will not change over time. This is where DDNS comes into play. DDNS allows for a changing public IP address; hence it's name -- dynamic DNS).
I noticed that the WiFi would intermittently go down on a daily basis – of course there couldn’t possibly be a reason for this…
My best conclusion is that my ISP didn't like the fact that I was hosting a website on the network with many visitors (at least one a week). Alternatively, the issue could be with No-IP’s application having periodic traffic to confirm my home router's external IP address. Otherwise, it could have been a malicious actor or a bot was actually scanning my network/ports.
choosing the right tech stack
A tech stack is a list of all the technology services used to run a single application or website.
What I was using before I had to shutdown the website:
- “On-premise” hardware: Raspberry Pi
- Operating System: Raspberry Pi OS, based on Debian (a Linux distribution)
- Web Server: nginx
- Content Type: some good ol’ HTML (Hypertext Markup Language) and CSS (Cascading Style Sheets)3
an aside on web content:
A web server distributes web content requested by a client. Web content can include HTML, CSS, and JavaScript4. HTML is a markup language used to create the basic structure and text for each web page in a website. CSS is a style sheet language used for the styling and making the webpage/website visually appealing. JavaScript is a programming language used for any logic that needs to be handled.
to cloud or to self-host, that is the question
After much deliberation and moral indignation at the choices that led me here, I unwillingly chose to switch to using the cloud5. Instead of being cool and hosting a website on a Raspberry Pi – really cool to me if you were asking – I'm now hosting the website on GCP (Google Cloud Platform). I was really proud of myself for getting hardware I could touch and feel to host a website readily accessible from the Internet. But, in order to prevent the ISP attack messages and WiFi issues, I had no choice but to host the website remotely. It’s not like I have another network laying around so the next best thing is to use the cloud.
Unfortunately, the pricing differences between "on-premise" hosting and cloud hosting is significant. On-premise hosting has a high6 CapEx (capital expense) and cloud hosting has a high OpEx (operating expense).
CapEx is the money spent to buy, maintain, or improve fixed assets -- in my case the Raspberry Pi, it's related hardware components, and my personal laptop. OpEx is the ongoing cost for running a product/business/system -- the energy bill for running my Raspberry Pi.
The Raspberry Pi costed approximately 100 USD (the CapEx) and it's energy cost per month is a few cents (the OpEx).
This means that over one year, the montly cost of self-hosting the website is a little more than 8.33 USD.
I intend to have this website for as long as I can, so clearly the monthly and yearly cost would have been nil.
The cloud infrastructure and VM running all the time costs approximately 60 USD per month 7(the OpEx).
Over one year, running a website will cost around $720 USD (:(
).
Although cloud hosting doesn't incur a CapEx (because there is no capital that I have to own/maintain), the OpEx, the montly fee to run the VM, compensates for the cloud provider's CapEx cost they incurred.
This is a necessary, but temporary, evil for the current moment until I can figure out a better cost-saving solution.
the software’s hardware
I left the hardware set-up details out in my previous blog post out of sheer laziness but, I will do better to elaborate on what my previous and current hardware specs! Setting up the Raspberry Pi, to put it succinctly, involved putting some of the hardware together, downloading the appropriate image, and then hardening the OS, operating system. I must admit, creating VMs, (virtual machines) in the cloud is much easier.
A VM is a software-defined computer existing only in code. Most likely the machine, or computer, that you and I are using everyday is physically, or hardware-, defined. A VM, much like a hardware-defined machine, has a CPU, RAM, storage, and can even connect to the internet.
In the GCP console, I created a project to hold all of my resources related to running this website, attached a billing account (gave my credit card info yippee), specified my hardware/network requirements for the VM, and then created it with a simple tap of a button.
The VM, itself, is an "e2 standard" instance which means it uses Intel Core Broadwell processors. The VM’s hardware specs include two vCPUs ( virtual CPUs), 16 GB of RAM, and 1288 GB of storage.
the OS
The old tech stack used RPO (Raspberry Pi OS). RPO, if you couldn’t tell from the name, was made for the Raspberry Pi because the creaters of the Raspberry Pi needed a suitable OS for a single-board computer. Besides that, I wanted to familiarize myself with a Linux flavor I am unfamiliar with.
On the flip side, working in the cloud gives me flexibility on what OS I can choose to use. I have prior experience with using Ubuntu, a Linux distribution[^so many], from messing around with VMs on my personal machine and class assignments during my undergrad. I wanted to quickly get the website up and running again, so I just went with what I was most familiar with!
the web restaurant
I chose nginx as my web server because it is known to outperform other popular web server implementations in benchmark tests, especially when it comes to serving static content.
Static content (or web pages) is delivered to a web browser exactly as stored. The web browser then converts the content to the web page for you to view. In contrast, dynamic content is generated by a web application which is then processed by the web browser.
nginx is an incredibly useful web srver application that removes the need to create an HTTP (Hypertext Transfer Protocol) web server from scratch9.
HTTP is the protocol, specification/method, by which information is communicated over the World Wide Web.
Thankfully, there was no need to make HTML and CSS files from scratch. I used Pelican, a static site generator, to convert Markdown, essentially plaintext, files to HTML and CSS files.
the arcane magic of DNS, or how did i set up my URL
With my new set-up, I didn’t have to worry about DDNS because there was no Internet traffic going through my home router.
In the GCP console, I configured my external IP address to be static.
Then, I obtained a lease to the domain aadith-thiruvallarai.com
from Squarespace.
You can’t actually own a URL. You can only lease it from companies like GoDaddy and Squarespace who own the lease to a bunch of domains. It costs around 20 USD a year to lease a domain.
Configuring DNS involves creating and publishing what is known as DNS records. DNS records come in many flavors but the only one I had to be concerned with was an A record. An A record points the URL to the website’s server’s IP address.

In Squarespace, I created an A record with the hostname (data field) set as @
, shorthand for the domain aadith-thiruvallarai.com
, pointing to my VM’s public IP address.
the final choices
So, here’s the new and improved stack:
- Cloud Infrastructure: GCP
- Operating System: Ubuntu
- Web Server: nginx
- Content type: some good ol’ HTML/CSS3
updates
April 18th, 2025
- Changed some verbiage for clarity
- Changed horizontally ruled “asides” back into long block quotes w/ some revisions
April 16th, 2025
- Changed some verbiage for clarity
- Made long block quotes into “asides”
April 15th, 2025
- Accidentally published the blog post early because I wanted to test the DNS settings with a new blog post
- Completed the blog post
-
Yeah, I'm proud to admit that I have at least one weekly visitor! On a more serious note, I didn't figure out how to track how many people were visiting the site. My numbers are solely based on the friends I shared the website with... yeah that's right I have one friend, at least! ↩
-
I felt like some of my block quotes were getting too big. I hope you like this style of inserting “asides” when some critical, yet verbose, information needs to be communicated. ↩
-
I’m sorry for not using the new React framework of the day
:(
… I’m not actually sorry:p
. I just wanted to keep it simple, stupid, and short! If you’re reading this a second time… I still stand by what I said:p
↩↩ -
I left out a lot of other files that you should definitely search up for the sake of learning! ↩
-
I’m envisioning the “Old Man Yells at Cloud” meme. ↩
-
... ultimately depends on the scale you're operating at. In my case, I wanted to have a cheap CapEx and OpEx as a one-person operation. ↩
-
... plus some DNS costs I'll get into later. ↩
-
For what I need this VM to do, this amount of storage is definitely overkill. ↩
-
Maybe I should make an HTTP web server in C, C++, or Rust? I don’t know, shoot me an email if you’d like to see me do this and blog about it! ↩