105 lines
4.0 KiB
Markdown
105 lines
4.0 KiB
Markdown
# Enterprise Private Cloud & IaC Homelab (v3)
|
|
|
|
A fully automated private cloud environment deployed from bare metal. This project manages the lifecycle of network and server resources, from hardware preparation to multi-tenant container deployments, using Infrastructure as Code (IaC) and configuration management.
|
|
|
|
---
|
|
|
|
## 🗺️ System Architecture
|
|
|
|
### Ingress & Traffic Routing
|
|
|
|
This diagram traces how external users connect to the various VM workloads hosted on the physical hypervisor without any port-forwarding or open inbound firewall rules on the local router.
|
|
|
|
```mermaid
|
|
graph LR
|
|
%% My Color Palette
|
|
classDef extNode fill:#212c2a,stroke:#9580ff,color:#f8f8f2,stroke-width:2px;
|
|
classDef tunnelNode fill:#212c2a,stroke:#ffca80,color:#ffca80,stroke-width:1px,stroke-dasharray: 5 5;
|
|
classDef vmNode fill:#2b3b38,stroke:#70a99f,color:#f8f8f2,stroke-width:1px;
|
|
classDef hostNode fill:#161d1c,stroke:#415854,color:#f8f8f2,stroke-width:2px;
|
|
|
|
%% Public Clients & Cloud Services
|
|
PublicUsers["🌐 Web Users"]:::extNode
|
|
Gamers["🎮 Minecraft Players"]:::extNode
|
|
GDrive["☁️ Google Drive (Cloud)"]:::extNode
|
|
|
|
%% Inbound Tunnels
|
|
subgraph Tunnels ["Secure Tunnels (Outbound-Only Ingress)"]
|
|
CF["☁️ Cloudflared Tunnel"]:::tunnelNode
|
|
PI["🔌 Playit.gg Tunnel"]:::tunnelNode
|
|
end
|
|
|
|
%% Physical Host & VMs
|
|
subgraph Host ["Physical Host: hypervisor.lab.local"]
|
|
subgraph Bridge ["Virtual Bridge Network (br0)"]
|
|
VM2["📄 portfolio (172.30.1.93)<br>Nginx Web Server"]:::vmNode
|
|
VM3["⚔️ minecraft (172.30.1.91)<br>Fabric Server"]:::vmNode
|
|
VM4["🎵 navidrome (172.30.1.92)<br>Music Streamer"]:::vmNode
|
|
end
|
|
end
|
|
|
|
%% Traffic Routing Paths
|
|
PublicUsers -->|HTTPS| CF
|
|
Gamers -->|Port 25565| PI
|
|
|
|
CF -->|Forward Port 80| VM2
|
|
PI -->|Forward Port 25565| VM3
|
|
|
|
%% Storage Mounting Path
|
|
VM4 -->|rclone FUSE Mount| GDrive
|
|
|
|
%% Subgraph Colors
|
|
style Host fill:#161d1c,stroke:#415854,stroke-width:2px;
|
|
style Bridge fill:#212c2a,stroke:#70a99f,stroke-width:1px;
|
|
style Tunnels fill:#212c2a,stroke:#ffca80,stroke-width:1px,stroke-dasharray: 5 5;
|
|
```
|
|
|
|
### System Administration & Observability
|
|
|
|
This diagram details the internal control plane, showing how client VMs authenticate via **FreeIPA** (LDAP/Kerberos/DNS) and how **Prometheus** scrapes host metrics via **Node Exporters** across all nodes.
|
|
|
|
```mermaid
|
|
graph TD
|
|
%% My Color Palette
|
|
classDef hostNode fill:#161d1c,stroke:#415854,color:#f8f8f2,stroke-width:2px;
|
|
classDef ipdNode fill:#2b3b38,stroke:#ff9580,color:#ff9580,stroke-width:1.5px;
|
|
classDef vmNode fill:#2b3b38,stroke:#70a99f,color:#f8f8f2,stroke-width:1px;
|
|
classDef obsNode fill:#2b3b38,stroke:#8aff80,color:#8aff80,stroke-width:1.5px;
|
|
|
|
%% Core Services
|
|
VM1["🔑 freeipa.lab.local (172.30.1.85)<br>LDAP / Kerberos / BIND DNS"]:::ipdNode
|
|
|
|
%% Monitored VMs (Nodes)
|
|
subgraph Nodes ["Monitored Nodes (Port: 9100)"]
|
|
HostOS["🖥️ Hypervisor Host (172.30.1.200)"]:::hostNode
|
|
VM2["📄 portfolio VM (172.30.1.93)"]:::vmNode
|
|
VM3["⚔️ minecraft VM (172.30.1.91)"]:::vmNode
|
|
VM4["🎵 navidrome VM (172.30.1.92)"]:::vmNode
|
|
end
|
|
|
|
%% Monitoring Stack
|
|
subgraph PortfolioServices ["portfolio VM Services"]
|
|
Prom["📈 Prometheus TSDB"]:::obsNode
|
|
Grafana["📊 Grafana Dashboard"]:::obsNode
|
|
end
|
|
|
|
%% Telemetry Connections (Clean node-to-node routing)
|
|
HostOS & VM1 & VM2 & VM3 & VM4 -.->|Node Exporter Scrape| Prom
|
|
Prom -->|Data Source| Grafana
|
|
|
|
%% DNS Registry Connections
|
|
Nodes --->|DNS Lookups| VM1
|
|
|
|
%% Subgraph Colors
|
|
style Nodes fill:#212c2a,stroke:#70a99f,stroke-width:1px;
|
|
style PortfolioServices fill:#161d1c,stroke:#415854,stroke-width:2px;
|
|
```
|
|
|
|
---
|
|
|
|
## 🗂️ Documentation Index
|
|
|
|
* [**Local Development Setup**](./docs/01-dev-env.md)
|
|
* [**Bare-Metal Hypervisor Preparation**](./docs/02-hypervisor.md)
|
|
* [**Infrastructure Provisioning with Terraform**](./docs/03-terraform.md)
|