My homelab has grown a lot over the years. I started with just a simple Docker instance, using Nginx Proxy Manager with a DuckDNS subdomain for internal domains. Then, I switched to a Docker Swarm cluster using two Raspberry Pis. After sleepless nights and a lot of hard work, my lab has evolved into what it is now. In this article, I’ll walk you through the main components of my homelab. Let’s get started!
Networking:
Networking is crucial in my homelab, ensuring smooth communication between services, secure access, and efficient traffic routing. Here’s how my networking setup works:
- Fritzbox: Handles DHCP and internet access for all devices in my homelab.
- Cloudflare Tunnel: Provides secure external access to my public-facing services.
- Twingate: Facilitates secure private access for internal services.
- PiHole: Network-wide ad-blocking and local DNS management.
- Traefik: Acts as a reverse proxy to route traffic to the appropriate services.
- Cert-Manager with Traefik: Manages internal domain names and SSL certificates for my services (*.home.m23homelab.org).
Clusters & Hosting:
I run multiple clusters and servers to ensure high availability and distribute workloads efficiently.
Proxmox Cluster:
- 2 Nodes and 1 Qdevice: Ensures quorum and high availability for my cluster.
- Hosting K3s Master and Worker Nodes: Two of my K3s master nodes and two worker nodes run on Proxmox.
- Database Hosting: Hosts databases critical to my homelab’s services.
- Docker LXC Containers: Provides isolation for various applications and testing environments.
K3s Cluster:
- Service Hosting: Runs the majority of my services, both internal and external.
- 2 Masters and 2 Workers: These run on Proxmox, providing a robust and scalable K3s environment.
- Raspberry Pi Node: Acts as both a master and worker node in the K3s cluster, providing redundancy and backup capabilities.
Docker:
- Testing Environment: Primarily used to test containers before deployment to my K3s cluster.
An 2nd Raspberry Pi:
- Twingate Backup Connector: Serves as a backup connector for Twingate, ensuring secure access to my private network.
- Proxmox QDevice: Used as part of my Proxmox setup to maintain quorum and high availability.
Monitoring:
Monitoring is crucial to ensure everything is running smoothly and to provide visibility into my infrastructure’s health.
- Grafana & Prometheus/InfluxDB: Used for collecting metrics, monitoring, and alerting on system health.
- Uptime Kuma: Provides status updates and status pages for all services running in my homelab.
- KubeEye API: A custom-built API that integrates with Uptime Kuma to monitor the health of my K3s cluster.
Storage:
My storage solution is designed for redundancy, scalability, and ease of management.
- TrueNAS Scale:
- SMB Storage: Used for general data storage across my homelab.
- NFS for Proxmox Backups/ISOs: Provides centralized storage for backups and ISOs.
- NFS for K3s App/Pod Storage: Supports persistent storage for K3s applications and pods.
Some Services I Host:
I run several self-hosted services to make my homelab more efficient and enjoyable.
- Homepage: A central location for all links and quick stats related to my homelab.
- Vaultwarden (Bitwarden Fork): Self-hosted password manager for secure password storage.
- 3 Discord Bots: Custom bots used for automation and notifications.
- Discord Webhook Proxy: A proxy service for managing and routing Discord webhooks.
- Your-Spotify: Provides Spotify stats and information.
- Pterodactyl Panel: Manages game server hosting for Pterodactyl. The panel is hosted on Proxmox, while the game servers run on a separate machine dedicated solely to that purpose.
Infrastructure as code:
Infrastructure as code is the process of managing and provisioning computer data center resources through machine-readable definition files. I use this principle for my K3s Cluster. For this, I have a Github Repository, which contains all my yaml files defining my Infrastructure. If I commit a change to this, an application called Flux CD takes over and applies the changes to my cluster. Integrated into this workflow is Mend Renovate, which will scan the yaml files inside my repo for outdated version tags and will make a pull request for an update, which I can then approve. the Version tag update gets pushed to my cluster via Flux!
Conclusion:
My homelab setup is a constantly evolving project that balances cutting-edge technologies with practical, real-world applications. With a solid foundation built on networking, monitoring, storage, and automated services, my infrastructure is designed to be highly available, secure, and flexible. Whether I’m hosting services, managing clusters, or testing new ideas, my homelab continues to serve as both a learning tool and a personal infrastructure powerhouse.