← Back to blog

From an old laptop to Kubernetes : my self-hosting journey

self-hostingkubernetesdevopsinfrastructure

Why did I start to do self hosting ?

I started to have the idea during my second year of engineering school. I like understanding how it works, and I asked myself how it works until the end. I wanted to really understand the whole stack from the kernel until the production.

I had a lot of fun doing all of that and I make a post to retrace everything I did. From an old laptop at home to a multi-node Kubernetes cluster in GitOps in the cloud.

The laptop on the table in the living room

My first “server”, it was an old laptop that I had when I was in middle school and that we kept at my parents. I wanted to understand how to install a web server from A to Z. It’s nice to code a website but I told myself it’s even better if it really works.

At that moment I didn’t know much yet, I had installed the code directly on the machine. It’s a Flask website and the only thing I paid attention to was to run the website with gunicorn because of the Flask warnings. No containers, no reverse proxy, I didn’t even know that it existed at that moment. The service was running directly on port 80 as root obviously. I had opened the ports on the livebox and done port forwarding, found a free DNS. And there, miracle, it really works. It was crude but it was working and especially it was my first time that I succeeded in making something that was really working.

Discovery of reverse proxies

Not long after, I asked myself the question : I have a web server on my machine but I can’t have a second one. It’s one web server per IPv4, no surprise that we miss some. One Google search later, I discovered Nginx. If you already configured Nginx by hand you know the pain, especially at the beginning when you know nothing and you go a bit randomly. At that time without AI it’s not simple and there was a lot of knowledge to assimilate.

Anyway, it was incredible, I could run as many websites as I wanted by doing either multiple DNS or even better with subdomains.

The departure to Canada and the Contabo VPS

Arrives the moment where I have to leave to Canada for my dual degree. No question to leave a laptop running at my parents remotely, and even less to bring it in my suitcase. For dev and small services, a VPS was largely enough.

I took a Contabo VPS at 5€/month. Between time I had progressed a lot thanks to the association of my school. They had a Traefik + Docker Compose setup that had really impressed me. A docker-compose.yml, labels on the containers, and Traefik that manages the routing and the TLS certificates alone. No need anymore to fight with Nginx and Certbot by hand.

I reproduced that on my VPS. Honestly it’s probably the best setup to start in self hosting : Traefik as reverse proxy, Docker Compose to orchestrate, and it works.

On this VPS I had :

  • Vaultwarden : for my passwords
  • CouchDB : for Obsidian LiveSync, synchronize my Obsidian notes between my devices
  • A few small websites that I had made including one for my girlfriend

The DNS anecdote

In parallel I had bought my domain name on Cloudflare and migrated everything on it. Except when I arrived in internship in a company, I discovered that DNS security doesn’t joke : by default a domain of less than 6 months is blocked by company proxies. Result, impossible to access my Vaultwarden at the office. I had to switch on Bitwarden while waiting that my domain gains in seniority. Lesson learned, the setup of a domain name is really important.

The homemade CI/CD

To deploy my personal projects I had cobbled a homemade CI/CD thing. A GitHub Actions that builds the Docker image, pushes it on the GitHub registry, then triggers a custom webhook hosted on the VPS. This webhook did a docker compose pull && docker compose restart. It was clearly DIY, but it was working and it had taught me well how the pieces worked together.

Tailscale : the revelation

It’s also at this moment that I discovered Tailscale. A mesh VPN based on WireGuard, zero configuration, that connects all your devices between them. No need anymore to expose admin ports on internet, no more SSH on public IP, everything goes in the tunnel. In terms of simplicity and of security it so great. Once I tested, I could not go back.

The click : OpenClaw and the limits of Docker Compose

The real tipping point is when I wanted to host OpenClaw for my dad. Suddenly the needs were changing : more interconnected services, frequent updates to manage properly, a config that was starting to become chaotic.

With Docker Compose everything was becoming painful. The volume mounts, the management of updates (no easy auto update), the config scattered between multiple files, no real rollback. My webhook CI/CD was clearly starting to show its limits.

In parallel the association of my school had moved on K3S, and I told myself that it was the occasion to learn. I had hesitated with Docker Swarm, but seeing that it was less and less maintained and the problems that the community was reporting, I told myself : if I migrate toward something more complicated, as well that it is K3S.

Migration to K3S

All the AIs advise you against going on Kubernetes with 8 GB of RAM. And honestly they are not wrong. It took me two good weeks to migrate everything. Understand the concepts (Pods, Services, Ingress, PVC…), configure ArgoCD, migrate the data, debug the network problems and especially do the initial setup and the choice of the initial setup. I had spent the whole first week testing everything on a VM, I didn’t want to break everything or even worse lock myself out of my VPS.

But once in place it’s another world :

  • Everything is in configuration : no need anymore to SSH on the machine to deploy
  • GitOps : a push on main = a deployment
  • Automatic updates : Renovate for the charts, Image Updater for the images
  • Native rollback : ArgoCD manages the rollbacks
  • Auto-heal : if a pod crashes, it restarts alone

Where I am today

Today I have a K3S cluster of 2 nodes : one on Contabo and one on Hetzner. Hetzner is a lot more performant, I could make a full article on the choice of the second VPS but globally thanks r/VPS on Reddit. Everything is managed in GitOps with ArgoCD. I host around fifteen services : Immich (my Google Photos), Vaultwarden, AI agents (Openclaw, Hermes-Agent, Nullclaw), a LLM gateway (Bifrost), my personal website, and plenty of others.

All the technical detail is in the article dedicated to my infrastructure : network architecture, secret management, backup, technical choices, etc.

GitHub repo : github.com/BaptTF/vps-infra

What I learned

Self hosting for me is above all a pretext to learn. Each service that you deploy brings you to understand a new concept : TLS certificates, DNS, databases, storage, auth, CI/CD…

A few tips if you want to start :

  1. Start small : a VPS at 5€ and a Docker Compose, it’s largely enough to learn a lot
  2. Tailscale from the start : it secures everything and it really simplifies the life
  3. Traefik + Docker Compose : the best simplicity/power ratio to begin
  4. Don’t go on Kubernetes only if you really want to : it’s overkill for 90% of the usages, but it’s an insane learning
  5. The most important : try, fail, restart. It’s super fun and in addition we learn.

© 2026 Baptiste