π A comprehensive Kubernetes home lab running self-hosted applications including identity management, automation, and personal projects. Built with GitOps principles using Kustomize for Infrastructure as Code (IaC).
This setup provides a complete home lab environment with:
- Identity & Access Management: Keycloak for SSO and user management
- Workflow Automation: n8n for business process automation
- Personal Projects: Resume website and tunnel application
- Infrastructure Services: SSL/TLS management, ingress, storage, and monitoring
βββ infrastructure/ # Core cluster infrastructure
β βββ ssl/ # Certificate management (cert-manager, Let's Encrypt)
β βββ ingress-nginx/ # Ingress controller configuration
β βββ storage/ # Persistent storage (local-path-provisioner)
β βββ portainer/ # Container management UI
β βββ github-actions/ # CI/CD service accounts and RBAC
β βββ jobs/ # Maintenance jobs (image cleanup)
βββ apps/ # Application deployments
βββ keycloak/ # Identity and access management
βββ n8n/ # Workflow automation platform
βββ resume/ # Personal resume website
βββ tunnel/ # Custom tunnel application
| Service | URL | Description |
|---|---|---|
| Keycloak | https://keycloak.kalkutin.dev |
Identity and Access Management |
| n8n | https://n8n.kalkutin.dev |
Workflow Automation Platform |
| Portainer | https://portainer.kalkutin.dev |
Container Management UI |
| Service | URL | Description |
|---|---|---|
| Resume | https://kalkutin.dev |
Personal portfolio and resume |
| Tunnel | https://tunnel.kalkutin.dev |
Amnezia based VPN solution |
- cert-manager: Automated certificate management
- Let's Encrypt: Production SSL certificates
- Self-signed CA: Development certificates
- local-path-provisioner: Dynamic local storage provisioning
- NGINX Ingress: HTTP/HTTPS traffic routing
- NodePort: Direct service access for specific services
- GitHub Actions RBAC: Automated deployment permissions
- Namespace isolation: Separate dev/prod environments
infrastructure: Core cluster servicesapps-dev: Development applicationsapps-prod: Production applications
- Load Balancer Node:
node-role.kubernetes.io/load-balancer - Worker Nodes:
ru-worker-0.kalkutin.dev(Russia region)md-worker-0.kalkutin.dev(Moldova region)
- Kubernetes cluster (1.33+)
- kubectl configured
- Kustomize (built into kubectl)
-
Deploy Infrastructure
kubectl apply -k infrastructure/
-
Deploy Applications
kubectl apply -k apps/
-
Verify Deployment
kubectl get pods -A kubectl get ingress -A
# Deploy specific application
kubectl apply -k apps/keycloak/
kubectl apply -k apps/n8n/
kubectl apply -k apps/resume/
# Deploy infrastructure components
kubectl apply -k infrastructure/ssl/
kubectl apply -k infrastructure/portainer/The setup uses Kustomize overlays for environment management:
# Production deployments
kubectl apply -k apps/keycloak/overlays/prod/
kubectl apply -k apps/n8n/overlays/prod/
# Development deployments
kubectl apply -k apps/tunnel/overlays/dev/Certificates are automatically managed via cert-manager with Let's Encrypt:
- Production:
letsencrypt-prodClusterIssuer - Staging:
letsencrypt-stagingClusterIssuer - Development:
selfsigned-ca-issuerClusterIssuer
All persistent data uses the local-path storage class:
storageClassName: local-pathInstall metrics server for resource monitoring:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yamlFor home lab setups, disable TLS verification:
args:
- --kubelet-insecure-tlsAutomated image cleanup runs via DaemonSet:
- Removes unused CRI-O images
- Runs on all nodes with appropriate tolerations
Access container management via Portainer UI with cluster-wide permissions.
- GitHub Actions service account with deployment permissions
- Namespace-specific role bindings for apps-dev and apps-prod
- Cluster-wide access for infrastructure components
- TLS certificates stored as Kubernetes secrets
- Application secrets (database credentials, API keys) managed per environment
- Separate secret management for dev/prod environments
All services use the kalkutin.dev domain with appropriate subdomains:
- Main site:
kalkutin.dev - Services:
{service}.kalkutin.dev
- SSL termination at ingress level
- HTTP to HTTPS redirects
- Custom caching headers for static content
- Kubernetes: Container orchestration
- Kustomize: Configuration management
- cert-manager: Certificate lifecycle management
- NGINX Ingress: HTTP/HTTPS routing
- Keycloak: Identity and access management
- n8n: Workflow automation
- PostgreSQL: Database for Keycloak
- Docker: Container runtime (CRI-O)
This is a personal home lab setup, but feel free to:
- Open issues for questions or suggestions
- Submit PRs for improvements
- Use as reference for your own home lab
This project is for educational and personal use. Individual components maintain their respective licenses.
Author: Evgenii Kalkutin
Website: kalkutin.dev
Environment: Home Kubernetes Lab