digraph aws_architecture { rankdir=TB node [shape=box, style=rounded, fontname="Helvetica"] edge [fontname="Helvetica", fontsize=10] labelloc="t" label="MPR - AWS Architecture (Lambda + Step Functions)" fontsize=16 fontname="Helvetica-Bold" graph [splines=ortho, nodesep=0.8, ranksep=0.8] // External subgraph cluster_external { label="External" style=dashed color=gray browser [label="Browser\nmpr.mcrn.ar", shape=ellipse] } // Nginx reverse proxy subgraph cluster_proxy { label="Reverse Proxy" style=filled fillcolor="#e8f4f8" nginx [label="nginx\nport 80"] } // Application layer subgraph cluster_apps { label="Application Layer" style=filled fillcolor="#f0f8e8" django [label="Django Admin\n/admin\nport 8701"] fastapi [label="GraphQL API\n/graphql\nport 8702"] timeline [label="Timeline UI\n/\nport 5173"] } // Data layer (still local) subgraph cluster_data { label="Data Layer" style=filled fillcolor="#f8e8f0" postgres [label="PostgreSQL\nport 5436", shape=cylinder] } // AWS layer subgraph cluster_aws { label="AWS Cloud" style=filled fillcolor="#fde8d0" step_functions [label="Step Functions\nOrchestration\nstate machine"] lambda [label="Lambda Function\nFFmpeg container\ntranscoding"] s3 [label="S3 Buckets", shape=folder] bucket_in [label="mpr-media-in/\ninput videos", shape=note] bucket_out [label="mpr-media-out/\ntranscoded output", shape=note] } // Connections browser -> nginx [label="HTTP"] nginx -> django [xlabel="/admin"] nginx -> fastapi [xlabel="/graphql"] nginx -> timeline [xlabel="/"] timeline -> fastapi [label="GraphQL"] django -> postgres fastapi -> postgres [label="read/write jobs"] fastapi -> step_functions [label="boto3\nstart_execution()\nexecution_arn"] step_functions -> lambda [label="invoke with\njob parameters"] lambda -> s3 [label="download input\nupload output"] lambda -> fastapi [label="POST /jobs/{id}/callback\nupdate status"] fastapi -> postgres [label="callback updates\njob status"] s3 -> bucket_in [style=dotted, arrowhead=none] s3 -> bucket_out [style=dotted, arrowhead=none] }