lavandeira.net (2025 version)

Project sheet


Years

2025 ~

Status

PRODUCTION

Type

Web application

Technologies and tools used

  • Bootstrap (CSS framework)
  • Flask (web application framework)
  • Python (programming language)
  • MongoDB (database)
  • NGINX (web server)
  • NGINX Unit (web application server)
  • Bootstrap Studio (design tool)
  • Pixelmator Pro (image editor)
  • Editor.js (content editor in backend)
  • AWS Route 53 (domain registration and DNS)
  • Docker (swarm services, secrets, load balancing, deployments)
  • GitHub (code repositories)
  • GitHub Actions (automated deployments)
  • Redis (session storage

Platform

Custom-built hosting platform in my home lab

Summary

This is my personal website. I've had several versions running for the last 20 years, and this is the latest incarnation. I wanted something built by myself, where I can implement the functionality I wanted, without having to adapt to whatever plugins are available in other third-party solutions.

Description

For many years by personal website was a Wordpress deployment, but I never really liked it. I stopped updating it around 2017.

In early 2025 (February, if I remember correctly) I started working on a new version, and it's now ready in early August 2025.

Instead of using another Wordpress or some other content management system, I built everything from scratch. Sure, it took much longer, and the result isn't as polished as if I used some well-known software, but I feel happier when I build my own stuff, just like people who love cars enjoy building their own machine even when it takes them years and ends up costing more than what they would have paid for an off-the-shelf model.

Part of the reason why I wanted to build it from zero was to catch up with the current status of HTML, CSS and JavaScript, because these technologies have been evolving a lot since I initially learnt them many, many years ago. I also got a good refresher on Python, especially dataclasses, and also responsive design, because I wanted the site's design to adapt to small screens such as the ones in cell phones.

At the moment of this writing (August 7th, 2025) I'm still polishing little issues with the HTML/CSS layout and fixing bugs, and little by little importing content from my old sites into this one.

Architecture

The application is built around stateless Docker containers running as a replicated Docker Swarm service. These containers are rebuilt and redeployed automatically using a CI/CD workflow in GitHub Actions.

All the data is stored in a MongoDB database, also running on the Docker swarm. HTTP session storage is handled by Redis.

In order to increase performance and minimize calls to the database, the stateless containers have a local filesystem cache where they save static content such as images and file downloads. Only the first request goes to the database, and every request for the same image or file after that is served from the cache.

Since it's hosted in my private network at home, there's also reverse proxy (running as a Swarm service too), that forwards traffic from the Internet to the appropriate service. This server also does some aggressive caching of static content, such as CSS, JavaScript, and images.

Web backend

There's a very simple, but functional, web administration backend for me to add and manage content, such as articles, blog posts, projects or photo galleries.