%%{init: {'theme': 'base', 'themeVariables': {'fontFamily': 'Inter, sans-serif', 'fontSize': '14px'}}}%%
flowchart TB
%% === STYLES ===
classDef internet fill:#166534,stroke:#22c55e,stroke-width:2px,color:#fff,border-radius:12px
classDef edge fill:#991b1b,stroke:#f87171,stroke-width:3px,color:#fff,border-radius:16px,font-weight:bold
classDef core fill:#5b21b6,stroke:#c4b5fd,stroke-width:2px,color:#fff,border-radius:12px
classDef oob fill:#1f2937,stroke:#6b7280,stroke-width:1.5px,color:#e5e7eb,border-radius:10px
classDef network fill:#1e3a8a,stroke:#93c5fd,stroke-width:2px,color:#fff,border-radius:10px
classDef compute fill:#1e40af,stroke:#60a5fa,stroke-width:2px,color:#fff,border-radius:12px
classDef storage fill:#1e293b,stroke:#475569,stroke-width:2px,color:#e2e8f0,border-radius:12px
%% === INTERNET ===
subgraph Internet["Dual ISPs (2×1 Gbps)"]
ISP1[(ISP #1\neBGP)]
ISP2[(ISP #2\neBGP)]
end
class ISP1,ISP2 internet
%% === EDGE SECURITY ===
subgraph Edge["NGFW HA + WAF/DDoS"]
direction LR
FW_A["Firewall A\n**Active**"]
FW_B["Firewall B\n**Standby**"]
WAF["Fortinet WAF\nPer-Tenant"]
DDoS["ISP DDoS Scrub"]
end
class FW_A,FW_B,WAF,DDoS edge
ISP1 -->|"eBGP / Static"| FW_A
ISP2 -->|"eBGP / Static"| FW_B
FW_A <-->|"HA Sync\n< 3s Failover"| FW_B
FW_A --- WAF
ISP1 --- DDoS
ISP2 --- DDoS
%% === CORE / ToR ===
subgraph Core["Collapsed Core / ToR\nMLAG + LACP"]
direction LR
ToR_A["ToR/Core A\n25G Ports"]
ToR_B["ToR/Core B\n25G Ports"]
ToR_A <== "2×100G ISL\nMLAG" ==> ToR_B
end
class ToR_A,ToR_B core
FW_A -->|"VLAN Trunks"| ToR_A
FW_B -->|"VLAN Trunks"| ToR_B
%% === OOB ===
subgraph OOB["Out-of-Band Management"]
OOB_SW["1G OOB Switch"]
LTE["LTE Failover"]
BASTION["Bastion Host\nMFA + JIT"]
end
class OOB_SW,LTE,BASTION oob
OOB_SW --- LTE
OOB_SW --- BASTION
%% === VRFs / VLANs ===
subgraph Networks["VRFs & VLANs"]
VRF_MGMT[["MGMT\n10.10.0.0/16\nVLAN 10"]]
VRF_STORE[["STORAGE\n10.20.0.0/16\nVLAN 30\nMTU 9000"]]
VRF_CLUSTER[["CLUSTER\n10.30.0.0/16\nVLAN 40"]]
VRF_SERV[["SERVICES\n10.40.0.0/16\nVLAN 50"]]
VRF_SILVER[["TENANT-SILVER\nVLAN 1000–1199"]]
VRF_GOLD[["TENANT-GOLD\nVLAN 2000–2199"]]
end
class VRF_MGMT,VRF_STORE,VRF_CLUSTER,VRF_SERV,VRF_SILVER,VRF_GOLD network
ToR_A -.-> VRF_MGMT & VRF_STORE & VRF_CLUSTER & VRF_SERV & VRF_SILVER & VRF_GOLD
ToR_B -.-> VRF_MGMT & VRF_STORE & VRF_CLUSTER & VRF_SERV & VRF_SILVER & VRF_GOLD
%% === PROXMOX HVs ===
subgraph Compute["Proxmox VE\n4 HVs: 3+1 HA"]
direction TB
HV1["HV-1\n4×10G (2/ToR)\n+1G OOB"]
HV2["HV-2\n4×10G (2/ToR)\n+1G OOB"]
HV3["HV-3\n4×10G (2/ToR)\n+1G OOB"]
HV4["HV-4\n4×10G (2/ToR)\n+1G OOB\n**Spare**"]
end
class HV1,HV2,HV3,HV4 compute
HV1 -->|"bond0: Data\nbond1: Storage"| ToR_A
HV1 --> ToR_B
HV2 --> ToR_A & ToR_B
HV3 --> ToR_A & ToR_B
HV4 --> ToR_A & ToR_B
%% === ZFS STORAGE ===
subgraph Storage["ZFS Storage\n3 Nodes: 2+1 HA"]
ST1["STOR-1\n24× NVMe Gen4"]
ST2["STOR-2\n24× NVMe Gen4"]
ST3["STOR-3\n24× NVMe Gen4\n**Spare**"]
end
class ST1,ST2,ST3 storage
ST1 -->|"25G MLAG"| ToR_A
ST1 --> ToR_B
ST2 --> ToR_A & ToR_B
ST3 --> ToR_A & ToR_B
BASTION -->|"Secure Access"| VRF_MGMT
%% === ACTIVE & WORKING LINKS ===
click FW_B "https://docs.fortinet.com/document/fortigate/7.4.1/administration-guide/573688/ha-active-passive-cluster" "FortiGate HA Failover"
click ToR_A "https://www.arista.com/en/support/advisory/mlag" "Arista MLAG Guide"
click HV4 "https://pve.proxmox.com/wiki/High_Availability" "Proxmox HA Auto-Migration"
click ST3 "https://openzfs.github.io/openzfs-docs/man/8/zpool-replace.8.html" "ZFS Auto-Rebuild from Spare"
%%{init: {'theme': 'base', 'themeVariables': {'fontFamily': 'Inter, sans-serif', 'fontSize': '14px'}}}%%
flowchart TB
%% === STYLES ===
classDef internet fill:#166534,stroke:#22c55e,stroke-width:2px,color:#fff,border-radius:12px
classDef edge fill:#991b1b,stroke:#f87171,stroke-width:3px,color:#fff,border-radius:16px,font-weight:bold
classDef core fill:#5b21b6,stroke:#c4b5fd,stroke-width:2px,color:#fff,border-radius:12px
classDef oob fill:#1f2937,stroke:#6b7280,stroke-width:1.5px,color:#e5e7eb,border-radius:10px
classDef network fill:#1e3a8a,stroke:#93c5fd,stroke-width:2px,color:#fff,border-radius:10px
classDef compute fill:#1e40af,stroke:#60a5fa,stroke-width:2px,color:#fff,border-radius:12px
classDef storage fill:#1e293b,stroke:#475569,stroke-width:2px,color:#e2e8f0,border-radius:12px
%% === INTERNET ===
subgraph Internet["Dual ISPs (2×1 Gbps)"]
ISP1[(ISP #1\neBGP)]
ISP2[(ISP #2\neBGP)]
end
class ISP1,ISP2 internet
%% === EDGE SECURITY ===
subgraph Edge["NGFW HA + WAF/DDoS"]
direction LR
FW_A["Firewall A\n**Active**"]
FW_B["Firewall B\n**Standby**"]
WAF["Fortinet WAF\nPer-Tenant"]
DDoS["ISP DDoS Scrub"]
end
class FW_A,FW_B,WAF,DDoS edge
ISP1 -->|"eBGP / Static"| FW_A
ISP2 -->|"eBGP / Static"| FW_B
FW_A <-->|"HA Sync\n< 3s Failover"| FW_B
FW_A --- WAF
ISP1 --- DDoS
ISP2 --- DDoS
%% === CORE / ToR ===
subgraph Core["Collapsed Core / ToR\nMLAG + LACP"]
direction LR
ToR_A["ToR/Core A\n25G Ports"]
ToR_B["ToR/Core B\n25G Ports"]
ToR_A <== "2×100G ISL\nMLAG" ==> ToR_B
end
class ToR_A,ToR_B core
FW_A -->|"VLAN Trunks"| ToR_A
FW_B -->|"VLAN Trunks"| ToR_B
%% === OOB ===
subgraph OOB["Out-of-Band Management"]
OOB_SW["1G OOB Switch"]
LTE["LTE Failover"]
BASTION["Bastion Host\nMFA + JIT"]
end
class OOB_SW,LTE,BASTION oob
OOB_SW --- LTE
OOB_SW --- BASTION
%% === VRFs / VLANs ===
subgraph Networks["VRFs & VLANs"]
VRF_MGMT[["MGMT\n10.10.0.0/16\nVLAN 10"]]
VRF_STORE[["STORAGE\n10.20.0.0/16\nVLAN 30\nMTU 9000"]]
VRF_CLUSTER[["CLUSTER\n10.30.0.0/16\nVLAN 40"]]
VRF_SERV[["SERVICES\n10.40.0.0/16\nVLAN 50"]]
VRF_SILVER[["TENANT-SILVER\nVLAN 1000–1199"]]
VRF_GOLD[["TENANT-GOLD\nVLAN 2000–2199"]]
end
class VRF_MGMT,VRF_STORE,VRF_CLUSTER,VRF_SERV,VRF_SILVER,VRF_GOLD network
ToR_A -.-> VRF_MGMT & VRF_STORE & VRF_CLUSTER & VRF_SERV & VRF_SILVER & VRF_GOLD
ToR_B -.-> VRF_MGMT & VRF_STORE & VRF_CLUSTER & VRF_SERV & VRF_SILVER & VRF_GOLD
%% === PROXMOX HVs ===
subgraph Compute["Proxmox VE\n4 HVs: 3+1 HA"]
direction TB
HV1["HV-1\n4×10G (2/ToR)\n+1G OOB"]
HV2["HV-2\n4×10G (2/ToR)\n+1G OOB"]
HV3["HV-3\n4×10G (2/ToR)\n+1G OOB"]
HV4["HV-4\n4×10G (2/ToR)\n+1G OOB\n**Spare**"]
end
class HV1,HV2,HV3,HV4 compute
HV1 -->|"bond0: Data\nbond1: Storage"| ToR_A
HV1 --> ToR_B
HV2 --> ToR_A & ToR_B
HV3 --> ToR_A & ToR_B
HV4 --> ToR_A & ToR_B
%% === ZFS STORAGE ===
subgraph Storage["ZFS Storage\n3 Nodes: 2+1 HA"]
ST1["STOR-1\n24× NVMe Gen4"]
ST2["STOR-2\n24× NVMe Gen4"]
ST3["STOR-3\n24× NVMe Gen4\n**Spare**"]
end
class ST1,ST2,ST3 storage
ST1 -->|"25G MLAG"| ToR_A
ST1 --> ToR_B
ST2 --> ToR_A & ToR_B
ST3 --> ToR_A & ToR_B
BASTION -->|"Secure Access"| VRF_MGMT
%% === ACTIVE & WORKING LINKS ===
click FW_B "https://docs.fortinet.com/document/fortigate/7.4.1/administration-guide/573688/ha-active-passive-cluster" "FortiGate HA Failover"
click ToR_A "https://www.arista.com/en/support/advisory/mlag" "Arista MLAG Guide"
click HV4 "https://pve.proxmox.com/wiki/High_Availability" "Proxmox HA Auto-Migration"
click ST3 "https://openzfs.github.io/openzfs-docs/man/8/zpool-replace.8.html" "ZFS Auto-Rebuild from Spare"