Skip to content

Commit

Permalink
chore: docs
Browse files Browse the repository at this point in the history
add more documentation for aws deployment of loki
  • Loading branch information
jlangy committed Oct 30, 2024
1 parent 13e071e commit a816086
Show file tree
Hide file tree
Showing 4 changed files with 196 additions and 1 deletion.
2 changes: 1 addition & 1 deletion .github/workflows/publish-grafana-image.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ on:

env:
GITHUB_REGISTRY: ghcr.io
IMAGE_NAME: bcgov/sso-grafana
IMAGE_NAME: bcgov/sso-loki

jobs:
build-and-push-image:
Expand Down
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,18 @@ SSO Keycloak dashboard services provide the ability to monitor real-time statist

![SSO Dashboard Architecture Diagram](assets/sso-dashboard.drawio.svg)

1. Loki in AWS breakdown:

![SSO Loki on AWS Diagram](assets/sso-dashboard-aws.drawio.svg)

### Loki in AWS ECS Cluster

Loki has a helm chart for deploying in kubernetes. For the deployment in an ECS cluster there are a few changes to note:

- Service discovery can be used in ECS to replace services in k8s. Since we cannot use this in the BCGov AWS, it has been replaced with a network load balancer. This is necessary to allow read and write tasks to communicate on port 7946. If not working, you will see "empty ring" errors.
- ECS does not support config maps. To replace this a custom image was built with custom configuration files. Configurations that will be changed at runtime can set their values with the syntax ${ENV_VAR:-default}, and environment variables can be used to configure them. Values consistent across environments can be hardcoded.
- The helm chart includes a deployment "gateway". This is an nginx reverse proxy which provides path-based routing to the read and write services. It has been replaced with listener rules on the application load balancer.

<!-- ![image](https://user-images.githubusercontent.com/36021827/211399712-5bbeaa67-2994-460f-a12b-368b13187cdd.png) -->

## Deployment
Expand Down
4 changes: 4 additions & 0 deletions assets/sso-dashboard-aws.drawio.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
179 changes: 179 additions & 0 deletions assets/sso-dashboard-aws.drawio.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
<?xml version="1.0" encoding="UTF-8"?>
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0" version="24.8.3">
<diagram name="Page-1" id="mc4eU51yj473cVwl5Os9">
<mxGraphModel dx="2037" dy="1130" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="zcRw30p6-cQ3QJRuIfje-162" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry width="850" height="1110" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-129" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="13" y="540" width="825" height="361" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-109" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-129">
<mxGeometry width="825" height="361" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-108" value="" style="sketch=0;points=[[0,0,0],[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0,0],[0,1,0],[0.25,1,0],[0.5,1,0],[0.75,1,0],[1,1,0],[0,0.25,0],[0,0.5,0],[0,0.75,0],[1,0.25,0],[1,0.5,0],[1,0.75,0]];outlineConnect=0;fontColor=#232F3E;fillColor=#ED7100;strokeColor=#ffffff;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.ecs;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-129">
<mxGeometry width="78" height="78" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-110" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;ECS Cluster&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontStyle=1;fontSize=14;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-129">
<mxGeometry x="325" width="170" height="40" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-114" value="" style="group" vertex="1" connectable="0" parent="zcRw30p6-cQ3QJRuIfje-129">
<mxGeometry x="15" y="101" width="190" height="110" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-112" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-114">
<mxGeometry width="190" height="110" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-111" value="" style="image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=12;image=img/lib/mscae/Docker.svg;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-114">
<mxGeometry x="52.31" y="40" width="85.37" height="70" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-113" value="Loki Write Task" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=14;fontStyle=1" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-114">
<mxGeometry x="24.99000000000001" width="140" height="30" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-123" value="" style="group" vertex="1" connectable="0" parent="zcRw30p6-cQ3QJRuIfje-129">
<mxGeometry x="320" y="61" width="180" height="97.5" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-121" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-123">
<mxGeometry width="180" height="97.5" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-120" value="" style="outlineConnect=0;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;shape=mxgraph.aws3.classic_load_balancer;fillColor=#F58534;gradientColor=none;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-123">
<mxGeometry x="59" y="25" width="57" height="60" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-122" value="Network Load Balancer" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=14;fontStyle=1" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-123">
<mxGeometry x="10" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-124" value="" style="endArrow=none;dashed=1;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;shape=link;flowAnimation=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=3;" edge="1" parent="zcRw30p6-cQ3QJRuIfje-129" source="zcRw30p6-cQ3QJRuIfje-112" target="zcRw30p6-cQ3QJRuIfje-121">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="435" y="371" as="sourcePoint" />
<mxPoint x="485" y="321" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-125" value="" style="endArrow=none;dashed=1;html=1;rounded=0;shape=link;flowAnimation=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=3;exitX=1;exitY=0.5;exitDx=0;exitDy=0;width=-7.142857142857142;entryX=0;entryY=0.25;entryDx=0;entryDy=0;" edge="1" parent="zcRw30p6-cQ3QJRuIfje-129" source="zcRw30p6-cQ3QJRuIfje-121" target="zcRw30p6-cQ3QJRuIfje-116">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="535" y="176" as="sourcePoint" />
<mxPoint x="535" y="151" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-116" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-129">
<mxGeometry x="605" y="101" width="190" height="220" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-127" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-129">
<mxGeometry x="640" y="231" width="120" height="78" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-126" value="" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#ED7100;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.auto_scaling2;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-129">
<mxGeometry x="675.99" y="261" width="48" height="48" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-117" value="" style="image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=12;image=img/lib/mscae/Docker.svg;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-129">
<mxGeometry x="657.31" y="141" width="85.37" height="70" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-118" value="Loki Read Task" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=14;fontStyle=1" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-129">
<mxGeometry x="629.99" y="101" width="140" height="30" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-128" value="Autoscaler" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=14;fontStyle=1" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-129">
<mxGeometry x="663.99" y="231" width="71.01" height="30" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-149" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="12" y="170" width="827" height="340" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-130" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-149">
<mxGeometry width="827" height="340" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-136" value="" style="group" vertex="1" connectable="0" parent="zcRw30p6-cQ3QJRuIfje-149">
<mxGeometry x="288" y="20" width="250.25" height="110" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-133" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-136">
<mxGeometry width="250" height="110" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-134" value="" style="outlineConnect=0;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;shape=mxgraph.aws3.lambda_function;fillColor=#F58534;gradientColor=none;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-136">
<mxGeometry x="92.25" y="38" width="69" height="72" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-135" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b&gt;Lambda Authorizer Function&lt;/b&gt;&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-136">
<mxGeometry x="0.25" width="250" height="30" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-138" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-149">
<mxGeometry x="288.37" y="200" width="250.38" height="110" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-137" value="" style="outlineConnect=0;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;shape=mxgraph.aws3.application_load_balancer;fillColor=#F58534;gradientColor=none;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-149">
<mxGeometry x="380.75" y="238" width="69" height="72" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-139" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b&gt;Application Load Balancer&lt;/b&gt;&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-149">
<mxGeometry x="308.75" y="200" width="210" height="30" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-147" value="" style="sketch=0;points=[[0,0,0],[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0,0],[0,1,0],[0.25,1,0],[0.5,1,0],[0.75,1,0],[1,1,0],[0,0.25,0],[0,0.5,0],[0,0.75,0],[1,0.25,0],[1,0.5,0],[1,0.75,0]];outlineConnect=0;fontColor=#232F3E;fillColor=#8C4FFF;strokeColor=#ffffff;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.api_gateway;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-149">
<mxGeometry width="78" height="78" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-148" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;API Gateway&lt;/b&gt;&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-149">
<mxGeometry x="78" width="150.75" height="30" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-159" value="" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;strokeWidth=2;fillColor=#dae8fc;strokeColor=#6c8ebf;startArrow=classic;startFill=1;flowAnimation=1;" edge="1" parent="zcRw30p6-cQ3QJRuIfje-149" source="zcRw30p6-cQ3QJRuIfje-139" target="zcRw30p6-cQ3QJRuIfje-133">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="438" y="390" as="sourcePoint" />
<mxPoint x="488" y="340" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-160" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b&gt;Authorized Traffic&lt;/b&gt;&lt;/font&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="zcRw30p6-cQ3QJRuIfje-159">
<mxGeometry x="0.223" y="-5" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-141" value="" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;flowAnimation=1;strokeWidth=2;fillColor=#dae8fc;strokeColor=#6c8ebf;startArrow=classic;startFill=1;" edge="1" parent="1" source="zcRw30p6-cQ3QJRuIfje-113" target="zcRw30p6-cQ3QJRuIfje-138">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="450" y="490" as="sourcePoint" />
<mxPoint x="500" y="440" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-142" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b&gt;Path based routing&lt;/b&gt;&lt;/font&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="zcRw30p6-cQ3QJRuIfje-141">
<mxGeometry x="0.0063" y="-1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-143" value="" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;strokeWidth=2;fillColor=#dae8fc;strokeColor=#6c8ebf;flowAnimation=1;startArrow=classic;startFill=1;" edge="1" parent="1" source="zcRw30p6-cQ3QJRuIfje-118" target="zcRw30p6-cQ3QJRuIfje-138">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="450" y="490" as="sourcePoint" />
<mxPoint x="500" y="440" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-144" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b&gt;Path Based Routing&lt;/b&gt;&lt;/font&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="zcRw30p6-cQ3QJRuIfje-143">
<mxGeometry x="-0.0022" y="1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-153" value="" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;flowAnimation=1;strokeWidth=2;fillColor=#dae8fc;strokeColor=#6c8ebf;startArrow=classic;startFill=1;" edge="1" parent="1" source="zcRw30p6-cQ3QJRuIfje-150" target="zcRw30p6-cQ3QJRuIfje-112">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="450" y="560" as="sourcePoint" />
<mxPoint x="500" y="510" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-154" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="230" y="920" width="380" height="180" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-150" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-154">
<mxGeometry width="380" height="180" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-145" value="Amazon S3" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;strokeColor=#ffffff;fillColor=#232F3E;dashed=0;verticalLabelPosition=middle;verticalAlign=bottom;align=center;html=1;whiteSpace=wrap;fontSize=10;fontStyle=1;spacing=3;shape=mxgraph.aws4.productIcon;prIcon=mxgraph.aws4.s3;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-154">
<mxGeometry x="132.5" y="55" width="115" height="70" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-151" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;S3 Bucket&lt;/b&gt;&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="zcRw30p6-cQ3QJRuIfje-154">
<mxGeometry x="100" width="170" height="30" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-156" value="&lt;font style=&quot;font-size: 18px;&quot;&gt;&lt;b&gt;External Traffic&lt;/b&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="300.5" y="20" width="250" height="60" as="geometry" />
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-155" value="" style="endArrow=none;dashed=1;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;flowAnimation=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=2;startArrow=classic;startFill=1;" edge="1" parent="1" source="zcRw30p6-cQ3QJRuIfje-135" target="zcRw30p6-cQ3QJRuIfje-156">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="370" y="130" as="sourcePoint" />
<mxPoint x="426" y="120" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="zcRw30p6-cQ3QJRuIfje-152" value="" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;flowAnimation=1;strokeWidth=2;fillColor=#dae8fc;strokeColor=#6c8ebf;startArrow=classic;startFill=1;" edge="1" parent="1" source="zcRw30p6-cQ3QJRuIfje-116" target="zcRw30p6-cQ3QJRuIfje-150">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="500" y="510" as="sourcePoint" />
<mxPoint x="450" y="560" as="targetPoint" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

0 comments on commit a816086

Please sign in to comment.