Home Lab

Home Lab Overview (Illustrative)

Here are the auto-rendered diagrames of the lab setup. I have scripts configured to update this periodicly so it should change over time as I make changes and get this more ‘production’ ready and update the data collection to be more comprehensive.

I’m including networking, hardware, disk layout and cluster diagrams. Some people may think this makes me less secure by sharing this information but the reality is that this is all pretty standard stuff and if someone really wanted to target me they could probably figure it out anyway. Additionally if you’re already someplace where this information is relevant I have other issues to worry about. I think there’s more value in sharing this information for others’ reference than not.

Hardware Topology

flowchart LR %% Host nodes grouped by role classDef controlplane fill:#e3f2fd,stroke:#1565c0,color:#0d47a1; classDef worker fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20; classDef storage fill:#fff3e0,stroke:#ef6c00,color:#7f4f00; classDef network fill:#f3e5f5,stroke:#6a1b9a,color:#4a148c; classDef tooling fill:#ede7f6,stroke:#4527a0,color:#311b92; subgraph Control Plane direction LR lead["lead
4 vCPU
6 GB
AMD64"] class lead controlplane; nickel["nickel
4 vCPU
4 GB
AMD64"] class nickel controlplane; tin["tin
4 vCPU
4 GB
AMD64"] class tin controlplane; lead["lead
4 vCPU
6 GB
AMD64"] class lead controlplane; nickel["nickel
4 vCPU
4 GB
AMD64"] class nickel controlplane; tin["tin
4 vCPU
4 GB
AMD64"] class tin controlplane; end subgraph Workers direction LR subgraph "Raspberry Pi Cluster" direction TB %% 3x2 grid, only horizontal edges within each row, no vertical/crossing/loop apple["apple
4 vCPU
8 GB
ARM64"] class apple worker; blueberry["blueberry
4 vCPU
8 GB
ARM64"] class blueberry worker; cherry["cherry
4 vCPU
8 GB
ARM64"] class cherry worker; lemon["lemon
4 vCPU
8 GB
ARM64"] class lemon worker; pecan["pecan
4 vCPU
8 GB
ARM64"] class pecan worker; rubharb["rubharb
4 vCPU
8 GB
ARM64"] class rubharb worker; %% Row 1 horizontal edges (0,1,2) %% Row 2 horizontal edges (3,4,5) %% Invisible vertical links to force 3x2 grid apple -.-> lemon %% linkStyle 0 stroke:transparent,stroke-width:0.1,opacity:0 blueberry -.-> pecan %% linkStyle 1 stroke:transparent,stroke-width:0.1,opacity:0 cherry -.-> rubharb %% linkStyle 2 stroke:transparent,stroke-width:0.1,opacity:0 %% Now output the linkStyle directives after all links linkStyle 0 stroke:transparent,stroke-width:0.1,opacity:0 linkStyle 1 stroke:transparent,stroke-width:0.1,opacity:0 linkStyle 2 stroke:transparent,stroke-width:0.1,opacity:0 end barrel["barrel
4 vCPU
8 GB
AMD64"] class barrel worker; end subgraph Storage direction LR end subgraph Network direction LR end subgraph Tooling direction LR end

Disk Layout

flowchart TB %% Disks per host subgraph host_apple ["apple"] direction TB node_apple["apple
4 vCPU / 8 GB
ARM64"] node_apple_nvme0n1(["nvme0n1
unknown nvme-ssd
os+containerd"]) node_apple --> node_apple_nvme0n1 end subgraph host_barrel ["barrel"] direction TB node_barrel["barrel
4 vCPU / 8 GB
AMD64"] node_barrel_nvme0n1(["nvme0n1
unknown nvme-ssd
os+containerd"]) node_barrel --> node_barrel_nvme0n1 end subgraph host_blueberry ["blueberry"] direction TB node_blueberry["blueberry
4 vCPU / 8 GB
ARM64"] node_blueberry_nvme0n1(["nvme0n1
unknown nvme-ssd
os+containerd"]) node_blueberry --> node_blueberry_nvme0n1 end subgraph host_cherry ["cherry"] direction TB node_cherry["cherry
4 vCPU / 8 GB
ARM64"] node_cherry_nvme0n1(["nvme0n1
unknown nvme-ssd
os+containerd"]) node_cherry --> node_cherry_nvme0n1 end subgraph host_lead ["lead"] direction TB node_lead["lead
4 vCPU / 6 GB
AMD64"] node_lead_nvme0n1(["nvme0n1
unknown nvme-ssd
os+etcd"]) node_lead --> node_lead_nvme0n1 end subgraph host_lemon ["lemon"] direction TB node_lemon["lemon
4 vCPU / 8 GB
ARM64"] node_lemon_nvme0n1(["nvme0n1
unknown nvme-ssd
os+containerd"]) node_lemon --> node_lemon_nvme0n1 end subgraph host_nickel ["nickel"] direction TB node_nickel["nickel
4 vCPU / 4 GB
AMD64"] node_nickel_nvme0n1(["nvme0n1
unknown nvme-ssd
os+etcd"]) node_nickel --> node_nickel_nvme0n1 end subgraph host_pecan ["pecan"] direction TB node_pecan["pecan
4 vCPU / 8 GB
ARM64"] node_pecan_nvme0n1(["nvme0n1
unknown nvme-ssd
os+containerd"]) node_pecan --> node_pecan_nvme0n1 end subgraph host_rubharb ["rubharb"] direction TB node_rubharb["rubharb
4 vCPU / 8 GB
ARM64"] node_rubharb_nvme0n1(["nvme0n1
unknown nvme-ssd
os+containerd"]) node_rubharb --> node_rubharb_nvme0n1 end subgraph host_tin ["tin"] direction TB node_tin["tin
4 vCPU / 4 GB
AMD64"] node_tin_nvme0n1(["nvme0n1
unknown nvme-ssd
os+etcd"]) node_tin --> node_tin_nvme0n1 end

Network Topology

flowchart LR %% Networks net_lan(["LAN
VLAN 1
192.168.1.0/24"]) %% Hosts to networks via NICs apple["apple"] apple -- "eth0 1G" --> net_lan barrel["barrel"] barrel -- "eth0 1G" --> net_lan blueberry["blueberry"] blueberry -- "eth0 1G" --> net_lan cherry["cherry"] cherry -- "eth0 1G" --> net_lan lead["lead"] lead -- "eth0 1G" --> net_lan lemon["lemon"] lemon -- "eth0 1G" --> net_lan nickel["nickel"] nickel -- "eth0 1G" --> net_lan pecan["pecan"] pecan -- "eth0 1G" --> net_lan rubharb["rubharb"] rubharb -- "eth0 1G" --> net_lan tin["tin"] tin -- "eth0 1G" --> net_lan classDef net fill:#e0f7fa,stroke:#006064,color:#004d40; class net_lan net;

Cluster (Talos + Cilium)

flowchart LR %% Talos cluster nodes (Cilium CNI) classDef controlplane fill:#e3f2fd,stroke:#1565c0,color:#0d47a1; classDef worker fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20; subgraph "Talos Cluster (Cilium)" direction LR podpool["Pod IP Pool
10.244.0.0/16"] svcpool["Service IP Pool
10.96.0.0/12"] subgraph "Control Plane" direction LR node_lead["lead
192.168.1.25
CP
AMD64
6GB"] class node_lead controlplane; node_nickel["nickel
192.168.1.23
CP
AMD64
4GB"] class node_nickel controlplane; node_tin["tin
192.168.1.21
CP
AMD64
4GB"] class node_tin controlplane; end subgraph "Workers" direction LR node_apple["apple
192.168.1.40
Worker
ARM64
8GB"] class node_apple worker; node_barrel["barrel
192.168.1.47
Worker
AMD64
8GB"] class node_barrel worker; node_blueberry["blueberry
192.168.1.44
Worker
ARM64
8GB"] class node_blueberry worker; node_cherry["cherry
192.168.1.41
Worker
ARM64
8GB"] class node_cherry worker; node_lemon["lemon
192.168.1.43
Worker
ARM64
8GB"] class node_lemon worker; node_pecan["pecan
192.168.1.42
Worker
ARM64
8GB"] class node_pecan worker; node_rubharb["rubharb
192.168.1.46
Worker
ARM64
8GB"] class node_rubharb worker; end %% Connect pools to cluster (to first controlplane node) podpool --- node_lead svcpool --- node_lead end

BGP Peering (Cilium / FRR)

flowchart TB %% BGP overview asn["ASN 64513
Router pfSense
ID 192.168.1.99"] classDef peer fill:#e8f5e9,stroke:#1b5e20,color:#2e7d32; classDef as fill:#e3f2fd,stroke:#0d47a1,color:#1565c0; class asn as; peer_1["192.168.1.40
peer 192.168.1.99
AS 65001
ipv4/unicast"] asn --- peer_1 class peer_1 peer; peer_2["192.168.1.47
peer 192.168.1.99
AS 65001
ipv4/unicast"] asn --- peer_2 class peer_2 peer; peer_3["192.168.1.44
peer 192.168.1.99
AS 65001
ipv4/unicast"] asn --- peer_3 class peer_3 peer; peer_4["192.168.1.41
peer 192.168.1.99
AS 65001
ipv4/unicast"] asn --- peer_4 class peer_4 peer; peer_5["192.168.1.43
peer 192.168.1.99
AS 65001
ipv4/unicast"] asn --- peer_5 class peer_5 peer; peer_6["192.168.1.42
peer 192.168.1.99
AS 65001
ipv4/unicast"] asn --- peer_6 class peer_6 peer; peer_7["192.168.1.46
peer 192.168.1.99
AS 65001
ipv4/unicast"] asn --- peer_7 class peer_7 peer;