<mxfile host="app.diagrams.net" type="device">
  <diagram name="arquitetura" id="arquitetura">
    <mxGraphModel dx="1200" dy="800" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1200" math="0" shadow="0">
      <root>
        <mxCell id="0"/>
        <mxCell id="1" parent="0"/>
        <mxCell id="n2" value="Busca-Busca — Arquitetura (visão geral)" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=20;fontColor=#222222;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="360" y="20" width="900" height="24" as="geometry"/></mxCell>
        <mxCell id="n3" value="Java (Spring Boot) + Python (coleta) + Angular · PostgreSQL/PostGIS · RabbitMQ · Redis · Docker/K8s" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=12;fontColor=#888888;" vertex="1" parent="1"><mxGeometry x="360" y="46" width="1100" height="24" as="geometry"/></mxCell>
        <mxCell id="n4" value="&lt;b&gt;Caixa — CSV oficial&lt;/b&gt;&lt;br/&gt;(por UF · fonte primária)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=12;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="560" y="90" width="260" height="60" as="geometry"/></mxCell>
        <mxCell id="n5" value="&lt;b&gt;Coletor — Python&lt;/b&gt;&lt;br/&gt;download + parse + envio" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;fontSize=12;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="560" y="194" width="260" height="60" as="geometry"/></mxCell>
        <mxCell id="n6" value="&lt;b&gt;API de Ingestão — Java&lt;/b&gt;&lt;br/&gt;POST /internal/ingest" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontSize=12;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="560" y="298" width="260" height="60" as="geometry"/></mxCell>
        <mxCell id="n7" value="&lt;b&gt;RabbitMQ&lt;/b&gt;&lt;br/&gt;eventos p/ processamento assíncrono" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=12;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="560" y="402" width="260" height="60" as="geometry"/></mxCell>
        <mxCell id="n8" value="&lt;b&gt;Workers — Java&lt;/b&gt;&lt;br/&gt;normalização · geocoding · custos · score" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontSize=12;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="560" y="506" width="260" height="60" as="geometry"/></mxCell>
        <mxCell id="n9" value="&lt;b&gt;PostgreSQL 16 + PostGIS&lt;/b&gt;&lt;br/&gt;schema via Flyway" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=12;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="560" y="610" width="260" height="60" as="geometry"/></mxCell>
        <mxCell id="n10" value="&lt;b&gt;API REST — Java&lt;/b&gt;&lt;br/&gt;busca · filtros · detalhe · OpenAPI" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=12;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="560" y="714" width="260" height="60" as="geometry"/></mxCell>
        <mxCell id="n11" value="&lt;b&gt;Frontend — Angular&lt;/b&gt;&lt;br/&gt;lista · mapa · detalhe (Nginx)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5f5f0;strokeColor=#3aa89a;fontSize=12;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="560" y="818" width="260" height="60" as="geometry"/></mxCell>
        <mxCell id="n12" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#555555;startArrow=none;endArrow=block;" edge="1" parent="1" source="n4" target="n5"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="n13" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#555555;startArrow=none;endArrow=block;" edge="1" parent="1" source="n5" target="n6"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="n14" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#555555;startArrow=none;endArrow=block;" edge="1" parent="1" source="n6" target="n7"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="n15" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#555555;startArrow=none;endArrow=block;" edge="1" parent="1" source="n7" target="n8"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="n16" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#555555;startArrow=none;endArrow=block;" edge="1" parent="1" source="n8" target="n9"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="n17" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#555555;startArrow=none;endArrow=block;" edge="1" parent="1" source="n9" target="n10"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="n18" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#555555;startArrow=none;endArrow=block;" edge="1" parent="1" source="n10" target="n11"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="n19" value="Caixa — página de detalhe&lt;br/&gt;fotos · edital · matrícula" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=12;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="250" y="90" width="220" height="60" as="geometry"/></mxCell>
        <mxCell id="n20" value="&lt;b&gt;Coletor de detalhe — Python&lt;/b&gt;&lt;br/&gt;consome fila · raspa HTML · POST /detalhe" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;fontSize=12;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="250" y="298" width="220" height="74" as="geometry"/></mxCell>
        <mxCell id="n21" value="GET detalhe" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#555555;startArrow=none;endArrow=block;dashed=1;" edge="1" parent="1" source="n19" target="n20"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="n22" value="imovel.enriquecer" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#555555;startArrow=none;endArrow=block;dashed=1;" edge="1" parent="1" source="n7" target="n20"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="n23" value="POST /detalhe" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#555555;startArrow=none;endArrow=block;" edge="1" parent="1" source="n20" target="n6"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="n24" value="Object Storage&lt;br/&gt;fotos · editais" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#999999;fontSize=12;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="880" y="506" width="190" height="60" as="geometry"/></mxCell>
        <mxCell id="n25" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#555555;startArrow=none;endArrow=none;dashed=1;" edge="1" parent="1" source="n8" target="n24"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="n26" value="Redis (cache)&lt;br/&gt;buscas quentes" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#999999;fontSize=12;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="880" y="714" width="190" height="60" as="geometry"/></mxCell>
        <mxCell id="n27" value="cache" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#555555;startArrow=none;endArrow=none;dashed=1;" edge="1" parent="1" source="n10" target="n26"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="n28" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fce4ec;strokeColor=#c2185b;dashed=0;opacity=60;" vertex="1" parent="1"><mxGeometry x="40" y="80" width="190" height="470" as="geometry"/></mxCell>
        <mxCell id="n29" value="Qualidade &amp; CI" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=13;fontColor=#c2185b;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="56" y="92" width="170" height="24" as="geometry"/></mxCell>
        <mxCell id="n30" value="GitHub Actions" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#c2185b;fontSize=11;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="56" y="128" width="160" height="74" as="geometry"/></mxCell>
        <mxCell id="n31" value="SonarQube&lt;br/&gt;(Quality Gate)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#c2185b;fontSize=11;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="56" y="228" width="160" height="74" as="geometry"/></mxCell>
        <mxCell id="n32" value="Trivy&lt;br/&gt;(scan CVE)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#c2185b;fontSize=11;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="56" y="328" width="160" height="74" as="geometry"/></mxCell>
        <mxCell id="n33" value="Testes&lt;br/&gt;(unit · integração · E2E)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#c2185b;fontSize=11;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="56" y="428" width="160" height="74" as="geometry"/></mxCell>
        <mxCell id="n34" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;dashed=0;opacity=60;" vertex="1" parent="1"><mxGeometry x="1110" y="80" width="210" height="760" as="geometry"/></mxCell>
        <mxCell id="n35" value="Observabilidade &amp; SRE" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=13;fontColor=#b85450;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="1126" y="92" width="190" height="24" as="geometry"/></mxCell>
        <mxCell id="n36" value="Métricas&lt;br/&gt;Micrometer→Prometheus" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#b85450;fontSize=11;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="1126" y="128" width="180" height="88" as="geometry"/></mxCell>
        <mxCell id="n37" value="Logs JSON&lt;br/&gt;Loki + correlation-id" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#b85450;fontSize=11;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="1126" y="244" width="180" height="88" as="geometry"/></mxCell>
        <mxCell id="n38" value="Traces&lt;br/&gt;OpenTelemetry→Tempo" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#b85450;fontSize=11;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="1126" y="360" width="180" height="88" as="geometry"/></mxCell>
        <mxCell id="n39" value="Dashboards · Alertas&lt;br/&gt;Grafana + Alertmanager" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#b85450;fontSize=11;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="1126" y="476" width="180" height="88" as="geometry"/></mxCell>
        <mxCell id="n40" value="Agente IA · AIOps&lt;br/&gt;(via MCP)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#b85450;fontSize=11;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="1126" y="592" width="180" height="88" as="geometry"/></mxCell>
        <mxCell id="n41" value="Notificações&lt;br/&gt;Slack · Teams · E-mail" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#b85450;fontSize=11;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="1126" y="708" width="180" height="88" as="geometry"/></mxCell>
        <mxCell id="n42" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eeeeee;strokeColor=#666666;dashed=0;opacity=60;" vertex="1" parent="1"><mxGeometry x="300" y="930" width="1000" height="120" as="geometry"/></mxCell>
        <mxCell id="n43" value="Entrega · GitOps (open source)" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=13;fontColor=#666666;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="316" y="942" width="400" height="24" as="geometry"/></mxCell>
        <mxCell id="n44" value="GitHub Actions" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#666666;fontSize=11;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="330" y="976" width="200" height="60" as="geometry"/></mxCell>
        <mxCell id="n45" value="Harbor&lt;br/&gt;(registry + Trivy)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#666666;fontSize=11;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="570" y="976" width="200" height="60" as="geometry"/></mxCell>
        <mxCell id="n46" value="Argo CD&lt;br/&gt;(GitOps)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#666666;fontSize=11;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="810" y="976" width="200" height="60" as="geometry"/></mxCell>
        <mxCell id="n47" value="k3s (VPS)&lt;br/&gt;Traefik · Helm · Rollouts" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#666666;fontSize=11;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="1050" y="976" width="200" height="60" as="geometry"/></mxCell>
        <mxCell id="n48" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#555555;startArrow=none;endArrow=block;" edge="1" parent="1" source="n44" target="n45"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="n49" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#555555;startArrow=none;endArrow=block;" edge="1" parent="1" source="n45" target="n46"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="n50" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#555555;startArrow=none;endArrow=block;" edge="1" parent="1" source="n46" target="n47"><mxGeometry relative="1" as="geometry"/></mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
