From 683d9e61e9bee7d0e65327bb23773d1927681210 Mon Sep 17 00:00:00 2001 From: afeiszli Date: Thu, 23 Sep 2021 12:01:12 -0400 Subject: [PATCH] updating docs for 0.8 --- docs/_build/doctrees/architecture.doctree | Bin 51377 -> 53941 bytes .../doctrees/client-installation.doctree | Bin 40899 -> 42730 bytes docs/_build/doctrees/environment.pickle | Bin 77042 -> 77982 bytes docs/_build/doctrees/external-clients.doctree | Bin 13077 -> 14588 bytes docs/_build/doctrees/getting-started.doctree | Bin 28655 -> 30258 bytes docs/_build/doctrees/quick-start.doctree | Bin 32327 -> 35881 bytes .../doctrees/server-installation.doctree | Bin 74791 -> 78421 bytes docs/_build/doctrees/troubleshoot.doctree | Bin 33684 -> 36369 bytes .../_build/html/_sources/architecture.rst.txt | 40 +++++---- .../html/_sources/client-installation.rst.txt | 17 +++- .../html/_sources/external-clients.rst.txt | 15 +++- .../html/_sources/getting-started.rst.txt | 3 +- docs/_build/html/_sources/quick-start.rst.txt | 53 ++++++------ .../html/_sources/server-installation.rst.txt | 15 ++++ .../_build/html/_sources/troubleshoot.rst.txt | 17 +++- docs/_build/html/architecture.html | 39 +++++---- docs/_build/html/client-installation.html | 30 ++++++- docs/_build/html/external-clients.html | 27 +++++- docs/_build/html/genindex.html | 14 ++++ docs/_build/html/getting-started.html | 10 ++- docs/_build/html/index.html | 16 ++++ docs/_build/html/quick-start.html | 77 +++++++++++------- docs/_build/html/search.html | 14 ++++ docs/_build/html/searchindex.js | 2 +- docs/_build/html/server-installation.html | 16 ++++ docs/_build/html/troubleshoot.html | 24 +++++- docs/architecture.rst | 40 +++++---- docs/client-installation.rst | 17 +++- docs/external-clients.rst | 2 +- docs/getting-started.rst | 3 +- docs/quick-start.rst | 40 +++++---- docs/server-installation.rst | 15 ++++ docs/troubleshoot.rst | 17 +++- 33 files changed, 413 insertions(+), 150 deletions(-) diff --git a/docs/_build/doctrees/architecture.doctree b/docs/_build/doctrees/architecture.doctree index 2bdca5dae9abd20336b9855bed20705dec9b3ed2..8ed44b8d235e01508342906435ec5ab06105dce2 100644 GIT binary patch delta 9075 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 D@P`c_ delta 6865 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 diff --git a/docs/_build/doctrees/client-installation.doctree b/docs/_build/doctrees/client-installation.doctree index 08d31e7a6e447a182166eec296ef4ddf5d54d414..a642f99fc0e8cfebba2963d5662ec3b336304f32 100644 GIT binary patch delta 5039 zcmc&&dr(x@8RuTOxT{7$ke~=$7eWA8kVHdNR>4H#Be`m#5;H_yb}!z&UH0NWK+Mp^ zw+KY>TeOaeNyijT+v$w6#&M#PYVt>%8jVgS)oLakQkynrv}yXXlgXstch0g8bUI_& zY5)1|Irn^z-}#;2Ip^-a_e=5S1ySmf27WtuOq!QgmaZ6n)h8PsxxwXe8tuN2HtNNY zmfd^T0Q99j9}F&Rmc0Rw$K_ck`!!YesD6jrrF#67p`B+amphDr+!FBlWlZRC8+K=+ zZ-u%+m7821ySGEOdz_R|cKPLIuhAkeHQH6LPgC7)+3v$pxz5?*^0<6{uibBWgB8Q@ z{y#t_MUhm5wuLr@IzuIzq@C7swYTAH>Lc*8jO^gi2$4t!PNJzpcB;+xfZH!?_BK^+ zc6rryI}UgQZsgss+5K{>S8XE-U7jW*fP6R%k4JU*U53Y3AtT{LXS>U%$$mq|P^0}` zo}9i`d(i85IRb9GS8i32$#Oa1QyKlu28GhXIgFMTn%N ztIh6LG1%#yW09RMug&F=?QBtOd<|N?hTm`)?kTo9WtHqzTW}+}T5b1;hn$MMpmsH~ zv3C4#V2wa!xqDi13Qk1|KY=L^%hEM${hC_vdbTN;cTZ{uhc#(O(MB~%qGpmqnjESR zmDd!Y6F~MDez`s3iqdX&tqXYX+6c{tm$W@BT9UlO9`w*&hy?JgGC3L^l{uEPs8#L5);ob6-N@o`VWCwoAc z&=_@Bv^*uyr03!bP;<%zH348FoXn{b8sTQn49SWpY;dV83ua6#${0D*QmE|Bhiwz5 zn0k24Zo+0EPPRvjF;1o>oGUlr+lj|#mdhwZw>{u-XwJ&W3dlZ`oy&pJ#<6GY4sway z1yL!o=qK(wIw}nP00+CDc$OX^utZYD@qc$Odr&354xe9bamsF&C$IsoOx}IJA^Y?8 znvU?|KVikEv*JW=Fu&|BdZ#gZKhCc+o#8?65WP%trxNL{4zDRF7fctq+XpQ7Ow4_X zt^SaFMKFEB$F8xl*=&sJjw@VrSKVr8F7yi)R{fuam8Nfb=r_^ocM_}5f%QdSiDnTT z5B*5Ug7wt}kXt-DGh0kb3TS2eczj|#Gd`fTtwgHD&K&{<9mUT}T!kMMFA}U6S(p*o zC8ZSHgx^rJVNY=l^gO&sEEVC)oaxfMXn0Y{tVsCUlBL2T3O7f>>qWR$^0bH#3VAXT zGFcuwR!tj}? z%LVg6?sGtdvzF^QM93(~1ao!K zSS^dGegkc9 z%Bs3&o(}1sW4kk?{}CUH1s|<`9HIt}=rYP~>B`4PvZye!Ppq74E=XpA$xCKrPoiFo z?8fk%hB@N+snNImFw?F>|Efk|IwCDJ5n<#&a!X&0o#7m8O3Pm;oggfTOiB6v)3LL} zaJeiKY^@7NPNxy}wLU8>WRn`T-fA}Zq+0l-^eB9GJT`|r*N+p;o!sZ8WKvM73-jyA zYypRSx6D0!u$v7^KcGQK4>Uz~fImoNF%9jt z!pVe~GNb4yk?0czJ9Dh4H$LJEB z>ueVOfx(6JjilcWzwpC@f_R%p`X~~nbu|dhjI_b7ndZC{ri9!Sri2{o#gx#_-0C-3 z%@y3OoV%4Kx^0Bhn@*;)V&2GpI>P!_4*8K>Cg>_-K12K~LH7&i-byBi5=M|b524UCiEt?oy~bP4Ku zEW`K4Sk{XtdOKz`No>uC=*17j9i$}^4DOmEmPyc`V@V}R7fX=QQ#Rd&UoD*LFBG+F z@Kt}M&;#<`obY>nX#$u+HldHYP_lc-v>Op%g+9pGGb433wi+aMcCFbndt|+CwzJOd znQuDEg9b5(e|Q|G7qLAEu(E$zJf0IU(Eq4-GRDYp&d2~3JdDkf%<$uTFA1g#Jn?yk zWk5 zU1Uy@d5g>~GB?R=!~0O*OlBP(in^1`gJiPEtRd4#W&)}}A5SKm%4L#Sj&szP1KTg3d5%`Yzo7rFiZ-= zqcAKA!=WICAm(EA6;@keb(Mf7Qzb^rSnaU3Nc&EElM_NeiZ~(kGldgEKMFV@^!>^S zp>Ih}2z@PaLg?d&6G9g^BV;;Wh1g__(C*Ne(d6l<=Y%vw2_c0tLiC|<=b?JxU&>1_ AYybcN delta 3528 zcmbVPeQ;FO72o@I-|`lLY{&4Z>Wv_3a=m`U4f*;)Q~&<&%{jMW52%(7tJ2o#;(plvndCfY`2@~-`Vmi^d=O} zzCsB#()l!>W>jQ`{$$IL%=8Pk`#Dduv#Tqi;>-y$*FX#gfmLaS+FnB^;qxp9vB1T& z95ZDKGy|-$7fA*JJzdM>9L$6l?A|%_Of&^-fK0GuXDcqOXVaXJXmi2^n<>)~A>d;2 z7=?35Z=fr%n9BXXfS#P^XBGzNjOqYQ70cwpKwlsX&`L$Q6|9_BUc?GJ;9PEUw|5h* zYqhu3Hn-Qc)VA9F_ST15+iG|3aMt)+Yj@b|>l)fS?2S#eE&jH;hF#&^2+cRl)>SDL zLe^R?Yss`M@&de;FhALEZ)j|Ah82am;kg9|m9WdNMGY&JqV^VEJD=Ako@5xybHw&M zkN5mqUb)gDGMc7)ZrzPP=mSs~>RebrlpX=w#|yhz;oaEF&{vDzC(3}>>*sqOzK5g^ z$GTY3Lg;g}L3e5vq~*JmpNXuWM2OGE5_@4Ne@c3Z!2W_U@+uptEGTi#OuWQU?bM;Y zBGTEu+wYKz8S7b81Y^#v5}U&t&UNH6&fyF`haVECFC38A9~{Kx5%gMD38D|W?j!$2 z^lXm4i5xXF6^h&$u-Lssx+(HjMDk9$@5a1O+*KqUhJ3kr+_V&EF4`=mNSvdTV~MAd zczLfM^0<_h5})r&nBYWDuA*e(M7em_9CAJydyJqzTFjbCm{BLqqAvBClp@D??Yk-L=j4zGdX8=<4Is)vfpNOkuaZ zMmrF??t3YNJRc^iSUJKfX`>j9v2aKmW3k^(|868eb zu917oHo`fN+nR|h-CT7DI_5~0B7t!srT}lac{}6CH1eDIuZKUitQ3G!9Z;hKO7^Na z?2qleLt1ZyqrRM3IPDcIg&&f#t`$(+^=(oC{{3F_4n6OUuG5(J;Jz}cUeBY`dA;3( z(9skW3YBxi(f94s13RT3 z8=<@~XL{C8h4%IZ2|2~dG(mC7St%NNxW5Y2Yw=&}sRb zfc;g#K8l4k!^a0-oJ}VqXX7g)OdKkb{>QzTv3Fl`X^H>FL~*#<*snK?P<(iG+`&qR zLx&ejHWPZ89>RGhybJt3VqP-eROXuaAlv|#KPO$g9$R~gE!m)cVT7h5s`MWtTsV?F zD@tP-OdVM$-N_4ci9TL*UX;W=jH-ljurf)ox4+`{*eAd?q!+K^JQzHZm#DvqshOo# z#aP&?Tfn-T#b($-iHRMu?2Kp+2tp5dtA&sE9$Sw-77pY^`{;#j0}kmC-ADH=J|1SJ zI&~lO!8}+H*YqIx2Jeu@V-!EGE5-_=F^W5HRg9om#ic`4s5m&}ik^;_P4L0cQt1_4 z@`YO@cd=UMb;(&Ue6+wC+y1|p;PsEjs9ALyE~#QQOt&vVUlqq~ftDI;7QUTFCY zn{CrRGQ!mG25a0&Xl5s2y<(L)WDXRK6=|Aumx*eZ`~{eW+64<b;F&T=-i{n`V_KjDOhR}!O z9g=iY4sAa9q_O)Q#;Lu9#1r&s?T74ZMmvpR5rzdAGz_~ioWO7#Los^;YRfR#*uB@% zFuab-OBj-HX~pn+46kB%4S9ZtLBSwn*d!a$4B7^~9L6w+;bjby%+l#3E>5KrD%YiQ zO)A%;axE&?p>ho>=T|wm%6V1Jsd7FQxeO|&Q8|U$PVMY}17Up@eVVT0zUdimnqEQ2 z-3AT+s}Pp)TUS`dk56G4KemKr{J0X9@l`J@sti|nfGuFR>btf|bJ z?v^Zl;17_-Bx112*nHl#KMrAmWLUh$_`-{gZ7}PDg|&><7%(3`cD;aYu<>GJ@9)Kn zJfmtlBh}TT{-d%pBJ#zH_j~Wfiz6dnzxAgszUbnM=+B>Vn^mi^GG{iPJNx|2Mzh&D=8sgIvez=riq-1)^Yc}wZq6Gub7g+XnRi>| z`G)D$jZ z@h3d9-mDp(>6V&?S0z?PN?{tRpE6gvq)mSxmB{&tb=R-NUN>$F>Cvt~6;b!@L4cgoyTOBx7tKS155=qmYtf@Dm7bH-Ds^M!)jElB?r>w z45M5Y8ah%VNQw)!Hl7}?IZIB-f?{<1!S9(}F>ij^_d^s*HD|%7c}}@hF`JP1;Z6Qb zlm>b=qX~S@w*7II5wj+=XVbOU0-=5W1d%R!P@y?00~kXJGGV;tltnE;0oOEIamBvZ+BG*B@`R>#(iTqSJ!H2>Tv% znHIG31pimKiVPOT@F3)ShqW{(lD2xr0x8MRNxF)pk+M@U0g6*Th3Ai0u4grtD5vcY zoH2kE$#!3LCsbiG98Txhqn+v{)xFgp#XtVEG`~{J;w}RFLhe*@cXdy-OeF_l=VZ^F z>VkN*dTI4VOk=C(RE*Ui-5(aWrNz3}ImQKsYDQzJZ7i8V!l;1HEWsNI3Q1FyGfUK%FyloYED!qNcn!xhOD%H|+SDkUCAVpm zVJosy;ZE4`xk2JYb9ITj54YrctAZB+)=U+aDy%h>ArO>Y%T`WDWg=I^4ZW;-IfFhK z_{!1(e7pcq&>uf#n$6O((P}_~Av4o%yV-=syHU;qva+3Mw}1nRRPDjpRdt2O4HURxc}=T)YPEA#6q=CtC2Ofc{lNqL>;PMK zfXy~(=rC^l7x=@AS;Y5LPcV0ra01m53M@cxjan^udRnBLry-}nRY-0|gC}4mLGwqv znp=W}T8pbe(kLaBp+GIq4Q1MfLYL4y1RMc17f#sRdr;wJ&?`t&7k0hLHqgfoi9m!5iJbdp2pA4VI773|^u~o-UO>k!J1vGnqy}#1 z&}~B^c)G~nLh0nj{1H)td*SM{)n_SfCQ6HSv79H%i+;Aci_=C$c^OZ@EeaycP|y}A zlL@~ka<~Tp12xO7nypUogzQ)}K1&0Ay6n<7Gg0Q8k`eMrGYpHm=un_8kH_nW!IuzXz_-!9r&H)MKg*{V>? za1lSntr2by;SY6)Rs(?)$i|?6Mwi&pKgP*Zf+hmea?27S7RgXNz&VIm;6@hOh~&bY zY4OZ*%c8!Md^Eb)5d@glgD8xEPCQ@zp6b=oEsB^y=v@$6h>Yqr)oZ0c;}RUvT@prg z2ucfZUu|;P2u!Fq74A<4E2z;6!oam3;utjH_lHHb6h6Vc1?4f3vWOUwA~jB|9;&{I z`MtCHYX0Xy^&pp@6y@O;TSlU3{thOM{o93elnPIwTog#lHfrPO`UC@B#0r2;4ljzw%tPnZ}A$v~<48U}-F z6+J3qE(+sYkQK)bMBt_pc?Bd&_z@p?RT~aVj3@mc2}We)O2c;N$~C85L0r-@#n{Y1 z!TFlC;LgjZ=5Lt$zPaz47b8+{&URk`c+iXAdeVGNasSa1#iK`$lwNi6=nhyAg@iG*x4|BCP+tz>&Q{I>^d$9 zvm)o=87-tz;J}dV3d+>T55Y$@T*#6p0`}Z-?~x;gWBZTZUbyA)|}H?iaj<)aIL^vmZi zQaI?F?7#p$(T7R8K2xpO<4>e9%`eD@j8ak^%17WK3t?saSG;uprFEG z%6M}xXONrW|LPc%z|Ys(^@fa8C3jS01@1NoVE1r&&uP}oGiI$M$DcGD;`n$w7f3s5 z!H=XF>z6k*(BBa3+xRh&MUEfAEBbnoHNjb!pAq8~^avt(Cnv``j3D+9*`u7zA)ehK z?TXdIJ#b_fB2S7d(L0L_$pMfmLw%@ElI7t_5Pp?UrNa3M@-du2;b9Qv?}?II=4lMC zy;9XQ;5kBy)A16BHPFQ!zF5>1%kiwb2|q059m`mDTA0JbBU{st7>zO_1UO@nu{)|o zW<>n^n||~PsZWxWPL5yrA|&x3xYl!fHWs7`iAsY&a8W@lc?}u;_RYLk79m zIDB!SwBz((q!5hwC6q`Ll7V{BcpuXn4(6D+#5NZiS2MXs4JLwuNMag>V>K2X8qAA; zDKM>wDa7!5?Jq+q{LAlZm<6=dEW`r8g0ol%rx(YMS}x|{5Yt2KZfI^ZK`p9zO$Aws z&ITD>%_HPHl7~MO4DMOwb_4_(Xr1X9Rt+}MmO`QDy+CB;D&`)(VI0Ya%xA+yM{TUx7-%q1_jYE9<%ps;tq3rlwC2; zU=C=BMhE^@vr&Y$hQ)SA#bkBC_}IVr`l#4MRE*>PkU*@SQwtD2rlV-`J+$s3&6|g% zry@EiP0>|Xj$3A(Ca#kCyP{`#<|lApXG8LPq9S#xf!?@PFV)b`!r4ak#02M}!-9LP zxSi@(LLxC9c^WaEIT_WUOs~HRphZpH8iaU*7 znJgvZKn{syhL{!=lb-U4F`2;ufWNhYG3A+Hs1eUoqT_9`btd#e%_apm7={WjvMZj6 zIkKwk7t!fTrw}g?be6|NUc0?OD<%}TV=Mu;K)pM>NIZp5Xc>@~KY;iO)3aE;i&nZO zc%U{H_DzGwK=%J(`HU{V`er!B9mk zHo$YVT?Am^EVw^Nle3s#Kxa}z5Q#x4@{9!vLBM>?0+%U*SQ}$iDsnbDnlZ2CVCu_+ zqjc~b)+MnRH;AUQ7a2X>#w=+OTv0t@`~a!*y;l%SF4> ziB(J~VjkTiG4D!eT5=u*dBLh`NDYgohd2A%Q;!IXBwBk?8Mbl8;7KE5V_Pbh23wTA zBbDA<#Y$vDtaGJuXaxulq}g)43X-ckz`+1N(K&o`+utr7IRu8T4}rcw6-$PRbPU8W z-+UH!>(Deeg`EBnWJB{-bOV{1m`O(GPs;(Ap@i7Z`a3W#HBOaGJW?wmG@vdVG!G{+kCN^@mdoggaD{^OdaSirj?uudo7X6X|CzH) zZ&A=7-$Kt*>BRFBRwFSPQGLjtfVvBJU0R`4GFmvL5sKShNT!Zdu?UDB149^CuD?_G zBS-~P-sn9sVk3`OK|8m_C#-|TCM^Dm1+nU8f2|c5e>|8A1~!-+tbWBG6C_K)#Ch8v zf+AWr!R^Om6KXSGm#Z@ z(&`Pn0z>D7N3LB-IRd1g_@0kg&wW(2N6NbTvyH~V?jD7*_wCw!(X*6 zuOC3c;eR%h8+fAgrp`T`efGORhuq;Vo>QL3idwZ;u?(z;*XNq>_UG*P$|Bojk)Si< z>`1_Gi+M5pFMTJa23`~Y3vc(fj{Q`s-bOvBwRppv-CTm_i*Y15dB1$<(twk4;BAXM z8z;*7J7hL3xw~%hl)1|3Q^8{tnk0*sTPDVJMKq1mcLzn~1VpicXE=7=2Er0pgcy%y!|TxjWYtF(}RxhP3p z=X`AMi#rboGq-A>#5wzEN%S&v#lYSTlkAN)H^?rkiugfHwE8^?*pAiU0#~Fdh#tBq zQw2lkQo0LtmqqQH%l}g9{FJRUFulON*@W(NAiFpVNtd@;cw*!S8s$*=4sd_^e{VH!Nv`;OeSYVBoY&#&j z-t#n|YYFE2XZytWGi&obc``PVhV7*^CY{UteyC6U{^HvFj^9l~`#{V|Zc};8>nHle zD~%r3(21$r<-|pSmBUT4t7bFDf3}_++g}Ht?S-~KQgbk&NgF|;FiXTe9G6fa!O;M9 z-D1FEQwL~^UW~dRTl6E;3E0Aulj9X*5StvHExZ%C5)qEuWQrn&wn@2dp^2n6w!oM` z5uvRu8jEdMa=a>{KaSu=7uwj{$_xKt+?NWPM5s4RTLVg%ajN$ywlCNjJ%>358Bb2j z#blbOr;%E-+T&qn23wisX2@Q}MEuqz*tGwZ6h#DU7j4lE)+oy6xi3r}41kAr%j$51 zJi^o1BFL;Ra8yUzsslE;%72BR5!hEH{h_UXe7TF8R#q75x&oKRvq)o{E-Bqh0Z;Lq~?yQ>c?`zf8M!Nn%$> zVsB0o*!>t<1T(W+P+E6rcD>43M!0Q8*c9%^s&NXSo~4+#JG5Jw(JK61vv~2LSOI?_ zPDNVPR>3-;&4U8gZFxz&0uS~TrJeV>X5j!PSKR_;F+(#-T2Ze;%$cp-xa=5VPe`#$ z+!euH2$YJ^k~R+tMwPrI(ioZg4mHu8u~gZW>eI3#cK#l&Gmn3_9~YvKa}vG$Z!cHA zFRw38&0)j?e0v65uw34&4O4e*qX`#G>4@DbiGI?K-1NJ&>r%Ap=U9{**CP(oEYZDU zSuHL>KbFpd{DgMnG78cknZ=SDb_CGUo)kzV(~oOctH|_Yc}Ya3@#_prFCEUS!V~+k z2aA^DatJ-xdSo~#P5`D*F_Z{NhH8DAfRWI(} z4$$_G1S-9YF+QVPb)9HdeD=)Jx*#hDNV#NV}A;dWk1Ow9wG zuOK7jX*V(}LVFVk2_F?KOyb2|UMh+@_S4#YD0nsUlIS~Lll#SLbK$VL+Qo2`Tt?<+ zw40L^nW@=m?cMEeK0l>hxdO*e<|Wa0I9`;3<9rshMp=gHH?^CZ6{^e9P_1Q0zoyNK z0^G0UCDC`_hL6#Tz1sD}(ixC1Yd0Y)AS1J4mbbgr{DpS4itzteUJ`v5{;p8?=d+id zr5Knk1O1AJcSpdiWg{1BGoirr?=M)GhA}1A>SiNRIzzEfTMF521QTzq9zDxd+SMw; ze{o(CeYcU_p^$}*xIMzM-o+T2Biaqj3eBF`5E?mZl$*c0gk*PWbD!vOV4{iM*HgQd9%UG#rgqb^VzhG>)zM`0>|TdNu=S(G4oH;_AEu7Rmedi;(}*L zbC8I*;JNP{BqA<;Ht+PJT*BZjj2pIup=@}JPc_j@Kfvf)E#>AJ1S_{}=7%WfY}9I*U{BirC#vTu7Nj(;fe$U9Te6 zf6PlFvX5^tGV47(HBR!!Ho->4pcfev5Tx=Lg-Zw5XH=jlv_BzGz}s4q7X^qt+Ept+ z?95A|??7xPAnq~UCeEm|7A%|uL+_s?@aSHIVYyAaVOfo1hkym|XeBvQ(79Ec0|lKQ z$V;N{=xjY94vZkD%70*%53f=LZfIAj2>eI$lIXj@M{mbj3plBiqWz>5 zByw2zk7+j}tMJEW%@`jF1aH!=Sb^Zj^OER41pDP73-s!LLi0!CISj!w+RexgLGU&X z@u5KQe(j1C2;P^ML>ht|0dN#UbLf?WM8w5s@`f2QhUV98HY|qD_!>@J_3XJYvi>V= z)VgaNHF~Yc`YYOXDN6PwK_W+FoqMgl%P!>Ll{dE8EjYqbZ`W8x3Hk%G{3^dn0ybCW*+GM zK)Z;R;;>O1CK;YQJypB zYB;ROAHiFX5g#m}sL6PbAHx}()azff#>wjQ;_v}J8+r>J-qSgJC9B4zd2x#T8RPW4 z{Mo-U)V;<$xh*64x>nr3_{l65#&K<7WVMs=*~BRsin$!su30gcR|^t7{f=EgezzU` z8e3b>XCldCK)PDWGC0^sOR;|d71}SSpIhkXR{R{EW2me6U(Y2(w`F~dMf?CertW=sEMvh|1ofQ!Il1I zM*4#+tv-7K<@}wla(VWJAeUR?a>-%IkuzXL%t0aw>ig9RZj-BOz2CL%T7pIMPeNsM zUMS1z9JU85YB*sfI!;P)691^pfZ`;+!D`=Y!+yVgMAu`py4u90!!H0|afpE*2QSaF zgJikCFm2-byuST%ZP8@62|m#!IHQM;SW|4`W^D!(n|P@p(X-?1yG?X!XIGn80HYVY z|Gb-R;zVA#NBsoL{RL?g>ig-50h5}|LV1I>P_kOX^sI6cpkfM-XxFZo!b5_@1v3Tp zxWle?@D#Yb;CApM4Ea0r3O%v|7Wxa)4h9as;FH<{$g1;$v*N=lU3Px` zu6CV@rvJ7ealtfQ9&guGy}u6DF1UJ|jP956N;*<+mh=l!z0dPbZu&ej7RUIAZX}ph z*(bysSHKEemDW|`ZvtZpjlUSj&h>HLxa(}#X@>Z!ymF2- zp5^?4)c9Oy9-Yt@Nmi|&nvI`kOlL4DdVgHIaz*ct3KADg?~^AscQt?q!C}GxHeCP% zc!&+)R9=Bc2EYP;K^nkdaIjw@pbt}71n<-qK~{wynhj2~RTTXl+LbDb{)8ZL!4y3_ zskf_+e;mwRa2G}^_5%}$(OW6l2zxYX6XQ7aSnhyMpe=M zFKAb;=>Btp#D&xS-~|4zx<4?Q)csfg2mUUAi$BL$e><&HKKX3cD0JKUoJ>oIAsq$U(r?BkGw#X{hf^Rt$D>ADLadM z9h5x>iHHl{O_hU0w66ArynDKc3!ItF=Q`_dmdktIP0`!|DWpuMPoxTDv*j0ijTKbtwQo zDMQL3#^cJ#qJ_bwj+e)(y-GguBc#+ zX)~mNIh>b7-@&~6&e+MiM&Z8W$M9{@Q~1;czCC#C_^}j@YnEmRZ`5vXR?ED6Hg+O% z(I}p2Hj2bAzUI@aG@4!B;kZtl7X`gyUJ`vr@5+NtVby8lbV8iTT`(G}1#I0mTg{f` zng!{wQV?c)gmJuIyWv@Jyb>O^2+lEE0nUryyclsFxLVZ|PiixyfO&Ub5`71A$Nkk+ z;Yv@OIDVucKiiT*uSXe%>mlu?Wrb@8P9t9x&eFxV)nRe`RYfV>=ym25Z4MNC+IdN& z@yRiOi^hN)Kjk11aq-*z>3s+BjU{VlYygP67CI^uGA)^f&K&HQY6xS{LHQ_k&tJ?5%S1W4WTI0yS z)UHd>rY{N-J;#wfzg3WX7&#Mujpbw;-+s3Ye3dvZO21nHw%E<%>l5`VqV=~$TiU#k zE5&#((ym_-_jk`P?%u=pyaSQR`><)sDfE!FlFNd=QoErUb=aSpJwyBy&m-k4v@2Jn zd|6%+k#pKBNc2?yyl_n4-?BW2+sJ&f$?k;uwfYZXKWgL9L zuZeHV$A#;s^4OVtP`l9?<%~0g%HRdx`<1*%FYupHAy@shcGZ%^dqWaW2@*L3oY!d& z-*2_dLv0+;l$32Oog4Qj+KtO9*OA#}@USF!P-Oat+SMvD{ezq&)NfqxI5RUWk>8hDI8|c!CLOXYUF@Z$Ekambx%cA@eEdmw`&VE zt1^rtqzbu^U`A&6xOTmYKD;vt5zv->Y4*0>SRQB>D~k7VBE(!DA>J?(S&AHnIj26T1igyd< z)-KMF{knF8vqE--7{@Tja#Lvdt?^#Q{ZVah6a;@cFNwY*IC{jYTb?*eC}mKI9LD8~ z+Rey{%h+r!#)o1=f397z0>S6=l1M|4!#PI&mDgo*kchZ=W8R5b;sR@K@5j1S&vEwp zPhU(PGCkfb>kXEhzSsZXcH2ww^G(b~7PVU#78KZ`N*PM!DjAXIIoMP3>w_#8tjjyGlu7 zE+lb-AkkBhJ=HXCbTM+EWf~X(RUPY=W za*|LN*pBC=)Mf6Kv5tJ=+LkXHwhSg1lX=0;x@*PQL9o|pIwlvO^=GWRn6W%8tT z?2ufvmfG}QGTy(v$HZH8ChR2XnAa-Iayz5l=&ZXtcY+w6{PF6c~C%_6C^e;Y`^NH>3Rhz@In#OTLoCgOXzyS zEVuD8&7pgaA4npR@fil@UTvXd1!fit->w(Hf$6X!SrIO-V7$20YL-=y?$PE)0qL&1 zBqB>X!Z@$@{>42EA8?d=h6)EQmtxE0f|q}ua*W!lb`!Irwi}!11yFKVQLz$ms5red z+Ds@=xp_&Xp~}&RZARTJO}6SBBqA=>=mvAU-b;^IjrL0D0G2JU>a@KAJLII47J%YprI^!|kV%jYvNoKLIKds%wtim3j zWlnm9BcIf+SrP8<<|Pr?#BVb`>+M9x?s-=h$L`>1br77+WHCRg-OQ|Fo(!ho zdk%Wvs9m=r;y2_a5$XOTjM93C0^6`+%^PwH2Mx3CG~kAky5F?~qw=(Nv$CSHJ$gs1 zSPA)(a*b9)p3-JOf#%7)B+}62@NAKDWE;#uBI05V=a_dI@ycUMR$~PVXlKk8=AiLT zz{)E3n*|!66sn%rOzmjS_6V!cpKFUhs|sB;+aS)dm?k)x=SAjR(W%dC zbEN3hpXMczMl**(L^{O_gO4h92dmttR#SQGb_uSdQhtn$U zvRGC396F?hyN`sN{qvM#@xN4C78%9wUovaOcr1EObe?q(K3$2*nT;E?*^tKmy&;MD zoFvpO5ib#x)_s9@>X<`;Ep|cNZ#62;a>`q)*({nL)^1l;gr+e;3XY06U3^(`B&8Yw zbH8@&3NR=0k~o0}Sq5t$l6y|_GFq2&#e3juZz@`=FthrIc5Ac3b@?o<+qp%0L!6H) z>Auk@0`DPhUKH?F1c?pwY?}`pNxl9pQdqb@uic=m!rd|p_o@1&|D;`^BEfg&B@wCr zI~auZ9&-%vNF&)}1c@y0PiQlrRp5iOJf2Wx{&DR(6`6l5FNwa(eCP3&b%x%&5xWA! z_WHW=%6G3qjLF|oH3@90xVjguyu30@Sv*r8pu zq8BrHNn{2hcesE#>Dczrq~A>CF%q|Ew_zmq=tNJmbw8r@_;|AU9}?L`}2~BH2ow)wBC_HkA0?zt-?LZFfeb>Zdz7g z*4T?00rZGA3kpCF{rY=${VL|pW#XBv|$2kHcmpUmQhd{|qYS(RcO za}BO%)N0I$;tW5iU9+MKPv<3(8HL>4(#%ncBk4889|Y!hiZ$Xy(fV&{ z*Q^Nl@AHy~wEk<1&w6)J6Gx3x1j4<|3I;4G9MYML#3eiX6&FuJ*@>HCTXLgdu}iyd z1&i%@N%S3y-TNyQw0`~`EL@%;P~eB?pzahZy^AqEKd9Zntd_E8)({*bpkofnCozW# zQZLu$LP6^0yd?UL)L8s2>Er+=nZ<}KXg4G)BIAj7qE+8j(ym!S;k9{5q*2HbdPUJ2 zcTYJ;L|kz6mV-pZ1uszLAQ5pfns>g2xWF3ZGaI`GIeD_>w6P!EtvU{!$COZZ`&Y1% z$SVE|DJ}U`UTXYxzWgR%ev2<37nklTPR+}>{`g+)Dp|LCuRp#^P~5;62(uk^Y*H!Q z>ALN7=bOr7F@H+C%^AfkzJ5Zy6fNdO`hkz4LazGvx>o&DXRo_R{MqM$TGINhkk;>X zrL{H*b&>JE2}+Llj>LYScBP8gPvj+$7JC$7 zt!?SdMYpvm?#}gT*%3QGm)Bc9EJR`d;>Jd6<9D~M@~L3MSfcl`KaHr1)$55AOn=B> z*&p-eGkp0hU;d}KbXPBGT*g@KoOYEG)@gAFOxY_njh3<0GMZJ{CA^gdym7~VOkOt! z!A9G~64LdRTo&~&YqvY2sC}BNjWHu_@ja-IYyPly&630iLJ}X$NkWa%o)(nWJxZIp zehxc$d#>uL*({ppwA+;xlpYJa5h~AWSFND(xx6Gkiw9W%Yrv6v27T8JWFle(0cYbh z%|-=h6j|wkP0v!y+;_Fxmld5I!SV)<$B8kgn9g^!IZ#0Qwji;ABgu(S?&9o&q;pDV zvY;>9oeZkitsB7c7;+sc^|Ehd2Ya>aRz$ozFNw$wb_f#d?v}QPSj5#V5%6^{!nnLr zyJ1-kV9Tskxjq=}L}0u^yFvwwTk?`fgAqk*YpWx3(Jk_0^V6qgN9^>=M~>ep`YePq zX5qf0NjpvDu{yZgqRpxfqqGf)7%85qt6I_2u2<2Dx*)NUUJ%iMknBOHZdi?^bSF}o zEZ&ZGGqZ|!G8AuxxsmdT4DapQbt@u%JTHkz)8E13O?}*SYM`0b}9k?VMsXWHw3))S|iiHT2h3gS- zwW;3cIqj+yAfC-jA`L{2eq<4Kvkch><{%Mq(XXy(+f7lpj-_TkO*s*!bS=T{8r##a z=y5uX97OV8Qs7pSJx~SdQtY$b9x{H?fj*K%rK*GXdg-|-aJ^@Mg^Qmg-8NaCCz zv4P$kJ9A^xuZdnWnZ-@~h;|b*inGT=a3tJc(ymz%?uYV{_-2UDGmOuAyYI__S4n8Q zoPmuLjina8@mM&7?seHn9cRB*VMgjX?Z#$B>hkbq6L5?7Pm8z^x5XvNtrUEO-Lu-f zDA;{2FNwZmx0km&7Wk9{w}990jqbpmw%gt^B@Cy#U;t{#k%!B{xu0R zq_fJjPM%6ecjjH7& z9L*m~nnEeBWtt_cQLeRdVgSksMjil{#UaEl%k=Xx`gxXqE*-|t0{uKiKVPSxn?~^S zApLxteg;PIa|A!8>rc^F0Nj%2lv?IO+p1MW^NH}=Pyx00oTwqXqpG4isx!Ky%A-5t zBDy1XqC4U%x+4aoJK{9DBbK8(;yt>fMuc~5e|)LtETAnyVs7Vc9ekCe;V?TtpW3wIKJ<+-54MH;ihSX#Jn2WClqu<=W;G8i# z(fupUnzM}itrpfCJ^V9TG0QdV8K9G0a65=&XB$QxkJz_DaL4>f%e}{pmpSVXm&#S( zfDfy59_aYvC8Oaq4n!&K1%J?4u+6e3RAH60>7uqjT&^08C6f*sqZSRyTin<|k)g8u zR<39Wr{cNr1G-Sa@!$^Hut@aV{^oMCDIPctk6}N8>g*Q&OA5q3gQR2jGX46)qVadN z?rNgN6Ty)FIHXW_kunyf>~G;cmt*#-c=SQ>D}-V{g#XXlKZf52I`$*tf>v)O!6n+f z73Z9oEAiG0rfnDm$cAwt8^(n+8W*x*T*!uTAsfbpY#0~%2rDjR!?@5(k332C9&x6}=<8ZR_nHQW+j0T)WakCVGOD>ywX z7(FZaJS*5dE4Vx>m^>?ZJS$i{D>ytW7(6TZJ1f{bE4Vw`4jI_gT#Z$4|Ds?u%-!5_ zh04e#MCq<4e1SiTGrpF%FB0vNO&zEi3uaBQ?+-1R_;MX#VgC-OR~P(ow^_wGVRJPH z-#j;AhozG(qv7%^ed4&Y&Jz&ZCs5j-EY*w$S4*BOU?RsK;O8MxkTzTB1pTddiW~A~1ij%b)^vMb6m1Oc! znB@q$g$M#6cPacgckIug0{edm7I8~NDDwx2G80C*Ok*N^%r+?SsYHPtjWPyKVv|V`C!aUlVP$`uD7Ou5q3@m+ z-L{|@Q2V1qsqrR_#i(46|LH{ju=sRpkoPBvyeUDxVtR&EbAuvZltsuZofeww?5@nIuB^$d zn(js`7S%YhzaX z-MEpNl@(Rp88KZm(?6=ZA|h|xxZk}uZagyL?E~-IdENEb(OPRmh|4%?eAzk+&UEQwCeTN>2S2{l^VWnmmR+q&d*o86?@*Q+H3R6 z-hAMf=4*Ci#kyeo^C%b07Z-^h{ZG#Xt#A-!#G|)t@hFOxyxNkp+zKZor_t}h!<-Sb zHsW2fecvggf`?n-KwvkTf>nF1Vb=o3s|Bs|t#Dt|;I+n_Q)}2h|87~~P~G=jyM*=+ zpO);m!jY0!U-zBm3X*r<@xnV^^nJMnv@>^)?F4VFI^fT0HYy&ZFrH2y^6jc^1$Hak z`NFxEw!+DVy;84Q4Lc~-twx1d87;=o2C#jPo>pd#O~s;zL3$POyrYBBJde#x#nwF|9{ zaCh=p(W^IvcnIK;nsuqza2i!mn~3C)I|3LX7vHXX#ikFkw^bUAdhi4D^UF@7(p;P? zc`NhFzI6!?Cg6ip@kGr6ZA66&7~!0 ztrd<@L!h++z;Ntdzij(<`G^BOhGpE>3U|%<0ok-~2MxbjYBZ5e4Qd79M6J03+bS-3 zJ`_gS_fWvJpq*#=zufc4U{MSYLcaGn%X1=WpkXbNk_?}tZ;>=w^2#nb~t8zo-#>$)VPdFpZuh?dB*MWT@cPe?Ha%%R6aCF5AV1q?CJvbw%vAxDQ zl@pbFxyY1+(yl>nkQ6kz*;p#vRS2AANo7(Nsat-4Mnin!(aNor=Q54)vb|(AtBs=X z0Swv716H|QTx!;YRzTx?*i6L^ApS@Bsc9;(;+30KyGV_RGoI6cY%T~@LWfE7! z4ZXQ?3xhrt`O4xVe7pcq(4V+q+x6nA<<}s=n3 z$H!~vG9e(*=eACtCT*VPw6hkzrZ7QpE@E;gZgu`qYHr4=oq z(CASw9zlO1B)X?PU-qEF%b-_~rY`Jyhijpa9TtHI84@}7oe(e_jBti_lj%(ex4ejs zTXtFug-DIu&aqbyi{R5m7CLPcUymd0eC{ zAx5M~jT0-!Dz9OFk5^vH{~WFy;qp_WJp7_>rJ5G*Wzy(hi_Ll&kuEwr(Zy3Wm6ugs z&d+l(^mGuVSF@@hLU^MK73|CkD(s^PHm4-KPFo&zl64!Q5rxd;xI`Ya)t3G!r*oj4 zq|1PG$8UT}R>P_^waR@XZLLkXJ4^q%iBl>6*;pfnQNScf;cWBgKMe*>Cxtx4hj(kKop2Qxq zcG(WjYzsPsSh!l2RT1vPC-1r_dIBkPg#6Gt;X%L_22`n*Qujflq)5y+37{xA7O^os zVPhyH1EtFA84Rvf^r(orD2(?ZD~=n8z>ACI6_6<5M|{wzxNulvJQ=<*8j+RCH8+?m zRlQ~zafxq>v6+Q}^Hpatn3qq@-!b>nxtGq15ou%24PFI!(2Kv~oc;R3!l|=`Q>RWA zUvuu%NzccBQlcV2pc*>`HW{%Zy(0ClJKl5%z15p;Z`s_u_~Eh>U?99My5JpedLtD& z9~FuTF*lK}OfB0O6R$NWWFu9;@Nq~ciQacQ%BSdEII~CHhcLrIz3_OH*Q8EtBTnBP zrK7|3496y3r^z|ZZlCv;BBgQM}5k&GnPHyWk zqS!-Zk8w7Kcy5cdtF0dHffKtBc~V@d-dSWw4uDh%>O*~!EDu+L@T+v8Bb=WkAHx|G z9!63A!6ezYFJgGzC{}C>o+G9>(_R9x2D-Qt*NeK^avIKx4L>a9-IlTH`Iy7QBLkg} zShW%&1UO@naUiKhW+eQFJKlV&)Tf)0Vm`DMZg2&CUR3+BSNp#%!fHWs1iC0YY&a8W z@o=QYu;}(6h79sX>%{eu(oWEWi9#^qH&7x?NJi>K<9$qTc$j1260-p`u4;3S8chU6 zk;DuP$EhuOG?*6wQ)F5RQ;6YjbpHpGBE03^nw>*S?Oa>nm-Ci#@$}-vDJQ@@9AbKi zJ&4V1cT|gNUei&QqO(y(SM!MZPUH~|M}vD-xxEpA8d_&JET;;aXiA~b^NmPkr3&UC zFlKncD++IW?)Sb$y1@xiq-L*Di;=ynS;JVGUF59DqbMrwrsHuP)hkHL;byA)=3&Mf zrZq7(Z#3d@@U^p9FVCK1%kmDQJ^b7dnl_XN7IyxSfIIFta{!B3|Tf1U69X8G6Z5Y zTOQ>d#O$3@FJfw_X3-p8anUMWK$jC#q89Ci-av!xY8|~qBYMl(_-9lQ z9ph>D;12FE_axb6`x54WmT7bl4%oEF2c;>x>dLWiuh7I*I)8uiEYJKz?rS3^e=sSs;?&R^`zysN z`dK*Jq@Fgx1?aHg9?L`ue+@uOntEeWl43@J9C}Z~c9=rK zO&b7lF`kGzpU~Qu&=O5Yq|D*s)O<7W=NFyYe8p)toNDq&o3vuO{LD=JOq7v4l}jo@ zfJalpMOZl2F);9Icpk>giLj@kSFESWJPXYUibSEJGvtWVMZ&SD2Y?r*a2y6BLVQuI z%NQofq<$wFAVj0Mi|CcfQW6g2kVs~TX;CrhDW4dZ85{tF12v2(FGWL*_BDsp^RO!m*1@%vf>}a&jWQ;MDL8IzbVxhvT$pg3*mwpMbNm7AYbLhpLD& zF>1wsXcapMIhh{LVgeB^r-RTyGeEQlH`4GuOpV!aq#hBX31Q4>VDiwaJFUkcxp)}? zYZBqK6a@F97(UT*(Sgpy3Z@h>kKQ0L@9)fXHY-rw!en6%+W|GnQ({cc2C?U3ua4*KC z)`g;tN2*1H1~f;Hj{MPZypCynvPNEC%tfQw)z#HGZWxV)=HVpfQ8Jjvav41luTYR) zkNZodHX0aq^BSe_KXZ=VSQ0eIx6t!cI`#adQ%g-oR2~W^q3*(67uRT&j22F5gc39t z)2X8sECQm(zz_zO8}1YS2vWh6H+oNu*vKQ6(azcS3F~OF35$PXL9DVf+-e0ToQURv zfej`HD}NS_3zEfX;=CCS!>%Y+Wf-I_9b5RLW1suV`TzbgwgCS5mVf+Whv{*;bN7e4 z8!BgCD7-5%NKUF2-rmLbIdA3c8P!v8miK|XqSY}@xcJfQ607GVe|UFyW9RI(x!V)- z=A`vI_IEe{PJejucSGqQIN@zCSaVkp_t3Au{JS@O^S#XwD{3^l#f%h`d!ICP12K-e-SsLGx?70$uI7ne5Xi$%za!k zaD%J_BB`Otg`kPW{~$;|Ons@y=H%(<89X3M?v+U;-^QS`0Ksw515r^qJJLqwrYNfv zbuI;-r{pIiinJLa2nrYMbxx0f7u@n-ig|d<{fKPSY(zPll3~4gLS}!@+}u1(ae0AF zyJax=F36vAv7-_&g|~>3)br1`ZQTjx;UDMLEdk_3LDcp6tI1!N_-mEF*2EVahEo%J zPs%O#SCHiX8a_y=!wF16VnzW&q*ZG@XuSv8zk*RBCfzMr^jA?d+$C*8JToXfqwqb# zCWH^A5Hpw~$-ry|Li?48E;mq;eebEX!oJ1Sb z9eM6IiQLYef^qj-_yLC9Z!@uf;;--U*LV5rS@G3$ug5d)4)LJyE?e+4zR(_KrC3U5 zF-J3($q~7(EjXGzEIdf=czZaQVytTk=I@rv=c($1jsFaW=DT@O<~X=ajz79J$3ti305C1ND3$qm$7S;IOI!0Xb*^n( zir^(}wn{GZ^`6V*>&dP8n!KN8z+bmYSbu@JlX;+%5jy&e+ zqiLRuJALk0{}LQF7n|W|)x%UEZJ|iQ8WCr396%j6_rBC&ih$jvuE`bs3v~t}s&>iw zityGYcPD~Emz;(xET7EQ6}Cs_;0m24g>;2hkqWp1M-sajw78r73P2-qb5S9%g2+30Q6; z>{U#}OI?CH_a8|`L~!)q&}u|=8o?1owLAfdVfP?-X!=fzBhpcx02V=AWs##O+K?Qv z$yI(?yGlu^i+q^k(}JS=d3<$?8xOf(?2+UCPOpsL@0B5BI`d$~YUG?Cw(D1=ZKz8= zbNVfi?Tfg>nfxkvDmVcR#l%YjEg8oCIqKxv|3SNUN#d_#5`Sk%0{aGIi(qE{Mo`*z zX!gIxTgAS5JHaORAl6$u0P0zadAng(zhK&*$14McGWd&eD$shc3f6vY9u%W%OL({ycV56iUQh0o=tvsTjRXn+FA> zyG%)RVq|OhaONURb!RM9cBT5X+=QLqG;|T}q7Vi5{k?p7Pk(X9)R%Y68MMc-?r7}y z*0f>ju5C2IfhiQR&m+}Ox`~@^YS*P`mCvH=CB^OU5l3iN=6INQ1o#n;!r{AtJ+*BNPWeWL}sLnJ^u{(tW9RAy5uuBI|sHWJXAV^ zaJTSbSfglrfj~j!I_>HeRK6=vxq>66aZC$RoEzjI^t36Yvsl8nX*V&e`cLFBJ`$W1 zXvcyg+*`G4R)l-ADTzeoZxkeY20Ny)4!v>`qk#CkTFo8h)z6N3?#&7^La)(oWLAW3 zOd%wERJ4|gS6+DrDe2gcYV)Dsb+;*rzT-8uAl5>2C+zhuhNI*%GF9#7WJP8=pRCOW z-Ob0*u3Uj*$&^Ij;do959Gh9t7G)W#$F!T86{?#%q1wuhenguU1-N&clIS~dBd2MF zTF(VK2+ zx6-2wV{}BjX<5x@Umn&&TetCAmgKE_ce9|)f&$PhO-b|}ps9QC-gUHpLK$o-xeQ80 zyE$1wnayXpdu3Uj*(Ue3d90oK0G;PmPIe_bPvQU7*A@eNOu*dwr#b7@q~6=ibg*!Nc0q9 z?-dMVDNY>5i3GGCv4nHYI_5(<@>t!U(Qai%iH4JTIvoLK}nUY9c&!00a z+r30IehRNm&^o)=Y|!o^!gLlxFf+70fu!Or!il_ifkRHhswhlq*Q}s0W=f*(C=3Gt z-kXy`AW3HFzeKwMSq)%>=2m;`4!T3TRz>pjrX>0<`CT*#k@h>B#1emlHse_(J|LzS zR6Tz{yGBLYXH7};UD`uu*KtbY%8|6d<5ZUU!`kd;mHBW!5cPL)@^96yR1y2CDTz+8 z8-%Dyl*`?>0f~f*&u`w<7za|Lhv{7_oW;}`MYU(J4m_zX%d9#uh7c;|LSmT2Pfuvq ztEj=_f`mbUY8pRHMV*Hn+@_67$z=imj&?({3V1s1O61^H^>M$gUAZFVFPf4_)cn6N zP}?0*jQ|dQO*0KdTRKDV586%03IWy>VjdI~|2yq!72*GlDT%%df6%{(gZ(->^eB0f!4OSR965b9?Q!B%7X6#G+0QEaVKFUH#w+@Y=D$(9Qbp{qHzm<` zu}^ip6q**llFKmsTkYm#g<(41aTtsW$G_38T!G_Xo08~+!yraY!d#BB3`itgY!T*~ zhGR45>{6wMEw|Mi4)>uW3({)QC7%`J|2D-e9sltd>42F|g~ zzlu2k0}=@rA2OZvmWyTLG>cwus%-yaS=Vzf+NWdP=f`VicaCh&7=oI()tcE0wd+z; zsvt;Q!6}J@$8plWIA9W|anS(~J;ubFlw(7_PrLEm4OtO%ctakqE5|$*8XmpQ*UPis ztIdXj!AVmRi9sD_7<)}v7|+Yyd`j$sv}!nBLd=iG-JgTO^m;mc*{U$(c1gRnS#i51 zPnR@cFIcTC`$chP6ZMqLt>TjdZC(`c>MZ$Q&ZzgIvuO~y^YF=zv9w5G;r_UGgR%;D zR~{Cijv89p6)F<^F;fzW`u`|{&`bSIMLl@L!XdV`w3bJSEbz~1GoMx9L-{h-u4wIN zwChx4{z+33eV6&ZGrn^P$HV0?XOT;G%%w5tRfsY9Q|-oO#bkdTH%bwA1VXkltd>+2BBIK?XiC|AdzsfMdxH{ofBv1NIaZq8(>b)xeRo48AW4k&MrjKhvRM&eHGwq&(X+6L9m zi-N=pwX0T;CGtwfP7ODod6khD@o79 zW@tbn;i6AH(|GSAG}BqE6d%zRXI7<{z(}_3YILM#7%*3hwOsIq;}m37GtI)`i{kc1>9O!Tb{oUvj~?66wGysvlPErER%TmrsZ||tx7su;ZKdY@J-Bp~Lx79kGpi%a>BwUg{-<_RvZ634P(be?c~OA)6YZ)MApY2tMBjnf zLqObT2iU$J@Io8i){`=c?nM}uf${ALJ{3O`?iH}$TB|f?3OYNqIZ)7f_L@a!;4Cf& z@9G|eWpimeM7skS&_OWUf`waDyvq&7jauymfR|i z_UqcbDA;|?ltkaLyOF0DqpQbgL#5RnxJ^qkYBLkt6N@YED!eJ0Xyj#>fHqZHy&;>_ zW<-H(%#=hYWCk5u(l@e4H6W32@c~oalYOJOC+^Dijho&%=bnkX#@A}&)7?W*^S0_5 zk7?JXsM8Ta!k}w3UcDSRYd4zpwDXl|Y^{!Vt1?P3#K=w5t+>)9?J5;PmNpk;&k0Y{ zU1Fn$#ci{69&%ci?HMf4cWbvUt3YwG0N;6w8*0_y;t}n76{)_{ltkiZ-eF22@pg>u zWqG@|2rjl=3&xMw^{Tg?6X(jN^&p+an($d|S!C6Oi99Z~1}EZ<<1Xu=pVqEf(S=W# zl1Ox+UnuZ?-mWO5vKWOw(QZg~6vQSB+(At*45$|Q$J#Y3DEyHriN2$7L;G5%xPLWy zy`_B|8*WyR5!x}iJprTAiHA3))C zlwp*f-#3)@rBQ+&^*AUjug!vDP&rc)od6m1Pe~WYai9T-go_1JO_Kq=xM2Cp1@sv& zUT*gs?wjK1Sic>DzHT*Xr3B(D*wdTqqUi~PyPC!5TVq&jW zT}Rnb-&#%hU8<>ccIT)ReNoI*_#ji(tPAd=W(r5Fz?jL_S&2u zG+N=Vs#CLDCvIcac)ux5i9chUF3X=a8R}lMlEwqz-bWON=`0q;Z)po7tDQ{bEx%O3 zOGc$e)9-^EBDVrlhRCR59Hqd_Yx z0(Nw3UFCA-T9C^t+T~(k$%!*yMKmCh1oi#u1ZU;lA-&%y>RN(D;|Z0qbUKM)tb^Kq z&8oH@4F~ZSS<`o9Ox1n^akwYCH)Qkoi>lfTC{Ds*wZB?Dr^!TWrD<2)AWI6fD7Wft9J#gU3E8a zGrDgum2~3fS<=^}dQZ^(^F0op=*VMnJfba*tjazq?w#M{pow>CSFPy$I|PZVrt>@L z?!B&o&Bwr4O5?BZ@4Ru>*|3WY@z0scInj8Q^EIjQQ|ElIiL-fwis#Y9MB1|}xh#?| zX^SMQ)=%fLVL8Q*;_H7)yK+VEzaU6lHN78iZ)0}@_$D|^89<*GPP!VvLyY!cmGRmJe6?dZSEbeVk zb^{U#7rdLwfJCyc_Q2&V_2YDvU&QvH-dfjd&x+~G219Jf>G$p3YP=inpS6+gZoky3 zt#-qGTe~jBXuoMnBEj$PO-Yaz0lz1V@H5_Xbkjoll7$E1}0dbpjVDmZMh1^1|=HY%Y>}E@0)VmnN^k20bm=&h|m|(z7(}B&Wbz3oiiXr`u zHV+C;zimpQ6DNZ}J{b$J4>cf>aIr-PXll-r;-(Qy_#oy}-nj0}WX-sKwoegXIF%PS zi_r8_k9V;DpDCQlyKdhxC6O5m<6vap5wCOsad%|Fa*tQqaC;SEaGuvUaQ5f%J_fiG z@giBT-07w6j()B-4~p5|B1l}pF#UPw>>%D$mn+~cUAlwk`{?_uUBa6WxnuX8Ih;l! z<1-A*J=#La>QD2y#WaXF-r=oYaX$~f0>OA;*{_#WkPd6}qk!~kQxb_Ky@GMx?jYqL z!v`GY1<<)8PCy}LM<=*RIY!OZZemu{4&)_JC0tQWZm%41sC0wN+Ds@=l}$->LS@j0 zCEXxfwE>BQi!HiAW7m7rNvGCai)K7>t4^bWHxqO0kke+rc~RDzpVF3hR=s%+=BmMI zLHS6&>Gab7>$GcCB>&xOR`R&K&9`ZI)WrZg@)(2f(UwM53!sbLI7;YY z0=H>btpIVWDTz)KFzDZt5P|y|0}=@r{R$CwpJ?J`cf6f$2T`1m4h*^#V9j_?Teev> zV>W*w<|>K_)F9xTcKwQayiSm~fds6S^O|-uvx<2tntAUz=xu7(t%%q+ zC6Va9$0%)gC@_nIclf=h9N!8IHXSAD@6_q`CSfhL&i|-32zNB1}`S_pI zW7wW`0hdW|uRbb8)oqAfEBSoj4G9}T8rh!5v zI>ig(1|$+LZZe%wB`&bd;iFe}n?t;NxP3jueKg+DFtB%fLTPH&Ry!JYXxF8v(X&F0 z3_51xxssjtEW9r5{Y46!>TTLB>Tarv^uk^FCF`Q<-EY;dP!ZwHf`owxP2J_(5zh|h zA9Si!x)o0x8<&$i-E*(c-CMWmGHIMg&U;5*l@_+{!;H&OZ82rVWey7ib^vc#t7W&SDBJXyx7ZG3AQ_Qy6rXIYOd_%j^||PC=Q)W z;wi6|dwmDM*&bn79qoo^h4r?4#aqR+V!?^V73qU03tp|Trh>Vo&5#0S$&^Ij!Mx>o zkQl6$d*ICJT-CW?W0lA+pFVTC1IH~(GlV~)-Q27Y-ja8M#3Zf4rFyME{9=vBFW2f_ z?qzwmHZKZ#kC>9^J9@Vr@p9{4Gv_TWVUg9Ut>8&s{HQ63zJs~usC|Zq07;Ezo*TCg3p&tNp#|4FaSu#5F9@lkVv?= zQ8Z-Rk3Jv5zRre)cbM8^{V+~tO&HkMr+_~kru$k%{SvukQeua8r3(1ZUOxCNb_3)R z@Ok`UKq3MEUra~Basc^DS9SoYym#HMT<-hhf#fT-A@1&BsCiorBwwaom!eL02@+Ru z6of^Tl@-Ll$Ah5Rd1^^V9vkX;?M7x4Xh;hz#7n_pUKDfvLG7v)`95e$A~BS64AFLv zQ3iRcJ?$i;L>B!!w3*K;`XM>BuEsBK)2>sI`9r28`Y!Vw_a9Hon-W;oAJ%3%tE_io zEmxKE2es={4yoCf3hYv435=Qbp`vGbPa}c7q@)iNm=2 zHXxC3@e(dYG&wUWz%Uea!8RzXkaFA+b5O{84Xu3VAwTTDqL&gnb@wcWAr z%!9tuXxO!0fON@cNZzg8q^ywa&aX00n}PC(cJ&GdzN3|uIRSU+b zlOje6msV6|_=tABiZXmykhqf04?%#C>=AFpa%ySmPIhFnc%RX3W>)b|#o{e9H&Q-{ zy*;g6w<6-FOi3h~{&_}eyPe;3B<_10-(JOqHEA@|Y{uh%Yd0t>9y2i>OA$v3BHz%i zT|wmQrX>1~$W(;LlIPPI2Wdc*T*hP1!G6Wa(+M7)PbU|sK4?a}as`e_QxbiLV zyg`u$qa%-@xJ$b!SxrL>S42-B-ic6wc!_q^3J`aglIR4&pj%HO1MZRxNF-eJD>9gU zaWZI%_J*gmqH77(jf%E(v+Bl79K%OjyjAtEwQE<@V^NT}g0aF(WPa!Dl{#)y>l~eS z$!Ae-Xg4;isCUO6u@Unm1(gI1@6xVbk@XLml1Pl;?F`p;2Mv>F>Dtxq3wvQ_Cd2Wh zc4M-_fmc6?n|L3!s`pQ5*R5djxG9NFEDU^F;uhKZ3`itguv;`Bk#NCtxCSH=E}k-- zqa-exi_LHfm$MgfyLl1&ti@gGbQAjrFo%6&m-|8bnsR@hzGmDH(bu&5Vfq?!e}TSs zxsUU&kI>hIIEMMe_2M+&6SLxNw-duIZR$HQ=+eq39-!&*6O+wwlIq2|O?(0aJV zNjUAZEooX_9bc3evQs&6_xpKpNw>PYbYZni7x=n#TdhmibGmdNp-Y#sxpZZfOSkyA zbd!loS3S6N=Dka2f!jeiEv|?!HoT&5FE*WO8T6U(d+<%IdQ8-i{GzIoUsPxEiz-ik z5f{lXVkh}Ud?mk#!Q>Zln*1V`lV8Mp@{1Y~|7wO4bdNpSQfl}%y!(4v;Y@UGeJXX7 z$7f}$VNr9#>r3Km%*WL`#bAA9(W|!HhtT$L@GSp&Z%f`v{!OHw4#xv$5ohx(FD!bO z>{jyoZoBHO;`ad7S!)gaGgh`sRf}GV@@n`wgrj?E)(RdG_k5oYr<~wEyS>atI8wwN z?A5Yw*IMUW;Y87@d9}kyN^>zB@)lj((JoYBowVt?W;jx+ShZ!FUW%p`4auMQ;YLM< zOAZc)Bt{5gPQ`OFQ7GU<^b6XsL@CX1XQ^Hn4~*OZt$7=&b4T%CS|IKul1{r*^cjwb z#^3ATTStp0qmJziq_7eoWjsn*@R#x1oe_`j7N2za`Du3+|8KZ^@QLN8ec}tP9w5P` z+C1Q3nt83gHA9^?3<6}s_#zv|7uhhr$cFJnHjFQ_VSJIc15rM=KZ#R`g8xDZ(Io&2o^U4hZ};y4Z+`rU~fZkx6zCl*im0^tKK~-SdDXc z`hidx*@PrLXb4{rj^RD&Wlx;UE7~QSI#{(9ZEPPQZ5v*;Ym9~agP>kn3@3tm1@BtV zRlSl`wPA;lOc$ zcBA! zjk?=LeK4>szf@_tbtLv8Id)bQ%AKK$1iMkZ*hVqMWGBnv?3s0(PFBmMn0y3giCe0@ zS^|NPyA=MrT5bguxQ<{Ezlc}KFn+DluQiz$X-PPMeL*l!SbQ@abXLH5&!QeiNEI0-D$&#bS!R*BJ{C^cYkUyIi=zDB=$?N^l>eLE^Y4uEKi@t7 z#Zms#GN1g!W8q}Uw=sI4C^0JVTd4vw(YOgO-<9pC%rmJnlUAu@2SMS2y&e_#?Noui zwNm^tCXT18H{;5lN|l?1EU6m28zv}5)V`1^HBm=zm15_Msr(Tl5k${^DU~-Z$d~Pg zZVtyMj%Oo|z>Hio;gtqsRKSk&)QxrS*40ise9W~o!TXIE}l=mG`z7rhfJc3 L_$7WzV#ZPT8F*24WsPs_Yb%3U3g{~gWl)9AHl|m_pz_%_`S8?zuE6KjiJWajIc{) z*>z02470gKC_(J|sb|E)CpYYk4C7)ev{tM)#zv-|0aTep*Xe7ce z^ZR--SQi`0vEiKS%@15}%y#zJI2(RAfE_l-Wr(y3ON4+}(N$;@xZ1-KX!feztMl;5QcXZ|L=tR0|mwmovL?Y`xe~lAY zh>|WF<1W61=l5W+QO{PY!ckg$Y#BC!CPM>+%?IKtQ6b7)CKfiI6pIpQ*`ZQGnJ8K# zb#RDXrs!<51jMdu18H|iQt4PEp-Y?UmIN#!YP1O1ybN2`zy!Sbe-yrMy!o9(pMRq3 zTBz%4N7u%KK&LQbZh^899X?p{n{n;PcFt2pTc$AQDU3|29hsDJk}=iFjyqA~ed|N&U03%Ga^%|{$y{Z8ORrzy;5N_M zD7UItsnp*Gu21FoA~rh5cY<*`*wKib%Rrym#x*<7^V$tbzKs)qqK7Hm=e}O)(rByJ Im&}~;6Vn{Gh5!Hn delta 142 zcmexUI5my6fpsdE@kZ8H0*nVXe-N-_oP1VPcC))s3?rlD)Ll=sGwAfO>3z7=BkJ4(}Pzq_nvxRN3%`SvecGw-5nJzQy%q)cj zU7Fb1Ci|o58DA*|`_sfm+i6TpjDIvHYHXs>YMZE$DzT}FCjMxRCVKA-ENtDRuk_E| z*>lhN&iT%3=Jy}bh2Ic6!@m6F#CcX~Zu+G|)o@Hw5|enGkBE{Y==g|ah+8y+8T&^@?fr2f_>%r$<#F(SuY>)5N1kLJ)(PTn!FYfy?R`T zNTX6@F)2|=H#BJ^VMwZ?<2u1N=EJ+5?XCCVFfmkODj&s$C}2Jw*VMQs@rHmE!HC2p zK{4% zvlY-hW-hkvy#r>&6F0~uuAH32i0DqaHDOfH1SKMvVAl66If~zR*W6t~oh~R#ZNB&B zT#=4DTR--{-ZlyQ3Kukn9zWnx_;JC!uNYDs$y-8`%+z)|Dw(8vvrUSb5F6xjlJ=F^ z=L}vO6AYUArOfYehA$H_`|LSMtfCtY53S(gC4=r=G3eg(PmZMXF6+zIqzi?huWbm8z&mYT6ov2Gb}(Vu8C#J8 zeeL_%E}|NOx7z=;70cnHj_v3r_@|>DowSvYIm$qkH^FC}6^jNpI=8t(ggyM>+KjrO zB(TnUt_vZ!8K{C&-3#bzxD}{`@__N}?=F2hXEGhC3kJd_K4TS~14(=sYdM)15k)Ih>uM!Hl&UQ&WTCYGdeMuS;8wxF-^hK!3FWvGitf1W9t&l)1>-6`v%Y z-esYrXd`oug_RsAfXM z)GAD##nm!AF<#=g-5(;Rj{8O$gX5mYV7sTuwA~Xz*1-6uh`GVRPmk2PHpstnbV0*m L)sGh7jC$Zdw2D{y delta 1035 zcmZ8gTSyd981^4$)?E{|Qpw8>Dkf@5Cf!g`Dlet&xTWiMalK#8j;5QoSen>{=tZdf zw+j@gAwiKz&YMqx2$msb5C!6`>Z@T7Ms~WX{ECRxk zFUG{hq9fT4`?Bpg+z_u>^I}B^#f}0SMB|5o6o|zlQ-&amI2S166Vow;rckcz)eQLCa5WuF)-`uN~4F%9yyD@r&(H};!l z94-0+y;{E+1j8Llpb;)=V@bwJKRsA9_i-Z_20ev`>jf*Omwd(hMKT@09}in@8s2y~ zQ;d@uJjqr-d`T49L5zi!7*pD7nDtO*yf(UO8aFB8pVE&(%e2_$BuQkN?`gBvS0b#? zLy5q#vQ*IHQdxrFFQM6#F6boh$%No7TdvMdH7g>{*y6+$>cghwd(=C#{72A1X@fUD zGe>Aj#T@AKXn{&|@RKEl4XkVRG}KyE3Y8eRRmN{sNAwjQmW{G@1)pMz^~s#**em1R z>Z{!(NVioaB)5~VqZhn|GDk>v!Mx`yvOq-TmR0}<6GY2)W#k=N9<`JxFy`JRtVp{ zS#0Np8qFT_YMZd^E$H1;@2nY_7D;n}JXJlSM{PHni!A<&O0 zx~0#zJ4WZ@qsk0U`%*Z;pqPP~!34b&b)12fTB{`tCK*gH2xqb|3eFxwbJdx;a~B+S zZS0>?nXAGb74D{RCxyEx+(F@LCC5pknSgab0(d;Jd$O+sb?4dTtQAi-YlUaC>*U$$ fl%zdqdkMm09sRiC#7OlKdy#R-nF@nA>n!;P-(f$F diff --git a/docs/_build/doctrees/quick-start.doctree b/docs/_build/doctrees/quick-start.doctree index d19a5b3d2be4bc7b6e3c1dcf077189dafcd1bde8..6512de64bd026f564cf4ef1f4046155c2e456a10 100644 GIT binary patch literal 35881 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 diff --git a/docs/_build/doctrees/server-installation.doctree b/docs/_build/doctrees/server-installation.doctree index ca3c4be40d1369ff4cd4e107fb568891e855cb3e..453ead783ad922bf78a266edae3d2e4e5815a1d6 100644 GIT binary patch delta 6878 zcmc&(dsI}_8fPD1=A7Xz2p9%OP!t5m2et|&LGgvosA(=0%tja(j=C;s8Wl?SY$0IOOVaQ)_ikO ziJV`QT~L~1bUKj@MLBY`#qM!LTBufXhOIWKXIGm-t2)h8RxhhwQr*wwt(2=gJWLVF zV*1L=7&f*Sj=q02XHpFAmlpiZewQCtw>MjHZFHKEy;e zY1D~5f*g&Nv9C*2lEs*7gsqTmtftj*b_!Ri?JgY%ont3HlM1{Lx?__}WtCS_sU^Q! z@l*qMP4P+xhwjAS*_FV=jsS@pIuG2ma4=@UU@Z^1Uc|iIF0YqX23YEgs`j z5rHUihfQ{J`QF4C(5cLS?0fiM;Z2E=@i~G{*#_htE~$_Vt(?-x2|J|=kfb`ZU%$9irWSyZ*o(qR*sinx6gVc{U=jKMsxxn;7v&9H> z$6b+ag+(5!WPpY-sGp)I9v*aJnl#k66S!mty}C|1Ii_Slt02*Fym#Hb*lB8knRGRt zrnEypmCSZDR+y=#6_aAgOh=JIi$QZb@3xCutAJaP|Bq7GE0G74h@*#tQ^=DJEP$55cI?u$3iqycBJ#5TF(RZ;%zx()o>vPTP4&k1Plr(q zEl*XGba)y-EcCZo9nwzDmhEb~KX71RJ&uUU)6~<{-*o?kQd@eKzo)d1>%6a~^A9Dd z7J#pMwXJ5(S~WQW-H_?zymdjJq7JuO$P{Ylhm&9$XnK^CQc@R5pE8Y>e&CMUc(Cug z23u_FmS5~C5s}fig9QsJ2VV}o(z(iEwe47e(u?@fDUH2o)(aUUE`Sr|B8p2Oo>9I4 zS>-h|O*gSx`4XO&R4c9UX96j~L$(vjrOY!&dFO?hWHEi@#Sf(<9(}OL%Av)Ps~nZK zIV*<>-BX>jdei-SK;;1e=&sfC$#{Sz)1~cds-q7}_7go-q}6nVoC#J4Aq)OiX`C;R zoazY#kfe&X;nf8KNu~ZxLsfr+8Leph>ZKE&QW-{zP@WL6_z};r6^@G41NMde{bNgA zmq2XE>rx4+1RPPrl)KhOox`twj`Fybi`Q%`j$AccW7}LeUFf#QIqRqy4cb&kKC%}~q-QsU3bRDowkb8xUN z6laSx?bQw8pW(<}K4l&ZSlRZ7wx3_!LdYIgwzU9nt4Ld3TQ2>G@gkI49McUPxiGD_ zZGL?s5e13qc+lcQLsfO4eM4kAOf9arI7ij-ow}dYkpa}(|1Gper??7Ex1S5QRWv6M;Ykgx z-}i!04sLoxON+q{6c*x$x4999RzAcw&)3j>`zHpvrQ1k*eo!veapUzGcEC5WK)jGQ zKbYiRNE@AWAcw4B^kN9fK zYrW~wLy1x^z8K}haQ4KJ3+Kml+sR0p{pnRP2^R27r_&A_NeT^WfeUb>cPP87kH9t9 z9rhC{$p>%a-UlJhK$_Olmn72E3lTK;$U5;c9xMy&`+FY(g&C+IB>GTtHk}4s5(C`; z9Hh-h(*;N-sa2-iGkxixV~Nso?qwN=T#h3b);L}vN|O)$=)_ZGFM5&`JEt0%x8vZgoW6ao z5B=oi2;sC3^*QyBbOsADS6QN=x>Jvli)f~Cn4RI(ISFHO=7bYPZO zpcW@w#XDmg`*|!8M{>1PP#dZ`3n8_>u)(GaQ+=s;{sD0+Uw#zuu`dYkbD%PXjc`lp zeQDZ-`)K3&K7!&)FP)DQ6>d=AG&m0iCU=9UTKWsieCduBt+0ch=x~jF=KD!bwNPW3ZA3r=cynlcMLTZ<( zNQf={S|1_}<*P&Z>TTyLZN8q{b@z<&qe#aZ{Y(Te>L;vh6y2Ayb_m7p* z+dNb~h8m*QdE-TxSDtqKIJj$ed;MtY?Np(;OLk3;>_oLr&8>^WNeI1pdsv_wBia}v zX8trxy2zupFh&G@ZcmQizjPX6Yx!vtk-p8&Az0!?76~g5K_6dbB{))M!DX_l zU+vq3^y^;T>Ba8EQfu-i%fi?ELC{*FBI!aVE2p{#mNUa2Z#A_wD$*v|zzU{z_#?YT zT|}q#7Bv|!?dR*wY&}?aKVR>()f!4gvME3~3_g2ACf{|hRe2ZXa3`ERCkTN74V4jOgJ;DxtiTln(O}x8B;dU|4#gJunpNIFaUI1sD0<^UFBEU0 zcnw7!iX0U0!WBZgj&QJg{JQz%B@a5#zt6mcjnqqvBo0>xq!n^4q&D6Nu;424GgPmL1% z?*;`^uh5$s^ek;XOIgp-)w5LfEKNO2aRp0H&r(~#($ce(^ei1crs4s90IZ&6pl9gy z47r}6)-%MQ15sBnqIZ^C2v#F~H~KD-HM@QF16zqxo5@B;vw0QJY)6K?`uMtKwPn#G%dHv`@Td^z(b z;2FW2fG-8!1Uwdb6Jj76-UK`qcoP=j6E;D48ANH7U#{6~ErK8T8#eSJdx&5Oz}KVN flmJ`B49|H{wXenyZCGId+db~LzS^rXvcg+Uwd|+UpI7*QP0fzT{JZ zQ32D6E)S3m6PU?jgLW)&jfA$+jj>_$AM1=X(?P9Y0#;Zja1f1}YDe+3FrhwmP3=QY z3125fyrWg)C2D=9P4*>M1m?0H&zj6!Rbn0Elr09$cb3u+-EoH=*xkiUlszE!GOaa&BuO*qnJ=4(7CZR;S=(7S6AaO!W5+_6k%|pmk zZRPs*xIry_)Ml?|bBwc-Ofn@dK5j}}(noPl>ZI2;q~InJjjmOnCT{FY8VR4ZB)WfN zdb18pgDg6--%O)!H{Lk_v1GtE^BAIS*c6F0byFvVncYe4EyHv+D@&UB%k#cui17Fx zWXW4%oyliKwt}KoUrojML!Lz!<&6YM9!HnZlV=B`qvxJHjfb&z!-M ztxSaH8J_!ha+ZPF_-T>n3D7)wF4YQi2O@G^V6J-VUd~KTNSv6|Z`P7B0VwqVRtmsi zmkayI)VQZP#xh$C;rOLQi$+BnRX<36-x*Xw8kDOLS*mHXbC?5BG)P!6ICY%)_l_Ht))GZ2y|R zN-bIYZQp1_CX291A}k;j5q1I(8>Vz&0HrGv!0c-Y0Cc>b0A_wsLZkskSqg&>M&c8a zHt*nigxAQlLH>NaNu$&kSCTCj>%>D>5Z=#2cX;DsRgxIX?swU1 zov!2F=-MMQER_v*leLsLx>rFz`LZbY2Re9twB-UQo<48Z&KHy-TrAT=Cu-3jzVD15 z$u#(A1b!^jZbv)g2RtnrW*~Ik$sqhfraMozp+!gQ8n&>=#j@smtSv&tP#GV&AZsbd zZ3u@F=Fo;46KXx#3^yg*Swq6RTIs9}Vb1y+wlPPcM5{PCjGMvh4nxe-veUhhc_?8C zOCLDxA#9KBamHbFE^^Ly&T+P|``Zl+7Yj}sk>LQVqrA@ovZb`0Jq{v#DGem_)y;w4 zb#JG=&wVV<6h_nOih@YKx$oeCsej=(Z#p;AX@%p_5>9G)VT`<1n10Gkqb*sWcu3u) zEkFM;mcJ5^t-ALd<~@sOgD9uvF6T`BJjz->) z{p_)wj>)(_(BhRr9xb`v+ndO}Jo(rgkz|bUHrmLKrdZHCe1A*N-k5nB_&?GUIx0nphHS@hYW&E-UHn2Wye$J&T~|Zc`Fu;!OxJaoUWad1yPP zCEsm^NIik60~m3|Il-bCP3|JQ;npS^b*}?yEpSmLXsG`whH163q&W^}v#jMs_nP89 zCMuVOlRg62PXJFd;9p+@?kH=CN1N!6Wo^i40URTMXBcqgYrqBf8{!kC-iAA zoJDBljRth~)6V3uNFrY_eE>8M)7R*$r+vK__cc27*<`efFY)4MoycwBp-6bRQPsmu z4qNz3GIhf_Io;>4u3haYM5bWn*Y*{M^p(jgonBBFIqs25{>$l;;| zyy3gAAq&DY!1JGP_|JN9btp!Q$R{FRx*pH)9}gnh7qzWg)@rjl#TWI!YpT?h#q0W& z8^SHpX7TFyE$FzK>4&igLX}P&^90t*2FarB(Bd=n}rq{j+ZYSv_Dv?ptl5x{;v7 z8qU`a6R>AlzAdSv&FEri1*pHf*WMP3iT#|^+Q~8g@YS%}tZoQEBfR;0p^`wPN1+}ZZp@WqurH2*GssA@ne^-hC*+bO71fy8>tzZ=Qrf6RWqgm)9cQnbY zOk}(<&ADa3Han&}}QE%KK063IljKE=2wI@c^)g#r>W3rT) zv7t;L2F?RXePloeh zNJyIg=1;H~i}0v^-V7~9va4Bhl!0+sfJ+NU>wV{b$3iKGA)d>gtN6nO8G~5BK6RCO zAPPVn0#N~?9K-^E%mdL2M0XIB9hk~;5c@#g1L7Qf0GtMq0TbyUuCk3+xeQ{M(PyrY z@;*DZ6$x}d5P2Y6ATEG72ci)q83rPUEobFlAZmkJ6NCi955xfwc_2oD7!G0%h?z_{ zGD*_d#JIE>ljBn1-m5_Ab8U8)jhAiXCEIwpHeM%YeLvrO^WK{`Z?5-w`qB<+-(cVB`0*R|#guI4D`|m~87A}1YvL!f^7!j?7iF{f zJlh9kI$urmZ)3)?Mw6+0d)BZ%)VIlEe#wzkI>Gpsq%v)gDiFt){lD zVMfe?|7Mz#)`-UZ(H1ipL7*s8ET&mjBs!_Qyv=3EJj@}(Cy z{?3aV_EoFnM@k-<`!ea*55cs--Q(^#JiX8MCZnr4w7k$>ezl;O?jf91dK`H`*h%=f z%KUhD&wT~)eq$KFV-S-e9Nb-Tug+yweRsO?zU9#iVL1dbkNHEx;FV6`W4F~!-z5u2 zAw6FqaeEq$33x@z$GT@Ld-)dyx$$m?skX+a$OPQlRz8 z7~DtI%gFJIMj?-sx*S8n_XC6%_=+f$8Blv_U3Mrst(uRmD(2UQ?sngjEBuV`DGe35 zH}Q*THf@+zstuo=&(}8$k9Xhjczi4tf!!KV1FY3F+F3=}L}nTAs$z;BU^+An9}5^d z>}{n(1zHyiD3-#4I`)dFYIdk*0dxwVjyhfzT^oj7%KR$qd^IYzZ9r{RU`Go*KWyd?b9-CSn; z*C^xTSuh z)sx9V$cqWi3whub^QSrvzg3^_z-$y#u|0EWa(iYY(Jf>Xm-8kQ+Ccf3;S1>;nZ&!1JZyWBG#0Pm*~bzKV8feLQQZ;m=n4)VjJXVG^g+5trK0`pBo<4+ao z?$Z+Olte?`A0*nFX*49dX<~ixVnVL-4@$mAZ%DYS2v-5z%VN!&$Gk(_IW`g0Y@1kf zIWV0z5y;DFJk$WZGo`tNdTjiXcPjOQctH^@v5C{S5(Gxs@bpdW8tWo-x{be57NE0H zD4*|q)YZQUtc1owPwZxVzL)V;O^gCIWwhEitaLlagJ0-}u9HAMy*_ zp?n?Ad7(jrRGBE)(wo4Nmgb9RzjFeV+=uN^u=^V<}R!t=Nd_i75f3NB>_eBZx zp-puA^Z1qN_LHF7=O<=;_cfC959G*+X90h4(gHqz@<4i1dV529I|WQ#mC^gtCc(3m|R7->?nIBF>Y!lp=DXTwYr{GWQk08vqUCpfM1d&GEp>b zBXP|HEI9mM;rnZ<={yuI$W8@eW){z%-b&$>Jmu`uK)V*LQNTzZa)@|^52!s#pUmQ? zYA4Zk(%=))U>&e6VUTaE(?}1$Qa7G%7b5U6d&Xwklfg&f7X&`2B=M1Ug|D3XFLInO zo;8d9PQo9P@UwvXu7n?4f68@1hUPCA8awjN2{e$9Xbz-Zv5B;uw~4eJ_LY-KB5ea2 zirxL~BDQY3NSgz{GHGi_tZ#UkPtWXD9ImC{=boYTg9eEaBm6 z&Kig$)8&{0`s3|lvw}0p2%u|2?0n9G>*Pngdf{yPf`r~8J)aNk=Y{8-HXU>AO*wwD zDMo*NyQRGuOQ`irX$h2*mXJ8ap19e3m5|f?UEAi-39(4U9;n{>A0jMMRTSneP-*Li@l7p~c2tWxHQ9zNE6i3V< zxa(jq!WodhMK5u{iGlN?9EIVf2cnv?MwPRx!XhdRo_@G3!#%s$ViBA=gO-_sJ9rVskX!|Hn({ZPQG{xhMRM9S0vb?gu`84 zKm%LhFwECDVkS%$&1V4DWwCJyF8Sun!}%-PJ)#T>000T{rA3;1II;J|RN ziYvCRS}-xU21mAe@wW+o7sKl}t^qIKsEE@w{=LY@kGLPHuDQQh;1zuN63m6{Zq;`e z*pD{+?9QRhbTcs?FB6sWc)C*BAgc?pQs7R0^y_l)jiw;}^*OkU6qKc==X+jE{Qq1~ zUtUb{9SW)}lf96MHIWyJq_(jgQ`auOpdnF6VzT8U9Xb+DMGm_-UgMD|q(L07=OQEB zJ0;L|r#N1>;aBE(4dES_2iCqz_d9u!Ifc9_3g-26!Gr<*HBm79oO#-H0@TH!`gU{% zc^{+-i&JN+WWkwA`Yz)J^gn<&A>75u(T<4krPl%2$#o!opOc@oJ|?&Lfml8HLb&o- z+7%rH{wZB~qT`@zh)W8w+q3$2Q1Ri%hYk8+s2@JILL5Rp_?U!x z6X6l-cI!&JYIQ}_DE{CWLfFR8r~KqoL%fLAD3CS@ltzKjD6|`68bf*XK+6I155-57 j3(NR}g|xf^%?ryo)=JAbDGAG=ZO%j>o=y1DA58ua`S=X# delta 3262 zcmb_eeNa@_70R5<0Nd@&VLgi%5MacANFv;KA=&lOKY59k$^`#pJwb4{0&G zLRx%NQ*`Z=aX;qOCvY(Bs(l6?c|=Rne+K9q&Wk(GGtewrvgXoK+=+N$IMw*W(mW7v z13s2n2fx7DMQM02Q-!zWlhd_8Num5JfcL7>jE^$cfchts@@5!noz7Ej$%OehvVeJc zRzVs4S=lNlU!nx#Y}UIVz6A7Vd*Q37%7cgs&ZJw#7p6+B>nl(f3u$~2wq|Cqf|H1z z;E7}>B(W9ywv>XonD26;mfNG&n0(a{K8`*e;e%Z4 z%W^5ab_s}Xp|L-&0-y&k=dTB!kb(#gUY5N`^cTGI~i5F!ox7OCP_0@I2Lczs*Zz_+fG z=Af3X=TcSm4K%oc@+o+$XfM1;lCoUPc`@qblyt&tuQ`l88km{r-rY6=~SSP)%oEnDI>Be8N7h*vCFQ&mM)c&BG2+geIF zgQqK;M%?CcP_Gf=;2u2#k3U@k?-DLOF0x@Wq{U;YI~&)y3&pkQ){BVba#Z(>)K!>S zv+yOt*k>+?&n@`IGwa|Bsr{MMUQdWw*2doI4shW0>H-mO#d|rKs>8}YNNmJYjQc#5 z6wR;WJt~|O%b;}m0?e9Xyc!m3uK5(ouyjkM*eJQ61g}=PY$b#!##>wN*>?~(O}0xC zrsUAJC?yn=l!@1{waz6PEm&HXi0A5ZVI>{kCi@|i;CoitOGbG%cXs9S?8dhq0&(1m zk2W-l6Q+$HNgJC;>logxavC=px7flFc|1vjiX+n6lqpQEWz{93Z` ztf%SuxxCq?De-5S7rmKAq*N88HN!DkDmcdbQrN(>6$_gG0V-zga6>GPZcoROWE&{* zskGXzR1rwnxYgmE9dD^lTliMIzH<TUfn_nz)(O$l(I z>z{Lgk?t~}#xf5O?m1gX`*y?-{(SEWrPg%AZ{1|i-(WokdK+K^Wt&I5PCoGw*AuW% zkw;waJFeC%;UoUk_blxCceQ#2r$!grgOC%V6q<##nV?qEaWROBi@}TGVwCoe2r;SP zHU9}X5;Z{WiL9`Jodg|Y1K%{>3)}^GNk)#k?Mfp>PAJCT_ZRm+Dssz+(qt>0+0?kp)N%JrK z3-s$E^O+NwId!pqg=>112L2%`_. The binary, by itself, can be compiled for most systems. However, this binary is designed to manage a certain number of Operating Systems. As of version 0.5, the netclient can be run as a system daemon on linux distributions with systemd, or as an "unmanaged" client on distributions without systemd. +The netclient is, at its core, a golang binary. Source code can be found in the netclient folder of the Netmaker `GitHub Repository `_. The binary, by itself, can be compiled for most systems. However, this binary is designed to manage a certain number of Operating Systems. As of version 0.8, the netclient can be run as a system daemon on linux distributions with systemd, or as an "unmanaged" client on distributions without systemd. The netclient for Windows and Mac will run as a Windows Service or LaunchDaemon, respectively. The netclient is installed via a simple bash script, which pulls the latest binary and runs 'register' and 'join' commands. @@ -95,17 +97,19 @@ The 'register' command adds a WireGuard tunnel directly to the netmaker server, The 'join' command attempts to add the machine to the Netmaker network using sensible defaults, which can be overridden with a config file or environment variables. Assuming the netclient has a valid key (or the network allows manual node signup), it will be registered into the Netmaker network, and will be returned necessary configuration details for how to set up its local network. -The netclient then sets up the systemd daemon (if running in daemon mode), and configures WireGuard. At this point it should be part of the network. +The netclient then sets up the system daemon (if running in daemon mode), and configures WireGuard. At this point it should be part of the network. If running in daemon mode, on a periodic basis (systemd timer), the netclient performs a "check in." It will authenticate with the server, and check to see if anything has changed in the network. It will also post changes about its own local configuration if there. If there has been a change, the server will return new configurations and the netclient will reconfigure the network. If not running in daemon mode, it is up to the operator to perform check ins (netclient checkin -n < network name >). The check in process is what allows Netmaker to create dynamic mesh networks. As nodes are added to, removed from, and modified on the network, other nodes are notified, and make appropriate changes. -rqlite --------- +sqlite and rqlite +--------------------- -As of v0.7, Netmaker uses rqlite, a distributed (RAFT consensus) database, and interacts with this database to store and retrieve information about nodes, networks, and users. With the 0.7 refactor, additional database support is very easy to implement. Netmaker uses simple key value lookups to run the networks, and the database was designed to be extensible, so support for key-value stores and other SQL-based databases can be achieved by changing a single file. +As of v0.8, Netmaker uses sqlite by default as a database. It can also use rqlite, a distributed (RAFT consensus) databaseand. Netmaker interacts with this database to store and retrieve information about nodes, networks, and users. + +Additional database support (besides sqlite and rqlite) is very easy to implement for special use cases. Netmaker uses simple key value lookups to run the networks, and the database was designed to be extensible, so support for key-value stores and other SQL-based databases can be achieved by changing a single file. Netmaker UI --------------- @@ -120,8 +124,6 @@ CoreDNS Netmaker allows users to provide and manage Private DNS for their nodes. This requires a nameserver, and CoreDNS is the chosen nameserver. CoreDNS is lightweight and extensible. CoreDNS loads dns settings from a simple file, managed by Netmaker, and serves out DNS info for managed nodes. DNS can be tricky, and DNS management is currently only supported on a small set of devices, specifically those running systemd-resolved. However, the Netmaker CoreDNS instance can be added manually as a nameserver to other devices. DNS mode can also be turned off. -Worth considering is that CoreDNS requires port 53 on the Netmaker host system, which may cause conflicts depending on your operating system. This is explained in the :doc:`Server Installation <./server-installation>` guide. - External Client ---------------- @@ -129,7 +131,9 @@ The external client is simply a manually configured WireGuard connection to your Most machines can run WireGuard. It is fairly simple to set up a WireGuard connection to a single endpoint. It is setting up mesh networks and other topologies like site-to-site which becomes complicated. -Netmaker v0.5 introduces the "external client" to handle any devices which are not currently compatible with the netclient, including Windows, iPhone, Android, and Mac. Over time, this list will be eliminated and there may not even be a need for the external client. +Mac, Windows, and Linux are handled natively by the Netclient. + +Netmaker can issue "external clients" to handle any devices which are not currently compatible with the netclient, including iPhone, Android, and some Unix distributions. Over time, this list will be eliminated and there may not even be a need for the external client. External clients hook into a Netmaker network via an "Ingress Gateway," which is configured for a given node and allows traffic to flow into the network. @@ -160,9 +164,13 @@ Below is a high level, step-by-step overview of the flow of communications withi Compatible Systems for Netclient ================================== -To manage a node manually, the Netclient can be compiled and run for most linux distibutions, with a prerequisite of WireGuard. +To manage a node manually, the Netclient can be compiled and run for most linux distibutions, with a prerequisite of WireGuard with kernel headers. If the netclient from the release pages does not run natively on your system, you may need to compile the netclient binary directly on the machine from the source code. This may be true for some installations of SUSE, Fedora, and some Debian-based systems. However, if the dependencies are installed on the machine, the netclient should run correctly after being compiled. -To manage a node automatically, the Netmaker client (netclient) requires **systemd-based linux.** Compatible systems include: +Simply clone the repo, cd to netmaker/netclient and run "go build" (Golang must be installed). + +The following systems should be operable natively with Netclient in daemon mode: + - Windows + - Mac - Fedora - Ubuntu - Debian @@ -173,7 +181,7 @@ To manage a node automatically, the Netmaker client (netclient) requires **syste - Arch - CentOS - CoreOS - + To manage DNS (optional), the node must have systemd-resolved. Systems that have this enabled include: - Arch - Debian @@ -181,8 +189,6 @@ To manage DNS (optional), the node must have systemd-resolved. Systems that have - SUSE Limitations -=========== +============= -Install limitations mostly include platform-specific limitations, such as needing systemd or systemd-resolved (see above). - -In addition the Netmaker is currently unable to route traffic for for devices behind a "carrier-grade NAT". This will be solved in a future release with the introduction of relay servers. \ No newline at end of file +Install limitations mostly include platform-specific dependencies. A failed netclient install should display information about which command is failing, or which libraries are missing. This can often be solved via machine upgrade, installing missing dependencies, or setting kernel headers on the machine for WireGuard (e.x.: `Installing Kernel Headers on Debian `_) \ No newline at end of file diff --git a/docs/_build/html/_sources/client-installation.rst.txt b/docs/_build/html/_sources/client-installation.rst.txt index 14ce6238..772cd715 100644 --- a/docs/_build/html/_sources/client-installation.rst.txt +++ b/docs/_build/html/_sources/client-installation.rst.txt @@ -19,6 +19,17 @@ The netclient agent connects to the server, pushing and pulling information when The netclient agent then configures WireGuard (and other network properties) locally, so that the network stays intact. +Notes on Windows +================================== + +If running the netclient on windows, you must download the netclient.exe binary and run it from Powershell as an Administrator. + +Windows will by default have firewall rules that prevent inbound connections. If you wish to allow inbound connections from particular peers, use the following command: + +``netsh advfirewall firewall add rule name="Allow from " dir=in action=allow protocol=ANY remoteip=`` + +If you want to allow all peers access, but do not want to configure firewall rules for all peers, you can configure access for one peer, and set it as a Relay Server. + Modes and System Compatibility ================================== @@ -36,11 +47,9 @@ As a CLI, the netclient should function on any Linux or Unix based system that h Daemon ---------- -The netclient is intended to be run as a system daemon. This allows it to automatically retrieve and send updates. To do this, the netclient can install itself as a systemd service. +The netclient is intended to be run as a system daemon. This allows it to automatically retrieve and send updates. To do this, the netclient can install itself as a systemd service, or launchd/windows service for Mac or Windows. -This requires a systemd-based linux operating system. - -If running the netclient on a non-systemd system, it is recommended to manually configure the netclient as a daemon using whatever method is acceptable on the chosen operating system. +If running the netclient on non-systemd linux, it is recommended to manually configure the netclient as a daemon using whatever method is acceptable on the chosen operating system. Private DNS Management ----------------------- diff --git a/docs/_build/html/_sources/external-clients.rst.txt b/docs/_build/html/_sources/external-clients.rst.txt index 66eddcae..3f8fa74d 100644 --- a/docs/_build/html/_sources/external-clients.rst.txt +++ b/docs/_build/html/_sources/external-clients.rst.txt @@ -16,7 +16,7 @@ By using this method, you can hook any machine into a netmaker network that can It is recommended to run the netclient where compatible, but for all other cases, a machine can be configured as an external client. -Important to note, an external client is not **reachable** by the network, meaning the client can establish connections to other machines, but those machines cannot independently establish a connection back. The External Client method should only be used in use cases where one wishes to access resource runnin on the virtual network, and **not** for use cases where one wishes to make a resource accessible on the network. For that, use netclient. +Important to note, an external client is not **reachable** by the network, meaning the client can establish connections to other machines, but those machines cannot independently establish a connection back. The External Client method should only be used in use cases where one wishes to access resource running on the virtual network, and **not** for use cases where one wishes to make a resource accessible on the network. For that, use netclient. Configuring an Ingress Gateway ================================== @@ -57,3 +57,16 @@ Example config file: .. literalinclude:: ./examplecode/myclient.conf Your client should now be able to access the network! A client can be invalidated at any time by simply deleting it from the UI. + +Configuring DNS for Ext Clients (OPTIONAL) +============================================ + +If you wish to have a DNS field on your ext clients conf, simply edit the network field as shown below to 1.1.1.1 or 8.8.8.8 for example. +If you do not want DNS on your ext client conf files, simply leave it blank. + +.. image:: images/exclient5.png + :width: 80% + :alt: Gateway + :align: center + +Important to note, your client automatically adds egress gateway ranges (if any on the same network) to it's allowed IPs. diff --git a/docs/_build/html/_sources/getting-started.rst.txt b/docs/_build/html/_sources/getting-started.rst.txt index 6d37149b..98fbd4af 100644 --- a/docs/_build/html/_sources/getting-started.rst.txt +++ b/docs/_build/html/_sources/getting-started.rst.txt @@ -66,7 +66,8 @@ Deploy Nodes 1. SSH to each machine 2. ``sudo su -`` 3. **Prerequisite Check:** Every Linux machine on which you run the netclient must have WireGuard and systemd installed -4. Run the install command, Ex: ``curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netclient-install.sh | KEY=vm3ow4thatogiwnsla3thsl3894ths sh -`` +4. For linux machines with SystemD and WireGuard installed, Run the install command, Ex: ``curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netclient-install.sh | KEY=vm3ow4thatogiwnsla3thsl3894ths sh -`` +5. For Mac, Windows, and arch-specific linux distributions (e.g. ARM), `download the appropriate netclient for your system `_ . Then, run "netclient join -t ". You should get output similar to the below. The netclient retrieves local settings, submits them to the server for processing, and retrieves updated settings. Then it sets the local network configuration. For more information about this process, see the :doc:`client installation <./client-installation>` documentation. If this process failed and you do not see your node in the console (see below), then reference the :doc:`troubleshooting <./troubleshoot>` documentation. diff --git a/docs/_build/html/_sources/quick-start.rst.txt b/docs/_build/html/_sources/quick-start.rst.txt index a54ed32a..c9f2734b 100644 --- a/docs/_build/html/_sources/quick-start.rst.txt +++ b/docs/_build/html/_sources/quick-start.rst.txt @@ -7,16 +7,15 @@ This quick start guide is an **opinionated** guide for getting up and running wi 0. Introduction ================== -We assume for this installation that you want all of the Netmaker features enabled, want your server to be secure, and want it to be accessible from anywhere. +We assume for this installation that you want all of the Netmaker features enabled, you want your server to be secure, and you want your server to be accessible from anywhere. -This instance will not be HA. However, it should comfortably handle around one hundred concurrent clients and support most use cases. +This instance will not be HA. However, it should comfortably handle around one hundred concurrent clients and support the most common use cases. -If you are deploying for an enterprise use case, please contact info@gravitl.com for support. +If you are deploying for a business or enterprise use case and this setup will not fit your needs, please contact info@gravitl.com, or check out the business subscription plans at https://gravitl.com/plans/business. By the end of this guide, you will have Netmaker installed on a public VM linked to your custom domain, secured behind an Nginx reverse proxy. -If this configuration does not fit your use case, see the :doc:`Advanced Installation <./server-installation>` docs. - +For information about deploying more advanced configurations, see the :doc:`Advanced Installation <./server-installation>` docs. 1. Prerequisites @@ -24,9 +23,11 @@ If this configuration does not fit your use case, see the :doc:`Advanced Install - **Virtual Machine** - Preferably from a cloud provider (e.x: DigitalOcean, Linode, AWS, GCP, etc.) + - We do not recommend Oracle Cloud, as VM's here have been known to cause network interference. - Public, static IP - - Min 2GB RAM, 1 CPU (4GB RAM, 2CPU preferred) - - 5GB+ of storage + - Min 1GB RAM, 1 CPU (4GB RAM, 2CPU preferred) + - Nginx may have performance issues if using a cloud VPS with a single, shared CPU + - 2GB+ of storage - Ubuntu 20.04 Installed - **Domain** @@ -47,11 +48,11 @@ Begin by installing the community version of Docker and docker-compose (there ar sudo apt-get remove docker docker-engine docker.io containerd runc sudo apt-get update - sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release + sudo apt-get -y install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update - sudo apt-get install docker-ce docker-ce-cli containerd.io + sudo apt-get -y install docker-ce docker-ce-cli containerd.io sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker --version @@ -64,7 +65,7 @@ Install Dependencies In addition to Docker, this installation requires WireGuard, Nginx, and Certbot. -``sudo apt install wireguard wireguard-tools nginx certbot python3-certbot-nginx net-tools`` +``sudo apt -y install wireguard wireguard-tools nginx certbot python3-certbot-nginx net-tools`` 3. Prepare VM @@ -109,20 +110,9 @@ Make sure firewall settings are appropriate for Netmaker. You need ports 53 and - allow 443/tcp from all - allow 53/udp and 53/tcp from all -Prepare for DNS ----------------------------------------------------------------- - -On Ubuntu 20.04, by default there is a service consuming port 53 related to DNS resolution. We need port 53 open in order to run our own DNS server. The below steps will disable systemd-resolved, and insert a generic DNS nameserver for local resolution. - -.. code-block:: - - systemctl stop systemd-resolved - systemctl disable systemd-resolved - vim /etc/systemd/resolved.conf - * uncomment DNS and add 8.8.8.8 or whatever reachable nameserver is your preference * - * uncomment DNSStubListener and set to "no" * - ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf +In addition to the above ports, you will need to make sure that your cloud's firewall or security groups are opened for the range of ports that Netmaker's WireGuard interfaces consume. +Netmaker will create one interface per network, starting from 51821. So, if you plan on having 5 networks, you will want to have at least 51821-51825 open (udp). Prepare Nginx ----------------- @@ -148,23 +138,28 @@ Insert your domain in the configuration file and add to nginx: Prepare Templates ------------------ +**Note on COREDNS_IP:** Depending on your cloud provider, the public IP may not be bound directly to the VM on which you are running. In such cases, CoreDNS cannot bind to this IP, and you should use the IP of the default interface on your machine in place of COREDNS_IP. If the public IP **is** bound to the VM, you can simply use the same IP as SERVER_PUBLIC_IP. + .. code-block:: - wget https://raw.githubusercontent.com/gravitl/netmaker/develop/compose/docker-compose.quickstart.yml - sed -i 's/NETMAKER_BASE_DOMAIN//g' docker-compose.quickstart.yml - sed -i 's/SERVER_PUBLIC_IP//g' docker-compose.quickstart.yml + wget https://raw.githubusercontent.com/gravitl/netmaker/develop/compose/docker-compose.yml + sed -i 's/NETMAKER_BASE_DOMAIN//g' docker-compose.yml + sed -i 's/SERVER_PUBLIC_IP//g' docker-compose.yml + sed -i 's/COREDNS_IP//g' docker-compose.yml Generate a unique master key and insert it: .. code-block:: tr -dc A-Za-z0-9 /g' docker-compose.quickstart.yml + sed -i 's/REPLACE_MASTER_KEY//g' docker-compose.yml + +You may want to save this key for future use with the API. Start Netmaker ---------------- -``sudo docker-compose -f docker-compose.quickstart.yml up -d`` +``sudo docker-compose -f docker-compose.yml up -d`` navigate to dashboard. to see your nginx instance. @@ -172,4 +167,4 @@ To troubleshoot issues, start with: ``docker logs netmaker`` -Or check out the :doc:`troubleshoooting docs <./troubleshoot>`. \ No newline at end of file +Or check out the :doc:`troubleshoooting docs <./troubleshoot>`. diff --git a/docs/_build/html/_sources/server-installation.rst.txt b/docs/_build/html/_sources/server-installation.rst.txt index 56b324ed..d4a15f8b 100644 --- a/docs/_build/html/_sources/server-installation.rst.txt +++ b/docs/_build/html/_sources/server-installation.rst.txt @@ -98,6 +98,21 @@ DNS_MODE: **Description:** Enables DNS Mode, meaning config files will be generated for CoreDNS. +DATABASE: + **Default:** "sqlite" + + **Description:** Specify db type to connect with. Currently, options include "sqlite" and "rqlite". + +SQL_CONN: + **Default:** "http://" + + **Description:** Specify the necessary string to connect with your local or remote sql database. + +CLIENT_MODE: + **Default:** "on" + + **Description:** Specifies if server should deploy itself as a node (client) in each network. May be turned to "off" for more restricted servers. + Config File Reference ---------------------- A config file may be placed under config/environments/.yml. To read this file at runtime, provide the environment variable NETMAKER_ENV at runtime. For instance, dev.yml paired with ENV=dev. Netmaker will load the specified Config file. This allows you to store and manage configurations for different environments. Below is a reference Config File you may use. diff --git a/docs/_build/html/_sources/troubleshoot.rst.txt b/docs/_build/html/_sources/troubleshoot.rst.txt index 00de89a7..0fffe692 100644 --- a/docs/_build/html/_sources/troubleshoot.rst.txt +++ b/docs/_build/html/_sources/troubleshoot.rst.txt @@ -4,9 +4,9 @@ Troubleshooting Common Issues -------------- -**How can I connect my Android, IOS, MacOS or Windows device to my Netmaker VPN?** +**How can I connect my Android or IOS device to my Netmaker VPN?** Currently meshing one of these devices is not supported, however it will be soon. - For now you can connect to your VPN by making one of the nodes an Ingressgateway, then + For now you can connect to your VPN by making one of the nodes an Ingress Gateway, then create an Ext Client for each device. Finally, use the official WG app or another WG configuration app to connect via QR or downloading the device's WireGuard configuration. @@ -22,8 +22,16 @@ Common Issues Yes, we have an active `discord `_ community and issues on our `github `_ are answered frequently! You can also sign-up for updates at our `gravitl site `_! +**How can I get additional support for my business?** + Check out our business support subscriptions at https://gravitl.com/plans. Subscription holders can also purchase consulting credits via the site. + + Server ------- + +**I upgraded from 0.7 to 0.8 and now I dont have any data in my server!** + In 0.8, sqlite becomes the default database. If you were running with rqlite, you must set the DATABASE environment variable to rqlite in order to continue using rqlite. + **Can I secure/encrypt all the traffic to my server and UI?** This can fairly simple to achieve assuming you have access to a domain and are familiar with Nginx. Please refer to the quick-start guide to see! @@ -63,7 +71,7 @@ UI Yes, nodes can share names without issue. It may just be harder on you to know which is which. Netclient -------- +----------- **How do I connect a node to my Netmaker network with Netclient?** First get your access token (not just access key), then run ``sudo netclient join -t ``. **NOTE:** netclient may be under /etc/netclient/, i.e run ``sudo /etc/netclient/netclient join -t `` @@ -91,6 +99,9 @@ Netclient sudo chcon -Rv -u system_u -t bin_t '/etc/netclient/netclient' sudo restorecon -R -v /etc/netclient/netclient +**I have a handshake with a peer but can't ping it, what gives?** + This is commonly due to incorrect MTU settings. Typically, it will be because MTU is too high. Try setting MTU lower on the node. This can be done via netconfig, or by editing the node in the UI. + CoreDNS -------- **Is CoreDNS required to use Netmaker?** diff --git a/docs/_build/html/architecture.html b/docs/_build/html/architecture.html index 0badaca2..43e17a32 100644 --- a/docs/_build/html/architecture.html +++ b/docs/_build/html/architecture.html @@ -268,7 +268,7 @@
  • Netclient
  • -
  • rqlite +
  • sqlite and rqlite
  • Netmaker UI
  • @@ -540,6 +540,13 @@ Adding Clients to a Gateway + +
  • + + + Configuring DNS for Ext Clients (OPTIONAL) + +
  • @@ -747,7 +754,7 @@
  • Netclient
  • -
  • rqlite +
  • sqlite and rqlite
  • Netmaker UI
  • @@ -809,7 +816,8 @@

    SystemD

    SystemD is a system service manager for a wide array of Linux operating systems. Not all Linux distributions have adopted systemd, but, for better or worse, it has become a fairly common standard in the Linux world. That said, any non-Linux operating system will not have systemd, and many Linux/Unix distributionshave alternative system service managers.

    -

    Netmaker’s netclient, the agent which controls networking on all nodes, can be run as a CLI or as a system daemon. It runs as a daemon by default, and this requires systemd. As Netmaker evolves, systemd will become just one of the possible service management options, allowing the netclient to be run on a wider array of devices. However, for the time being, the netclient should be run “unmanaged” (netclient join -daemon=off) on systems that do not run systemd, and some other method can be used like a cron job or custom script.

    +

    Netmaker’s netclient, the agent which controls networking on all nodes, can be run as a CLI or as a system daemon. On Linux, it runs as a daemon by default, and this requires systemd. As Netmaker evolves, systemd will become just one of the possible service management options, allowing the netclient to be run on a wider array of devices. However, for the time being, the netclient should be run “unmanaged” (netclient join -daemon=off) on systems that do not run systemd, and some other method can be used like a cron job or custom script.

    +

    As of 0.8, Mac and Windows are supported. On these operating systems, netclient launches the daemon using LaunchD and Windows Service, respectively, as opposed to SystemD.

    @@ -821,21 +829,22 @@

    The Netmaker server acts as an API to the front end, and as a GRPC server to the machines in the network. GRPC is much faster and more efficient than standard API calls, which increases the speed of transactions. For this reason, the Netmaker server exposes two ports: The default for the API is 8081, and the default for GRPC is 50051. Either the API or the GRPC server can be disabled on any given Netmaker instance can be disabled, allowing you to deploy two different servers for managing the API (which is largely for the admin’s use) and GRPC (which is largely for the nodes’ use).

    Most server settings are configurable via a config file, or by environment variables (which take precedence). If the server finds neither of these, it sets sensible defaults, including things like the server’s reachable IP, ports, and which “modes” to run in.

    These modes include client mode and dns mode. Either of these can be disabled but are enabled by default. Client mode allows you to treat the Netmaker host machine (operating system) as a network Node, installing the netclient and controlling the host network. DNS mode has the server write config settings for CoreDNS, a separate component and nameserver, which picks up the config settings to manage node DNS.

    -

    The Netmaker server interacts with rqlite, a distributed version of sqlite, which holds information about nodes, networks, users, and other important data. This data is configuration data. For the most part, Netmaker serves configuration data to Nodes, telling them how they should configure themselves. The Netclient is the agent that actually does that configuration.

    +

    The Netmaker server interacts with either sqlit (default) or rqlite, a distributed version of sqlite, as its database. This DB holds information about nodes, networks, users, and other important data. This data is configuration data. For the most part, Netmaker serves configuration data to Nodes, telling them how they should configure themselves. The Netclient is the agent that actually does that configuration.

    Netclient

    -

    The netclient is, at its core, a golang binary. Source code can be found in the netclient folder of the Netmaker GitHub Repository. The binary, by itself, can be compiled for most systems. However, this binary is designed to manage a certain number of Operating Systems. As of version 0.5, the netclient can be run as a system daemon on linux distributions with systemd, or as an “unmanaged” client on distributions without systemd.

    +

    The netclient is, at its core, a golang binary. Source code can be found in the netclient folder of the Netmaker GitHub Repository. The binary, by itself, can be compiled for most systems. However, this binary is designed to manage a certain number of Operating Systems. As of version 0.8, the netclient can be run as a system daemon on linux distributions with systemd, or as an “unmanaged” client on distributions without systemd. The netclient for Windows and Mac will run as a Windows Service or LaunchDaemon, respectively.

    The netclient is installed via a simple bash script, which pulls the latest binary and runs ‘register’ and ‘join’ commands.

    The ‘register’ command adds a WireGuard tunnel directly to the netmaker server, for all subsequent communication.

    The ‘join’ command attempts to add the machine to the Netmaker network using sensible defaults, which can be overridden with a config file or environment variables. Assuming the netclient has a valid key (or the network allows manual node signup), it will be registered into the Netmaker network, and will be returned necessary configuration details for how to set up its local network.

    -

    The netclient then sets up the systemd daemon (if running in daemon mode), and configures WireGuard. At this point it should be part of the network.

    +

    The netclient then sets up the system daemon (if running in daemon mode), and configures WireGuard. At this point it should be part of the network.

    If running in daemon mode, on a periodic basis (systemd timer), the netclient performs a “check in.” It will authenticate with the server, and check to see if anything has changed in the network. It will also post changes about its own local configuration if there. If there has been a change, the server will return new configurations and the netclient will reconfigure the network. If not running in daemon mode, it is up to the operator to perform check ins (netclient checkin -n < network name >).

    The check in process is what allows Netmaker to create dynamic mesh networks. As nodes are added to, removed from, and modified on the network, other nodes are notified, and make appropriate changes.

    -

    rqlite

    -

    As of v0.7, Netmaker uses rqlite, a distributed (RAFT consensus) database, and interacts with this database to store and retrieve information about nodes, networks, and users. With the 0.7 refactor, additional database support is very easy to implement. Netmaker uses simple key value lookups to run the networks, and the database was designed to be extensible, so support for key-value stores and other SQL-based databases can be achieved by changing a single file.

    +

    sqlite and rqlite

    +

    As of v0.8, Netmaker uses sqlite by default as a database. It can also use rqlite, a distributed (RAFT consensus) databaseand. Netmaker interacts with this database to store and retrieve information about nodes, networks, and users.

    +

    Additional database support (besides sqlite and rqlite) is very easy to implement for special use cases. Netmaker uses simple key value lookups to run the networks, and the database was designed to be extensible, so support for key-value stores and other SQL-based databases can be achieved by changing a single file.

    Netmaker UI

    @@ -845,13 +854,13 @@

    CoreDNS

    Netmaker allows users to provide and manage Private DNS for their nodes. This requires a nameserver, and CoreDNS is the chosen nameserver. CoreDNS is lightweight and extensible. CoreDNS loads dns settings from a simple file, managed by Netmaker, and serves out DNS info for managed nodes. DNS can be tricky, and DNS management is currently only supported on a small set of devices, specifically those running systemd-resolved. However, the Netmaker CoreDNS instance can be added manually as a nameserver to other devices. DNS mode can also be turned off.

    -

    Worth considering is that CoreDNS requires port 53 on the Netmaker host system, which may cause conflicts depending on your operating system. This is explained in the Server Installation guide.

    External Client

    The external client is simply a manually configured WireGuard connection to your network, which Netmaker helps to manage.

    Most machines can run WireGuard. It is fairly simple to set up a WireGuard connection to a single endpoint. It is setting up mesh networks and other topologies like site-to-site which becomes complicated.

    -

    Netmaker v0.5 introduces the “external client” to handle any devices which are not currently compatible with the netclient, including Windows, iPhone, Android, and Mac. Over time, this list will be eliminated and there may not even be a need for the external client.

    +

    Mac, Windows, and Linux are handled natively by the Netclient.

    +

    Netmaker can issue “external clients” to handle any devices which are not currently compatible with the netclient, including iPhone, Android, and some Unix distributions. Over time, this list will be eliminated and there may not even be a need for the external client.

    External clients hook into a Netmaker network via an “Ingress Gateway,” which is configured for a given node and allows traffic to flow into the network.

    @@ -880,9 +889,12 @@

    Compatible Systems for Netclient

    -

    To manage a node manually, the Netclient can be compiled and run for most linux distibutions, with a prerequisite of WireGuard.

    +

    To manage a node manually, the Netclient can be compiled and run for most linux distibutions, with a prerequisite of WireGuard with kernel headers. If the netclient from the release pages does not run natively on your system, you may need to compile the netclient binary directly on the machine from the source code. This may be true for some installations of SUSE, Fedora, and some Debian-based systems. However, if the dependencies are installed on the machine, the netclient should run correctly after being compiled.

    +

    Simply clone the repo, cd to netmaker/netclient and run “go build” (Golang must be installed).

    -
    To manage a node automatically, the Netmaker client (netclient) requires systemd-based linux. Compatible systems include:
      +
      The following systems should be operable natively with Netclient in daemon mode:
        +
      • Windows

      • +
      • Mac

      • Fedora

      • Ubuntu

      • Debian

      • @@ -906,8 +918,7 @@

        Limitations

        -

        Install limitations mostly include platform-specific limitations, such as needing systemd or systemd-resolved (see above).

        -

        In addition the Netmaker is currently unable to route traffic for for devices behind a “carrier-grade NAT”. This will be solved in a future release with the introduction of relay servers.

        +

        Install limitations mostly include platform-specific dependencies. A failed netclient install should display information about which command is failing, or which libraries are missing. This can often be solved via machine upgrade, installing missing dependencies, or setting kernel headers on the machine for WireGuard (e.x.: Installing Kernel Headers on Debian)

        diff --git a/docs/_build/html/client-installation.html b/docs/_build/html/client-installation.html index 629399e9..24343227 100644 --- a/docs/_build/html/client-installation.html +++ b/docs/_build/html/client-installation.html @@ -432,6 +432,8 @@
        • Introduction to Netclient
        • +
        • Notes on Windows +
        • Modes and System Compatibility
        • @@ -729,6 +745,8 @@
          • Introduction to Netclient
          • +
          • Notes on Windows +
          • Modes and System Compatibility
          • @@ -510,6 +519,13 @@ Adding Clients to a Gateway + +
          • + + + Configuring DNS for Ext Clients (OPTIONAL) + +
          @@ -702,6 +718,8 @@
        • Configuring an Ingress Gateway
        • Adding Clients to a Gateway +
        • +
        • Configuring DNS for Ext Clients (OPTIONAL)
        @@ -729,7 +747,7 @@

        An external client is not “managed,” meaning it does not automatically pull the latest network configuration, or push changes to its configuration. Instead, it uses a generated WireGuard config file to access the designated Ingress Gateway, which is a managed server (running netclient). This server then forwards traffic to the appropriate endpoint, acting as a middle-man/relay.

        By using this method, you can hook any machine into a netmaker network that can run WireGuard.

        It is recommended to run the netclient where compatible, but for all other cases, a machine can be configured as an external client.

        -

        Important to note, an external client is not reachable by the network, meaning the client can establish connections to other machines, but those machines cannot independently establish a connection back. The External Client method should only be used in use cases where one wishes to access resource runnin on the virtual network, and not for use cases where one wishes to make a resource accessible on the network. For that, use netclient.

        +

        Important to note, an external client is not reachable by the network, meaning the client can establish connections to other machines, but those machines cannot independently establish a connection back. The External Client method should only be used in use cases where one wishes to access resource running on the virtual network, and not for use cases where one wishes to make a resource accessible on the network. For that, use netclient.

        Configuring an Ingress Gateway

        @@ -760,6 +778,13 @@

        Your client should now be able to access the network! A client can be invalidated at any time by simply deleting it from the UI.

        +

        Configuring DNS for Ext Clients (OPTIONAL)

        +

        If you wish to have a DNS field on your ext clients conf, simply edit the network field as shown below to 1.1.1.1 or 8.8.8.8 for example. +If you do not want DNS on your ext client conf files, simply leave it blank.

        +Gateway +

        Important to note, your client automatically adds egress gateway ranges (if any on the same network) to it’s allowed IPs.

        + + diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html index 1d6c899b..d7d658b5 100644 --- a/docs/_build/html/genindex.html +++ b/docs/_build/html/genindex.html @@ -425,6 +425,13 @@ Introduction to Netclient + +
      • + + + Notes on Windows + +
      • @@ -488,6 +495,13 @@ Adding Clients to a Gateway +
      • +
      • + + + Configuring DNS for Ext Clients (OPTIONAL) + +
      diff --git a/docs/_build/html/getting-started.html b/docs/_build/html/getting-started.html index d773d423..1cf328e0 100644 --- a/docs/_build/html/getting-started.html +++ b/docs/_build/html/getting-started.html @@ -518,6 +518,13 @@ Adding Clients to a Gateway + +
    • + + + Configuring DNS for Ext Clients (OPTIONAL) + +
    @@ -778,7 +785,8 @@
  • SSH to each machine

  • sudo su -

  • Prerequisite Check: Every Linux machine on which you run the netclient must have WireGuard and systemd installed

  • -
  • Run the install command, Ex: curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netclient-install.sh | KEY=vm3ow4thatogiwnsla3thsl3894ths sh -

  • +
  • For linux machines with SystemD and WireGuard installed, Run the install command, Ex: curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netclient-install.sh | KEY=vm3ow4thatogiwnsla3thsl3894ths sh -

  • +
  • For Mac, Windows, and arch-specific linux distributions (e.g. ARM), download the appropriate netclient for your system . Then, run “netclient join -t <your token>”.

  • You should get output similar to the below. The netclient retrieves local settings, submits them to the server for processing, and retrieves updated settings. Then it sets the local network configuration. For more information about this process, see the client installation documentation. If this process failed and you do not see your node in the console (see below), then reference the troubleshooting documentation.

    Output from Netclient Install diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html index 6d6dbb9d..cbdd1031 100644 --- a/docs/_build/html/index.html +++ b/docs/_build/html/index.html @@ -426,6 +426,13 @@ Introduction to Netclient + +
  • + + + Notes on Windows + +
  • @@ -489,6 +496,13 @@ Adding Clients to a Gateway +
  • +
  • + + + Configuring DNS for Ext Clients (OPTIONAL) + +
  • @@ -800,6 +814,7 @@ diff --git a/docs/_build/html/quick-start.html b/docs/_build/html/quick-start.html index 740b4e01..6ad1df54 100644 --- a/docs/_build/html/quick-start.html +++ b/docs/_build/html/quick-start.html @@ -308,8 +308,6 @@
  • Prepare Firewall
  • -
  • Prepare for DNS -
  • Prepare Nginx
  • @@ -473,6 +471,13 @@ Introduction to Netclient + +
  • + + + Notes on Windows + +
  • @@ -536,6 +541,13 @@ Adding Clients to a Gateway +
  • +
  • + + + Configuring DNS for Ext Clients (OPTIONAL) + +
  • @@ -741,8 +753,6 @@
  • Prepare Firewall
  • -
  • Prepare for DNS -
  • Prepare Nginx
  • @@ -771,21 +781,33 @@

    This quick start guide is an opinionated guide for getting up and running with Netmaker as quickly as possible.

    0. Introduction

    -

    We assume for this installation that you want all of the Netmaker features enabled, want your server to be secure, and want it to be accessible from anywhere.

    -

    This instance will not be HA. However, it should comfortably handle around one hundred concurrent clients and support most use cases.

    -

    If you are deploying for an enterprise use case, please contact info@gravitl.com for support.

    +

    We assume for this installation that you want all of the Netmaker features enabled, you want your server to be secure, and you want your server to be accessible from anywhere.

    +

    This instance will not be HA. However, it should comfortably handle around one hundred concurrent clients and support the most common use cases.

    +

    If you are deploying for a business or enterprise use case and this setup will not fit your needs, please contact info@gravitl.com, or check out the business subscription plans at https://gravitl.com/plans/business.

    By the end of this guide, you will have Netmaker installed on a public VM linked to your custom domain, secured behind an Nginx reverse proxy.

    -

    If this configuration does not fit your use case, see the Advanced Installation docs.

    +

    For information about deploying more advanced configurations, see the Advanced Installation docs.

    1. Prerequisites

    • Virtual Machine

        -
      • Preferably from a cloud provider (e.x: DigitalOcean, Linode, AWS, GCP, etc.)

      • +
      • +
        Preferably from a cloud provider (e.x: DigitalOcean, Linode, AWS, GCP, etc.)
          +
        • We do not recommend Oracle Cloud, as VM’s here have been known to cause network interference.

        • +
        +
        +
        +
      • Public, static IP

      • -
      • Min 2GB RAM, 1 CPU (4GB RAM, 2CPU preferred)

      • -
      • 5GB+ of storage

      • +
      • +
        Min 1GB RAM, 1 CPU (4GB RAM, 2CPU preferred)
          +
        • Nginx may have performance issues if using a cloud VPS with a single, shared CPU

        • +
        +
        +
        +
      • +
      • 2GB+ of storage

      • Ubuntu 20.04 Installed

    • @@ -805,11 +827,11 @@

      Begin by installing the community version of Docker and docker-compose (there are issues with the snap version). You can follow the official Docker instructions here. Or, you can use the below series of commands which should work on Ubuntu 20.04.

      sudo apt-get remove docker docker-engine docker.io containerd runc
       sudo apt-get update
      -sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
      +sudo apt-get -y install apt-transport-https ca-certificates curl gnupg lsb-release
       curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
       echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
       sudo apt-get update
      -sudo apt-get install docker-ce docker-ce-cli containerd.io
      +sudo apt-get -y install docker-ce docker-ce-cli containerd.io
       sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
       sudo chmod +x /usr/local/bin/docker-compose
       docker --version
      @@ -821,7 +843,7 @@
       
       

      Install Dependencies

      In addition to Docker, this installation requires WireGuard, Nginx, and Certbot.

      -

      sudo apt install wireguard wireguard-tools nginx certbot python3-certbot-nginx net-tools

      +

      sudo apt -y install wireguard wireguard-tools nginx certbot python3-certbot-nginx net-tools

      @@ -864,18 +886,8 @@
    - - -

    Prepare for DNS

    -

    On Ubuntu 20.04, by default there is a service consuming port 53 related to DNS resolution. We need port 53 open in order to run our own DNS server. The below steps will disable systemd-resolved, and insert a generic DNS nameserver for local resolution.

    -
    systemctl stop systemd-resolved
    -systemctl disable systemd-resolved
    -vim /etc/systemd/resolved.conf
    -  *  uncomment DNS and add 8.8.8.8 or whatever reachable nameserver is your preference  *
    -  *  uncomment DNSStubListener and set to "no"  *
    -ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
    -
    -
    +

    In addition to the above ports, you will need to make sure that your cloud’s firewall or security groups are opened for the range of ports that Netmaker’s WireGuard interfaces consume.

    +

    Netmaker will create one interface per network, starting from 51821. So, if you plan on having 5 networks, you will want to have at least 51821-51825 open (udp).

    Prepare Nginx

    @@ -895,20 +907,23 @@

    4. Install Netmaker

    Prepare Templates

    -
    wget https://raw.githubusercontent.com/gravitl/netmaker/develop/compose/docker-compose.quickstart.yml
    -sed -i 's/NETMAKER_BASE_DOMAIN/<your base domain>/g' docker-compose.quickstart.yml
    -sed -i 's/SERVER_PUBLIC_IP/<your server ip>/g' docker-compose.quickstart.yml
    +

    Note on COREDNS_IP: Depending on your cloud provider, the public IP may not be bound directly to the VM on which you are running. In such cases, CoreDNS cannot bind to this IP, and you should use the IP of the default interface on your machine in place of COREDNS_IP. If the public IP is bound to the VM, you can simply use the same IP as SERVER_PUBLIC_IP.

    +
    wget https://raw.githubusercontent.com/gravitl/netmaker/develop/compose/docker-compose.yml
    +sed -i 's/NETMAKER_BASE_DOMAIN/<your base domain>/g' docker-compose.yml
    +sed -i 's/SERVER_PUBLIC_IP/<your server ip>/g' docker-compose.yml
    +sed -i 's/COREDNS_IP/<your server ip>/g' docker-compose.yml
     

    Generate a unique master key and insert it:

    tr -dc A-Za-z0-9 </dev/urandom | head -c 30 ; echo ''
    -sed -i 's/REPLACE_MASTER_KEY/<your generated key>/g' docker-compose.quickstart.yml
    +sed -i 's/REPLACE_MASTER_KEY/<your generated key>/g' docker-compose.yml
     
    +

    You may want to save this key for future use with the API.

    Start Netmaker

    -

    sudo docker-compose -f docker-compose.quickstart.yml up -d

    +

    sudo docker-compose -f docker-compose.yml up -d

    navigate to dashboard.<your base domain> to see your nginx instance.

    To troubleshoot issues, start with:

    docker logs netmaker

    diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html index a9ff45c0..5e4fd866 100644 --- a/docs/_build/html/search.html +++ b/docs/_build/html/search.html @@ -431,6 +431,13 @@ Introduction to Netclient + +
  • + + + Notes on Windows + +
  • @@ -494,6 +501,13 @@ Adding Clients to a Gateway +
  • +
  • + + + Configuring DNS for Ext Clients (OPTIONAL) + +
  • diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index 2c412bf9..d0f8f193 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["about","api","architecture","client-installation","conduct","external-clients","getting-started","index","license","quick-start","server-installation","support","troubleshoot","usage"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["about.rst","api.rst","architecture.rst","client-installation.rst","conduct.rst","external-clients.rst","getting-started.rst","index.rst","license.rst","quick-start.rst","server-installation.rst","support.rst","troubleshoot.rst","usage.rst"],objects:{},objnames:{},objtypes:{},terms:{"0afehuytvin":3,"100":[1,6],"101":3,"127":10,"1443":[],"147":3,"168":3,"170":3,"172":1,"182":3,"192":3,"1b3282d4b7aa":[],"1b3282d4b7aa_":[],"200":1,"203":3,"236":5,"247":5,"251":3,"254":6,"27017":[],"2cpu":9,"2gb":9,"30s":10,"443":[9,10],"4gb":9,"500":[],"50051":[2,3,6,10],"50052":[],"50555":[],"51821":3,"51822":5,"534":[],"5gb":9,"5qktbtgsvb45y3qyrmwft":3,"6400":1,"8081":[1,2,3,10],"8082":10,"abstract":2,"break":3,"case":[1,2,3,5,7,9,10,12,13],"class":10,"default":[1,2,3,5,6,9,10],"final":12,"function":[1,3,10,11],"import":[2,5,6],"long":[0,6,11],"new":[2,3,6],"null":9,"public":[2,3,4,5,8,9],"return":[2,9],"short":3,"static":[2,9,10,12],"switch":[10,11],"true":[3,10],"try":11,"var":[1,10],"while":[2,11],AWS:[0,9,11],Adding:[6,7],Being:4,DNS:[2,7,12,13],For:[2,3,5,6,9,10,12],IOS:12,IPs:2,K3s:13,Not:2,That:2,The:[0,1,2,3,4,5,6,9,10,11],Then:[5,6,12],There:[0,1,3,6,11,12],These:[2,3,6],Use:[3,7],Used:[3,10],Useful:10,Using:[0,1,4,6,7],Will:3,With:[2,11],Yes:12,aa3bvg0rnitirxdx:1,abil:[11,12],abl:[1,2,5],abou:6,about:[2,3,6,10,11,12],abov:[2,3,6,9,10,11],absent:3,abus:4,acceler:[],accept:[3,4,5],access:[0,2,3,5,6,7,9,10,11,12,13],access_token_valu:10,accesskei:[1,3],accomplish:11,account:[4,12],achiev:[1,2,11,12],acm:9,across:[0,3],act:[2,4,5],action:[1,3,4],activ:12,actual:2,adapt:[4,10],add:[0,1,2,3,5,6,9,10],added:[2,3,6,10,11],adding:6,addit:[2,3,6,9,10,11],addnetwork:1,addr:3,address:[2,3,4,5,6,10,12],addressipv6:3,addressrang:1,adequ:10,adm:1,admin:[0,1,2,3,6,10,12],adopt:2,advanc:[1,4,6,7,9],afeiszli:[],after:[3,5,6,11],again:9,against:3,age:4,agent:[0,2,3,6,7,10,12],agent_backend:10,agentbackend:10,aggreg:2,agre:9,alex:3,algo:11,align:4,all:[0,1,2,3,4,5,6,7,8,9,10,11,12],allow:[1,2,3,5,6,9,10,12,13],allowedip:[3,5],allowedorigin:10,along:12,alreadi:[2,3,6,10],also:[0,1,2,6,9,10,11,12],altern:[2,10],although:12,alwai:10,amd64:9,android:[2,12],ani:[0,2,3,4,5,6,9,10],anoth:[2,11,12],answer:12,anymor:12,anyth:2,anywai:11,anywher:9,aorijqalrik3ajflaqrdajhkr:1,apach:[2,10],api:[2,3,6,9,10],api_port:10,apiaddress:3,apihost:10,apiport:10,apiserv:3,app:[5,10,11,12],appear:[4,6],appli:[4,10],applic:1,appoint:4,appropri:[2,4,5,9],approv:[1,3,6,11],aprov:12,apt:9,arbitrari:0,arch:[2,9],architectur:10,archiv:9,argument:3,arm:3,around:9,arrai:2,artifact:8,ask:[3,12],asset:10,assum:[2,5,9,10,12],attach:5,attack:4,attempt:2,attent:4,attribut:7,authent:[2,3,6],author:1,authsourc:[],autom:0,automat:[2,3,5,10],avail:[3,4,8,10,11],averag:[],awai:2,await:2,back:[2,5],backend:10,backend_url:10,background:2,backup:11,badpassword:[],balanc:11,ban:4,bare:2,base64:6,base:[2,3,9,10,11],bash:2,basi:[2,11],basic:13,bearer:1,becaus:[0,2],becom:2,been:[2,3],befor:[2,9,12],begin:[2,9],behavior:4,behind:[2,5,9,12],being:[2,10],believ:11,bellow:10,below:[1,2,6,9,10,13],best:[4,11],better:2,between:[0,2],bewar:3,beyond:[10,11],bin:[9,10],bin_t:12,binari:[2,3,6,10,11,12],bind:10,bit:13,biz:9,blank:3,blob:10,block:[10,12],bodi:4,both:[2,4,10,11],bottom:6,bring:[],brows:11,browser:[],bug:[],build:[],built:2,bunch:11,busi:11,button:[],call:[0,2,3,7,10],callabl:3,can:[0,1,2,3,5,6,8,9,10,11,12,13],cang:10,cannot:[3,5],cap_add:10,car:11,carrier:2,cat:12,caus:2,caution:[],center:0,cento:2,certain:2,certbot:9,certif:[9,10],certonli:9,cgnat:[],cgroup:10,challeng:9,chang:[0,1,2,3,5,6,10,12],charact:12,chcon:12,check:[1,2,3,6,9,10,12],checkin:[1,2,3],chmod:9,choic:5,choos:[3,9],chose:11,chosen:[2,3,9],cidr:6,circumst:[3,4],clarifi:4,clear:11,cli:[2,9],click:[2,6,9],client:[0,6,9,10,11,12],client_max_body_s:10,client_mod:10,clientmod:10,close:11,cloud:[0,9,13],cluster:[10,13],code:[2,3,5,8,12],com:[3,4,6,9,10,11],combin:10,come:[2,7,10],comfort:9,comm:3,command:[2,3,6,9,10],comment:[4,10],commit:4,common:[2,7],commun:[2,3,4,7,9,10,11,12,13],compat:[5,7,11],compil:[2,3],complaint:4,complet:[2,12],complex:2,complic:2,compon:[7,10],compos:[6,7,9,12],comput:[0,2,3],concept:7,concern:11,concurr:9,conf:[9,10],confidenti:4,config:[1,2,5],configur:[0,1,2,6,7,9,12],conflict:[2,10],conflift:[],connect:[0,2,3,5,6,10,12,13],consensu:[2,12],consequ:10,consid:[2,4,6],consider:2,consist:2,consol:6,construct:4,consum:[3,9,10],consumpt:[],contact:[4,7,9],contain:[2,6,10],container_nam:10,containerd:9,content:1,context:10,continu:10,contrast:2,contribut:4,contributor:4,control:[2,6,10],copi:[6,10],core:[0,7,11],coredn:[3,7],coredns_addr:10,corednsaddr:3,corefil:10,coreo:2,corpor:11,correct:4,correctli:10,cors_allowed_origin:10,could:[0,4,6,12],cours:9,coven:4,cover:7,cpu:[9,12],creat:[0,1,2,3,4,5,7,9,10,12,13],createadmin:1,creategatewai:1,createus:[],creation:0,credenti:10,critic:4,cron:2,cross:13,cryptocurr:0,curl:[6,9,10],current:[2,3,10,12],custom:[2,7,9,10],customiz:[],cycl:[1,2],daemon:2,dashboard:9,data:[0,2,10],databas:[2,12],date:1,dbadminanydatabas:[],dbu:10,ddflzqn:5,dearmor:9,deb:9,debian:2,debug:10,decis:7,decod:[2,3,6],deem:4,defaultkeepal:[],defin:4,delet:[1,5,6,12],deletegatewai:1,deni:12,depend:[2,3,7],depends_on:10,deploi:[2,7,9,10],deploy:[2,10],depreci:10,derogatori:4,deserv:11,design:[2,3,5,7,11],desktop:[2,3,5],detail:[1,2,3,4,6,7,10],determin:[4,11],dev:[9,10],develop:[6,9,10],devic:[0,2,3,7,11,12],diabl:[],diagram:2,differ:[0,2,4,6,10,11,13],digitalocean:9,directli:[0,1,2,5,10,12],directori:9,disabl:[2,4,9],disable_remote_ip_check:10,disableremoteipcheck:10,disconnect:12,discord:[11,12],discuss:[],displai:[],displaynam:1,distibut:2,distribut:2,distributionshav:2,dns:[2,3,9,10],dns_mode:[10,12],dnsconfig:10,dnsmode:10,dnson:3,dnsstublisten:[9,10],doc:[6,9,10,11],docker:[2,6,7,12],document:[0,2,3,6,10],doe:[2,5,7,9,10,12],doesn:12,doing:0,domain:[10,12],don:[2,3,11,13],done:12,doubl:[],down:[0,6,11,12],download:[5,6,9,10,12],dual:[3,12,13],duplic:3,dure:3,dynam:[0,2,7],each:[0,2,3,6,10,12],easi:[2,10],easier:[2,11],easiest:2,easili:0,echo:9,econom:11,edit:[4,5],effect:6,effici:2,egress:3,either:[2,5,11],ejf6yy51m:5,electron:4,elev:10,elimin:2,els:11,email:[9,11],empathi:4,empti:10,enabl:[2,6,9,10],encod:6,encompass:0,encount:[2,11],encrypt:[0,2,3,12],end:[2,9,10,11,12],endpoint:[1,2,3,5],enforc:7,engin:9,enhanc:[],enough:[],ensur:11,enter:[6,9],enterpris:9,entir:6,entireti:2,entri:[10,12],env:[1,10],environ:[0,1,2,4,10],equal:10,equival:10,error:[],escal:[],especi:[],establish:5,etc:[3,6,9,10,12],eth0:1,ethnic:4,evalu:11,even:[0,2],event:4,eventu:11,everi:[2,3,6,11],everyon:4,everyth:[2,10],evolv:2,examin:[],exampl:[2,3,4,5,7,9,10],except:10,execut:11,exist:[0,2,6,10],expand:11,expect:[4,7,10],experi:4,explain:[2,7],explicit:4,explicitli:10,expos:2,express:4,expressvpn:11,ext:12,extens:2,extern:[3,10,11],face:4,fact:0,fail:[6,9],fair:4,fairli:[2,12],faith:4,fals:[3,10],familiar:[0,2,11,12],faq:7,fast:[2,7,10],faster:[0,2,3],fcontext:12,featur:[9,10,11],fedora:2,feiszli:[],few:[3,11],field:[],figur:13,file:[2,5,9,11],filenam:1,financi:11,find:[2,10,13],fine:0,firewal:[10,12],firmli:11,first:[2,3,6,10,11,12,13],fit:[9,13],flag:3,flat:0,flexibl:0,flow:2,focu:11,focus:4,folder:2,follow:[4,6,9,10,11,12],forc:10,fork:[],form:3,format:10,forum:12,forward:[3,5,9],foster:4,found:[0,2,8,10],free:4,freeli:8,frequent:12,friend:12,from:[0,1,2,3,4,5,6,9,10,11,13],front:[2,10],fssl:9,full:[0,2,10],fulli:[0,2],fundament:[],further:4,futur:[2,6,11],gain:[],gatewai:[1,2,3,7,13],gcp:9,gender:4,gener:[1,2,3,5,9,10,11],generate_config_j:10,get:[1,3,7,9,10,12,13],github:[2,3,7,9,10,11,12],githubusercont:[6,9,10],give:[2,6,7,10,12],given:[0,2,6,12],global:3,gnupg:9,goe:[0,10],going:10,golang:2,good:[4,5,11,12,13],googl:10,gpg:9,grab:3,gracefulli:4,grade:2,gravitl:[3,4,6,9,10,11,12],grpc:[2,3,6,9],grpc_port:10,grpc_ssl:10,grpcaddr:[],grpcaddress:3,grpcaddrrang:[],grpcendpoint:[],grpchost:10,grpcifac:[],grpcport:10,grpcserver:3,grpcwg:[],guid:[0,2,6,9,10,12],guidelin:11,hack:[],hand:7,handl:[0,2,9],harass:4,hard:11,harder:12,harm:4,has:[0,2,3,6,10,11,13],hasadmin:1,have:[0,2,3,4,5,6,9,10,11,12,13],haven:12,head:9,header:[1,10],health:11,heart:3,heavi:2,heaviest:[],heavili:[],help:[1,2,3,6,7,10,11,13],here:[2,4,6,8,9,10,11,13],high:2,highli:3,hit:12,hold:[0,2,3],hole:[3,12],holepunch:3,home:[0,2,3],hook:[2,5],horizont:[],host:[2,3,9,10,11],host_ip:10,hous:1,how:[2,3,7,10,12],howev:[1,2,3,9,10,11,12],html:10,http:[1,3,6,7,9,11],http_port:10,hub:[0,2],hundr:9,idea:11,ident:4,identifi:3,ignor:3,imag:10,imageri:4,immedi:[],impact:[2,11],implement:2,importantli:6,inappropri:4,inbound:9,incid:4,includ:[2,4,5,7,10],inclus:4,incompat:[],incorrect:[3,10],increas:2,inde:[],independ:5,individu:[4,10],industri:2,info:[2,4,9,10,11],inform:[2,3,4,6],ingress:[2,3,7,10],ingressgatewai:12,initi:[3,11],ins:2,insert:[9,10,12],insid:10,instal:[0,2,5,6],instanc:[1,2,3,4,6,9,10],instead:[0,3,5,9,10,12],instruct:[9,10],insult:4,intact:3,integr:10,intend:3,interact:[0,2,3],interest:[4,11,12],interfac:[1,3,5,6,10],interfer:12,intern:10,internet:[0,2,11],intro:13,introduc:2,introduct:[2,7],invalid:[5,6],investig:4,invis:2,iot:[0,2],ipforward:3,iphon:2,ipsec:2,iptabl:3,ipv4:[3,12],ipv6:[3,12,13],isdualstack:3,isingressgatewai:3,isloc:3,isstat:3,issu:[4,7,9,10,11],iter:11,its:[0,2,3,4,5,6,10],itself:[2,3,6],job:2,join:[2,3,6,12],journalctl:[3,10,12],json:1,just:[0,2,3,5,10,11,12],jwt:[1,3],keep:1,keepal:3,kei:[2,3,9,10,12],kernel:[0,2,11],keynam:1,keyr:9,keyrequir:[],keyupd:1,keyvalu:[],kill:12,know:[10,11,12,13],known:2,kube:10,kubectl:10,kubernet:[0,7,13],lack:[],lan:3,languag:4,laptop1:1,laptop:5,larg:2,larger:[],last:1,lastmodifi:1,latenc:2,later:2,latest:[2,3,5,10],layer:0,layout:2,lead:11,leadership:4,learn:[],least:[0,12],leav:[3,6,12],left:[10,12],less:[2,6],let:[0,11,13],letsencrypt:9,level:[2,4,10],light:10,lighter:[],lightweight:2,like:[0,2,3,6,9,10],likewis:[],limit:[7,10,11],line:2,link:[7,9,10],linod:9,linux:[2,3,6,7,9,11],linuxserv:10,list:[0,2,3,9,10],listen:10,listenport:1,littl:[2,11],load:[2,10,11],local:[2,3,6,9,10],localaddress:[1,3],localhost:1,localrang:3,locat:[0,2,3,10],log:[9,10,12],logic:5,login:6,look:11,lookup:2,lot:[2,11],lsb:9,lsb_releas:9,lxc:10,mac:[2,3],macaddress:[1,3],machin:[0,2,3,5,6,9,12],maco:12,made:[0,2,12],mai:[1,2,3,4,6,9,10,11,12],mail:4,main:[],mainfram:[],maintain:[4,11],make:[0,2,4,5,9,10,11,12],man:5,manag:[0,2,5,7,10,13],mandatori:[],mani:[0,2,10,11,13],manual:[2,3,6,9,10,12],map:10,master:[9,10],master_kei:10,masterkei:[1,10],match:[3,10],mean:[2,3,5,10],meant:10,media:4,medium:[],member:[4,13],memori:12,mesh:[0,5,11,12,13],meshclient:1,metal:2,method:[1,2,3,5,6],mgmt:1,microk8:[10,13],middl:5,might:[0,2,10],min:9,mind:[],minimum:12,mint:2,minu:10,minut:[9,10,12],miss:2,mix:3,mode:[2,7],model:[0,2],modif:10,modifi:[1,2,3,6,9,10,11],monet:11,mongo:10,mongo_admin:[],mongo_host:[],mongo_initdb_root_password:[],mongo_initdb_root_usernam:[],mongo_opt:[],mongo_pass:[],mongo_port:[],mongoadmin:[],mongoconn:[],mongodb:10,mongopass:[],mongovol:[],more:[0,1,2,5,6,7,10,11],most:[1,2,3,9,10,12],mostli:[2,3],mount:10,move:[6,9,11],much:[0,2],mullvad:11,mullvadvpn:11,multipl:[0,6,12],must:[1,2,3,5,6,9,10,11,12],mykei:[1,6],mynet:6,myserv:6,mysit:9,name:[1,2,3,5,6,10,12],nameserv:[2,3,9,10],namespac:10,nat:[2,5],nation:4,navig:[9,12],nebula:0,necessari:[2,3,4,10],need:[0,1,2,3,9,10,11,12],neighborhood:0,neither:2,net:[3,9],net_admin:10,netclient:[0,5,7],netclient_accesskei:3,netclient_accesstoken:3,netclient_address:3,netclient_addressipv6:3,netclient_api_serv:3,netclient_daemon:3,netclient_dn:3,netclient_endpoint:3,netclient_grpc_serv:3,netclient_interfac:3,netclient_ipforward:3,netclient_is_dualstack:3,netclient_is_loc:3,netclient_keepal:3,netclient_localaddress:3,netclient_localrang:3,netclient_macaddress:3,netclient_nam:3,netclient_network:3,netclient_o:3,netclient_password:3,netclient_port:3,netclient_postdown:3,netclient_postup:3,netclient_privatekei:3,netclient_publickei:3,netclient_roam:3,netclient_udp_holepunch:3,netconfig:[3,12],netid:1,netmak:[1,3,5,8,10,12],netmaker_base_domain:[9,10],netmaker_env:10,network:[0,5,6,7,10,11,12,13],network_mod:10,next:[3,6],nextcloud:13,nginx:[2,7,12],noclient:[],node:[3,5,7,10,12],nodn:10,non:[2,3,6,10],none:0,noonewillguessthi:1,nordvpn:11,note:[1,3,5,10,12],notifi:2,now:[0,5,6,9,10,11,12],nslookup:9,number:[2,6,11],oblig:4,obtain:[1,3],ode:3,off:[2,3,10,12],offens:4,offic:[0,13],offici:[1,4,9,12],offlin:4,omit:10,onc:[5,6,10],one:[2,3,5,6,9,10,12],onli:[1,2,3,5,6,11,12],onlin:4,onto:[],open:[2,4,9,11],openvpn:2,oper:[2,3,10],operatingsystem:3,opinion:9,opt:[],option:[2,3,7,10,11],order:[9,10,11,12],org:[9,10],orient:4,origin:10,osi:11,other:[0,2,3,4,5,6,10,11],otherwis:[0,3,4,12],our:[7,9,12],out:[0,2,6,9,10,11,13],outlin:[2,10],output:[3,6],outsid:[7,10],over:[0,2,10],overlai:[0,7],overlap:6,overrid:[3,10],overridden:[2,10],overview:[2,7,13],overwhelm:13,own:[2,9,10],pace:[],page:2,pai:11,paid:11,pair:[2,10],pane:6,part:[2,3,10],parti:12,partial:2,particip:4,particular:[2,3],pass:[2,3,10],password:[1,3,6],path:[1,10,11],patient:[],peer:[2,3,5,13],pend:[1,6],peopl:11,per:11,perform:[1,2,3,10],period:2,perman:4,permiss:[4,9,12],permit:6,persistenkeepal:[],persistentkeepal:[3,5],person:4,perspect:[0,2],phase:[],phone:[3,5],physic:4,pick:[2,6],pictur:2,pidof:[],ping:6,pivpn:11,place:[3,10],plaintext:3,plan:10,platform:[2,7],pleas:[3,9,10,11,12],pledg:7,plu:3,point:[2,9],polici:4,polit:4,popul:10,port:[2,3,6,9,10,12],posit:4,possibl:[2,7,9],post:[1,2,3,4],postchang:3,postdown:3,postup:3,practic:2,pre:10,preced:2,precend:10,prefer:[9,10,12],prepar:7,prereqisit:6,prerequisit:[2,6,7,10],present:[],previou:2,primari:10,prior:10,privaci:11,privat:[2,4,6,7,10,11,13],privatekei:[3,5],privileg:10,privkei:3,probabl:[0,11],problem:11,proce:[],process:[3,6,7,10],product:10,profession:4,project:[1,4,10,11],prompt:9,proof:0,properli:[3,12],properti:3,proto:9,protocol:10,provid:[0,2,3,9,10],proxi:[7,9],proxy_pass:10,proxy_pass_request_head:10,proxy_set_head:10,pubkei:3,publickei:[1,3,5],publicli:9,publish:[4,8],pull:[2,3,5,10],punch:[3,12],push:[3,5],put:1,pwd:[],python3:9,q9cog7c9qjnoxygvri:3,quarantin:3,question:12,quick:[6,10,12],quickli:[7,9,12],quickstart:[9,12],race:[4,11],raft:[2,12],ram:9,rang:[3,6],rangestr:1,rapid:[],rapidli:[],raspian:2,raw:[3,6,9,10],reach:[0,2,3,5],reachabl:[2,3,5,9,10],reactj:2,read:10,readwriteanydatabas:[],reallysecret:1,reason:[2,4,10,11],reboot:12,reccommend:[],recent:[2,3,12],reciev:[1,2],recommend:[1,3,5,10,12],reconfigur:[2,3,12],record:[9,12],reduc:[],refactor:2,refer:[2,6,9,12],regard:[2,4],regardless:4,regist:[2,3],registr:3,regular:11,reiter:[],reject:4,rel:2,relai:[2,5,11],relat:9,releas:[2,3,9,10],reli:[0,3],relianc:[],religion:4,reload:9,remot:[0,3,10],remov:[1,2,4,6,9,10,12],removenetwork:1,repeat:6,repercuss:4,replac:[3,9,10],replace_master_kei:9,report:[2,4],repositori:[2,8],repres:4,represent:4,request:[1,2,10],requir:[1,2,3,6,9,10,12],resolut:9,resolv:[2,3,9,10],resolvectl:[3,10],resourc:[5,7],respect:4,respons:[2,7],rest:10,rest_backend:10,restart:[9,10,12],restbackend:10,restorecon:12,restrict:[10,11],result:4,retriev:[0,1,2,3,6,11],revers:[7,9],revert:3,review:4,rhel:2,right:[0,4,11],risk:12,rkxlgk2mg:5,rncjjbsaa3hzuhrk5hpyxm:3,road:11,roam:3,rogu:12,role:[],root:[9,10,12],rout:[0,2],route53:9,router:[2,12],rpumvsbpgq:5,rqlite:12,rule:[3,9],run:[0,1,2,3,5,6,7,9,10,11,12],runc:9,runnin:5,runtim:10,rwx:10,said:[2,11],same:[0,3,6,12],sampl:0,save:6,scalabl:[],scan:5,scenario:6,schema:[],scope:7,screen:6,script:[2,3,6,10,12],second:6,secret:[1,3,6],secretkei:10,section:[3,10],secur:[0,1,2,3,7,9,12,13],securebetween:[],sed:[9,10],see:[1,2,3,6,9,10,12],select:[5,6,12,13],self:11,selinux:12,semanag:12,send:[2,3,10],sens:[2,11],sensibl:[0,2,6],separ:[2,4,13],seper:12,seri:9,serv:[2,9,10],server:[0,3,5,6,8,9,11],server_api_conn_str:10,server_api_host:10,server_grpc_conn_str:10,server_grpc_host:10,server_grpc_wg_address:[],server_grpc_wg_address_rang:[],server_grpc_wg_interfac:[],server_grpc_wg_keyrequir:[],server_grpc_wg_port:[],server_grpc_wg_privkei:[],server_grpc_wg_pubkei:[],server_grpc_wireguard:[],server_host:10,server_http_host:10,server_nam:10,server_public_ip:9,servic:[2,3,5,9,10,11,13],set:[1,2,3,4,6,9,10,13],setup:[0,2,7],sever:[2,10],sexual:4,sfl:[6,10],share:[9,10,12],ship:[],should:[0,1,2,3,5,6,7,9,10,11,12],show:[3,4,10,12],side:8,sign:[2,3,6,9,12],signific:2,signigif:2,signup:[2,3,12],similar:[0,6,10,11],simpl:[2,3,6,10,12],simplest:[2,3],simpli:[2,3,5,6,12],simplifi:10,simultan:0,sinc:[],singl:[1,2,12],site:[0,2,7,10,12,13],situat:2,size:4,skynet:1,slim:[],slow:0,small:[2,6,11],smartgui:1,snap:9,social:4,solut:2,solv:2,some:[1,2,3,10,11,12,13],someon:11,someth:[5,6,9,10,11],somewher:6,soon:[7,12],sort:0,sourc:[2,3,7,8,9,11],space:4,spec:12,special:[2,3,10],specif:[2,3,4,10],specifi:[3,10],speed:[0,2],split:3,spoke:[0,2],sponsor:[],spread:0,sql:2,sql_conn:10,sqlconn:10,sqldata:10,sqlite:2,ssh:[6,9],ssl:[9,10],sspl:8,stabil:[],stabl:9,stack:[3,12,13],stai:3,stake:0,standard:[2,7],start:[10,12,13],startup:1,state:6,statement:7,statu:[3,10,12],step:[2,3,6,9,10],still:[0,10,11],stock:11,stop:[9,10],storag:[9,10],storageclassnam:10,store:[2,10],string:[6,10],structur:[],stun:12,subdomain:[9,10],submit:6,subnet:2,subsequ:2,subspac:11,subspacecloud:11,substanti:0,success:2,sudo:[3,6,9,10,12],support:[2,9,10,12],sure:[9,11,12],surfshark:11,suse:2,swag:10,swagger:7,sys:10,sys_modul:10,system:[6,7],system_bus_socket:10,system_u:12,systemctl:[3,9,10,12],systemd:[3,6,9,10,11,12],tab:[6,12],tail:3,tailor:[],tailscal:0,take:[0,1,2,4,6,10,12],talk:[0,2],tcp:9,team:[4,11],technic:[0,7,11],technolog:2,tee:9,tell:[0,2,3,10],templat:10,temporari:4,temporarili:4,term:11,terrain:11,test:6,than:[2,6,10,11],thei:[0,2,4,10,11,12],them:[2,6,10,11,12],themselv:[2,12],therefor:12,thhe:[],thi:[0,1,2,3,4,5,6,7,8,9,10,11,12],thing:[0,2,11],think:[11,13],third:12,thmpvlcykonxi:3,those:[0,2,3,5,9],though:[],thought:11,thousand:0,threaten:4,three:[6,9],through:[2,10],ticket:11,time:[1,2,3,5,6,10,12,13],timer:2,timestamp:2,token:[3,6,10,12],tool:[0,3,9],top:[2,9,12],topic:13,topolog:2,tos:9,total:[],toward:4,traefik:10,traffic:[0,2,5,9,10,12],trailofbit:11,transact:2,transport:9,treat:[2,3],tricki:2,troll:4,troubleshooot:9,troubleshoot:[1,3,6,9],tunnel:[0,2],tunnelbear:11,turn:[2,3,10,12],tutori:7,two:[0,1,2,12],txt:9,type:1,typic:[0,2,5,6,10],ua2zjt8wn7ga:5,ubuntu:[2,9,10],udp:[3,9,10,12],udpholepunch:3,ufw:9,ultim:11,unabl:2,unaccept:4,unam:9,uncom:[9,10],uncordon:1,under:[3,6,8,10,12],underlai:[0,13],underli:[],underscores_in_head:10,understand:[],uninstal:[7,12],uninstral:[],uniqu:[3,9],unix:[2,3,11],unless:[3,10],unmanag:2,unmesh:[],unnecessari:3,unregist:3,unregistr:3,unset:[3,10],unsupport:11,unsur:[5,6],unten:11,until:[3,6,12],unwelcom:4,unzip:10,updat:[1,2,6,9,11,12],upon:[2,3],ups:12,upstream_app:10,upstream_port:10,upstream_proto:10,urandom:9,url:10,usag:[3,7,10,13],use:[0,1,2,3,4,5,6,7,9,10,11,12,13],used:[1,2,3,5,6,10],useful:[],user:[2,3,6,12],useradminanydatabas:[],usernam:[1,6],uses:[0,1,2,5,6,10,12],using:[0,1,2,3,4,5,7,9,10,11,13],usr:[9,10],usual:3,util:3,v02:9,valid:[2,10],valu:[1,2,3,6,10,12],vari:[],variabl:[2,3],variou:[3,7,10],vehicl:11,verbos:10,veri:[0,2,3,11],verifi:2,versa:11,version:[2,4,8,9,10,12],via:[1,2,3,4,5,6,9,10,11,12,13],vice:11,view:[6,11,12],viewpoint:4,vim:[3,9,10],virtual:[0,3,5,7,9,11,13],visibl:[6,10],vm3ow4thatogiwnsla3thsl3894th:6,vne197vmradjodkb1zsuja:3,volum:[6,10,12],vpc:[0,11],vpn:[2,12,13],wai:[10,11,12],wait:9,want:[0,2,9,11,12],warn:10,web:[10,11],webserv:2,websit:2,week:[],weight:10,welcom:[4,11],well:[2,3,6,7,11,12],wgaddress6:3,wgaddress:3,wget:[9,10],what:[2,4,5,7,12],whatev:[3,9,10],when:[2,3,4,10,12],where:[2,5,6,7,10,13],wherev:0,whether:[0,3],which:[0,2,3,4,5,6,8,9,10,11,12],who:4,why:[2,3,7,12],wide:2,wider:2,wiki:4,wildcard:[9,10],window:[2,3,12],wipe:12,wiregard:[],wireguard:[0,3,5,6,7,9,10,11,12],wish:[5,10],within:[2,3,4],without:[1,2,3,4,6,7,11,12],won:11,work:[2,7,9,11],workstat:[3,6],world:[0,2],wors:2,worth:2,would:[0,3,5,6,9,10,11],write:[2,10],ws2:3,www:10,x86:3,yaml:[1,10],ydazgedrpuxmmrqul35wfjmhvrzr1rq0u:5,yes:3,yet:12,yml:[9,10,12],you:[0,1,2,3,5,6,7,9,10,12,13],your:[0,1,2,3,5,6,9,10,11,12,13],your_pass:1,your_password:1,your_secret_kei:1,yourwildcard:10,zeroti:0,zip:10,zrb9vfhk8a:11},titles:["About","API Reference","Architecture","Client Installation","Code of Conduct","External Clients","Getting Started","Welcome to the Netmaker Documentation","License","Quick Install","Advanced Server Installation","Support","Troubleshooting","Using Netmaker"],titleterms:{"case":0,Adding:[3,5],DNS:[3,9,10],Use:0,Using:13,Will:11,about:[0,7],access:1,advanc:10,agent:[],ani:11,annot:10,api:[1,7],architectur:[2,7],attribut:4,authent:1,basic:[],better:[],bug:[],build:[],call:1,cli:3,client:[2,3,5,7],code:[4,7],common:12,compat:[2,3,10],compon:2,compos:10,concept:2,conduct:[4,7],config:[3,10],configur:[3,5,10],contact:11,contribut:[],core:2,coredn:[2,10,12],creat:6,curl:1,daemon:3,daemonset:10,depend:9,deploi:6,descript:10,disabl:10,docker:[9,10],document:[1,7],doe:[0,11],domain:9,dual:[],enabl:[],enforc:4,enhanc:[],enterpris:11,exampl:1,extern:[2,5,7,13],faq:11,featur:[],file:[1,3,10],firewal:9,fork:[],format:1,full:[],gatewai:5,get:6,grpc:10,guid:7,how:[0,11],http:10,ingress:5,instal:[3,7,9,10,11],introduct:[3,5,9],ipv6:[],issu:12,kei:[1,6],kubernet:10,licens:[7,8,11],like:11,limit:2,linux:10,local:[],log:3,make:3,manag:[1,3,6],manual:[],mesh:2,mode:[3,10],mongodb:[],netclient:[2,3,6,10,11,12],netmak:[0,2,6,7,9,11,13],network:[1,2,3],nginx:[9,10],node:[1,2,6],nordnpn:11,note:[],offer:11,onli:[],oper:11,option:[],our:4,paid:[],pledg:4,prepar:9,prereqisit:[],prerequisit:[3,9],privat:3,process:2,proxi:10,quick:[7,9],refer:[1,3,7,10],remov:3,request:[],respons:4,revers:10,rqlite:[2,10],scope:4,secur:10,server:[1,2,7,10,12],setup:[6,10],site:[],slim:[],smaller:[],sql:[],sspl:11,stack:[],standard:4,start:[6,7,9],submit:[],support:[7,11],system:[2,3,10,11],systemd:2,technic:2,templat:9,test:10,token:[],troubleshoot:[7,12],tutori:13,uninstal:[3,6],uninstral:[],updat:3,usag:1,user:1,variabl:10,video:13,view:3,vpn:11,welcom:7,what:0,why:11,wireguard:2,without:10,work:0,written:13,you:11}}) \ No newline at end of file +Search.setIndex({docnames:["about","api","architecture","client-installation","conduct","external-clients","getting-started","index","license","quick-start","server-installation","support","troubleshoot","usage"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["about.rst","api.rst","architecture.rst","client-installation.rst","conduct.rst","external-clients.rst","getting-started.rst","index.rst","license.rst","quick-start.rst","server-installation.rst","support.rst","troubleshoot.rst","usage.rst"],objects:{},objnames:{},objtypes:{},terms:{"0afehuytvin":3,"100":[1,6],"101":3,"127":10,"1443":[],"147":3,"168":3,"170":3,"172":1,"182":3,"192":3,"1b3282d4b7aa":[],"1b3282d4b7aa_":[],"1gb":9,"1slf":[],"200":1,"203":3,"236":5,"247":5,"251":3,"254":6,"27017":[],"2cpu":9,"2gb":9,"30s":10,"443":[9,10],"4gb":9,"500":[],"50051":[2,3,6,10],"50052":[],"50555":[],"51821":[3,9],"51822":5,"51825":9,"534":[],"5gb":[],"5qktbtgsvb45y3qyrmwft":3,"62356581":[],"6400":1,"8081":[1,2,3,10],"8082":10,"abstract":2,"break":3,"case":[1,2,3,5,7,9,10,12,13],"class":10,"default":[1,2,3,5,6,9,10,12],"final":12,"function":[1,3,10,11],"import":[2,5,6],"long":[0,6,11],"new":[2,3,6],"null":9,"public":[2,3,4,5,8,9],"return":[2,9],"short":3,"static":[2,9,10,12],"switch":[10,11],"true":[2,3,10],"try":[11,12],"var":[1,10],"while":[2,11],AWS:[0,9,11],Adding:[6,7],Being:4,DNS:[2,7,9,12,13],For:[2,3,5,6,9,10,12],IOS:12,IPs:[2,5],K3s:13,NOT:[],Not:2,That:2,The:[0,1,2,3,4,5,6,9,10,11],Then:[5,6,12],There:[0,1,3,6,11,12],These:[2,3,6],Use:[3,7],Used:[3,10],Useful:10,Using:[0,1,4,6,7],VPS:9,Will:3,With:[2,11],Yes:12,aa3bvg0rnitirxdx:1,abil:[11,12],abl:[1,2,5],abou:6,about:[2,3,6,9,10,11,12],abov:[2,3,6,9,10,11],absent:3,abus:4,acceler:[],accept:[3,4,5],access:[0,2,3,5,6,7,9,10,11,12,13],access_token_valu:10,accesskei:[1,3],accomplish:11,accordingli:[],account:[4,12],achiev:[1,2,11,12],acm:9,across:[0,3],act:[2,4,5],action:[1,3,4],activ:12,actual:2,adapt:[4,10],add:[0,1,2,3,5,6,9,10],added:[2,3,6,10,11],adding:6,addit:[2,3,6,9,10,11,12],addnetwork:1,addr:3,address:[2,3,4,5,6,10,12],addressipv6:3,addressrang:1,adequ:10,adm:1,admin:[0,1,2,3,6,10,12],administr:3,adopt:2,advanc:[1,4,6,7,9],advfirewal:3,afeiszli:[],after:[2,3,5,6,11],again:9,against:3,age:4,agent:[0,2,3,6,7,10,12],agent_backend:10,agentbackend:10,aggreg:2,agre:9,alex:3,algo:11,align:4,all:[0,1,2,3,4,5,6,7,8,9,10,11,12],allow:[1,2,3,5,6,9,10,12,13],allowedip:[3,5],allowedorigin:10,along:12,alreadi:[2,3,6,10],also:[0,1,2,6,9,10,11,12],altern:[2,10],although:12,alwai:10,amaz:[],amd64:9,android:[2,12],ani:[0,2,3,4,5,6,9,10,12],anoth:[2,11,12],answer:12,anymor:12,anyth:2,anywai:11,anywher:9,aorijqalrik3ajflaqrdajhkr:1,apach:[2,10],api:[2,3,6,9,10],api_port:10,apiaddress:3,apihost:10,apiport:10,apiserv:3,app:[5,10,11,12],appear:[4,6],appli:[4,10],applic:1,appoint:4,appropri:[2,4,5,6,9],approv:[1,3,6,11],aprov:12,apt:9,arbitrari:0,arch:[2,6,9],architectur:10,archiv:9,argument:3,arm:[3,6],around:9,arrai:2,artifact:8,asc:[],ask:[3,12],asset:10,assum:[2,5,9,10,12],attach:5,attack:4,attempt:2,attent:4,attribut:7,authent:[2,3,6],author:1,authsourc:[],autom:0,automat:[3,5,10],avail:[3,4,8,10,11],aval:[],averag:[],awai:2,await:2,back:[2,5],backend:10,backend_url:10,background:2,backup:11,badpassword:[],balanc:11,ban:4,bare:2,base64:6,base:[2,3,9,10,11],bash:2,basi:[2,11],basic:13,bearer:1,becaus:[0,2,12],becom:[2,12],been:[2,3,9],befor:[2,9,12],begin:[2,9],behavior:4,behind:[2,5,9,12],being:[2,10],believ:11,bellow:10,below:[1,2,5,6,9,10,13],besid:2,best:[4,11],better:2,between:[0,2],bewar:3,beyond:[10,11],bin:[9,10],bin_t:12,binari:[2,3,6,10,11,12],bind:[9,10],bit:13,biz:9,blank:[3,5],blob:10,block:[10,12],bodi:4,both:[2,4,10,11],bottom:6,bound:9,bring:[],brows:11,browser:[],bug:[],build:2,built:2,bunch:11,busi:[9,11,12],button:[],caddyfil:[],caddyserv:[],call:[0,2,3,7,10],callabl:3,can:[0,1,2,3,5,6,8,9,10,11,12,13],cang:10,cannot:[3,5,9],cap_add:10,capabl:[],car:11,carrier:[],cat:12,caus:[2,9],caution:[],center:0,cento:2,certain:2,certbot:9,certif:[9,10],certonli:9,cgnat:[],cgroup:10,challeng:9,chang:[0,1,2,3,5,6,10,12],charact:12,chcon:12,check:[1,2,3,6,9,10,12],checkin:[1,2,3],chmod:9,choic:5,choos:[3,9],chose:11,chosen:[2,3,9],cidr:6,circumst:[3,4],clarifi:4,clear:11,cli:[2,9],click:[2,6,9],client:[0,6,9,10,11,12],client_max_body_s:10,client_mod:10,clientmod:10,clone:2,close:11,cloud:[0,9,13],cloudsmith:[],cluster:[10,13],code:[2,3,5,8,12],com:[3,4,6,9,10,11,12],combin:10,come:[2,7,10],comfort:9,comm:3,command:[2,3,6,9,10],comment:[4,10],commit:4,common:[2,7,9],commonli:12,commun:[2,3,4,7,9,10,11,12,13],compat:[5,7,11],compil:[2,3],complaint:4,complet:[2,12],complex:2,complic:2,compon:[7,10],compos:[6,7,9,12],comprehens:[],comput:[0,2,3],concept:7,concern:11,concurr:9,conf:[5,9,10],confidenti:4,config:[1,2,5],configur:[0,1,2,6,7,9,12],conflict:10,conflift:[],congratul:[],connect:[0,2,3,5,6,10,12,13],consensu:[2,12],consequ:10,consid:[4,6],consider:2,consist:2,consol:6,construct:4,consult:12,consum:[3,9,10],consumpt:[],contact:[4,7,9],contain:[2,6,10],container_nam:10,containerd:9,content:1,context:10,continu:[10,12],contrast:2,contribut:4,contributor:4,control:[2,6,10],copi:[6,10],core:[0,7,11],coredn:[3,7,9],coredns_addr:10,coredns_ip:9,corednsaddr:3,corefil:10,coreo:2,corpor:11,correct:4,correctli:[2,10],cors_allowed_origin:10,could:[0,4,6,12],cours:9,coven:4,cover:7,cpu:[9,12],creat:[0,1,2,3,4,5,7,9,10,12,13],createadmin:1,creategatewai:1,createus:[],creation:0,credenti:10,credit:12,critic:4,cron:2,cross:13,cryptocurr:0,curl:[6,9,10],current:[2,3,10,12],custom:[2,7,9,10],customiz:[],cycl:[1,2],daemon:2,dashboard:9,data:[0,2,10,12],databas:[2,10,12],databaseand:2,date:1,dbadminanydatabas:[],dbu:10,ddflzqn:5,dearmor:9,deb:9,debian:2,debug:10,decis:7,decod:[2,3,6],deem:4,defaultkeepal:[],defin:4,delet:[1,5,6,12],deletegatewai:1,deni:12,depend:[2,3,7],depends_on:10,deploi:[2,7,9,10],deploy:[2,10],depreci:10,derogatori:4,deserv:11,design:[2,3,5,7,11],desktop:[2,3,5],detail:[1,2,3,4,6,7,10],determin:[4,11],dev:[9,10],develop:[6,9,10],devic:[0,2,3,7,11,12],diabl:[],diagram:2,differ:[0,2,4,6,10,11,13],digitalocean:9,dir:3,directli:[0,1,2,5,9,10,12],directori:9,disabl:[2,4],disable_remote_ip_check:10,disableremoteipcheck:10,disconnect:12,discord:[11,12],discuss:[],displai:2,displaynam:1,distibut:2,distribut:[2,6],distributionshav:2,dns:[2,3,9,10],dns_mode:[10,12],dnsconfig:10,dnsmode:10,dnson:3,dnsstublisten:10,doc:[6,9,10,11],docker:[2,6,7,12],dockerfil:[],document:[0,2,3,6,10],doe:[2,5,7,10,12],doesn:12,doing:0,domain:[10,12],don:[2,3,11,13],done:12,dont:12,doubl:[],down:[0,6,11,12],download:[3,5,6,9,10,12],dual:[3,12,13],due:12,duplic:3,dure:3,dynam:[0,2,7],each:[0,2,3,6,10,12],easi:[2,10],easier:[2,11],easiest:2,easili:0,echo:9,econom:11,edit:[4,5,12],effect:6,effici:2,egress:[3,5],either:[2,5,11],ejf6yy51m:5,electron:4,elev:10,elimin:2,els:11,email:[9,11],empathi:4,empti:10,enabl:[2,6,9,10],encod:6,encompass:0,encount:[2,11],encrypt:[0,2,3,12],end:[2,9,10,11,12],endpoint:[1,2,3,5],enforc:7,engin:9,enhanc:[],enjoi:[],enough:[],ensur:11,enter:[6,9],enterpris:9,entir:6,entireti:2,entri:[10,12],env:[1,10],environ:[0,1,2,4,10,12],equal:10,equival:10,error:[],escal:[],especi:[],establish:5,etc:[3,6,9,10,12],eth0:1,ethnic:4,evalu:11,even:[0,2],event:4,eventu:11,everi:[2,3,6,11],everyon:4,everyth:[2,10],evolv:2,examin:[],exampl:[2,3,4,5,7,9,10],except:10,exe:3,execut:11,exist:[0,2,6,10],expand:11,expect:[4,7,10],experi:4,explain:[2,7],explicit:4,explicitli:10,expos:2,express:4,expressvpn:11,ext:[7,12],extens:2,extern:[3,10,11],extrem:[],face:4,fact:0,fail:[2,6,9],fair:4,fairli:[2,12],faith:4,fals:[3,10],familiar:[0,2,11,12],faq:7,fast:[2,7,10],faster:[0,2,3],fcontext:12,featur:[9,10,11],fed:[],fedora:2,feiszli:[],few:[3,11],field:5,figur:13,file:[2,5,9,11],filenam:1,financi:11,find:[2,10,13],fine:0,firewal:[3,10,12],firmli:11,first:[2,3,6,10,11,12,13],fit:[9,13],fix:[],flag:3,flat:0,flexibl:0,flow:2,focu:11,focus:4,folder:2,follow:[2,3,4,6,9,10,11,12],forc:10,fork:[],form:3,format:10,forum:12,forward:[3,5,9],foster:4,found:[0,2,8,10],free:4,freeli:8,frequent:12,friend:12,from:[0,1,2,3,4,5,6,9,10,11,12,13],front:[2,10],fssl:9,full:[0,2,10],fulli:[0,2],fundament:[],further:4,futur:[6,9,11],gain:[],gatewai:[1,2,3,7,12,13],gcp:9,gender:4,gener:[1,2,3,5,9,10,11],generate_config_j:10,get:[1,3,7,9,10,12,13],github:[2,3,7,9,10,11,12],githubusercont:[6,9,10],give:[2,6,7,10,12],given:[0,2,6,12],global:3,gnupg:9,goe:[0,10],going:10,golang:2,good:[4,5,11,12,13],googl:10,gpg:9,grab:3,gracefulli:4,grade:[],gravitl:[3,4,6,9,10,11,12],group:9,grpc:[2,3,6,9],grpc_port:10,grpc_ssl:10,grpcaddr:[],grpcaddress:3,grpcaddrrang:[],grpcendpoint:[],grpchost:10,grpcifac:[],grpcport:10,grpcserver:3,grpcwg:[],guid:[0,2,6,9,10,12],guidelin:11,h2c:[],hack:[],hand:7,handl:[0,2,9],handshak:12,harass:4,hard:11,harder:12,harm:4,has:[0,2,3,6,10,11,13],hasadmin:1,have:[0,2,3,4,5,6,9,10,11,12,13],haven:12,head:9,header:[1,2,10],health:11,heart:3,heavi:2,heaviest:[],heavili:[],help:[1,2,3,6,7,10,11,13],here:[2,4,6,8,9,10,11,13],high:[2,12],highli:3,hit:12,hold:[0,2,3],holder:12,hole:[3,12],holepunch:3,home:[0,2,3],hook:[2,5],horizont:[],host:[2,3,9,10,11],host_ip:10,hour:[],hous:1,how:[2,3,7,10,12],howev:[1,2,3,9,10,11,12],html:10,http:[1,3,6,7,9,11,12],http_port:10,hub:[0,2],hundr:9,idea:11,ident:4,identifi:3,ignor:3,imag:10,imageri:4,immedi:[],impact:[2,11],implement:2,importantli:6,inappropri:4,inbound:[3,9],incid:4,includ:[2,4,5,7,10],inclus:4,incompat:[],incorrect:[3,10,12],increas:2,inde:[],independ:5,individu:[4,10],industri:2,info:[2,4,9,10,11],inform:[2,3,4,6,9],ingress:[2,3,7,10,12],ingressgatewai:[],initi:[3,11],ins:2,insert:[9,10,12],insid:10,instal:[0,2,5,6],instanc:[1,2,3,4,6,9,10],instead:[0,3,5,9,10,12],instruct:[9,10],insult:4,intact:3,integr:10,intend:3,interact:[0,2,3],interest:[4,11,12],interfac:[1,3,5,6,9,10],interfer:[9,12],intern:10,internet:[0,2,11],intro:13,introduc:[],introduct:7,invalid:[5,6],investig:4,invis:2,iot:[0,2],ipforward:3,iphon:2,ipsec:2,iptabl:3,ipv4:[3,12],ipv6:[3,12,13],isdualstack:3,isingressgatewai:3,isloc:3,isstat:3,issu:[2,4,7,9,10,11],iter:11,its:[0,2,3,4,5,6,10],itself:[2,3,6,10],job:2,join:[2,3,6,12],journalctl:[3,10,12],json:1,just:[0,2,3,5,10,11,12],jwt:[1,3],keep:1,keepal:3,kei:[2,3,9,10,12],kernel:[0,2,11],keynam:1,keyr:9,keyrequir:[],keyupd:1,keyvalu:[],kill:12,know:[10,11,12,13],known:[2,9],kube:10,kubectl:10,kubernet:[0,7,13],lack:[],lan:3,languag:4,laptop1:1,laptop:5,larg:2,larger:[],last:1,lastmodifi:1,latenc:2,later:2,latest:[2,3,5,10],launch:2,launchd:[2,3],launchdaemon:2,layer:0,layout:2,lead:11,leadership:4,learn:[],least:[0,9,12],leav:[3,5,6,12],left:[10,12],less:[2,6],let:[0,11,13],letsencrypt:9,level:[2,4,10],librari:2,light:10,lighter:[],lightweight:2,like:[0,2,3,6,9,10],likewis:[],limit:[7,10,11],line:2,link:[7,9,10],linod:9,linux:[2,3,6,7,9,11],linuxserv:10,list:[0,2,3,9,10],listen:10,listenport:1,littl:[2,11],load:[2,10,11],local:[2,3,6,9,10],localaddress:[1,3],localhost:1,localrang:3,locat:[0,2,3,10],log:[9,10,12],logic:5,login:6,look:11,lookup:2,lot:[2,11],lower:12,lsb:9,lsb_releas:9,lxc:10,mac:[2,3,6],macaddress:[1,3],machin:[0,2,3,5,6,9,12],maco:[],made:[0,2,12],mai:[1,2,3,4,6,9,10,11,12],mail:4,main:[],mainfram:[],maintain:[4,11],make:[0,2,4,5,9,10,11,12],man:5,manag:[0,2,5,7,10,13],mandatori:[],mani:[0,2,10,11,13],manual:[2,3,6,9,10,12],map:10,master:[9,10],master_kei:10,masterkei:[1,10],match:[3,10],mean:[2,3,5,10],meant:10,media:4,medium:[],member:[4,13],memori:12,mesh:[0,5,11,12,13],meshclient:1,metal:2,method:[1,2,3,5,6],mgmt:1,microk8:[10,13],middl:5,might:[0,2,10],min:9,mind:[],minimum:12,mint:2,minu:10,minut:[9,10,12],miss:2,mix:3,mode:[2,7],model:[0,2],modif:10,modifi:[1,2,3,6,9,10,11],monet:11,mongo:10,mongo_admin:[],mongo_host:[],mongo_initdb_root_password:[],mongo_initdb_root_usernam:[],mongo_opt:[],mongo_pass:[],mongo_port:[],mongoadmin:[],mongoconn:[],mongodb:10,mongopass:[],mongovol:[],more:[0,1,2,5,6,7,9,10,11],most:[1,2,3,9,10,12],mostli:[2,3],mount:10,move:[6,9,11],mtu:12,much:[0,2],mullvad:11,mullvadvpn:11,multipl:[0,6,12],must:[1,2,3,5,6,9,10,11,12],mykei:[1,6],mynet:6,myserv:6,mysit:9,name:[1,2,3,5,6,10,12],nameserv:[2,3,10],namespac:10,nat:5,nation:4,nativ:2,navig:[9,12],nebula:0,necessari:[2,3,4,10],need:[0,1,2,3,9,10,11,12],neighborhood:0,neither:2,net:[3,9],net_admin:10,netclient:[0,5,7],netclient_accesskei:3,netclient_accesstoken:3,netclient_address:3,netclient_addressipv6:3,netclient_api_serv:3,netclient_daemon:3,netclient_dn:3,netclient_endpoint:3,netclient_grpc_serv:3,netclient_interfac:3,netclient_ipforward:3,netclient_is_dualstack:3,netclient_is_loc:3,netclient_keepal:3,netclient_localaddress:3,netclient_localrang:3,netclient_macaddress:3,netclient_nam:3,netclient_network:3,netclient_o:3,netclient_password:3,netclient_port:3,netclient_postdown:3,netclient_postup:3,netclient_privatekei:3,netclient_publickei:3,netclient_roam:3,netclient_udp_holepunch:3,netconfig:[3,12],netid:1,netmak:[1,3,5,8,10,12],netmaker_base_domain:[9,10],netmaker_env:10,netsh:3,network:[0,5,6,7,9,10,11,12,13],network_mod:10,next:[3,6],nextcloud:13,nginx:[2,7,12],noclient:[],node:[3,5,7,10,12],nodn:10,non:[2,3,6,10],none:0,noonewillguessthi:1,nordvpn:11,note:[1,5,7,9,10,12],notifi:2,now:[0,5,6,9,10,11,12],nslookup:9,number:[2,6,11],oblig:4,obtain:[1,3],ode:3,off:[2,3,10,12],offens:4,offer:[],offic:[0,13],offici:[1,4,9,12],offlin:4,often:2,omit:10,onc:[5,6,10],one:[2,3,5,6,9,10,12],onli:[1,2,3,5,6,11,12],onlin:4,onto:[],open:[2,4,9,11],openvpn:2,oper:[2,3,10],operatingsystem:3,opinion:9,oppos:2,opt:[],option:[2,3,7,10,11],oracl:9,order:[10,11,12],org:[9,10],orient:4,origin:10,osi:11,other:[0,2,3,4,5,6,10,11],otherwis:[0,3,4,12],our:[7,12],out:[0,2,6,9,10,11,12,13],outlin:[2,10],output:[3,6],outsid:[7,10],over:[0,2,10],overlai:[0,7],overlap:6,overrid:[3,10],overridden:[2,10],overview:[2,7,13],overwhelm:13,own:[2,9,10],pace:[],page:2,pai:11,paid:11,pair:[2,10],pane:6,part:[2,3,10],parti:12,partial:2,particip:4,particular:[2,3],pass:[2,3,10],password:[1,3,6],path:[1,10,11],patient:[],peer:[2,3,5,12,13],pend:[1,6],peopl:11,per:[9,11],perform:[1,2,3,9,10],period:2,perman:4,permiss:[4,9,12],permit:6,persistenkeepal:[],persistentkeepal:[3,5],person:4,perspect:[0,2],phase:[],phone:[3,5],physic:4,pick:[2,6],pictur:2,pidof:[],ping:[6,12],pivpn:11,place:[3,9,10],plaintext:3,plan:[9,10,12],platform:[2,7],pleas:[3,9,10,11,12],pledg:7,plu:3,point:[2,9],polici:4,polit:4,popul:10,port:[2,3,6,9,10,12],posit:4,possibl:[2,7,9],post:[1,2,3,4],postchang:3,postdown:3,postup:3,powershel:3,practic:2,pre:10,preced:2,precend:10,prefer:[9,10,12],prepar:7,prereqisit:6,prerequisit:[2,6,7,10],present:[],presum:[],prevent:3,previou:2,primari:10,prior:10,privaci:11,privat:[2,4,6,7,10,11,13],privatekei:[3,5],privileg:10,privkei:3,probabl:[0,11],problem:11,proce:[],process:[3,6,7,10],product:10,profession:4,project:[1,4,10,11],prompt:9,proof:0,properli:[3,12],properti:3,proto:9,protocol:[3,10],provid:[0,2,3,9,10],proxi:[7,9],proxy_pass:10,proxy_pass_request_head:10,proxy_set_head:10,pubkei:3,publickei:[1,3,5],publicli:9,publish:[4,8],pull:[2,3,5,10],punch:[3,12],purchas:12,push:[3,5],put:1,pwd:[],python3:9,q9cog7c9qjnoxygvri:3,quarantin:3,question:12,quick:[6,10,12],quickli:[7,9,12],quickstart:12,race:[4,11],raft:[2,12],ram:9,rang:[3,5,6,9],rangestr:1,rapid:[],rapidli:[],raspian:2,raw:[3,6,9,10],reach:[0,2,3,5],reachabl:[2,3,5,10],reactj:2,read:10,readwriteanydatabas:[],reallysecret:1,reason:[2,4,10,11],reboot:12,reccommend:[],recent:[2,3,12],reciev:[1,2],recommend:[1,3,5,9,10,12],reconfigur:[2,3,12],record:[9,12],redirect:[],reduc:[],refactor:[],refer:[2,6,9,12],regard:[2,4],regardless:4,regist:[2,3],registr:3,regular:11,reiter:[],reject:4,rel:2,relai:[2,3,5,11],relat:[],releas:[2,3,9,10],reli:[0,3],relianc:[],religion:4,reload:9,remot:[0,3,10],remoteip:3,remov:[1,2,4,6,9,10,12],removenetwork:1,repeat:6,repercuss:4,replac:[3,9,10],replace_master_kei:9,repo:2,report:[2,4],repositori:[2,8],repres:4,represent:4,request:[1,2,10],requir:[1,2,3,6,9,10,12],resolut:[],resolv:[2,3,10],resolvectl:[3,10],resourc:[5,7],respect:[2,4],respons:[2,7],rest:10,rest_backend:10,restart:[9,10,12],restbackend:10,restorecon:12,restrict:[10,11],result:4,retriev:[0,1,2,3,6,11],revers:[7,9],reverse_proxi:[],revert:3,review:4,rhel:2,right:[0,4,11],risk:12,rkxlgk2mg:5,rncjjbsaa3hzuhrk5hpyxm:3,road:11,roam:3,rogu:12,role:[],root:[9,10,12],rout:[0,2],route53:9,router:[2,12],rpumvsbpgq:5,rqlite:12,rule:[3,9],run:[0,1,2,3,5,6,7,9,10,11,12],runc:9,runnin:[],runtim:10,rwx:10,said:[2,11],same:[0,3,5,6,9,12],sampl:0,save:[6,9],scalabl:[],scan:5,scenario:6,schema:[],scope:7,screen:6,script:[2,3,6,10,12],second:6,secret:[1,3,6],secretkei:10,section:[3,10],secur:[0,1,2,3,7,9,12,13],securebetween:[],sed:[9,10],see:[1,2,3,6,9,10,12],select:[5,6,12,13],self:11,selinux:12,semanag:12,send:[2,3,10],sens:[2,11],sensibl:[0,2,6],separ:[2,4,13],seper:12,seri:9,serv:[2,9,10],server:[0,3,5,6,8,9,11],server_api_conn_str:10,server_api_host:10,server_grpc_conn_str:10,server_grpc_host:10,server_grpc_wg_address:[],server_grpc_wg_address_rang:[],server_grpc_wg_interfac:[],server_grpc_wg_keyrequir:[],server_grpc_wg_port:[],server_grpc_wg_privkei:[],server_grpc_wg_pubkei:[],server_grpc_wireguard:[],server_host:10,server_http_host:10,server_nam:10,server_public_ip:9,servic:[2,3,5,9,10,11,13],set:[1,2,3,4,6,9,10,12,13],setup:[0,2,7,9],sever:[2,10],sexual:4,sfl:[6,10],share:[9,10,12],ship:[],should:[0,1,2,3,5,6,7,9,10,11,12],show:[3,4,10,12],shown:5,side:8,sign:[2,3,6,9,12],signific:2,signigif:2,signup:[2,3,12],similar:[0,6,10,11],simpl:[2,3,6,10,12],simplest:[2,3],simpli:[2,3,5,6,9,12],simplifi:10,simultan:0,sinc:[],singl:[1,2,9,12],sit:[],site:[0,2,7,10,12,13],situat:2,size:4,skynet:1,slim:[],slow:0,small:[2,6,11],smartgui:1,snap:9,social:4,solut:2,solv:2,some:[1,2,3,10,11,12,13],someon:11,someth:[5,6,9,10,11],somewher:6,soon:[7,12],sort:0,sourc:[2,3,7,8,9,11],space:4,spec:12,special:[2,3,10],specif:[2,3,4,6,10],specifi:[3,10],speed:[0,2],split:3,spoke:[0,2],sponsor:[],spread:0,sql:[2,10],sql_conn:10,sqlconn:10,sqldata:10,sqlit:2,sqlite:[10,12],ssh:[6,9],ssl:[9,10],sspl:8,stabil:[],stabl:9,stack:[3,12,13],stackoverflow:[],stage:[],stai:3,stake:0,standard:[2,7],start:[10,12,13],startup:1,state:6,statement:7,statu:[3,10,12],step:[2,3,6,10],still:[0,10,11],stock:11,stop:10,storag:[9,10],storageclassnam:10,store:[2,10],string:[6,10],structur:[],stun:12,subdomain:[9,10],submit:6,subnet:2,subscript:[9,12],subsequ:2,subspac:11,subspacecloud:11,substanti:0,success:2,sudo:[3,6,9,10,12],suitabl:[],support:[2,9,10,12],sure:[9,11,12],surfshark:11,suse:2,swag:10,swagger:7,sys:10,sys_modul:10,system:[6,7],system_bus_socket:10,system_u:12,systemctl:[3,9,10,12],systemd:[3,6,10,11,12],tab:[6,12],tail:3,tailor:[],tailscal:0,take:[0,1,2,4,6,10,12],talk:[0,2],tcp:9,team:[4,11],technic:[0,7,11],technolog:2,tee:9,tell:[0,2,3,10],templat:10,temporari:4,temporarili:4,term:11,terrain:11,test:6,text:[],than:[2,6,10,11],thei:[0,2,4,10,11,12],them:[2,6,10,11,12],themselv:[2,12],therefor:12,thhe:[],thi:[0,1,2,3,4,5,6,7,8,9,10,11,12],thing:[0,2,11],think:[11,13],third:12,thmpvlcykonxi:3,those:[0,2,3,5,9],though:[],thought:11,thousand:0,threaten:4,three:[6,9],through:[2,10],ticket:11,time:[1,2,3,5,6,10,12,13],timer:2,timestamp:2,tls:[],token:[3,6,10,12],too:12,tool:[0,3,9],top:[2,9,12],topic:13,topolog:2,tos:9,total:[],toward:4,traefik:10,traffic:[0,2,5,9,10,12],trailofbit:11,transact:2,transport:9,treat:[2,3],tricki:2,troll:4,troubleshooot:9,troubleshoot:[1,3,6,9],trust:[],tunnel:[0,2],tunnelbear:11,turn:[2,3,10,12],tutori:7,two:[0,1,2,12],txt:9,type:[1,10],typic:[0,2,5,6,10,12],ua2zjt8wn7ga:5,ubuntu:[2,9,10],udp:[3,9,10,12],udpholepunch:3,ufw:9,ultim:11,unabl:[],unaccept:4,unam:9,unbound:[],uncom:10,uncordon:1,under:[3,6,8,10,12],underlai:[0,13],underli:[],underscores_in_head:10,understand:[],uninstal:[7,12],uninstral:[],uniqu:[3,9],unix:[2,3,11],unless:[3,10],unmanag:2,unmesh:[],unnecessari:3,unregist:3,unregistr:3,unset:[3,10],unsupport:11,unsur:[5,6],unten:11,until:[3,6,12],unwelcom:4,unzip:10,updat:[1,2,6,9,11,12],upgrad:[2,12],upon:[2,3],ups:12,upstream_app:10,upstream_port:10,upstream_proto:10,urandom:9,url:10,usag:[3,7,10,13],use:[0,1,2,3,4,5,6,7,9,10,11,12,13],used:[1,2,3,5,6,10],useful:[],user:[2,3,6,12],useradminanydatabas:[],usernam:[1,6],uses:[0,1,2,5,6,10,12],using:[0,1,2,3,4,5,7,9,10,11,12,13],usr:[9,10],usual:3,util:3,v02:9,valid:[2,10],valu:[1,2,3,6,10,12],vari:[],variabl:[2,3,12],variou:[3,7,10],vehicl:11,verbos:10,veri:[0,2,3,11],verifi:2,versa:11,version:[2,4,8,9,10,12],via:[1,2,3,4,5,6,9,10,11,12,13],vice:11,view:[6,11,12],viewpoint:4,vim:[3,10],virtual:[0,3,5,7,9,11,13],visibl:[6,10],vm3ow4thatogiwnsla3thsl3894th:6,vne197vmradjodkb1zsuja:3,volum:[6,10,12],vpc:[0,11],vpn:[2,12,13],wai:[10,11,12],wait:9,want:[0,2,3,5,9,11,12],warn:10,web:[10,11],webserv:2,websit:2,week:[],weight:10,welcom:[4,11],well:[2,3,6,7,11,12],were:12,wgaddress6:3,wgaddress:3,wget:[9,10],what:[2,4,5,7,12],whatev:[3,10],when:[2,3,4,10,12],where:[2,5,6,7,10,13],wherev:0,whether:[0,3],which:[0,2,3,4,5,6,8,9,10,11,12],who:4,why:[2,3,7,12],wide:2,wider:2,wiki:4,wildcard:[9,10],window:[2,6,7],wipe:12,wiregard:[],wireguard:[0,3,5,6,7,9,10,11,12],wish:[3,5,10],within:[2,3,4],without:[1,2,3,4,6,7,11,12],won:11,work:[2,7,9,11],workstat:[3,6],world:[0,2],wors:2,worth:[],would:[0,3,5,6,9,10,11],write:[2,10],ws2:3,www:10,x86:3,yaml:[1,10],ydazgedrpuxmmrqul35wfjmhvrzr1rq0u:5,yes:3,yet:12,yml:[9,10,12],you:[0,1,2,3,5,6,7,9,10,12,13],your:[0,1,2,3,5,6,9,10,11,12,13],your_pass:1,your_password:1,your_secret_kei:1,yourdomain:[],yourwildcard:10,zeroti:0,zip:10,zrb9vfhk8a:11},titles:["About","API Reference","Architecture","Client Installation","Code of Conduct","External Clients","Getting Started","Welcome to the Netmaker Documentation","License","Quick Install","Advanced Server Installation","Support","Troubleshooting","Using Netmaker"],titleterms:{"case":0,Adding:[3,5],DNS:[3,5,10],Use:0,Using:13,Will:11,about:[0,7],access:1,advanc:10,agent:[],altern:[],ani:11,annot:10,api:[1,7],architectur:[2,7],attribut:4,authent:1,basic:[],better:[],bug:[],build:[],caddi:[],call:1,cli:3,client:[2,3,5,7],code:[4,7],common:12,compat:[2,3,10],compon:2,compos:10,concept:2,conduct:[4,7],config:[3,10],configur:[3,5,10],contact:11,contribut:[],core:2,coredn:[2,10,12],creat:6,curl:1,daemon:3,daemonset:10,depend:9,deploi:6,descript:10,disabl:10,docker:[9,10],document:[1,7],doe:[0,11],domain:9,dual:[],enabl:[],enforc:4,enhanc:[],enterpris:11,exampl:1,ext:5,extern:[2,5,7,13],faq:11,featur:[],file:[1,3,10],firewal:9,fork:[],format:1,full:[],gatewai:5,get:6,grpc:10,guid:7,how:[0,11],http:10,ingress:5,instal:[3,7,9,10,11],introduct:[3,5,9],ipv6:[],issu:12,kei:[1,6],kubernet:10,licens:[7,8,11],like:11,limit:2,linux:10,local:[],log:3,make:3,manag:[1,3,6],manual:[],mesh:2,mode:[3,10],mongodb:[],netclient:[2,3,6,10,11,12],netmak:[0,2,6,7,9,11,13],network:[1,2,3],nginx:[9,10],node:[1,2,6],nordnpn:11,note:3,offer:11,onli:[],oper:11,option:5,our:4,paid:[],pledg:4,prepar:9,prereqisit:[],prerequisit:[3,9],privat:3,process:2,proxi:10,quick:[7,9],refer:[1,3,7,10],remov:3,request:[],respons:4,revers:10,rqlite:[2,10],scope:4,secur:10,server:[1,2,7,10,12],setup:[6,10],site:[],slim:[],smaller:[],sql:[],sqlite:2,sspl:11,stack:[],standard:4,start:[6,7,9],submit:[],support:[7,11],system:[2,3,10,11],systemd:2,technic:2,templat:9,test:10,token:[],troubleshoot:[7,12],tutori:13,uninstal:[3,6],uninstral:[],updat:3,usag:1,user:1,variabl:10,video:13,view:3,vpn:11,welcom:7,what:0,why:11,window:3,wireguard:2,without:10,work:0,written:13,you:11}}) \ No newline at end of file diff --git a/docs/_build/html/server-installation.html b/docs/_build/html/server-installation.html index 68f03994..06b7a3fc 100644 --- a/docs/_build/html/server-installation.html +++ b/docs/_build/html/server-installation.html @@ -548,6 +548,13 @@ Adding Clients to a Gateway + +
  • + + + Configuring DNS for Ext Clients (OPTIONAL) + +
  • @@ -853,6 +860,15 @@
    DNS_MODE:

    Default: “off”

    Description: Enables DNS Mode, meaning config files will be generated for CoreDNS.

    +
    DATABASE:

    Default: “sqlite”

    +

    Description: Specify db type to connect with. Currently, options include “sqlite” and “rqlite”.

    +
    +
    SQL_CONN:

    Default:http://

    +

    Description: Specify the necessary string to connect with your local or remote sql database.

    +
    +
    CLIENT_MODE:

    Default: “on”

    +

    Description: Specifies if server should deploy itself as a node (client) in each network. May be turned to “off” for more restricted servers.

    +
    diff --git a/docs/_build/html/troubleshoot.html b/docs/_build/html/troubleshoot.html index 5c498f9b..17fe34d7 100644 --- a/docs/_build/html/troubleshoot.html +++ b/docs/_build/html/troubleshoot.html @@ -427,6 +427,13 @@ Introduction to Netclient + +
  • + + + Notes on Windows + +
  • @@ -490,6 +497,13 @@ Adding Clients to a Gateway +
  • +
  • + + + Configuring DNS for Ext Clients (OPTIONAL) + +
  • @@ -727,8 +741,8 @@

    Common Issues

    -
    How can I connect my Android, IOS, MacOS or Windows device to my Netmaker VPN?

    Currently meshing one of these devices is not supported, however it will be soon. -For now you can connect to your VPN by making one of the nodes an Ingressgateway, then +

    How can I connect my Android or IOS device to my Netmaker VPN?

    Currently meshing one of these devices is not supported, however it will be soon. +For now you can connect to your VPN by making one of the nodes an Ingress Gateway, then create an Ext Client for each device. Finally, use the official WG app or another WG configuration app to connect via QR or downloading the device’s WireGuard configuration.

    @@ -741,11 +755,15 @@ Simply turn on “allow manual signups” on your network and nodes will not con
    Is there a community or forum to ask questions about Netmaker?

    Yes, we have an active discord community and issues on our github are answered frequently! You can also sign-up for updates at our gravitl site!

    +
    How can I get additional support for my business?

    Check out our business support subscriptions at https://gravitl.com/plans. Subscription holders can also purchase consulting credits via the site.

    +

    Server

    +
    I upgraded from 0.7 to 0.8 and now I dont have any data in my server!

    In 0.8, sqlite becomes the default database. If you were running with rqlite, you must set the DATABASE environment variable to rqlite in order to continue using rqlite.

    +
    Can I secure/encrypt all the traffic to my server and UI?

    This can fairly simple to achieve assuming you have access to a domain and are familiar with Nginx. Please refer to the quick-start guide to see!

    @@ -804,6 +822,8 @@ You can also see the current WireGuard configuration with `_. The binary, by itself, can be compiled for most systems. However, this binary is designed to manage a certain number of Operating Systems. As of version 0.5, the netclient can be run as a system daemon on linux distributions with systemd, or as an "unmanaged" client on distributions without systemd. +The netclient is, at its core, a golang binary. Source code can be found in the netclient folder of the Netmaker `GitHub Repository `_. The binary, by itself, can be compiled for most systems. However, this binary is designed to manage a certain number of Operating Systems. As of version 0.8, the netclient can be run as a system daemon on linux distributions with systemd, or as an "unmanaged" client on distributions without systemd. The netclient for Windows and Mac will run as a Windows Service or LaunchDaemon, respectively. The netclient is installed via a simple bash script, which pulls the latest binary and runs 'register' and 'join' commands. @@ -95,17 +97,19 @@ The 'register' command adds a WireGuard tunnel directly to the netmaker server, The 'join' command attempts to add the machine to the Netmaker network using sensible defaults, which can be overridden with a config file or environment variables. Assuming the netclient has a valid key (or the network allows manual node signup), it will be registered into the Netmaker network, and will be returned necessary configuration details for how to set up its local network. -The netclient then sets up the systemd daemon (if running in daemon mode), and configures WireGuard. At this point it should be part of the network. +The netclient then sets up the system daemon (if running in daemon mode), and configures WireGuard. At this point it should be part of the network. If running in daemon mode, on a periodic basis (systemd timer), the netclient performs a "check in." It will authenticate with the server, and check to see if anything has changed in the network. It will also post changes about its own local configuration if there. If there has been a change, the server will return new configurations and the netclient will reconfigure the network. If not running in daemon mode, it is up to the operator to perform check ins (netclient checkin -n < network name >). The check in process is what allows Netmaker to create dynamic mesh networks. As nodes are added to, removed from, and modified on the network, other nodes are notified, and make appropriate changes. -rqlite --------- +sqlite and rqlite +--------------------- -As of v0.7, Netmaker uses rqlite, a distributed (RAFT consensus) database, and interacts with this database to store and retrieve information about nodes, networks, and users. With the 0.7 refactor, additional database support is very easy to implement. Netmaker uses simple key value lookups to run the networks, and the database was designed to be extensible, so support for key-value stores and other SQL-based databases can be achieved by changing a single file. +As of v0.8, Netmaker uses sqlite by default as a database. It can also use rqlite, a distributed (RAFT consensus) databaseand. Netmaker interacts with this database to store and retrieve information about nodes, networks, and users. + +Additional database support (besides sqlite and rqlite) is very easy to implement for special use cases. Netmaker uses simple key value lookups to run the networks, and the database was designed to be extensible, so support for key-value stores and other SQL-based databases can be achieved by changing a single file. Netmaker UI --------------- @@ -120,8 +124,6 @@ CoreDNS Netmaker allows users to provide and manage Private DNS for their nodes. This requires a nameserver, and CoreDNS is the chosen nameserver. CoreDNS is lightweight and extensible. CoreDNS loads dns settings from a simple file, managed by Netmaker, and serves out DNS info for managed nodes. DNS can be tricky, and DNS management is currently only supported on a small set of devices, specifically those running systemd-resolved. However, the Netmaker CoreDNS instance can be added manually as a nameserver to other devices. DNS mode can also be turned off. -Worth considering is that CoreDNS requires port 53 on the Netmaker host system, which may cause conflicts depending on your operating system. This is explained in the :doc:`Server Installation <./server-installation>` guide. - External Client ---------------- @@ -129,7 +131,9 @@ The external client is simply a manually configured WireGuard connection to your Most machines can run WireGuard. It is fairly simple to set up a WireGuard connection to a single endpoint. It is setting up mesh networks and other topologies like site-to-site which becomes complicated. -Netmaker v0.5 introduces the "external client" to handle any devices which are not currently compatible with the netclient, including Windows, iPhone, Android, and Mac. Over time, this list will be eliminated and there may not even be a need for the external client. +Mac, Windows, and Linux are handled natively by the Netclient. + +Netmaker can issue "external clients" to handle any devices which are not currently compatible with the netclient, including iPhone, Android, and some Unix distributions. Over time, this list will be eliminated and there may not even be a need for the external client. External clients hook into a Netmaker network via an "Ingress Gateway," which is configured for a given node and allows traffic to flow into the network. @@ -160,9 +164,13 @@ Below is a high level, step-by-step overview of the flow of communications withi Compatible Systems for Netclient ================================== -To manage a node manually, the Netclient can be compiled and run for most linux distibutions, with a prerequisite of WireGuard. +To manage a node manually, the Netclient can be compiled and run for most linux distibutions, with a prerequisite of WireGuard with kernel headers. If the netclient from the release pages does not run natively on your system, you may need to compile the netclient binary directly on the machine from the source code. This may be true for some installations of SUSE, Fedora, and some Debian-based systems. However, if the dependencies are installed on the machine, the netclient should run correctly after being compiled. -To manage a node automatically, the Netmaker client (netclient) requires **systemd-based linux.** Compatible systems include: +Simply clone the repo, cd to netmaker/netclient and run "go build" (Golang must be installed). + +The following systems should be operable natively with Netclient in daemon mode: + - Windows + - Mac - Fedora - Ubuntu - Debian @@ -173,7 +181,7 @@ To manage a node automatically, the Netmaker client (netclient) requires **syste - Arch - CentOS - CoreOS - + To manage DNS (optional), the node must have systemd-resolved. Systems that have this enabled include: - Arch - Debian @@ -181,8 +189,6 @@ To manage DNS (optional), the node must have systemd-resolved. Systems that have - SUSE Limitations -=========== +============= -Install limitations mostly include platform-specific limitations, such as needing systemd or systemd-resolved (see above). - -In addition the Netmaker is currently unable to route traffic for for devices behind a "carrier-grade NAT". This will be solved in a future release with the introduction of relay servers. \ No newline at end of file +Install limitations mostly include platform-specific dependencies. A failed netclient install should display information about which command is failing, or which libraries are missing. This can often be solved via machine upgrade, installing missing dependencies, or setting kernel headers on the machine for WireGuard (e.x.: `Installing Kernel Headers on Debian `_) \ No newline at end of file diff --git a/docs/client-installation.rst b/docs/client-installation.rst index 14ce6238..772cd715 100644 --- a/docs/client-installation.rst +++ b/docs/client-installation.rst @@ -19,6 +19,17 @@ The netclient agent connects to the server, pushing and pulling information when The netclient agent then configures WireGuard (and other network properties) locally, so that the network stays intact. +Notes on Windows +================================== + +If running the netclient on windows, you must download the netclient.exe binary and run it from Powershell as an Administrator. + +Windows will by default have firewall rules that prevent inbound connections. If you wish to allow inbound connections from particular peers, use the following command: + +``netsh advfirewall firewall add rule name="Allow from " dir=in action=allow protocol=ANY remoteip=`` + +If you want to allow all peers access, but do not want to configure firewall rules for all peers, you can configure access for one peer, and set it as a Relay Server. + Modes and System Compatibility ================================== @@ -36,11 +47,9 @@ As a CLI, the netclient should function on any Linux or Unix based system that h Daemon ---------- -The netclient is intended to be run as a system daemon. This allows it to automatically retrieve and send updates. To do this, the netclient can install itself as a systemd service. +The netclient is intended to be run as a system daemon. This allows it to automatically retrieve and send updates. To do this, the netclient can install itself as a systemd service, or launchd/windows service for Mac or Windows. -This requires a systemd-based linux operating system. - -If running the netclient on a non-systemd system, it is recommended to manually configure the netclient as a daemon using whatever method is acceptable on the chosen operating system. +If running the netclient on non-systemd linux, it is recommended to manually configure the netclient as a daemon using whatever method is acceptable on the chosen operating system. Private DNS Management ----------------------- diff --git a/docs/external-clients.rst b/docs/external-clients.rst index bd525061..3f8fa74d 100644 --- a/docs/external-clients.rst +++ b/docs/external-clients.rst @@ -16,7 +16,7 @@ By using this method, you can hook any machine into a netmaker network that can It is recommended to run the netclient where compatible, but for all other cases, a machine can be configured as an external client. -Important to note, an external client is not **reachable** by the network, meaning the client can establish connections to other machines, but those machines cannot independently establish a connection back. The External Client method should only be used in use cases where one wishes to access resource runnin on the virtual network, and **not** for use cases where one wishes to make a resource accessible on the network. For that, use netclient. +Important to note, an external client is not **reachable** by the network, meaning the client can establish connections to other machines, but those machines cannot independently establish a connection back. The External Client method should only be used in use cases where one wishes to access resource running on the virtual network, and **not** for use cases where one wishes to make a resource accessible on the network. For that, use netclient. Configuring an Ingress Gateway ================================== diff --git a/docs/getting-started.rst b/docs/getting-started.rst index 6d37149b..98fbd4af 100644 --- a/docs/getting-started.rst +++ b/docs/getting-started.rst @@ -66,7 +66,8 @@ Deploy Nodes 1. SSH to each machine 2. ``sudo su -`` 3. **Prerequisite Check:** Every Linux machine on which you run the netclient must have WireGuard and systemd installed -4. Run the install command, Ex: ``curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netclient-install.sh | KEY=vm3ow4thatogiwnsla3thsl3894ths sh -`` +4. For linux machines with SystemD and WireGuard installed, Run the install command, Ex: ``curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netclient-install.sh | KEY=vm3ow4thatogiwnsla3thsl3894ths sh -`` +5. For Mac, Windows, and arch-specific linux distributions (e.g. ARM), `download the appropriate netclient for your system `_ . Then, run "netclient join -t ". You should get output similar to the below. The netclient retrieves local settings, submits them to the server for processing, and retrieves updated settings. Then it sets the local network configuration. For more information about this process, see the :doc:`client installation <./client-installation>` documentation. If this process failed and you do not see your node in the console (see below), then reference the :doc:`troubleshooting <./troubleshoot>` documentation. diff --git a/docs/quick-start.rst b/docs/quick-start.rst index f22eb1eb..c9f2734b 100644 --- a/docs/quick-start.rst +++ b/docs/quick-start.rst @@ -7,15 +7,15 @@ This quick start guide is an **opinionated** guide for getting up and running wi 0. Introduction ================== -We assume for this installation that you want all of the Netmaker features enabled, want your server to be secure, and want it to be accessible from anywhere. +We assume for this installation that you want all of the Netmaker features enabled, you want your server to be secure, and you want your server to be accessible from anywhere. -This instance will not be HA. However, it should comfortably handle around one hundred concurrent clients and support most use cases. +This instance will not be HA. However, it should comfortably handle around one hundred concurrent clients and support the most common use cases. -If you are deploying for a business or enterprise use case and this setup will not fit your needs, please contact info@gravitl.com, or check out the business subscription plans at gravitl.com/plans. +If you are deploying for a business or enterprise use case and this setup will not fit your needs, please contact info@gravitl.com, or check out the business subscription plans at https://gravitl.com/plans/business. By the end of this guide, you will have Netmaker installed on a public VM linked to your custom domain, secured behind an Nginx reverse proxy. -If this configuration does not fit your use case, see the :doc:`Advanced Installation <./server-installation>` docs. +For information about deploying more advanced configurations, see the :doc:`Advanced Installation <./server-installation>` docs. 1. Prerequisites @@ -26,6 +26,7 @@ If this configuration does not fit your use case, see the :doc:`Advanced Install - We do not recommend Oracle Cloud, as VM's here have been known to cause network interference. - Public, static IP - Min 1GB RAM, 1 CPU (4GB RAM, 2CPU preferred) + - Nginx may have performance issues if using a cloud VPS with a single, shared CPU - 2GB+ of storage - Ubuntu 20.04 Installed @@ -47,11 +48,11 @@ Begin by installing the community version of Docker and docker-compose (there ar sudo apt-get remove docker docker-engine docker.io containerd runc sudo apt-get update - sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release + sudo apt-get -y install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update - sudo apt-get install docker-ce docker-ce-cli containerd.io + sudo apt-get -y install docker-ce docker-ce-cli containerd.io sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker --version @@ -64,7 +65,7 @@ Install Dependencies In addition to Docker, this installation requires WireGuard, Nginx, and Certbot. -``sudo apt install wireguard wireguard-tools nginx certbot python3-certbot-nginx net-tools`` +``sudo apt -y install wireguard wireguard-tools nginx certbot python3-certbot-nginx net-tools`` 3. Prepare VM @@ -109,6 +110,10 @@ Make sure firewall settings are appropriate for Netmaker. You need ports 53 and - allow 443/tcp from all - allow 53/udp and 53/tcp from all +In addition to the above ports, you will need to make sure that your cloud's firewall or security groups are opened for the range of ports that Netmaker's WireGuard interfaces consume. + +Netmaker will create one interface per network, starting from 51821. So, if you plan on having 5 networks, you will want to have at least 51821-51825 open (udp). + Prepare Nginx ----------------- @@ -122,10 +127,8 @@ Insert your domain in the configuration file and add to nginx: .. code-block:: - NETMAKER_BASE_DOMAIN= - sed -i 's/NETMAKER_BASE_DOMAIN/$NETMAKER_BASE_DOMAIN/g' netmaker-nginx-template.conf - sudo cp netmaker-nginx-template.conf /etc/nginx/sites-available/netmaker-nginx.conf - sudo ln -s /etc/nginx/sites-available/netmaker-nginx.conf /etc/nginx/sites-enabled/netmaker.nginx.conf + sed -i 's/NETMAKER_BASE_DOMAIN//g' netmaker-nginx-template.conf + sudo cp netmaker-nginx-template.conf /etc/nginx/conf.d/.conf nginx -t && nginx -s reload systemctl restart nginx @@ -135,23 +138,28 @@ Insert your domain in the configuration file and add to nginx: Prepare Templates ------------------ +**Note on COREDNS_IP:** Depending on your cloud provider, the public IP may not be bound directly to the VM on which you are running. In such cases, CoreDNS cannot bind to this IP, and you should use the IP of the default interface on your machine in place of COREDNS_IP. If the public IP **is** bound to the VM, you can simply use the same IP as SERVER_PUBLIC_IP. + .. code-block:: - wget https://raw.githubusercontent.com/gravitl/netmaker/develop/compose/docker-compose.quickstart.yml - sed -i 's/NETMAKER_BASE_DOMAIN/$NETMAKER_BASE_DOMAIN/g' docker-compose.quickstart.yml - sed -i 's/SERVER_PUBLIC_IP//g' docker-compose.quickstart.yml + wget https://raw.githubusercontent.com/gravitl/netmaker/develop/compose/docker-compose.yml + sed -i 's/NETMAKER_BASE_DOMAIN//g' docker-compose.yml + sed -i 's/SERVER_PUBLIC_IP//g' docker-compose.yml + sed -i 's/COREDNS_IP//g' docker-compose.yml Generate a unique master key and insert it: .. code-block:: tr -dc A-Za-z0-9 /g' docker-compose.quickstart.yml + sed -i 's/REPLACE_MASTER_KEY//g' docker-compose.yml + +You may want to save this key for future use with the API. Start Netmaker ---------------- -``sudo docker-compose -f docker-compose.quickstart.yml up -d`` +``sudo docker-compose -f docker-compose.yml up -d`` navigate to dashboard. to see your nginx instance. diff --git a/docs/server-installation.rst b/docs/server-installation.rst index 56b324ed..d4a15f8b 100644 --- a/docs/server-installation.rst +++ b/docs/server-installation.rst @@ -98,6 +98,21 @@ DNS_MODE: **Description:** Enables DNS Mode, meaning config files will be generated for CoreDNS. +DATABASE: + **Default:** "sqlite" + + **Description:** Specify db type to connect with. Currently, options include "sqlite" and "rqlite". + +SQL_CONN: + **Default:** "http://" + + **Description:** Specify the necessary string to connect with your local or remote sql database. + +CLIENT_MODE: + **Default:** "on" + + **Description:** Specifies if server should deploy itself as a node (client) in each network. May be turned to "off" for more restricted servers. + Config File Reference ---------------------- A config file may be placed under config/environments/.yml. To read this file at runtime, provide the environment variable NETMAKER_ENV at runtime. For instance, dev.yml paired with ENV=dev. Netmaker will load the specified Config file. This allows you to store and manage configurations for different environments. Below is a reference Config File you may use. diff --git a/docs/troubleshoot.rst b/docs/troubleshoot.rst index 00de89a7..0fffe692 100644 --- a/docs/troubleshoot.rst +++ b/docs/troubleshoot.rst @@ -4,9 +4,9 @@ Troubleshooting Common Issues -------------- -**How can I connect my Android, IOS, MacOS or Windows device to my Netmaker VPN?** +**How can I connect my Android or IOS device to my Netmaker VPN?** Currently meshing one of these devices is not supported, however it will be soon. - For now you can connect to your VPN by making one of the nodes an Ingressgateway, then + For now you can connect to your VPN by making one of the nodes an Ingress Gateway, then create an Ext Client for each device. Finally, use the official WG app or another WG configuration app to connect via QR or downloading the device's WireGuard configuration. @@ -22,8 +22,16 @@ Common Issues Yes, we have an active `discord `_ community and issues on our `github `_ are answered frequently! You can also sign-up for updates at our `gravitl site `_! +**How can I get additional support for my business?** + Check out our business support subscriptions at https://gravitl.com/plans. Subscription holders can also purchase consulting credits via the site. + + Server ------- + +**I upgraded from 0.7 to 0.8 and now I dont have any data in my server!** + In 0.8, sqlite becomes the default database. If you were running with rqlite, you must set the DATABASE environment variable to rqlite in order to continue using rqlite. + **Can I secure/encrypt all the traffic to my server and UI?** This can fairly simple to achieve assuming you have access to a domain and are familiar with Nginx. Please refer to the quick-start guide to see! @@ -63,7 +71,7 @@ UI Yes, nodes can share names without issue. It may just be harder on you to know which is which. Netclient -------- +----------- **How do I connect a node to my Netmaker network with Netclient?** First get your access token (not just access key), then run ``sudo netclient join -t ``. **NOTE:** netclient may be under /etc/netclient/, i.e run ``sudo /etc/netclient/netclient join -t `` @@ -91,6 +99,9 @@ Netclient sudo chcon -Rv -u system_u -t bin_t '/etc/netclient/netclient' sudo restorecon -R -v /etc/netclient/netclient +**I have a handshake with a peer but can't ping it, what gives?** + This is commonly due to incorrect MTU settings. Typically, it will be because MTU is too high. Try setting MTU lower on the node. This can be done via netconfig, or by editing the node in the UI. + CoreDNS -------- **Is CoreDNS required to use Netmaker?**