From 8f66befbd014c028e4d95c325cf5597a7ccd7458 Mon Sep 17 00:00:00 2001 From: sonicaj Date: Fri, 22 Sep 2023 15:22:06 +0000 Subject: [PATCH] Publish new changes in catalog --- community/briefkasten/1.0.0/Chart.lock | 6 + community/briefkasten/1.0.0/Chart.yaml | 25 + community/briefkasten/1.0.0/README.md | 11 + community/briefkasten/1.0.0/app-readme.md | 11 + .../briefkasten/1.0.0/charts/common-1.1.1.tgz | Bin 0 -> 61729 bytes .../briefkasten/1.0.0/ci/basic-values.yaml | 17 + .../briefkasten/1.0.0/ci/extra-values.yaml | 24 + .../briefkasten/1.0.0/ci/hostNet-values.yaml | 18 + community/briefkasten/1.0.0/ix_values.yaml | 73 +++ community/briefkasten/1.0.0/metadata.yaml | 13 + community/briefkasten/1.0.0/questions.yaml | 539 ++++++++++++++++++ .../briefkasten/1.0.0/templates/NOTES.txt | 1 + .../1.0.0/templates/_briefkasten.tpl | 70 +++ .../1.0.0/templates/_configuration.tpl | 77 +++ .../1.0.0/templates/_persistence.tpl | 53 ++ .../briefkasten/1.0.0/templates/_portal.tpl | 35 ++ .../briefkasten/1.0.0/templates/_postgres.tpl | 6 + .../briefkasten/1.0.0/templates/_service.tpl | 26 + .../1.0.0/templates/_validation.tpl | 65 +++ .../briefkasten/1.0.0/templates/common.yaml | 14 + .../1.0.0/upgrade_strategy_disable | 31 + community/briefkasten/item.yaml | 10 + 22 files changed, 1125 insertions(+) create mode 100644 community/briefkasten/1.0.0/Chart.lock create mode 100644 community/briefkasten/1.0.0/Chart.yaml create mode 100644 community/briefkasten/1.0.0/README.md create mode 100644 community/briefkasten/1.0.0/app-readme.md create mode 100644 community/briefkasten/1.0.0/charts/common-1.1.1.tgz create mode 100644 community/briefkasten/1.0.0/ci/basic-values.yaml create mode 100644 community/briefkasten/1.0.0/ci/extra-values.yaml create mode 100644 community/briefkasten/1.0.0/ci/hostNet-values.yaml create mode 100644 community/briefkasten/1.0.0/ix_values.yaml create mode 100644 community/briefkasten/1.0.0/metadata.yaml create mode 100644 community/briefkasten/1.0.0/questions.yaml create mode 100644 community/briefkasten/1.0.0/templates/NOTES.txt create mode 100644 community/briefkasten/1.0.0/templates/_briefkasten.tpl create mode 100644 community/briefkasten/1.0.0/templates/_configuration.tpl create mode 100644 community/briefkasten/1.0.0/templates/_persistence.tpl create mode 100644 community/briefkasten/1.0.0/templates/_portal.tpl create mode 100644 community/briefkasten/1.0.0/templates/_postgres.tpl create mode 100644 community/briefkasten/1.0.0/templates/_service.tpl create mode 100644 community/briefkasten/1.0.0/templates/_validation.tpl create mode 100644 community/briefkasten/1.0.0/templates/common.yaml create mode 100755 community/briefkasten/1.0.0/upgrade_strategy_disable create mode 100644 community/briefkasten/item.yaml diff --git a/community/briefkasten/1.0.0/Chart.lock b/community/briefkasten/1.0.0/Chart.lock new file mode 100644 index 0000000000..9cf4c9b651 --- /dev/null +++ b/community/briefkasten/1.0.0/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.1.1 +digest: sha256:a7dbe3e4d42dbcd4325776e5e01a1d630c7f185f79e7ebf22b1b9cc80f56eed7 +generated: "2023-09-21T17:36:42.077526429+03:00" diff --git a/community/briefkasten/1.0.0/Chart.yaml b/community/briefkasten/1.0.0/Chart.yaml new file mode 100644 index 0000000000..6a4369506f --- /dev/null +++ b/community/briefkasten/1.0.0/Chart.yaml @@ -0,0 +1,25 @@ +name: briefkasten +description: Briefkasten is a self hosted bookmarking app +annotations: + title: Briefkasten +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: latest +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ + email: dev@ixsystems.com +dependencies: + - name: common + repository: file://../../../common + version: 1.1.1 +home: https://github.com/ndom91/briefkasten +icon: https://docs.briefkastenhq.com/logo.svg +sources: + - https://github.com/truenas/charts/tree/master/library/ix-dev/community/briefkasten + - https://github.com/ndom91/briefkasten + - https://docs.briefkastenhq.com/ +keywords: + - bookmark diff --git a/community/briefkasten/1.0.0/README.md b/community/briefkasten/1.0.0/README.md new file mode 100644 index 0000000000..c08aebf36b --- /dev/null +++ b/community/briefkasten/1.0.0/README.md @@ -0,0 +1,11 @@ +# Briefkasten + +[Briefkasten](https://github.com/ndom91/briefkasten) is a self hosted bookmarking app + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `postgres` directories. +> Afterward, the `postgres` container will run as a **non**-root user (`999`). +> On each upgrade, a container will be launched with **root** privileges in order to apply the correct +> permissions to the `postgres` **backups** directory. Container that performs the backup will run as a **non**-root user (`999`) afterwards. +> Keep in mind the permissions on the backup directory will be changed to `999:999` on **every** update. +> But will only be changed once for the `postgres` data directories. diff --git a/community/briefkasten/1.0.0/app-readme.md b/community/briefkasten/1.0.0/app-readme.md new file mode 100644 index 0000000000..c08aebf36b --- /dev/null +++ b/community/briefkasten/1.0.0/app-readme.md @@ -0,0 +1,11 @@ +# Briefkasten + +[Briefkasten](https://github.com/ndom91/briefkasten) is a self hosted bookmarking app + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `postgres` directories. +> Afterward, the `postgres` container will run as a **non**-root user (`999`). +> On each upgrade, a container will be launched with **root** privileges in order to apply the correct +> permissions to the `postgres` **backups** directory. Container that performs the backup will run as a **non**-root user (`999`) afterwards. +> Keep in mind the permissions on the backup directory will be changed to `999:999` on **every** update. +> But will only be changed once for the `postgres` data directories. diff --git a/community/briefkasten/1.0.0/charts/common-1.1.1.tgz b/community/briefkasten/1.0.0/charts/common-1.1.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..da215400bf5535702a73bbe170b4d3d9f2e7506b GIT binary patch literal 61729 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

w94_a7T9WZywq>9u|8aqvEs}|3T?gFX-2r zY&^tF)dtMV*<2>mYs1%{s;gVaLMgE|PX^idPGx-`yo=M~@* z?$5eBOVQo#B`$R0=9Ij&xo<$;U_J!Id%r9z&93O^rh91D5VaWcCtb=o2&{?a6$4(Qf_>B z1r4Bh(OtM_ya#z9k_J;qom_eB_)rsq5xTpkK@Pu}M#KQJYvKn_@W_5aEa+KD{{oaX zeAJyKJh)-$1b}ou?jtnQmKzjS&XnJ%u}rOw81wzdG1T+U=eJSG=TLuVq5S)5 z(dc^@xfMbLX1%AZcH;TGS}+H8pP+*S0wq(z^09q5J?GJ#q*}hC_jpPDJyR4>0LVOJ zVqi(!q(2@VsN^hv)SR6ToR(a2tX|$I9gTqVVsl9!~CuZu%E3whCE(izv z;U$dk0jC+8X}tD@pQ#YKOhGImT0CRS-!E(lCLy;^V|J9WT zAv*VgeS~ameu+W{6S?FktdGN3+I8C|Og9Lvqd<1tH2iP6HCJPhgUrqBTq&eYrwmF(|xY9e5 z#(0-y$O)J%;gyo#f-R4s@PA#%NfDx_s&IKOJ>wO3_bf^&dee*hwctox62ZsNS_byd z3br?dPkSiE0|%~I6K4dzI;vW}=eBt6k7fS3(9G>h30TPeJ<}Wd9mW~#5(1`om3PHP zNM|3OXE!;KieZ`gSft-+*=VWX; z!E^837SPMZ2Z#!8wVwCN{%?=Ra-iGs2nf6e&;*Zt+fVt+u3!;E*Ct7cLCF?&P1`6q zl;Wg1lsCAckQdbra3Lfd((X`>qedDVo|@%3)wMI}cA5&1+w6o0LjC31$JlDjj5k9H z0fWv^DOH4cizz=|oGU@(3qiu{NhI0BM|fsgokP0A5Rwcdp8dr~Ee%nZKl~R=Y<*>f zF7QnA;G~aNp4T2SU&$<~kTc9RKwvCe9qQ=*D23GICdiCUO=yUG?}qOg7-NLdhvJuD z2S_5|35wfTA*gBQsT#7^vFYIEkcRlVNS`YE)b~er4@0ODh=ob1=|03!=Fv7bx?H-! zz_X=-vA{{l9m~il!JY+nH*>|ZP6SGV0XU+TYM)!M24U`3_?lVK8=pn$ncMV z$S+h;Z!!!g3OvJ=4dP~4FX{w~MoR=Iv84HWVE#QTfnKQrc9rQ4-ERFdq*p~PBdE{* zquGYllv6F`aVFar9AXb^m`w?-$PD&=#DAG4J{Nx>ug%0gqAxU*%Blb{S6*_Ccy&z} zzE_b!%@sYw{V<=7hCfAcKarlnO;-ZkOF&vA93J5?$%JoAZV8rG29oUu&39HYPOR_l zsG7UnWSvkKhx2n0QRF!0DEth(y!Dg)_~aQS>>T=oc7KZt34ERn+eyg~X!c2r&`po% z13OWMW?u*8lfv@5{3U-+%*y5`g8mNx3PJV03wESV+hddIRy}UDHCVYZ%Vf5eDyF~G zRPqyHZZfG=ur(RP)3y{jMY<-O;=V#BaKU6_uvzOv?VY_RDP;1o8XDj}}s<8QWmemjSsp zK;Do~C~Sa8)#r<%6sI9msLcD4)o9qCEZVfjbSqL?uom$Yj?q;b1lQ7yV!4zS7C0@h zMO9*p-+%8+2u=3qo|shq1Rvk zv|t224=`LVyGl=utOV6E%Sls2!v$ALhF%sN$Dv}>opCWF{BZHuzstO_WARlK_c5_ReWbClfXj&hwCU?uBVTCu8 zapH5sBhv#Q4%xO$99PRz&0(hk1czW{9O5hJM8T9%93Jo%=d=bBD05^oZ>CsxR^so64Y9-|A6QR`m%Wnt zuo6Oygh7o?_u8)Kt)PCurMdji9gNzl0CnvJZrtncj0yO;$Xp(p|O6BHKvpZmnA&VR6xva%7E;Hl5nW_W5} ztQ5~Wy=<#-Y`!#?|LS3TC7@3J9~JWdAG6n6`M-g}#r$98(1PzF#onq_f$D_+4Slk{ zR;K^KGw>q;WQJm(kkMhw;9wz~qFwMbtHH#!ytbV^+p|;uXK$)<{$~`>v;FJo{_QX_ z`JS=MIeRy=Fn4W%T#)WrW6sDgZaJRKofUtUkc1S#Z_*~id2hYHH=o`dVsq`~q zJIJl-n4KRyO-{)@b@R4Cb7K8BpmYZl&2TrBQJW zxTw@zNJ}!j6Y&xOOgMIS*LQ^tWNuGv-8!NT9Ji2YIJ#n58$>}F;EXQW?GckOTMeVK z6y-mGK8gn)VGu0u`7KI~{NF#?Kd}72PmT{yw(@@yg)ipU5QiegctmiR@R%&(_S0RQ zG0Jj5&1Xy>20_=@pt>~!Q5lCg>4JXa`Y?)udG^6}8LzCAuYX4I)o_4X``>XP|Lgw2 zcKvUp@b&+SK%Xfx0ieRAkTzWMVpZyT!E5*l0h)?ipG-f95mz#qF7UVW*RKGIV-nMP zuLGgSs|bv!s}yQW3*omsE_jT?*D%_ly?V&9k9{pNqV8z8?`#3Z2_9h&Ca7H-`F9Ok z5!VA+HK5`=*22D=!Z89@X%NU}XsdP#HzFEzhTjJO^3q7V=FBTF4O)Bm{rN?!7UDbT zHGuo_bAsX!2H-MGP&|TOyYWZz^X%&eOqH+(2E_WL>8>lmQfv6$}ZN?fesQ z;x;9reCMk$6-~7QWBah>6HAoB`j@PE@KIA;mgEC<`v2)!A^!W(>302ZqzK!7KGfhk zg7<6!ENc39YQCDiznqOYztju_rmbD8rJLKS2Lq({$3FDcKXe<_xkEK#-$LM#DDxiF zTeM8a){#B8sJ}ocx?rE{E%plLYw@MZ46Ws2-un~nR$aRi-Vlr$v_DFNK-~9y+7lEq zE$1S}|A@p>kRR#Mf&siyTaIx4vgy1lg_DMI$l7SMO%%`s{uCw9hY4%}9CSs(>MrPN z6RF!P%#y1ZMQne|!w=Xq!k2Sl6qD(HP!d)SrACA?k{GoJpP$NabXALl?=uyROw+XhqM<)xM>|bZgdqIw7%)rofj-an&0Lmb{69E7wB`T)@%H?GBSlPnHPow< z{<&?fo$SxQE0_Ekwwm0}9~K3EHj&$j`wU_`VXr>hih3JzHVzL^&?^hFL(DscR_Ww; zv?5DedJkS|ZOf`kx%@Aft{2t=YR~@;ZU4XhlcVkV-$n}OBE>_Fl_>&_1CUkYH`8{l(hqvVo&|N)Vod7LG zw$;(lN1u1u|Efz`r}5`PkExJrDxR--9ne%`c(-x_m1#wJ%P{molqNhPZ3xWp0V6y% zT^UQ{o2c5gb*QY7o)hJQ28BQGF(qo&1yB3$P=FvseO^frtY`MCQaxISa@46*C8VTI zh)zRZp$P@uibbcrf>5U(gd(uqd6GbHGDTtXf-PIzKC|~$KX^!`T>e`p{!3T^>g4~K z?f-MQf3S`Jx|t%*{|de#K*knZR{R&-Mp_B~!q=rX0X!Y&^$ekCf+$)Cj4wB0Auw9p zu$ABumJXS&>=)n|D))=GLbF!l=r41U!#}>s(^_qk%&A+Z_;;E$T`o ziGKtl)+TM!<|DAXeBGmha`_+4mQ4GTm1_BaaBy^bRPg`V=6~Nz5t88j#mYAP+#9i# zl;>ZRN_IVqyC&E5#|4?Lr*Lm2(RHY;WV-fYQKDC|!<|CHbu9y|>g))L9D^#IkKX&6 z?3$cQwvSPWVi+tY<7<-mH|A99m&jUX_M!nly9oCNPH{Nq35c0w2|+aTxKyLVtPXo5 z*f|A|FAN_3mWxw4EY}H%;aG&D2Rpw|#PceX7+hQe5`zSZe2ydp0r4Oc6Ddtl+{@a? z^Z8p%$-Fc^ijZ)HB_Y87Q@PIJko8>T85$c{ySjsC>Yh9T*RQ_^7uT0&SL&!r z#RBfr>D|TkJ~32Kb=52k+*OPGnP+U(X!DjfT zn!wnaBfu5X#wSyVL#tj9lj73R-xdM7S}xp~wv~i5#J{C-`X=y`U{nbKP+U-vslzy1 z;oaLcPzGFxkTl`i)GqKQFdPdRAy)&Tnddd8{K8a3DCIfN9FvN7kPQL!0~8+}(sXKc z+A(xhYs#SC%v@s}tb3NZK}InVsd>3zrqjE=M{)ntpJ^YH;wmcNkj8kn90aNfNMp_P zi%h^AZpoOq;P+zWQ|B0nTA4n`maH}C#bPqC44L}x0(gf4YN?Cjp|+?Q4!wF{FbqkO zWuGwekL7RLgY|XWMM_az?5uhUx)G%Gp2U9Fid7_@*0ttZ!-ZsORs18LGWjs}eKGU+ zXXHiXtsn*;r$LMDwUGDW>h65-~4dBxReY> zbSovdLTM#JDIC!yh0?+h78gpJTlp@AXKM2;te;I#bmfX}Y*N@}bziEK+kfLbxFQ2^ z?ftJ~+yDD?e}8-bYa>Nm;r{;oVpS);;$D3#1F-l+_m@(ks&aA9jYrDL!#<$>W|=Ga zG%gK6=QKI9Pjp)||6MRLbHJN8FJ=wZ9TT@U7TJbbN8C_n1T?edwRy2SLcKlQ6YJ${ z*KF}M^g8Dg@#`LZUXG+a`>)tX;1ikypCF+ea(m}4fRv_FB;zO+Ew4P{-~`g2(cB`4 zFq1R5U5B-_#DP%z$cXG%HH}tycq>@fBledsm;ZEGx38?!-v2r%SXQK&FI0& zs%=?)sgnOZHrEOifI9hqa%#taJw4gp|K3cI{7;1HTagJMi|W==0gzv{Fa)SM+RPN7 zYPYin$gfPrLp*Y59-@U!m<428Tg$)$R)v<;SHy~Fqk4(?w}NA`3dKlFes#+94QWV{ z0sWCwq+0neL$EHR2Gq*`qr&~~{gdteuZ!mmu^x~G@m)k6$Ubhb6(|nX^rXO= z@C#`Pih@ODLA@!{8C0_yR2^iKTMgn{*C5owZfyGawk3SVQ~pSTzND1P|2z@XvIc+} z`G0h_e`4?d&kncpe9CC=J0;#&Y^zcl2|u2KdS%l1Aa?}EBP~=g?~?8`{!~26Z*3SlR^^9` zFeTsZkSR{Gyk%WUBr~_^(-N&lw@E54z%gA+ny{nk!)8 zp%ZLI61NNznq>N9B%plCW>)IkMh_FQlaGfy404r66}#Mfj9&c z6ikgYj#3a{3R0TFAei$U)e{&+Cyd4<|)gy6? zyg-*6=Q(!wI0$&QXGq!RAt9ifkiWrc&|Ol}XbC4lZI1fFH#tXr3WGqq1t^dMeIx!Q z9x0+y(B%|mzh@}s0YrGZ%!GjdxPJSltHawfqM5SIvZ8B30G*I~^)m}yB4EpY=cW?n z)9oWZYWHj}mU@jte+#wI9Oo2}FQP27^?B;h3FB33E2?Y_1 z*+@YuLe276CkdM=Y{bXtGnm4}n;`y_Pnvre`*{>xZD*C83tVumWDiKXs0j)~i7lU2 zQ#fZ61%epSG)S0UB4=aY`j8Pl>*^5vXZW8X_|r`Me~lCg;2oK%dy##8T$}-bAG$!5 z{QvN1|G2;3KN$4c>c-=c#As!0)bM{E?Azr3M<-kV@6D7a;0h)QibKvk#K4PyJa;J$ ze6}Pa=zW4?MEjj5g3Hr1ib$MLKqn{&z&IdxV)5c|ybEF!zy!}2YfdKGa~S%aCm=*) zVZ+^tVl={^kuSK^f9>@}Xde>tFBwW8LNN$%i29xWi|dcq35ikX3Ahky`1^}%;NzHf z`eU37_`d@EPXF$o@qquU9!$mq_K*5WXW<|RbO*gpX#_?%K(zC$Pw%77v;H0Y)OprV zrtEJL<8kNN|G)DDyoWI+DFv4=UeZoKiV2fNoj&#v9Ej>M`A4TeqaN|m;6W~UtJv$G zv()|^PFIroUz9rkkAuT~d;K3BZ} z?c{|mKnC-AI~rjR!vI{s1O{Z>={y1FvI^4z?+`#ZneZ?K;5!&a0rofp_zo~x3ciz2 zzZ2i|J5LyZyqb7Sc^+{HJQ4&l1{xVlq{j3~o;l!l%-Dj1PiOOxuO845^*;y$>Up!s(( z%2X}@S-UU`?dI`QA6V=sW5S`-zX?TJ!%ShyTjrhPcLKS#jKgu~35alnIKQ-e;}fn~ zOC6R6NXuv^Ej=+BG1l+#5HKcrl6i!NYWO=!3P@Xzv>FLA_r)vu3xw(P4#i9*Wm@GO zCr6B?C`^zK5cDP>!BYh0Bn4CW35gICYJ_s&LRHL_c)Ba;suVUDMHvQ+ON&3nq(RE` zo)9o1K|t=oHJZXO!Jewf!0b$tB%;H?fTHOP#eEWw2ffZrEe*vV?cQ5Gl{PPZT<;JA zpAoZ~K%FNINu&s*wbVEJEpB9HeeXP}=)IV)3XK?z0wlG5g{a*tzSm=4c3>3c4CLT3 zh`epliY@=&y*z*M`elFWudt0e`_Dna|Ksp%e|!I9BPADn7gb`NJ>wNRooCPfdj9Us z<(nUe;O3{xYjE+?`MVo%c@5sYy#cRZp1-*PH*dlBFTv%T>zngeuU@_YFD~D`ytsMw zw`b2f9mPE%`1L0gOwHy$WNesiL;G|x@QFtU35l>r2T}rk6hdwAgw^Tw!DaFt1yLGD zOkQFkl*chiBgS~8%|0Mw?14L!+#@8o*{46#|1lv`DPw3KbUN2K^q7_r5N;)qvQx56 z?idHB`R0V%m6T3&4=LX;akEK`{M18W3UQdA5Hg@1p^4GF68B7Tk!BPwh~qhc-UOo= zLu5=~z%UUqPrzlE#KcdzCLjqa1f^73sOq&6m|%i}2*niKPp~&pic%^K zXHsneA-Y#+ao#Qls4yfwrD1_74B;5X{Vmgfyv64K`9XlX005W108nTDIX<)R|D7Ej zZtXuCDLg>7G=x}wzeU@(^4BvahA?^?`^baNCmi}ib+17B+jf*!)35`8*l6m;cnMs% zQ<whDKum2nUh)jfyqyRDXWT-*T(B~G{T>alRUi%{Z`6M1g6wqOHlnBQcpH$xL7=; zGw)^|iSVQH6D#>cx1O)M8LEMg&igtA7dC_c*$hv2ol!W-h{M_8A&|$K)_W%y)_)gF zJ?60H%_742metW73@uz7y|56_f6)ke!yKs{5`!J|TRuSD3lU-J@~YbdJ7^ju^Xz4> zC*TSDSXQyvMNhpF^|PO1yxf)k^)D3qIq@`K#SFDK#79>oPP#f8dSbwQ8oO*x@CiF%`agLL!?uVPP-p+yKR&hZ|DGOh<9}|XaQXjEc-#nY z83e@PE>ET6`#i%d46cZ3} z@9%J*NLhZ(tom?Xp_fdnRh>D6y8uCm&h zfEJ;i%YZ6D#52?|cHb}ZdzoxTilcrgpZAnN0zf^I4Jy8#3vPp9SI12LgK@+^Rw?KI z0lph>F+cdIX6Zvq;Yo0ACoA?{CaX` zd*F)S3y8P@CQ-JZ3e8WSFh2i|qNJY#%uPJPy3~bHLqsP5&xGqltm8!>iGXr z;r`Fr@xkeq|8Jt``k%Dk@?23qfL=@}tzZ4hdd!xt^4j3@rs8-{nh*OzC2Vf9%T4!v z;i!C`d7lApERXu1(mND~C_%K3$slv!W82`uCl1Bb2}L+M_{!ke{+xe{HQ86{QjX7t>%}=fB5A|NpbYlkNHMMhfRu zFF!}>zQ2BTUwY)1u_&FnI1X%g)O~p?k!W5wR2dS~d&!~s$)#cstkT;Vieu~}ehid` z9ymRcCqm+k6?FHyJ<$4GH!L~O4O^V#3Y9jGK2wkbS*Rz~$x#{vbMRXV13bb^B193V zdcX5mB)Z4zC#;if1ZZ~El9DL`KWE%qjMWIEz!wK~0iI&%>CT-KckbqV9ACV-W_5Y) z`v`fxe&=!oBvThavYVU2k5Gi}$uHTa^5Q1s$V+Uir$v6^zR1+jqBST$*&L8nO5az^ zkxU-Q<4|K3HlBnzjv3hm5W@$_gwOhHylpa*i)a>OVwzB&hK*t8((%D8n6kB_O-jb5 z)SU!K#l)1eT-4%vQ{Cj0>ZgH{MpAtOh`)1%F-B1UJp{V{tqZyzyNza>-lZ2PLGhHK zWJlQ)tC_^W*Q^*Z(0Bbc-Euk2IaXA$TG`sFsM&IrX(X0F_cHgvohDjmuO;nmqk>@w zv4=wEg~Az%b3W+%00Jt2X4kDWwuwg|pX~rsKvB8Zq@!00vc_hs)mo$$qbMxaoJx5T zwS2vrUptod)_C(cOO5_71RRR#;3EoWI3^)ClD69l)ad_5`v-RX_k)v@ldb;0iK6>| zXd?_}FvjpMK;=f?Y-;qi@7~MLG~R~7nR?2%{W&MI*go|pXqtt*L_ec>?j)9Zgz3<_ z-UNA{WW4}W6?3y^a7+CYVJi3`Ce!OYcig&g5gE4xrG) zSva|6klvxuP)1pCgUS&w0kZN5&C5Puvc)vQ2_p#is*2rqdfvw~yMif=t zOVLn+LGbdykBa6YTsj0OoVhQp)XqPJnC>%MH3nZ>5^c-ZD9!ahJcZ-ME&ZUHDCV`i5I*CTzCGzZ|DC$+&?(m`hRYunCoBo$uGJ7)#u#hoSG)c++ANf z>ucI6(^5X~3TJ)JC-TY*GYbyO!77xqewTrhmZXw?@efv3>+`(U5;?h6UY8lU! zi@nZK1WFS^6Loh>{jEV!k2qh^o%M^5#3{?~zvp`<4j~k05XFP=tq!;?d8y|A`B4NN zd`uI(m=jnH|35s~-!J(8Z{z=MrkMO+J9<)gi%U7a<}<763SRHLm7Lu!FTa>=#c5dj zCZ~4PlXWmgJcbz^&?JTl8qWs`T$6r^Cm(5qJbC9qg5&sRZVU(60h)Txg^Fr&sNdDi zKI*6c*|2x`hUPQ!yU~|K~IqrgF+-qq? zDtU0HQOr=JT1+rc+dSz309>?c;>XVECqf70F7htNOXr&I8)m$%#_&y*YWW|cUqv%k&%xS1k6A>Leri$=UEpAdaNq{cVh+%cHF%k3H258*s* zyfZv@<(C4g{8Ic7m%6hEA9*D!AjH<~w{59j|1qK@jXgvMA3d~S^oM%;&*^?){U7dc z^S^AQm?}&Xr)V&OGT00oay-J^9~DyoXAlScSPzE)f4<1ymYmyfm zjF6S07|&pWKB0mw|3Mnv8uNedT)tQgh}!eNvx5KE@mBxaOyRr<007>}p$6JOD`r&A zi}K2v`nN;k{B{@5fUSVPV%2H(avY_G3dt=T8E~fbarktow8JW((zVHpQlV$6q>WL^ zE2#HVG$rxes4_*6e!}{qNwY5dZghYyaI$5%(;Z+~+P<5OBFqM&J{gi(5rfXJbkq-D^<;{7Gg`%txUMc8u@8fPWAi zg6=NR6*Z%Ey&obHTufAmQwI}wrG%7XxKOr$3qrpcQ zMc3l*)yMxiKC?)GtRg1HPY z6pZfbH>eiQ#`e_i4--1}Go2B;-znL_cIUg`DV$BY@3dVxhm#%YC2@-Q2U216vkQ^D zwb?Xx7AfAs%WhlNR+Rdn?lm7~v7e_5yDOMX#0v&1d!+l6@HaHQ%b&|1`FF#Jz`|0!6~A&A=KC_|lscD{>;fO3h}>6(A;zPVs$nU&NtI7ny5R|0q6}qGuS@2t zJt1{p{*pQDnwI&jES){#OA?Ff(@Gm3ow75&CMkx!|Ev8Ig zJ%1^X$zrRjsmHcRI7Ys7nPTG{k_1qcbdB%z*rr*uYj;TKCEZN%XEj@TW-kAQ+JQ4y z8$L`Rm6wOCR-VpC@Pfe@{zYU`HY#(PXb*IBvq_RY$^d8NF7!bzmROoEf0E?>AtqD& zKLwa>j*~OMYBZadUIjShz__N^_`MbH*hepW5BkVB^YYHn8L&^25WHQaCOV^ZPFbK#! z@;|aRMBD=*_oiXe1zpM{Vb@2qF6hd%7+q5c3KgiIJ<9;IrawjuB8>u^yy8#?-Ri14 z_c)o5G|8TIwdS(=JpKR2DIN1qlx^lR;~5G; zL`VQoe++I1(=Zt%F#I&2WQthTTY#zj@_vG11gWTX%k;6l{w+7sVTlF$45v|mXrG77 zu)ClPZRj_!!@cdZ4)6B_?R#J+NWhMI`~?Ik?13W_lmf@CM;ck|=2X&>lJ<%tYvJlb z<*-=02|5i>I$$Uz{@q6rsqf>A1P;_%HI{|dFCxI>_fH^o5XM{_3zA-Iy86;>w)S}v zWlgL2j^=EjUZselpR7fXtRx6CqYuI8t#rH?8clT+QWCrJK@y^nB{O(9{LY~@1- zu*P%+Wm|wMj;I6 zuA@Npdh>#6*G=#;Y|93#-{@=iGAtfLbtkSoW-12J=)iT&RtzPgUkWhG8QHlArfIH7q3x zR<;Rl2+NT#=ke@D<@#So+V`x~p8ubo+4mE%UJR1mkZ+u+VF7f~Kg` z*|QS)4tW}_s~AsVJRgGFr$3}Yz?RM}fAKb%pqT2<_nuxCA_?Ah_Q1RE&o34L#y(RZ zB;dtSQh=_APZxl4MSKMzvsLjb7y5~fd_BVB*Dx{xWRLS6c`-_CTva3|Uc-X{0-ArL z1rfzo)t8?W6o)VXmtlh95zm=?i$Cu@eV0cg+!Orww$phIeo#?f!QOLlYu4fcF$MVN z;5?j*dOQm(`s^X(Qx&)tdI^f@u85_WOk#2mUZqx-ySydv< zf4xA|i!n!gfp$Azz;JKb0x}>&=bw2oA3CeFYPa(xcTweIsY5M+79o%FXl zpr?i2bO+A0wwv|B(Sa!rvz*IqI)FolzwE&O`CmZ&4YVGq%Ha0D@9*#5ieImBh^Oh4 zXL<&_*>hoRY}B&Wfe{RXJLr8;Ps$%U3$chcd zpk)Vcvn=7ajt*3gfsTA_2O<Nr=h)z2gfL@>@Q=LngiETdc33fQwS5KYk@0;Ugl zI;^k8!eP)eEp`Z)(#gnds)a+4c-mu8HPeqe09Z=QFmsE|plg%ap3c<+SvH%>=2Q8M zDx27asr@w(5>wKc<}J}VDZ%Ej6r0oi3i{*|KDUd=+=to@kc1#2KGkBUb~@*5ODK}6 z3H~X)i($N9j#Te29s z!p+|sQ#jjTxm1H(FZiM<1z!N;ZT}>pJP*J!K^K~#c+P#;#ANq)w2K-V=OOgub?|zW zvmHqrl;1UlU(>n^WpO>e9P-0Ox$i}33Casij7^{{Zp=Rpl-0%mvX36%#84=gOpS+3 z<&vrK5K(^f{_@4;`Nxa%t83>+0Ne(cww)L{)E$2RPH7$7=EX(*k5|7ijvYZtk>9ID zIU>Fcms8iz#pbdCUbL+<4QU}N=P1joZ_)+e6%Id96Xn}GLIMOsr+u*uoW<6ZBbTkA}fLoKuj%Pdt*0hkO)zs8@zEOcTO=txboq8}bQ-3p2TDpvzKO zB$4HV_+tz`bY+;-`T1qJjkR=QR03^*a_8Uv>)sx?dHdq+5L`~9nDCh1*-n^(y}jqA zEmpVU-TZwBe!01D$K(PkWYzKhz7@3U&p+Z8(XD{4pNPtPOwxC9Dzm3W@j4V?dF1VK zDaZ1MhNKvRb3PS20B8YerRDAi9MeR+$pg*;<>8`iPwI|*=#zwIml|Xa!tP;L;vsp^ z5d8X~1N0>>pV%vC2)f+PSusoVK2=VPAvoH1TB)v)m&Q1m1GzT07O53mq_icsR@>Ba zPDtyuLm3Q`${DAGK{LuNvQe<-b|vjf(CZh@IM;`s5mkq_M6ZAK%jJtQ^cE2`9G+uK z7^h)~!!dvq#DpZhhUoqB`uzH5H+lR3T8eFCkozpiYd`C!Pqqm4=(YUlg?-yE} zg$oYuI?($uCTa9A(UY--*x>$v14QRELDL5_xcpY{Rg7miKx6ch2{RQR^dX=ZDa>qF zz=wezMV?2d(N#=F*f=~`kS(tjy?&CpuPw;;){9=0QSo7*r{}OSKYtK|YoyqLzHgwn zz^;Ft==m{;9s+t1sdXt{r9$Ph3D=<4A30^2j^0-jY8rYM{2oQoeE2n2E<=x|Q4}D4 zS0r%I@hi{0KAlr9DZkvXe)O6dUK}Ku;})sjzUcy}%Hhoc@{r;;Q!$bockUWrN!-GUa*5qX_1YnbMknnk$OhGpBZ@ z!70;^a@z+0xsswkHKm)f)`%2)?}V{M(peayG=8ZnL*JLy8CDn*9cBieJ#hZ&l^TUB z;+NB(aiMa`N5t;{_OAdvvMJ?A&In$Ro|72^`D6A}x9P<>(Dbu0&*dG1LDh z&5F`~2=kj-95w|h522n+5Ev20YS=H2gfkR!E|cSOPvTD~zFZok8}9LhY4}|NU^q`E ztVJG5jUg3Et0kk82&)EmZbLXlyy4s4F2Kom6#OHl34j`+{mvzO4g*R6RA2H#a!RH= zR*<;roe&aGPLY%%!J*QGOksjOndV=l7p48q41?@&l)FhL)7CP@;};ecNb z?#J@+9pPyz2UFsw0iuH`4B;5Xg9!?zd%|Knc#>0p4~GIrOv0WVf9)2Xao=><>Fj}D z8TkVO{SQ0pul!|FB+bKDr-vv>(NWMtD4h5pPKRnYZA@ zC}9n-|JBnh$-lU;Pe1I~Pb>_jkv~IJ{#Lc(JLrAbVgF{|Nmq>zJL)gvjTRI@*3h09 zHC0T2EF^%eUwE#*3Q2B=zqi3C2)kr0X$wuY)26BSWj!mhL%7cc4Z4IQg1LO4=DV(CJtbKGWI9F)qVZ^7sQK#~cH_nLL90Od<& z_?V_af=}>`$p|iC*?Qf*8NsQ`{;AWC*6d*4l zaqZbwrkQ*JxBSc7j1r<@Vc_C4NC-E8HK9Z#0zWQ8iEEVDU56Ctfa{Q;iH}2VPS{8o z8w)oQ_Y=ev0M>OexIh3UF*l<$Kq5)z#>89+5)5dLLcNYy$7T8zJt$WzUC}*D70O;` z54<7ap5voEE5c``QmUb*w9?lkMk2u`)8TKkO1H|jc0|(97aUj^MwzIFq5ok={-F$W zFdownJM3TeL~|1Uu%rD@?*lwS-rNh&hn?)t%r+X6J48S1i2pM~q;dfNu#?|a%T1yB zfhD(z8t1XH9tvka#ANzmNB*InkML*YzYJ#|cGO?m7reIi`xT}Mf5!gM%#aQxU(Fh( z-5N8fOcjpQDCbYaOjG)CKH>7yL34D6TFQZ91ELh05yjwvL-A94&DU_@qa;y)_?g3# zC*U%~i6+yV%i*<1VRuW-Me|w&bGfv}I`Jwb_Oi0tXvdV-PHNTQl?m}Wp`}aCTJdcn zxe#7SHlG?xbSJ$y921`%_H$R+%XfjamG_ujc@D1AC?atp&L9Mvjmgw~c*NPrbMS&7 zan8W>gk3G(~w z3*L_wA8{l|C_;|N&-Cr%@DA^elP?qjK@2)*9Vs);d3Ic~fx{P@e|TDPHnj>)&P zMPc0;vVV0LYJ`VIy0yLR#a0|Y;Nq75xrJdBZPexeIXynI!B+lnq=@_vF!aBM z3h)&a08P4o1=%hQubkjZ3q%R0o#kO{_o^$d;YtT@&vpLXJ2RgSI?_Uy$mfU!V~-bEuz?Bg|ikEt@KmWJn|fdSQO57XpirwoOuE2Y0CJ@ubwaj8H zUFCwga6}S*a@}shX3XgF3C#z>YpP8#Q0-@Khd-nFJ2Y~kx(rokFvk3Rls~SsG3x*M702XDOAzt2!{S!p5lpzK&v?*H&MN1 zDhBVt5GdX)Ou%*)y`FG08CUz7zKV6k6Ui8X5d@T({fbB zA3XcBjp{NJfI}5|w-+cSsKN-pM=>qvK}A$6scNBG2DK@wo##y9#4!n{C`_`kp?bQQ zTNKW2v-?!kgCTpt)DA!8;o}qGIn#L#?oe`%P$)c}<#f|7GEugZ8AxxDfpRb5=betM zv;ebRG#KH~rvQfYe&;#3)fd#QIQO;W0Yf#JfLnXD-SRtR2~n#^#>1pMJ?2bi=lA*D zwa#;K8`Mium?sZ}v9^N`{XEtkzeGC1$Y*5WSUTDkSvmQ!E~BDEMIQR&5x?km4@J;D zkAz(RhmwRj1%VeMjwVSHihU&9{V^3eJ=bYWV3Xk6F(jaHW||9LzIp%g&H3w>2Sfhn z`}0@7ymVGLbX)}BtU}!bus=958v?dYX}<>G3E;Ok)ru37Nn~>UPO*0DI>C1ZAR;!V zS*uWq-!RDQd_r?)7mjTl^;KBJUoYTJ?LV6+-2MaDU_U$~(B>Qx zt#+GQe>Ufw=r;SXVXLR173iqcciUy};Vmp?@X>ITyOQR6(ss_2)zDkxxX5PIJg8a6 zR@B0Afvuh4r@xks9mg@#HX7Q>T3>RhfZmjjI+WH%vf8n>EHtaYv8~Bzm1A8nICY*g zNFsoZW9NaXY;rdXi@|q2Y$KQP5fmm=T^+Xf9G&Nm&E5vKdf(Ze{|DK!_{eKRRxBCAk ziqQYrV1GURziH&b7HWP$g>M;qu!*Lwq%|X6-V>#5*DBk#du!R@s@95BRhkFwD?Jx2 zDkgd};>5JjOoeMwNi)TxSFSzW%7$*U6rrly*B9rnUUIiw_N1#tJ<+Yk@0HcK+ti#a zT6+j4<@E}C-p_AJ*s~tl!d^(!%z|nOQ<;#*ZB?~DK6HQF%;IVTJ1POzeYh^rZuzfW z#9cufb@4y;5A6FtCnv}ITlv3<@&x?A#`-~cfi;dm>?m1KVnaXhE8uZ_`YOlH<|NT7cwK5TM+nN!a8@YPK z)#aPN4_)hZM-ol!I(Puz(3%fC?;l7*AH^DBdYwI$?x5|8TE0!Tk~ZA#_36iVFVA0m zeEa6r-#)&3`E$~wMXI>iGR@n+2?|y1~ZRAZYzEyUNK+d9~7+ohMT3-)T z1C>Nust1H7*9nZ1N85v6Cxm?ZpyfRk$mM=Ct$SddC^7gVqS+4mjJ#biNs>tXOM77F z7b#qpR2EC1^?(tlZ4bomCr);Cv~()xm@PGnCWI!7&LXo1*CaT{ z+=OxH?F(>uwLr(*W1wB-S+WPWgW?!4=qnq7k}*h<=qChy6w{`>s4j(tJ_Z_e95Piy zqz(fS#4&B%x3vbf$Rj^~JKN8!Pv#y{iV1sTDKcp?{!_SE;)sI*^q?0ecqQiC4X~lM zUNCMm1b^QD^S3+27?8uZXplMB@*$C3f%svf$4vX`_1o zcW``ibY}1W4$rpxzm1e9;EIp+gW3Gq#l0C6#oQ9+?;RV%CZ*~Oxro-++h7)VbgfR9 zYc`*&D(m0G3NF=@sGvlN5k*(KfK|b*s8yDVlkg&9*(Qy5XJxx&Ig=zW5AY0yh}Mwn z;Zuo`ChH6DTSEvHuyZQK2>Q5|Opk*~d0$pSCXGrwZn&NC-+|0yppxp#YNnD-C6P+Q znPta72547#)=VXJ6{t~9WL^M3V&IFk0AlyK0z#EhNw*(a$dqiNMbRmde<0sEO#)Tr zmhBQ6Q%UFEWfrPkka*E97{`&)WBDM?_Nt(K>fG7q()(wdB5E-LAE zFbf$_ViaTJGf2E>ppQm{foxq=avItULa@D!0Wu`qKXCHx_+oIG|V90Dr;Y+EX+6rmUs|Jne(GAdc# zh;0aE;w3#6%@t?VSb{zcsFVmC4Kl5eN{bT7Ld!)ZtID!us-)5g;vkLD%_K&2LIQua zR9cis1+0EA9s?BWEJvqGD$&&Q5Ty@{N(HPOR4UZbsI-%9g_%OA_A=9yCIANakYAez z2R)NYYdkEGDY3qtlM>M(^Q=J8+&)1lgAI%$4%+mLL!M$x5Db#ZKU*GT9LSRl`*IwA zc_?4nm*1#H*1S06;t(9z*aA~BIBS?((OJc23C>FPiYQddOdsusDDfH}LVYvjl6<2* zu@*WLEKW&hjC}CeDf}qT5Z&j0dXCrS+o<#Z+&?+B&i_vL54Q3DH&UK}cWSI3#u4B$ zmq2-`KgDZ#c2{{Ex28LvOMJ}n%@(kWzUCFr^57A&I4_(S7bG)vHGf@oie(_!kI`=_ zq6u9HLHA{t45UKRIv0^|OL24~*!QAT0Bat8qY^z1(4p`f@101NAUH)+63<&8Sc9L0 zSFn`W72H8fa)1Gz;)GVr!OE+ZZX_j4?NX(2K*(QKOhOleYJeR>T!CN}dfEuP5G)_y z5(Fi^TOnA9pEkly1WN~4-8zNdL|QVF2}}SM8I-l?EBqo|*6yvmZ|1m(mPd;lqXfh# z3ZRF45nDUI$)+IR7P@rHW4NiQ$#1JYdlpLp^6c3zxI-RHDdG@GngE>af=}rkibIqj zZs!zfuWv=)ZvmtVdkM1-{yM?lgr8Id2>NU*%DqSLn9#&t!tj-m@#bt3;&Ie*oWmqB zClH#Uke~keX@Go=xvIhOCXonx!|;~pA~N_~Hw}4BUGZM<0ojom)i=p5XwE z(M#&V0CJwaG%cEuqO|>j8Kt!5Ley~4B2vI@XTjy?g(%HPqM=c?MzkvHS|eK2qIJ-s z1-npKS@8NEkg_!EhzFlGL5ccGQvi{gw?E(X4J5d za9g{rN=vSidRl01`h`>}?P;+HAp{04!@8@UBP`^*G)(Xm$*tcmc%^OhM#5%MpM%hv4xtH4Kr6-FFLpUxeUe?Bf=YupGB%&)&SfdG?IsI7RUo`JLw$jy!mO zOs0YWE&1H9(Dw%njSshd@O_#`#Uxsw(CJ!($J;~p?U>W8o|(39UDt9rI%V6~Avihx zbMY15)j8fdcR3FDWm^DO{>fZLcD*$hyF0?dtFm|r@+0nYI7rAqKIs30lF+ED&sw_; z==($P>jo7FC7u=7{1_>qDc7?$UiQfFEP-7lXfyC6nWG`$natkm+vp%%Qsnyr#l30^QZkk%t?pa{-2uKy~>otx?6&F!_emE3H?i zoY&^j5Da`Y)5XeOK*rA6d}M}zX-!*~gY_3({^KbdfHVlMdC>n=g@3Be|8sJDXvcp# z*gx6I|4o!9;F66xV8af?xVH|`l(AlSw(b=N>TMex$(HCg4FLBp%K0>Ph1;L|)usxZai>fDX> z2o@r$6f+`MBdD_YsyHVUkQlrWflg=%Ia?tZz&jMUy`HThu8W+hr9qTHndVZ4USkAd z7?OlbW4by7b)cnKHbl^e32ZqBtq8V`MZ$r~%+sYLY=K}uMq^A9+bz2xf{qZo8N4ba z+aQ=y6w8F4D?u=Ww<-i9Na;O^{Z%2D!CMuAXbN$VF^=UC6!2;$VM7EH7>`kMjRNE) z=Rr`H8NM`bl#w1@4-e4eLN)(3OI3es zQOTX9zOvIhw`NB;2s{o+tPVaf1s~g`&5qcb0GUA-PFa6MfGhFE(;w0x zcmt z5(SRzutF}X^st%;Tox4I;ws-)E7>pvzol^A$0U2BnDP)z=O5XR?2Y1v{0;k&z2R(# zKW2aY4{0OsdqiCXuvU$vR0oLUaC=S3THXu2`_uWyO!VoQcJrQDwNv4N*md;Os>xm$ zHD%AOYMd+Q)yx%?qrYd`We&<-96kaAhQ9v~NwT`2&swRs{~ufXfA+_A|G$ay1n{G` z!k)kJHSElLehCM8drRN?QuQ)U>AZD5^|ih?G`wFUBu_{(x@OABMSqkRdZCG|!7UP==(U9NozLz;7Ug<3QwSz1wv9}ImkA|#P_g+=@7 z!7}Yj7_ItWt>JLolwKpJyQXi1;^-R4o(;hlE)Sl7zoNh+OoJof`r`bR$U}cKf#D}G zC*s~O4ru~|fN4tq#zfHtQ+oPL!2!Sj{=DA-lAJt;Jdl0MTX;ddbc#ZuYw%~r6M4SD z)KUglT_hcmH1q*XK)>IYfWA-1AVv|16QLYjjs%LBRRnkGI9G5Pq+JkkO$~5=A{YWp zX^Irc{8Zneon_Qg9s455!jx&Ip_=pO5lGO-U3B>$p_pQtpwL5ucQ4OhyneZf{Qn21 zCkF-l|2F@_hRPFgm5=&@mj5O^w(M|V+1&nXO~g=97CVJ#q>eN>s8~SZS!+IqiXy@? z=96rdgHU~FQl9Kzm5PA6cF@xdeaDf?3X4Uo{;x9dTdAU_Xu9;b@B$kHZI%!r-ESlaeIIlKEEQR3)=2acBl$ZTNkgHG0mSpgX zSQ&<1>!9MeFd{xDhd#H6B+hC|8)Ef;jfme^UEL(H7*0NbqeR|BV|3GJ8&Z>Pxw0U! z3hu%Wi&(jf^#8}+x9>)dTYc`|ehR`4kg`!$yL=4_*akfAnT~^Lx6$s-;9J8O$r8)O zSS2c=%9k(cH`rI$m)j@#z^f>Uk|>p2c4x#H%#?K@4}YY{a}Li%&8kF(hOV({S zbSoG=*9;bgAkS*`mAP*XU}+3b2e6DtWmQ&$g)y>PFM?TbV3k<1j(nDDZh{^SkPKF#Xg|q zW+Z>fJ5rByqclqLj?^pNjN~tQhbxtCM*RQsDpxt(jEMB1VOQe^|7H|F_*r{W2Srcy)LuPjdnOWTcN9&<-tpPdqIYIVKFRG?s?PuQwR6=r8tnfL_D{Fe- za=Wcg-rF9h_jO9%AX4Gme?XsEvMV(0kA+MgC2ADqA|82`dYOhp)Th{sg3lSbEd)B5 zZ9L~$!Yc$LF9_r=GFyfrBiAD$#>94^PwZ|zp<*lggoCQkWNl&wWP2N{aKthy-ongL z12NUb!b|DSxw&_8aK*BlqKG_ zQ_bHS*{+2b?>^wLp8Lv{e|jxjm$W+!W?o5QHPG2r?R%MuFM?fXqa(SiUG52U51%KR z*9K*@=zk}rr}hm`{RnOqKTN6O|CCVMLmLhJ-{kn@q-g(nJmh~^PuT(=*hsfv{`!m0 zWY5a=7m%r8FOf=~;y%)48_CyY)hxqxm0(9&v%Id2jrYLiU$d*Cd&UV&(`T?)@&r|Y z2=2?3@4627I_IALAV9MjOxV_hgxLa`0k2%E&@nSTFJ#^Zsdo>7rv(S_nOEc(gy;J*=QBnS%91QFKTFO?YezVyDUNknJ z&35pjk@=d8^XOt@*cI9>&$O0b(E_DX7E)SxV6jmwV1SlwT=a}Ih+6P0Ykc&HC3_o# z&CTt%BF0GKnitc&4w?0C3V4s$B?|f!?0+26*cD3E`mY^!t=vZA`hQr=|8_jtAL75Q zrEDn%V~_y;V^-vRhS^i@j((-iNsqBP~+d?oMR90|5tRJDt4LzvN) z<+U7n_0q7J>7g&#*ekpB;t^LxWXY;hW5LdQ3fe8K@F8Bh3* z9~M{Ok_$d*iOQ+gOgT%Xc2j69F8_Wu251IQ`ey`^ke|U z73Yi4#AKtdj(aQTOFk&4^@O>iEg3V=F&Z*J+I?vHZ77;eQaOoTYZ8L0`F~{wy)uv4sQ=kNF6n;`2mSwA3g!R#NDum-EZ{SN z!ZvS3{ZGEGKeYY_J=v_@Vk!a=GFD*6)^#tA2dz)Ce@He^`Ij%>4-F{2W62-S)_G$ z&>ESvM)~>h2T~u^0tAzXQoIB+Kn+Q6s!C0WF&&_bU#`HFiI^8J4FJvQCtITWl>lPI zj6N+%3MdmR!a=$3-0jZYZ!Q+W{yxX~ZH#{~(#6U86Ehd#0aZnv1c(Q3z;U*R(GTtH z>U_1{TNHbMu5W~QRlhUH4j|!-rQ@_Fm|6kEd7F-lw7FOUB)F zP~ol|!`ds}`KC4ni|1Yb(^)(Rc;TVQ39;{m{2{uQPQg3+5dE3OA`nxt;J_Bm$OBBW zOiGOGDcC%8CYyyPaftoP`P>I@68!U>BUvfIdq!hj$sAGAEHwH{LTLaC3K){o=xFx=bR%lze0GI7j{* zET9(=kidT~As>0VS};u>UZ&hWPt^1?m2dM^v1W0C?hxI~B{{B6r^|?^@6x52Zfa0w zoYp!cUqw-Uik93<-@m(Kx}9-C5cz@B7O!9+nC%HupnYDuVqe%z=TNCpa%=Te{kh9l zg)AJ8RDGz<{SYRHLwQ4`O8=w6*Y?mxgZ}4W|F9VU@#uJef6)J|qil&BSwry0A2|3U zAHx5j$d95!L)b_8pheh6f!S(<{*o~tEeW)yatQdSg=%NmHuJq=u?K}vkK*+q&f_1h zRPuj%+JP0@sOSGCll{Gt|Ifkx;QzChvZbX!9qhkr%V7UqR|fmem72 z(nQRQm%)Rep$r}b4Q22kXed9D2Z5%406)G5LC%3d?uP8L{Da+*+W@;G|7dbLFnSyu zIC}+;g8(JJFK_@$k7l}B%{w86$zre;_`?=m|C`);{W*PTr9uC@e|WH8(EskA4Cnvr zDO=#nPp46rz z1kj3#N>@vK*NxAu0$qo(l9ua8b+Ol4>)- zVR!|T2js(3->3Xt=BCnWN@Tw@3nHEb40vJ4cyi=3Ju`0wCm_P9OdKX>%CiP**k!f5N=VJo*Kta)DjhFI zBDY(=1gm;oencQCx9f=w!Ok^|(&YK3$;zlwe?T{mG*Na?I?1g|4Z-rPsc(c;y?rCB zD()R&jpRNNet^ksc^zIIVODP^bZrP$=yDSJL0FL7shHQ{C9^gwt!yi=!>+8EV_CoA zb|BcfM^TU?xFy0SgG85B%9V5(`D_?hN7yNxiS$D-t@Nb`mJ4RD1j|ah5zU;!ew)Jx zxMh~d1&9b6=rKFZM`5V%`jmmu*n`s?cTmX|j9g-92HizC;htOR91-Aq1a2$ZOmFbB z^f7>*KNr14*||FpB2}i28)LKVudF+_P~~K;quK#yUIgae1I*6zX`2WVr-4eA)6a;X zlwt}L3NqwfI+KK|`ZSKAmk@xW>Bhz`aOKH8eZ-Zza&N(s(fV_^fb6kLUeOe|fBIz^ zh8Jvxj}jO{j|k^2f9@sRZgzWP7hK?I*YMKrpT7KbdRG7Xu6$&>TDwlEoo)c2K9MTL zdMs&BS2RgYyPDUva~(4UCcBWv;S_9Ywhja@pg2X;G(x;?R%eJ&kC9b$A zUCq1;HaFFuiVG+_QBMOcY`3Yi_z{K{cB?b089m@-NtEB`0O&m#Eo4cwrCEAJq*6`91+M6*18vyf;9dQ(&L+ zcZ7=|Jn0F2oOX2z+%zPPpQJAEqJaN(51(D9fio|{P|c<5d^UZdfzOtY)bQEGwkd0& z2BE-AWi}&%nFjy*UgC=7H55$2gfSNz|Am*#_?epq6+UfGqP--_Qx=CIeq>#bP#nW_ zWqLU=MU$N^o?MI#Gp7xuGQNovtYRFzQi0unF0Kq(V+$J~xw zbJ-PEEM$4BvIkdMoxG#X(rGDqNd8dn>K4EW_iC)KtJ3>X%>06DqiUl8Z4yJD4(JaA zx582Hx!HE;5hwQ{_IfZN$`2(kTje1IBiSeJY#^TiEFz9az#|O9F^FN35wUHW2OUOw z9WZQcY=NI}I_HxqfrRo|C;}dT1qNV-LMYd0)d29)N<9BKQqUi_l;ppkpHi4aUU(j* zFqwIN4^m)*{C9kOd{FfNJv7j!me(A5(NDGCUf=V$FqnSy3F1PL$$|~R^7q|*S9`L>o*pCFr&@by%x5E zHQkzHlGaVhk|e8lOFPM{>sCb;Ox5fdjHD|MionNj=OD)MGGsFBEWrz)x#T8r1`{d} zk?p!}q1da9;abufbm*2r4b;@ERcYv!ld6aghHkycXt8dwW=DZPkH>(}Dd@LLWz*Cx zUg!Dc8IES?Zkc%5#*+WGgkC3n=APL6y^O|ftCdi^b$$u*?TLy}IyY3@TeqC+^Gkz8 zO+TZRb**)0+IH&;UZy33w-?yA1oa7TZcW{C0v7dE&cl}-ExoPw{cF{&J1>Qg-m@a> zCA%ft>NaGWAxD9$Fk5jL_DHeM$2cHh>C&AZp6)Gf6--2h-W&nZmh z`8AzAQuV@hYU*HHpX*a_eUrOfSckI*3?6owI@YWo+RbZ-`d7)6a|oe(NgmYtsIUgo5oTvm4KTdlbyG4e{gUx0ZNG-oNnxgo8gOb+Q+F@*Q8xT1(5SV%u)=vhlk>1d$M=Jf+)CT8OI@Hp%X&k=i%^kJ|uZX{0I_^(-0Dp^^)IY zAq!L=EjX!f&+xa_95yFq3|CGR) zcqw{70rDIlFW%9rz^2G{*y?a=w{W~QoHM;*$?<gTP7(be()dmV<&m}w0I$M$y zFJx;bMSmp)%(BmZCKenCP2U2mv78^^-%X4Ud(_S*kgsnIR)N_=bt)wG&~zh4IKtU9m=PoXUxG;xa|2j5RXH9N9YOIg-U5ZsmpDXzt> z3qgLBdj9~r0{8ZBs%hn9-+jPXamUz{L{<2TI zRMU}XFgm|{I2?oX%ZKAO1|KyYA&?M+qth9abDHMXs#8m}20Yo^=qyAqO3yFH-~vZ> zCIeO-;YW*(FRFJ^w19Y-UO^v60pWZ$iYlj8Q%6K~OdgS4F!XM3_b)pSIj zTby6oOxsEWkD_%)Qvj*lqoSwnNa?-Uf#h6ge^h*em39?Hql%{JF1bg)>W56Lto$n# z%Miu_J|4bUhTG~Ax>&r+ld16`5&JBP?c*%O%i9o<`2|kDKreVc4T1y`0!cX(!};YD zOiuQl$+5G)=j2q#`OD0chslLt8n;H^DDbM*>m>yC=Gkg!J&u@kXv-7 zYArC`NF(u3G@EavM+wZLBVQ9bvVOxVyy`ci`jhhJ zKrGf_vB`|Vuh{p(%1@=HBTQ0ou9b{%<3xg|F?Xc+jkH^}Xx&Uw$Ol7&PcbGikkK0= z98@?^y#c|N631j6Yq^#mW-3+@^dQH+Em73?F-#=~^q(cI${X@4nSz78A6tqYO4nkN z|JAb6Qyca2|K#BCsCfQ+csMy2khHXa7jEg>xKcZe7D~Y#V7?M(3HM)xmL0Jc)Q{t=~6!mM9 z0OBzVbW}-|$g=g)rEcalxwBf#9Gl&*I*WR4=ERu!mWC+0*Jsig+&;@dnOsG*B(Ugn zxDrGKni{lYwePmgVPq_}{1qohnf$-O-LIrhEcfTd`Ktn8j1^tA%d3@E`qwzGdu>p; z+L$FZ5LW`ssGGfgUgNB51z4t|6aA?@$7ur0EsjNLqUBG0SmPYG(FJC1*a81g$5akV zRgB_WNY}BT;Eb*GlZ^fpYc9<_9p@Qln9y~q{pN(P>C92TaVo%-^3cgI*NSdTt@%@3RZ6BH$(L z@ducsBEym&(=9rIAc8P}LG6ijzQRhEE4Er0*{-iIjZ!Hg$`HVwm zq^w15^^8!3*6NQe%H%oM#H%<{Xf5KF!c626pIe*|)R9-x;IE##s!9*QGxDxrYNp2{pxBBvc|~=8|2ekmv1=f&s62n6Y+E%n){<9@HQ!Ysn~x-)NzdgZ zwknvc(6(BWhm%IjNyC?Gh%p%Bpd53pYHe#9LD#D5uOCNOOK{v@{M@>}w~V5jdw-2w zzi82p`PUxaF4#T(lqtx0KJI0TSpuT`t6%Xwj2M~(GMMCIDW!$NmrWd&Ta67?iUE9z zL*%10d}i+>UIm+yR8okUDkd1oP<7kj)+0>YmCk`HuR7PcP2n;I*mCgURBGMVJ5NB=6e*uwMQU zDa~roxL4JKPBwfx2E~oPT}8bd6N_Sn0hhg1_q&_r)nU+VPM4!;b;~+gYOPpQ4OIeu z>uFt!L7gmKrfJ<6C@q5iCA1+~RaJ*Uqm^KeratW7M6vo7%&LkGi(4%QZBnJZDh5S; zNIM{EF=({q%hA*_X?b0#vC+zE(Dns+5|sNgMjv1t;^zg7(lIzoaP&8PI|hHlx5e|o z`t^Vdgq9e*&b}b^94lCB+hAa|F1+fuaESx(Ym3FJP?Ze^HtWLrF`ykk?ULNFRFxG5 zHOi5Urk0v=O$ia>;4@F@Xl^QvcvIiMyI{oj&25gsp9!#`tq%<5n4}jlrFW|<>Znkz zz(Q|Q@48k4$H0cRJ}}_?q5%3=6x|ypUMCDH05G&y!a-tSLt7shB#@+DlGggzcQnbW zKq22E1K>1#^qw=5Jc&W>Nk=|51{d%FCS&k9`o%-xGO16ZXZbBK9eW*^eVV0N@dw$r z&_r8PRW=x;Fjf{tq%++)~6xz zNKF8n)~8r27JVK7uYtIRs#;>;pty>r7dFu>wZ|qA6AxSzv&a*aPSPHb))>g|uQAW- zi_e3Lsk9c6pB!rpcv?Aka9pLY zSpPYb0fWz#tXVF$$o7WK&26m)p;@+|tq%+c^p^<_|H%>y znlV^~Q`Dg-v_`3@k)Ca6djSlb8DY7{ix~9xEx1R=e`#QoBnBp0T9#EXIGcOX9TaMu zp4^h%&(Rl*(@%&jywsmp15v;rM~gaY$yZjzEOf%4oQ=L`t!fMD*+9#P(!l~A(|Os< zCUwK$nfPhpwExvGFwoMntb##Keq6ug=tj(KM27!iG_4;4ooRdp3^;4JItW%6WU*N4 zXnG}UT}9leRiqfbDjN(?gwnGH99|8B9C4j+$VHUj*mw_Ib;6+>rPS4$<8Bz##|(vy!#bIc=+_N)wvh(f`_!_oJ+zoMe{7KS*wBOt}J`kfuV2<+?t zH-f2y;)g>A#lJ73I6)66gm*CbJ;q7;JG0bqGY7@os0s%;+HQy+AxWiE;w1|KHNpvS zc{C_A)1tytR3j{Wv|+FfqUGY2BB~)R`cg@3jH0{W@938PdqNo;dlFg1BXl=^8FK4= zDCKgo4)4j|L|YAhlerbFZP*m~GU+vNO6DN63$8P3*_%`#2fmfp z*){oh8_M_*bc;>S74co-7sTy0!T;>XG%a{UYZ6|J&t?csmrHR255WIl9@=tNM)-GuZ zCVP8YHNu!8>&`AfF@4C9|7Q6wvWB(i`8$heez@s`*!RN1O_JioyMu*$rG_SU4Ka__ zn$~VT|9%;h+wPjhw%+1-316aci-WSxRtFmc#Fg=>4xo_0+hLFV6#$iyKJzD!5A z8{mb9B1e3=8~IK;K}5t+rbCvq8G2F=h(n!1!8%I_oSLO=T4_3bZpK_?( znnqd?>*L5@CJBuEQo31tVimf-;N%tst{LBQQ=`)`#E)a}1;(N0!!h9RZ`YGN^H2zb zzu{Z*S43IP=U>qRsrb-!X+90vF#&KV`9o%%nn$%eUHBH6vb(RmcWC#Ys~ zVJ_#I8i{9_akKcnZ9_5@V(@Hc8lO%Rl0C^s9HSyh7Hdo}1?8Y*UnRRBA1!Uh zQ@}Q3cGJA=O~F1Vq;iLu0+E~6yr5?~DSa)Pf+InZzNAipSVjx?hn-3e@?N#dK(S$|G~-e zQ9=Gc-rGMOcx?Lm@7x-SpZBcF^aJf0D z^wUO!=d;Wo;lDI1uWcuQF_&?Oe2;RU;_nAU5RUTf^nqZf`8Z60Tpai-`jAMbH9tjV z?LdvMyrQ#}J@K=J9*R?T+5jk=smp6`34{V~ZRG!YJp1`y7X05qIsWhAWH|p>OW6Wl z&wlKAK8?d`&(L+@-MX-C9eA>CT3UO~E2o@oua@nkkZq^IQhM0-8rV*{*N*zN_R7{y zYSxz6O-$HX=~X*vRNFCFN|D-Lh1yAZ+Q-ORX-j`-J*iZq{fK%+7EZ1&9!vr;Xbp!l Xl%WizWBH!|00960phSO<00IaApL9D3 literal 0 HcmV?d00001 diff --git a/community/briefkasten/1.0.0/ci/basic-values.yaml b/community/briefkasten/1.0.0/ci/basic-values.yaml new file mode 100644 index 0000000000..618e5a90f3 --- /dev/null +++ b/community/briefkasten/1.0.0/ci/basic-values.yaml @@ -0,0 +1,17 @@ +briefkastenNetwork: + webPort: 31000 + +briefkastenConfig: + url: http://localhost:31000 + smtp: + enabled: true + server: some.smtp.server:587 + from: briefkasten@example.com + +briefkastenStorage: + pgData: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/pgData + pgBackup: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/pgBackup diff --git a/community/briefkasten/1.0.0/ci/extra-values.yaml b/community/briefkasten/1.0.0/ci/extra-values.yaml new file mode 100644 index 0000000000..7f20fe8655 --- /dev/null +++ b/community/briefkasten/1.0.0/ci/extra-values.yaml @@ -0,0 +1,24 @@ +briefkastenNetwork: + webPort: 31000 + +briefkastenConfig: + url: http://localhost:31000 + smtp: + enabled: true + server: some.smtp.server:587 + from: briefkasten@example.com + +briefkastenStorage: + pgData: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/pgData + pgBackup: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/pgBackup + additionalStorages: + - type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/data1 + mountPath: /data1 + - type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/data2 + mountPath: /data2 diff --git a/community/briefkasten/1.0.0/ci/hostNet-values.yaml b/community/briefkasten/1.0.0/ci/hostNet-values.yaml new file mode 100644 index 0000000000..535298fd5f --- /dev/null +++ b/community/briefkasten/1.0.0/ci/hostNet-values.yaml @@ -0,0 +1,18 @@ +briefkastenNetwork: + webPort: 31000 + hostNetwork: true + +briefkastenConfig: + url: http://localhost:31000 + smtp: + enabled: true + server: some.smtp.server:587 + from: briefkasten@example.com + +briefkastenStorage: + pgData: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/pgData + pgBackup: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/pgBackup diff --git a/community/briefkasten/1.0.0/ix_values.yaml b/community/briefkasten/1.0.0/ix_values.yaml new file mode 100644 index 0000000000..605180725d --- /dev/null +++ b/community/briefkasten/1.0.0/ix_values.yaml @@ -0,0 +1,73 @@ +image: + repository: ndom91/briefkasten + pullPolicy: IfNotPresent + # No versioned tag provided + tag: latest + +resources: + limits: + cpu: 4000m + memory: 8Gi + +briefkastenConfig: + url: http://localhost:30080 + smtp: + enabled: false + server: '' + from: '' + github: + enabled: false + id: '' + secret: '' + google: + enabled: false + id: '' + secret: '' + keycloak: + enabled: false + name: '' + id: '' + secret: '' + issuer: '' + authentik: + enabled: false + name: '' + id: '' + secret: '' + issuer: '' + additionalEnvs: [] + +briefkastenNetwork: + webPort: 30080 + hostNetwork: false + +briefkastenStorage: + additionalStorages: [] + pgData: + type: ixVolume + datasetName: pgData + pgBackup: + type: ixVolume + datasetName: pgBackup + +notes: + custom: | + Default credentials: + - Username: `demo@demo.demo` + - Password: `demo` + + ## Database + You can connect to the database using the pgAdmin App from the catalog + +

+ Database Details + + - Database: `briefkasten` + - Username: `briefkasten` + - Password: `{{ .Values.briefkastenDbPass }}` + - Host: `{{ .Values.briefkastenDbHost }}.{{ .Release.Namespace }}.svc.cluster.local` + - Port: `5432` + +
+ {{- $_ := unset .Values "briefkastenDbPass" }} + {{- $_ := unset .Values "briefkastenDbHost" }} diff --git a/community/briefkasten/1.0.0/metadata.yaml b/community/briefkasten/1.0.0/metadata.yaml new file mode 100644 index 0000000000..49aec19d88 --- /dev/null +++ b/community/briefkasten/1.0.0/metadata.yaml @@ -0,0 +1,13 @@ +runAsContext: + - userName: briefkasten + groupName: briefkasten + gid: 1001 + uid: 1001 + description: Briefkasten can runs as a non-root user. + - userName: postgres + groupName: postgres + gid: 999 + uid: 999 + description: Postgres runs as a non-root user. +capabilities: [] +hostMounts: [] diff --git a/community/briefkasten/1.0.0/questions.yaml b/community/briefkasten/1.0.0/questions.yaml new file mode 100644 index 0000000000..2f1d717f98 --- /dev/null +++ b/community/briefkasten/1.0.0/questions.yaml @@ -0,0 +1,539 @@ +groups: + - name: Briefkasten Configuration + description: Configure Briefkasten + - name: Network Configuration + description: Configure Network for Briefkasten + - name: Storage Configuration + description: Configure Storage for Briefkasten + - name: Resources Configuration + description: Configure Resources for Briefkasten + +portals: + web_portal: + protocols: + - "$kubernetes-resource_configmap_portal_protocol" + host: + - "$kubernetes-resource_configmap_portal_host" + ports: + - "$kubernetes-resource_configmap_portal_port" + path: "$kubernetes-resource_configmap_portal_path" + +questions: + - variable: briefkastenConfig + label: "" + group: Briefkasten Configuration + schema: + type: dict + attrs: + - variable: url + label: BaseURL + description: | + The URL that Briefkasten will be accessible from.
+ Example:
+ http://server.ip:30080
+ https://Briefkasten.example.com + schema: + type: uri + default: "" + required: true + - variable: smtp + label: SMTP Auth Provider + description: Configure SMTP for Briefkasten. + schema: + type: dict + attrs: + - variable: enabled + label: Enabled + description: Enable SMTP for auth. + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: server + label: SMTP Server + description: The SMTP server to use. + schema: + type: string + default: "" + required: true + - variable: from + label: SMTP From + description: The SMTP from address to use. + schema: + type: string + default: "" + required: true + - variable: github + label: GitHub Auth Provider + description: Configure GitHub for Briefkasten. + schema: + type: dict + attrs: + - variable: enabled + label: Enabled + description: Enable GitHub for auth. + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: id + label: GitHub Client ID + description: The GitHub Client ID. + schema: + type: string + default: "" + required: true + - variable: secret + label: GitHub Client Secret + description: The GitHub Client Secret. + schema: + type: string + default: "" + required: true + - variable: google + label: Google Auth Provider + description: Configure Google for Briefkasten. + schema: + type: dict + attrs: + - variable: enabled + label: Enabled + description: Enable Google for auth. + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: id + label: Google Client ID + description: The Google Client ID. + schema: + type: string + default: "" + required: true + - variable: secret + label: Google Client Secret + description: The Google Client Secret. + schema: + type: string + default: "" + required: true + - variable: keycloak + label: Keycloak Auth Provider + description: Configure Keycloak for Briefkasten. + schema: + type: dict + attrs: + - variable: enabled + label: Enabled + description: Enable Keycloak for auth. + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: name + label: Keycloak Name + description: The Keycloak Name. + schema: + type: string + default: "" + required: true + - variable: id + label: Keycloak Client ID + description: The Keycloak Client ID. + schema: + type: string + default: "" + required: true + - variable: secret + label: Keycloak Client Secret + description: The Keycloak Client Secret. + schema: + type: string + default: "" + required: true + - variable: issuer + label: Keycloak Issuer + description: The Keycloak Issuer. + schema: + type: string + default: "" + required: true + - variable: authentik + label: Authentik Auth Provider + description: Configure Authentik for Briefkasten. + schema: + type: dict + attrs: + - variable: enabled + label: Enabled + description: Enable Authentik for auth. + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: name + label: Authentik Name + description: The Authentik Name. + schema: + type: string + default: "" + required: true + - variable: id + label: Authentik Client ID + description: The Authentik Client ID. + schema: + type: string + default: "" + required: true + - variable: secret + label: Authentik Client Secret + description: The Authentik Client Secret. + schema: + type: string + default: "" + required: true + - variable: issuer + label: Authentik Issuer + description: The Authentik Issuer. + schema: + type: string + default: "" + required: true + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Briefkasten. + schema: + type: list + default: [] + items: + - variable: env + label: Environment Variable + schema: + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: briefkastenNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: Web Port + description: The port for the Briefkasten Web UI. + schema: + type: int + default: 30080 + min: 9000 + max: 65535 + required: true + - variable: hostNetwork + label: Host Network + description: | + Bind to the host network. It's recommended to keep this disabled.
+ schema: + type: boolean + default: false + + - variable: briefkastenStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: avatars + label: Briefkasten Avatars Storage + description: The path to store Briefkasten Avatars. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "avatars" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: backgroundImages + label: Briefkasten Background Images Storage + description: The path to store Briefkasten Background Images. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "bg-img" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: attachments + label: Briefkasten Attachments Storage + description: The path to store Briefkasten Attachments. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "attachments" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: pgData + label: Postgres Data Storage + description: The path to store Postgres Data. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "pgData" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: pgBackup + label: Postgres Backup Storage + description: The path to store Postgres Backup. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "pgBackup" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: additionalStorages + label: Additional Storage + description: Additional storage for Briefkasten. + schema: + type: list + default: [] + items: + - variable: storageEntry + label: Storage Entry + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: mountPath + label: Mount Path + description: The path inside the container to mount the storage. + schema: + type: path + required: true + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + required: true + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + immutable: true + default: "storage_entry" + $ref: + - "normalize/ixVolume" + + - variable: resources + group: Resources Configuration + label: "" + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for Briefkasten. + schema: + type: string + max_length: 6 + valid_chars: '^(0\.[1-9]|[1-9][0-9]*)(\.[0-9]|m?)$' + valid_chars_error: | + Valid CPU limit formats are
+ - Plain Integer - eg. 1
+ - Float - eg. 0.5
+ - Milicpu - eg. 500m + default: "4000m" + required: true + - variable: memory + label: Memory + description: Memory limit for Briefkasten. + schema: + type: string + max_length: 12 + valid_chars: '^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$' + valid_chars_error: | + Valid Memory limit formats are
+ - Suffixed with E/P/T/G/M/K - eg. 1G
+ - Suffixed with Ei/Pi/Ti/Gi/Mi/Ki - eg. 1Gi
+ - Plain Integer in bytes - eg. 1024
+ - Exponent - eg. 134e6 + default: "8Gi" + required: true diff --git a/community/briefkasten/1.0.0/templates/NOTES.txt b/community/briefkasten/1.0.0/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/community/briefkasten/1.0.0/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/community/briefkasten/1.0.0/templates/_briefkasten.tpl b/community/briefkasten/1.0.0/templates/_briefkasten.tpl new file mode 100644 index 0000000000..92314fd09e --- /dev/null +++ b/community/briefkasten/1.0.0/templates/_briefkasten.tpl @@ -0,0 +1,70 @@ +{{- define "briefkasten.workload" -}} +workload: + briefkasten: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.briefkastenNetwork.hostNetwork }} + containers: + briefkasten: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: 1001 + runAsGroup: 1001 + readOnlyRootFilesystem: false + envFrom: + - secretRef: + name: briefkasten + - configMapRef: + name: briefkasten + {{ with .Values.briefkastenConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: http + port: {{ .Values.briefkastenNetwork.webPort }} + path: / + readiness: + enabled: true + type: http + port: {{ .Values.briefkastenNetwork.webPort }} + path: / + startup: + enabled: true + type: http + port: {{ .Values.briefkastenNetwork.webPort }} + path: / + initContainers: + {{- include "ix.v1.common.app.postgresWait" (dict "name" "01-postgres-wait" + "secretName" "postgres-creds") | nindent 8 }} + 02-migrate-db: + enabled: true + type: init + imageSelector: image + securityContext: + runAsUser: 1001 + runAsGroup: 1001 + readOnlyRootFilesystem: false + envFrom: + - secretRef: + name: briefkasten + - configMapRef: + name: briefkasten + command: + - /bin/sh + - -c + - | + echo "Migrating database" + pnpm db:push || (echo "DB migration failed..." && exit 1) + echo "DB migration successful. Application will now start" + exit 0 +{{- end -}} diff --git a/community/briefkasten/1.0.0/templates/_configuration.tpl b/community/briefkasten/1.0.0/templates/_configuration.tpl new file mode 100644 index 0000000000..545c46f052 --- /dev/null +++ b/community/briefkasten/1.0.0/templates/_configuration.tpl @@ -0,0 +1,77 @@ +{{- define "briefkasten.configuration" -}} + {{- $fullname := (include "ix.v1.common.lib.chart.names.fullname" $) -}} + + {{- $secretKey := randAlphaNum 64 -}} + {{- with (lookup "v1" "Secret" .Release.Namespace (printf "%s-briefkasten" $fullname)) -}} + {{- $secretKey = ((index .data "NEXTAUTH_SECRET") | b64dec) -}} + {{- end -}} + + {{- $dbHost := (printf "%s-postgres" $fullname) -}} + {{- $dbUser := "briefkasten" -}} + {{- $dbName := "briefkasten" -}} + + {{- $dbPass := (randAlphaNum 32) -}} + {{- with (lookup "v1" "Secret" .Release.Namespace (printf "%s-postgres-creds" $fullname)) -}} + {{- $dbPass = ((index .data "POSTGRES_PASSWORD") | b64dec) -}} + {{- end -}} + + {{- $dbURL := (printf "postgres://%s:%s@%s:5432/%s?sslmode=disable" $dbUser $dbPass $dbHost $dbName) -}} + {{/* Temporary set dynamic db details on values, + so we can print them on the notes */}} + {{- $_ := set .Values "briefkastenDbPass" $dbPass -}} + {{- $_ := set .Values "briefkastenDbHost" $dbHost -}} + + {{- $smtp := .Values.briefkastenConfig.smtp -}} + {{- $github := .Values.briefkastenConfig.github -}} + {{- $google := .Values.briefkastenConfig.google -}} + {{- $keycloak := .Values.briefkastenConfig.keycloak -}} + {{- $authentik := .Values.briefkastenConfig.authentik }} +secret: + briefkasten: + enabled: true + data: + NEXTAUTH_SECRET: {{ $secretKey }} + DATABASE_URL: {{ $dbURL }} + {{- if $smtp.enabled }} + SMTP_SERVER: {{ $smtp.server }} + SMTP_FROM: {{ $smtp.from }} + {{- end -}} + {{- if $github.enabled }} + GITHUB_ID: {{ $github.id }} + GITHUB_SECRET: {{ $github.secret }} + {{- end -}} + {{- if $google.enabled }} + GOOGLE_ID: {{ $google.id }} + GOOGLE_SECRET: {{ $google.secret }} + {{- end -}} + {{- if $keycloak.enabled }} + KEYCLOAK_NAME: {{ $keycloak.name }} + KEYCLOAK_ID: {{ $keycloak.id }} + KEYCLOAK_SECRET: {{ $keycloak.secret }} + KEYCLOAK_ISSUER: {{ $keycloak.issuer }} + {{- end -}} + {{- if $authentik.enabled }} + AUTHENTIK_NAME: {{ $authentik.name }} + AUTHENTIK_ID: {{ $authentik.id }} + AUTHENTIK_SECRET: {{ $authentik.secret }} + AUTHENTIK_ISSUER: {{ $authentik.issuer }} + {{- end }} + + postgres-creds: + enabled: true + data: + POSTGRES_USER: {{ $dbUser }} + POSTGRES_DB: {{ $dbName }} + POSTGRES_PASSWORD: {{ $dbPass }} + POSTGRES_HOST: {{ $dbHost }} + POSTGRES_URL: {{ $dbURL }} + +configmap: + briefkasten: + enabled: true + data: + NEXTAUTH_URL: {{ .Values.briefkastenConfig.url }} + NEXTAUTH_URL_INTERNAL: http://127.0.0.1:{{ .Values.briefkastenNetwork.webPort }} + PORT: {{ .Values.briefkastenNetwork.webPort | quote }} + NODE_ENV: production +{{- end -}} diff --git a/community/briefkasten/1.0.0/templates/_persistence.tpl b/community/briefkasten/1.0.0/templates/_persistence.tpl new file mode 100644 index 0000000000..920bfc3f20 --- /dev/null +++ b/community/briefkasten/1.0.0/templates/_persistence.tpl @@ -0,0 +1,53 @@ +{{- define "briefkasten.persistence" -}} +persistence: + tmp: + enabled: true + type: emptyDir + targetSelector: + briefkasten: + briefkasten: + mountPath: /tmp + {{- range $idx, $storage := .Values.briefkastenStorage.additionalStorages }} + {{ printf "briefkasten-%v" (int $idx) }}: + enabled: true + type: {{ $storage.type }} + datasetName: {{ $storage.datasetName | default "" }} + hostPath: {{ $storage.hostPath | default "" }} + targetSelector: + briefkasten: + briefkasten: + mountPath: {{ $storage.mountPath }} + {{- end }} + + {{/* Database */}} + postgresdata: + enabled: true + type: {{ .Values.briefkastenStorage.pgData.type }} + datasetName: {{ .Values.briefkastenStorage.pgData.datasetName | default "" }} + hostPath: {{ .Values.briefkastenStorage.pgData.hostPath | default "" }} + targetSelector: + # Postgres pod + postgres: + # Postgres container + postgres: + mountPath: /var/lib/postgresql/data + # Postgres - Permissions container + # Different than the 01-permissions + permissions: + mountPath: /mnt/directories/postgres_data + postgresbackup: + enabled: true + type: {{ .Values.briefkastenStorage.pgBackup.type }} + datasetName: {{ .Values.briefkastenStorage.pgBackup.datasetName | default "" }} + hostPath: {{ .Values.briefkastenStorage.pgBackup.hostPath | default "" }} + targetSelector: + # Postgres backup pod + postgresbackup: + # Postgres backup container + postgresbackup: + mountPath: /postgres_backup + # Postgres - Permissions container + # Different than the 01-permissions + permissions: + mountPath: /mnt/directories/postgres_backup +{{- end -}} diff --git a/community/briefkasten/1.0.0/templates/_portal.tpl b/community/briefkasten/1.0.0/templates/_portal.tpl new file mode 100644 index 0000000000..c9bc5a5cb8 --- /dev/null +++ b/community/briefkasten/1.0.0/templates/_portal.tpl @@ -0,0 +1,35 @@ +{{- define "briefkasten.portal" -}} + {{- $host := "$node_ip" -}} + {{- $port := "" -}} + {{- $protocol := "http" -}} + {{- if hasPrefix "https://" .Values.briefkastenConfig.url -}} + {{- $protocol = "https" -}} + {{- end -}} + + {{- with .Values.briefkastenConfig.url -}} {{/* Trim protocol and trailing slash */}} + {{- $host = . | trimPrefix "https://" | trimPrefix "http://" | trimSuffix "/" -}} + + {{- if contains ":" $host -}} + {{- $port = (split ":" $host)._1 -}} + {{- $host = (split ":" $host)._0 -}} + {{- end -}} + + {{- if not $port -}} + {{- if eq $protocol "https" -}} + {{- $port = "443" -}} + {{- else -}} + {{- $port = "80" -}} + {{- end -}} + {{- end -}} + {{- end }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: "/" + port: {{ $port | quote }} + protocol: {{ $protocol }} + host: {{ $host }} +{{- end -}} diff --git a/community/briefkasten/1.0.0/templates/_postgres.tpl b/community/briefkasten/1.0.0/templates/_postgres.tpl new file mode 100644 index 0000000000..0c050b6ca0 --- /dev/null +++ b/community/briefkasten/1.0.0/templates/_postgres.tpl @@ -0,0 +1,6 @@ +{{- define "postgres.workload" -}} +workload: +{{- include "ix.v1.common.app.postgres" (dict "secretName" "postgres-creds" + "resources" .Values.resources + "ixChartContext" .Values.ixChartContext) | nindent 2 }} +{{- end -}} diff --git a/community/briefkasten/1.0.0/templates/_service.tpl b/community/briefkasten/1.0.0/templates/_service.tpl new file mode 100644 index 0000000000..d0ea35538f --- /dev/null +++ b/community/briefkasten/1.0.0/templates/_service.tpl @@ -0,0 +1,26 @@ +{{- define "briefkasten.service" -}} +service: + briefkasten: + enabled: true + primary: true + type: NodePort + targetSelector: briefkasten + ports: + webui: + enabled: true + primary: true + port: {{ .Values.briefkastenNetwork.webPort }} + nodePort: {{ .Values.briefkastenNetwork.webPort }} + targetSelector: briefkasten + postgres: + enabled: true + type: ClusterIP + targetSelector: postgres + ports: + postgres: + enabled: true + primary: true + port: 5432 + targetPort: 5432 + targetSelector: postgres +{{- end -}} diff --git a/community/briefkasten/1.0.0/templates/_validation.tpl b/community/briefkasten/1.0.0/templates/_validation.tpl new file mode 100644 index 0000000000..66eeec0c89 --- /dev/null +++ b/community/briefkasten/1.0.0/templates/_validation.tpl @@ -0,0 +1,65 @@ +{{- define "briefkasten.validation" -}} + {{- $smtp := .Values.briefkastenConfig.smtp -}} + {{- $github := .Values.briefkastenConfig.github -}} + {{- $google := .Values.briefkastenConfig.google -}} + {{- $keycloak := .Values.briefkastenConfig.keycloak -}} + {{- $authentik := .Values.briefkastenConfig.authentik -}} + + {{- $providers := (list "smtp" "github" "google" "keycloak" "authentik") -}} + {{- $found := false -}} + {{- range $p := $providers -}} + {{- $provider := get $.Values.briefkastenConfig $p -}} + {{- if $provider.enabled -}} + {{- $found = true -}} + {{- end -}} + {{- end -}} + + {{- if not $found -}} + {{- fail (printf "Briefkasten - One or more auth provider [%s] must be enabled" (join ", " $providers)) -}} + {{- end -}} + + {{- if $smtp.enabled -}} + {{- $required := (list "server" "from") -}} + {{- range $key := $required -}} + {{- if not (get $smtp $key) -}} + {{- fail (printf "Briefkasten - Key [%s] is required for SMTP auth provider" $key) -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- if $github.enabled -}} + {{- $required := (list "id" "secret") -}} + {{- range $key := $required -}} + {{- if not (get $github $key) -}} + {{- fail (printf "Briefkasten - Key [%s] is required for Github auth provider" $key) -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- if $google.enabled -}} + {{- $required := (list "id" "secret") -}} + {{- range $key := $required -}} + {{- if not (get $google $key) -}} + {{- fail (printf "Briefkasten - Key [%s] is required for Google auth provider" $key) -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- if $keycloak.enabled -}} + {{- $required := (list "name" "id" "secret" "issuer") -}} + {{- range $key := $required -}} + {{- if not (get $keycloak $key) -}} + {{- fail (printf "Briefkasten - Key [%s] is required for Keycloak auth provider" $key) -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- if $authentik.enabled -}} + {{- $required := (list "name" "id" "secret" "issuer") -}} + {{- range $key := $required -}} + {{- if not (get $authentik $key) -}} + {{- fail (printf "Briefkasten - Key [%s] is required for Authentik auth provider" $key) -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/community/briefkasten/1.0.0/templates/common.yaml b/community/briefkasten/1.0.0/templates/common.yaml new file mode 100644 index 0000000000..7f131896a0 --- /dev/null +++ b/community/briefkasten/1.0.0/templates/common.yaml @@ -0,0 +1,14 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "briefkasten.validation" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "briefkasten.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "briefkasten.service" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "briefkasten.persistence" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "briefkasten.configuration" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "postgres.workload" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "briefkasten.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/community/briefkasten/1.0.0/upgrade_strategy_disable b/community/briefkasten/1.0.0/upgrade_strategy_disable new file mode 100755 index 0000000000..af685230a1 --- /dev/null +++ b/community/briefkasten/1.0.0/upgrade_strategy_disable @@ -0,0 +1,31 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'\d+\.\d+\.\d+') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t: t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + version = semantic_versioning(list(tags)) + if not version: + return {} + + return { + 'tags': {key: tags[version]}, + 'app_version': version, + } + + +if __name__ == '__main__': + try: + versions_json = json.loads(sys.stdin.read()) + except ValueError: + raise ValueError('Invalid json specified') + + print(json.dumps(newer_mapping(versions_json))) diff --git a/community/briefkasten/item.yaml b/community/briefkasten/item.yaml new file mode 100644 index 0000000000..2deb9c692d --- /dev/null +++ b/community/briefkasten/item.yaml @@ -0,0 +1,10 @@ +icon_url: https://docs.briefkastenhq.com/logo.svg +categories: + - productivity +screenshots: + - https://raw.githubusercontent.com/ndom91/briefkasten/main/public/screenshot_app01.png + - https://raw.githubusercontent.com/ndom91/briefkasten/main/public/screenshot_app05.png + - https://raw.githubusercontent.com/ndom91/briefkasten/main/public/screenshot_app04.png + - https://raw.githubusercontent.com/ndom91/briefkasten/main/public/screenshot_app06.png +tags: + - bookmark