From fb8b23ffa38ea9d2f0bf71b84b4a96b09b9c4e0a Mon Sep 17 00:00:00 2001 From: danciaclara Date: Mon, 15 Dec 2025 20:03:53 +0400 Subject: [PATCH 1/3] New flow for Airgapped Kubernetes installation and added an Overview page --- images/activate-license/download-license.webp | Bin 0 -> 36182 bytes images/airgapped/airgapped-cluster.webp | Bin 0 -> 66718 bytes images/airgapped/plane-architecture.webp | Bin 0 -> 32086 bytes mint.json | 4 +- .../methods/airgapped-considerations.mdx | 158 +++++++++ .../methods/airgapped-edition-kubernetes.mdx | 319 +++++++++++------- self-hosting/methods/airgapped-edition.mdx | 26 +- self-hosting/methods/clone-docker-images.mdx | 295 ++++++++++++++++ 8 files changed, 672 insertions(+), 130 deletions(-) create mode 100644 images/activate-license/download-license.webp create mode 100644 images/airgapped/airgapped-cluster.webp create mode 100644 images/airgapped/plane-architecture.webp create mode 100644 self-hosting/methods/airgapped-considerations.mdx create mode 100644 self-hosting/methods/clone-docker-images.mdx diff --git a/images/activate-license/download-license.webp b/images/activate-license/download-license.webp new file mode 100644 index 0000000000000000000000000000000000000000..27ffdcee308578632cc13ddbfb4ef8e49619fed0 GIT binary patch literal 36182 zcmeFYQ-CGewgsBDZCjPLZQC{~QE59XZQHhuN@pc2ZQJIn?yBy4`rdQzJMaJPpN)uE z5wX^sV~#OqY()uCQQ1fU05uUoc~yCK0>Pi3r?5dX0jby_i-37!MYE*~^YbYPk<7OM zkRUB=U+Fl$&2`4s!V_Q(JmJfHWwC#d6FFYX3gT{Y2Y&LsF~047r}mP{i=S6|HI)`i z_Gx&Re0P4+eHuFNKJ@8+U;A*lBOgs}?Dl>8{sDS!5cU4eJNE+R&4X`anwerzB5EM%VV!YBR%@x|g&?;iir z3+~PF4ZQ~bCi-IIj>q$(aBJnU`emb~8=!lZZ`r-=BlBbS9Y4=!mT%7k@x^Cm+U1>P)#MWqRWAUA8+l0Ml29FRQ{@;Fr@Gyg@fc}rx(US-Uf-OMM zKEvhTUMiB--Kcn6`+jDjZRUR%3Nay_uAu)uh>G!a4UZ`Pqqy@!6nNYE_i+ik+mBw5 z{~rbH)0)ykqoXrnX;^qbCdG)-(z;_Mu@!O=KzR(>KO^7SEHrWakF2=e?5rY(9rze+ z=$IisPht~~Zc|?)f+Ce%j=T8xS7Z$l{%#&7G9#wb8yQ1k`C{QT@-cW6Z%%%{q zi4g6Ki0Xgc)pzwtuRjwvb-3Unm9JZx%Xa$7@Vg-P z*KoNFsdjcs%OZEq%){T4l)>#5R*JtPO>B*_QMl41X0(Y4FO0PwSU-k z$#KccB%4sqwuLC~(N{bGb9=g{=QUA`-+j6T7|d=qVAurnM?NAk9#8KkRo4C!vNh_q ztKpK;hkHW0CuktM?{bX(jOIUcZECdBk%PELQ$CvQu(Z$6D_jF4gGf;3PDTp;xIr=3 zj;(4Gc5UcWRd9d_oXf=tUt3sn*S9FjhggKZe0Mf|`JJ~0>h>l%$O`(f9VYYjn!(qZ zNIZ2<26cB^Q9{!16Xx0UkE|mx9cu$86lN4W<3ZK3*x_?(}tfu?-Gf3E&zopLS z=On|5|8P(!k@qf~_Pf^(?Pvm2AAQx3ie1{ISxc`4daCsQa6(~tn`)SVrg-$JFbl5cI#A<`oFEpm@oHH|(a8F4+HRy&T!1-`gdGIS^VPA<% zXp3y{!jNxn`q#m72P;y97xLUKo3I>O*f#c4pdf(}RKpndwaJ))&~@k4FfGR)_<{yn znD?8}qDZ#RhbXG&^CzoJh-*ttS!D#UXQ5!oLW~^yozKZVX)%ND4zdvqo(4S}cNU^hvRO|-#Nd3ErVotiY z$Cy=fye{q&Y5h-P6jA3$_&4N7#0Y&#JXY{mNZP}q3Mr>sGIjcQPpDIzc|8aaaV zB#VQ-(CBLCECJ}TN0*-?J9BNb+&ClqV@>`^`r=sQiLHl4^#A688WYbMztPtpNTK4A z1L^oi58<20Z)kCNvw&Y+mp2srcdQY8OA>JplRKY0!T35NOCf%g(M?p2zE$csr(751 zfdol{)>2mSY@5F>-g?_lR+}fR+l2K8*I7Sq3eAs@TiQr`a?5Q43jtF!Ap;fZM(Hlq(#@So z&3b85N9zggfp7VK@S(@iBO?85F|5RLhBdv_ro74vnPRTK+FB$WC{VLT_1al9;9kja zbyvT~NFt+RRhq;Oq~&S`75h3bRz8i^&>Yh955&9v0e?}VQndCQXAtrH=bT3M=+#qb z%SCn&Mnw=`1nSYBkieDnH9ZW7Gq~0kaaP~jk{*7)l@72i!$4%~GN$!6=h*Ai+t68@ zuCShuRdzDKK&K;ICm1!~Kan;aA?eb!bZ-;P=4gz(02|K0U>88rO!%XGTw8-`Kc8=M zQCQuPDF9S0^X(Lq7o6pL>&5Ou?N3q$vNK8wP~@#-CAP`&uNgqn5GB=7_RO-WGbH?EKmX8_Z|Ac_Y4_1MS53`h*(7TS@K^+N@YnTg7H$5p6AcS+^A9%PFgW& z(7dD&Uh+;u>&g5!kA>m=h)8p-`djaGE~tPkgW+9z&Gw*nt1TYJ z$1{^A-OxgPd{jSNebIVnz^2FTi}R&FZyQd*2GnEfxQw$budfO@HC&@0=YouK10Y?udU4_or^VMyL?D<=eOj#LW(s)3wA7Sa%l+VSQCUB+Ri6Z$<;t-FVb3nPPWQ~3h8BI}?7CNgyoro}7Wh)>(P8*#ar zxuJv3>xd%QOO)PC$tV@r8Ec&82MlZlJU~q+j6xO7YUc}^%fVvf=O=RE1jBEu;9qv2 zK}3Gkm^h}wS2nfjVRXs1eQ`|yL8`RUvHCTGhKZMD;o{=P)a`qDR2U=s(8U*y1Ry*8wmYj8dlnPLxYo|23#!q-^6bxW@tQu$t=`JxUxE##Jplt# z{vHiL=^A$wXrv}=AO9Fr)Ud-@HKZt&akRD_4H5$)EUHzyXQTyXYB?_HWdr?y))#HE z1*df++h5vr6XCGfRI77GGh};33E0ADlXbNB5T>(aG*K0uZ%ivg$Q1P>JqV+>Y!p*|X z5@&2F$ajx!VhQu3sk* zq~?HsJ0gvFYX6}7Lt)LkH{>I|M!YsypxEk+5>;zhUM;^{0q23~7zFxq`XX z@Y=^wg(_T%`GXHXeQ<+ZvmOZZtH8Nn2eT`|)Rg^(vuUNrCbcU})(WuQ44hNkj9qO> zg91CIk{}y5?eQQ#d3GNxCK$srFkUbeEg9DS+YkqwGEfg`^2C5~IiNdJr_n+rT=y6Y zD_Bh#+>>P=;*8JvfKfckA;3Cjd$3DC4sb0?#kzjq>EAhP4YX$;@O6s)cV&9AoE)M? zMmQ){98Yw(cLi-)s1?wz=Koc;YWOLAZ|16XityiGk7$Mm2aJh0dqX=?)Yp6jN}IV{ z>k73i;L^n*kEDf*9^qrAX{E)bAt(-)$}eMBzL5;G9r+pB0c4FYux67h;4m>L;V;9J z$Enm&z>UdEqcda#F*C%I(HVwP@qcwp)QdQ32;1s@IbGMdaK=dJ{>JhhgO$6x zx~C$)IZ8jV&VN~Ci$V$xhp6ug9{L!1ncYDVo@@_x>*p_dZ_M#{PlO8@<>0V*p%x>` z&fca9fAUlOUMc8{lD|3IPyff3(g+L;_0O%9RLg?z%mppgPB2t?`!t`lK!CzYD3S{J z4%Ae`wF4OqiT&KwGK+8gLnSIOkYlES2n|U#v;@=X@EZeCPA(rC7p1z~(!6`z5G_9~ zjUWr}!=TE*6;5o!fiSHZHXeg`6ym;w&}10kc2^)5Qy`RtA@P8yDzj9|HyO}v>0pjD z1f6DsD1avyL)-#D6ZMF^76^5#IRaxIzM9-C z3jiv_e5xUmE{`M&>k1vc5T^#>i}MncRrIfRUis~R-cV#$>`>d z8js~~rZ(*OW6P@&_>V$ZE0QTPt~0yZL~RqW9ae;QPA^@)M^{9YCClBfag!i|i*}Su z^Q(A`E{pui_W$mE**gMXXds|oG9W?yc3yv?E+15v)}Pq$FMBgKyPec*G7or|^G!HP z0n$e)9Vw@3X_m4l{^^qCdjADX|J|w;ATZ>HzXvtGrJ0XXp?S@)eO>%*63rniQZANC z{1)|#}e+1j?bhI3uto0Mv_rFRxoAmiqiR4GUEK_>YWp z<9Dl$uy>lRq-s48zbkhRfX?!+P2x!5OWz%fyt}^9{Yngy6-Ox9(bj{MiUX zd~R8T&ice5M8rZ2e!ng!`c;CBS4gNpE$d z;x`gk4;AM}{;gL3FY7+zHfq+s7G|Fzk1?6Z@0tZ)4Fl!-nD0X{v`&HKjjo?QZldBK zL*g1-EKO6AFLj8#rWC;q$1SLnNwT9|A{)cO$+?@*Hrj_E8o4fwYwl-9%EpM#u|P^> zFsmK3q>YIYk)2R{_lpB7zf`j4o=uIX0(1Y`AY`Iv;oN*|>P0B|X4~#7I_94detT=5 zi|Y4(UGQJ+3A%&j2QI>yzx6#AQ{0)q|5=ViRfU-*O?7x~S}JaZwP%vUFAM2EosYkU z|C?WF8Qe&89sH{Ddp1O;|Eh=ox4uYS0FkuesEo1+j96N}{!A!%cl4f1|Inokk*Lqh zVjCN$TDAQ+^UCA7(!Y{!o$vZk4hjKpKc1Aegd13Is2yZ~T}>5|FDT&OjJ8C?=f(yO z&)uLkw0e?LBHbvysdo~lAH|1ccu+BnyuP2Vji#c`XHBY z>+{zaRM7R#{Q8=TasSd6DkG#6+T=4SM^@m~HqU3;(1FgI15Y3$p{sV>P=OB$;A5&< zzWcV(`>&0QLz@;ZvE?sK&wOcrxQYK&pnusJhQ;1R|5!599eb}k z5ShXKTPG39LzW|+6ltG^z-*2l7Hl(7@PSA4EOo7MXqJj3x z%e#Cgj?e*dc)bRpXsu+_blaqZ(dDXe)FbUD*@LB)+>}-2N>ru!Y?O&|>g1e(m_J7_ zk&czJAUHF;e)ivbb`g-nc)M|O$VGKXQwdaj2r#&{4b|sJYkB|W`2M4}v9Kp^)Y!TZ z0Yc&3U*Ok+pTdWI%5|*erDM@np$;D}NS7QeSF*Nr$BAZdO$S!ux;E0bR?G5r)Gu8j zze}Br`U2gi!vV3-8M+7DKMe|{K7nG*M-S^q)NL7D70QR%+HeY4>&`%NqZ{eg(bOjw zmj0k&c)w(P{Uhe`<(0dG%l)2OPjv9|oqb}ITtRB@C>P!E^?iV)AF$#Slicl-2VM{! z$|xiV5!Aw2L51hxafLd>!q(N{kdk$AwDttg3dEQ-5kIBw4XY3LV2Bpd5kx5h6TbZy zf%+Y-!Z)9D`#qIl|Up+HD&j!L1_^d9zQ!4=S8KN#jE3|Hj?f+6Z4B%ouHvGmM z@SgYS4r+<8{?NNtdpW`J7A^rmCVH8vWtVKLD(djlMo~0aoLXTH-x`#{2ZsYfgv0nv z@ju4`m`+hwaV~X?)3yxB*F^$ufBpk8(SuhU;Qv2#XRU?4RR$?y8Tv{`*a%#R4bWXC zMn2_W5tivl-0!$m*LsT?BtrGSdnS-4i7CVUSjRfd)7kQUjL`Jp>cOwR;smPuXcQ=tS zS%{@=dXp{Ua-CC`FKK(?|J!K%-+=YM<+qU^YQ7k~OY$`{KL9MQ+jPRT%YD3GPzZuX zjO-$ZRCkXOUW_4P4lgK&-DgISVG7)ZFQS`i4f0}EzSj@gIzy71x3pHE?&?{i0BnZua*->E z?%NC5rbLK+WO`&dcXXtgOaYwM-36{(ZByH#%Z zNxZe)W=icAt`ECXE}$$qWejRIPw@rUEu8loo^6lEMLE2Lp0+Hvf1}me&W{qT4{a@7 z1OruSIn^s?9W)>|bZo)`0%6Ej#k{)|RH1fTV!x&7dNe0#8URCj6#zW2mlkVp7|i6T z2NmOFS*e2YNkd$X{digGO~4ps(^H*H<~K7hIc;w^bM0jDoc zUN;;c;So`?+-yBCd61h6u1fp7>!lut!T9+k0I|Ii+H2^uVhYVC?%mm10#o*u(E+S@ zW+%~(lyWh$a?_Z+lxU^JUzAk5U!fZPxdvb)E57Y{4CW^vJ<;p+;oabFiQv(L*^%PQ zv9jBV>Kg>JdM!j9xNJOupxLxP4n`Tc*xee083ck&f8T zFWU^YI`+PGnh`%owkG|b^kfS3+cOS zx!~X?0YdFYED>9sY1qZBouZZ@0aA@6EgF|afM|mZ!zBF4(6F&~zo^?Lvo+fGm{LC^ zKOnlAr3;?IGv2(aX637xMmKW{zi!0Y{RS0+W6m;h)0V-lkr+vBuW57o0!hq zS_0kNM^|G8(bz|77tGg7uaaa~^1XKl+Zk9THjVUj{(-xfAQT0yg#xIi4f1r?Y%w@| zz$zkqYHFch7`sf>tpF&bv#!v3wEi@N1RLAK#yar=@f3&+`3ELlcuNN`l>4G!8z9d+ zCE@nMkW!zDW2n0Tu}8t;j|sI_xx$D7@I$g|popi;(jkJqvmubjU7j-6g4jh1m(sg+ zSS4yWr_qafH5p40Faro!q(04hccjH?ay%SP-DA2Ab2hq{oOXoE0fa6E0p4#x5``CW zk(^-m56qV>g@Inhhs7j217q5DejreUWvSM6adzl$Tkc=prC=~WobuCG z^)Jia38IhX5q1~#j|$KoU|2^BbTHq0Nel`E|S*_=dnXid2-|T1G)2l za~0g3PCnFC05axUXjbeS#{u()|Becg?gwjPh+VKJyRXv0SzlI!t1EZ(W)RNCv7=uK*I6Nc zeidu^V5Z;pQIdQ=@GH*eyAb(M6}K|~sF>vU)m#Xqn9NEOrkYH~O;gDb)EH2L1qT39 ztjZssL9fH#*{N>u&Xt^xY#6hOWV!XmOlGaVMP`P9n8sOJ^C(e6+%N;}aIi2+155~% zz6n#FtunF$%HO;#gMNnzFv8GPX)&ImC!9BDr0q`TKIa0-G5osdDJ#82rLK_+ zFUG~SQJLHB&(p~^ z&^`?_cn@A*x%Z8F+^W(lPM2&~44m(q#Q;v1-E6ArXJ!2%; zd1>|(qHxDY!ElUVGjB{)m?&q7hUVv6DebIX!{>g|#1M#QS@9t}bBC;cufFl(7-RZF zo*03!AfmWsc>$RQ=GAjB?4Sz-)aq}iE_>Tkh#kqPUsI*ouBqu>8qk@RWJKwc#?wTc zi46%BGdQP+PG9h+yP8>*6PGz6y4ey`!)j{J6`y&&Kmv$dbgCbpprDpr0JP|;K%C`b zGk{#*+AhFsh(a(EpaE8C^Y?B?U6M^NdS9a_bKF}hxrbZ=5ZpL`;E`QQJUrX{mdG%aQ3!)XqMz{4KOnabrjn& z^KE(+Ws0%bn)s?4zriR0{rE}?#BTH6WLau-pW=E`y7kIprz|yL%slpu=DpxwP_Uk1S^9y~UwB5=axt8Ke!pwsLP@ zpF}LD9bw{GBcYwpOQq8VY_NOmvw$kTG@22Is*D|I_9NaNzRsRNpjU{NXAzj=N&FvA zxVthARJl;uFzF(1-q1ihVzO7eYfFLs$u(Srh~WYW`KC>y*6@=z9}rP`5jX+^E>KMZ zn=ZGoFwE}c(X6ti#-$72AB|foFJe!@NCtJ4p-{73v(7i0o22(pazx)gzx!pu`JhqO zwiU!taSTaQB;mfFVv@OH8LTykHM&ye)s*b|WVxgtB(scud4RHJEjE8@+n)>5GLtx# z+<;?KHN+e_Q^DTQ5?=Q?s+oJ+gma#8y8{xzNm~&cckxFQt!R#z!|%&>!b*FdZFqZB zw)wV?!FHSES}c=FShBG+c~M47Hj1m*C_?ReMw>jvec;}ldzOl~v8ahg0%z54$tuJz z8a=SF=#kHQqv>EqGq=*$RGHviA97kj*>8>(^?p}v1%ar;HK5Xn^+>Goxw8@V>O_ND z;*o9^-A_tdVqezZvX;S89BFFWAU1XOo5J)#=0G@^xJ?%CQU$R7^9)dR!!{n~U24+R zKKYfYt?;h;RT1brjs43m0RW(t+Giqk1Ow2efvV^VsfU?;i;ch9ihI(o^2C8UunQ#^puHD7pLje zq<}UJx);W5KvA+Tf$U;-5lK|XoH^LyD(Mx5>76xv0jSRxYPV#Yg z($W0gp>a}x@hf%M8ePfavlch3k5_U=dsku#;>C@w-{0Ad=f$(pq0LsDxMs8-p~Bqc z-~|c*zt0t!1~1eUV;@1uY5|)N%c_u8?IuuEZ4nO98!7z=+L^-Yw0swuZlq*+Zz(k~ zasdVl7PlqqZ+EH;A;evJNY`o54cwpnZkK@20kD_VZs*#yT(+MVafdqN{2tTLv&got z6$|KuZ{uMBkm7GUvYTGYwQ#3jkzyx=U7ruBs*_3Erp9;LAxCvrQhMkFJ42yuFANj9 z3wSi!o$1qKq)3$jf+^mcJD_CIi!(Uwxb^sM#1vQR0pr;V252x8TEFkT||eM!kJ#UyM}SYYZbf0nKC86l9y&Saea{No_5295AS zB>0w;$=h-n#ITw(3sR5gyGx`D%YF`1LekJf7|<@_$?8|s)Y3BQ$DQ=N6WeFZ)GdY; zs^URkm(V45(w!V!vim*ZXzrJ9v*U%ix)x z9c*3GAiN4>ec!LNCW9JZnFT$L0%J8w6d!@_S$_-;c}-*t_QN*4yk1M&9Dms3Zw-o% z$ZAG;IPx;mKgDW7iX~pmBq#wLBJO36Rnftab{XTsw9J(P^0{VcO>jND*S`SD zG;Kn_MVQHQ6%ZC)DSnS6dn)$+nD-eA1sP#Gc#HU^MtNvCU(fbjP~_|Jn*9~V#m3uW zq4yHJSeQ8ALdLj+#~pH#m1S1{Ea7kp<1PQFhc%-(NxRzb9YK=?(?-NY=J&u)x&@VnWeU{)+)jnE3P4B6qa@@_AH zoxNR>L&XzWAphXoii0#dV5cL^=J< zcr4IvosR?7h4|qMBunPBE>jsC;byAg~iqPuO5}D&t!tkxr*9yTCD8gJ;|e9#J%>C9XqUkxj0n>!8$IH7(mrsg&JM2S zY0`?k4TvFBnEBUYvG``i+cjY`ld8NYh_9vf2W<#7K}?uqvQ>}U@pTNE?TiPtO2`R2JfZgD-jENv8uR*mrLb6 z_T$r&&m`?P;+S$}0Zc<{pBxWS8G#|WH2;=UHY$`FVe$OPJ-ZcePG9k8iDi=E8N;{d z?R%_mJ&TqtfEL+#!MscJ*5a%*PX_|Uqy*g4am_z7!$zMuE_xqhYrzU?dnNVFW&o`I zQ$(kjYgl=t5#|ax?_9oG1W4M}*jK@*YURjSonGm5#0^UCSrYITOstjtdV}*y!?&DE zOc_?c61=St$$A3l%^a24zji%X zszvDED&SFghcw#46RlMEbd``_eTr%G3DK^)i;~&Dc6FsVY_-55McG?%^8h>&c#b#9 z_zXE`v165G2={htWPwS@RAFXkOH*3(6m=(hN^0^QO^(}bZSw^c7-sV^ba-cjWjwRn zwd(aq4w{fBv|D{}u7_c^v2(iV-P4K9i*G^O5Y-8KGaJdfP2z|1w2Sl+q5%d_Fa9ZP zik{UCXl?KdLg?b3^s)1%sn@g^sNfJ1zM3~lg$uq0= zW)`d)h!S_6u#E=ptfVw`(t*5--j09-1j{cxjCJ3j(RV;4$WTlmrd=xvWQHPrKH@r_!NWd0}9-u3f+MT%B+!72DRtMHD(y)L$#m@(`)Sty4}L1 z$d(Y&^qswQ7csDOxfMidSF1x9ITLOebG$A(V#qEYQI}Q}iPm*zus`OmGO!$7=t;0H zk@E0x1y&lS+&S}yPQ%+s!?S?uSxO`Z@7;23iscDT_T*rWMy>ZLZh;r1!qKwGh&cw0 z%0drujN%0lOzoqBky=i$HM~jePi7a|F)zMn$Syykog;^G<9S*MN2LtpY{i!S_ykq> z9m=oC-6zQmt0v9@$zoU`ksqhg3$l|@7G2bY)I|HNY5HrQPDIhEh^g7NvsroPZh3$g zXoIeQsfCKx@$~&k6<~1@&2#*dTrM)=rNk|4Bm8dvY@&_lLXw}I_5|xX;Y`a^wRC63 zdeS*9rnEgYiT`UxaOo5y#}jj7+A`al%Zp00zig9hH|H|>;+R!rdbxmR9hvngk_|Gn z9G-GSzMDu*Z^Y)=Q;0Gz-36`Y6DsJmTbiD<$+{)-1kvt-Z6vc0-x%kyt&G#-OtG%v zQ{?$a(V5(lyykues2^3NIjWPZ<}OfeXK%v>Nu{5u{Up#T>*E86AlDM6=-$p_ked5C zt-_QvB770TcXF@B@lkmU7Vl*la1s4dxKm_?Y%7W661Sp_51Sc(wc!Q^VICOpUV1V+ z$l$o+068b|__fYJA%7&s8!Frg1$Adwwu64sJHPj7YJKSBoHWgX^w zho4U2ylI!`AVTpBLfNW%I->)lz7F#-Xn2ymR~|Y)yBj%s6GOdd7pFJh(f_FBTGdB7 z=0|F&?qPDv6)^`EA5f7+Ew&&=n=2HW9dOs6ev#PBiK2fR3b&1iOrXyFxZ-ItMK1 zsoKqm+&xw%g6?QQp{JD9lBVeNq39TBboh2k@Y?fi-a1q$adU5`L7UW}KA@>8?Iq%h ztnilp!S?PF_s1##B#e8oZW^*jCXu_8<;1(>P`k=liz7-9#1^FVkYFcMI^+X9MEhZQ{n66h~dOlUF0vh6l@y+M@AC1XPZO$ zfcY_iE_od-GS7Fr0?&P`4!{g`0P)|$o=T(#J>oS#ELTCxJsON z0U5|N(1;36zOXdt;-7FM!|}EhS9}r0QaPu0jPcW(9wTjXJf55t4elZyP6BWYcH}gG zW5!QQvW>7SQZ?DpWGqSQGH{>4UN`iY zh}sr|X~h>|%bnxb4sr*fiDt5}2-!-4QOe!8U2qApIU@{2igI#>cIclSP=z_=(f}MK z5UT_ww?0jCoh98$y^6Sv}>gESq@OOLY==DImk|4m`t0;n{d<%3P&QSO7qQW>K&lNQQdjgC`dxDD|{ltd6j;`|+#}2t)4) zGsN@3``q|ZJ;2*03uT}{`i8O*l$M#7Ygr}UJEW8l;Az(1^JEnaPvh753$t;^UEn!? zAb!hQDf`Us%oWJ)jLj>1#AU+T^nR?fjgt(sJa*YB-my-Nkx7wY<{v!nHq*5jkkuS- z+0gP1R<-Ho-Po4023UF(VNg;@Um9Ur`s3hKfy)&LR+|jn7b@UEvaNQ~#M~`yxJGIP zQ%Od+23sFo%EV+IvphgI=9n4#8gA#<62#W`te_3`u0=}{ic}(<4OTKd*Cs1|XJ3PM zG1wXiWNuZ@LP*|E@GgHA1EUI-$eC$OaV*d`oy`BMtv1VDu_$VpaOpbbwj&O(8wYAx+M3b#|y)O^jQ9uD=@OuCR}f3N4~>LE!R zSSxtYtG;er$_ADSZuB9j*FScvrG*5VW)ABjCsNo1e*ta_Mf_mKg zImk}X&*P&|fB*F5_m|9{Tka2^#Y0inpNLaP-)S*@SGI~CN&&`daAyB#EF$?CZzCM}O8;u-{ zTB#uWsDapA8sc-@NuBV;o+!NIC4`;cYFMSSNCOLZWR?8-*%s2wKL)E;M4Fg{KBQL6 zwAz??9&2q3@{Bjpz@70kH_3a8{CuUNC-5V(^R$@mCEfkOA<>hi(rGcJ^#T$4j+ zq>H}ZofsuA&^=ssAs}`PqF>%guf+(9 z$qs^e<~B8G$coCI(g{v@Ngkgb9GWr^u3*^GaX8q7Tn?+1D_HFAV%_lDJIlz72YOhb zXLyUBtW5im%Uk~Kk|=Fp@bx35Y%a~&17%Y0pjgPQpVG!%stV))FrGiA6((FpQHO7B zDf_ZeOH-u7NPk!X^&tyq0j>rgS=NGGO729rR5Rp;xAu2*(w?4HxLa^qwFO!KZKO}3 zLnq7~X(bTUk6p6ov#`ASc{pxz3Hs9Nv0bBRXl)V4vRA0=?Wj+NJ(RW^;Ej00oansr z20Ma1>{%IDT`|;^!c)u<=rV-sII`l_O z4~;}%kia*8Amoqd5!UafEN1k4p^WsoaW(VOJQ#gI!W)k9-6w!Zc`RFaiTzubkDk2v z@FD;D;cgv_?I8uqAePs#TWU?-VZMhfywaGLy_|WyGI~)E{LCP_7B8YNCm{ZeqGyWL zLLbkR7d-*s@&X(|-Q*40GMB$D4^P#=17(O=QO8k|aG${u1HcY%r>NiZNlI;&}jtE1pViZAxFF_Q(QP@E$`DgHCltL!2yfMI@t&hJ|9q=AVVK3!4M%^;E$%oy=i!iFku23ZCQMnY6Zvfg?zV z(J|z8`eH?d`@g?Ucp`EnjeiJ>k%}+*RJwe>d>nfP&F`UC_Dh$h4YlXn}kfw=di$p(4d4CFh895#na5dTae~5ect6DzWWI z@pg@@lZ3T7eVg*I+UHqerL+3oFiMKwSX!BH^4R$9OcmOnVoHmTcO`-WC%y>U6(pwy zErJPR*wfgS0a0zinZy4YE>V;i8DBr+qd%sZF{;)YH>5B1<@Y-_+ajE)rAN%dQ|}h5W*C?##pFeP&IoHxNuX! zqf(OMual`EI!^d*4YC8@TQ2kBzqK)tPQbq_{ z2nin4FJy3PnYIA4ryBy*J=x|JnTVmeT6i`QtcpFPtq!$wLEbNL1XwpeLp}Gt6@03$M>jUW!*b=)a=;D*(>FTJo2MSJ~cf0 z4volwL}68cv@o^-pSqJu8@3?j2_w2CG6AFz3a901tN@x*;&KQP)&jtEPoJn}%J=cr zTcL&39$P-+mdi#rA1X#ZGeMaP=0+KdHV3J!#;DYwj~enQMLhI&BHB@d_+Ux_N^9mM zH}O#9Q|q}GmBPw)-EQ-w-TJq3UOPmMswe_qX`_aFoFMj~lAbGj1ejOZW=<~lp^I#- zRc+Df>-(o*trGm}Rc*1D89oUBb3IT?0i(}rr-dRW8J0FxR@C|H_53^SECFT0j^7qhu+f~Bwry^nduSzORAuO zFf}chkz~Y8bPJDY`;uIcxQrdM9i3Vn5ks0N2Oo+Y!1O}TE%j50&6k#6rA7G7PQI6? zYGvjT`ztE7s#K1+jWBoZ?AlOw1@o8W5NwI>NQ4n|{PbZ<^S_E-?@oP7(3ou)*o74m zQHehiZkz-$O0+mAb9I*E6sDkbZZ=jFkVQh5Wo&nDYYabVpz83K5NFy_36jeX-&K^$ zPW^Dh0WGcMx|0KJY=O8y-6h59#0=gN)23qA75_q?WK2n+3a;m$$MR|kclJuIlX^)v zwMH#>Ln2jI3)In0l^q9ZTxYCe+I7TNG4i=j?|4j?x5FE;4*WJ)L*p9$2y_y!g~-cX zR)6?Kb-+kUC6GvC9O8<~InfgavGZyhUdV*qqqw}Q+#~Hm)d%XW<9x+@9?7bv{3g;T zRuD@B_Cl-FxGhoJ&M|-Ow(0q;nFU{~#0d@Ji6VUTDSdBgI0p+P1Jn+JZV_2oxMNWJ zb(H$#ywd6cU}nmM zbNRT}Veml}mz5{(o9^74O2bFp%=+%yMoYqisnlLA-W?h-i~;J;r(@TWJ}u)tf(Gg~ zVx0z0RP^585l)=Ge3#R8Ijphar041J<0qxR*7P#qL1e+V!Ykkv^L4`@`U|9oQ*RQ&Y-A!Il2 zOVv;o%r3t=d;_=Fh75r$gbc8|2TN=z%Na@u^-KN{Txk^Qf#lGOn}jJtK5M^W=NTQ* zk}`W>CFPE6582gQwM{)|BEfk;TFmZ=ZJsM+3^L~iwnNiE8(+pi za#etnomY<`!gU=632r5=3FC#y@>%-k7dv&DdkSH2U2~{(*@TQUquIXIDx$+NAl@3Z z-1Z^(OAx6N$JRGrb6*EP#_0Rqnb?%JVwr~QPqm)h0+3b&wMBlnv!Cwut-M4o0*X(O zjdNvqun|et0E3TIq{4!*j2&Z-&RIfI!w`&o7dA6y{yZY5VPFt|f>HhgD~N7OZVlHX zYzTu9Hc^wU&&JFo!O#^zkkR){;$I@3{PRig+Y5lTD#PcV0}$Hty?O8cDc7);%x2Dg zpsuLP7ITbMWUBr4LyXwzLlVp8b&{&X=ggs260<>sTRC~TdCBZ~mL}p)4sJZkjRV?M zA(GG@dvN9yE1V*i^G*9-8LbUXt)IfsZjS?Dd*ODk>rdSm@zD5MP>oee`h%~gY6pFzj}dBe zbLEpkgFfwlksGHBJiBdi(gRj)=Fv4v@Kk{Oe;7N5AVGj74YzIEw(Xv_&1u`VZQHhO z+qP|+JG<|&d)&I#p&}|Gs}g^Hsi0?NA{+2Q8@*h zZv?q@VSnBWR&(pwmy>%RV@b^<;MO&`;E;_>H(xG>^(L!-dh8g=ei6~Skn+>PDh5ap zvUy*Yw0!a)L7PT?CD* z1ANDuZP60@S#H2rFc=^{re)93u1lecQ-^`+VvX*A^Od3pwM5+b7ibww^pncrQWhI? z+*e7?wvgTK=`L5k2eiioX4nE3Q{#IX_?{?cuSK9u_+G{trBg8owh{HiWni1{l=t^} zzQzlA&yyC642TkKn_zcgtfTif6kmW)Q&|D@?YcTl`n65hDhB((Da$nOZME8zX-pID0l&)#NJ}dQ^ z<>iCf6PTb>_@;s)9XI*1=-RY9tmLSU0ox70dtvlPB9#(RPR ztAtIDoWo)&q-nl+zxyxg0|`yKJ8X_Z&?4O<*1Vh8ioZ{>yZtI0U%hDqFsE<>wrnlc z5~`ob((Lvg{{^Al$0>42LNX-5aTf~&LIXpX8G=!;IC>X{dtc%$0&*qV-mP_}Qk*K3 zx_>zYQ?NrKS~cq%^mk}Lc!e7;;C`2k$_uR*IW$ZFgffv{OzE}TmlR$$RBuDRXSY|V zx`ub^c1&#^9eaZI6vygi9?6Nb_HFIEHmH@^@=qiEyBrSKjRjhn`v4{&=Eu+H#VYcF zq9VQ3t&fb_r_c{dRbmDGi9fB%4%{ErTG=OQ{KLsa@WM;JZ|M@0#mHF@g+7yI92@_b%C@&?5|<9@Bk9zO7*cwYpp#y;>#}jWrEErlhrc><3VnyC?mMwFwV-t z^z==jwas-AG@T#n6XQj^!dw~ZlTcLhZ2GKO!Q}8aW#>~5XkowUY!eI@Kz8`X zwLcv_=D!p0{IiwZw9Y!;DX+3fjJ(Ol5Af5(1#GO=-%qw}|1=t8%y8(AYQHlXzJWSS z_Lr&X7Yb}W%*GvxD+jE3iH6HvmpZ8<+s944=jEq&X`;<<``_!rN?PP?8UX6(amUZA z8KWY9Em_R@OMrZUPwF28Pf4v^ptvQ;w+E@$-AGX;OZdB~BikS9Zi1VKKv6V2#HHiG zv}(?z@m{GT?15`FN6 zkN#;~SWl#Eus+nU*CyaG8dB7bk&awgsio6L8;-g zE&i1;zPMCmB*EQSuEDNS!Iftn^;^HSq+sp07*h`O22Nqy*Aqnrfp!cIYmTj;;VRl- z%FiPppo;I*2~G;n1Y0tOp9%tEC?k-ertt$1SQlDuXG4{Qt`E_%!aiy zLa`@5*T4<~US-CQT`Wir7w1)og{-TRWX;)pgnsq65YsJiOxYd=yxTkmH3O7E(p&=< z>$A$AO*#h?^A2^c&nVa$`4%qesv{7Alm=kTXL3zHk@b+;i`>i$xzqz7Ax3-I9YUn+ zX!x!OuS)bcGC3Zq0|1T@hPoYkz`#CvCWPZ;5B@uH{!d0IrDgsIZ}(J@=jPsmkaHEG z^;{_$!ixU9_QXS_F??t2SFoInA((y5+!#idx{ca4YHXogHnv`f6_*?2 z4oAJ!2N@j#Q9SZWjFy@-1WW()P8`B#t?f@_oCSH}KOk+(Z|`*q47NBtGM34~GHvdH zSC1^`l3JmES&#zuLMO#Pcbb_~>$pT%+|4RF@C;f`RVFUzZ>s!b|N7~O{Co8(m&94i zKUJg?=vfsU0^{t)#8Zx9M@4JM+W)pwEFnhIrV4=NAAj?8EI@yD z^{Ww|ukAkc6?^aQ1*|kH%~vwB-zi)!can412%ub+JbS^=p5(KV^uhJWe4B1sG?giz zaE2-``<8i|elj{BG)Bn8Jc&WJ@U#JviKq_MwGy%8!aTe`$}QvOffcD-B4)#=Tf9fy zz1EV;nCT-RxlokNg&e!GZo>=5qk$4i#62|e{j z*o%>ETNe3_9|ZikGZtk*a_{U|d$QTm$hX^b@q~7>IU6%I`?4L&08T?Jq#7*b=o3fl zj-rY&sIn#(XOkIpTnQ6TV-N^!W={uKd|eVHWFau@RO_``g`wt%tdkce7-ut3ZAX`) zGYZSux)Sre5I!90B`BIl#Wgf`SdXji&}1nN z;|Bhw77?X96Zdt!^`s(CuDv<74fGvh&=~3`crMn;dc44$e0H>rV=!(2JjQ$Esjsd? zh2{YQu$nP`P8YeK_KIFCrtNJm7DDMR(@^dYi3m(1^Q$O^0+ zcd5RK{)H3Wotl1mtCu6n-dB*~tIfKqJLX?Ut>+#}k^f-w?F6JIb3UpS0q!G8x(F=a zxS_SzER`J02d6zIudnjC-%Z5q_R?nYqkB3@<9PXdI@*9ZA@z_6`$!q&jBtvc1 zH}BBhy!!49pK9O)?+cz|#Hn6_^zwU)zSjvBf@Sr|>_Lppc07VOhH}KM(mlbxeOH{`Dh(u!YI~`MbK3rPK^1P*L55T^ei} zM+!S2ef#sq^+YrKeN`}*WmKK@()cEYZJXeOGEM%x312_a8FG_9;o(ybhU{c=`+WKW zI)Ro15gb{O0Q=cDe_ZJU_`;V{;h^B&P(H$iwBPULb;DX?Kq~rvJ7X&RyHweN` zaJbAp*?s@MDH2G1AlaAnf?qUN+A8iF=3BL<0vMc1qMQ7Srr> z#A;K>0IA}$_aYf_DY$@s@iJh@AUgwho*!(qtIBc*L=}V? z{UBz>#CzY~Egn<~WkbbY@kT1ujCD8$A5H>QQOeWruL)a%oF2Tx8{mBhnK*1nAT|WI zD1hbV8{6I#b#kx9IWfq~ymqCOVEWc6EW$P&_Ws`u3Bk>F2J5z-R|FOO!X@1M+4>tf z;goq?HC-tRryL*e9TUrocXs*W+GyTgah#W`%&^{Dd{`*xFrfyFM_X^R+E|_T6BuX$ z1Nsa_uBWf`t=Kb`s4ytnK#<=^fas{IhY79{$g01O!K=%_A35$e(q;~Kbrfv+0Wz|5 z{DO`p)PsVJ#_GFgc@!$_x`=+F3J9FnTG-Hf+rY29N{dY%pUxtS!&tV2e*(|jD^W7- z?^WIBmxiXs|0e#@3TR3)@9cJqC6Kb__%$747j2t&=oaW1+LBEkZ6Dm@#mUr%at>hR$>bp!~US7J_`0JNUD}Dqn6fenDbIeo5Nlc zCNTT^SVdp7o30LoMm=^_h#r+{JbSf`1^;m($`Ku{+p=sT?Nl^D=rbydyO!5x2AS_zz{C{Dq@}H{P>i&h6$x#SppsFneDej{6>C zIUjtaagMRPtc7@H_VLyTjY8)W&HHCcLR)TZf)rjA!g+!YNIFd>uwJ9 ziqdhDS-C-Tl=$=TZ5~eOEP?U>eNi*4_!t!#3M{oVBtnG_AHQbP*Wk()+Pvcu65mIh zTX}a#L)I)ik*4k$Xbeqs2_q8{6!Wq1+1Q%lBu&6ra>ZemIiU z9neS&(~6)K=2Y(c<5-eC?Dq*Gz!#2B2K5$>wzGgCSKRzK+q?u8&a=?Qre1bPK6E+T zC(V*Gkd)ITay9j;v(iPp{)I>rWx2^q=Hc{c%;^R|joM(cjOQPc zqcb}pOCDPCq#v^`IuTIqa2+NN7z?OvLL6{s0)-9nuyGvt&35dg+?s2uN|nKlshGDc zeDoqai3?NW+{Wov9WQzMEwIhKi0ECy{?B^$YpoS42EvsQQqKFyiaPd&@nS%0c|STZ z@cQfq0~2I{OfP-!XCyN}Y%8N5CO=mk&t73qJZ`io_pEBv4%&8~zEFnBu5(in!e5_2 z)X9ltpF$$r;d8sry_sbZD%jJY0r|Ew?no^Egq@7F?I5w3Ab}0T8FMp*E+PzcORKV# zoN6pKV2a>?@x=Km3ngZ~a`@KKc$Xtv2+0MbF;iiFw8TXMB?`<;GpO z-6rieW^}rDR-QFA1up4FA(m&(^>|TXJqi=y;U4>B{$1O@uc-#Y1!q9 z<=d58_c2CsW~+m&uU(v0Gh0qU6_bYt`%wPr&*)UV=cx9S9fvruJV#Valy-Ls%CLrC zgkLfH7W+dI<4MiRr+t3_?X75GqBJ1wHLH!xU@?Y{r-CkUNLE$libKK_0kRTvn44|5 z=JRzO6_Jb7VdT4)XZD}Nv+%#Fni>PG_V`%tgo4IFou|lhmw95eLmhrHb^o$iiQzdH z-qnz=Zw7=VZgEV9_|$)_8uC=uSB~ZzKMDc>6a&vy-Z2n}s{<6Dt^FeFrrXgn2T7N|M(d>y8`+41g8sz4X9^$Vpg{=&l)n?=h$Mwe0+r zQH3nU0bI^9+;iVuYFKLAqqy;=`15sm%aqCLoNT7(qsULh&7NjFS%72%_)&)iigPp~8OTIoH&tQt3AMu*x`FJG~RD zi^(Kc06`ytu5hR5F5c=z3{5q=uT}1bdItH>j%GlKM*+R~>#O5+`B5-j&#htbXkREy~0Tkf|2Wgx(N9pbm{_Q%u3bzt1TvUs>yh)57wLz1AUUbMeV zo+05=Q(tw54H!YH-<|iAi8gdDHfN)d zD0uTIon$x(PIhs~{Dj|ue;8j8ORMo&T==_R5CRI^f41uX$?!*imMgmgI}kMxfW3!M z{2r><6q$o_F5b@NMu&ajCh04%5|>1!mP$D49^4Xu)N}Sw+u7}U@hDmyY>@B81Wajo zq{L}gRY-B>`0&$P=OU>P_fYW&@*)Ai_Pk|VY^fDM;=wcH8FIfj7KiquDfXV~dqDbL zpO06sgzI3a9l;?tcpR0Rgcl?4H~9?Z@gIAA^_`yDTJ2z7`zTq?GDE9p=QU6E3`|6e z5tKC}^+J^7t^O-rON zG1b>OuyNu4t!x^<(f;WW6u+(KV$unC&FQ7W!VuxMKWgI+G+8a!y<&qc!_>X0AS%;R zBT52I72LfQfND6LCz|po^1$3|Sb@dvE)gg8*yJs9wonmm-?`!{tz5gd1C{(-pr88i*vsfclJaE#eu z`Fe-2u5!x=S9{7UfGs5CJDS~&?!O}53!fGR-8UcP48K8W0LR*kl;v{}+XUo^Lqop= z5ki<{P;-s{`p}6q_v;9OJuf>94wi!0lB?wE{3zOCDjq!_Z`x_u(sfghP!HZesl~F8 zq!xI8y^{+)rc`{VlfOyDj@acjhv6-HSQ0SKq# zS2C!G1964n3GLio4(y5viV`1E{w#UH$r0G#Lm3`J`t?DP>!m`ar`ADXIXB7kT6q@& z=)JA9Uy)nw9H=Nz)3FlA4*q8>HDysg2gzr=NsD7)l|$NwDj*aLsR> zrw8hNy&qp9SsMC=z34V=4z;U6@^a>BH%05D2wSGqXT~5YLN5Esmu4vlfAX@;-vJlr zWtZ;&C=yTS2EDsS+T}Twb@=L7>4k2cviCg?+@G|Mna0+s;wLJ5A`+0cqb(4_^=kaJ zgr)u&w|d@8l$Os`*IaZa3np&H;V%vMDUodbLV#P)eDLcKtr*^pR@Y9K&{ZQS$7Yl~ zp2%B-KjRpx(x4za!tq$?tQ!mORWT2XOt~bj)Yxu!G;xZ>+jouJv z$NX29wEE+T;!X|{HVj$rv3ofg$p+lR1#N%=G2z9hZeqGKQ0Zf+tOOUrsQ6}TuN7XF z8gJXM9f@*xsxGmvamtOo6&AsYw)lbQR&$7sW4Om@D$41FkgoB)aHPXcV!)LIW{ZYX zn{zR^SGpcy^K$+k=F67*IIkn!6pcR)r27?j7%b}!T!N2e=;9B~b~SfyVc|gZ6E2sb zX@#$u-ja*vnu0FBNW4w1R%X)dO?#?p+W^<|Jh03RH<8 z{Cd)m#y}Kd4**dir;_>27YVv*pI(Bhh>d!b6XTVb!OOP#0Vsx+Y0QQ_j3tTzVGT>> zwpG9GEuq8`EbPLaca>MUAeUChc>g62vav%K31L8nUe2Pz5dPk8Nk6R(2TFY~h zx-u@0!MXm(^pbu`XpQ`gIW;-VO-i~f7A`psi2V>F(zc1FJMnnY=_R~3>hNA>f{i0cLNDpQ-Q%hNZs=R>fw`y&e6G?7u zmNvDB<-%SdS3!_OC=~z+H9)h$1A zRall?1z&w!{dm8R%v@};DuJCTzl*>ERS>xD)7Zt;-*kYsnYu^csv|Uer0@geBCx9k89AtBYYAfbGXDHlSR1fkWvS>q(?mO%Ktq$R}cZ$uOr@{b|SQVys2eMQx8 z6XacDRMKT&$9(H?Hj0ErfcV=$OW4uWz|`U+3*>la^H3ts(|mj6qLpw+R}SE)s;!K5 zh>bF<1k;G@?-JxiUhD@ozxOn01UF8**GPgE<9Fv!fx)i~KYriVwZ5qGNRO9`sE6@X zT(ccR=hzWl{ytgmeByF(sHSz9)j+t%9NVS>{V$P$r)F@*XHNav@J|H<T$Q3 zEu-5n`)<@UDAYbR1=QfhYB99(vcRt27hEEK*c-FLY~%-GBbK(;nKYj5oHJ?kqIdol z`#C(Pyn&>hN}FY6!*=0#0d_@U(WXZQ%9up}F}f#zY}XWOmD6#)i5Ua7k&mPs8NoTj-z@ zp0$kc`|v)Em4y9*PKpdV17IEIB+ug|z`|c9-2ilN=id|HcDwxHGSVZ!g+UJ%njsCc z!rn9e#ErrhpA`i~N#6IU(GeV@F86r~fB(o~3|9V`gR3ZNx83V(?di%UO4B5QOXx=+ zDE`zA^jewDw{%GRprD+cUKZ(BH6M$++a7gXnUQ0rvgo6y*YVm@i;v3#9pA_LCQ=al z%M-uHPBIgkkb8w zFwyj0R%G=AWr1Q(eE_Ab{++%Yv$molCv<_X?p9#yuc%oiB+AI+T+sr z;~>;>`cU%772z;!=Ja3Uyt?SG%l9KWaRDBI_V08g4W0Up{i=pLG<$GVcU?ngGr44B zQ9Rm)b4MqvF|_=26#*cv2Zmr`{eyog;6@yn@Zb2HP`;n6k&yJM7OJCXm@n&DE(G4>fWve3;ABR{-oJDFuCz)rR0}0G1k7oD&*2zwyVtv@VyLFKQ{r6w z*}ht#xDL}5?Pj(W4s|!`;5K&Hba&Hb=KJHEaBr%t<6GWbg{m*S0O!I;gofMFsM0yv zLok5jLpJr(-?IL7I*(a6$_fBx0eUTl3>x%mt7hALr%RsG%NFkkrp=D%zeQIUmBq$C z4ggLw6$L|~3;_SNjO{!aT|1wOfJ~j-w|}l8aQA3M$h(fx#%$vI#zgo=6ZtoYV5~z- zv&C`7A+*VB6RlCuKLI+8uR24V2HAiEo#56F0HAxYu_bLPa4AkMJjKzVI08Vvlel~2 zI;)3FbVszh%P4Jpd+WyzxRWOui{Am?XA~CbbfC1zF7XyttHCT*%Ym22%8)TWZev!~ z+rgFd{~1nv#+^@k7O;#k1S*K{UJ|{;(WNyl2}bKO<)7M8u;c?441k2fj#>ONb?E zE?|-0=zx-CF&;sGe^Y}@sUeBCNbu5*ozF#9o-caD(O>2cRzxYfVUh;4K4)^RLrSk>EJLGS8*W*mV*I!0On)C zrw2?X6uCStu^kiCfkT`~>}Ev%NzpeJ2H7LIr}($+LERC6g}vWQ9NSaO9;zj{;er+7 zH$3=0j(k!u8j`%N*FH7%Glx7aA;+C>=ofPQ0V%*U2t_C_ctbDOW9uvNb8w1L?58^O z8&+_o*1bN)WOA_UdtH&@pKaHX-le3-`vca+0T81dA|9!&&1s%DAr}2%Cw+?$F~(ajq=01 zr7S|J03V6mhbAcGXC6e) zCTIqiq+c@7ax|r>aak5T`vIB)G)che$UJupqsp(oS9ylxFqF62J3#`3r{30@I-%QO zeXB|7%d@xvU+5++?`Slm#q>8T;?N)(&Knv1w#q|6X(LrCJ`1HRfXP>0Esk>?CPeAs zbTm3h&D#AOt}`=2NdmHu{)Y-tgUzBRLqF4UvUn{&0Y$myn$FN=$Ngwidtp&Wa3vm0Hwo{u3;yh->D7n%Q1 zBB}75UB`#s(k{H{VXRBh2r>Rcq=b*!E==NpL=G#T_=^d{bUA75z@!|?HIVDGw64xv zerte(L$3SIonV-}Ht+1CrT?>%kST#w$+}C=0ueIFU`7c=^1&2S>pS!iiye%*MP9C* z!a)h>F}Z27!9qco66Sk}QQ-L$8WXCWwF(a^c3hLrD$BL|0ZOS|r!7DViR2;Va3@Cf z2g+f_9ICc?IG4pI|Lux))s+@sw`9ZoNnz1O#qem2HOKTdMifzhw{b{co71f3h>u;Z zvk=k+;n{l)VH-ag<9sG!J1|BY?InF5(_E2?qdtGNMldewir^O>)5G&v1erhNq5U@8 zV#M+v_MV<+k_AD!)sQxS{Xb}>B5$d zHqbfv@^VC0ltSd|7OmgJ8q_m;Er@IKjbtpVt~Wt4sZOq{Ab zBqT*p?AU{Gci?A}!l=wpd`-)qeO7>xeRM1vZC2+FC_1Yk-v0ShMkV&24WxXaG)>t~ zpOb*h=Ag)A(|9Nd<>Ou8PZ19EX8MaP+LdBf`}HLRssJ3+&{<50S8|M^7^RJBn!h`X z&sCbB8BUn1c-A{eUsCe=N(w5V(PHln{C_-sI8-#8`9ms^#jf=YhaN+S>1m#{^@%{GO*CWHhA$5L#sr|Al>}HI31orvLWE@mU4>PJ~o5Y?vO9rtiiGN ziE8sp*RBK9$(eGQcgw*}20_lu{~(xc^Ca+D`%@6o5`UcD!a*k6gcc&mGJhS!K6G;C z6UKalH-_&iLC-nmn|;vuUYu(dw(^U*S?%=@zlZylzZt=vck-g|X z9KjOZ)A$NSZxkR3EQi&t@;Ckh_dFsiqdF>n`Ce-WDVb>!;6KZ}Y}-!>$)o`*vjsQ& zVg}SD98zUXVAEhwWi}PJ5#tL5BZd0SI#xOOiB^KQZ-hFl zYN`nQJMka=a~JW28Ox$(|J%)cCA)fRcMZ=F;YJsc?o)~ell#ih9cumzjhC=!+snn-pdE1yy!YG(O#7!cajIxH7;)TSKu-M>fxdne z2m7IN7BWV}!j{Y0tehCH-e3A%vfDX3ThC_my2^9Bfw@Z4OoZ`Y$8MFj+Mrf*u(Hty zKs}T^=gVz81@f0Ky>DOm?#gl_lzXdvardsHgO!)NWX zV7pz12xAJxJS-mgM==Ue4r^STm0ZiP%_zH{B>4yk{jrGWRi+@Lne-M=DHF)=)u zL7LHm=A2*Rzc|Ovj&lm05uez^Gr`?U1SqEoxGXhV#gX3`7@glQz!m$v1UY`G0!FhgpUapcs?m6`$X>K^% zVB%QZsjY!n=|5n!my?K1OzH6lbA-Y@>|WNcycPaV+t8wF9Hkhr+Tc1CM8k?z9}iyX z5A5~lLCqcf?Do`n-wdB6jA(%{-OPCM=@m{C7qBi7%8cZ9}@#s4p!IwJk+#P=;dlr@EXe^*A?wTyJL_PY72cKdN@Z-Kqx)eR zBNF5TH-`J3Xc>*;@g=PkB}u6sSG=KQ9{q0L9IQQC!pnVshGL z?<7etfCOo7Hi|oRcG9DGB)I{vpSY;Gi4QleCJ)x1alQd*Kf+G-2Bhs}KtSd4x#Ezn zJgRsVTj@nkCuJbr&hS1?`2rb3BB~I^v;90hu@fG=!cNWfk1~sq##6tGMI{}G30>vfYbaLKUgWDp|Q4M9*8*`xn`6kKFF_Go2I%gQV9y3K*e9vJXf>-x&JRVk049FlDctK~8 z{rcX(O)?qn!`O0v{yPGNnSbxP^JgQgAB~Gsl-aUpYXse+!Omb1HXiq$!?ooyuE#FV z15n{UO+u!3FY3Q!NLnlk3d+T(W0<;&@ma5<$xqR?5`Aw~qX+}H|HL|Iba|DH&W&VE z73RRFnaoGC<1{@V=xVG03I{$azA*#Q+?<0SRtW|Lli{*3-(bi#eDKO`ieAA`AS(nM z2t268p1cc2oStyVoGvZ+BZk}uQ!!wQ^=f?R+c1!1^YmNefWEA<6v#{~W>1_g>^T=6 zvWz7D!SUcNS#m$~0@Sq;fhHkW7Y5e9W_J~G0pr9*pCPz@k2Jva2dOD{Yw!l@0$tBs zzV92=DxT|x{?;P{ksiXicaXse&`Uc;G~jmk~5AQelRs!z$%1X{+#}? zjw+{i<%QljwRLDcm{hc2)XjSm0C!@?VBeoMj&XFLsZ0W)#zTvS6YF*fU3|hUH6GpBqbhOB47!gb<=A>0+P~aU$yHj1a7kE=py*$iGsIFVfePv zhuB45z97!aH^`*9OE~mstFSmu@7>Bo9Uj9&&wQ$omhJO2B3vm4=UjErs{x+!D!+Io9lJ>HFM$kxe&S|Qi} zFv+sbDpXdBm)_iq+6WLF3l1A4=QCt}FQ`!=&^%L*<9qEmJKh;oql0IxJ$M&Q!D&EH zIgBhI^Uv1DC^<{j-EAiLlTQnJVHqj6uF+zX02ow2g;d1Vzlg z#f~v|_Yc-Q*nbd?jni_th$pY0Owk-awQ{f{i@2#5Kjg!zTB24jXC{x|#gH)fuA(!7 z$`_~!%d2}@(ahAH!cUMUF4wcw)!O1ip4eK>Kkq4~5iQ8Y-h`04DV=a$FgE7WCDxP_ z%L8)@KJZx%m4e<(5pq#k3sC7K80#=myIy2aTuvS9{R*o?*IP@|Y0$&**cmxd}|9l#`4A-NCf&ebLZCbD#=9nN|W|*Aw zZAjzk@)m;6gr-U>xu!yDRZV6S*;vV&4ALcojDR(mm9dPfvsG)@7p35uaF4nVS)0On z4Jx!h6n}q&t!`gbDC_QPrs&@W{4B%7XsR}mnF>5xvF;K$-wY>_H==1ai>h|C3mZJ# z2Ftl{u|-ySTy)u!d5domGeTUo>nQRMmI{lhs!-Frf!w`b7>o`2tUIBAS$fJ7s zA{580bMz0r@?a!;yhR1!?iA!rDV9k2TIH!|L@exp>}_s3zNx&C&}`hV>a&I;p_A)I zR@;|rRot+Qu3OKl-gbk6NL&iXb zgDwvp_-otyuZEo=1RC&5tTwHj`ICY3@GTR6(sCSIz7GJkR8o^_6v#u|X5ZkaZHCI5Xt%H>Z)O0pFj=O+Tk(yN#JT znZSx!=n`=JlR1m#UgFe#{KTlW!Kz9r-|tU6LP-tG-Rd&A&VC-TSJe!-6BZ%>@>?d> zrhV|fo!!aLLFcOCh{IrU!^ys!M*=WrC&=vYtv&@*9C@REq;qRr0D#id3-Zc;fZYa; zV*Vk6=iPWFT);;R*ywfbm!Sd!B}4(m>P*n>@+TXUY{g_Pd~v0Iz|^{*$fONC{NVap zJ&QOHC%7xI6t&I{Au(g2KN9|!_^$8o{=Jx^d$hdX>`jzP;4-mURs+a^@lu)7KmNCLBV6^FWL= zdc?1?+1DL$kBJntw?r=mo>vsmgp@fGgH`ZHNb8+8l0H-E1dO&6dp`VPw)U;X&CtjF1+<$r^dV(?oCVEREZv3Vxvn#wf zFqkctjr`uvn0cE8%t5v*KIJz;+Yn~%RNXt6>jdgs-w5k5Dwja?G_}h+Dl;_XFKRYN z0gbo|zJ03U0svA3K;FW^$0;5s5!^dQ`gpCa^auoC{=^;MHCh&MC@5Vg8ExNxyP5E| zLjM0gXBJGpiwM*L;5AM1#TLXM!QIL^!|rNe(4c{`q9dTB39$qLTML|s zq?GR7UsZTPh;WG`$6+mY@jfA!jlX6)1rz+iuuP`PV(nOM5SR$lmWH(jvOY&U;GlDu z1{lEpGJq1_2@qD>Y7v_Unf$%*HN{jx$itj%zmeeN8!fETvy+#j_QLY9&_oQv$Vl9v z#|s*1ALjjuv`r5_@Rxoshik+)duc`U=p}P)F8X2KQRirHU^KZ=9bIM{|7oPDH=lp& z%gxKoq*&W&7(S9jlQI1Gt5=?wT=lMG6ydPFTHXSgow* zR`2BuaC!Z&Nx6wsb%1sKXCuC`T*!cx`A}P$3S7!6K5d}F^DAIukW4uqi(}mI*7H2OLCg3a}vol ze}jlF1eGP`1BMR7I+AXDMU&L#0H22G-^BhJs5vhgJ7IYkmck<)6YlUE&lk7-wEI&g zBhRgIOo(}6en-#ImZ;!=TnaUu>F_SJWy?|{fO%vzmf_maQXPTPSUme}Uw<4LFXlsA z%qpG+qC7R^!KiQq`Evz=TKSW=7o(f9k=32|nG4oS>Vqgrl!@uK_7TCEfxY&&0-=oR zxxf_`1O|8Ru{c&mu-wco&GuQUTl&}fCmJ{{r_Ss&I{Nn$ z1%A)y>iNi63i%=TarWO2mx|UnkqzB&hZNywtG>&8^+e8w(*6rWeP)Kdnh;3LF)})> z3n?N9C4wYrRBe)e3Q`2FV?0?bT^BtX?;J=3zP#Jc4exROge|wjD$N?93GOPnq@5$}=@KnF_5l)blMwcq6c}d0mggjRKZ8g^Q z36Wpv((g+^4>FB}W8F!5NSpGj7-LJ?LUL$=Ox{7HzwYryM0=Byf|^MbvWcDuh#icr zm_K4St4zWgll~mFaKkT*IUcB80d!3sRG!e|mXQ?P?VW*05XC6{h_zc;ic)xGT?DWP zurkxQEUhdeIT#*GdixG8hqQs_y8SAf9$w=32KW9)2zA%NQx}7|4s>LYtCT90EX!3# z2g={_&Os%7IBOQ7`{fxn836=s{7(WzM#`|2T6Mr%!QwHCeyHf(u?qd8u4*tu`I3k6 zY>0!BqPz4Y0A1MME)IPlAH~<1?VogTD)Ywzpv9IYWUTQHaW?}&GIOrd<*+K!>4Abe z%>vS67FwMg_}p3R*36t#6Iuy?{2|QCg(15Eh-K;U89t~;{F^ijeCr~_QB=f0Ije=VXW&l>EEGVKTg2!AP8~Nu~bU_8PIN)SK zFw|WAc;|Q7z}sq2n)vT5t05)UBTLQVm`%t2+`?;8nrQ0aUY1KzVTn|w!F)Z1etB$snoNs*N-7%UEzl3Q5te7{1QMmR!XM|o@=)p+KgnZlESBb70HNH zojoibXK*CW@p+}6z?QVVOxMT=0RT0BV~H#wA-9*_4}VMJ1KEN=LdO@qq2Lsn8pODgQY*_3^wN@EyB@-BWDWE-)0xc#|?EgfzG3Mg!;zpw}@1(G1IKc3TK}FY1 z>$$z_(jYXDpj=ydSwmS+NO0(f#4}?)m*B%nmpo|LdskKAXXS&pkL$? zydzr8Eo4}Bj!f8_(G1zhD)Rake^-Q&5Qzw2h~6nPg4C%?0`#F$Kv>gbwMpMAJYCdw zq~A(*ucP+{Th`06(g)9YX*7LC1`M)* zygsCXCovM3qW!g=%iTld7TIW zUYZHW1T;&HD>g97h1tX{6=L0D6j)KYMABiwD>MbHm}hmK!e&|7gbyW1_c!1vKb;84 V(SOu$_y7O^0000000000001OtU)cZv literal 0 HcmV?d00001 diff --git a/images/airgapped/airgapped-cluster.webp b/images/airgapped/airgapped-cluster.webp new file mode 100644 index 0000000000000000000000000000000000000000..b308bc3a6ad45803d0390b70fd9f19b3541c20cb GIT binary patch literal 66718 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

QAbNa}QmY;fSL&IX_y_rN6?~;Mkm^qto{RXK>Fv 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 IV!Z literal 0 HcmV?d00001 diff --git a/images/airgapped/plane-architecture.webp b/images/airgapped/plane-architecture.webp new file mode 100644 index 0000000000000000000000000000000000000000..c54526e5a280a2ddb0591fe652702c68c1024275 GIT binary patch literal 32086 zcmeFYb8x2H)-M{{?sRP1wr#Uxvt!#y$F|k6osO-JZQFTodab?J-sd~FF8)7nRjN`+ zYCiKBbBv#6MM+XjOwJn!NL^G&K}~@}0|p2P29~0D>^d0TM$4W`!@qaA1N+aDqsDL5RJtLR)gg zMj%+Tix>yO!xV)`AxKgb!dQK=*W|TM#6&ADB1D+DdN#7ykG4wr>=U@uPPRXg_{1#ejtn*{eT ztXlaC>^^GE*YQ*i9V7$8i*_~ON~Wr_;&^YfUXwrWwJ zEo@&eCK=kiy^kf@pP9D0^PUZRL05fSU%gIjPqH{2b&ogCp6#9KKj^P~Q}nrg*L-&$ zjNj$o%sy%^0l@gb`O7{UUT$6nKOOLupf{3ge`AT~7{l>0QKm6nVL;a)VX)05H!nY6r z`da_tIjbMzJL?0-JHKz#EprLV#l0_eXly_27@ z_m;E+@&Mqkz3)TY-POLQ{2hR>_xe|$56yS#_wFbD5xX4zZNT_-!W-s`{2O4;7t^N) zkOWWx#D9>#bx#3W-+w(Uy@)^Szxf`1fbgdRv;lb^`0wOhC4g=_{Fcv3 zoOm(#OatBliC-SZgVexlhG9zEO@*jImiE9^bn6Mx{jF|5%ITKlB6=F1fmJcBheZvv z-u%iVo4yg%()tLfimoytYhZK}Q01SeK~=))$Du2_{?CQvZM7&!Qt=*%Gwi&{lvenw zj?GtK|F>mD*xoTs@7%|`a_oLlu&Ll#=yVjacv2y zFVEUP{aVu}_L}wF7i@Vw|&I_Q(NG) zfKrIQo-IC1sHR>4ow+f!&*FhqqU>O};Dj$($E{c=NM4ARms*|!G-DSte%{O3h(+X| zQ{{{u5S`(HUN*Y|^u|2;b9o=y1$wu%y#ZYE}LYW|85D4^*Typ)!5;vj^_1F1>w!ShM}*xi(~mMw*NT{^RZo9$?ge-@;ICN|f-*7kVU;Y4Xj8O9qRHgAzhX?lTVn zz*KVQHTU7%pn3;JEDExVbKSfPLaRfm;Vk~snO__aXq)i6nzrprjrk#wC^*tSTM)x8 zuAZ^6O#VCEyNX^Gt6%Ey=ikF_X10^a?*!(&Z^ibPcJi1mO6$bsrFS6`evt{MO&(nd z-fNi-m~>+e99GgrqJ*3Qzn?APCILhl{8xM5O-_HD)5iJVV3U6KwFZ7QCCf}Z1b*Oa ze|j&unQedMx(<&wy5*+iElq>UQm1d#MP)CHN^t4vw^{{R3b!zZ|E#6j(bS^gytS^Y zwmInQ=A=RN)WIn-cYI6!9WSkY<_i=rmcJvs07#+=} zf9I_L(vx7asXWK;j5^+{75`EW3!u+=RySJ}i3AyWwI|4dt^$W^mgkS&%$axi3Q;b< zQ0?&hS7>E*rV_(zHLU}LkD_Rsk?7)dhu9P0@(i==SJ)w`r+@ZA5gFy{hB+kZ^|WzZ zfJa&JNYW!1K*)-Wb_%XIva|r^^^OTnt>{xNSUsSN#22 z5BTef{8eY`Iau?4Wc9*7_!fK@j>mA1^A+B;Jvc{>x?nwB$+j+eJz zFY9Rsffrq}S%hzCJe{Tlo&HV020h7J}aYPyw^M{ScF>> zaYnq5rv60C3#Fc}oaR4x$q)zzoDbppVbBwaF9)dQu5U8FaP#^g4@VIhUQ|LNO}BgI z{1Bj=5aMUy7g1>v>dh?0a6fXCqEFnTX^F#VEs`_>u*bkK4M5Qbl_%GOA zTmde7hllAI_dN@&B{HJ($B2%?WMdKi(SM{~DFG^ka2~d+m!jAURM#S;3A#4c;t712 z^HH8;$m)r)lV=apRd|b(dLM)j#MOZQdsg> zYoKZa@ib`oZxA%TsdnW3kyEW7M7kWpPbKj@>@R*s{-aiN~z*0Jnh5(9>)BzPIbtPU*5*DT!2ES~5@yn|Rp%1fR+<3Wk7=dZpN=j?%G-r?C<(L2Wo z6&IlDPuwPr!bNA7wk0wAW+ik_$ulpwfb z&Sx>BjZ{qAA?WPfqSeR&YP%o%5u;>t)$N4P_YZ@koC2lmBYIr*PU^#-PB}4%6p9~P zAAhHJ$qsEWf}`^CkvC5JI3aWRs=8-*J6lNo@(coO3k9CkhcZYCLzs~s#gJVnjiNR- z*X4|@1qChqOF?`Om1?^5(7*6(oe!AEKhnU!5oou;0$SByafn)#4DR1jfNRJ_<$64K zNB%1Ci{ZUIyuSde2*^ld-Y^bVHq3m6H!exoDkyKCZ{LW4er)veirZ{py(p8Rp;{S3 z&@X;nw02$Ag%)DN0&{FLuUX(DNnA@rzq$0|ER3AWduyUOQHy^>Ni@@_n2NAeH5uK> zytSY6d!T}+K3j{RqjYwV>K&EfJnMS+i>hLCLZckK>uwfDu_unXNFVGq9c^jQV~LK$v_y+e*8EIJDY4eV6z+TN|=X(VpE z(u0@2lmKDM@z`XHg$djl`Y=QO5WhW0=ibx896qt&+EITGY5S-_=&gvUgb|?+HFU?p zB2J?rFr&=bd?S`Z8Nh$^7azM10#c|)9UCj?z$&7t;NeRb1n3&lZruAXbwlNM64Ayi zTd@xqnyV`9UAKYPO=wQ6h{ARkcu>6xWAdV(0skmFadaC6hA@p^;8Zg)Z^-Mq|ye&$m>BWQ4%G;?rx@K znN#S~f8=8w%NV8VRP){$qTBbn?FAD`A6~*>3K4Pvx^eF*#9Vh5v*y#7j1k?SRL*au z_h-0*e%uuK$Dk^l5;TbShlf$nB&5odUx>7g^?`G?dk{gP)12_mp(I`M)r~mFiGxfg z!w=rFZ)T|fnfGZPZx{AAG(c-zj`vPF`a}$W7d|=YoDbVx^Kgx|zI+F^l&5&%(9XdR zaR0L4oJi;jpY2KE7t-F?4F~xKsdFBknYsDlgHDbt@hGzz3v13xuFE@0PB?DsC*y{P)Vmq2r&)D2ArlIwO9<`aLBNVXw&dyLgZgK=33)&hS_k9?c}U?VdGyh%r_<#$=h`}|^6 zY5xIo`6aMs1cfjVX}K!%i~+)U{Ao}W<2W2zsBap2UGqHv<%l){HdOQ9WV5uRL+BYN zIKL6yNuJMWyyseG_UJWCfsKtgN#j+k3J&#w{Fh=Xj?8UdVl zxR~J@Yz)EbUvG*aXd7Ia*(wEQBY}s5hm>N9^;TAc>#LC z&<+OCVVnl%s(~ZoeW>Y8V*ZbX!CUSJbps+>-mJP%YFgY$JJn~F1E>9^?(kLXXSks?|I&0#P$9Iy2HYg6MStd#K zX(x%OP-UavlxprD=Y?$$^+_%`%DjJwYaN-4*-^v=6V@PRTDuBE{r5AL;vn;M-aCx5 z-{S6i5fWTMB6*;6GqpX-%oARcH|0$+CN~W#Ym5Z}VnC`!*2o;L{(_Xd- zEFi&>Ert@{yMKG{gn9DLrZ>A#K{n}n!-)G)jr`KYM^*yeId zgel>RnLk?%d*SfxurnV9h8^ z2oW&11&(Bri?*Jxc3QU;zl8W!?Pj(ANt?X&A?WfKIec2Zj~|##yyQu?VBF%8$XX}m z-h`-)VdN{q*jm20{vOUVPqBXDW!i9BpU$qT;R|y5o1b#NsO6trq8sT;H}8RV-l@syqs6ZC(-tj6G_^gyCWNZSV$^#(csd9l)Q2*B1H}C43(xR1$ z!^hdSCB*Kh;`B%0a=m$hZsz&?rSkKe87!6iXv<@HZoh`=jsMSQdH}UmHrU#w7waHD zsSoW)ou@%&yLLHX`6>G2r)xDC#*U_ciF02)a{hzIH2x?1z%-7N2Lm7NK*de>B^xAG zHtX8Tm(d{dq=pm9zluJ+^uH=t9(k}=#4BStwN66A!s1dh49EOiO&0}3UHCARi!~Td74%I@vnE?E<_O~ zr%d)#Oic%{A{wE*L>>4WIO7D}1Qa`yfBBphWR-$!4ft}uKMSKgW1l8RDLE)#JDXtk z=9^5A!G7(!4+1F%o*`=d6E;aIc^mI8b8$3TbgGFe;e?4Ah}AxP!xQOgwi^a(^Ln;| z+`@Y!`}T?Ce>VRok}3O0Mf#jxc`T;CK~(9b4Dk~zfJ%6wDo+2F9(6rbUJT^0H^849 zYrP%(SI{Moo#>>2(KP+-51#x-7okmQJul*o2Tt9)A2Vn`c8lbMVoYLDPW>H`$=~&S zn(-C4-sJxdzrd_MrPz5UL%FZ>^UWe+5AT!ApHBa*J~|Nm0~|Eh+63RB>9&rXV*l1Q@F zJDTc@8RvGkvZ?GHXG*g?y-p!WK@sLT4@?5`s6?#!y$octfJ6V@KF)U<-oGjn8@=h# z2doP8uQ~cFIb6BTZ{>gpoiWsK&>tTRw`nlCF5F^udA_e{q9XmET{%kc0G6=wb15N5 zDq^soD|*0A1sP*1ZakEK13EEMWL ziP_&dmsLbn=$EX#Y=%Q_5o*zb}UL$ zO|8=U!|$PxV0YKp)bR?id8|c*#US8snrXqj6FU<|^J!QYaQ{z_3n)}cpl8NBcZHJD zDJ@0ogj%6Yz=Oml)5OPYRsWX2OM?QhcV4#^f-+I~sFVZZbT{7MkY+$pM)t`ve^TH7 zyW?Hep7A$;b$rI3U{s^E?}8PPMXuYb2BwHY`pF9FlFtsOZKmR=K5p&dU&%#FkQcII z;4(=dGOe|N$zlxqfm*2}5;TYIF*Fj|5Tg^A&XY7ni>CYx8+?xSxBMhS`tcb7(^P+v z{g2~}k5gdh#n}A;0rm4u#Dz$}P;aT&vZC~(%(qo79;Fqmwe2O4;aZ>nwlB&v3j(Z# z?3q{8H|24I93Q#tHvKNfcR<(G8u!8uQ8iPQ*Il{3!=`60!9?(3;eJ`1<{O_)e#64{ zjj$59XaAGJenWFc7kZFAI{0HTjS_JoNP?jgbY-;}9--R8tHZ8p4SPhjbaO1iGWUO_@_z%G z_x}O_>uB^{rN~Z%&Sk+x5a_lNttd5y{|V{+Y2fC8azEA9pDk!v{{B=ne^>3_!M&O{ z>-gcOp8{Opgvbx_S1~PXs+E4N&FLJzzn>j1VR^1~xIpFL13=n5q-6hN)RPZDvc1ZR) zq^A@I|F_GH9GcRegx$j6!!)2v|9}b-dY)lOFF15fLiYm!?td;0Ks5eVIRDmg|DN4{ z?C(G6;{W!5|M%OI0U)4{501}^=zo16Yl2F`;ll^r$rRM6x;tN9J+D>RWZg$Gh|+(Ms=5SAE<`Kq)BCjKISON?}DU6Z0vdBs1Gt z4w^&N8@+~&)BIL(H$K>Rz~~~V9L12O6^+?s>IoVm66t%JdW3X}kPVtR-ADLuYb~yN z*Y{qM+3(ZP43K!vh%0hC@61r`8W}O8LrL9$l!79)1!D?cAS?rxq1CB{G&kccB-{mM z2)1zRJ*)5@PIYBLW6EIt3A=%8>0|KpZUe?6k9ZN?{2Ni}P`PAMu1c@u$<)xGr!|g zbCrI&rZEr4K}`9i1v0!os!c(Vux3Mg;rRvgGEo>Kilz@5gp`GlAl&4#;TA3rG|+2; zQu;cpE2I#4so{$gxx!>r(*^azk`#?Q>-{34irT|j9Hras?OU*Uy|vUtFN(wd#?1<+ z4oT~K*VMV#>3)Xiyr$q@P+=rR6)e3szXx+we%rL3oH7}LH93H@t-U{$)6$T0?^nBB zcwP?#btWIz6q!Qk?8)+5)}Dz4y`Lpe>ZGC9)JcnA6U+aXu)wo%!aic?cTWGCA<|KN zgbQ|9Rl7212$T3=LSFNzBr`VtO?0p4qSTgft|Q1XoD9-**w%iRy6_Ca?&)aqQcW8C zuI82GB9#2DTo4h@bSJL)LcgA&$wHNj$hv;L5G5~U>B_5qPukzrwaK>g9CK)CcF}pX z&!|C8iGO)|45noX$vfypGHV?x3fMl$r;GE46jZl zkj&5@_qj=k*$$qO`r96`uwB1uwVY@_7y=?mQeS&j5_$<`Z@D>MKi-rUDg)`S3_i|q z$bQ8n%CNx8o76}cb^Ddl3LbBvX?-t7)R(vKEasJu`AGeOvk9o2b6S$!f+w1#lB_ain)4BE?W%r2Xo`$?KUe&KfWR0=u8?2v?{31kw)6)D@ztx?~=qGK{|4o5Hw zX$sv^5_}s8Kq;dAz)xO^j|j)Cj(b*WYnnsVn2rC~6SeItfic_0&+ar<1jKqn*6>It z#{+}$!jcH2M}W?_6$UPRijK7KV;a)jbdYHl!=RLC#*moY7|$*Jl7eR(@|&}2v5CDe zNSR#1k-)5E=X(WtIW3L_2Ox86^*{ZD`beN;Aj=T+pCjOjZaOT$FqcK55E}`jnbA8e zYR(AId_Wu6RKi>+urc_`bD}^%U|tf*1`Keur#7+Cl|Q0Oi7p4q?G7Wmc6oBW zx1a7SuUX5#1Qvw3)jt&_qwHV6WY=g4)M_M_1;;n;Fo+&kIX+jI39)AApWTA+uj7p( z7~Vi<3H|nNuHc#4sX*$?wNYmx?z;lg=1uNx`qc{MRQS$K{&8%OwY&~7;xBva%4!`4 zWVRs`eqJH~1jL)*FDTe*9>tpD^E=FkexaNM-P9cO=4)c^4+x;qOezKYt3asn&TVWx zxXTbq?LwyDu1pM;igN_3Vg#A6tmIzirk0bel43Rm$!_hA12}`42uaBcND;E0B*}}Q z0RZyWcoD+a01*4S*zV{_&8`WjE-E6EMsyiUQ_L88_-?r`gIF!bY(-ZHVKLG8m4}aP z>l`+LtJqIfJg|?2=ng$q2UpAc5?=FPBm2Yjn!JeJAMnLZ>bqwXF5Z4}`#)7F+A(bQ z+b9`f%U-2w_-FMW`7xG%mt`+qbQNVWltP!J-|w)@bj|+2M9*@l6f<%A$RlXuH|@ip zjeXxS+onBXB5f}ZDNFqrZFRR|2!vsud~`+95KYz(D`2Hr6D#tKIGT*NVv^_GO6)w; z8ZgvP)M8>1nYpmZ`$0H%8IR*4;~u?&?%z@pGQmL`dSWgm$=}$l)2fndlw->9(52pl z(^$q6#XjO)$Go03Mk?HQv1et{r4wU0ks1-RFkm}#Hd&J55A|9>ub(_l81J{S+PS3JI==BWt%R;0;z zb#^K4xeQW~L|h^Eh20nnzFn-ZI_V~*SPNGOwoeN|L>V!vm_I|OO!o*12}>uV%Agr>T_r-kQGk>j@FfM#(HTUvM%U88vWG$H01czxg& z6n^}$J)z{W(v~zK?QUY~p%0Y?XQ{zfLq~PF;9>LiDh1!1Bo}&(N5*Od+L8DM<;y*Q zKIBC#B9%_^rOWcxHHp!?hhoGRT|I-aToQ@uLFPIMkI-c8k`}h5sOKPCpyH7frxf{x zvTQ7@Fu1ZO9P7{qhb=XqEB_1T71Osp6Q6|={f46s6Wf+2C}^P=c`pimdq2z z=-gK2FTyB_-nSU4=Ng1Up5HR~xD#)08jXx5Qhq0cjXtm>!*W`_(@@5RfR6bxpUWj7 zwSx?2z0F^j@0a)!FU7`@?tAU|bX}7JO$wdWHnPw4RbdPHp2Eib>JYT6I+N!PEZ)&G zs_{5DB}v~XW08rRa^bQbO65lh=8vILgUXvB_-0=tgL|Lc2v;f55{-lSJE#iYkX=`A zU8w1m1H7S<OPi;YagRzs z?9{glHU6e)rx(L(LvH@vQc67|5-B8`UgzCNSqyoaxx2uq zmc2*UEc?nz2t_*x+z}F;aicOx1?~#cG2DAw&mx=?0ep~* zzz{+Z>u6!xa98NHn3;OKwU9gr!pRk!?put~s)tJj-&Z0dCB|dyc*Cr%l=#A0OMZ`z zKJmmBlX3|3sWDq6E;*>)hKni;I8}+JO1Tb+4?(9<3vq@tnL8EamA+MiA4XjItT@&Q z8tQ=>#c-(Q9~a_R{+1pE^4{_3_?bE!9dN?BoO*q;M`bd4>xC$dXCpq+xVf9kl|)-q z@Ii<8M7|9rdf~ve{n(H3l|>3xHg!+J>}cXA@%HS9aUJk^Sve&27u7YoN0D20PFBuu zRmd7o)xhjuEPM(M5I*a1_ z{wNx|?-tFP%>Dl2871fq6ZsOH9b-+9=|0mZ&H^+}!%-N%wedEW%=5JvlJ%h40!Bw( z!DTVSfqV-R73OU44wsjT2m)i@(tw)rf&jd?7Dx$$_lV5VMjXAenKo1-Y^kcuE8xsQ zCgYo7BZVlB90-tQ?hL0%$QEN-;h+uNjQ^Lg>DI9Q;>sxFmvlJjeYmkwbs+5 ziEzAE0P+;ectwal7z;?S?)UTxw-E*iN6s%K+>T8Iz!X^4tV<~kR?0EHSB!*vlmZc( zOY6&|AtRXOW=85T%L-WIvqnwfgqJDcnyEn13zlIDeim24#S0Rf^|M!a;91@E{-B^|B>v?U)uHAJhBT{n=Y~qqHiAWZIboY9{e> zK9oMFk6V7}rv9nKWRDdAKjlokWWS5K8zblWxyM;FfDf6JfBw*JbF__gL6fM-LyeMaU`+LtKdG?v-!@f;|x}9AwBjIc4P9ZK5uI9HnPV) zN+y|WR(zqSr{G>VgZmXa>_uMrhdi@Dq~kyXcJ!7Q!knl0b1r&i$b;;6#QUImoW93Y z&gN&VeF+BRy;7qr@=80sesY00H4;unB!&J`I%;?eU7~u1&bTTe>j|&~2#+id2aK~O z9poGE{EV#}5Ns_XIfshcn%y>=^rr}=Pxhvr$4k0)i;fk;q7PEJ@zB;U9%yWV-! zO_$zsohf+y#zXvWynOHG6uVyMp){eOKyTEnSs|8Y;hRTptMBw?9}irz*i1`I@v?2F z7N}J|VXEaTvn$WGYin4fO!-`t6pH*5myCc&-W35=ihsgV0g z6vw@KQ`x3-+}m56M*#U;^F9uB@&oMvzo5Ma`xzFmMBE4uVlO){kjM$c@z9d+XCmxz3JyzuvNr6D40H%FD`14mc<7T;Yv#ysMf^qSWEiF!Nm%Br_1He;r zqgo%YRwE*9Jk)>Tb`K=;ytYnHZkh+Td+1PGIbgJe+=n?q{;t&j_MC^XY85oea$)d% zx50^Vrv9*?oSOHMCp1$RCHV9+guL%Qk)V5;Vnd{=Za z%68crXj`{X51A}85m*W$;YzJ9KB94!0%Wb#$j)YLhOPZr$TB5_O zQ>_vOUtN8TiuVX{r|7VyZ44ESw}98P!`$Y=IrfDh2hy{iDlqVD;fu3hPf`@Uh^ zK$O3+H%(NMVp2c`KCiVaeWFx@FBBJqd|5iIh>ojcJgWL?TJr1OrqlYDK>{30Kswxc z%B+h_u~XVKIH+8GY@i&69xd5uhW5ioNwtJ_L>mI#e6@df;T%~D=8n6wdtg9V6Sp}K zc~ZxmUw0}(b3J=fGA&zmP3)Sg)qlSb1@&J-AmZd*{a75Y=3Vl?~ z7%=B2EF^dvC-=BAIDs@T^8*T@$o#T)r{#=uYl6QHAcPEFx^*D2=b2kdPCA@AdDJ!N zm|ui3pfr55)Nh@`4>!q3?0wgmnC`J%{fXV4FBbXh6y!~${n<;G`Q@4q&G=~rZw66$L zN@9sF9oiYUuXR)HoC{419*d>&?)zGqL*6oh!0i)^nlm_CFhl^pjh zLF)q}g0JV^KKKhKDZCM7E?m>`F5E2_Ha>01z5Pt|3C5&1Yq(wdkL%=NEe zlO(ka;sj|Y10Vm{8SngJVfJ2&Sl_&1A2duG@Qn z?lqBnbk*j4Hhh4MxIkw_Y?COM&1(-9EO3$Rs@F0~mU zvyx}erO`Q-*ToiD&*8|v&D8vjxE~;WOtInJYh+szOox6Aa>!R!afO;yGLKFDvN{@HzhaDxNHmvAK~hLt;fSSs=2|n( zD75g}C|DjK5V_oh`I2sbKv-u`n|rd=xYx3<0gdz)Y+)!zNFx$1syON-W+O5=ZkL^a zg~W0SY=hL}c!&k@Lqr+zcLRfPS0l`2(j!_X;ycQ(xZ5BcrcN(8+T+A#U4~wEVg=>z z&5@<^n;xraLSa3F_n=et;sBF@j}^&Fkz4Ux#F?8m26(L{JnGt@!2^GZm#c7ZPjCIM zHanUfns*0W=MF)7xLvEy4C3n6#bXg#;{m+9G5L343CAq&Fl3qJztHXiV!FG04dyg0XO z^MSxGoCtBFo9qNW2q%%8Dbq;~8KuwUNMy~lXO6G^(LgDy2o1_pDc{)#5rbV1LTjpg zbJY@t5#hBc{k{nV+pk$KWi*T+HZk%^rzncZd$z)1%z)Marvt|V2mI={NXzf7FZ*eG zV%=s2OQA)Uv=mm$y4(TKLBBZmyJfE_?O7?49@MXcXBUCCqY96xq$KGLp&CTE^_xw0 zGe8;a?lN7nhneSlNeo*vQ#u;P166@stjpBy6B%;K2Rzg%@IDei@qo83B}~8*1<;#? zF{f4D3ydepftXPXRq8WGO-+2uGUj+o`?Vgt7QgosX7U@SXsoL!FwM;sGj4Un^-Gr8 z)(Ku9+0Zc~#c^s%D)$fEmSC?Cf~!Ja+=^NHEnOW<=+%PIPBn4KH@8&72K-feNMJub zXp9haocr0v79)@s3F&shxRJ}BVP+6l=t*&?^D#OuFS}jdS`%dTgT@fv0$=8Yp3DQr zV8(2zA7iKlQ03A^&Zf0!d-BC%gX=>ge@zU)2sC*^N=8YTR`R~G@U9G{psOHWZ`?N1 zCVP7=I-OmjI9@S!5*E%U$D#dN?o_f#1K$;-U<#)O?9uR6;h0|9u@FTe)SaAOA(3c1 z&me7po)H19C))hNPOLtN8JM2}#gEMJMy!0?*nUK1~)oxXb*5O?LrkCd36AQQ9A zIVM4Tg0*Sv0W;UUIe6jM6PK@$z{sGP$oGk$#!oqH)ul zjQBuR+sM8acF9}Xm?A@xx1E72{;3h=j`;QWEIN{hgE95-nE|=EccWIT=g)dE`k-TErRgX*b?E3ZkF<*365z=q04OXy*kMM(aQ9~?SOT*`~+d|bzjmmaXn zHLUR*B^BB@Ue;mT_f-SrP15;0{=!pWFuV6ba@k(K{v9#o4=9I63E+^f#K<-%ioq~IIs$Z3C-%{sY(SBW?`OGge z8VLPXAl%pvayE4VBUi0ib$-n|djiCM;7pt0Bv`<41zY%sG^1bYU|ldLRl#OCqo zhG&P4(^hCXnU_b@lFhkntu$K@?Y1#NC$*@fizZ2tGg2f0iH1`wIV?T5VXvHE6NB7% zOW!~dVQP9|712)k1kt84j2YkYv#p=%@D+X^6JFgTIbPU#V1IpAs`2W`>N|V%3i`&++&q(kI#8>Q>hu(E z!rX@peALq_F&RR730>EVt;no$g|`~?w1&WqSh$v+6{&^Fo0oj0)4Aeqw-Zs}SQgbj zfRnPHg}XPN8J7AU~g`?_2gmy_2X4;ys!pu2A*xE@cyR?8uH& zD92gJ@g8FUnVw$ADyp<8HnxJQj1!?Fy9xGcsro9{Hfu(?(=@YSe#;*}$hOw;er)}n zMr>LF=i#k{|MF>hF923l&OvxxRTygW6V_TPO^7NFX>@$E&0XDwH<>mIRkF# zVD_vJOu#RzkxiijNZRJL3b0F*1e*OTh;SEn85f9klgTxw(vm{n8rsZU2o(?Z==J01 z;@JkFewN8)pW_LrXY$R+YZy~Kyn9r(H_>b*1~MfBSA8fuPW)$|O)}p!eRTtEUc?0q zsXxi_)`imc9xFlE7sKm^g6-a*TC?th5lx$8n3W~4a!y}a}Rl4p$67}!%VzpS?dVv7jlcE88- z3Bhr`0NKy4$XBc-QWh8pgpH<@o_2)crJtr9(C#wo2*; zsN^h7wmwFEEz)EH`Ic|n7SNlrGYmUS#WHY11mvc3o$! zxxHc7#(k+uw64vzkw;S$-u?bW$xQj%s}UKYyBE88-=w-@$TO?C#nS(Xq4B$L_k=Q1dE( zS&g#G2+eL76<_xCK~}A7tv^R1K->Z!H&XfZEbg-E6y0+8$5Zr~^WL<0BXq8GneU1_ zU^)?HBt8}XWK z9v^ya7BI#pH&{$$^U*aZ-xiOYCFR|l7sm4*&9gYKX7NUQ8})CxvrdM5K%IN$;b8EP zJ1m3<`puRDz)}xo;RapHF7g5T-TY~I>5Id8TZa-QY(MTvs}{O;DTZ7*$<;QOh_^H@ z(`-g2Y?^eRzMD-;2w~+hunV?Pa>ZKp+lP2--P%8YM1f@t6Q>d16>L(+e}7j&+3g>y zRuf)`zwKs}8H;*5wgfX7(Mg;hz2~zOn5?23(2Z_?Jqk zq147yOKu02U&r_OZuP|h__0>`FjVp7!Nd$d#^SNcSl>!(-^E7Zyd^ky)8*uwB(8k> zms=vhoTSkDxsv_Ku09E_K;cRh)3ZKi80n~C)Avv~T%nVxY!8^K1`_AJczBOsZgF`N zyftK~xOOWCTafSuiQVJogQGE4s8-NE$a{h{yT$Vb7XwW#aO$;t*Qf;puwN{)-M1q7 zg!QV5QliO<h@ehE( zbM%7=+vnR~q)E-u=dIcpzuiS`DXC0Ir!v`Ux)bCSRzG_U0yazaC1}9&Ih3zrjQI*n z8Aq>={l6k4*Nl&Z9vR0A;C&z3Ko@4jP_x88x(E@%Q?Dx+nmA|Tg3 zL^>v&GpE8N;g%_Vb@Cyx#86rB3+7p0}EJ-l^^Ts6uimf0lbYQBk_o_mlQ*pKE zNKVX19u?2F*J?7-$32?Q=Q9nJM6xq_G*}c+htwY?zjo5!OfsF4oy%<=J{^OvU*;Kx z#>kHNk_#Iq=CDFv1?4-S0H;gBp;sV5K(Zju?S(Eq4B(-7T5vMcAuo`6o#2J$>=j&Y zQ?^4sdAO}>fDDZ&dPKlw8>xvmoJ6#a@H5mp6&CcOXxSH6?}|3-VR>xL#4_iLtRBf7 zNC#nut_*|IF_6dXX5jbB7&}+N+ya97^|d-nO++GsF_SIjrEA}moo-lS&9W1isC!-XRB#b8~kca+U>cw7)u(wb#Ra6G;t3IcCQ$Ec74@`Wjo zle!;{@q!B-D}@5{@)5px=m_sVezcfp6WUwYJlVICtEaSD0bl}3C2zrRGeF-8G357^ zw|)V!zCjpwt5Yev7N$a)QdHDX&daS)Zl&kPK?tFlSHhsn9_oP~t}w+`Ll3t9OfV=f zoe9z|b;`H2d)q@Z`AC4jQiIk+v;q&OEhv3yS( zoun3!3tR+Frm#gV(X^u;5_7u+)C?;wSN8`tVT=LU2QSSzaP`EP>L_WnfaliwMe|Fr zsazNuA>GDwVc|1yt*i@gHG4qbJ)yLuvvRXUR1DO<3EcH&lO~mgtzJEkKTv zYn_^{An^SnFdGdbwn}7Mm4-CsSB5J0Vrk8oZ>(HNW=azq+Q?qJdUYewUHl6)xZ6C- zIG`TnC}Nf~02F(-8&+dVm|--4DMm0m&Ni`3P8g>`K%bf-7(jh1=3e zc(HWM+zY!pOw18vU~ebsG(e(ev~PMJ-m#Gf6>)yO^E5BnYp`x(5UQ?~_K}%X)K8qK zuaOikKv&Gf?6`hu3y&vl5sNJ5TDO<*_`tf;315<1uqvzOGd z_ORnz9AaGRu$a|NIam1`0r`8{wpNtN{}typ7|DlBm|-ua(B>049p;lTdtUxQ>jU}B zA?DP3hvkU+Tgnk*f|AE;{K?eKt`rijB9s6TYcfDCO*ifSG=E9*K9w)wt_feuysOae zo<`E(u5_pCH33$b0T0ch%6R_h560sDRUEOws1Dr?_{||FYkZw28t!R>5B}hgN5Ou- z8~?j`B5?phzPYDdHH9Il#h3twk0Cq$~=av4uZP6c|H&ucsD4L5yTpq1rIw#i@%Z=zXbG?#YL#VL}g_I)M!C9hA zZ~X}x1Zd3o4et{m-&?s7)%pviCsjjNSj)VumaW^LU`+~!Mpea-utF5f<` zAX%k`_6j)~pWrbmt}z!O))2%zl~f+8uSDo@soLXej)H0&zN}XeGP$x_ia16DrLuNJ z$drE~9<=CA=w~~vgZWrO5(S`G3&TgOzb3m`$x=DZL^Qcd2k% z8WUh;wl~JNRN?Zw!iwernKH_uJ(4I^4>+5tVfI!z55+AM*KfLQIM=4 z4hPw&e%^`Hu>&sVB`YM8cB<3L(1RbWv8&4dquCURvbKF@n6J%+50rO}F5(yoK!@Qk z6|KYZe)K`gpe)CXLSR@Q?7+YQB`@aksxQ3E zX1^6Pzu6@K+d}U}V;yi9L)a7t7p~Y8bLO_xCpHVoakEbh{^xK zD<0wh%mW`sQ$^?Vg|LQZl0bj~9G^KAiStt${#eucpa6GNP9Nh`Z2JCeOfyr$MJa!T z2Opese-@ibHAX@z24*P{7k_!s!vz3bf)ILieAPC|vO$$F12agiv%|P>B$@yPcWjfq zTTJCLp+rYkbLdq#xN5MYq`SBjx>$5a&{?(o!gnlj$5N&Ss!{yjvxJ5)>0l+N8nuS)&(r@|*WsI?^$|3+5B)8fi5{9X^vr zAA%aOF)IFcHpvWAsuwpC9-@f{|04!%7%y^gEHh-QWQa(HAO%CWX*D`7>^Pm`@mKRjJe z5^uRc4g}>8cOYemAF4aP-aQg&Cdw{SNL~xqLaU`;q)2%NSY#IN`)l`P3a^ zBuYWB5zb~DrfcLXR5iwh)dF!&p?54Aeyy)0M0TFYxI#hm{)V zz=RW}r&3a-AXgZwc%q2xN@-wr7(`>Q{iae~mF(6~G}bw&C7e%w%AG2G@jEk9Dbhhi3p=+B ze)0}C(N5x-je62be`O@L5pXoY)_vmi5XDIt`eN_0HQXI`e+Uen;kFu+?w-snaJf4} z>F&RS0E@hE^a`D~iqwC-d#X?D@_lv9Y|tz|`=xVKPLf2${VujblCg%nn%8tT^HBs^ zECIs_7;U6FAr~yU+jqN4hN4c-G++hYfi&@buY#scDhouU!YP9WJj+55W+{J(MVIHm zMtB3c%d4#bUhJ^I;d(UVObpu}jE>+%ldW$>X{zpe8sKwWVP#Xjl}tMsCC_?I^X~#_ zL+wmh!rsIQPH56d3(6idJ&QLt0aIyC`p;zjMevHW@cpjDHhsZ3hFwG^Pz}-|{Pu_9N^ybG&P>Y3`Z+d)%6CpAXKXouGyb zcDd&>P@VmZ6w^QoLs@b1^r_TD3@x!U#FZKMr5d8x+N502Bq3v+A(TTePsB*)DXWV2!#3QoT>V_`(yb4y=~A0$svJZj}>C9<^@8*pz(PEBXjofsA#LYL*Kp+Q2BPayHm>N z%}F?qAAMq0DSdnKFMO99C41g}1;Anb`h~CmOt#aa!phI=O=R}t*dQt=c$;>eC60IcB9iJt^16tkhI0>Yy{d&Tkfae;Q7f>+%{RlW^vLVXKr z!ZL^Rbk|it{BEmgTTn%BZhuxgvMkw8vDKDLBaOm|0MyS^pOhJb61p#UMT^ip$w zRK=~U0|IPM9A z(KGYE(X}bTK>5CfnwW8mWL^ShE=gQpbheEu(JVR!D1TUn>YXwP1u}Rr^b1SmG=795 z;L0Y{HV8^rP|8vJ&1&pHY0qFuV4AcfU&AlCxSrW3zeNhu;UqyP`{Of%45d)Cs~=>v zY92>f$MiskmtASO*fuMtV6@F9GrZu-J0VQ6kNnY}DzF0@ zSf2MiB?s~eZ$!m}$+Jldp!W13J9|R<{KjRBe4%s2DbZ1=-#8AHW}uTyeMz{*2Oexd zI6j@@QX9a8?TZyc-L(a(%Rs!{X{cI>qDf5+FI$m<-?LQy6TuBlM1T*`(Tt|^uhsIX zog6knIlJJ=I_F%1AIUF;U2(}PotP5a5V>2b>Go?RqeBw96DYVFX{5)k@FxT^;~tB( z8+quj@(=pEkD$VT&jwu{$IdN6sZ1_BttwhDj7Um{WfQvM9~yl~jEzY5zNO{x{ZRU1 zcaRk15x^4*YjrrVfh<|CX0n0UZqqz+*=8nBwLrJcHMOhq2WM zs2F~QDaL>m!9ekZ3CFNl5*sZsj8;V@+1OhI1C8=Oe(t))S(>7I+llt-V%06ZAdkys z6(?lo0H!MncnIOFM!*%Ch;@JgSEkYtKy+zYhoO(zi+vuV<~tRz4?TPPw%IBR{?1rHThfc7ERrz0;*tc;p4Mq;*;dKkRV;((SWHo z8yqyEbdzmY12*+Ka44&`V$U2MJ+7LawsOqtHD4f34(@hLL30tr)8@`mvnSSNu-+q% zjd+J8Z!Xk~j5gyy&ujd|g9RRJkHW6(aHUjAe}wMFqhP81#-Kj3jRiK|NMG;(@t2>z zG;iG=?YX3ix9e|;FR}vMQNNvkH#MM=X!b9oM6<#E4u+mmL()A)G>8dFoqZQ1$OUj7g)wj zBn#|JtbuBnliw!6IodW)m?$}=%!F}*H82n3UW1O_>t~Oc8_lPUL|snSPOcb%4W?si zMRh*oRWmRozh)E>w?oM}gb|v;LGA7sk{-tYaWmYExxNr)tyTIWTmcz*=sf-wOkQLY zfOZwfOCdN!>qkfEGTWW|TYz`Sbg>&ZQy=bQah0g1TdRY*1Mlj%Kvpo}7vWvU5(kK1 zsbXFLJMUa8`r}f#V{hyvt z-5g7hD^taF!l%_6Ph!sUAh9#WL&@8JWH%$23DawP;Tsa>fwU#Pt-4G2;FQ3fvk+u6 z=pF`6PGmp%d(XO4A>dYQN`F+LA%Q`$oZK^(Kt&>#emWjt;hYtv;60ylhh5J=+28D+ zOD#Xl`%74Q(#2Ws$s&R$RH_5P04Oh}5 zrJ$9Tqu>fI;cH^h*oXa8Q7BoG=N7k-WCAycC;)EH^OWiWP#uAdQV|enNzo@`FA3a$ zb=NBVeC&yP9x8K>0VmS-$!~4gsDmb%X6vlo`Y)E1BeuSsnnZgVr&=HlO|b961+#2x ziqzHNMBt@motn3ellYIvNW3kkWDu(QzXw(T{Rq|q5$tba>9{a{QA55%w#T}@`nSx5 z6vGa`4v{d)xU#$9?eagF!nz6Pfs^IOsn-Yf1v)zis@|iS6XzIl$Dt?Af%a)43`VFb z`x#QL@3bMLwg@>Czn;7M5zR1(C0=s{&qb4^f#Yz=sI>>wB}ozSr@i_n0M&qgxdgAD z?c3k;xu$LJxMg^W4R^{*Z2J@qczrFLF}sX9Vaqc!Ze}9bp~{~D?5sT0>-sMGvwa6{ z{t&x_x)jnaPp?A=spA*-atPKFL6)y<-Ava$jCI+)-|W5VvBX&AyM_8Zcb0!dyJM{C zU`{0HSBQ;yBjHzeJc&Y9pu6^P8iJE31HrH2ZonP;FELd@HClV+P1TE5D7Y`NpHlXl^&$0b@5Qbv%p)Zf>koo9|8PfRXf0UfLPdEJCjLJc!P!|&lg z8A;MKf2>`Cz2$s3qQ~^A|9aU18P37hj)J{~J$wbHxcRRBpwZc%ibv)E7WP$5Pyap| zKDluH2d6TcO`=i{FSeMg{%d6s0=z^gi_Q-S8+PPf{5}jaL_?zOd7$_jwf5Y2gAfo@ zJd-F2&f0g00c{%ivC})*HXmO}(Mw2oqch$a4v({TJgfg3O87ZQx}SgwWo&N_ys?js z1}?=G=9##_Kus@EzsPMWJu4Bkyy-t#bh_;=6nMjDS6ja`ca)xRS1pq#_r|{%V9Ev9 zs+Tp0z{`hHoaZN$&Cdf{!^b?<76y{RMD~6x!{UphEm=E>T6+!@D@3e`Pb>X$!2JMz zs#={wFXpgaFO-eaA>dRTH%i?_58arC(w?&(rN1;xus=5AzqJ~=8^&B6G(_^%ISf>_D=jLpr#Fh;3i6K(Va z9Oy+jsFh5GU;|?qM-IZ&pj(Law^3uU$|2{gYwctpQY9d~E!N{XO~5;&3WF05>zFL=Aw+ zkwPQwQZN!4>R5?Xilyb9S2XF+7cInDWt^d--!B(n=!#$YG3IQ|8deA@tP(aOe7? zDzg;l)|^QatD;aW>4r)E5}*ev^CqWloVI7-afXxIQMc`lv4|sWw(PhY!svgF$(RAe zbiO?N136ht%e+1<4MkF%wSWl;uH{ew00EpW!C4iTgqB2}ipxYB14DNjt$&#DS|uO% zapbdgzmCTqn~w@bn?b_wHX`~@e6ysm@i5Jet`%}9VVeDPj6|s3oJsHZW!tev^64?M zsGgZN_4C*Ho9#;h-)>CWRx0fIby z=r$M|RcM%iM-7y8XI&hwiE{Jw*hHTn1H&)l1* zhj`Gs9@KB~uoYXM|6{A8DZDX;Mn2fqLQJl5Pir$Zu|FVhQOilh8cAw`g$;6Y65qt@-r!Ll) zf!GL~LDvkOyAYB`Jv|xH^;22KHX-a@**_H=nfF*xj5R4V66@Hqrbd{cgnX9GcuUk@-*7VnWb9Z$je=>mmvlW8i4JLw4mx|GdGif)u_~@$^u$7yRV*ss6jhCB;h~3 zE9qu}U|zPxp(|qd=aMAk7v`HEMB-i^Mn17&IqW*@Sv|qA6x_SoZHY#yA}{|1f9jqiJY<+afat=Cru14%+t2cI@#z%%HMJ<~@%bFSh7V z+Ye#ODDOdF&I-EY0B#J5V!054hyOMI=#>igeX+n9D(yr6>p=m?02zC$;dqFUESQdx z+V7-~Qsu#Dcjp{f3KT2Cw4(UdB>$fg9OAnBKwjP^L7-sAMnIZqLkg-@0C1EI>q9|7 zPJaxKF&rcR?tK@jco;d+qq-~s{2w4K!C4iT+OA^K7IZ+}vhYDaSJv65l}PXwHP2>c z-X8v2Wa{v8ksOHE*RRww`Y4@iU|?cA_H0pr7<^w1gk0yOoPJ>FQ6_q(Wq3T|1(lex zflk2wSjRIHHGCEs2N^a!z|}$fUOj~yIgjD>O3%Kb|8enR z9KZO)sTn+-0r>0v_@@OP^zPMnm(Yca_ONgnk+!=^Ue=afzGV-xc*hxL1k4nG1iPoe zNKJ}{S)YB4Nkx*XM5b8ZpWcuYTu`SEL_@K^3+{BCO*kQ7+~fzis|Vw2^^IF0%c;d@ zP?W#mCUO%;E@vN#8X>_@eWZFn6n3YEFf)X9zO|v(QC*~ur&vf_`_c#%8>n>8hrJvafMVlj)W*UKxr@U{4)))ThQRh}yA%5=HtiSL#D znN66@!s|Y?d&rd1Fs;k6CvZi#8P>`u`gd3uVtHpC9SJ6t-g$RIel*OPufyr z{fGji1s{jvXpRrQRw8p56tT%3TbY3cvv3M#xQCFGfd4cz)wN?>4;pN3uLsXTn={n` zod|nZ@YOEJ^zQr5uP4?nFQt=y~I{F<_QTZY3@10xZHb< zRXZXG>t4AXGerpx5x8%E_eVSN4_y$g=H(+2sW~$r0LOn<0cF=vchR0I$y(-wvtN|k z7q8Q{fzaY}kSkk|_qanTnx|EaWWD@s;oItx9D-I5E}N9BBa9>(h+JeYnR_;iiYSoG zKaFY2c#ZstgzVfQ&<5TVr()#mwO=*uzYvvw4C|}<9&y3oQ)e+$kuC#5^f1AeNq$w} z1wz=K7l+nHe&J?IR+9)hpaJ8D6@KE$VB=Buz9gMwxDM?{;bt(C9G(x{Wu~wi!JA%^ zoOqH!|7}yKg6<@$ko;l=!I(@HhWNn}^MFq)gAarxX%VZAW$A812rVv%RABJ?J$uTV z!mM56%CS(&&BiH@rwes`WLtQKtk?=iGh&JcBZ6ceCf@1R&o`6S$OFrZGy}2HFDthoPZolz)4??$Y(0MI zabvmXZS!YTYpGNs_tA7(+WhErjybmh3 zf>g(;zqOHxzkI!-R3nbnE|aT8A^50m2i~D;LkNq@hfJIzTC#&*u3tPO1KNaAlOO1# zZ^hp$aEfiInC+qlNF@Tw5SJbRyyxJ`6Cg4R!)B?vdws{15Ez{Jvr%g#PX7G+3(YcR z&{5UX401^thOXgbu68=U1gnJ`gQ>ZKLQxkOImf~)Y3dd!Opf8+&Rd{cjn6RQ{1~ufUSw}1y`#bgl{pUA-y_&=-yEa^3eMGRN7Ts@8 zFi^qPyBTSTTv>GrXLCzYQ_6$?kv;AJ2^U%$;?{q*xg+>q0UUsr1jh(>Pmj*i)ExefOqgZpW`Hf=cf*~9Fx8Q2Q{0)f)h zz+_l3b5*(Ct0af+g@5^rVGv3S#pYRF;{J&M zsXo)p+csH{GuMkqV44S$;EkJd@oqW;M`@&)al5=&y$__(KbEL*UXQkIMS>f`@ygfI z?%LQZV_xeF>zr(2{XqBr4PX-jWE-fSXe<6m^Y@crBjbqmr~F#def{`y%=|OiGxN<> z6%vY>VT%$cvNs$qcO~Aa>?J%=o)Q3-Qe(S*S4l zNY;}l#sUE`c5Fc$K?_gI5)V6tU^0>p+vNY$*b&L|jmqcW2u$4{{Gk2e2%jg_!Ir;) zM66v}>(i#Tb1@xc&ydSu(lz<&3o~21x&9U8ZvnAqR7v60{VGM^p3r2~OMjZ|c&rq` z0El9=t|^z?GbNCCg#jEMD?BMwv$(nB-1{C_0~)QaA6eT3dSO|!#6aTzwlrZ3?g~L} zSsss~jqGoh_kmLXhF!~>g`DYFkGR52_h+`>jA@EU`c_lHWD7tT7MWzMkpTwPtBWDt#25|Q6f1V8Orqje)I+slXxFA6OV|CBi zj&-(;;k0vTfd*)Xr~6g$ZR-T&0DOX(=Tuo~z%ws(v_wF^L-1hK{j@EETFrBH>YVH( zoEBkNqW!~3h<7vcFG@(6iu1Ig{<4YG*mXl`7FyIxdgGeidlg$VVTKhH{{O}X=(vUe zI!7TNnttw$eN(xN;eKe2tr&ays5~}kkaq@|wyv-WSJMY-TTX(g%s+(yKaTZ2MOMz` zOx}A5lT5RcNk}+m&+ttcJPxz~KQsUp4$?%69k`P`LAf?Syt1r8dO7T{03R;gISd6^ z1)`SCVbKNX=d!>6ktK=ca{E=oHh+R>!HjM|0OW29bvfMSOKh^e#uG*iV{!lo5<_!x z$@7iM=idlT7%`2=0344TVsLqlGgB7mQ`AzIkN`N8HIBKDXDVA|mF_T_Fk>5#0T)C* z?5UX`L{#I!9N8KC*gu7Ei6YHSR4fG%2*9TaSk)K;Me>0T5%~TipU#&KHHKn@gAf>v z9Ueo}!p1$Rc&m3)(Z}eSqk4=NYN|)#fR@L*zcbg73Wvp-oZ}_N<)y|T+3<`5&U_kP8_JsqIjzBRVuL*H3U>~m=S^wA#h~`+ zlhVOB3CR7~d)iK90O}?6dUXoUD5-$(BdG_{emN`vmx*u_AM+VObu5oSUdhx_myiID z*_eZP+f$WPf?%ouAFqy)7d7Vbwxt?i_>mAZhlb+}0PR!*%Y10W1JpueHl|^G&QlS+ zpu?DqRGD7-L-!$W6(D`I|HCh+r7s`=sWObUnV@m!!!_(HLwOa(bS6}+92?5)@OjD0 z=smupJ(<{@-%T@hM-G%#25a?agtN9rt&j!dp5{YXTJ76JZO6b^Akz?2+ysErO7xUJ z%r+{;FVJO7S!T-6G2(o3df(l=xY!iQak##CM;s=0QT)=Rz9@Hem z@H@Ibe?|;rasUoZ(gCeeDaGl6M%F=1o_F>`bGuMS-|&M^?{1ImVgJ2}KbSps3$0Yh zv9)OzU1G2|rrFRQ?D8JPMeLR1XC`MhbNr!A8=Ht0ma=|~)%fpZTN+0$<@o^fg6S*s zhXiBAf#{7_Iyjo>U1-#A=kG5MbMf4sPV^=>HGm?v!8UvQ>$D+}e=^G_dyum%us)V* z58UIld)eWpqM5#kGB3-hk<#Ez~p9tbn$dk=; zfn`7upmBmgZ1{y&ya6L^;bT5gyA#ML3;$`QWZ2Z1&P>)M(TW`g+g#8dusuj4R=lZr%+WEci^siZZ?Ewj*(6aQY3Q7L__b#Vw_$;2@ln$o+y-l3-_oTV)%pMF zzhHc8->`&pwwf7cph|G+O|n2CYdJ^4$~g39O5xFTmq!7e$<&2aX3Qol0@$blFss;{ zW3l{ez@+y4@PssGE%@>p>S_@)?XtGti-e6x6Hznb2)MijC6}0CeEg%9zQ-#RfvC?L z3N^ST+pzY8wG7@!f|(z^E=%U(H*)Ys7JeKa}e{RePq`S3JyAq83Or}cka>u1({9TOCcz7&Hmq=H^lJzSFknaCg?(S2gm_i5( zi1@P7CX!I77+=gAVoc*Po0>NOwQ(qAUirCq5bVT`f=$u&st$Fa^{Qe)<^ZMmtD`B< zjQ+CqLN1D2GGOv9Ph&1Uc+#fk!IOnFsEHeTmSGC&JKRP@`iQF6Lx0( zHUg6OP+C3eubX2euTssctXg0D2R?Ph#4;Rp2hDq>@EEN{h2@46sWR7_`{vW0(P}S} zo;sQtG>JeOpbLB8pGu`>@FD2iUdgpH)2lnEGj%$#%N=iv0jV0|HeD$?AVfcg=w22l zniQUUoyMfMe2$FB9bb8H{CUtT1ERk9YI4zLQ#XR!#k8QI0A81KBEe&9&DGjGE4MOC z(?^@s3wO2n2vCgC1}_xzb$M?MF<@- zqe|IO{?Qh3T_Ou-gbaYy#dm0z2*I%2kr)V18lq4-mXZ#oa&Y&{w%|VLrHuRb^6i60 ztU0|0elxB03t?Ms&;IS6KQ_+EQI3Bx5|Te8cpEAPWT3!x|5DwpR2OM){kLmZLUbIs z6OYoTg&DS;2dnLXeJxk;DvlhR2f|nYwG`rCurJ>RSKCIUo8wH2dr?R>o01OhDEuG_ z7@~N=$xMigN#J0TEnt}Ng@04m8bq4ZE;x9xrOF?=()1&mNEfQeF3jq+_S3d|4Jrj- z(xobXncah_5)Epxo^NU#FcQrA$BpJgjR0p>?=oaQA%Dw0*EV| zu>{gv9`NO-y3~JE1Lay&Ji4jD;+j7f9Kd=*cL)xYM+3lI|2{g3Qt|)@&&)XT6IViE z|5ugQbysiK8vS-~_zHH)xHi4k(}TMPnO99dB7;mpMNZ-6eo zCI2ffkP+zruAiugmS@S7blJ>ttrc!dEOeF|{11TdP8=Hl)c)kYk7^h1)tP6O1&3Dt zM8LP#l&J27!s$TuG6pZ0>OLqALJ52Zsmx**_84H9`n`IB0Ht9AIK~CLy-euI+J_Ld z|HfPrCtE|Jiv+v}iUfL{@z*o>4Bs)nF0b%VT!C8u4BRLm$G!YFTmzz15h@?OX{O~p z?3PbFgPEY&=((cuTj{**g5t~-kj{Q0djHu|bRTz<27lE6S+p?jTI{-17T4OS#rb&Z znPHcoMvBA79kA~8L4cV>eeC{BI>|IQ(xBvxswC@T!DmFjYIFF@7qN?`Q$tpuX!FZ& zusP5qU}o{M87;%RX%P@2Q3*r5gsNVJo`A2y^Mdva1d zalBScl-AI-mIf{AJroG|-q%B8mMPic__71~%SDN}9FdkU2=JN?AE!S%QL`b#k*8Vq z2@pL861Kk4BZ;3k&?56xW=?D+FvZ7>V?#q#S7(!GDqCOW$eS{IAs*q|3is$YTF=$W zv=dqB2nt=AnW#RtJDBKp8(yE5$BUrT^;aRYCPNFVwPp0S3z^lj>lDA<0dBa=EXl-| z4LC{lVVx|3|N2Jg&c+s@RzWqjWJ_eE5VmwS4FA%N4){n7zm!)VMvgg!sliNKP-sGb z1%9Yc$^kCvrQku-HP;?M1Mn~cfX|Xecm9$g4kl#?k??;%sTKm6t#1?08F^!5Nb7b79rWyj*E3T>`Dh&w8 z0i^Q>W5@ACrD(ApBcRZ{p9|1(dfYSFV)=0F`N?rW&Ne71a`p)T3YQXl_x_njeU!b& zdDT}SD{-sT7u(Bcd_mb2gJk6f5a|nu!q@mPyL|0XE6yxiJu<6m4EL6&{Sgucyu_+( zc>S`n>BXXNCD*wXf9^{kmia+1A#C)!57Fl)c@@)-!Zl>{{$t$`*Ki&e95^fAg{M+h zzi{zqXTC~9JE7VGHaLx+G~lcVI2 z!-I>K@)bEtGf(-XP5m<&;A}%__eZV@x9d_D5L+>M`l-p;?NGRjo%=Hi0#A@34Ix&h*{22K3q9 z7>-WH>clAvJ{00JAd7QZ=K=}u?n+^=*9RvzHE|E$TtE}JvwWKTzaldiHw`7S?dC$W z27zTp+{Uz2yC%4jB=iE)NQIgn=%8B?FdJ-bDr8oq0Nk zkzkuy9JqBZl@+j>8DTm7AcBAo8e<1^+~1N%{qQ`{mw!O^Sfl$}-{=of`~4LJj6L_{ zvw)>Fgq9fY;f94p?g|*}{+JMy%#_>H371&YgszF32;%wuBF&th(c@OwJ`sj#sUhjt zC`6}1v2Zyq$d$7-JkKsU3JBB{hK7o7t^e?1Z-=xSglo+Md1$q#Ag_K1UHbbO|)z7=tgr%^f$(%$taZ4?IE(4EgbU9wi0gB+w7#fYy% zQ@<11+P6|XScl_aWKavjA!S#&LfMBo9Qk^S6W34^`sG4L{GzIur7kV2GD{7q@4lGE z9h3!CXu`+$Q_b-H>dvZL)&!!Hi&zJeLl?_d{CS(5cUN|@veh1q499H_u?qthyoV^e zMofN-WB3x1+FqW`->z|`ON1qPa7oyUJGq7kGIF`@3!H_J_x6!e-rdAj)p9!4cG3Nm zjEkoljfVr>C=600k1AXvV%~6B#G-je6u2EVlt7ev*TYD8dBrPiO~d!GgYrUZW8i&; z_ENY^ZaK!eWdc4hV;hhF4=Ae?G!CJ7?Ne~WTaqiq)cW&X{gJpX+8UHy$-jrl zA|F}vOGP8_?fJPj!zKJu6c>6cGVhj`bXu5^d(ja5^ zk)S>9_vBvBhhJY`UyI2ij4vYM-~EpaEWfR%P%pr!8fS&CMjJFv$3d`0LgEAU%tXBP zhfxmk@TEVnSL5ElIs}g+>$>emJjFJP*r8@q7dE$3J_V`v;r7uo;rF?6yk{{^JOSu0 zUCOMpE;~*T%H`$d<>lq&<>lq&<>lq&<>lq&<>lqx^u$6iG9HvHa?{CRmA#K<^#o^)w+(%>ck}F z*W5s25wu@0X!?Gr%H6j6eP@1Z)ch;yG68&WAvv>A50)b|!DF`X#50tvA!|TW& zDRoze*N{F^>aP#4Abh3Em0LWXdkyDh)%&vQ{n>SX?7F{pU0=H{uicf=0H4QBqBArE zN;tRSVW>I&w9%@#_Q4nNC^&6UcKl1f)w~bsT>h;sgpy$tq@V?SIO+w}6sN|xJ6Xky zSkGLk(jtl=Maqm+NIgl<)jNqk3bbKZ1!P4_3(DlmflvDgzw^~GZGFng**1w2UC-3> w-ecNEIu=b22~Q++1d)>)L*q_!Fj?t*00000000000000000000000000M~7g#Q*>R literal 0 HcmV?d00001 diff --git a/mint.json b/mint.json index 334e606..7dd1a9b 100644 --- a/mint.json +++ b/mint.json @@ -83,8 +83,10 @@ { "group": "Airgapped Edition", "pages": [ + "self-hosting/methods/airgapped-considerations", "self-hosting/methods/airgapped-edition", - "self-hosting/methods/airgapped-edition-kubernetes" + "self-hosting/methods/airgapped-edition-kubernetes", + "self-hosting/methods/clone-docker-images" ] }, { diff --git a/self-hosting/methods/airgapped-considerations.mdx b/self-hosting/methods/airgapped-considerations.mdx new file mode 100644 index 0000000..932719c --- /dev/null +++ b/self-hosting/methods/airgapped-considerations.mdx @@ -0,0 +1,158 @@ +--- +title: Airgapped deployment architecture +sidebarTitle: Overview +--- + +This document explains Plane's architecture and specific requirements for airgapped deployments. Review this before beginning your airgapped installation on [Docker](/self-hosting/methods/airgapped-edition) or [Kubernetes](/self-hosting/methods/airgapped-edition-kubernetes). + +## What is an airgapped deployment? + +An airgapped deployment operates in a completely isolated network environment with no external internet connectivity. This isolation is common in highly regulated industries, government facilities, and organizations with strict security requirements. + +Plane supports fully airgapped deployments where all components—application services, databases, storage, and integrations—operate entirely within your isolated network perimeter. + +## Plane architecture overview + +Plane consists of multiple services working together to provide project management capabilities. + +![Plane architecture](/images/airgapped/plane-architecture.webp) + +### Frontend services + +**Web** +The main application interface where users interact with projects, work items, and pages. This service serves the React-based UI and handles client-side routing. + +**Space** +Public project spaces that can be shared externally. This allows teams to publish project information without requiring authentication. + +**Admin** +Instance administration interface for workspace owners and administrators. Manages billing, licensing, workspace settings, and user permissions. + +### API server + +**API** +The core REST API that handles all data operations. All frontend services communicate with this API for creating, reading, updating, and deleting data. + +**Worker** +Background job processor that handles async operations like file processing, notification dispatch, and data imports. Workers pull jobs from RabbitMQ and execute them independently. + +**Beat worker** +Scheduled task executor that runs periodic jobs like data cleanup, report generation, and reminder notifications. Uses a cron-like scheduling system. + +**Migrator** +Database schema management service that runs on deployment to apply schema changes and data migrations. Runs once during upgrades then exits. + +### Supporting services + +**Live** +Real-time collaboration service powered by WebSockets. Handles cursor positions, live updates, and presence indicators for multiple users working simultaneously. + +**Silo** +Integration backend that manages connections to GitHub, GitLab, and Slack. Handles OAuth flows, webhook processing, and API communication with external systems. + +**Intake** +Email ingestion service that converts incoming emails into work items or comments. Requires SMTP configuration and DNS setup. + +### Infrastructure dependencies + +**PostgreSQL** +Primary relational database storing all application data including projects, work items, users, and configuration. Plane requires PostgreSQL 15.7+ or 16.x. + +**Redis/Valkey** +In-memory cache and session store. Used for caching frequently accessed data, storing user sessions, and managing real-time collaboration state. + +**RabbitMQ** +Message queue for asynchronous task processing. Workers pull jobs from queues for background operations like imports, exports, and notifications. + +**MinIO/S3** +Object storage for file uploads, attachments, and generated exports. Can be replaced with any S3-compatible storage system. + +**OpenSearch** +Optional search indexing service for enhanced search capabilities. Not required for basic Plane functionality. + +## Airgapped cluster architecture + +Here's how Plane operates in an airgapped environment with internal enterprise applications: + +![Airgapped cluster architecture](/images/airgapped/airgapped-cluster.webp) + +This diagram illustrates a critical principle: **all OAuth flows and API communication remain internal to the airgapped cluster**. When integrating with self-hosted GitHub Enterprise, GitLab, or other internal services, the entire authentication and data exchange happens within your isolated network — no internet access required. + +## Connectivity and telemetry + +**Critical guarantees for airgapped environments** + +- **No telemetry** +Plane does not send application data, usage metrics, or telemetry outside the cluster. No analytics, crash reports, or usage statistics leave your network. + +- **Offline licensing** +License validation happens through uploaded license files downloaded from the Prime portal. No internet connection required after initial license file transfer. + +- **Zero external dependencies** +After initial image import, no external network connectivity is required for Plane to operate. All features work entirely within your isolated environment. + +- **Internal-only communication** +All service-to-service communication stays within your cluster. Services never attempt to reach external APIs, CDNs, or third-party services. + +### How integrations stay internal + +The airgapped cluster diagram above shows the complete data flow. Key points: + +- **OAuth providers** - Your internal GitHub Enterprise or GitLab instance acts as the OAuth provider +- **Authorization endpoints** - All OAuth URLs point to internal systems, never external SaaS services +- **API communication** - Plane makes API calls only to your internal instances +- **Webhook delivery** - Internal systems send webhooks to Plane's internal endpoints +- **No SaaS fallback** - Plane never attempts to reach github.com, gitlab.com, or slack.com APIs + +This architecture ensures complete network isolation while maintaining full integration functionality. + +--- + +## Kubernetes-specific requirements + +### Base environment + +Deploying airgapped Plane via Kubernetes requires preparing all dependencies to operate without any external network access. + +#### Container images and artifacts + +- Maintain an internal OCI or container registry to host all Plane service images +- Prepare a controlled process to pull, verify, and mirror Plane container images and Helm charts from an online staging environment into the airgapped registry + +#### Kubernetes environment + +**Supported versions:** Kubernetes 1.31 – 1.33 + +**Required components:** +- IngressClass configured +- StorageClass available +- cert-manager configured with an internal CA + +**Node requirements:** +- Ensure node OS dependencies and container runtime packages are available from mirrored package repositories like apt, yum, or offline bundles + +### Scaling + +Horizontal scaling is handled via replica counts configurable in `values.yaml`. + +Plane avoids using StatefulSets where possible due to the complexity of scaling stateful workloads in Kubernetes. The `monitor` service uses a StatefulSet. + +**For airgapped clusters:** +- Ensure metrics-server images are mirrored if using HPA +- If using node autoscaling, ensure node images are pre-loaded and registries accessible on bootstrap + +### Secrets management + +Plane supports using existing external secret stores, provided they are reachable within the airgapped environment: + +- AWS Secrets Manager for private VPC with no internet +- HashiCorp Vault +- Self-hosted Bitwarden +- Kubernetes Secrets +- SOPS, sealed-secrets, if preferred + +### Additional considerations + +- Ensure all secret providers can function without external network access +- cert-manager must use an internal certificate authority +- Keys and secret rotation policies should be part of the airgap operational procedures \ No newline at end of file diff --git a/self-hosting/methods/airgapped-edition-kubernetes.mdx b/self-hosting/methods/airgapped-edition-kubernetes.mdx index c39f716..f7180be 100644 --- a/self-hosting/methods/airgapped-edition-kubernetes.mdx +++ b/self-hosting/methods/airgapped-edition-kubernetes.mdx @@ -3,145 +3,239 @@ title: Deploy Plane Commercial in an Airgapped Kubernetes Environment sidebarTitle: For Kubernetes --- -This guide walks you through installing Plane Enterprise in a Kubernetes cluster without internet access. You'll use Helm charts and pre-packaged Docker images to deploy a fully functional Plane instance. +This guide walks you through deploying Plane Enterprise in an airgapped Kubernetes environment using Helm charts and pre-packaged Docker images. ## What you'll need Before starting, ensure you have: +- Kubernetes cluster (v1.31 - v1.33) - Helm 3.x installed -- kubectl with access to your target Kubernetes cluster +- `kubectl` configured to access your cluster +- `cert-manager` available in the cluster +- A valid and working ingress controller (nginx, traefik, etc) +- Required ports opened to access the application (80, 443) +- SMTP ports opened if using email intake (25, 465, 587) + + +While Kubernetes can run stateful services with persistent volumes, and Plane's Helm chart supports deploying PostgreSQL, MinIO, RabbitMQ, and Redis, we strongly recommend using external managed services for better reliability in backup/restore operations and disaster recovery. + +Consider these alternatives: +- **MinIO**: Replace with AWS S3, Google Cloud Storage, or any S3-compatible service +- **Redis**: Replace with Valkey or a managed Redis service +- **PostgreSQL**: Use a managed PostgreSQL service +- **RabbitMQ**: Use a managed message queue service + ## Install Plane -1. Get the Plane Enterprise Helm chart from the official release: +1. **Download Plane Enterprise Helm chart** + + Get the Plane Enterprise Helm chart from the official release. Check for the latest version at [Artifact Hub](https://artifacthub.io/packages/helm/makeplane/plane-enterprise). ```bash # Using wget - wget https://github.com/makeplane/helm-charts/releases/download/plane-enterprise-1.4.1/plane-enterprise-1.4.1.tgz + wget https://github.com/makeplane/helm-charts/releases/download/plane-enterprise-1.6.4/plane-enterprise-1.6.4.tgz # Using curl - curl -L -O https://github.com/makeplane/helm-charts/releases/download/plane-enterprise-1.4.1/plane-enterprise-1.4.1.tgz + curl -L -O https://github.com/makeplane/helm-charts/releases/download/plane-enterprise-1.6.4/plane-enterprise-1.6.4.tgz ``` -2. Contact [**sales@plane.so**](mailto:sales@plane.so) to get your installation download URL and license file. - -2. On a machine with internet access, download the installation package: - - ```bash - curl -LO - ``` - - The download may take 15 minutes. Once complete, you no longer need internet access. - -3. Transfer the `airgapped-{arch}.tar.gz` file to your air-gapped machine. - -4. Extract the package on your air-gapped machine: - - ```bash - mkdir -p airgapped - tar -xvzf airgapped-amd64.tar.gz -C airgapped - cd airgapped - ``` - - You'll find these Docker image .tar files for your airgapped installation in this folder. +2. **Prepare Docker images for airgapped environment** - - `admin-commercial-.tar` - Admin service image - - `backend-commercial-.tar` - API/worker/beat-worker/migrator service image - - `email-commercial-.tar` - Email service image - - `live-commercial-.tar` - Live service image - - `monitor-commercial-.tar` - Monitor service image - - `proxy-commercial-.tar` - Plane-proxy service image - - `silo-commercial-.tar` - Silo service image - - `space-commercial-.tar` - Space service image - - `web-commercial-.tar` - Web service image - - `minio-latest.tar` - Plane-minio service image - - `postgres-15.7-alpine.tar` - Plane-db service image - - `rabbitmq-3.13.6-management-alpine.tar` - Plane-mq service image - - `valkey-7.2.5-alpine.tar` - Plane-redis service image + Refer to [this document](https://app.plane.so/plane/wiki/0fc896e0-ca79-4783-8860-43c51b372ec1/) to download the Docker images from the public repository to your internal repository. - For this installation, you can ignore the extra files in this folder (e.g., `docker-compose.yml`, `install.sh`, `plane.env`, etc.). + **Important** + This process will NOT download or clone these infrastructure images: + - `valkey:7.2.5-alpine` + - `postgres:15.7-alpine` + - `rabbitmq:3.13.6-management-alpine` + - `minio/minio:latest` + - `minio/mc:latest` + + If you're using `local_setup: true` for any of these services, you'll need to pull and transfer these images separately. -5. Load the images into your local Docker registry or private registry: - ```bash - # Load each image into Docker - docker load -i .tar - - # Tag and push each image to your private registry - docker tag / - docker push / - ``` +3. **Configure custom values file** -6. Create Custom Values File + a. Extract the default values from the Helm chart. ```bash - # Extract the Helm chart to access the values file - helm show values plane-enterprise-1.4.1.tgz > custom-values.yaml + helm show values plane-enterprise-1.6.4.tgz > custom-values.yaml ``` -7. Edit the `custom-values.yaml` file to point to your local/private registry images and configure important settings: + b. Update Docker image references + + Edit the `custom-values.yaml` file to point to your local or private registry images and configure important settings. + **Basic configuration:** ```yaml - # Example of image updates in custom-values.yaml - license: - licenseDomain: 'plane.example.com' + # Specify the Plane version + planeVersion: + # Enable airgapped mode (REQUIRED) airgapped: - enabled: true - # if using Custom Root CA for S3 storage + enabled: true # Must be TRUE for airgapped installations + # If using custom root CA for S3 storage s3SecretName: "s3-custom-ca" s3SecretKey: "s3-custom-ca.crt" + ``` + **Service images:** + ```yaml services: web: - image: /web-commercial: + image: /web-commercial api: - image: /backend-commercial: + image: /backend-commercial space: - image: /space-commercial: + image: /space-commercial admin: - image: /admin-commercial: + image: /admin-commercial live: - image: /live-commercial: + image: /live-commercial monitor: - image: /monitor-commercial: + image: /monitor-commercial + + email_service: + enabled: true + image: /email-commercial silo: - image: /silo-commercial: + enabled: true + image: /silo-commercial iframely: - image: /iframely:v1.2.0 - - # Database and infrastructure images - redis: - image: /valkey:7.2.5-alpine - - postgres: - image: /postgres:15.7-alpine - - rabbitmq: - image: /rabbitmq:3.13.6-management-alpine - - minio: - image: /minio:latest - image_mc: /mc:latest + enabled: true + image: /iframely:v1.2.0 + ``` + + **Infrastructure services:** + Configure whether to use local (in-cluster) or external services: + ```yaml + services: + # Database and infrastructure images + redis: + local_setup: true # Set to false if using external service + image: valkey/valkey:7.2.11-alpine + + postgres: + local_setup: true # Set to false if using external service + image: postgres:15.7-alpine + + rabbitmq: + local_setup: true # Set to false if using external service + image: rabbitmq:3.13.6-management-alpine + external_rabbitmq_url: '' # Required only if using remote RabbitMQ + + minio: + local_setup: true # Set to false if using external service + image: minio/minio:latest + image_mc: minio/mc:latest + ``` + + **Environment variables:** + ```yaml env: - storageClass: '' + storageClass: '' + remote_redis_url: '' # Required only if using remote Redis + pgdb_remote_url: '' # Required only if using remote PostgreSQL + # Required if MinIO local_setup is false + aws_access_key: '' + aws_secret_access_key: '' + aws_region: '' + aws_s3_endpoint_url: '' ``` -8. Install Plane Commercial Airgapped edition using your customized values file: + c. **Configure integrations and importers** + To set up integrations with external systems like Slack, GitHub, and GitLab, configure these values in `custom-values.yaml`: + ```yaml + services: + silo: + enabled: true + connectors: + slack: + enabled: false + client_id: '' + client_secret: '' + github: + enabled: false + client_id: '' + client_secret: '' + app_name: '' + app_id: '' + private_key: '' + gitlab: + enabled: false + client_id: '' + client_secret: '' + + env: + silo_envs: + batch_size: 100 + mq_prefetch_count: 1 + request_interval: 400 + hmac_secret_key: '' + aes_secret_key: 'dsOdt7YrvxsTIFJ37pOaEVvLxN8KGBCr' + ``` + + d. **Configure intake email** + + The email intake feature in Plane lets you capture incoming emails. Before or after setting up the application, configure DNS settings following [this guide](https://developers.plane.so/self-hosting/govern/configure-dns-email-service). + + Add these required values to `custom-values.yaml`: + ```yaml + ingress: + enabled: true + ingressClass: 'nginx' # Or as per your cluster + ingress_annotations: {} + + ssl: + tls_secret_name: '' # If you have a custom TLS secret name + # If you want to use Let's Encrypt, set createIssuer and generateCerts to true + createIssuer: false + issuer: http # Allowed: cloudflare, digitalocean, http + token: '' # Not required for http + server: https://acme-v02.api.letsencrypt.org/directory + email: plane@example.com # A valid email address + generateCerts: true + + services: + email_service: + enabled: true + replicas: 1 + memoryLimit: 1000Mi + cpuLimit: 500m + memoryRequest: 50Mi + cpuRequest: 50m + image: /email-commercial: + pullPolicy: Always + nodeSelector: {} + tolerations: [] + affinity: {} + labels: {} + annotations: {} + + env: + email_service_envs: + smtp_domain: '' + ``` + +4. **Install or upgrade with custom values** + + Install Plane Enterprise using your customized values file: ```bash - helm install plane-app plane-enterprise-1.4.1.tgz \ + helm upgrade plane-app plane-enterprise-1.6.4.tgz \ + --install \ --create-namespace \ --namespace plane \ -f custom-values.yaml \ @@ -150,48 +244,45 @@ Before starting, ensure you have: --wait-for-jobs ``` -## Verify installation +5. **Verify installation** -Check that all components are running properly: + Check that all components are running: + ```bash + # Check all pods + kubectl get pods -n plane -```bash -# Check all pods -kubectl get pods -n plane + # Check services + kubectl get services -n plane -# Check services -kubectl get services -n plane + # Check ingress + kubectl get ingress -n plane -# Check ingress -kubectl get ingress -n plane + # Check persistent volumes + kubectl get pv,pvc -n plane -# Check persistent volumes -kubectl get pv,pvc -n plane + # Get the ingress URL + kubectl get ingress -n plane -o wide + ``` -# Get the ingress URL -kubectl get ingress -n plane -o wide -``` +## Activate your license -## Additional configuration +Once your air-gapped installation is running, you'll need to activate your workspace with the license file. -For more advanced Plane configuration options, refer to the [Kubernetes documentation](https://developers.plane.so/self-hosting/methods/kubernetes#configuration-settings). +1. Login to the [Prime portal](https://prime.plane.so/licenses) with the same email address you used to purchase the paid plan. +2. Go to [Manage licenses](https://prime.plane.so/licenses). +3. Click **Download license** to download the license file for your Plane version. + ![Download license file](/images/activate-license/download-license.webp) +4. Navigate to the [Workspace Settings](https://docs.plane.so/core-concepts/workspaces/overview#workspace-settings) in the Plane application. +6. Select **Billing and plans** on the right pane. +6. Click the **Activate this workspace** button. + ![Upload license file](/images/activate-license/upload-airgapped-license-file.webp) +7. Upload the license file to activate your workspace. +You now have Plane running in your air-gapped environment. If you run into any issues, check the logs using the commands above, or reach out to our support team for assistance. -## Activate your license -Once your air-gapped installation is running, you'll need to activate your workspace with the provided license file. - -You should have received the `license_key.json` file as part of your air-gapped package. If you don't have this file, contact our support team. - +## Additional configuration -1. Go to your [Workspace Settings](https://docs.plane.so/core-concepts/workspaces/overview#workspace-settings) in the Plane application. -2. Select **Billing and plans** on the right pane. -3. Click the **Activate this workspace** button. - ![Upload license file](/images/activate-license/upload-airgapped-license-file.webp) -4. Upload the license file `license_key.json` to activate your workspace. +For more advanced Plane configuration options, refer to the [Kubernetes documentation](https://developers.plane.so/self-hosting/methods/kubernetes#configuration-settings). -You now have Plane running in your air-gapped environment. If you run into any issues, check the logs using the commands above, or reach out to our support team for assistance. - -*Optional* -Once everything is working, you can safely delete the `airgapped` folder that contains the installation script and image files to free up space. - diff --git a/self-hosting/methods/airgapped-edition.mdx b/self-hosting/methods/airgapped-edition.mdx index 9c1a4ad..dbccc2a 100644 --- a/self-hosting/methods/airgapped-edition.mdx +++ b/self-hosting/methods/airgapped-edition.mdx @@ -160,20 +160,16 @@ Once both services are running smoothly, you can access Plane by opening your br ## Activate your license -Once your air-gapped installation is running, you'll need to activate your workspace with the provided license file. - -You should have received the `license_key.json` file as part of your air-gapped package. If you don't have this file, contact our support team. - - -1. Go to your [Workspace Settings](https://docs.plane.so/core-concepts/workspaces/overview#workspace-settings) in the Plane application. -2. Select **Billing and plans** on the right pane. -3. Click the **Activate this workspace** button. +Once your air-gapped installation is running, you'll need to activate your workspace with the license file. + +1. Login to the [Prime portal](https://prime.plane.so/licenses) with the same email address you used to purchase the paid plan. +2. Go to [Manage licenses](https://prime.plane.so/licenses). +3. Click **Download license** to download the license file for your Plane version. + ![Download license file](/images/activate-license/download-license.webp) +4. Navigate to the [Workspace Settings](https://docs.plane.so/core-concepts/workspaces/overview#workspace-settings) in the Plane application. +6. Select **Billing and plans** on the right pane. +6. Click the **Activate this workspace** button. ![Upload license file](/images/activate-license/upload-airgapped-license-file.webp) -4. Upload the license file `license_key.json` to activate your workspace. +7. Upload the license file to activate your workspace. -You now have Plane running in your air-gapped environment. If you run into any issues, check the logs using the commands above, or reach out to our support team for assistance. - - -*Optional* -Once everything is working, you can safely delete the `airgapped` folder that contains the installation script and image files to free up space. - \ No newline at end of file +You now have Plane running in your air-gapped environment. If you run into any issues, check the logs using the commands above, or reach out to our support team for assistance. \ No newline at end of file diff --git a/self-hosting/methods/clone-docker-images.mdx b/self-hosting/methods/clone-docker-images.mdx new file mode 100644 index 0000000..aed2571 --- /dev/null +++ b/self-hosting/methods/clone-docker-images.mdx @@ -0,0 +1,295 @@ +--- +title: Clone Docker images to your private registry +sidebarTitle: Clone Docker images +description: Transfer Plane Enterprise Docker images from the artifact registry to your private registry for airgapped deployments using the crane tool. +--- + + +**Part of airgapped deployment:** +This guide is part of the airgapped deployment process. If you're setting up Plane in an airgapped environment, return to that guide after copying your images. + + +This guide shows you how to copy Docker images from the Plane artifact registry to your destination registry using the `crane` tool. + +## Prerequisites + +### Install crane + +Crane is a tool for interacting with remote container images and registries. Install it on a machine with internet access. + +**macOS:** +```bash +brew install crane +``` + +**Linux:** +```bash +# Download the latest release +VERSION=$(curl -s https://api.github.com/repos/google/go-containerregistry/releases/latest | grep '"tag_name"' | cut -d'"' -f4) +curl -sL "https://github.com/google/go-containerregistry/releases/download/${VERSION}/go-containerregistry_Linux_x86_64.tar.gz" | tar xz crane +sudo mv crane /usr/local/bin/ + +# Verify installation +crane version +``` + +**Windows (using WSL or Git Bash):** +```bash +# Download and extract +curl -sL "https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Windows_x86_64.tar.gz" | tar xz crane.exe +``` + +## Plane images to copy + +The following Plane Commercial images need to be transferred to your private registry: +``` +artifacts.plane.so/makeplane/admin-commercial:${APP_RELEASE_VERSION} +artifacts.plane.so/makeplane/web-commercial:${APP_RELEASE_VERSION} +artifacts.plane.so/makeplane/space-commercial:${APP_RELEASE_VERSION} +artifacts.plane.so/makeplane/live-commercial:${APP_RELEASE_VERSION} +artifacts.plane.so/makeplane/monitor-commercial:${APP_RELEASE_VERSION} +artifacts.plane.so/makeplane/backend-commercial:${APP_RELEASE_VERSION} +artifacts.plane.so/makeplane/iframely:v1.2.0 +artifacts.plane.so/makeplane/silo-commercial:${APP_RELEASE_VERSION} +artifacts.plane.so/makeplane/email-commercial:${APP_RELEASE_VERSION} +``` + + +**Infrastructure images not included:** The Plane artifact registry does not include infrastructure images. If you're using `local_setup: true` for any infrastructure services, you'll need to pull these separately from public registries: + +- `valkey/valkey:7.2.11-alpine` +- `postgres:15.7-alpine` +- `rabbitmq:3.13.6-management-alpine` +- `minio/minio:latest` +- `minio/mc:latest` + + +## Configure environment variables + +Set your version and destination registry before copying images. +```bash +# Set your Plane version +export APP_RELEASE_VERSION="v2.1.0" # Replace with your desired version + +# Set your destination registry +export DESTINATION_REGISTRY="your-registry.io/your-namespace" +``` + +**Example destination registry values:** +```bash +# Docker Hub +export DESTINATION_REGISTRY="docker.io/yourcompany" + +# Google Container Registry +export DESTINATION_REGISTRY="gcr.io/your-project" + +# Private registry +export DESTINATION_REGISTRY="your-private-registry.com/plane" + +# AWS ECR +export DESTINATION_REGISTRY="123456789012.dkr.ecr.us-east-1.amazonaws.com/plane" + +# Azure Container Registry +export DESTINATION_REGISTRY="yourregistry.azurecr.io/plane" +``` + +## Authenticate to your destination registry + +Before copying images, authenticate crane to your destination registry. + +**Docker Hub:** +```bash +crane auth login docker.io -u YOUR_USERNAME -p YOUR_PASSWORD +``` + +**Google Container Registry:** +```bash +gcloud auth configure-docker +``` + +**AWS ECR:** +```bash +aws ecr get-login-password --region REGION | crane auth login --username AWS --password-stdin AWS_ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com +``` + +**Azure Container Registry:** +```bash +az acr login --name YOUR_REGISTRY_NAME +``` + +**Harbor or other private registries:** +```bash +crane auth login your-registry.com -u YOUR_USERNAME -p YOUR_PASSWORD +``` + +## Copy images to your registry + +You can copy images individually or use the provided script to copy all images at once. + +### Option 1: Copy individual images + +**Basic image copy:** +```bash +crane copy \ + artifacts.plane.so/makeplane/backend-commercial:${APP_RELEASE_VERSION} \ + ${DESTINATION_REGISTRY}/backend-commercial:${APP_RELEASE_VERSION} +``` + +**Copy with specific platform (architecture):** +```bash +crane copy \ + --platform linux/amd64 \ + artifacts.plane.so/makeplane/backend-commercial:${APP_RELEASE_VERSION} \ + ${DESTINATION_REGISTRY}/backend-commercial:${APP_RELEASE_VERSION} +``` + +**Verify source image before copying:** +```bash +# Check if source image exists +crane manifest artifacts.plane.so/makeplane/backend-commercial:${APP_RELEASE_VERSION} + +# List all available tags +crane ls artifacts.plane.so/makeplane/backend-commercial +``` + +**Verify image after copying:** +```bash +# Get image digest +crane digest ${DESTINATION_REGISTRY}/backend-commercial:${APP_RELEASE_VERSION} + +# Verify manifest +crane manifest ${DESTINATION_REGISTRY}/backend-commercial:${APP_RELEASE_VERSION} +``` + +### Option 2: Copy all images with a script + +Create a file named `copy-plane-images.sh`: +```bash +#!/bin/bash + +set -e + +# Configuration +APP_RELEASE_VERSION="${APP_RELEASE_VERSION:-v2.1.0}" +DESTINATION_REGISTRY="${DESTINATION_REGISTRY}" + +if [ -z "$DESTINATION_REGISTRY" ]; then + echo "Error: DESTINATION_REGISTRY environment variable is not set" + echo "Example: export DESTINATION_REGISTRY='docker.io/yourcompany'" + exit 1 +fi + +# Source registry +SOURCE_REGISTRY="artifacts.plane.so/makeplane" + +# Image list +declare -a IMAGES=( + "admin-commercial:${APP_RELEASE_VERSION}" + "web-commercial:${APP_RELEASE_VERSION}" + "space-commercial:${APP_RELEASE_VERSION}" + "live-commercial:${APP_RELEASE_VERSION}" + "monitor-commercial:${APP_RELEASE_VERSION}" + "backend-commercial:${APP_RELEASE_VERSION}" + "iframely:v1.2.0" + "silo-commercial:${APP_RELEASE_VERSION}" + "email-commercial:${APP_RELEASE_VERSION}" +) + +echo "Starting image copy process..." +echo "Source: ${SOURCE_REGISTRY}" +echo "Destination: ${DESTINATION_REGISTRY}" +echo "Version: ${APP_RELEASE_VERSION}" +echo "" + +# Copy each image +for IMAGE in "${IMAGES[@]}"; do + SOURCE="${SOURCE_REGISTRY}/${IMAGE}" + DESTINATION="${DESTINATION_REGISTRY}/${IMAGE}" + + echo "Copying: ${SOURCE} -> ${DESTINATION}" + crane copy "${SOURCE}" "${DESTINATION}" + + if [ $? -eq 0 ]; then + echo "✓ Successfully copied ${IMAGE}" + else + echo "✗ Failed to copy ${IMAGE}" + exit 1 + fi + echo "" +done + +echo "All images copied successfully!" +``` + +Make the script executable and run it: +```bash +chmod +x copy-plane-images.sh +./copy-plane-images.sh +``` + +The script will copy all Plane images to your destination registry. Each image copy is verified, and the script exits if any copy fails. + +## Troubleshooting + +### Authentication issues + +**Error:** `unauthorized: authentication required` + +**Solution:** Re-authenticate to your destination registry: +```bash +crane auth login your-destination-registry.com +``` + +Verify your credentials are correct and that you have push permissions to the registry. + +### Network timeouts + +**Error:** Large images timing out during transfer + +**Solution:** Crane handles retries automatically, but you can also: + +- Check your network connection stability +- Try copying during off-peak hours +- Use a machine with better network connectivity +- Copy images individually rather than using the batch script + +### Permission denied + +**Error:** `denied: requested access to the resource is denied` + +**Solution:** + +- Ensure you have push permissions to the destination registry +- Verify your authentication credentials are correct +- Check that the destination repository exists, or that you have permission to create it +- For organizational registries, confirm your account has the necessary roles + +### Image not found + +**Error:** `MANIFEST_UNKNOWN: manifest unknown` + +**Solution:** + +- Verify the source image exists: +```bash + crane ls artifacts.plane.so/makeplane/backend-commercial +``` +- Check that you're using the correct version tag +- Ensure `APP_RELEASE_VERSION` is set correctly +- Verify the image name is spelled correctly + +### Rate limiting + +**Error:** `429 Too Many Requests` + +**Solution:** + +- Wait a few minutes and retry +- Authenticate to increase rate limits +- For Docker Hub, ensure you're using an authenticated account (free accounts have higher limits than anonymous) +- Spread out image copies over time if hitting limits repeatedly + +## Additional resources + +- [Crane documentation](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane.md) +- [Crane GitHub repository](https://github.com/google/go-containerregistry) From 67412c41153e398aa9feac8a69c3c8cb7aa15c8f Mon Sep 17 00:00:00 2001 From: danciaclara Date: Tue, 16 Dec 2025 15:19:26 +0400 Subject: [PATCH 2/3] Separated plane architecture from airgapped --- mint.json | 4 +- .../methods/airgapped-considerations.mdx | 59 +--------------- self-hosting/plane-architecture.mdx | 67 +++++++++++++++++++ 3 files changed, 70 insertions(+), 60 deletions(-) create mode 100644 self-hosting/plane-architecture.mdx diff --git a/mint.json b/mint.json index 7dd1a9b..f8bc9bf 100644 --- a/mint.json +++ b/mint.json @@ -63,8 +63,8 @@ "group": "Self-host Plane", "pages": [ "self-hosting/overview", - "self-hosting/editions-and-versions" - + "self-hosting/editions-and-versions", + "self-hosting/plane-architecture" ] }, { diff --git a/self-hosting/methods/airgapped-considerations.mdx b/self-hosting/methods/airgapped-considerations.mdx index 932719c..8ad2535 100644 --- a/self-hosting/methods/airgapped-considerations.mdx +++ b/self-hosting/methods/airgapped-considerations.mdx @@ -11,64 +11,7 @@ An airgapped deployment operates in a completely isolated network environment wi Plane supports fully airgapped deployments where all components—application services, databases, storage, and integrations—operate entirely within your isolated network perimeter. -## Plane architecture overview - -Plane consists of multiple services working together to provide project management capabilities. - -![Plane architecture](/images/airgapped/plane-architecture.webp) - -### Frontend services - -**Web** -The main application interface where users interact with projects, work items, and pages. This service serves the React-based UI and handles client-side routing. - -**Space** -Public project spaces that can be shared externally. This allows teams to publish project information without requiring authentication. - -**Admin** -Instance administration interface for workspace owners and administrators. Manages billing, licensing, workspace settings, and user permissions. - -### API server - -**API** -The core REST API that handles all data operations. All frontend services communicate with this API for creating, reading, updating, and deleting data. - -**Worker** -Background job processor that handles async operations like file processing, notification dispatch, and data imports. Workers pull jobs from RabbitMQ and execute them independently. - -**Beat worker** -Scheduled task executor that runs periodic jobs like data cleanup, report generation, and reminder notifications. Uses a cron-like scheduling system. - -**Migrator** -Database schema management service that runs on deployment to apply schema changes and data migrations. Runs once during upgrades then exits. - -### Supporting services - -**Live** -Real-time collaboration service powered by WebSockets. Handles cursor positions, live updates, and presence indicators for multiple users working simultaneously. - -**Silo** -Integration backend that manages connections to GitHub, GitLab, and Slack. Handles OAuth flows, webhook processing, and API communication with external systems. - -**Intake** -Email ingestion service that converts incoming emails into work items or comments. Requires SMTP configuration and DNS setup. - -### Infrastructure dependencies - -**PostgreSQL** -Primary relational database storing all application data including projects, work items, users, and configuration. Plane requires PostgreSQL 15.7+ or 16.x. - -**Redis/Valkey** -In-memory cache and session store. Used for caching frequently accessed data, storing user sessions, and managing real-time collaboration state. - -**RabbitMQ** -Message queue for asynchronous task processing. Workers pull jobs from queues for background operations like imports, exports, and notifications. - -**MinIO/S3** -Object storage for file uploads, attachments, and generated exports. Can be replaced with any S3-compatible storage system. - -**OpenSearch** -Optional search indexing service for enhanced search capabilities. Not required for basic Plane functionality. +See [Plane architecture](/self-hosting/plane-architecture) ## Airgapped cluster architecture diff --git a/self-hosting/plane-architecture.mdx b/self-hosting/plane-architecture.mdx new file mode 100644 index 0000000..ca11202 --- /dev/null +++ b/self-hosting/plane-architecture.mdx @@ -0,0 +1,67 @@ +--- +title: Plane self-hosted architecture +sidebarTitle: Plane Architecture +--- + +Plane consists of multiple services working together to provide project management capabilities. + +![Plane architecture](/images/airgapped/plane-architecture.webp) + +### Frontend services + +**Web** +The main application interface where users interact with projects, work items, and pages. This service serves the UI and handles client-side routing. + +**Space** +This powers public sharing. It lets you publish projects, views, pages to the web, so others can view without needing to log in. + +**Admin** +Instance administration interface for workspace owners and administrators. Manages billing, licensing, workspace settings, and user permissions. + +### API server + +**API** +The core REST API that handles all data operations. All frontend services communicate with this API for creating, reading, updating, and deleting data. + +**Worker** +Background job processor that handles async operations like file processing, notification dispatch, and data imports. Workers pull jobs from RabbitMQ and execute them independently. + +**Beat worker** +Scheduled task executor that runs periodic jobs like data cleanup, report generation, and reminder notifications. Uses a cron-like scheduling system. + +**Migrator** +Database schema management service that runs on deployment to apply schema changes and data migrations. Runs once during upgrades then exits. + +### Supporting services + +**Proxy** +Handles incoming traffic and routes it to the appropriate services. Manages certificates and reverse proxying. In Docker deployments, Plane uses Caddy for automatic SSL certificate management and traffic routing. + +**Live** +Real-time collaboration service powered by WebSockets. Handles cursor positions, live updates, and presence indicators for multiple users working simultaneously. + +**Monitor** +Used for license validation and activation. It checks the license status and ensures your instance is compliant. + +**Silo** +Integration backend that manages connections to GitHub, GitLab, and Slack. Handles OAuth flows, webhook processing, and API communication with external systems. + +**Intake** +Email ingestion service that converts incoming emails into work items or comments. Requires SMTP configuration and DNS setup. + +### Infrastructure dependencies + +**PostgreSQL** +Primary relational database storing all application data including projects, work items, users, and configuration. Plane requires PostgreSQL 15.7+ or 16.x. + +**Redis/Valkey** +In-memory cache and session store. Used for caching frequently accessed data, storing user sessions, and managing real-time collaboration state. + +**RabbitMQ** +Message queue for asynchronous task processing. Workers pull jobs from queues for background operations like imports, exports, and notifications. + +**MinIO/S3** +Object storage for file uploads, attachments, and generated exports. Can be replaced with any S3-compatible storage system. + +**OpenSearch** +Optional search indexing service for enhanced search capabilities. Not required for basic Plane functionality. \ No newline at end of file From 3cb93e9afe9a37f9b2eccec74ab65252a3a9050a Mon Sep 17 00:00:00 2001 From: danciaclara Date: Tue, 16 Dec 2025 17:17:35 +0400 Subject: [PATCH 3/3] minor fixes --- mint.json | 2 +- self-hosting/methods/airgapped-edition-kubernetes.mdx | 5 +++++ self-hosting/methods/airgapped-edition.mdx | 9 +++++---- ...-considerations.mdx => airgapped-requirements.mdx} | 11 +++++++---- 4 files changed, 18 insertions(+), 9 deletions(-) rename self-hosting/methods/{airgapped-considerations.mdx => airgapped-requirements.mdx} (90%) diff --git a/mint.json b/mint.json index f8bc9bf..88b2838 100644 --- a/mint.json +++ b/mint.json @@ -83,7 +83,7 @@ { "group": "Airgapped Edition", "pages": [ - "self-hosting/methods/airgapped-considerations", + "self-hosting/methods/airgapped-requirements", "self-hosting/methods/airgapped-edition", "self-hosting/methods/airgapped-edition-kubernetes", "self-hosting/methods/clone-docker-images" diff --git a/self-hosting/methods/airgapped-edition-kubernetes.mdx b/self-hosting/methods/airgapped-edition-kubernetes.mdx index f7180be..4aea8a1 100644 --- a/self-hosting/methods/airgapped-edition-kubernetes.mdx +++ b/self-hosting/methods/airgapped-edition-kubernetes.mdx @@ -3,6 +3,11 @@ title: Deploy Plane Commercial in an Airgapped Kubernetes Environment sidebarTitle: For Kubernetes --- + +**IMPORTANT** +Airgapped deployments are available exclusively for Business plan customers. Contact our [sales team](mailto:sales@plane.so) for pricing and licensing information. + + This guide walks you through deploying Plane Enterprise in an airgapped Kubernetes environment using Helm charts and pre-packaged Docker images. ## What you'll need diff --git a/self-hosting/methods/airgapped-edition.mdx b/self-hosting/methods/airgapped-edition.mdx index dbccc2a..77913d0 100644 --- a/self-hosting/methods/airgapped-edition.mdx +++ b/self-hosting/methods/airgapped-edition.mdx @@ -3,11 +3,12 @@ title: Deploy Plane Commercial in an Airgapped Docker Environment sidebarTitle: For Docker --- -This guide walks you through setting up the Commercial Airgapped Edition in an offline environment using our pre-packaged installation bundle. - + **IMPORTANT** -These instructions are for new installations only. If you're migrating from an existing Community Edition to an air-gapped setup, follow [this guide](/self-hosting/manage/community-to-airgapped). - +Airgapped deployments are available exclusively for Business plan customers. Contact our [sales team](mailto:sales@plane.so) for pricing and licensing information. + + +This guide walks you through setting up the Commercial Airgapped Edition in an offline environment using our pre-packaged installation bundle. ## Prerequisites Before we get started, make sure your air-gapped machine has: diff --git a/self-hosting/methods/airgapped-considerations.mdx b/self-hosting/methods/airgapped-requirements.mdx similarity index 90% rename from self-hosting/methods/airgapped-considerations.mdx rename to self-hosting/methods/airgapped-requirements.mdx index 8ad2535..8688d60 100644 --- a/self-hosting/methods/airgapped-considerations.mdx +++ b/self-hosting/methods/airgapped-requirements.mdx @@ -3,15 +3,18 @@ title: Airgapped deployment architecture sidebarTitle: Overview --- + +**IMPORTANT** +Airgapped deployments are available exclusively for Business plan customers. Contact our [sales team](mailto:sales@plane.so) for pricing and licensing information. + + This document explains Plane's architecture and specific requirements for airgapped deployments. Review this before beginning your airgapped installation on [Docker](/self-hosting/methods/airgapped-edition) or [Kubernetes](/self-hosting/methods/airgapped-edition-kubernetes). ## What is an airgapped deployment? An airgapped deployment operates in a completely isolated network environment with no external internet connectivity. This isolation is common in highly regulated industries, government facilities, and organizations with strict security requirements. -Plane supports fully airgapped deployments where all components—application services, databases, storage, and integrations—operate entirely within your isolated network perimeter. - -See [Plane architecture](/self-hosting/plane-architecture) +Plane supports fully airgapped deployments where all components - application services, databases, storage, and integrations - operate entirely within your isolated network perimeter. ## Airgapped cluster architecture @@ -21,7 +24,7 @@ Here's how Plane operates in an airgapped environment with internal enterprise a This diagram illustrates a critical principle: **all OAuth flows and API communication remain internal to the airgapped cluster**. When integrating with self-hosted GitHub Enterprise, GitLab, or other internal services, the entire authentication and data exchange happens within your isolated network — no internet access required. -## Connectivity and telemetry +For a detailed breakdown of Plane's services and infrastructure dependencies, see [Plane self-hosted architecture](/self-hosting/plane-architecture). **Critical guarantees for airgapped environments**