diff options
Diffstat (limited to 'requirements')
| -rw-r--r-- | requirements/architecture/arch-v1.drawio | 113 | ||||
| -rw-r--r-- | requirements/architecture/arch-v1.md | 5 | ||||
| -rw-r--r-- | requirements/architecture/arch-v1.png | bin | 92795 -> 92612 bytes | |||
| -rw-r--r-- | requirements/architecture/ard-005.md | 19 | ||||
| -rw-r--r-- | requirements/architecture/ard-006.md | 53 |
5 files changed, 132 insertions, 58 deletions
diff --git a/requirements/architecture/arch-v1.drawio b/requirements/architecture/arch-v1.drawio index d6c1d3f..5e2d9b8 100644 --- a/requirements/architecture/arch-v1.drawio +++ b/requirements/architecture/arch-v1.drawio @@ -4,43 +4,46 @@ <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> - <mxCell id="VnadkFMIBufCHQUFMUWp-2" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-70" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxGeometry x="40" y="80" width="920" height="680" as="geometry" /> + </mxCell> + <mxCell id="VnadkFMIBufCHQUFMUWp-2" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="100" y="160" width="420" height="320" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-4" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-4" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="100" y="560" width="290" height="160" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-5" target="VnadkFMIBufCHQUFMUWp-6"> + <mxCell id="VnadkFMIBufCHQUFMUWp-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-5" target="VnadkFMIBufCHQUFMUWp-6" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-5" value="HTTPS" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-5" value="HTTPS" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="110" y="550" width="120" height="20" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-6" value="HTTPS" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-6" value="HTTPS" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="110" y="470" width="120" height="20" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-8" target="VnadkFMIBufCHQUFMUWp-5"> + <mxCell id="VnadkFMIBufCHQUFMUWp-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-8" target="VnadkFMIBufCHQUFMUWp-5" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-8" value="<div>Backups</div><div>store<br></div>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-8" value="<div>Backups</div><div>store<br></div>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" parent="1" vertex="1"> <mxGeometry x="192.5" y="595" width="105" height="90" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-11" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-11" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="600" y="160" width="320" height="160" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-12" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-12" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="600" y="360" width="320" height="160" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-13" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-13" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="600" y="560" width="320" height="160" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-15" target="VnadkFMIBufCHQUFMUWp-22"> + <mxCell id="VnadkFMIBufCHQUFMUWp-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-15" target="VnadkFMIBufCHQUFMUWp-22" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-15" value="HTTPS" style="rounded=0;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-15" value="HTTPS" style="rounded=0;whiteSpace=wrap;html=1;rotation=90;" parent="1" vertex="1"> <mxGeometry x="540" y="230" width="120" height="20" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-16" target="VnadkFMIBufCHQUFMUWp-22"> + <mxCell id="VnadkFMIBufCHQUFMUWp-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-16" target="VnadkFMIBufCHQUFMUWp-22" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="570" y="440" /> @@ -48,10 +51,10 @@ </Array> </mxGeometry> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-16" value="HTTPS" style="rounded=0;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-16" value="HTTPS" style="rounded=0;whiteSpace=wrap;html=1;rotation=90;" parent="1" vertex="1"> <mxGeometry x="540" y="430" width="120" height="20" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-17" target="VnadkFMIBufCHQUFMUWp-21"> + <mxCell id="VnadkFMIBufCHQUFMUWp-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-17" target="VnadkFMIBufCHQUFMUWp-21" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="550" y="640" /> @@ -59,124 +62,124 @@ </Array> </mxGeometry> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-17" value="SMS" style="rounded=0;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-17" value="SMS" style="rounded=0;whiteSpace=wrap;html=1;rotation=90;" parent="1" vertex="1"> <mxGeometry x="540" y="630" width="120" height="20" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-18" target="VnadkFMIBufCHQUFMUWp-17"> + <mxCell id="VnadkFMIBufCHQUFMUWp-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-18" target="VnadkFMIBufCHQUFMUWp-17" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-18" target="VnadkFMIBufCHQUFMUWp-30"> + <mxCell id="VnadkFMIBufCHQUFMUWp-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-18" target="VnadkFMIBufCHQUFMUWp-30" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-18" target="VnadkFMIBufCHQUFMUWp-29"> + <mxCell id="VnadkFMIBufCHQUFMUWp-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-18" target="VnadkFMIBufCHQUFMUWp-29" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-18" value="Texting app" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-18" value="Texting app" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="630" y="580" width="110" height="120" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-21" value="SMS" style="rounded=0;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-21" value="SMS" style="rounded=0;whiteSpace=wrap;html=1;rotation=90;" parent="1" vertex="1"> <mxGeometry x="460" y="390" width="120" height="20" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-22" value="HTTPS" style="rounded=0;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-22" value="HTTPS" style="rounded=0;whiteSpace=wrap;html=1;rotation=90;" parent="1" vertex="1"> <mxGeometry x="460" y="230" width="120" height="20" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-25" target="VnadkFMIBufCHQUFMUWp-26"> + <mxCell id="VnadkFMIBufCHQUFMUWp-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-25" target="VnadkFMIBufCHQUFMUWp-26" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-25" target="VnadkFMIBufCHQUFMUWp-27"> + <mxCell id="VnadkFMIBufCHQUFMUWp-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-25" target="VnadkFMIBufCHQUFMUWp-27" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-25" target="VnadkFMIBufCHQUFMUWp-16"> + <mxCell id="VnadkFMIBufCHQUFMUWp-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-25" target="VnadkFMIBufCHQUFMUWp-16" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-25" value="Web GUI" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-25" value="Web GUI" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="630" y="380" width="110" height="120" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-26" value="IndexedDB" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-26" value="IndexedDB" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="760" y="380" width="130" height="50" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-27" value="Local Storage" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-27" value="Local Storage" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="760" y="450" width="130" height="50" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-29" value="Phone storage" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-29" value="Phone storage" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="760" y="580" width="130" height="50" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-30" value="SIM storage" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-30" value="SIM storage" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="760" y="650" width="130" height="50" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-39" target="VnadkFMIBufCHQUFMUWp-15"> + <mxCell id="VnadkFMIBufCHQUFMUWp-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-39" target="VnadkFMIBufCHQUFMUWp-15" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-39" value="Desktop GUI" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-39" value="Desktop GUI" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="630" y="180" width="110" height="120" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-40" target="VnadkFMIBufCHQUFMUWp-39"> + <mxCell id="VnadkFMIBufCHQUFMUWp-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;endArrow=none;endFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-40" target="VnadkFMIBufCHQUFMUWp-39" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-40" value="SQLite file" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-40" value="SQLite file" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="760" y="180" width="130" height="50" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-42" target="VnadkFMIBufCHQUFMUWp-39"> + <mxCell id="VnadkFMIBufCHQUFMUWp-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;endArrow=none;endFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-42" target="VnadkFMIBufCHQUFMUWp-39" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-42" value="Config &amp; cache files" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-42" value="Config &amp; cache files" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="760" y="250" width="130" height="50" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-45" value="REST API" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-45" value="REST API" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="370" y="180" width="110" height="80" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-52" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-46" target="VnadkFMIBufCHQUFMUWp-22"> + <mxCell id="VnadkFMIBufCHQUFMUWp-52" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-46" target="VnadkFMIBufCHQUFMUWp-22" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-46" value="<div>Web app</div><div>server<br></div>" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-46" value="<div>Web app</div><div>server<br></div>" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="370" y="280" width="110" height="80" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-56" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-47" target="VnadkFMIBufCHQUFMUWp-21"> + <mxCell id="VnadkFMIBufCHQUFMUWp-56" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-47" target="VnadkFMIBufCHQUFMUWp-21" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-47" value="SMS API" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-47" value="SMS API" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="370" y="380" width="110" height="80" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-48" value="<div>CRDT</div><div>sync</div><div>server<br></div>" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-48" value="<div>CRDT</div><div>sync</div><div>server<br></div>" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="270" y="180" width="80" height="280" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-49" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1.004;entryY=0.143;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-45" target="VnadkFMIBufCHQUFMUWp-48"> + <mxCell id="VnadkFMIBufCHQUFMUWp-49" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1.004;entryY=0.143;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-45" target="VnadkFMIBufCHQUFMUWp-48" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-51" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1.004;entryY=0.86;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-47" target="VnadkFMIBufCHQUFMUWp-48"> + <mxCell id="VnadkFMIBufCHQUFMUWp-51" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1.004;entryY=0.86;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-47" target="VnadkFMIBufCHQUFMUWp-48" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-55" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.315;entryY=0.957;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-45" target="VnadkFMIBufCHQUFMUWp-22"> + <mxCell id="VnadkFMIBufCHQUFMUWp-55" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.315;entryY=0.957;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-45" target="VnadkFMIBufCHQUFMUWp-22" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-60" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;startArrow=none;startFill=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-57" target="VnadkFMIBufCHQUFMUWp-58"> + <mxCell id="VnadkFMIBufCHQUFMUWp-60" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;startArrow=none;startFill=0;endArrow=none;endFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-57" target="VnadkFMIBufCHQUFMUWp-58" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-57" value="NoSQL DB" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-57" value="SQLite file" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="130" y="230" width="110" height="80" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-62" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-58" target="VnadkFMIBufCHQUFMUWp-6"> + <mxCell id="VnadkFMIBufCHQUFMUWp-62" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-58" target="VnadkFMIBufCHQUFMUWp-6" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-58" value="Backup service" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-58" value="Backup service" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="130" y="330" width="110" height="80" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-59" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.011;entryY=0.327;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-57" target="VnadkFMIBufCHQUFMUWp-48"> + <mxCell id="VnadkFMIBufCHQUFMUWp-59" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.011;entryY=0.327;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;" parent="1" source="VnadkFMIBufCHQUFMUWp-57" target="VnadkFMIBufCHQUFMUWp-48" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-64" value="<div align="right">Server</div>" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-64" value="<div align="right">Server</div>" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="460" y="130" width="60" height="30" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-65" value="<div align="right">Bucket</div>" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-65" value="<div align="right">Bucket</div>" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="300" y="530" width="90" height="30" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-66" value="Desktop computer" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-66" value="Desktop computer" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="800" y="130" width="120" height="30" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-68" value="Web browser" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-68" value="Web browser" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="800" y="330" width="120" height="30" as="geometry" /> </mxCell> - <mxCell id="VnadkFMIBufCHQUFMUWp-69" value="Mobile phone" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxCell id="VnadkFMIBufCHQUFMUWp-69" value="Mobile phone" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="800" y="530" width="120" height="30" as="geometry" /> </mxCell> </root> diff --git a/requirements/architecture/arch-v1.md b/requirements/architecture/arch-v1.md index fd25708..42e8c1e 100644 --- a/requirements/architecture/arch-v1.md +++ b/requirements/architecture/arch-v1.md @@ -9,14 +9,13 @@ - There must be a REST API, which sends and receives messages to and from the desktop GUI and the Web GUI via HTTPS, and sends and receives messages to and from the CRDT sync server via Unix sockets (ard-004) -- The CRDT sync server must send and receive messages to the NoSQL database via - Unix sockets +- The Web GUI must persist domain entities in IndexedDB (ard-005) +- The CRDT sync server must persist domain entities in an SQLite file (ard-006) - There must be a backup service - The backup service must communicate to the backups bucket via HTTPS - There must be a backups bucket - The backups bucket and the server must live on different machines - There must be a Web app server, which serves a Web GUI over HTTPS -- The Web GUI must save domain entities to IndexedDB - The Web GUI must persist config and caches to Local Storage - There must be an SMS API - The SMS API must send and receive messages to the CRDT sync server via Unix diff --git a/requirements/architecture/arch-v1.png b/requirements/architecture/arch-v1.png Binary files differindex d70ae86..6f08be2 100644 --- a/requirements/architecture/arch-v1.png +++ b/requirements/architecture/arch-v1.png diff --git a/requirements/architecture/ard-005.md b/requirements/architecture/ard-005.md new file mode 100644 index 0000000..c0b3812 --- /dev/null +++ b/requirements/architecture/ard-005.md @@ -0,0 +1,19 @@ +# ard-005: IndexedDB + +## Problem + +The Web GUI must store domain entities somewhere. + +## Options + +- IndexedDB +- SQLite embedded into WASM +- Storage API +- Local storage + +## Decision + +The Web GUI will store domain entities in IndexedDB. + +For storing large amounts of data with random access, it's the standard +solution, and is adequate. diff --git a/requirements/architecture/ard-006.md b/requirements/architecture/ard-006.md new file mode 100644 index 0000000..da45169 --- /dev/null +++ b/requirements/architecture/ard-006.md @@ -0,0 +1,53 @@ +# ard-006 + +## Problem + +The CRDT sync server must persist domain entities. + +## Options + +- RDBMS + - SQLite + - Postgres + - MariaDB + - CockroachDB +- Document DBMS + - MongoDB + - FerretDB + - DocumentDB +- Vector DBMS + - Redis + - OpenSearch + - Chroma + - Milvius + - Qdrant + - Weaviate + - Postgres with the pgvector extension + - Apache Cassandra + - Valkey + - CockroachDB + +## Decision + +The CRDT server will persist entities to an SQLite file. + +I'd like to use a vector database, in order for the port to IndexedDB to be as +smooth as possible. However, the key-based API for looking up documents is +inherently inconvenient, and many of the options target ML applications. + +A well-supported RDBMS such as MariaDB or Postgres would be a good choice, if it +only adds friction to the development process, since you have to update database +schemas. + +FerretDB and its dependency, DocumentDB, would be acceptable document databases, +except that DocumentDB is owned by Microsoft. + +By process of elimination, I'll have to use an RDBMS. + +> For device-local storage with low writer concurrency and less than a terabyte +> of content, SQLite is almost always a better solution \[than a client-server +> database]. +> +> ([SQLite use case guide](https://www.sqlite.org/whentouse.html)) + +SQLite it is! |
