---
name: 'Homelab'
description: 'My homelab is where I tinker and learn new technologies.'
tags: ['proxmox', 'networking', 'hardware']
image: '../../../public/static/homelab.webp'
links:
  - label: 'Ansible Configs'
    url: 'https://git.jaroszew.ski/ansible'
order: 1
startDate: '2023-05-15'
---

<div class="flex flex-wrap gap-2 my-0! [&>img]:my-0! [&>img]:mt-2!" >
  <img src="https://img.shields.io/badge/Proxmox-E57000?style=for-the-badge&logo=proxmox&logoColor=white" alt="Proxmox" />
  <img src="https://img.shields.io/badge/LXC-333333?style=for-the-badge&logo=linuxcontainers&logoColor=white" alt="LXC" />
  <img src="https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&logo=docker&logoColor=white" alt="Docker" />
  <img src="https://img.shields.io/badge/Ansible-EE0000?style=for-the-badge&logo=ansible&logoColor=white" alt="Ansible" />
  <img src="https://img.shields.io/badge/Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black" alt="Linux" />
  <img src="https://img.shields.io/badge/Debian-A81D33?style=for-the-badge&logo=debian&logoColor=white" alt="Debian" />
  <img src="https://img.shields.io/badge/Alpine-0D597F?style=for-the-badge&logo=alpinelinux&logoColor=white" alt="Alpine" />
  <img src="https://img.shields.io/badge/Bash-4EAA25?style=for-the-badge&logo=gnubash&logoColor=white" alt="Bash" />
  <img src="https://img.shields.io/badge/NGINX-009639?style=for-the-badge&logo=nginx&logoColor=white" alt="NGINX" />
  <img src="https://img.shields.io/badge/Caddy-1F88C0?style=for-the-badge&logo=caddy&logoColor=white" alt="Caddy" />
  <img src="https://img.shields.io/badge/WireGuard-88171A?style=for-the-badge&logo=wireguard&logoColor=white" alt="WireGuard" />
  <img src="https://img.shields.io/badge/OPNsense-D94F00?style=for-the-badge&logo=opnsense&logoColor=white" alt="OPNsense" />
</div>

My homelab started as an old repurposed desktop and has grown into a proper self-hosted infrastructure stack running on Proxmox, with services organized into LXCs. I even picked up a kitted-out PowerEdge along the way — though given the electricity bill, it mostly sleeps until I need it for backups.

The core of it is built around services I actually rely on day-to-day: Pi-hole for DNS, WireGuard for remote access, Gitea for storing configs and projects, NGINX as a central reverse proxy, and Certbot handling certificate renewal and distribution to the hosts that need them. On top of that sits monitoring with Grafana and Prometheus, Home Assistant for home automation, and a handful of other self-hosted applications.
Networking is handled with OPNsense, with VLANs segmenting IoT and management traffic, and DDNS via ddclient to handle IP rotation.

It's a joint project with my brother, and that's where things got interesting. Early on we were essentially pasting the commands we ran as documentation — it was impossible to keep up to date. As the setup grew more complex, we realized we needed the actual state of the lab to be the source of truth, not a markdown file someone forgot to update. That pushed us toward Ansible, and writing proper IaC forced a level of discipline that made everything more maintainable and reproducible.

Running this long-term has taught me a lot about how production infrastructure actually holds together — designing systems that interoperate reliably, keeping things documented in a way that survives time and a second person, and debugging the inevitable moments when something upstream breaks something downstream.


My ansible roles and collections can be found [here](https://git.jaroszew.ski/ansible).