108 lines
22 KiB
XML
108 lines
22 KiB
XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="1013px" preserveAspectRatio="none" style="width:837px;height:1013px;" version="1.1" viewBox="0 0 837 1013" width="837px" zoomAndPan="magnify"><defs><filter height="300%" id="f14pd9ytz8pwcu" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="316" x="264" y="19.2419">SmartTools Deployment Architecture</text><!--MD5=[bf6dbfa945a298ff2f55201b142cffd4]
|
|
cluster Production Server--><polygon fill="#FFFFFF" filter="url(#f14pd9ytz8pwcu)" points="307,59.0158,317,49.0158,646,49.0158,646,733.5158,636,743.5158,307,743.5158,307,59.0158" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="636" x2="645" y1="59.0158" y2="50.0158"/><line style="stroke: #000000; stroke-width: 1.5;" x1="307" x2="636" y1="59.0158" y2="59.0158"/><line style="stroke: #000000; stroke-width: 1.5;" x1="636" x2="636" y1="59.0158" y2="743.5158"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="125" x="410" y="76.9818">Production Server</text><!--MD5=[d64883541e3d62e3241c4d12decf100d]
|
|
cluster Application--><polygon fill="#FFFFFF" filter="url(#f14pd9ytz8pwcu)" points="384,272.0158,469,272.0158,476,297.0838,568,297.0838,568,525.0158,384,525.0158,384,272.0158" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="384" x2="476" y1="297.0838" y2="297.0838"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="79" x="388" y="288.9818">Application</text><!--MD5=[370ff24fc3a0e8ba62e98200d00118e6]
|
|
cluster Process Management--><polygon fill="#FFFFFF" filter="url(#f14pd9ytz8pwcu)" points="440,100.0158,595,100.0158,602,125.0838,605,125.0838,605,193.0158,440,193.0158,440,100.0158" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="440" x2="602" y1="125.0838" y2="125.0838"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="149" x="444" y="116.9818">Process Management</text><!--MD5=[9499d2a3e9c4b5e4d253002427159a31]
|
|
cluster Static Files--><polygon fill="#FFFFFF" filter="url(#f14pd9ytz8pwcu)" points="472,626.5158,552,626.5158,559,651.5838,622,651.5838,622,719.5158,472,719.5158,472,626.5158" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="472" x2="559" y1="651.5838" y2="651.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="74" x="476" y="643.4818">Static Files</text><!--MD5=[5295225a1b720472ed2c31e7a5fddf31]
|
|
cluster Reverse Proxy--><polygon fill="#FFFFFF" filter="url(#f14pd9ytz8pwcu)" points="96,105.0158,106,95.0158,270,95.0158,270,183.0158,260,193.0158,96,193.0158,96,105.0158" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="260" x2="269" y1="105.0158" y2="96.0158"/><line style="stroke: #000000; stroke-width: 1.5;" x1="96" x2="260" y1="105.0158" y2="105.0158"/><line style="stroke: #000000; stroke-width: 1.5;" x1="260" x2="260" y1="105.0158" y2="193.0158"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="98" x="130" y="122.9818">Reverse Proxy</text><!--MD5=[07074073229a58b98d86dbf75a12e332]
|
|
cluster Internet--><path d="M87.3135,613.2923 C90.934,607.6111 95.7313,607.9564 98.9245,613.7256 C101.316,607.5171 107.344,606.6158 111.7531,611.3632 C115.5987,605.7696 122.3717,605.9803 125.7503,611.9295 C129.5564,606.2132 133.9904,604.5846 138.5761,611.113 C142.3901,605.868 148.1654,605.8736 151.524,611.648 C154.7351,605.9172 159.9637,605.1303 164.277,610.3663 C169.0939,605.9217 172.7586,606.0456 176.3175,611.845 C179.6722,604.8896 185.5857,606.3107 189.2754,611.487 C194.1411,605.6237 198.6981,606.4526 202.045,613.0442 C205.1645,607.2217 210.6144,606.6119 214.6698,611.9892 C218.4506,604.3656 225.3111,606.1596 228.8303,612.2591 C236.4093,605.8976 245.8299,608.1431 247,619.0158 C247.1145,619.0481 247.125,619.1422 247.0334,619.2099 C253.675,623.2139 254.6788,629.3503 247.5154,633.8101 C254.2239,636.5719 254.9705,642.4215 248.561,646.2829 C256.2988,649.855 256.1081,657.0164 248.756,660.7915 C256.3786,664.2511 256.2312,670.499 249.715,674.9184 C255.2218,678.5479 255.0536,683.7863 249.7243,687.4237 C255.8167,692.1852 254.6403,696.0799 248.9762,700.1504 C255.7087,704.9882 254.1384,709.3789 248.5155,713.7997 C255.7854,724.885 252.6093,731.3041 240,734.0158 C241.2019,734.3364 241.1335,735.2133 240.453,735.9702 C236.4686,742.3005 230.6654,741.3734 227.2228,735.3881 C224.7413,740.8599 220.1852,741.5486 216.406,736.7557 C211.9778,742.3026 205.2532,742.6547 202.0989,735.3387 C199.0713,741.7502 193.4544,741.6507 190.1534,735.601 C186.5546,742.8685 181.0562,744.0049 176.099,736.9324 C172.1142,742.5425 167.1372,743.2467 163.1626,736.9215 C159.4771,742.39 154.3977,742.417 150.3523,737.3595 C146.5812,743.3469 142.2365,743.1063 138.6152,737.2114 C133.6515,743.3285 129.0262,741.5152 125.6205,735.5374 C120.9373,741.9925 116.4213,741.7024 112.1825,735.0807 C109.5391,740.5288 104.1937,741.0857 100.3146,736.5495 C90.5886,743.6431 79.5228,740.4981 79,727.0158 C80.0728,726.3544 81.1548,726.6475 81.1872,728.0949 C73.8647,724.5613 73.6506,720.6487 79.5551,715.4128 C71.5146,711.8601 70.1541,707.6112 76.4422,700.9703 C69.4227,696.3705 70.4187,691.9729 76.4626,687.3927 C68.6028,683.4849 68.9931,678.7664 74.7494,673.2136 C68.0649,667.6553 70.2739,663.6494 76.3752,659.6202 C70.8848,654.7509 70.8741,649.8484 78.1619,646.7534 C72.0583,642.0273 72.825,637.7459 78.525,633.3393 C69.5212,624.107 74.6807,614.1238 86,612.0158 C86.9422,611.8681 87.5521,612.225 87.3135,613.2923 " fill="#FFFFFF" style="stroke: #000000; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="57" x="134.5" y="631.9818">Internet</text><!--MD5=[88c8cc1bbe8392d0e40b388bb225fee7]
|
|
cluster Development--><polygon fill="#FFFFFF" filter="url(#f14pd9ytz8pwcu)" points="22,804.5158,32,794.5158,191,794.5158,191,991.5158,181,1001.5158,22,1001.5158,22,804.5158" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="181" x2="190" y1="804.5158" y2="795.5158"/><line style="stroke: #000000; stroke-width: 1.5;" x1="22" x2="181" y1="804.5158" y2="804.5158"/><line style="stroke: #000000; stroke-width: 1.5;" x1="181" x2="181" y1="804.5158" y2="1001.5158"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="93" x="56" y="822.4818">Development</text><!--MD5=[f9ba5bf973e7832d2ce5ed59077b93f7]
|
|
entity DB--><path d="M323,670.0158 C323,660.0158 388,660.0158 388,660.0158 C388,660.0158 453,660.0158 453,670.0158 L453,698.0838 C453,708.0838 388,708.0838 388,708.0838 C388,708.0838 323,708.0838 323,698.0838 L323,670.0158 " fill="#FEFECE" filter="url(#f14pd9ytz8pwcu)" style="stroke: #000000; stroke-width: 1.5;"/><path d="M323,670.0158 C323,680.0158 388,680.0158 388,680.0158 C388,680.0158 453,680.0158 453,670.0158 " fill="none" style="stroke: #000000; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="110" x="333" y="698.9818">SQLite Database</text><!--MD5=[745383965df552ee196eed28c44c08f6]
|
|
entity Flask--><rect fill="#FEFECE" filter="url(#f14pd9ytz8pwcu)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="151" x="400.5" y="470.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="395.5" y="475.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="395.5" y="499.0838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="131" x="410.5" y="494.9818">Flask App Port 5050</text><!--MD5=[973ed0ee46117ce24411a1e9e8e36217]
|
|
entity Gunicorn--><rect fill="#FEFECE" filter="url(#f14pd9ytz8pwcu)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="122" x="415" y="310.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="410" y="315.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="410" y="339.0838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="102" x="425" y="334.9818">Gunicorn WSGI</text><!--MD5=[1bbf2b016c5068e77d803223add63924]
|
|
entity Systemd--><rect fill="#FEFECE" filter="url(#f14pd9ytz8pwcu)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="128" x="458" y="138.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="453" y="143.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="453" y="167.0838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="108" x="468" y="162.9818">systemd Service</text><!--MD5=[169e6db3b10d0b8bb941037d67bc5092]
|
|
entity Static--><rect fill="#FEFECE" filter="url(#f14pd9ytz8pwcu)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="117" x="488.5" y="664.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="483.5" y="669.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="483.5" y="693.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="97" x="498.5" y="689.4818">CSS/JS/Images</text><!--MD5=[b7709df717efd9e6df0e9843c5de81db]
|
|
entity Nginx--><rect fill="#FEFECE" filter="url(#f14pd9ytz8pwcu)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="58" x="182" y="138.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="177" y="143.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="177" y="167.0838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="38" x="192" y="162.9818">nginx</text><!--MD5=[feb5939ce823acf5a8245c3205b3c7a1]
|
|
entity Users--><ellipse cx="106" cy="651.5158" fill="#FEFECE" filter="url(#f14pd9ytz8pwcu)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 1.5;"/><path d="M106,659.5158 L106,686.5158 M93,667.5158 L119,667.5158 M106,686.5158 L93,701.5158 M106,686.5158 L119,701.5158 " fill="none" filter="url(#f14pd9ytz8pwcu)" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="38" x="87" y="721.9818">Users</text><!--MD5=[8c1934be4febfaef4a9f4ab6ed25d16c]
|
|
entity Sentry--><rect fill="#FEFECE" filter="url(#f14pd9ytz8pwcu)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="79" x="160.5" y="664.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="155.5" y="669.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="155.5" y="693.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="59" x="170.5" y="689.4818">Sentry.io</text><!--MD5=[0e0fee03ef7cf82177429b42a2c2c9e0]
|
|
entity DevFlask--><rect fill="#FEFECE" filter="url(#f14pd9ytz8pwcu)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="129" x="41.5" y="837.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="36.5" y="842.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="36.5" y="866.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="109" x="51.5" y="862.4818">Flask Dev Server</text><!--MD5=[81a082dc0398f0a3f71e99f4328413ba]
|
|
entity DevDB--><path d="M60,947.5158 C60,937.5158 106,937.5158 106,937.5158 C106,937.5158 152,937.5158 152,947.5158 L152,975.5838 C152,985.5838 106,985.5838 106,985.5838 C106,985.5838 60,985.5838 60,975.5838 L60,947.5158 " fill="#FEFECE" filter="url(#f14pd9ytz8pwcu)" style="stroke: #000000; stroke-width: 1.5;"/><path d="M60,947.5158 C60,957.5158 106,957.5158 106,957.5158 C106,957.5158 152,957.5158 152,947.5158 " fill="none" style="stroke: #000000; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="72" x="70" y="976.4818">Dev SQLite</text><path d="M662.5,440.0158 L662.5,485.5158 L551.64,489.5158 L662.5,493.5158 L662.5,538.5459 A0,0 0 0 0 662.5,538.5459 L825.5,538.5459 A0,0 0 0 0 825.5,538.5459 L825.5,450.0158 L815.5,440.0158 L662.5,440.0158 A0,0 0 0 0 662.5,440.0158 " fill="#FBFB77" filter="url(#f14pd9ytz8pwcu)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M815.5,440.0158 L815.5,450.0158 L825.5,450.0158 L815.5,440.0158 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="138" x="668.5" y="458.9129">Environment Variables:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="142" x="668.5" y="476.6189">FLASK_ENV=production</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="129" x="668.5" y="494.3249">SECRET_KEY=<secret></text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="121" x="668.5" y="512.0309">SENTRY_DSN=<dsn></text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="117" x="668.5" y="529.7369">SITE_URL=https://...</text><path d="M661.5,108.0158 L661.5,153.5158 L586.16,157.5158 L661.5,161.5158 L661.5,206.5459 A0,0 0 0 0 661.5,206.5459 L820.5,206.5459 A0,0 0 0 0 820.5,206.5459 L820.5,118.0158 L810.5,108.0158 L661.5,108.0158 A0,0 0 0 0 661.5,108.0158 " fill="#FBFB77" filter="url(#f14pd9ytz8pwcu)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M810.5,108.0158 L810.5,118.0158 L820.5,118.0158 L810.5,108.0158 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="132" x="667.5" y="126.9129">/etc/systemd/system/</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="138" x="667.5" y="144.6189">smarttools-web.service</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="0" x="670.5" y="162.3249"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="81" x="667.5" y="180.0309">gunicorn -w 4</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="83" x="667.5" y="197.7369">-b 0.0.0.0:5050</text><path d="M131,298.0158 L131,361.1339 A0,0 0 0 0 131,361.1339 L291,361.1339 A0,0 0 0 0 291,361.1339 L291,308.0158 L281,298.0158 L215,298.0158 L211,177.0358 L207,298.0158 L131,298.0158 A0,0 0 0 0 131,298.0158 " fill="#FBFB77" filter="url(#f14pd9ytz8pwcu)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M281,298.0158 L281,308.0158 L291,308.0158 L281,298.0158 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="95" x="137" y="316.9129">SSL termination</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="139" x="137" y="334.6189">Proxy to localhost:5050</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="102" x="137" y="352.3249">Static file caching</text><!--MD5=[608f8c597b553687ab32249caf8b7553]
|
|
link Users to Nginx--><path d="M97.5,641.8558 C83.51,564.5358 62.02,393.6758 114,264.0158 C127.83,229.5258 158.54,199.3658 181.73,180.2258 " fill="none" id="Users->Nginx" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="185.67,177.0158,176.1626,179.5867,181.7894,180.1688,181.2073,185.7956,185.67,177.0158" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="63" x="85" y="405.9129">HTTPS 443</text><!--MD5=[b609a09f17743f632e2c3f848919ff54]
|
|
link Nginx to Gunicorn--><path d="M239.86,177.0358 C289.31,208.7558 389.97,273.3258 442.46,306.9958 " fill="none" id="Nginx->Gunicorn" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="446.77,309.7658,441.3497,301.5427,442.5599,307.0686,437.0341,308.2788,446.77,309.7658" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="63" x="360" y="251.9129">HTTP 5050</text><!--MD5=[6769a91befd225a488ec640435a7cd47]
|
|
link Gunicorn to Flask--><path d="M476,349.2658 C476,378.0058 476,432.9558 476,464.5558 " fill="none" id="Gunicorn->Flask" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="476,469.7958,480,460.7958,476,464.7958,472,460.7958,476,469.7958" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[9c3821c2b2ea80086ffbae169c67c4f8]
|
|
link Flask to DB--><path d="M467.4,509.3258 C451.82,543.4158 418.84,615.5558 400.67,655.3058 " fill="none" id="Flask->DB" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="398.53,659.9858,405.9204,653.4757,400.6162,655.4419,398.65,650.1377,398.53,659.9858" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[3d4fb86167bfce491c1d476b0a114525]
|
|
link Flask to Static--><path d="M483.26,509.1958 C489.4,525.0758 498.39,548.4958 506,569.0158 C517.61,600.3158 530.58,636.6258 538.77,659.6958 " fill="none" id="Flask->Static" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="540.44,664.4158,541.2026,654.5966,538.7692,659.7033,533.6625,657.2699,540.44,664.4158" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[1978817127f0a473b7921382eca39a84]
|
|
link Systemd to Gunicorn--><path d="M516.99,177.0358 C508.58,208.1158 491.63,270.7458 482.38,304.9358 " fill="none" id="Systemd->Gunicorn" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="481.07,309.7658,487.2933,302.1323,482.3832,304.9414,479.5741,300.0313,481.07,309.7658" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="55" x="501" y="251.9129">manages</text><!--MD5=[3c87541b169c721092784486c2b23b3a]
|
|
link Flask to Sentry--><path d="M400.36,495.2258 C345.11,502.7058 272.37,521.6258 228,569.0158 C205.11,593.4558 200.07,633.4858 199.39,659.0258 " fill="none" id="Flask->Sentry" style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 7.0,7.0;"/><polygon fill="#A80036" points="199.31,664.2458,203.4637,655.3157,199.3957,659.2466,195.4649,655.1786,199.31,664.2458" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="77" x="229" y="583.9129">error reports</text><!--MD5=[8a223f306f8ee0d60ce0725198b6b23f]
|
|
link Users to DevFlask--><path d="M106,726.4058 C106,759.5858 106,804.9558 106,832.2858 " fill="none" id="Users->DevFlask" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="106,837.4958,110,828.4958,106,832.4958,102,828.4958,106,837.4958" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="63" x="107" y="774.4129">HTTP 5050</text><!--MD5=[a3ee4cc3f4aa860f6556b91f54aef3b2]
|
|
link DevFlask to DevDB--><path d="M106,876.8158 C106,892.2158 106,914.2558 106,931.8458 " fill="none" id="DevFlask->DevDB" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="106,937.1558,110,928.1558,106,932.1558,102,928.1558,106,937.1558" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[09eedc6ce59bc9693a166faa327a9e06]
|
|
@startuml deployment-architecture
|
|
skinparam backgroundColor white
|
|
|
|
title SmartTools Deployment Architecture
|
|
|
|
node "Production Server" {
|
|
package "Application" {
|
|
[Flask App Port 5050] as Flask
|
|
[Gunicorn WSGI] as Gunicorn
|
|
}
|
|
|
|
package "Process Management" {
|
|
[systemd Service] as Systemd
|
|
}
|
|
|
|
database "SQLite Database" as DB
|
|
|
|
folder "Static Files" {
|
|
[CSS/JS/Images] as Static
|
|
}
|
|
}
|
|
|
|
node "Reverse Proxy" {
|
|
[nginx] as Nginx
|
|
}
|
|
|
|
cloud "Internet" {
|
|
actor "Users" as Users
|
|
[Sentry.io] as Sentry
|
|
}
|
|
|
|
node "Development" {
|
|
[Flask Dev Server] as DevFlask
|
|
database "Dev SQLite" as DevDB
|
|
}
|
|
|
|
Users - -> Nginx : HTTPS 443
|
|
Nginx - -> Gunicorn : HTTP 5050
|
|
Gunicorn - -> Flask
|
|
Flask - -> DB
|
|
Flask - -> Static
|
|
Systemd - -> Gunicorn : manages
|
|
Flask ..> Sentry : error reports
|
|
|
|
Users - -> DevFlask : HTTP 5050
|
|
DevFlask - -> DevDB
|
|
|
|
note right of Flask
|
|
Environment Variables:
|
|
FLASK_ENV=production
|
|
SECRET_KEY=<secret>
|
|
SENTRY_DSN=<dsn>
|
|
SITE_URL=https://...
|
|
end note
|
|
|
|
note right of Systemd
|
|
/etc/systemd/system/
|
|
smarttools-web.service
|
|
|
|
gunicorn -w 4
|
|
-b 0.0.0.0:5050
|
|
end note
|
|
|
|
note bottom of Nginx
|
|
SSL termination
|
|
Proxy to localhost:5050
|
|
Static file caching
|
|
end note
|
|
|
|
@enduml
|
|
|
|
PlantUML version 1.2020.02(Sun Mar 01 06:22:07 AST 2020)
|
|
(GPL source distribution)
|
|
Java Runtime: OpenJDK Runtime Environment
|
|
JVM: OpenJDK 64-Bit Server VM
|
|
Java Version: 21.0.8+9-Ubuntu-0ubuntu124.04.1
|
|
Operating System: Linux
|
|
Default Encoding: UTF-8
|
|
Language: en
|
|
Country: CA
|
|
--></g></svg> |