TenantAtlas/docs/architecture.svg
Ahmed Darrazi 17f499d1c1
Some checks failed
PR Fast Feedback / fast-feedback (pull_request) Failing after 2m40s
chore: commit all changes (automated)
2026-05-05 01:11:07 +02:00

1 line
17 KiB
XML

<svg id="container" width="1524.796875" xmlns="http://www.w3.org/2000/svg" class="flowchart" height="870.8037109375" viewBox="0 0 1524.796875 870.8037109375" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#container{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#container .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#container .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#container .error-icon{fill:#552222;}#container .error-text{fill:#552222;stroke:#552222;}#container .edge-thickness-normal{stroke-width:1px;}#container .edge-thickness-thick{stroke-width:3.5px;}#container .edge-pattern-solid{stroke-dasharray:0;}#container .edge-thickness-invisible{stroke-width:0;fill:none;}#container .edge-pattern-dashed{stroke-dasharray:3;}#container .edge-pattern-dotted{stroke-dasharray:2;}#container .marker{fill:#333333;stroke:#333333;}#container .marker.cross{stroke:#333333;}#container svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#container p{margin:0;}#container .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#container .cluster-label text{fill:#333;}#container .cluster-label span{color:#333;}#container .cluster-label span p{background-color:transparent;}#container .label text,#container span{fill:#333;color:#333;}#container .node rect,#container .node circle,#container .node ellipse,#container .node polygon,#container .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#container .rough-node .label text,#container .node .label text,#container .image-shape .label,#container .icon-shape .label{text-anchor:middle;}#container .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#container .rough-node .label,#container .node .label,#container .image-shape .label,#container .icon-shape .label{text-align:center;}#container .node.clickable{cursor:pointer;}#container .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#container .arrowheadPath{fill:#333333;}#container .edgePath .path{stroke:#333333;stroke-width:2.0px;}#container .flowchart-link{stroke:#333333;fill:none;}#container .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#container .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#container .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#container .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#container .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#container .cluster text{fill:#333;}#container .cluster span{color:#333;}#container div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#container .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#container rect.text{fill:none;stroke-width:0;}#container .icon-shape,#container .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#container .icon-shape p,#container .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#container .icon-shape rect,#container .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#container .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#container .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#container :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><marker id="container_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker><marker id="container_flowchart-v2-pointStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="4.5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 5 L 10 10 L 10 0 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker><marker id="container_flowchart-v2-circleEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="11" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></circle></marker><marker id="container_flowchart-v2-circleStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-1" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></circle></marker><marker id="container_flowchart-v2-crossEnd" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="12" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"></path></marker><marker id="container_flowchart-v2-crossStart" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="-1" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"></path></marker><g class="root"><g class="clusters"></g><g class="edgePaths"></g><g class="edgeLabels"></g><g class="nodes"><g class="root" transform="translate(0, 0)"><g class="clusters"><g class="cluster" id="TenantPilot" data-look="classic"><rect style="" x="8" y="8" width="1508.796875" height="854.8037033081055"></rect><g class="cluster-label" transform="translate(662.3984375, 8)"><foreignObject width="200" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;"><span class="nodeLabel"><p>TenantPilot Project (wt-plattform)</p></span></div></foreignObject></g></g><g class="cluster" id="External" data-look="classic"><rect style="" x="505.859375" y="412.85057830810547" width="973.4375" height="429.953125"></rect><g class="cluster-label" transform="translate(935.8359375, 412.85057830810547)"><foreignObject width="113.484375" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Microsoft Cloud</p></span></div></foreignObject></g></g><g class="cluster" id="Apps" data-look="classic"><rect style="" x="45.5" y="267.42528915405273" width="315.5625" height="484.18310165405273"></rect><g class="cluster-label" transform="translate(185.453125, 267.42528915405273)"><foreignObject width="35.65625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Apps</p></span></div></foreignObject></g></g></g><g class="edgePaths"><path d="M236.174,484.478L256.988,457.803C277.803,431.127,319.433,377.776,352.314,351.101C385.195,324.425,409.328,324.425,433.461,324.425C457.594,324.425,481.727,324.425,559.582,324.425C637.438,324.425,769.016,324.425,834.805,324.425L900.594,324.425" id="L_Platform_DB_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Platform_DB_0" data-points="W3sieCI6MjMzLjcxMjg1MTE1MjY4MDQ2LCJ5Ijo0ODcuNjMxODI4MzA4MTA1NDd9LHsieCI6MzYxLjA2MjUsInkiOjMyNC40MjUyODkxNTQwNTI3M30seyJ4Ijo0MzMuNDYwOTM3NSwieSI6MzI0LjQyNTI4OTE1NDA1MjczfSx7IngiOjUwNS44NTkzNzUsInkiOjMyNC40MjUyODkxNTQwNTI3M30seyJ4Ijo5MDQuNTkzNzUsInkiOjMyNC40MjUyODkxNTQwNTI3M31d" marker-start="url(#container_flowchart-v2-pointStart)" marker-end="url(#container_flowchart-v2-pointEnd)"></path><path d="M327.563,526.632L333.146,526.632C338.729,526.632,349.896,526.632,367.546,526.632C385.195,526.632,409.328,526.632,433.461,526.632C457.594,526.632,481.727,526.632,561.116,526.632C640.505,526.632,775.151,526.632,842.474,526.632L909.797,526.632" id="L_Platform_GraphAPI_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Platform_GraphAPI_0" data-points="W3sieCI6MzIzLjU2MjUsInkiOjUyNi42MzE4MjgzMDgxMDU1fSx7IngiOjM2MS4wNjI1LCJ5Ijo1MjYuNjMxODI4MzA4MTA1NX0seyJ4Ijo0MzMuNDYwOTM3NSwieSI6NTI2LjYzMTgyODMwODEwNTV9LHsieCI6NTA1Ljg1OTM3NSwieSI6NTI2LjYzMTgyODMwODEwNTV9LHsieCI6OTEzLjc5Njg3NSwieSI6NTI2LjYzMTgyODMwODEwNTV9XQ==" marker-start="url(#container_flowchart-v2-pointStart)" marker-end="url(#container_flowchart-v2-pointEnd)"></path><path d="M235.741,568.802L256.628,595.936C277.515,623.07,319.289,677.339,352.242,704.474C385.195,731.608,409.328,731.608,433.461,731.608C457.594,731.608,481.727,731.608,561.547,731.608C641.367,731.608,776.875,731.608,844.629,731.608L912.383,731.608" id="L_Platform_EntraID_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Platform_EntraID_0" data-points="W3sieCI6MjMzLjMwMTYwMjkzNjY5MjQ2LCJ5Ijo1NjUuNjMxODI4MzA4MTA1NX0seyJ4IjozNjEuMDYyNSwieSI6NzMxLjYwODM5MDgwODEwNTV9LHsieCI6NDMzLjQ2MDkzNzUsInkiOjczMS42MDgzOTA4MDgxMDU1fSx7IngiOjUwNS44NTkzNzUsInkiOjczMS42MDgzOTA4MDgxMDU1fSx7IngiOjkxNi4zODI4MTI1LCJ5Ijo3MzEuNjA4MzkwODA4MTA1NX1d" marker-start="url(#container_flowchart-v2-pointStart)" marker-end="url(#container_flowchart-v2-pointEnd)"></path></g><g class="edgeLabels"><g class="edgeLabel"><g class="label" data-id="L_Platform_DB_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(433.4609375, 526.6318283081055)"><g class="label" data-id="L_Platform_GraphAPI_0" transform="translate(-30.8125, -12)"><foreignObject width="61.625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>API Calls</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(433.4609375, 731.6083908081055)"><g class="label" data-id="L_Platform_EntraID_0" transform="translate(-34.8984375, -12)"><foreignObject width="69.796875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>SSO/Auth</p></span></div></foreignObject></g></g></g><g class="nodes"><g class="root" transform="translate(535.359375, 35)"><g class="clusters"><g class="cluster" id="DevOps" data-look="classic"><rect style="" x="8" y="8" width="898.4375" height="178"></rect><g class="cluster-label" transform="translate(373.6796875, 8)"><foreignObject width="167.078125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>DevOps &amp; Environment</p></span></div></foreignObject></g></g></g><g class="edgePaths"></g><g class="edgeLabels"></g><g class="nodes"><g class="node default" id="flowchart-Sail-11" transform="translate(146.765625, 97)"><rect class="basic label-container" style="" x="-103.765625" y="-39" width="207.53125" height="78"></rect><g class="label" style="" transform="translate(-73.765625, -24)"><rect></rect><foreignObject width="147.53125" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Laravel Sail (Docker)<br/>Local Dev</p></span></div></foreignObject></g></g><g class="node default" id="flowchart-Dokploy-12" transform="translate(384.125, 97)"><rect class="basic label-container" style="" x="-83.59375" y="-39" width="167.1875" height="78"></rect><g class="label" style="" transform="translate(-53.59375, -24)"><rect></rect><foreignObject width="107.1875" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Dokploy<br/>Staging &amp; Prod</p></span></div></foreignObject></g></g><g class="node default" id="flowchart-Gitea-13" transform="translate(583.140625, 97)"><rect class="basic label-container" style="" x="-65.421875" y="-39" width="130.84375" height="78"></rect><g class="label" style="" transform="translate(-35.421875, -24)"><rect></rect><foreignObject width="70.84375" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Gitea<br/>Repo &amp; CI</p></span></div></foreignObject></g></g><g class="node default" id="flowchart-SpecKit-14" transform="translate(785, 97)"><rect class="basic label-container" style="" x="-86.4375" y="-39" width="172.875" height="78"></rect><g class="label" style="" transform="translate(-56.4375, -24)"><rect></rect><foreignObject width="112.875" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>.specify/<br/>GitHub Spec Kit</p></span></div></foreignObject></g></g></g></g><g class="node default" id="flowchart-Platform-0" transform="translate(203.28125, 526.6318283081055)"><rect class="basic label-container" style="" x="-120.28125" y="-39" width="240.5625" height="78"></rect><g class="label" style="" transform="translate(-90.28125, -24)"><rect></rect><foreignObject width="180.5625" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>apps/platform<br/>(Laravel 12 + Filament v5)</p></span></div></foreignObject></g></g><g class="node default" id="flowchart-DB-2" transform="translate(992.578125, 324.42528915405273)"><path d="M0,14.616862215761603 a87.984375,14.616862215761603 0,0,0 175.96875,0 a87.984375,14.616862215761603 0,0,0 -175.96875,0 l0,77.6168622157616 a87.984375,14.616862215761603 0,0,0 175.96875,0 l0,-77.6168622157616" class="basic label-container" style="" transform="translate(-87.984375, -53.42529332364241)"></path><g class="label" style="" transform="translate(-80.484375, -14)"><rect></rect><foreignObject width="160.96875" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>PostgreSQL Database<br/>(JSONB for Snapshots)</p></span></div></foreignObject></g></g><g class="node default" id="flowchart-GraphAPI-5" transform="translate(992.578125, 526.6318283081055)"><circle class="basic label-container" style="" r="78.78125" cx="0" cy="0"></circle><g class="label" style="" transform="translate(-71.28125, -24)"><rect></rect><foreignObject width="142.5625" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Microsoft Graph API<br/>(Intune Policies)</p></span></div></foreignObject></g></g><g class="node default" id="flowchart-EntraID-6" transform="translate(992.578125, 731.6083908081055)"><circle class="basic label-container" style="" r="76.1953125" cx="0" cy="0"></circle><g class="label" style="" transform="translate(-68.6953125, -24)"><rect></rect><foreignObject width="137.390625" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Entra ID / Azure AD<br/>(Auth &amp; RBAC)</p></span></div></foreignObject></g></g><g class="node default" id="flowchart-Website-1" transform="translate(203.28125, 677.6083908081055)"><rect class="basic label-container" style="" x="-79.5625" y="-39" width="159.125" height="78"></rect><g class="label" style="" transform="translate(-49.5625, -24)"><rect></rect><foreignObject width="99.125" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>apps/website<br/>(Astro)</p></span></div></foreignObject></g></g></g></g></g></g></g></svg>