Home Posts Notes Now

What’s in my Homelab - August 2023

2023-08-29

I've enjoyed playing with my homelab for a few months and now it reached a state that I am comfortable sharing. The setup is working well for me, it’s very stable and flexible.

Hardware

I run everything on a Fujitsu Esprimo G5010 mini PC. It’s a couple years old and I bought it used. It follows the TinyMiniMicro trend and I'd definitely recommend it. With an Intel Core i7 10700T and 8GB of RAM it has plenty of resources. Maybe I will add more RAM but that’s not been a limiting factor so far.

That’s an incredible upgrade over the Raspberry Pi Model B I used to run for years and now has been retired until I find any good use for it.

Infrastructure

I run Proxmox VE that hosts two main VMs: one running all the services I use as Docker containers (as a single node Docker Swarm) and another I ssh into to do some development or operational work.

I briefly tried to run K3s, which is nice if one needs the full Kubernetes experience but I decided I wanted something simpler. As a side effect, using Docker Swarm the CPU idle utilisation and the temperature of the machine are considerably lower, which is always nice for a system that runs 24/7.

Everything is accessible from my LAN or via Tailscale. At this time I don’t run any publicly accessible service.

Infrastructure as Code

I try to have as much of my infrastructure defined as code. I haven’t reached 100% coverage yet but I’m not too far away.

My setup consist of three different layers of automation and a bunch of text file explaining what I haven’t automated yet.

Proxmox VE configuration

I use Ansible to apply the minimal tweaks I need to the Proxmox VE configuration. I’d like this step not to exist but I need to apply some configuration changes and prepare everything Terraform needs.

VMs creation

Once the node is ready I run a first Terraform layer to bring up VMs using bpg/proxmox. This step uses cloud-init to fully automate the configuration of the VMs after they’ve been created.

Docker Swarm deployment

The deployment of services in the VMs happens via a second layer of Terraform using kreuzwerker/docker/.

Services

The services I run are broadly split across several different categories:

Let’s have a look at the details of what I run for each category.

Infrastructure

I use Traefik as load balancer and ingress into my Docker Swarm. It also deals with TLS termination including provisioning certificates via Let's Encrypt.

Most of my services are idle most of the time. That's the expected usage patter when there is a single user. To avoid wasting resources I use Sablier to scale to zero services when they're not in use and to start them up again soon as I need them.

Finally, I need to run some periodic tasks (e.g. backups). Docker Swarm doesn't offer the feature l out of the box so I rely on swarm-cronjob to fill that gap.

Data

I run shared instances of Postgres and Redis. Metrics and data from my sensors go to InfluxDB

Observability

I have Grafana dashboards displaying metrics collected from my Proxmox VE host and from Traefik. Logs from Docker services are accessible from a web UI thanks to Dozzle.

User facing services

Finally, I also run some services that do something end users care about. Paperless-ngx stores, organises and indexes documents. SearXNG aggregates search results from many different search engines.

I have a long list of other things to try out. I guess I’ll write about it in my next update.

I hope you enjoyed reading about my setup.

Thanks for reading. Feel free to reach out for any comment or question.