My servers mostly run inside Proxmox with Debian as the OS. You can check my ansible code to see how I deploy the VMs.
All my services are containerized, using Docker Compose or orchestrated with Kubernetes.
Some highlighted components of the stack:
- K3s as the K8s distribution I use
- Flux as my GitOps solution for Kubernetes
- Bitwarden Secrets Manager for storing my secrets and consuming them programmatically
- Ansible to deploy new VMs inside Proxmox
- Renovate to keep my services always up to date
I decided not to self-host all my infra because some of the services need near-perfect reliability.
| Service | Purpose | Why |
|---|---|---|
| Bitwarden Secrets | Storing Secrets | Self-hosting this creates a chicken-and-egg problem during recovery |
| OneDrive | Storing backups | They offer a good price compared to other solutions |
| GitHub | Hosting code | The most popular hosted Git service with many free benefits |
| Grafana | Storing logs and metrics | They offer enough features for me |
| Biznet Gio | Routing Public Traffic | One of the most affordable providers with good service in my country |
| Tech Stack | Wrap |
|---|---|
|
2025-homelab.hilmo.dev
|
Linkedin
|
| Device | CPU | RAM |
Storage |
Purpose |
|---|---|---|---|---|
| Lenovo ThinkCentre M720Q | Intel i5 8600T | 2x16GB DDR4 SODIMM | 1x250GB SATA SSD, 1x240GB NVMe | Main Server |
| Lenovo ThinkCentre M710Q | Intel i5 7500T | 1x8GB DDR4 SODIMM | 1x128GB SATA SSD | Home Assistant Server |
To build a similar homelab, I highly recommend starting with the official documentation for each component in the stack. Use my infra as reference only.
The infrastructure I used, especially the configuration inside the kubernetes folder, is highly tuned for my low-resource environment. My Kubernetes cluster is also not HA (High Availability), it contains only a single Control Plane and two Agents.
- Disabled Services: I disable several embedded K3s services to save resources. Check the list here.
- Custom DNS: I use a custom DNS configuration to ensure resolution availability even if half of my nodes die. Check the manifest here.
- Storage: I primarily use
hostPathvolumes to avoid the overhead of distributed storage solutions. - Scheduling: I extensively use
nodeSelectorin manifests to manually control which nodes handle high-resource workloads.