%% Titan Lab physical hardware architecture. %% Solid links are physical network, storage, power, or sensor paths. %% Dashed links are administration, telemetry, or recovery control. %%{init: {"flowchart": {"defaultRenderer": "elk", "curve": "stepAfter", "nodeSpacing": 30, "rankSpacing": 65, "useMaxWidth": false}, "elk": {"mergeEdges": true, "nodePlacementStrategy": "NETWORK_SIMPLEX", "forceNodeModelOrder": true, "considerModelOrder": "NODES_AND_EDGES"}, "themeVariables": {"background": "#000000"}, "themeCSS": "& { background-color: #000000 !important; }"}}%% flowchart TB internet["Internet"]:::external ac_cloud["AC Infinity account"]:::external subgraph lab["Titan Lab"] direction TB subgraph link_legend["Link colors"] direction LR subgraph legend_network["Network"] direction TB legend_1g["1 Gbps"]:::legend1g legend_25g["2.5 Gbps"]:::legend25g legend_external["External network"]:::legendExternal end subgraph legend_resources["Resources"] direction TB legend_local["Local attachment"]:::legendLocal legend_shared["Shared storage"]:::legendShared legend_gpu["GPU"]:::legendGpu end subgraph legend_operations["Operations"] direction TB legend_power["Power and NUT"]:::legendPower legend_telemetry["Telemetry and environment"]:::legendTelemetry legend_control["Administration and recovery"]:::legendControl legend_safety["Protective shutdown"]:::legendSafety end end subgraph network["Network fabric"] direction LR router["ASUS RT-AX88U
Router"]:::network cisco["Cisco CBS110-24T
1 Gbps switch"]:::network trendnet["TRENDnet 9-port
2.5 Gbps switch"]:::network router ==> cisco router ==> trendnet end subgraph atlas["Atlas Kubernetes cluster"] direction TB subgraph control_plane["High-availability control plane, ARM64"] direction LR subgraph titan_0a["titan-0a"] direction TB t0a_host["Raspberry Pi 5
8 GiB RAM
Ubuntu 24.04"]:::control t0a_storage["Local
500 GiB boot SSD"]:::localStorage t0a_host --- t0a_storage end subgraph titan_0b["titan-0b"] direction TB t0b_host["Raspberry Pi 5
8 GiB RAM
Ubuntu 24.04"]:::control t0b_storage["Local
500 GiB boot SSD"]:::localStorage t0b_host --- t0b_storage end subgraph titan_0c["titan-0c"] direction TB t0c_host["Raspberry Pi 5
8 GiB RAM
Ubuntu 24.04"]:::control t0c_storage["Local
500 GiB boot SSD"]:::localStorage t0c_host --- t0c_storage end t0a_host --- t0b_host t0b_host --- t0c_host end subgraph workers["Workers"] direction TB subgraph pi5_workers["Newer workers, ARM64 Raspberry Pi 5"] direction TB subgraph pi5_row_a[" "] direction LR subgraph titan_04["titan-04"] direction TB t04_host["Raspberry Pi 5
8 GiB RAM
Ubuntu 24.04"]:::pi5 t04_storage["Local
SD root
64 GiB astraios"]:::localStorage t04_host --- t04_storage end subgraph titan_05["titan-05"] direction TB t05_host["Raspberry Pi 5
8 GiB RAM
Ubuntu 24.04"]:::pi5 t05_storage["Local
SD root
64 GiB astraios"]:::localStorage t05_host --- t05_storage end subgraph titan_06["titan-06"] direction TB t06_host["Raspberry Pi 5
8 GiB RAM
Ubuntu 24.04"]:::pi5 t06_storage["Local
SD root
64 GiB astraios"]:::localStorage t06_host --- t06_storage end end subgraph pi5_row_b[" "] direction LR subgraph titan_07["titan-07"] direction TB t07_host["Raspberry Pi 5
8 GiB RAM
Ubuntu 24.04"]:::pi5 t07_storage["Local
SD root
64 GiB astraios"]:::localStorage t07_host --- t07_storage end subgraph titan_08["titan-08"] direction TB t08_host["Raspberry Pi 5
8 GiB RAM
Ubuntu 24.04"]:::pi5 t08_storage["Local
SD root
64 GiB astraios"]:::localStorage t08_host --- t08_storage end subgraph titan_11["titan-11"] direction TB t11_host["Raspberry Pi 5
8 GiB RAM
Ubuntu 24.04"]:::pi5 t11_storage["Local
SD root
64 GiB astraios"]:::localStorage t11_host --- t11_storage end end end subgraph pi4_workers["Older workers, ARM64 Raspberry Pi 4"] direction TB subgraph pi4_row_a[" "] direction LR subgraph titan_12["titan-12"] direction TB t12_host["Raspberry Pi 4
8 GiB RAM
Armbian"]:::pi4 t12_root["Local
SD root"]:::localStorage t12_host --- t12_root end subgraph titan_13["titan-13"] direction TB t13_host["Raspberry Pi 4
8 GiB RAM
Armbian"]:::pi4 t13_root["Local
SD root"]:::localStorage t13_astreae["Longhorn
8 TiB Astreae"]:::sharedStorage t13_asteria["Longhorn
12 TiB Asteria"]:::sharedStorage t13_host --- t13_root t13_host --- t13_astreae t13_host --- t13_asteria end subgraph titan_14["titan-14"] direction TB t14_host["Raspberry Pi 4
8 GiB RAM
Armbian"]:::pi4 t14_root["Local
SD root"]:::localStorage t14_host --- t14_root end subgraph titan_15["titan-15"] direction TB t15_host["Raspberry Pi 4
8 GiB RAM
Armbian"]:::pi4 t15_root["Local
SD root"]:::localStorage t15_astreae["Longhorn
8 TiB Astreae"]:::sharedStorage t15_asteria["Longhorn
12 TiB Asteria"]:::sharedStorage t15_host --- t15_root t15_host --- t15_astreae t15_host --- t15_asteria end end subgraph pi4_row_b[" "] direction LR subgraph titan_17["titan-17"] direction TB t17_host["Raspberry Pi 4
8 GiB RAM
Armbian"]:::pi4 t17_root["Local
SD root"]:::localStorage t17_astreae["Longhorn
8 TiB Astreae"]:::sharedStorage t17_asteria["Longhorn
12 TiB Asteria"]:::sharedStorage t17_host --- t17_root t17_host --- t17_astreae t17_host --- t17_asteria end subgraph titan_18["titan-18"] direction TB t18_host["Raspberry Pi 4
8 GiB RAM
Armbian"]:::pi4 t18_root["Local
SD root"]:::localStorage t18_host --- t18_root end subgraph titan_19["titan-19"] direction TB t19_host["Raspberry Pi 4
8 GiB RAM
Armbian"]:::pi4 t19_root["Local
SD root"]:::localStorage t19_astreae["Longhorn
8 TiB Astreae"]:::sharedStorage t19_asteria["Longhorn
12 TiB Asteria"]:::sharedStorage t19_host --- t19_root t19_host --- t19_astreae t19_host --- t19_asteria end end end subgraph accelerator_workers["Accelerators and high-capacity workers"] direction TB subgraph jetson_workers["ARM64 NVIDIA Jetson"] direction LR subgraph titan_20["titan-20"] direction TB t20_host["Jetson Xavier NX
16 GiB RAM
Ubuntu 20.04
Accelerator"]:::accelerator t20_gpu["GPU
NVIDIA Xavier"]:::gpu t20_storage["Local
256 GiB disk"]:::localStorage t20_host --- t20_gpu t20_host --- t20_storage end subgraph titan_21["titan-21"] direction TB t21_host["Jetson Xavier NX
16 GiB RAM
Ubuntu 20.04
Accelerator"]:::accelerator t21_gpu["GPU
NVIDIA Xavier"]:::gpu t21_storage["Local
256 GiB disk"]:::localStorage t21_host --- t21_gpu t21_host --- t21_storage end end subgraph x86_workers["x86_64 systems"] direction LR subgraph titan_22["titan-22"] direction TB t22_host["X830 mini PC
Core i9-12900H
32 GiB RAM
Debian 13"]:::accelerator t22_gpu["GPU
NVIDIA RTX 3050 Ti"]:::gpu t22_igpu["Intel Iris Xe
Not pooled"]:::localGpu t22_storage["Local
1 TiB disk"]:::localStorage t22_host --- t22_gpu t22_host --- t22_igpu t22_host --- t22_storage end subgraph titan_23["titan-23, Oceanus"] direction TB t23_host["EPYC 74F3
24 cores, 48 threads
256 GiB RAM
Debian 13"]:::server t23_gpu["ASPEED graphics
Not pooled"]:::localGpu t23_root["Local
1 TiB disk"]:::localStorage t23_data["Local
4 TiB Veles
4 TiB SUI"]:::localStorage t23_host --- t23_gpu t23_host --- t23_root t23_host --- t23_data end subgraph titan_24["titan-24, Tethys"] direction TB t24_host["Ryzen 9 3900X
24 threads, 64 GiB RAM
Debian 13"]:::accelerator t24_gpu["GPU
NVIDIA RTX 3080"]:::gpu t24_root["Local
500 GiB disk"]:::localStorage t24_data["Local
500 GiB home
500 GiB temporary"]:::localStorage t24_host --- t24_gpu t24_host --- t24_root t24_host --- t24_data end end end pi5_workers ~~~ pi4_workers pi4_workers ~~~ accelerator_workers end subgraph virtual_resources["Virtual resource pools"] direction LR subgraph cluster_storage["Longhorn storage classes"] direction LR astreae["Astreae
4 x 8 TiB
32 TiB"]:::sharedPool asteria["Asteria
4 x 12 TiB
48 TiB"]:::sharedPool end subgraph cluster_gpus["Kubernetes GPU pool"] direction LR arm_gpu_pool["NVIDIA ARM64
titan-20 and titan-21"]:::gpuPool x86_gpu_pool["NVIDIA x86_64
titan-22 and titan-24"]:::gpuPool end end subgraph cluster_telemetry["Cluster telemetry"] direction LR typhon["Typhon
Kubernetes workload"]:::clusterService victoria["VictoriaMetrics"]:::telemetry grafana["Grafana"]:::telemetry typhon ==>|environment metrics| victoria victoria --> grafana end end subgraph outside_cluster["Lab systems outside the Atlas cluster"] direction TB subgraph support_hosts["Support and host-level services"] direction LR subgraph titan_db["titan-db"] direction TB tdb_host["Raspberry Pi 5
8 GiB RAM
Ubuntu 24.04"]:::support tdb_storage["Local
500 GiB boot SSD"]:::localStorage tdb_postgres["PostgreSQL
HA control-plane database"]:::hostSoftware ananke_db["NUT and Ananke
Host services
Automatic recovery"]:::hostService tdb_host --- tdb_storage tdb_host --- tdb_postgres tdb_host --- ananke_db end subgraph titan_jh["titan-jh"] direction TB tjh_host["Raspberry Pi 5
8 GiB RAM
Arch Linux ARM
Jump host"]:::support tjh_storage["Local
256 GiB boot SSD"]:::localStorage lesavka["Lesavka
Remote control for Tethys"]:::hostService tjh_host --- tjh_storage tjh_host --- lesavka end ananke_t24["NUT and Ananke on titan-24
Host services outside Kubernetes
UPS telemetry and safe shutdown"]:::hostService end subgraph failed_hardware["Boards awaiting replacement"] direction LR titan_09["titan-09
Raspberry Pi 5"]:::failed titan_10["titan-10
Raspberry Pi 5"]:::failed titan_16["titan-16
Raspberry Pi 4"]:::failed end end subgraph facilities["Power and enclosure"] direction LR subgraph protected_power["UPS protection"] direction LR subgraph pyrphoros_power["Pyrphoros"] direction TB pyrphoros["CyberPower
850 VA UPS"]:::power pyrphoros_loads["Protected loads
Router and Cisco switch
Control plane and Pi workers
Jetsons, titan-22, titan-db
Cooling equipment"]:::powerLoad pyrphoros --> pyrphoros_loads end subgraph statera_power["Statera"] direction TB statera["CyberPower
1500PFCLCD"]:::power statera_loads["Protected loads
TRENDnet switch
titan-23, titan-24, titan-jh"]:::powerLoad statera --> statera_loads end end subgraph cooling["Enclosure cooling"] direction TB enclosure["Filtered equipment tent
AC-cooled intake
Controlled exhaust"]:::environment ac_controller["AC Infinity controller
Temperature
Humidity
Pressure"]:::environment fans["Controlled intake
and exhaust fans"]:::environment enclosure --- ac_controller ac_controller --> fans end end cisco ==> control_plane cisco ==> pi5_workers cisco ==> pi4_workers cisco ==> jetson_workers cisco ==> titan_db trendnet ==> titan_jh trendnet ==> x86_workers t0b_host -.->|HA PostgreSQL| tdb_postgres tjh_host -.->|administration| control_plane tjh_host -.->|administration| workers lesavka -.->|remote control| t24_host t13_astreae ==> astreae t15_astreae ==> astreae t17_astreae ==> astreae t19_astreae ==> astreae t13_asteria ==> asteria t15_asteria ==> asteria t17_asteria ==> asteria t19_asteria ==> asteria t20_gpu ==> arm_gpu_pool t21_gpu ==> arm_gpu_pool t22_gpu ==> x86_gpu_pool t24_gpu ==> x86_gpu_pool t24_host -.->|same physical host| ananke_t24 pyrphoros -->|NUT| ananke_db statera -->|NUT| ananke_t24 ananke_db -.->|power metrics| victoria ananke_t24 -.->|power metrics| victoria ananke_db -.->|database and cluster recovery| t0a_host ananke_t24 -.->|low-battery shutdown| control_plane ac_controller --> ac_cloud ac_cloud -.->|environment data| typhon end internet --> router classDef external fill:#292d33,stroke:#a0a8b3,color:#ffffff,stroke-width:2px classDef network fill:#17324a,stroke:#65b5e8,color:#ffffff,stroke-width:2px classDef control fill:#163e48,stroke:#65d2df,color:#ffffff,stroke-width:2px classDef pi5 fill:#173d2a,stroke:#68d391,color:#ffffff,stroke-width:2px classDef pi4 fill:#293b23,stroke:#9acb70,color:#ffffff,stroke-width:2px classDef accelerator fill:#382b50,stroke:#b49aef,color:#ffffff,stroke-width:2px classDef server fill:#3c3046,stroke:#c4a4dc,color:#ffffff,stroke-width:2px classDef support fill:#293845,stroke:#9fc5dc,color:#ffffff,stroke-width:2px classDef localStorage fill:#1d3040,stroke:#6f9fbd,color:#ffffff classDef sharedStorage fill:#493b18,stroke:#efc65b,color:#ffffff,stroke-width:2px classDef sharedPool fill:#594817,stroke:#ffd166,color:#ffffff,stroke-width:3px classDef gpu fill:#482c5f,stroke:#d0a6ff,color:#ffffff,stroke-width:2px classDef localGpu fill:#292d35,stroke:#9ba4b2,color:#ffffff classDef gpuPool fill:#573476,stroke:#d8b4fe,color:#ffffff,stroke-width:3px classDef clusterService fill:#153c38,stroke:#5fc9bc,color:#ffffff,stroke-width:2px classDef telemetry fill:#203651,stroke:#67a9e9,color:#ffffff,stroke-width:2px classDef hostSoftware fill:#243a45,stroke:#73b8d0,color:#ffffff,stroke-width:2px classDef hostService fill:#48351c,stroke:#e3ae59,color:#ffffff,stroke-width:2px classDef failed fill:#3d1f25,stroke:#f06b78,color:#ffffff,stroke-width:2px,stroke-dasharray:8 6 classDef power fill:#49301c,stroke:#ec9f55,color:#ffffff,stroke-width:2px classDef powerLoad fill:#3b2d20,stroke:#c98e55,color:#ffffff classDef environment fill:#153d3a,stroke:#58c9bd,color:#ffffff,stroke-width:2px classDef legend1g fill:#0b1726,stroke:#4ea1ff,color:#ffffff,stroke-width:3px classDef legend25g fill:#082027,stroke:#22d3ee,color:#ffffff,stroke-width:3px classDef legendExternal fill:#17162c,stroke:#818cf8,color:#ffffff,stroke-width:3px classDef legendLocal fill:#171b20,stroke:#a8b3c2,color:#ffffff,stroke-width:3px classDef legendShared fill:#2f270d,stroke:#f6c453,color:#ffffff,stroke-width:3px classDef legendGpu fill:#271536,stroke:#c084fc,color:#ffffff,stroke-width:3px classDef legendPower fill:#301b0c,stroke:#fb923c,color:#ffffff,stroke-width:3px classDef legendTelemetry fill:#0b2917,stroke:#4ade80,color:#ffffff,stroke-width:3px classDef legendControl fill:#32132a,stroke:#f472b6,color:#ffffff,stroke-width:3px classDef legendSafety fill:#321217,stroke:#fb7185,color:#ffffff,stroke-width:3px style lab fill:#020202,stroke:#89919c,stroke-width:4px style link_legend fill:#050505,stroke:#89919c,stroke-width:2px style legend_network fill:#03070b,stroke:#4ea1ff,stroke-width:1px style legend_resources fill:#080706,stroke:#f6c453,stroke-width:1px style legend_operations fill:#080506,stroke:#f472b6,stroke-width:1px style network fill:#03070b,stroke:#65b5e8,stroke-width:3px style atlas fill:#020608,stroke:#65d2df,stroke-width:4px style control_plane fill:#061014,stroke:#65d2df,stroke-width:3px style workers fill:#030603,stroke:#72b879,stroke-width:3px style pi5_workers fill:#050d08,stroke:#68d391,stroke-width:2px style pi5_row_a fill:transparent,stroke:transparent style pi5_row_b fill:transparent,stroke:transparent style pi4_workers fill:#080d05,stroke:#9acb70,stroke-width:2px style pi4_row_a fill:transparent,stroke:transparent style pi4_row_b fill:transparent,stroke:transparent style accelerator_workers fill:#09060d,stroke:#b49aef,stroke-width:2px style jetson_workers fill:#0b0710,stroke:#b49aef,stroke-width:2px style x86_workers fill:#0b0710,stroke:#c4a4dc,stroke-width:2px style virtual_resources fill:#08080b,stroke:#a8a2b3,stroke-width:3px style cluster_storage fill:#100d05,stroke:#ffd166,stroke-width:2px style cluster_gpus fill:#0d0813,stroke:#d8b4fe,stroke-width:2px style cluster_telemetry fill:#04100f,stroke:#5fc9bc,stroke-width:2px style outside_cluster fill:#07090b,stroke:#9fc5dc,stroke-width:3px style support_hosts fill:#07090b,stroke:#9fc5dc,stroke-width:2px style failed_hardware fill:#0d0708,stroke:#f06b78,stroke-width:2px,stroke-dasharray:8 6 style facilities fill:#070604,stroke:#ec9f55,stroke-width:3px style protected_power fill:#0e0905,stroke:#ec9f55,stroke-width:2px style pyrphoros_power fill:#100b06,stroke:#d99a58,stroke-width:2px style statera_power fill:#100b06,stroke:#d99a58,stroke-width:2px style cooling fill:#04100f,stroke:#58c9bd,stroke-width:2px linkStyle 0,54,55,56,57,58,59 stroke:#4ea1ff,color:#4ea1ff,stroke-width:3px linkStyle 1,60 stroke:#22d3ee,color:#22d3ee,stroke-width:4px linkStyle 86 stroke:#818cf8,color:#818cf8,stroke-width:3px linkStyle 2,3,4,7,8,9,10,11,12,13,14,17,18,21,24,25,29,31,34,36,37,39,40,45,48 stroke:#a8b3c2,color:#a8b3c2,stroke-width:2px linkStyle 15,16,19,20,22,23,26,27,65,66,67,68,69,70,71,72 stroke:#f6c453,color:#f6c453,stroke-width:3px linkStyle 28,30,32,33,35,38,73,74,75,76 stroke:#c084fc,color:#c084fc,stroke-width:3px linkStyle 50,51,78,79 stroke:#fb923c,color:#fb923c,stroke-width:3px linkStyle 43,44,52,53,80,81,84,85 stroke:#4ade80,color:#4ade80,stroke-width:3px linkStyle 5,6,46,47,49,61,62,63,64,77,82 stroke:#f472b6,color:#f472b6,stroke-width:2px linkStyle 83 stroke:#fb7185,color:#fb7185,stroke-width:4px