{
  "schema_version": 1,
  "diagram_type": "architecture",
  "meta": {
    "title": "Despliegue en producción y responsables",
    "output": "examples/production-deployment.html",
    "visual_preset": "blueprint",
    "animation": "trace",
    "quality_profile": "showcase",
    "engineering_profile": "deployment-ownership",
    "views": [
      {
        "id": "request-boundary",
        "label": "Solicitud a través del perímetro",
        "focus": [
          "clients",
          "edge",
          "gateway",
          "api_a",
          "api_b"
        ],
        "note": "Sigue el tráfico público hasta la red privada de la aplicación."
      },
      {
        "id": "state-ownership",
        "label": "Estado y responsables",
        "focus": [
          "api_a",
          "api_b",
          "redis",
          "postgres",
          "replica"
        ],
        "note": "Distingue los procesos sin estado de los datos a cargo del equipo de datos."
      },
      {
        "id": "async-operations",
        "label": "Asincronía y operaciones",
        "focus": [
          "api_b",
          "events",
          "worker",
          "audit",
          "observability"
        ],
        "note": "Observa el trabajo asíncrono y la evidencia que genera."
      }
    ],
    "locale": "es"
  },
  "components": [
    {
      "id": "clients",
      "type": "external",
      "label": "Clientes",
      "sublabel": "web y móvil",
      "pos": [
        38,
        300
      ],
      "size": [
        122,
        60
      ]
    },
    {
      "id": "edge",
      "type": "cloud",
      "label": "Perímetro global",
      "sublabel": "CDN + WAF",
      "pos": [
        230,
        300
      ],
      "size": [
        126,
        60
      ],
      "tag": "equipo de perímetro"
    },
    {
      "id": "gateway",
      "type": "security",
      "label": "Puerta de API",
      "sublabel": "público :443",
      "pos": [
        430,
        300
      ],
      "size": [
        128,
        60
      ],
      "tag": "plataforma"
    },
    {
      "id": "api_a",
      "type": "backend",
      "label": "Pods API / AZ-a",
      "sublabel": "subred privada",
      "pos": [
        630,
        195
      ],
      "size": [
        136,
        62
      ],
      "tag": "equipo de aplicación"
    },
    {
      "id": "api_b",
      "type": "backend",
      "label": "Pods API / AZ-b",
      "sublabel": "subred privada",
      "pos": [
        630,
        405
      ],
      "size": [
        136,
        62
      ],
      "tag": "equipo de aplicación"
    },
    {
      "id": "redis",
      "type": "database",
      "label": "Redis",
      "sublabel": "caché multizona",
      "pos": [
        840,
        195
      ],
      "size": [
        126,
        62
      ],
      "tag": "plataforma"
    },
    {
      "id": "postgres",
      "type": "database",
      "label": "PostgreSQL",
      "sublabel": "principal / cifrado",
      "pos": [
        840,
        405
      ],
      "size": [
        126,
        62
      ],
      "tag": "equipo de datos"
    },
    {
      "id": "events",
      "type": "messagebus",
      "label": "Bus de eventos",
      "sublabel": "orders.v1",
      "pos": [
        1040,
        300
      ],
      "size": [
        126,
        60
      ],
      "tag": "plataforma"
    },
    {
      "id": "worker",
      "type": "backend",
      "label": "Procesadores",
      "sublabel": "proceso privado",
      "pos": [
        1190,
        300
      ],
      "size": [
        126,
        60
      ],
      "tag": "equipo de aplicación"
    },
    {
      "id": "replica",
      "type": "database",
      "label": "Réplica de respaldo",
      "sublabel": "eu-west-1",
      "pos": [
        1040,
        578
      ],
      "size": [
        126,
        62
      ],
      "tag": "equipo de datos"
    },
    {
      "id": "audit",
      "type": "cloud",
      "label": "Archivo de auditoría",
      "sublabel": "objetos inmutables",
      "pos": [
        1190,
        450
      ],
      "size": [
        126,
        62
      ],
      "tag": "seguridad"
    },
    {
      "id": "observability",
      "type": "external",
      "label": "Observabilidad",
      "sublabel": "métricas y trazas",
      "pos": [
        1190,
        85
      ],
      "size": [
        126,
        62
      ],
      "tag": "SRE"
    }
  ],
  "boundaries": [
    {
      "kind": "region",
      "label": "AWS us-east-1 / producción",
      "wraps": [
        "edge",
        "gateway",
        "api_a",
        "api_b",
        "redis",
        "postgres",
        "events",
        "worker",
        "audit"
      ],
      "pad": 20
    },
    {
      "kind": "security-group",
      "label": "red privada de aplicación",
      "wraps": [
        "api_a",
        "api_b",
        "redis",
        "postgres",
        "events",
        "worker"
      ],
      "pad": 14
    },
    {
      "kind": "region",
      "label": "AWS eu-west-1 / recuperación de desastres",
      "wraps": [
        "replica"
      ]
    },
    {
      "kind": "security-group",
      "label": "subred privada de respaldo",
      "wraps": [
        "replica"
      ],
      "pad": 14
    }
  ],
  "connections": [
    {
      "from": "clients",
      "to": "edge",
      "label": "HTTPS",
      "variant": "emphasis"
    },
    {
      "from": "edge",
      "to": "gateway",
      "label": "mTLS",
      "variant": "security"
    },
    {
      "from": "gateway",
      "to": "api_a",
      "label": "ruta VPC",
      "variant": "emphasis",
      "route": "orthogonal-h",
      "labelAt": [
        594,
        275
      ]
    },
    {
      "from": "gateway",
      "to": "api_b",
      "label": "ruta VPC",
      "variant": "emphasis",
      "route": "orthogonal-h",
      "labelAt": [
        594,
        385
      ]
    },
    {
      "from": "api_a",
      "to": "redis",
      "label": "caché",
      "route": "straight"
    },
    {
      "from": "api_b",
      "to": "postgres",
      "label": "SQL",
      "route": "straight"
    },
    {
      "from": "api_a",
      "to": "events",
      "label": "publicar",
      "variant": "dashed",
      "fromSide": "top",
      "toSide": "top",
      "via": [
        [
          698,
          170
        ],
        [
          1103,
          170
        ]
      ]
    },
    {
      "from": "api_b",
      "to": "events",
      "variant": "dashed",
      "fromSide": "top",
      "toSide": "bottom",
      "via": [
        [
          698,
          380
        ],
        [
          1103,
          380
        ]
      ]
    },
    {
      "from": "events",
      "to": "worker",
      "variant": "emphasis"
    },
    {
      "from": "postgres",
      "to": "replica",
      "label": "WAL entre regiones",
      "variant": "security",
      "route": "orthogonal-v",
      "labelAt": [
        1003,
        529
      ]
    },
    {
      "from": "worker",
      "to": "audit",
      "label": "evidencia",
      "variant": "dashed",
      "fromSide": "bottom",
      "toSide": "top",
      "labelDy": 58
    },
    {
      "from": "worker",
      "to": "observability",
      "label": "OTLP",
      "variant": "dashed",
      "route": "orthogonal-v"
    }
  ],
  "cards": [
    {
      "dot": "cyan",
      "title": "Responsables de ejecución",
      "items": [
        "Plataforma administra el perímetro, la puerta de API, la caché y el bus de eventos",
        "Los equipos de aplicación administran los pods de API y los procesadores",
        "El equipo de datos administra el estado principal y de recuperación"
      ]
    },
    {
      "dot": "rose",
      "title": "Cruces identificados",
      "items": [
        "El HTTPS público termina en el perímetro administrado",
        "mTLS cruza hacia la red de la aplicación",
        "El WAL entre regiones está identificado y cifrado"
      ]
    },
    {
      "dot": "emerald",
      "title": "Evidencia operativa",
      "items": [
        "Los procesadores emiten trazas a la observabilidad administrada por SRE",
        "La evidencia de auditoría se guarda en almacenamiento inmutable",
        "Las ubicaciones desconocidas deben señalarse, nunca inventarse"
      ]
    }
  ]
}
