// Your data. Your services. Your hardware.
THE CLOUD IS JUST SOMEONE ELSE'S COMPUTER.
Every service you use—Google Docs, Dropbox, Netflix, Spotify—is running on someone else's server, managed by someone else's rules, subject to someone else's whims. When they change terms, raise prices, or shut down, you lose everything. Homelab puts you back in control.
LEARN BY DOING.
Homelab is the ultimate learning environment. Want to understand Kubernetes? Run it locally. Want to learn networking? Build your own. Want to secure systems? Break them in your lab first. There's no replacement for hands-on experience.
SELF-HOSTING IS RESISTANCE.
Running your own services means you're not the product. Your photos stay on your NAS. Your notes live on your server. Your media is served by your hardware. You're not dependent on corporate goodwill for your digital life.
12 lessons. Complete homelab control.
What is a homelab? Getting started. Setting goals.
BeginnerChoosing hardware. Budget builds. Enterprise gear.
BeginnerProxmox, ESXi, KVM. Running multiple VMs.
BeginnerDocker basics. Docker Compose. Portainer.
IntermediateVLANs, subnets, DNS. Network design for homelab.
IntermediateNAS, RAID, storage pools. TrueNAS, OpenMediaVault.
IntermediateServices to self-host. Home Assistant, Plex, etc.
IntermediateVPN, reverse proxies, Tailscale. Access from anywhere.
IntermediateGrafana, Prometheus, Uptime Kuma. Know your systems.
AdvancedFirewall, fail2ban, backups. Securing your lab.
AdvancedK3s, microk8s, cluster management. Advanced orchestration.
AdvancedWiki, diagrams, runbooks. Managing complexity.
AdvancedA homelab is a personal computing environment—typically at home—where you run your own services, experiment with technology, and learn new skills. It's somewhere between a hobby and critical infrastructure.
Before buying gear, define what you want:
The homelab standard:
# Install Proxmox: # Download ISO, boot from USB # Follow installer # Access via https://your-ip:8006
# Install Docker curl -fsSL https://get.docker.com | sh # Run a container docker run -d --name nginx -p 80:80 nginx # List containers docker ps # Stop/Start docker stop nginx docker start nginx # View logs docker logs -f nginx
# docker-compose.yml
version: '3'
services:
nginx:
image: nginx
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
restart: unless-stopped
postgres:
image: postgres:15
environment:
POSTGRES_PASSWORD: secret
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
# Run compose docker-compose up -d # View logs docker-compose logs -f # Stop docker-compose down
# Install Portainer
docker run -d -p 9000:9000 \
--name portainer \
--restart=unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
# Pi-hole for local DNS # Services point to container IPs # Create A records in Pi-hole: # homer Assistant -> 10.0.0.10 # plex -> 10.0.0.11 # nginx -> 10.0.0.12
# Nginx Proxy Manager
# docker-compose.yml
version: '3'
services:
nginx:
image: jc21/nginx-proxy-manager
ports:
- "80:80"
- "443:443"
- "81:81"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
restart: unless-stopped
Access via http://your-ip:81, then configure proxy hosts.
# Install Tailscale curl -fsSL https://tailscale.com/install.sh | sh # Start Tailscale tailscale up # Now any device on your Tailscale network can access # services at their 100.x.x.x address
# Docker Compose
version: '3'
services:
uptime-kuma:
image: louislam/uptime-kuma
volumes:
- ./data:/app/data
ports:
- "3001:3001"
restart: unless-stopped
# Add to Prometheus for system metrics docker run -d \ --name node-exporter \ --restart unless-stopped \ -p 9100:9100 \ prom/node-exporter
# UFW basics sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow ssh sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable
# Install sudo apt install fail2ban # Enable for SSH # Edit /etc/fail2ban/jail.local [sshd] enabled = true port = ssh logpath = /var/log/auth.log maxretry = 3
# Install K3s curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable=traefik" sh - # Check status kubectl get nodes kubectl get pods -A
# Install sudo snap install microk8s --classic # Enable addons microk8s enable dns dashboard storage # Use kubectl microk8s kubectl get nodes
You've completed the Homelab Mastery guide. You now know:
Start small, iterate, and enjoy the journey!