- Why Build a Home Lab?
- Hardware: What You Actually Need
- Step 1: Install Proxmox VE
- Step 2: Create Your First VMs
- Step 3: Install Docker and Docker Compose
- Step 4: Deploy Kubernetes with k3s
- Step 5: Set Up CI/CD (Gitea + Woodpecker)
- Step 6: Monitoring with Prometheus + Grafana
- Step 7: Add a Reverse Proxy (Traefik)
- Essential Projects to Build
- FAQ
Why Build a Home Lab?
In 2026, DevOps is one of the highest-paying roles in tech โ median salary $140,000โ$180,000 in the US. But breaking in requires hands-on experience with Kubernetes, CI/CD, infrastructure-as-code, and monitoring. Cloud free tiers are capped. Tutorials evaporate when you hit billing limits.
๐ Table of Contents
- Why Build a Home Lab?
- Hardware: What You Actually Need
- Step 1: Install Proxmox VE
- Step 2: Create Your First VMs
- Step 3: Install Docker and Docker Compose
- Step 4: Deploy Kubernetes with k3s
- Step 5: Set Up CI/CD (Gitea + Woodpecker)
- Step 6: Monitoring with Prometheus + Grafana
- Step 7: Add a Reverse Proxy (Traefik)
- Essential Projects to Build
- Frequently Asked Questions
A home lab solves this: an always-on, cost-capped environment where you break things freely and learn faster than any course.
Hardware: What You Actually Need
You don’t need expensive server hardware. Here are three budget tiers:
| Tier | Hardware | Cost | Best For |
|---|---|---|---|
| Starter | Your existing PC/laptop (dual boot or VM) | $0 | Learning Docker basics |
| Mid | Beelink SER5 (Ryzen 5 5560U, 32GB RAM, 500GB SSD) | ~$250โ300 | Full k3s cluster + CI/CD |
| Advanced | Used Dell PowerEdge R720 or HP DL380 (128GB RAM, multiple drives) | $200โ500 | Multi-node k8s, Ceph storage |
Recommended for most people: A refurbished mini PC with 32GB RAM and a 1TB SSD NVMe. The Beelink SER5 Pro or Intel NUC 12 Pro hit the sweet spot. Add a cheap TP-Link TL-SG108 switch ($20) if you want multi-node networking later.
Step 1: Install Proxmox VE
Proxmox VE (Virtual Environment) is a free, open-source hypervisor that lets you run multiple VMs and LXC containers on one machine. Think of it as your personal VMware โ but free and Linux-based.
- Download the Proxmox ISO from proxmox.com/downloads
- Flash to a USB drive:
dd if=proxmox-ve_*.iso of=/dev/sdX bs=1M status=progress - Boot from USB, install to your NVMe SSD
- Access the web UI at
https://YOUR_IP:8006
# After install โ disable subscription nag (optional)
sed -i.bak "s/NotFound/Active/" /etc/apt/sources.list.d/pve-enterprise.list || true
echo "deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription" >> /etc/apt/sources.list.d/pve-no-subscription.list
apt-get update && apt-get dist-upgrade -y
Step 2: Create Your First VMs
Plan your VM layout before creating them. Here’s a solid starting architecture:
| VM Name | OS | RAM | Purpose |
|---|---|---|---|
| k3s-master | Ubuntu 24.04 | 4GB | Kubernetes control plane |
| k3s-worker-1 | Ubuntu 24.04 | 4GB | Kubernetes workload node |
| k3s-worker-2 | Ubuntu 24.04 | 4GB | Kubernetes workload node |
| gitea | Ubuntu 24.04 | 2GB | Git server + CI/CD |
| monitoring | Ubuntu 24.04 | 2GB | Prometheus + Grafana |
In Proxmox, create each VM: click Create VM, select your ISO (Ubuntu 24.04), set the resources above, and enable QEMU agent for better management.
Step 3: Install Docker and Docker Compose
On each Ubuntu VM you want to run containers:
# Install Docker Engine (official method)
curl -fsSL https://get.docker.com | sh
# Add your user to docker group (avoid sudo)
usermod -aG docker $USER
newgrp docker
# Install Docker Compose v2 (built-in plugin)
apt-get install -y docker-compose-plugin
# Verify
docker --version # Docker version 27.x
docker compose version # Docker Compose version v2.x
Test with a real workload:
# docker-compose.yml โ Nginx + Portainer (container management UI)
services:
portainer:
image: portainer/portainer-ce:latest
restart: always
ports:
- "9000:9000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
nginx:
image: nginx:alpine
restart: always
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html:ro
volumes:
portainer_data:
docker compose up -d
# Access Portainer at http://YOUR_IP:9000
Step 4: Deploy Kubernetes with k3s
k3s is a certified, lightweight Kubernetes distribution โ all the real Kubernetes APIs in a single 70MB binary. Perfect for home labs.
# On k3s-master VM:
curl -sfL https://get.k3s.io | sh -
# Get the join token for worker nodes
cat /var/lib/rancher/k3s/server/node-token
# On each k3s-worker VM (replace with your master IP and token):
export K3S_MASTER_IP="192.168.1.100"
export K3S_TOKEN="your-token-here"
curl -sfL https://get.k3s.io | K3S_URL="https://${K3S_MASTER_IP}:6443" K3S_TOKEN="${K3S_TOKEN}" sh -
# On master โ verify cluster
kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# k3s-master Ready control-plane,master 1m v1.31.x
# k3s-worker-1 Ready <none> 45s v1.31.x
# k3s-worker-2 Ready <none> 30s v1.31.x
Deploy your first app to Kubernetes:
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- port: 80
targetPort: 80
kubectl apply -f nginx-deployment.yaml
kubectl get pods -o wide # see pods spread across worker nodes
kubectl get svc nginx-service # get the external IP
Step 5: Set Up CI/CD (Gitea + Woodpecker)
Self-host your own GitHub + GitHub Actions equivalent using Gitea (Git server) and Woodpecker CI (pipeline runner).
# docker-compose.yml on the 'gitea' VM
services:
gitea:
image: gitea/gitea:latest
environment:
- USER_UID=1000
- USER_GID=1000
restart: always
ports:
- "3000:3000" # Web UI
- "222:22" # SSH git
volumes:
- gitea_data:/data
woodpecker-server:
image: woodpeckerci/woodpecker-server:latest
restart: always
ports:
- "8080:8000"
environment:
- WOODPECKER_OPEN=true
- WOODPECKER_GITEA=true
- WOODPECKER_GITEA_URL=http://gitea:3000
- WOODPECKER_AGENT_SECRET=supersecret123
depends_on:
- gitea
woodpecker-agent:
image: woodpeckerci/woodpecker-agent:latest
restart: always
environment:
- WOODPECKER_SERVER=woodpecker-server:9000
- WOODPECKER_AGENT_SECRET=supersecret123
- WOODPECKER_BACKEND=docker
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- woodpecker-server
volumes:
gitea_data:
Create a pipeline file in any Gitea repo to trigger automated builds:
# .woodpecker.yml โ in your app repo
steps:
test:
image: python:3.12-slim
commands:
- pip install -r requirements.txt
- python -m pytest tests/ -v
build:
image: docker
commands:
- docker build -t myapp:$CI_COMMIT_SHA .
when:
branch: main
deploy:
image: bitnami/kubectl:latest
commands:
- kubectl set image deployment/myapp myapp=myapp:$CI_COMMIT_SHA
when:
branch: main
Step 6: Monitoring with Prometheus + Grafana
Deploy a production-grade monitoring stack in minutes using the kube-prometheus-stack Helm chart:
# Install Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Add Prometheus community charts
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# Install the full monitoring stack (Prometheus + Grafana + Alertmanager)
helm install monitoring prometheus-community/kube-prometheus-stack --namespace monitoring --create-namespace --set grafana.adminPassword=admin123
# Access Grafana
kubectl port-forward -n monitoring svc/monitoring-grafana 3000:80
# Browse to http://localhost:3000 (admin / admin123)
Grafana comes pre-loaded with dashboards for cluster CPU, memory, pod health, network I/O, and persistent volume usage.
Step 7: Add a Reverse Proxy (Traefik)
Instead of remembering dozens of port numbers, use Traefik to route all services by hostname:
# Install Traefik via Helm
helm repo add traefik https://helm.traefik.io/traefik
helm install traefik traefik/traefik --namespace traefik --create-namespace
# IngressRoute for Gitea (Traefik CRD)
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: gitea
namespace: default
spec:
entryPoints:
- web
routes:
- match: Host(`gitea.lab.local`)
kind: Rule
services:
- name: gitea
port: 3000
Add entries to your router’s hosts file or local DNS (Pi-hole works great) so gitea.lab.local, grafana.lab.local, etc. resolve to your Traefik IP. No more port numbers.
Essential Projects to Build
Now that your lab is running, build these projects to solidify skills employers want:
- Deploy a full-stack app โ Frontend + API + database on k3s with persistent volumes
- Automate backups โ CronJob that backs up databases to a Samba NAS or S3-compatible storage (MinIO)
- Infrastructure as Code โ Recreate your entire lab with Terraform + Ansible from scratch
- GitOps with ArgoCD โ Replace manual kubectl commands; all changes go through Git
- Security hardening โ Add Falco (runtime security), NetworkPolicies, RBAC roles
- Disaster recovery drill โ Delete a node, recover automatically. Test your assumptions.
๐ง Ready to Build Your DevOps Home Lab?
Your home lab is the fastest path to DevOps mastery. Once it’s running, level up your Linux skills with our guide on Linux tutorials, and explore cloud computing guides to understand how production infrastructure scales beyond your home network.
Frequently Asked Questions
What hardware do I need for a DevOps home lab?
Start with any machine with 16GB+ RAM. A refurbished mini PC (Beelink SER5, Intel NUC) with 32GB RAM and 1TB NVMe SSD (~$250โ300) is the sweet spot for running Proxmox + k3s + CI/CD simultaneously.
Should I use Docker or Kubernetes in my home lab?
Both. Start with Docker to learn container basics, then add k3s (lightweight Kubernetes). In 2026, k8s knowledge is required for most DevOps roles โ your home lab k3s experience translates directly.
What is Proxmox and why use it?
Proxmox VE is a free, open-source hypervisor (like VMware). It lets you run multiple VMs on one machine โ perfect for simulating a multi-node infrastructure without buying multiple computers.
How do I practice CI/CD at home?
Install Gitea (self-hosted Git) + Woodpecker CI on a VM. Every git push triggers a pipeline โ build, test, deploy to k3s. This mirrors exactly what real companies do in production.
Is a home lab necessary for DevOps jobs?
Not strictly, but it’s the biggest career accelerator. You get unrestricted access, persistent environments, real networking practice, and a compelling interview story. Most DevOps engineers swear by their home lab as the key to landing senior roles.
๐ You might also like
๐ Share this article




โ๏ธ Leave a Comment