K3s-based homelab cluster with VLAN isolation, GitOps via Argo CD, and fully scripted infrastructure provisioning.
| VLAN | Name | Subnet | Role |
|---|---|---|---|
| 20 | Management | 10.10.20.0/24 |
Admin LXC, Update Server, Load Balancer |
| 24 | DMZ | 10.10.24.0/24 |
Traefik reverse proxy and Gameserver |
| 25 | Cluster | 10.10.25.0/24 |
K3s nodes (no internet access) |
| Host | Type | VLAN | IP |
|---|---|---|---|
| Admin LXC | LXC | 20 – Management | 10.10.20.20 |
| Load Balancer | LXC | 20 – Management | 10.10.20.21 |
| Update Server | LXC | 20 – Management | 10.10.20.100 |
| Registry Server | LXC | 20 – Management | 10.10.20.101 |
| DMZ Reverse Proxy (Traefik) | LXC | 24 – DMZ | 10.10.24.10 |
| Gameserver (Pelican Wing) | VM | 24 – DMZ | 10.10.24.20 |
| K3s Control Plane | VM | 25 – Cluster | 10.10.25.11 |
| K3s Agent | VM | 25 – Cluster | 10.10.25.101 |
All IPs are also defined in
cluster.conf. Update it before running any scripts.
Follow this order — each step depends on the previous ones.
| # | Component | Doc | Script |
|---|---|---|---|
| 1 | Network / VLANs | network-setup | — |
| 2 | Admin LXC | admin-setup | scripts/admin-setup.sh |
| 3 | Update Server | update-server-setup | scripts/update-server-setup.sh |
| 4 | DMZ Reverse Proxy | dmz-reverse-proxy | scripts/dmz-reverse-proxy-setup.sh |
| 5 | Load Balancer | load-balancer-setup | scripts/load-balancer-setup.sh |
| 6 | Container Registry | registry-setup | scripts/registry-setup.sh |
| 7 | K3s Cluster | k3s-setup | scripts/k3s-control-plane-setup.sh, scripts/k3s-agent-setup.sh |
| 8 | GitOps Bootstrap | gitops-setup | — |
| 9 | Gameserver (Wings) | gameserver-setup | scripts/gameserver-setup.sh |
├── ansible/ # Ansible playbooks (WIP)
├── docs/ # Setup guides for each component
├── kubernetes/
│ ├── platform/ # Cluster infrastructure (Longhorn, Argo CD)
│ ├── common/ # Shared resources (namespaces, sealed secrets)
│ └── apps/ # Application manifests
├── scripts/ # Bootstrap scripts for LXCs and VMs
└── cluster.conf # IP addresses and K3s token
All IPs and the K3s token are defined in cluster.conf. Update it before running any scripts.