digraph Deployment { rankdir=TB; compound=true; fontname="Helvetica"; node [fontname="Helvetica", fontsize=10]; edge [fontname="Helvetica", fontsize=9]; labelloc="t"; label="Deployment Architecture"; fontsize=14; node [shape=box, style="rounded,filled"]; // Local Stack subgraph cluster_local { label="Local Stack (Docker Compose)"; style=filled; fillcolor="#E8F5E9"; aggregator [label="Aggregator\n(gRPC Server)", fillcolor="#A5D6A7"]; gateway [label="Gateway\n(FastAPI)", fillcolor="#A5D6A7"]; alerts [label="Alerts\nService", fillcolor="#A5D6A7"]; redis [label="Redis", shape=cylinder, fillcolor="#C8E6C9"]; timescaledb [label="TimescaleDB", shape=cylinder, fillcolor="#C8E6C9"]; } // AWS Edge subgraph cluster_aws { label="AWS (sysmonstm.mcrn.ar)"; style=filled; fillcolor="#F3E5F5"; edge_relay [label="Edge\n(WebSocket Relay)", fillcolor="#CE93D8"]; } // CI/CD subgraph cluster_cicd { label="CI/CD"; style=filled; fillcolor="#E3F2FD"; woodpecker [label="Woodpecker CI", fillcolor="#90CAF9"]; registry [label="Container\nRegistry", shape=cylinder, fillcolor="#64B5F6"]; } // Collectors (External) subgraph cluster_collectors { label="Monitored Machines"; style=dashed; color=gray; coll1 [label="Collector\n(Machine 1)", fillcolor="#FFCCBC"]; coll2 [label="Collector\n(Machine 2)", fillcolor="#FFCCBC"]; coll3 [label="Collector\n(Machine N)", fillcolor="#FFCCBC"]; } // Browser browser [label="Browser\n(Dashboard)", fillcolor="#FFF3E0"]; // Connections coll1 -> aggregator [label="gRPC"]; coll2 -> aggregator [label="gRPC"]; coll3 -> aggregator [label="gRPC"]; aggregator -> redis [label="State"]; aggregator -> timescaledb [label="Store"]; gateway -> aggregator [label="gRPC"]; gateway -> edge_relay [label="WebSocket\nForward"]; edge_relay -> browser [label="WebSocket", dir=both]; woodpecker -> registry [label="Push"]; registry -> edge_relay [label="Pull", style=dashed]; registry -> aggregator [label="Pull", style=dashed, lhead=cluster_local]; }