Creating a Blog in 2025

During my work as a Platform and MLOps Engineer, I have run many times into the situation where I could not find any information about how to solve a particular technical problem online. Hence, the idea for this blog was born. It is a place for me to share information about the world of ML Operations and Python platform engineering.

Published on
Last edited on

Finding the Right Architecture

Work on this blog started out as a simple React application. I had gained some experience with it in previous jobs, so it seemed like the perfect tool for my personal blog. However, I soon noticed that my work in the frontend with React Router mirrored what I envisioned for the backend of my blog. Added to that came concerns about Search Engine Optimization (SEO) for React apps. Remedies to this concern, like Server Side Rendering (SSR) did not appeal to me as they would add significant complexity to my undertaking of creating a simple and easily maintainable blog.

Hence, I rethought my architecture and decided to forgo a dedicated frontend and do everything in the Backend with Go HTML templates. With this new approach, I only needed to implement the routing once in Echo, my Go web framework of choice, and can use it to deliver static web pages that are already optimized to be read by web crawlers.

I chose to use Go and Echo over other considered solutions because they allow me to build a lightweight and efficient application to serve my articles, which allows me to host the site with fewer resources. Other solutions, like serving a completely static website, were considered but would not allow me to dynamically update documentation for my open source projects. Another consideration in choosing Go was that it gave me the opportunity to gain and maintain experience in another language than Python.

The Search for the Right Hosting Solution

My search for a hosting solution was guided by two main considerations: Cost and ease of use. For the former, I had not only to consider the sticker price of the hosting solution, but also the cost that could occur if a bandwidth or request allowances are exceeded. One worry in this regard are DDoS attacks, which have the potential to use up a lot of bandwidth. Ideally, I would like to be able to set a budget and have my application undeployed if it is reached. However, none of the hyperscalers support such a feature. Hence, the only options to avoid the expensive bandwidth overtures of the hyperscalers were to either buy expensive DDoS protection or create a custom destroy script triggered by a cost alert. Therefore, I searched for alternatives and found a Swiss VPS provider, Infomaniak, that provides unlimited bandwidth, which alleviates my fears of uncontrolled cost growth. However, it means making a bigger trade-off in terms of ease of use, as I have to now maintain a server.

Fortunately, I have experience in maintaining Linux servers from my previous position as a DevOps Engineer. Although, I plan on maintaining a single server, I have nonetheless decided to create a collection of Ansible Playbooks for setting up the system, installing Docker, and hardening the virtual server.

Serving the Site

For serving the site, I have decided to start out with Docker Compose since I am already familiar with it, and other similar solutions like Podman Compose did not work out on my setup. Currently, more complex solutions like Docker Swarm or lightweight Kubernetes with K3s are not in question as they come with additional maintenance overhead. However, they may get reconsidered if my setup ever grows beyond a simple reverse proxy and my go backend, or if I ever have the need for zero downtime deployments.