From 0bd1b519c45dce18ba7746f9ca6f2ac2cb3f82c4 Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Sat, 14 Oct 2023 23:20:39 +0300 Subject: [PATCH] Add `listmonk` to `community` train (#1633) * initial commit * add templates * add description * more ci values * add description * add readme * probe path * run 1 test only * fix init * hmm * I see * test this * add questions and metadata * fix path --- library/ix-dev/community/listmonk/Chart.lock | 6 + library/ix-dev/community/listmonk/Chart.yaml | 26 ++ library/ix-dev/community/listmonk/README.md | 12 + .../ix-dev/community/listmonk/app-readme.md | 12 + .../listmonk/charts/common-1.1.1.tgz | Bin 0 -> 61739 bytes .../community/listmonk/ci/basic-values.yaml | 14 + .../community/listmonk/ci/extra-values.yaml | 19 + .../community/listmonk/ci/hostNet-values.yaml | 11 + library/ix-dev/community/listmonk/item.yaml | 10 + .../ix-dev/community/listmonk/metadata.yaml | 8 + .../ix-dev/community/listmonk/questions.yaml | 325 ++++++++++++++++++ .../community/listmonk/templates/NOTES.txt | 1 + .../listmonk/templates/_configuration.tpl | 41 +++ .../listmonk/templates/_listmonk.tpl | 68 ++++ .../listmonk/templates/_persistence.tpl | 64 ++++ .../community/listmonk/templates/_portal.tpl | 12 + .../listmonk/templates/_postgres.tpl | 6 + .../community/listmonk/templates/_service.tpl | 26 ++ .../community/listmonk/templates/common.yaml | 13 + .../community/listmonk/upgrade_info.json | 1 + .../community/listmonk/upgrade_strategy | 31 ++ library/ix-dev/community/listmonk/values.yaml | 52 +++ 22 files changed, 758 insertions(+) create mode 100644 library/ix-dev/community/listmonk/Chart.lock create mode 100644 library/ix-dev/community/listmonk/Chart.yaml create mode 100644 library/ix-dev/community/listmonk/README.md create mode 100644 library/ix-dev/community/listmonk/app-readme.md create mode 100644 library/ix-dev/community/listmonk/charts/common-1.1.1.tgz create mode 100644 library/ix-dev/community/listmonk/ci/basic-values.yaml create mode 100644 library/ix-dev/community/listmonk/ci/extra-values.yaml create mode 100644 library/ix-dev/community/listmonk/ci/hostNet-values.yaml create mode 100644 library/ix-dev/community/listmonk/item.yaml create mode 100644 library/ix-dev/community/listmonk/metadata.yaml create mode 100644 library/ix-dev/community/listmonk/questions.yaml create mode 100644 library/ix-dev/community/listmonk/templates/NOTES.txt create mode 100644 library/ix-dev/community/listmonk/templates/_configuration.tpl create mode 100644 library/ix-dev/community/listmonk/templates/_listmonk.tpl create mode 100644 library/ix-dev/community/listmonk/templates/_persistence.tpl create mode 100644 library/ix-dev/community/listmonk/templates/_portal.tpl create mode 100644 library/ix-dev/community/listmonk/templates/_postgres.tpl create mode 100644 library/ix-dev/community/listmonk/templates/_service.tpl create mode 100644 library/ix-dev/community/listmonk/templates/common.yaml create mode 100644 library/ix-dev/community/listmonk/upgrade_info.json create mode 100755 library/ix-dev/community/listmonk/upgrade_strategy create mode 100644 library/ix-dev/community/listmonk/values.yaml diff --git a/library/ix-dev/community/listmonk/Chart.lock b/library/ix-dev/community/listmonk/Chart.lock new file mode 100644 index 0000000000..4c0ba97d58 --- /dev/null +++ b/library/ix-dev/community/listmonk/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.1.1 +digest: sha256:a7dbe3e4d42dbcd4325776e5e01a1d630c7f185f79e7ebf22b1b9cc80f56eed7 +generated: "2023-10-11T15:34:06.716391369+03:00" diff --git a/library/ix-dev/community/listmonk/Chart.yaml b/library/ix-dev/community/listmonk/Chart.yaml new file mode 100644 index 0000000000..52f0a575af --- /dev/null +++ b/library/ix-dev/community/listmonk/Chart.yaml @@ -0,0 +1,26 @@ +name: listmonk +description: Listmonk is a self-hosted newsletter and mailing list manager. +annotations: + title: Listmonk +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: v2.5.1 +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://listmonk.app/ +icon: https://listmonk.app/static/images/logo.svg +sources: + - https://hub.docker.com/r/listmonk/listmonk + - https://github.com/knadh/listmonk + - https://github.com/truenas/charts/tree/master/library/ix-dev/community/listmonk +keywords: + - mailing-list + - newsletter diff --git a/library/ix-dev/community/listmonk/README.md b/library/ix-dev/community/listmonk/README.md new file mode 100644 index 0000000000..2dc6be307d --- /dev/null +++ b/library/ix-dev/community/listmonk/README.md @@ -0,0 +1,12 @@ +# Listmonk + +[Listmonk](https://listmonk.app/) is a self-hosted newsletter and mailing list manager. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `listmonk` directories. +> Afterward, the `listmonk` container will run as a **non**-root user (default `568`). +> Same applies to the `postgres` container. This will run afterwards 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 `listmonk` and `postgres` data directories. diff --git a/library/ix-dev/community/listmonk/app-readme.md b/library/ix-dev/community/listmonk/app-readme.md new file mode 100644 index 0000000000..2dc6be307d --- /dev/null +++ b/library/ix-dev/community/listmonk/app-readme.md @@ -0,0 +1,12 @@ +# Listmonk + +[Listmonk](https://listmonk.app/) is a self-hosted newsletter and mailing list manager. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `listmonk` directories. +> Afterward, the `listmonk` container will run as a **non**-root user (default `568`). +> Same applies to the `postgres` container. This will run afterwards 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 `listmonk` and `postgres` data directories. diff --git a/library/ix-dev/community/listmonk/charts/common-1.1.1.tgz b/library/ix-dev/community/listmonk/charts/common-1.1.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..ee54ba6d1189afec4078937a725627a756d5451b GIT binary patch literal 61739 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 z zwsCiTlDi7&BXXlpiCAxLQKE%dnf?3*aUt^J2wlvl`18qo{1X^YF>H$DJw(YxZe+MFJez32dV2`N(fF)!C*+0G&_i)8W7vE#=-3`I3Pz81kv^2Breb zb`j&BX<^lSNwOCw6T*DWQeQPz8_Q8Q1qpJykn5{W9!+TkyUIeZmBG-b$;n0qfz%cj z3yY&acyXd9ML+bX5sh+AV+p z-EyE3TFZ4Hw;I#45qBpe9|cSB`|@4rO+cjw<&!%1-_K4Yl&2XcG2R-Z(~azzNAYjP z7(s|4(!|TA+d+Y6v+01E1U=36vsKvFY|b^<#Vg?VI}{+Ykqg+DYQF)x$gC>69f;kI zia&=2FOZIEe6_5&tmJCu+k@)9dLDnhCg1F%^vEJ%_+m?-Ml{0Cm5O%JKL!K zqP2#cDUMnyTu(xry?2sj0$UK^=hF!?dh_XBp^xAs6ts1k|JU_(L`a~&VVWQgbbCx5WZ@hU!{77MesEVnETpKp7Ge}K0~G8 zE4zmBEm<1eK#{MnmU_>iWQv>3u0uYnkE}Q0)v@7MtAqQd=v(xV9%+u6Xdl%cKaFaV z`V_cO2xp`2?l(2h+&SH5Q{cEp0j?*+GRS}{_1g>5K1QKPrP6fozSP&{rtf>PPWqE! zeoM{{n3DWxA0q{@jl;U*zEjb9vk-shLOwJ&Z+icw0ip;9m{L^RmlNQj7A|*gp>LhM zazqp=^~in3;u6H-^vfM{t82>Tu!%S(;gqD}^-v=HyuC4*9GJFowl>?WJ_a~RuvW8X zC_<Wjyl$D3A2q>&(y0Sg-~(I$WL=cx7aa^-;k>o zD>B)}N!Wnj3j+y1iw>kydm!9#JmNGvEQVBvYJ$YCuLf03OFd-EE*$(&C$u`}^7+5ZZ(QkusRO zvTA%)va+SzP>pP4$b#vU@HqncXn(|_8jDwof_YDX6Vv{XFEJZF7LhXq6J%%ls-#i} zNOc7?*8hnBVntY>Wav*%O;Ykd>U9pu@&hRJz2W@5CLVhN?8yvEcr^pdr>FgmOk3?p z>?icE>w9su)zx>KzoOwfPFHaa1!EXf46t9!y)NEeB_0cZE)mP=%?hLyIS+RXqVYpY zBGleQZcpLG3FC!Wge#R<+#UK9N>TLu+R-XVZyLK=Go?g6F5($i8lehUulBoP&o8}7 z4^6zrkNh&6#WlTBFxSy#HP}9h)-0|B3%(_RgPamXa2ht}{nHbQea~MmbXz+EQ>oie zPN(c&=KlpofMJ{Z)Vakn5&91?8Ll$-V9c~#X2%OQ=F-gFcV>%L=jG4xvws(mU6G)R z(hrLW>~c{qmpVyF&1eMqK(VmW{i9h}GKPA3m4P0{m>cOt0bdoThd|iLg&qZg7JsfA z2`eUwZN8ID2Gp3iz+Hy$$svCBPJ8~Y2o=41`fVQAf~Tqry-4^pn7b;tmlcuJ4qum-x$#fb2o~) z$-pU5G%9II-Tfi!`d3&Gz9ieuL;=xpLO0AxrdPOoepOFbwc+;TrohAAX9m>t_=W~d zHEa~#g%YrlmVM_KPC28j4 zXph^6fi-eoG$i-rUWl@UKa|=4kDW8i`^#0Oqm+255FYno02^M8HA zj{K*+7Ef0ENcF%|j&opO(4|?*7}hLBcTnD6CenZS>A|}OeF*98*Hcj`zNS^gCnh2r zYXKt7>R;ejN_8az*Mka%64Wq~JQv-s3nHy9t1^Jz-A)OUJ6NQoWGEe&T3PvM5^zWo z@#klnWaUqPWo*AC*he>DFy0rdDVyZdfP$<=3*aK!>yU~L8&ff=`}V;3Q+hBb;?1c6 zsr`AzVoC7xSq$LH{R+hqZz*o&@+lRe<|(&h`HN7LK)ajR(yrL2Hkgwas|cYveof=5 zhne3!4Gb;8!oF@aW5RX>=W5O7l&bz*14^4oJzjAsw%BB>@jCDUO}XVQ zkW#YtF*6JhyGTcU`F)^h^o#q~-Q#yXSI3YyPL&SV=UCF;LsT%7n9ASlk?6#YQ>ZYA zQDN!MHg}bI#f2mMF%#j=mVz`azYS0pWDK$)b}`i|T%k%r-l>q5 zhI$M_dvU>rIAiPqaBaUuzW>pkFxsY9Dhj8_*(k_#mz{^ABr@R_6Mp*mb;nE~n3q$G z)QM4Il+`_cHXqf^uz}!-5;gbyuM=-Ta6ai4y7{(c_{MmS+h4+DX8kZ$l4Rc3l*Cz) zVPex+UP!g^2DnnTYj1r$FeLIJnN$)cQX)DWGM46L9#xuYd4Th7f{xJ&jRSZCatkzq zP%7zPp7we%(!rp`8gakrO$xqe-PWu(je=MxWBthyX7AMY?5ljs`wSHzFH0eaUQb^m zO8CpU2_}1!-=bw7MX$7=U>Qd~e~j#hq6<=XM;7dDkY|~RjUL2Ug^g%pSc%j~STlM1 zsr8mP(U%~A%#(+}6z1Q2l60j_4|T?NlK0#1-D1B)+dWWXVbJ&tcKFB+zi7^zh%i6> zGN9Z7CMBfTp9XFH9*6aIX9&vceM8h0jVpxkO_{8f6E%wx^T{e8VZ}kNyBvRi@ls)YH z3!lIdkLOhTr40I()0_NWgVN8nIqkrbb7F57n&ww^TGrxCx00({R`P5yqMnYRUdM+C z_s@x{EwqlU_?M9uPk$Ea=t?ASot@F$$ow1Xe+t)T2IbT17G``Fe-jg8=+x!IL|Y(s z-7S^^vvxfKtSFPfRKlbE>*Y20;p5H?mw*28!M#j&=S3T{f95Ox7#8@Hh!@jQf8iCr zzsa5{vF)#^)zPwj#8sMHio`<|JtI6t-F!7!TIA0>{AJ5Bws4W5B=h-c3pJP*r7g_U z?tl`%pG*|;kJ@nxgvhQnzdPsg$HtufVU9&ZUJ>Hm@*bSfT`*HB-{IVtm1L8HPD|=| zA*LVh*$~NI)!X>56lYP^dT6mS&5jhdv-6a0EU%sw53gG_ zSlAY1Uw#30t7A*Z*!%Cd2ZljCyy0xfSYdR_V(-p*O(Uk3gN?M+TI=Lr$jPG#j>Iiz zRotYTJ(T+{QxNC%{~G5!)5gf6?xT8}#UQT#P=Ux*N>2P964F+Lr^Np4zBhgb0=W?3 zAJR1PC;jz)buW}*mf(&yx4Qz9D9OyP38NDejIK^n@HEzO3b@x zHaM-nOWufE)nD1}gq>5&wrL$VldjnBW-RwMLx{`f9+u78H4^pgQT`uO=NKJH7p>uN zV%zq_$;7s8dtw_M+cqbd*tX4ytw}Pmoxc6u`{(}bRcm#fI%`$!v)}jGduuvOvt`wk zMxQZrrhSNK=E&P%*(rRxZDy2EOsa(|Z?Bt&(`Q-7wOe^p_O-f}k=2QWF1F*e-9vt^ zIsIpu%LU_W`6&1D)b~}2?#^5}xN-_WyUmFEQmF#w5ndMjr+Po5w7u<8M{@&dzWzP* zMZVM+2xvLC>5Ye{Mpp%~!u!(+*G29|8{8pR(?&+%q4IQ*Xzz22d<5KXf= z5Uxc^aQd@ZIOu^z{yzwb5Y#DAiR`BB5V9i56@Ex{jV=9cztpvA33o2fJm zT5-x&C2j2hbTYvZP2r+7QELLvYu<=Smi{T=(r&bWqh^4OzTyD72Mx@@JNzYWrKRQR z%%-&H0y0?c(W6bp-2;>6m5}G*faq&Sox>mIw26<3F+A*PC6Tt9d|@T+BOQKC#0yfPgL> zxNGCrXD?Ox%=p=d!v|KcAa`Lll}{<8)w_rM-s`|e|A#5_)IB6gqpPPYD{r{s7`o3U zgOR;oWxvI}?D|U(2DKq#&B^ejH-3AIteQc9ysPJ54F5dXbJLs2PAluMR+TF<>1DoC8HnSib^C9U+JkNK`p>mdMCSn7Bv=^iE4A+KLI=A9wzT8J2z0hG!XF0?m3)eR0ZVFtKuOuZz&6u?zU^nO zn@OFs{N2;WmVK@rERXjv=BlT2NsHfN=CwSX1&VQY3=TW)pqyVMDK7eEI@0;&HQ1qJyY9KSd5UXC)=wekUzU*j5ST>_FGb9y`2%hcb0d01?9ya~ zC|X0dD&yB*2iULX9RH%jnL>T?1mfxY7H2B_Y*K-#MKF&ma~v|BmB|E8Q#{bj{#3=s zS`Cbmoe68E9O6S`M(YnXv-0%US`+^JG`vznvC;305EWj+P}U-XnF>C8n!HWS3fHvE zLNBNCg>hQqb%XY8;4Xi+_|N!%lW8EQfbT~yr(O&oH~7Ug0LhtF71V}10xn^K+(Br2 z1h3>f&L6+g2NP7cIHXEFcGNWI$P}hiu3D55+Dt1FyNugO+1EEKOd}+iiWVRd&RyRX ziNh*T65a?{2m6pkjsZrm4{tq0#jIIci_;xmfLi#w{c++U1lO4=5lG??368PZAJ~4It(7;_CqQm+Ng^7{=T+KPVp~3{CyT%Id>23$vAkUB?+)v zh~+F$r~yeoYsPpnMF$$4lJ+ggF1*#I+=-%C#OlQ#jFdU9*><)YVyUpjbGN{#*@mn) z#1OKbS%`)f*#r!PL5xtGwh#a)h30x4=8u-&Jp}gAL~M)bA3Lyqmg;knT!n?N!v!!L zbE(K43oXrSHiK6z15xZ=0WLmnooT=v+VEGzzfbI+<4Aub6jt1Q#PEb~wFeTN)@Oy# zXdKkgCp~-N)fUtlSXxo^1RKQZssR((FeIGI7BYg$<-me`tb;z1JbTb)Mb}@Rh#}Qd zc+FAw7ncFb|5mNPPpwDZ%gqQIZ)~*ac6Q|Xun7AAF2syJ#oAQz_|z$$7@>%x*seu- zB&OW#h}K_6RLFEVnT1BMnrDyq9pm4*SoQ3y6>{ zxiFc2BuMi^za|kg;`S4?9K)V4=gfAga$D0zRL4nfii0ccDS@WsW%gtDi)c|+Uj^6x zNb2kv{N53*GW^uW{}Cua;m3m`$(r>ALuGQTY$J|K5v3A?3jc#AKfs((jlouB6^G<4 zn?`0O!s+@dO!J{z|5A@$zRhyG90PsoC%j)2rk22=E59py zdEg#+ho@50@nGLv>#_ZTF>bDnnjkvXol%xl`VKTm!wXpw)BCz6ahwBksSXcoiS_WF z6>P3-OniNGxl9z8R84$-n5gVoVRYoR&ylubJpF5`sc0j!I=lgc?r9|D8}3&7nWh*o z#n9MX`n*@V(pp`aIt2_q^Dz-9eEPVae*$iT#x{WT+h0yhs{BXVS>$`%VAiFm+`Y{7 z-!e<=^uP@_3bJuFWT|AF4_2cvcLJ=F8$rfr_*RH76tz?O?$DFBm);K8_VVE}+`Ou} z9uboNgLlSfRp&2vd;rr!CVWTP!E5#^xB_RmCj*UgmS$=jq8N#|^&rJ!ct0Wu%b?j( zT7!6RRHcDl#3cS1j|$UI<(GS6wPH(yn`R&~G_2~MlQgISAIm=afRcz8Nt>0r{#5W# zn5Ehr10f}d*eSQ1G9Lu4m5*}fjO?J6CItqezL4eIg!fRx@{OUS+1~n<3nrQo0_YdH z5aT%CPykaSzX{XNLx-Kd4=#k{8POhir^z5PF@Z;k1d9twp$7+gB}PT1Qqx{p*dM)q z)RdVU;*&^7w+|+x?g4-6pE!;CFx?@>A$@n5ck^k(nSn3lF<%)(R*DwGm>yn*@-7e` z{acOZES5quy1)8)$bqP1>&4FB;uZi%Z$TdF znAaGGb>nfRGkiFLBWd!jdqPjuvUWA~5aGIZ%pk};g7uKV=*jOMst8ie5@3diEFZCL z&f!M3D?6)GTdkWvi;f0$RNNYzB%C)3T3hPR1bZ^r9$ZPXO z&u0%;2X8KP-)vi6Qx5>xgWWe)apqIgU6$@K87T#dq4)z8foq%l3%gK9* z+gZtJG4E(u%Zj`rFttTmk{S7@Tc2g=%wV^q9e6g^oFL ztu|Z&{W}5mJ;0VE@>(YVAfTZV!^pX=Hw|3dulQZ=x3We@`^hMU#jy#=d_dDQmLGmb zc%f@{?mA6pO%{*|H;ZRaAs449{9k;O9zl%VP&I`^1v^Cc`rStN8d1>>@m18LORH_` z3%*a@ebkFPiXgMpV*aPr1;q{AOpsEdGIB?cD~_=25?!)0W=y&kv9lAz+1yVDH1W&{ zysg?HUEKrW3V(BPkLqkm2L5iW>T|UBsf;N=XZ5C*rp+~g2=fjA3U!Blj=!W0hmZ`b zcp=JSUVIjKahP>)E{my{4BWttYSHVGWe4Q@!eLg2a3UUx-t6&ab=@01&MhDI%$HlM zd(|fZ#5uOm@c#)HJS~TP`T2I&0LL=vFB;LunsKN^33uDyVB>YVxDbB`?JePzTQ+qd zkF?4T$cTA3P!%F_=m;tMm+i=nb&ygqc!O_wic1g>z6&1b#`= ztJZvEkZEVAK-wGwRrbH0zd+>R>VM?mv38v{%6RY#Q!%nRN!uzsW`vE8sOV8b^e;d!X>V?5v8i;lJpi9hrU<o^w|4P6qqH{FH)Q;2S5FCg$M&Li#Lk?k(yeznfA)NG1I>%bYw zMF=NZiHl{c=y;4w`*&53{C}KP+0dU#+e{*YZ+-C7x zbrPtNIr&%sO80WtUX2u$kWpGc02m|f#ZulEP`{O3{0(fT^x>YQGldC*;o!?8@ulcs zS)l0@Oi-u2$~cb|wluQ0y5$8pL;XWbl{Quss4e?KR;L@-RGa2o=1Jg659h@OC{LU-yC z-MGt+c@IX;Z(u3f576)PUs~S3#9NSGx71nSBnwm=?|I7#V?wL9=yO$zx;uM9BWdw% z#gT_3*&1R&%SoXOH!Kb!HDSR?;=4+OQ7aRsd9ASW$Md-F3eSMUEeQ>V9ku&KidAIk zU7Zp-gZbmY>;X^S=*mT9O{QP^;eH%G}KM}^q-#bUO}c=uznPSLfJ2XS2JL1 z_nHLp&CdPMS=zL@@rTU|@M|K;9w@-O{swwq`N6eVWRwYA{*rw&ggWYwbKYyBLKC^h zAf(v1=10@dFH;de2!-Gk5dj+o@4$$`i8wSsEditU8r61XTgV@pzvc%g!$%;vQp7Al z`-=4&DE+dnV-|f+Oax3QL!d>A1d9E+elXGpbSp~7@+$R*DG%)$=|hr?H7}7In)d^l z=dT~Gzwl6AfXg8hUj1L?0gF1^R)C*NCyB9_w3 zzi>)tfrooeyM{n1n$1s8QWSgRi>W3*NR~tg23@SL96em9&GOCgF;oL=0^m7L6%er6qp6;g_KVZzNY+hJGCX3>|Kkw6a z_~5;U!AOGCLp|j%2=|~UChLhyi)iBEB`H@He}P;A2=tkJ&d8Ch@(uS}4OdeupU8-z z(?M7>KF$Qh5M=4>@+r~#F#oL*rI0KElc_Nxvw4obeq75S!j<5GrH+6eZH=*f5*t$U(fFF z^*`LcuD(k0_&Lt!)f1#x3a#n0g>_Y)Qzv zBR+|CF8F^-K)Jl{YdQ?MeA|`YKL<(*kz<%p&;`m%bs?w@E9tdsLVHi*3{Vd9U z3s-CZ^_u6KEALdnmmp2`+h|hxNS(b7>|U%{$0L|JVXL;Ks*OCl+)LR>mvc?#ieO`| zcbKBE`^}tTtL2uLDDKAUkW$G}v@eYfBZ%&C6qQy6!}NR$FS_z ze9cLfL%7Xe$$hWlK-kP4;K$ICffZ&v+kumZ7wl0(+2alz$W($>OW>*YZi;m3wQz5S z5ktU{V*U>GV8kK1!y;u9F>DO;nU13TEGnMa+5PXSA30lcg5P)j9L{S{FkR!j$AVg& z_~%7AF0*GT;1eM%K#_k&i&g9r>2?7tDy265TLE}u_^bDmTzmQ5QaYk_@4GTs8a3&6 znY(sS@fs4K-eG-D_kK!u$3MU;l}AR_yi0e?a?x9cahmw$KZ>U%NdR+(F3W(c!#1>w zdb5vcVW)xvG=1~6p0OAjwC_&|N|*0_d_c|F(h3+}GUFz+y0v~ze=G)0Lsie-xiJP%0b$b7iWW& zF@O#(=|3~G>cZel4`&keY3TfyLi-;?OBys`NISEhVVoNL%G1Uq%i0KW!+ zB6*|uM)tiQ45aZ74Gq2tfjAiZGU-odnZt`jA!?P_*TaEtn30o z6TdGa2^k@n%p9*!_umL5k;s-X+rfD)OW%erl1=q6n^0Ec58WX!IAlYf+`g%*eTVA5?kezZZnu(k6ZsD)ppA z2KAvJNfG(mKh`=BrbHP18zb7u?dJLF?_Zq~w$RL71VLZMB%|m`X!Hx7+bSM;4H}YJ zM`vjaTpx|yvEnXA7nW)p55Hssr{mSITEF;XFmhOZ4>R{H;*qHLgZ7LXA01+MZ!A4o}oGf;qA~!;;UE0QuIkqPCflG@d;N(N86grH@aC+tLTlm=F zpzTsf(8@i5MQ=~+Uq%YksH{|(0us{x?zLfl^9s!pk0e)o3^=Kic1u`Q(xzF5oxiB0 zqEdqjm~C&vtwNIwVn+T4!9TLNl*dPNwKem~-RtE#^Y3o!8ST#JbM_ckx{N8%oQo@r zqzHC9#i&u?ctl}5DPv7jDduC?Kk0XogspO5BM)g+YHwX8MHYYJSkdTrJAODD z(r}byxPr%ZuT67moQ3bB!yH9|NCZQ(rH3IpEEcv>IjOM;(onBp#o0e%|QOH53Czd564Z&gJ9-Ij~ugd@By9J1gO7}CVNy+oeryM;q{ws z=dnw+YjuTbOJj?MO4Bj@lJxhWD~qcTK85C4L%EGjN$4R|Qs1oQ&&T|8r`) z+mlgX-HjB+{+R0c?y6|n;Qvoyo&&){5|?58R#Lgb#Qb{a?$uz4SMl zLG>Fk`Lb2-t9JK&ayADzMP|T9>|gjUff+NkF=ZR4>~o*+CMTCE(jKvrqS(fRZ)p_9 z5a!1i*%|)*<}vnoYHTJ3%?FRzlnM>SEU;;Wd|mP4vgLr+SI@_fatD&X$3H8M{FD3? z5t}VYXB<~l)nx}ryvu<0p+939}Qf{Qzsbrr6yx_-T3?M4+L985a)2C28a_if!Wb_?elFsI%ySH;x+y_f@b%>bC(bxcZDU1Hvw{QyVVk zyX*ezzKn|o3Q>%fft{t^w7KJmB?2ZSNNaI!ia4IBrboIKetTwBamHO>q&A#O-9i`z| zViTr^XwX`HGC|U?;?zEFiS}B(J-M=Ug!Hu!mjcR`+4321eDg|RQ>jC#|6QfO>4g*% zJNFjzo#T*2sip4%=APvVMQLYAqha>-h@AB9RA+$qC9u3NnbcmaH1+tPY@@!<=mxku z3fz=ueeLsj_;rPy;o>)ArMZmNz2nWm(`8^7z`7Z|RR5r$cv(SnZXD}{$j)0RgNVVA zkAm4w{fVh0xCrZgHyZ*qc003$i`)pw@tBW*wS1)9SC!-c$3J2i>CNHE9iMf;gHZ?) zBGO|&ZA{a@#W2{Kot*s3vw68YG7{MTH{9EG3wok`bun7~Zcni!vq-un(>TA?dl3?> z{pa#6DDt?$kwJXMEax`Yw3lAoeh&Teosjs1K$OtF6aUL8v&U;)(C5i%yA#j~ zkOOpPm+%tp?)Zii=cOS?_7)%==h)d{#^Rf?$=*mZ=)K`(<#jR146XiJ`a;I!ZiOaz zC#xwOS+nW5soL{pCN6{T8;LCF^K;-7iBGAR`ojG-**@qQe6 zg?0$hmx0ZaBEK{cBZGhWCG{~1QO!^*7l6OhD&4FYV_$Vu^B?$zpKeP3blW(~vEJ9< zZChuqPmwrj5V=MEjQu;AlcEo5NjTQS=GdgK@TX$(ey@UEaX(-sHW?*2ScwX*eRty^ zlwNyNZj{`1_Gba7prp*EcPs4%J7X52>G*xiie}NUwgr7M9`C^f?vLy|zZ?(a! zphIrvmzG}&1AX=nwh>UV+%z%!OE*P2WNz}yKUX5?hn(&BXqgol0n$`cD?M_nb8pOs zFzfC!tx5mV@Kd9T6U+Rr)#7h2Dbu-`38FX`xVr#wASpK#XwWc&jpVtHkT~VID-tOQ zoEb7Dl#|b`;T;qo`DC|||HOf<(uKXXy3Gqf)RbE?B!MNmc4W6I0qE*yJ_Zon5)#x!{@x~`cDu0R zrSRxeYYe%Z^&C*+&T-kb?s7q<;aikDz`RBIHTcg8huqt?$@=QMYIj)1c58JF?W4%H zt>Cn&kP@DU7E4wn4x;9h^fTSQ<4>Oqp$wtB>)1AlI!r?v$@!C@uu>m}fMb^FXNy@n zcP55)XhA`=jygoKSScEfAytPI`ht45A&h2myvbt2jA;#D(SN-kRIY2BjQ2V^yuQO3 zl-SGVDr|rtvm1_gwPXc#O_Yc|Bgrjm=M3dIRqR?l5MJ!_rAnGIqN$;lV4vg^>vzUB zGRi{Q5k5ZpMD$p9Gqc--ns_!=M*SqRo)7G-UmTTUt^N+R?IHyDy_Fx zLyUKxu2m@i2VUZ@U}{o^C!gy~m}e_x)Y1(ZgRJ_E@@UcX>}anXP$CG_x+;Ba0>>q!UA|BPVF& zkY%x=Kcl20N20+^UEXP;l=y++OR`U$BRa^jJ{f^*9Crpk*$SpXsKTjV{9r*bL_x_U z_~YaLSW3!ZPQ`!~rDHAfHhk7Lyv7GMw?Ag6fpxLUKq~0p<6r3I+MGR$wR9xSzJ=8* z3vK@J@neA4Ckh}vRa@#SBE{_e0{}cSCjk0Wj65hzJ_-iRh6-6B>>;ZjL83!g>s5GY z+E{YdU+A!-V@iI38K4y~fgMM`z>8W|9cVB; zU=Y0egpSpjm_v*cp9tKUrmnSDN-K7U!$3lD03{K~qiZVvzyF@k{)!FQ@qJ@TkZh-U zxwbFAC;TWZ?hfub*;}a|fi#7`nH%ut#(DI@)_zzQ8!xAKVthcyTrxnDW6c^qBJM}M z5txFsiUt&tzxFBdcm5z#o&hE(Dj~d*AkWRVo`Ap(JmASWemAKhuSAj4*-_)(Sm4$` z;AWg*B&7HT8mns5P5L)C(Z&7~>^Rh@n>==3F6YDH*kNa5!zfhd{*e*RM1V+dfDMb z?y7ilOx?oPLGDwJ#CM{mkm&^gd`^o2v`pS-uDH* z5&RTTO&hob?C$RNVf7gvqAD%X%{?G`HJuEutyNgmKvLjBdCtH8@)8w_o*+s-Z>)uE zOEm)Tu-^!hNfvK}wBfn``@-qtBqTz1B4~;+xuhO*asRKLLzo@&kGt?_X|Jk^q2?O6 zQ;wGhjQY#<_eyykF7=TOv_vd|Sdl5@ElZt2MPzuWWZKnK zJu~>@84XX-x;0~@Jv#E=F(G(F_3g?tn4OZaTSb9ed@F%AO8NAuwZYUBg`R~#2H@-d zf@fiZSgtW{w=j6F5k*3%p#6+w9+4Ax?d1prQKWKgRGsd)l<^sIW?&9dKRHpNncagi z6;VA{ojrUUDe@xjw!Eo04dsp2N)W^zwSjga=t##ee)f+~8EmT>GOwqnM{#ThEYm^KpP(y6wG2B7C?a# z8N`J7+a^oasBk-*I%x+FoCVMkIXF5V)Apts!fdp|L3?IOUG5uu{c)}}t}2khj5N;G znMGrh(2;Db#j3Y5A`73mYo5(!D@sDNRXQS4W5-y=@*VwkacV2dhub zH2I62BeF`}B#>7H(`ff2ZKnJVPvb`eg4(++Ic3=|))~EGSJmJd6S^Pe?^q8LG=2^^ zNgXIHM5J&c;(nDQikEJ)>*>mr8WrXxit-WC6AX(?Q$4<1E^bM!l8$K z38I=gRb|5@+V8o&^|QwCwCm8W$#-=$PT^osm=TA8{^3KRml~i3NRU)22QUDA_mi?i zBPLHiM9AztQdDKHf5yZv(T<)`opFis^UV--2Gnr;(r9Bcy3yF|@Yd9%OW(|O1ABk2 z6i~$p>24xq261dEge_a0*0!3nx`pNRag{l>4!HdO)?s)fp$6XzHoEyGBkD~YXc5fB zA$FVlULQ4ab^8;ClVeuwbmDyPk=BYY`3G&EEqq^@JI>^Rj~~xbM2yRB%p!U!PBw0i zu+CN{fRMH-253Pd&>vN#%#?+Xk~K-Cc1TwI@%QsMX6ilx=R|9DHUX?1iN&6e)vbc> z<125Gw|yoi=8dE-z=V)5IF-ClE5=3K509z5wjgH40=oOBo)!M0sQRo*y4LP5gnkCX zfMV*&HqTHf*l@*nQ@qJ#;S33H(Vuscp}VgB&A9*jn@3XLH)H>cke0deqcVso#)UX< z{&m5WRtwSqe3A{nnBX{!Tat6$LdA0FioZXRH|sR`ziZgXp-{9;0=D|7$2Nsi#f0T# zo3DmYiSToh2*)Go1xRjEYdYfc{cy1<2$@q(KEYV;oKCX*zQ3PxA+S9gu7KKrIG*kMT%!FuBl^LlW!xe~4b^ zY2ap0f%tQz3|yge(}_#n8pmDVc-)SCUVv~xD3V8>9uC33U|&a zaP*W4!;)U`R7{vzHFLc-5Cu{onm<9lq$)GE-r1|3RL_vX=abUaNH6ia2B(L%y2%#emJp039ax)t@K{up;o@HKX19AYCwm{=P4(9H@6*=rein}Sbm_ur4N}h z=gSY#8ZZie++z}hpS}+q%AU@Rf%&?~Y9{-}zCmQ%JfG~q5shoI)2nOOsc&t1=9Bk{ zQfSj8?4_JQ4lT?UE5%Fs5VbOr<5mkn0p@LuK` z_G%Vt-f2XB-@T7z22OabVdiq7L(${Zgved+3n0Y9cv+&^0Lp-#;?-*AojG6;XHM6f zL(E{-=WDYb(m-(^cR_Y(G$Ywpg~d4LrEv{>DB%H}#rf}zjjlO0=(Eb>9rE#0pp?Am z#lyc&P418E=gHr&y-3yfx0XNv6g;L(6{?%10G^i$pGC0nKnjp{C8ef{VG_lTrK>AcQAm zh4Xd!Xwh>U^?XUl+6l%f3FYkn(okxm1Re|ue%6}_HL#>gej%#7>MciK7e1Rrd0b0H;7P4-`X zaj7)k`pMWZMx_z@vvM!8CU#!4%O9~->)z>)^=C=gV-$MmEf4kbc>gpz=vNfzy~}f# zB#AtIY)EMXQzM?r@Fng>vZhJ}%9#Bs27dij)C!+aqP($=4^{qE&#AtgSrK`M?oqnk z?j@7qc&crHHkbr~9)gn@-G>Ch*)N`8uPn$*<@v>){WCinidO0RK}IDciuji?Rpu#} zf}0J?tqFwQG{$YA&8SP@VoX0}bmy)ou>|ZWrZL$Q`#{FBrms4lOLWAvRIvk@^rHGV z83?|HNa^ACma&qUaiK?_p1VzJogNdZOc4&=sO^s2iEMw-zA?@A(3Knf?86_M2Zidy z{s@vVV9D~z-K*7l(6mNuLt`9B=!g)6#TRH?o{=7F#3#0Lb@n=~+HVCtIl3|goNv2l zAai5)cK!Cp*RJGb%2w^xS*}{PVp4nE2q>Jt$df{&inHSH&&6)pY?ZC1;{VW0td zMR)AwXevhq)$BPYG;3Au1xoPgl4ObHa{Pqa^tmzHG*3({-b(mM6aSehM!-`d=G81) zgGz1`Ow}WxxKi{>z`Wt2Z0B0pW{wcrkBxRLQ&Eu+AaTk?MBBlu;i$;bUYzk{^-G4Y zcz+4Q=tn>)_z~K;4oVKLX}2e}7m${L)z`)hKts?*b>NkPqsy>yQU8@qG!}Nn{O3N* z%d}K?D$=2Q7Ja2tsrF& zzi_dO)5F}L@Vy$eY++WCXuIT8I1@9R7dbtFv;h*2Ba(lwumH)gDW@kBsn1gX0bAQX zBa`eKs|%DF#53i)Yj#82n3??BW4k^!yQbO7vq_PcoDu~3~ zm_jY9en>civgpu}1w8!T5KLmZKiPUZ2n}N}J=*^0bJR(&WXRc8W7LV7GBZ@gdB}TT z{?bG;%tEch(Cs{`#@eM$M%Yg?zyIAJ?ztE<#Cp4KBIKFYl1eDtRa3r8p>i6a^tJ-|iqCZa85oQ4r%xL-K$x1Dm z($XBy%A6~U=>Dd+i=*#!HX02&n=rdtKm>n3hY{-^^y(J#^>^Yy7o<6m-KpJ(tPl=J zghN~rC6JBIRYqL4Xi!h&uH?cHP3o+U6fG#?l3nv~4en>8n6W4M5M7`}dikO+rJdy) zoZtV~pU|gY>rSw7lIh2%hq;nR_TGmq7I!l*-PW4Xvle{_qrY`0)W%X>9M}0FR6Zt^ z4g%H$w-1~#(#_YlN08My0T4vWY7Pt%0qlsB$(**eVwtC1C~3g0}}kOUtnq>xsOu?YgL8* z@2rdKGFXAa)<{L=5WV7`v}uh6@$)F%xJp|lMjJ+VKP5{s4L;Pg7(MWqafOc#hf{FW51l=&ySqnig#{+NcIX1K5VQh*I`3~ zdeVap@{Ey9`HJeJdnqXm+qgC68wKGTX1~+UH9t(-TW}}VNpCv8aRoJolWkqAUO>cm zG8?Q3ugui)vD}G^55c~!6>lbo5FZ)%`=cP16_1;ug0arS3~4Fc*H}bCIjK!@1{$Fi z3-#2BaWMe@0nYYS5p3s4QsOyKIhm!L^u}~}fzn#EAtAI&sEoY)gf|Y(4&9G0913$* z-gRJ#>sqLn2k?1kJPz~&eErJ+)#XIQ$AIN(RQQ5D!AMz(^{>!fu7dG{e>|1xI-9aZ z$=B}EtvDFaywrk;507%#V$t6ceDlsz`gwIR*brCJ3m@|mQznrY?O_4krP7bWI{jD@ zkx`$-*MO${y)9Cknkn2k8vS$#>M8H#*v=i+5{7`Em97OSjnbphtYQY_vAl+V0xs2j zT49830>B6^BCMb`a>a_59n{X}{^nwATax^+d*o<_AWD04=(-T-4jVxf#E*B;TJ%%e zn9XX$_pv3!S&z+z;XGf9*5ziZZ(;vaYxsYdu#KI{5T2CClqf}bT#;mXp4^`$n#{)kO5crdiGYUnAyVdBBw{+D*bMbm05d+WybmSq=#{k_ws3!uS@rL=KdW@fa)4zlqoPx$v2^Ytp| zCFce1rlb@D=N3R{BM7E{6C${%D+hAL@vn)_Fjw3#nxXty_>j~-aegN-TnRT;A2_tDt#*7 zt)+sdbNQvG5#KW>J4M14W#Cu0p~>9)s{)+w3WeSpLR7YnGNTDS#$9_&<?KHucqZjhEsd=gKeAriD z)uTx*>Y&FS>`I}P(BA2H|6F9-b0u9IWdMV+N1%Hjbn*#leOjVTAz#;2zDU$;pfc4q zp}82o*(3P*a&`O~li;}9{kA#g>A2hYgyK-D#;64JI9FVCLXbvucoav??#K|aw6$B+ zHdE+IueqV}8Rc;4L7`_43;&^%Nt(FRX8{WwzxlY`-ZZM^9u;DXb&RaHPf&Lc57SLX zyB(O7`;K_FahF!t5}P?F;Eh&I$>4Q+b@w^t8B3810KERY`+Il%SWi}>LxiP~>l{z~ z3o}8?grBpp#?>fi|LM}sP9tMFkMYoU`<^bk0S3l#{&TD^=_RG(_`CV!3__nZW@(hQ z{_IjaVOFAeYsS?Vys1r`+b1;nGCk$Ro`*Ivs71Y?7n`K0I0rbPA>geqmxfjjEb2ntzl#H4LM{ zK%R;)%iqXOcMuqh+4mT4S;BsGgGMKxL+cHTp`xOEyHI*(4>&aK|7z%)qA^6XWsDjn zv6Q>m0a^?cXe~-UeqHaq9Gy<@0EsRg|0_yW>c=8EhiQ6kit%NqjqaeD-sSrdt{}UN z=Ym#K*EaC|>Qpz6Wz|klOJk)k3QNC|PDLaNog%u{1H39&Po?TR7R|oIaH9hL_3Wg_ zgbTHdA@Lp_JX#Ie>QFg4g~AHXPFpxCz43{9G}?nRV-_(?+FfsTs62j}*On9CVIO4H zm@w6H#71iW^Ha$iq zDhpy8iBe9y0e$twOJi)d!eQFcQL99+1!0mnc*yn6iX)C@yzyJ$0ycJmDt#Js-uh{@ znq@6@=?bPKOqO#~4QDmzFMB3M%XCM1D%4G>ZB?<;oG+*CTU@JRWm7M|yk`HOsO(ej_~P*3bXe+5M6=7?TACAV#YdCF6N z<@|A6>e~=g>=45P!AV0BJZQ>$fg_T3a&9Kf;tW3x5-%L_GZ0iU6IFl%M z7xy%*dn#YgO_j%bH(*wNQ^GCgRscNXG0bo*nFYE6kN)ri`L>0&MuEH1-Viv<~p z0;lvLj!VBV>yFnAj-9u%ul$&9S;x5a`kCIcwfLt(q{a`rolNx;r~fQ}xG&SC2N?^2 zI-EvQyOBX{XPB@h!pofNi}x~)EW{b_#;Af}%)#azauGaontLSi)OJpax|P)0KP@cs;t7FwUib- zaK_iCg+N0iMv)ex$_j|#q=hqDi`XZcVZvL}q9GOB2o(2~B^8&*DQP1GgMi#$#dwAT zG)6C}2Ls4?_R_RyMvBt*3uctknhR0GMTFzT$G7JcaZ1}%)#DT~me zJta5}PQ!Jf)>8DSrG+2oK^0a(iv>u*QK+W{ueJ;^T(qFb^T;&1ipdBY0TWiUMw(H> zLc(qBwkj>TO6qB$x#<^DrL?ETB7_haxD4yAdXBJ=@6s^AQzW;3yWo|&NxTbw33;r; zQ2CbE&?3s_he?Y(OEtF$XAKCy+TIenRtW+{U8|&`gB&@Y%Ii17x0lb0=JtLI`PEzf zOR2+80WL=X<{W~@%hWJLB6i;`^nDS6kFk$iK*Dm|o;`c>_U73$j^h-?W8`<9TR8II z{V|ye0<`3Fze3+1Ff=~g_QCgQ9u<>lfkLNi4IXa~*|%d(w|ZvUzI9#8;pmiYV~616 z^v}gtd{^gq=iKEu;FoOyT=^$+71{OHT6Ng@q`Uu=! zoL_ysm8Qym=LZr4BuP@(ZDW2{SxXqvT|1c*VZu@_N;wcXKOk9Bn zSY7^~!{Yz>;JWp@&w%EWBo8p|4lu>mW%bbO0TX3ZQ>jUZK)OM(9}z&5MxOL zTDu*vu;@<_rErX7miuM00BKlApyI-w+nvOX1qra{aA{f+3jx*Tx3oqTOT*+FQm?dL znQ~s6M?*01(M%UBdjT0cYx9vA0;V->T@Kb?boq~`Yyi?AxaL9sR~7!LHviAb@u406 z>EPgaEB`l9o`6d>>VOS95aZrDL{r9k-PyWV9H_T#bR=7%SBdoH{U;yt>;P!g9hPWDR9h6p-B>}K$) zkZglsN>MBmey#+;4Bn~`j3A}=B=%Q@U1yOkg}l$u$a) zmz)PdU1s>wxKT!Wc#-EtPxa3p27&N+mrm>pAV^}zSz@iIvr^^CEId3wj|!sPevNMH<_##O!KW0&hyHxs} zKDdA(n7|nV(=C@js-Eyzdcp5x`nCl2RQYlEdvaC2M&v^zKjRA2ZRXXWGqsX4OuG2V&RJQ>!L> zVbqj8x2kcjoL4hfP>%kdX_q-DdvW*(3>f{jg%*V zAH5a!{Ee?+XWsKmILO;u`qr1KmvKtxt@Ej`^}V6t{Td;8LXs&b@(v!``n-92^YXf% zRQa&0-ixI-;Q?J*7`q+qOBgMwFWUD~nvm&o?MoQaoVzR3qA|(Ric0)o=z|dPl>|5T#3*x0y6bfB~KQo@l z^9`n!GPvp@>4>DE4`2fN{k{bBeL4m)ib$LY<=}E8P{gbvxJ$>mg3BQ7f{1Hsfcq1{ z5MWAEq(J7U`VQ?Zqn7H}7fBYTOfwDDoIj61fO+(AWdEvE1k|;Io@VGfj#O4yEMoP4osl4&qLM?IR*WHPzmP%lk9XPFLm8fPbiB%eTzX{}mNxXC!R>w)rvAa?J z{iVxLMB2xn-}7GV@{C|tFq!Pilg25GcBN5s7x-v~J+up=nYRn@=e>W9=pO%@PVe@j znfN>8582Z>WHPh>=%MueM+_@ zgIC1LFx&*SY8bqAOxOzYx{1XY{C#%#=qrwoDG+^72XV^0F2Y^&bqjC;NN5vxg~TFl z@6T;QDTQ1I6~~1U@i{s4xkV&#R#Vy#tN&|6{Ko3)CW-a`vG?t}apPE@`?sHhum_m3 zQC4i1?KBG50B)x{<3YzU;$#}%8b(W&ST2rLqDEBt^3CK8_7(Q!_DMeQDoUaxN+p+_ zj@W}tSr_u~M~Xb>@LVWO0q|z2@I<4y>9Y;W$+lYQ2v*5l_;rDmnMkX-)dymIfmLS7 zy6uK;1*7Mh!J-i4S*^Y@_pJdejp6A4mJz9}%8IZsMpo-tFzXGh5=+*R&vK2NUR69H zp7`NrE%T~Juu3dhN7lhLb9yzOVUE>$R|K2aX_0TDQ6RSDJ3AC9 z&19H9I|eA4;bg&g1=?$2jYP(PKuB49Hmf8!cPL`!o%*W9qS-3#&-F%TFa)` zdz4&{XELMMoHe0dZp`;{3Y*jrPB3?|G&J-RZiCw>5)}GWs z(H7-zRfp0_U5~Qg@@}T5x*lb}+1<)x*DW9}Qq0tpmMDnXx1oVK-2mdLDx)ru0Yp^6 zE-6-M3f}OS*=4yj>u&32%QAL!TtTz=LRcG+aqeC=9kRuqiA35RMN_eNe0H?xo!K00 z@w6LbE#1lDX;%?51^@o0Il1ZZ#FV1!mI)$J8#lGHsgpg~RC5myF9}^ym@R!#-MBKy zMvSsPWUsC^7zSKd1@)y*a=VqP^M8HqT(yk``@hM-+p_=v{$T&Nma>%{m$W?nw?5Ke z%}>AFZmW~`w#Vsxosu_*RQTqf&}WwH3QhZCA(Kam8b!H?N1ml#rr{9vG4`V1Q$}tJ zflg){&v};c3c<(=0=bLKmSM=q^@xZuv0dmByIW7F*or>lpei(3o0tLF-o`2%v5bm0 zFmu#EOm(sFQo3_)?!A5cc5~YfQIx_(PC?z^50ek{P;iCe?j)23Uag3dBVb!?=vj@< zUA7{uI!9?$!sp4JMr%T~OxCLsTA38vg3x?CqkkayP>_l647j?SMyJx1ezKjj;k+Ix zOT2BTn!h))T?;SXy~kla_mwUG^jfwqX?GaRypqCdptGym_c9e<1iQ{gM{-xY+!N*w zKJ9B>8HaIQ$lSIZ8Y$I`^RtJ7VSTehx`xgDO=z@8|fCz zUw`qL>{+?~0x~u1B~r;#+()`>Bl)_lnq|1I66{E8me;kh@ea8BYj#z1&p3f;`UDnB zo}da4!F{>%UDp9$=G@aC1ZXyc3EP^GFk3(~;FW6?I%cNlh0NO^_3j|>wBP_f^NJjU z5Zyr)=Z`GoID~A=3t2!#Qqndn&(|>^7$EM;uuM^i{#$ZuY`uCN+iw8xn>SugF}om9 z7dnqODSo4(H0q-{1wV(_zY||Iz+CG0Hl=~Hr=Krj8CPvzEEs@DIU zQNoICG_3!JZx2iS|KxaB|JPEsGlF57xM1Skzl(;RlDdm zgc)sFUdoYIFAbZS9{Q4vy|P;`9&uGfmaHl@7VNA#bEM2?^{Xt9P>YKm9P_1cDF*0V z4>(PpT&ag5Ni5Kgn2krGh8TvrW9e;(Z@kdpUwZF<<_#4yM@iqKIk)c&0x+jbSOyin zEQplZ*#VBgG7=G7!000if)GA1hc0gQ>4ikSgi>x_8o&^y^4$CUvdPiZ^LVFQ7OZuOqLI1y&Liv9_(u4jd z3;0Z+u+3Xh|C6ulht~g~N1N4KOhq6<#tQ7%y6(mCp!Mm!RIUFx$C4G>XjuQ>zC9}G z|0hR-{%0*^OAC9`A^h8*2(sI=nl`ScJ*&QaXBr`GPzTkJNj0QVJ?Mx`IwFngL0M!{ z7HQobv_>YaQGP!BKm|4}5%cV&0iZekWJ^@P z5I~HW(Z?l80cB!EI4JjxyWP3_&BY?v-={dgjqwjgx;R;XV&)<|psJ{o0P)}rIL`Jk z`k|d(o~_nURd&0VJHUbez@%Q!9WtZ_{y+HWy2P1XuL}5OvkqyoADC zlODk{D%_Q0SbN1g-_)jH@wCf-I*X?OFFX`EA@;qHKSbBkDR@I4qCc}(1Y#-{9N3~6 zxra%XNr{m?1)GP?{$}Ax9Af|O)gA#<>3@1r{D{(||Jk1u^*=}ZlcPcZvyQR_+ADqr zrBAgIWKj52DSQTHPmQu?Q1sL&dIlv=jgn_j@MPfdKXOr3dXyU)DAU2w2w{P>F8(nF z6kR#ae(0e^*OsbDXo%#32%TuBvh9}u$BTfZLx7NCW|Z{or9rX7?V(OXj}Q^&rY~@^ z(3n+}y?Stpdea|GXS(qY?1Hly&}WI}@GgT><|Ojz#ychiZtiZfUtD-imq|pJl5Y$i z=E$Fe1@s~U68Ntr8<)+|oYEux#bB*)e1bQ$sVUAi>W zO%2M7(^_Zbt0<~Z(UN=V+c$Siw=+%%BHxkP;sp!@vpr!7w9ji->3>xC+8)|y(Em&h4vX<0kB%q%gZ^h7WlQA98iGH5 z$H5=@5dMiGKZ*_wVISp#7GWO+W~&YQbH;qMB+#15A>gAHs-0om%=e1L9uz`7ir0rY zk3U?gX1ZFVsYoIbSDp#MEMoE#MNzXxxJ z^Z)gfE%5p0lhan3-^#OpqrSIi0{~7z3r(z@4M5>yuL@O0F8#J_(NzjRD{Yog>*bT- z)7Cr!XhlV(t0lf{F}R}ta<-}k!6mk{g5ba5Fd&>(rT{{nr-q4OM=%@)f{S(x^#r?& zFQCuS&wkC454XFFB9Cf4jTw|S?#V8QgifmoD!@` z$BU83?ba{Bs$Q2L5lG7IdSXMca|NR`dAe@0GOE-c(2XNalpT~#a_dqT579@8n=5=_4d?#_cqm8s*#*ev@i>&^{SIa%wdcEG6@fw^}Nv-5n~CW6FippxbE zGvX(um;!}@40)H%B%!K4iDT#`1fXcTv9SwWd2&x5aiy-@Td-ub{v0kKd+dT&GzIQo zeqDy)Ih*051cuNf!g*1x_hAK9+fu2X8K8vv+J zq)M?KOB&P_O;XdY=5_5{$4r6AE~Ifd1)G|!1HlU@j#R#V+pJQ^cdn}RDQVQQEiF@t zD=tb`Gw*`UP4%bZ0t!#m(?AQ`-SThU3bW}Jwa~{NywvBJ%;XBADfLmr4*=*7^%g%c zu&7=Fz^d?Kw0lec+SmX9Q-Nu>aheo9yNob#V^@eRn!{mFLlEPDv;mtgSiQiyc*;6c zgW->JCZX&9iSLE*6ecN}A>T`T%KqQz|97-k%Kv$Ea5U)u*HX5?B^`C34f`uR40wGC ze@0UAgQ-Jlb)~+qHB_P7HxcDr(H9Lm@zwRZW<)U4;NRa$T(P`{f+^T%%*Dok;UzPE=B7b~Pur7dFNyM$#bJmaSl1&I z$1q))UQSHWWM_*f7h}WBX+x=uZz2V&7zb~ZrH5>*tLvd6w8HU_)&jPG#0xJ_$^_jp zwCAZ!If4gZ)mf0T1p<0Ka{(=1#rT>8tdz-^nMgGzu?-a+Gs$V#L%Y$ z`W?ZoaMXKlwjFxF$z6!O9t?=`L&?ilc}T%X_K7zC;;Afo9`D98Up?nsKfX82f0hpl>$~9Uw0KBvk&mTt$`f*E1{`=)Ig-PUv zXHg21ndkQ)1vbck$H&K$qW|yV;o$$fmLlapIqX1{5L${n%MRYK9>sdyNb&EAS3jBFI282#Qzg;Su zrf%^%&n`}JG()$`#LG68{I@0aI^h%d#OCj1G;Uk1gyOBU3y^P5RE*NOq2k`UXs9*sIPJ!KJRGhZME-Tt8U$TDSYsr z6j{&NE!kGLA=3;w3S5QRio>u+ihVxD0Rba7zlmGeXc%6oH_;epHX1PwiiQ~m3ayMV zjARsTFwDI#CFklJ7p_xN2iy8wpMtCF+~vYLoIPOhu*=l3X8q7^UPIKsN~R?Lf4KPCw+~oj z{MY^B`S0ZL=*p4#0@$9!p!93d#KU{omiI?PE3}?Z8 z$ksY#jY4ICG9j@vQYIyn-YEZFM>=(JA}Q(B-NXJjch2H?%6SDY6~5I^5bV9B&QhOfOh+{9lhT|Mk+y|CQpuP9}T9`OjL) z7Pz#J|KH8n&x+x*Ve&dz_SrFZe1B~UP~O^%r^%@j@eG76k4EgtuE0|gC6Uqx?w z(YVpyzKVigtOje`=QG?ZDOkxwu#JsiB?T+l1GX^;tfWBK$v0#0N z{k#!wd}kLuv4TzhA4mJe_)kZZA^-P!$`(+gy@J6{VgGoc=BzV z`ylBq%pLM_VRz0hEJwpWA(Hwfm;^C5fMrva<5AHO6#wciQ22C#L*zG3yiOg-Ss3J6 z8(p#x=E-;KcqGx~VH^g?k#Oj~tj+oB`L7?{P-5&O(fH65{R&CtG0N1Q8(S6%2Y z`?O0n9eDzyvy1z~F*v)pKW=02QPU9u2|+kInK3!1X>P4LwM1*clg*7zLj|zYg zab#yQVAT(G(~sGJ^DpIWLjnA zU#VDzFc$Ff@WnFRR+rGl;$5ChjSq>~XHje)XCYqRgow<~arzm0!P7|)B#;nD%Apv} zE~a4r?SZp@>>TVl2a}2I`}u8b3bbuZzmIfBeY(5~haWY+vb+0x&cPm~Vb7TyipT)D zMQ5tk0@Gc-B+2UJ%9QE*^Gnneu%*LvY@h-Pb0~0=4l!is=E+R|FriV%djT-?;Hn^c5Y4n|Hpd=W&i*Ey+Qt4N7({$ zvP!>gE6a$>CA){P*zi;9!vd*HN~B2)Me6_}|Vh&{S&EzrTXq@1?SWnxUH+ zqiuN&x!_Ah=ib^w-P-EXRBE!Hn^Sgl&Ysjusb+UA-fe9pYAUsWNn=uu)r#4hdMR~+ zPDLW9?A?|&t)`;vT+Izs+rD=DC{`~ufK{bQ%HC~l0Bb6>Gpx!~_od*f1*|b*%6b7S zTNb|vYBhk>#1|3owlr`q7grg!88I_1`aJ%KdU32I-gaR~N^RBXE-D0N9f(eevvN?> zuT27ohb+)hB~>EJ)^nG-nbYLXYB6(ccE9Q@>baQ{W9C~LqUcVaNn>#HBm-q~715Hw zqR-(<5EW=@(2mu<+ct-hvDorgoE&BH{|a}%k~*>6pJ(T<3V<_U37gv#u3jnT}5Mr}iAD2{5-f7Nv=nKlNdabKFMfn7LsG{6ig6 zIVe>zifUchpZGz2$>h*;A;E=fue#1U9V0ZbI z0%~~66z_`oAJu^=ntUSpf#Dj`nF*C~qfe!JN;*}(17GHtK(@H?QPYn-si^9OA=udw zec9P@Hs0xiEq!hbP&C8Ig2%C=3nmnYo?}2DEQQZ!=^61%&0`A1l@jr;N4mEg?e&$E z`L0KrA>{U-^kmF%{v+~%t?T?}?`X1DjQ@T3_U#b=VJ$_S{{S)UuQ2UP*($dg`hwJ-k;ja<$~i z?Yf%0`oYb}yM(Ek9*=-xE7s%{)%pGB*s8~_fxM#f{F$V2p!u%(beut!)HdtFFI%99=EJaewi1>-yd@if-=x zHFEu;MLXtSdw9EG_xN+BAm{nGmnmimi1M#~!FMoXXcEX^l8dF377AZBaae9OHdrYJ z@G%aNkJ9joy^nYmY)Vo|A!e$WU?fA;ZG#(+Fl|>l2d=#8T;)R9QQ|r# zPD-;HH11XPppy-sjzMwbZ&y(-$HbyoVZdc?)&1^fd36{xo73fJTHUfvmRc(oRYR44 z-+EftVo)cGmuXrz21<*de+g|!R#nwu&}b!?qp1)3H&Lv<1+%K6!{SzpL7P-*FN#4? zAJPtpS_~R(`EoS1Oj=%7YHYN!8nk^uo&@E-jL~}-hxlm$qjU^T6CC{=-;BZE@lEkO zuzo$@0-+@aFS9R5J;w^x+BO(itqU*uEnMIL{MKUeDpX~Ifz7(Gehg^GPr4*`ELCNN zL5*@Gqp78)TvI~CIQYa*@K*wCXzK%mIVR~jOzGX~iaIKk zE3nX;)Vr?Lz%j6)tq%-1zbJtI4Mlf`iPs5(3IGi4m2i+4*wEGo1_>mom!!2m_8m>K zDp1I`$N)GAAH1i`Bu`?Hd(x4Qjlns*hshXxihlJ_xJ>Gk=vjUXOvhdaW}jwhR{TNs zEi}>ARFw?|DNGh31>=Xr^WgvxpS|Hiqgu~b@%$WM+n20V62Ee0#-RI8y7 z?S3oC4>|^o#MPH}7&vUY!Q>t$9oB;u`~kOos3p9N!7e!0$Qyn19>K)McDOqR+HYW| zLwOb+sR9Fwu6MQ=`f#UV^A^oiYg z`|97w7f(_wX@Bd1GE9r8<=$C&jy>JYEc|;_& z@q=uQ!Ci&1MgfEW|Ns8)8{X-4fp7<(TqiU9z)|=F9+-_}2G9QnE(6G25rnFb?ZrW0 zgmr_VH3)DvGiHunzvP(5fYaqVqjUVrBlMRkq*BqPKZn6Ggfi-Kc4d1746@&?wP`(T z5b_w5=yDzFs;o52%P2()cp7?yoLB6=J!_VWEwa5~b8}m(L1>mOXzK$50{vye!+)~G zf@Ta>;S_Z!3awEpYNTfy+MWReXGU1=@gfHOeGBf<@lOqGlElD7OUtqf2B&i`x`jfG z)011W`ziX2arzOFg_rvCY9I<2&OJ z*`#h5JP|)Foc6yM1_oMMmQ^sw$&c%o9NmbyjmYpnjHdNtpfimxfB|O>R|mlggDe(H z9ZfG}t*eL|wTcv@S7n0%icosmfWwPnkRz@W4!MZ(8yoL{t4=tS;}kP^@lxb_Vfe&+ zpehb9Tp^=q)*+f3A9x4cB3I{f-!|@?2fXM>Xh2xAQJ^B9Dc7~z5Z`#AgC0-kUXsd> zGrC6s@;(XvsS`eV%v(?k`$1c}^t}**k0=O2_~0ds1k%*57X;^} zrrpd<%-MJcD6-r&P8IgU5-1{;e z-EM#v9*P|C!oGN0|;;&SvOQJs=Ks3YD|j5Cu3TIXKw7oPy1RO~d0bh=?3r zO*N>`1*v(R3cb8m3s+W7fznlK_ex5^l%M^vv@$U#QPHTHweIL>#lP2DsS`+En6;P~ihay0m2e~-oJ z|DEmLy|mGk|Mg(9U(EkH*&Fh|uBB{ApQoBCIr21_hNVUtLKNm5&-$-INLAYQI0Ufd7pnE0Qa71?mSYU;a-y z)NV~9t%&t;ZV$e>|@Gd)8+DGG0SAbTrQF9p5y2&3g9DD zv$-&rb4`uJv&^_z{NA=9nF=v@HZzS+r-^Y?JuzyU>WFe_g!-NsHBGf5Irb7S3}J}K zq7RbmR*agaT9KTlq4*3=W=xEY5SjDf5*H@ErHYB1 zHEWzU+3kXwFz5d{&HO#H;BD>3Hq-3Y4(<*R|83@o0{{LtXcE>}jPid@vA=p74f6lw z?eS4T{y*NE91ZgSI?5KvPIS6QfNQG+&`VvAx1NH#bq?&ds^cAzMNwP`26y7!( ziMQrd+|STYpqHBCP!&WTK|?9*j;v!0KI1S%(e2kb@Y2i#xVCGF{z{nuWy#Tn3A4z1 zN_&zgK^$U?!6#+qt-6j#zKboo<}AF&uaS4}p^$F3E%?jY1V@EhOG=mgeY;Mz9W_eC zV%ONsHl31P>yg3E&Y_)+jd#NFUVq&#l86g@FXFZ+HxRho zoK*U0Bf|4p=8y27o0ZqL6Tq0uI7Gfjxli%;Jt7E4d3Jgt*l9ivQy>=y{)#>%l4;FP zQCT}s<14S|Y-LaUY@vtZl$|yJ3TNu_+G_%#z*`&nzaGzi{+9*+Hz~*eJv + Leave empty to disable authentication. + schema: + type: string + default: "" + - variable: adminPassword + label: Admin Password + description: The password for the Listmonk admin user. + schema: + type: string + default: "" + show_if: [["adminUsername", "!=", ""]] + required: true + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Listmonk. + 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: listmonkRunAs + label: "" + group: User and Group Configuration + schema: + type: dict + attrs: + - variable: user + label: User ID + description: The user id that Listmonk will run as. + schema: + type: int + min: 2 + default: 568 + required: true + - variable: group + label: Group ID + description: The group id that Listmonk will run as. + schema: + type: int + min: 2 + default: 568 + required: true + + - variable: listmonkNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: Web Port + description: The port for the Listmonk Web UI. + schema: + type: int + default: 30093 + 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: listmonkStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: uploads + label: Listmonk Uploads Storage + description: The path to store Listmonk uploads. + 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: uploads + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: pgData + label: Listmonk Postgres Data Storage + description: The path to store Listmonk 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: Listmonk Postgres Backup Storage + description: The path to store Listmonk 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 Listmonk. + 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 Listmonk. + 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 Listmonk. + 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/library/ix-dev/community/listmonk/templates/NOTES.txt b/library/ix-dev/community/listmonk/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/listmonk/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/listmonk/templates/_configuration.tpl b/library/ix-dev/community/listmonk/templates/_configuration.tpl new file mode 100644 index 0000000000..050726649f --- /dev/null +++ b/library/ix-dev/community/listmonk/templates/_configuration.tpl @@ -0,0 +1,41 @@ +{{- define "listmonk.configuration" -}} + {{- $fullname := (include "ix.v1.common.lib.chart.names.fullname" $) -}} + + {{- $dbHost := (printf "%s-postgres" $fullname) -}} + {{- $dbUser := "listmonk" -}} + {{- $dbName := "listmonk" -}} + + {{- $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 "listmonkDbPass" $dbPass -}} + {{- $_ := set .Values "listmonkDbHost" $dbHost -}} + +secret: + postgres-creds: + enabled: true + data: + POSTGRES_USER: {{ $dbUser }} + POSTGRES_DB: {{ $dbName }} + POSTGRES_PASSWORD: {{ $dbPass }} + POSTGRES_HOST: {{ $dbHost }} + POSTGRES_URL: {{ $dbURL }} + + listmonk-creds: + enabled: true + data: + LISTMONK_app__address: {{ printf "0.0.0.0:%v" .Values.listmonkNetwork.webPort }} + LISTMONK_db__port: "5432" + LISTMONK_db__host: {{ $dbHost }} + LISTMONK_db__user: {{ $dbUser }} + LISTMONK_db__password: {{ $dbPass }} + LISTMONK_db__database: {{ $dbName }} + LISTMONK_db__sslmode: "disable" + LISTMONK_app__admin_username: {{ .Values.listmonkConfig.adminUsername | quote }} + LISTMONK_app__admin_password: {{ .Values.listmonkConfig.adminPassword | quote }} +{{- end -}} diff --git a/library/ix-dev/community/listmonk/templates/_listmonk.tpl b/library/ix-dev/community/listmonk/templates/_listmonk.tpl new file mode 100644 index 0000000000..e9b9d0ea1f --- /dev/null +++ b/library/ix-dev/community/listmonk/templates/_listmonk.tpl @@ -0,0 +1,68 @@ +{{- define "listmonk.workload" -}} +workload: + listmonk: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.listmonkNetwork.hostNetwork }} + containers: + listmonk: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: {{ .Values.listmonkRunAs.user }} + runAsGroup: {{ .Values.listmonkRunAs.group }} + envFrom: + - secretRef: + name: listmonk-creds + {{ with .Values.listmonkConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: http + port: {{ .Values.listmonkNetwork.webPort }} + path: /health + readiness: + enabled: true + type: http + port: {{ .Values.listmonkNetwork.webPort }} + path: /health + startup: + enabled: true + type: http + port: {{ .Values.listmonkNetwork.webPort }} + path: /health + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" .Values.listmonkRunAs.user + "GID" .Values.listmonkRunAs.group + "mode" "check" + "type" "init") | nindent 8 }} + {{- include "ix.v1.common.app.postgresWait" (dict "name" "02-postgres-wait" + "secretName" "postgres-creds") | nindent 8 }} + 03-db: + enabled: true + type: init + imageSelector: image + securityContext: + runAsUser: {{ .Values.listmonkRunAs.user }} + runAsGroup: {{ .Values.listmonkRunAs.group }} + envFrom: + - secretRef: + name: listmonk-creds + command: + - /bin/sh + args: + - -c + - | + /listmonk/listmonk --install --idempotent --yes + /listmonk/listmonk --upgrade --yes +{{- end -}} diff --git a/library/ix-dev/community/listmonk/templates/_persistence.tpl b/library/ix-dev/community/listmonk/templates/_persistence.tpl new file mode 100644 index 0000000000..aab99aa19d --- /dev/null +++ b/library/ix-dev/community/listmonk/templates/_persistence.tpl @@ -0,0 +1,64 @@ +{{- define "listmonk.persistence" -}} +persistence: + uploads: + enabled: true + type: {{ .Values.listmonkStorage.uploads.type }} + datasetName: {{ .Values.listmonkStorage.uploads.datasetName | default "" }} + hostPath: {{ .Values.listmonkStorage.uploads.hostPath | default "" }} + targetSelector: + listmonk: + listmonk: + mountPath: /listmonk/uploads + 01-permissions: + mountPath: /mnt/directories/uploads + tmp: + enabled: true + type: emptyDir + targetSelector: + listmonk: + listmonk: + mountPath: /tmp + {{- range $idx, $storage := .Values.listmonkStorage.additionalStorages }} + {{ printf "listmonk-%v" (int $idx) }}: + enabled: true + type: {{ $storage.type }} + datasetName: {{ $storage.datasetName | default "" }} + hostPath: {{ $storage.hostPath | default "" }} + targetSelector: + listmonk: + listmonk: + mountPath: {{ $storage.mountPath }} + {{- end -}} + + {{/* Database */}} + postgresdata: + enabled: true + type: {{ .Values.listmonkStorage.pgData.type }} + datasetName: {{ .Values.listmonkStorage.pgData.datasetName | default "" }} + hostPath: {{ .Values.listmonkStorage.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.listmonkStorage.pgBackup.type }} + datasetName: {{ .Values.listmonkStorage.pgBackup.datasetName | default "" }} + hostPath: {{ .Values.listmonkStorage.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/library/ix-dev/community/listmonk/templates/_portal.tpl b/library/ix-dev/community/listmonk/templates/_portal.tpl new file mode 100644 index 0000000000..b1dd5fc34d --- /dev/null +++ b/library/ix-dev/community/listmonk/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "listmonk.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: "/" + port: {{ .Values.listmonkNetwork.webPort | quote }} + protocol: "http" + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/listmonk/templates/_postgres.tpl b/library/ix-dev/community/listmonk/templates/_postgres.tpl new file mode 100644 index 0000000000..0c050b6ca0 --- /dev/null +++ b/library/ix-dev/community/listmonk/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/library/ix-dev/community/listmonk/templates/_service.tpl b/library/ix-dev/community/listmonk/templates/_service.tpl new file mode 100644 index 0000000000..7384145869 --- /dev/null +++ b/library/ix-dev/community/listmonk/templates/_service.tpl @@ -0,0 +1,26 @@ +{{- define "listmonk.service" -}} +service: + listmonk: + enabled: true + primary: true + type: NodePort + targetSelector: listmonk + ports: + webui: + enabled: true + primary: true + port: {{ .Values.listmonkNetwork.webPort }} + nodePort: {{ .Values.listmonkNetwork.webPort }} + targetSelector: listmonk + postgres: + enabled: true + type: ClusterIP + targetSelector: postgres + ports: + postgres: + enabled: true + primary: true + port: 5432 + targetPort: 5432 + targetSelector: postgres +{{- end -}} diff --git a/library/ix-dev/community/listmonk/templates/common.yaml b/library/ix-dev/community/listmonk/templates/common.yaml new file mode 100644 index 0000000000..38a12a13bd --- /dev/null +++ b/library/ix-dev/community/listmonk/templates/common.yaml @@ -0,0 +1,13 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "listmonk.configuration" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "listmonk.persistence" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "listmonk.service" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "listmonk.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "postgres.workload" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "listmonk.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/listmonk/upgrade_info.json b/library/ix-dev/community/listmonk/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/listmonk/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/listmonk/upgrade_strategy b/library/ix-dev/community/listmonk/upgrade_strategy new file mode 100755 index 0000000000..5718e19a44 --- /dev/null +++ b/library/ix-dev/community/listmonk/upgrade_strategy @@ -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'v\d+\.\d+\.\d+') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t.strip('v'): 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/library/ix-dev/community/listmonk/values.yaml b/library/ix-dev/community/listmonk/values.yaml new file mode 100644 index 0000000000..4a136a5901 --- /dev/null +++ b/library/ix-dev/community/listmonk/values.yaml @@ -0,0 +1,52 @@ +image: + repository: listmonk/listmonk + pullPolicy: IfNotPresent + tag: v2.5.1 + +resources: + limits: + cpu: 4000m + memory: 8Gi + +listmonkConfig: + adminUsername: '' + adminPassword: '' + additionalEnvs: [] + +listmonkNetwork: + webPort: 30093 + hostNetwork: false + +listmonkRunAs: + user: 568 + group: 568 + +listmonkStorage: + uploads: + type: ixVolume + datasetName: uploads + pgData: + type: ixVolume + datasetName: pgData + pgBackup: + type: ixVolume + datasetName: pgBackup + additionalStorages: [] + +notes: + custom: | + ## Database + You can connect to the database using the pgAdmin App from the catalog + +
+ Database Details + + - Database: `listmonk` + - Username: `listmonk` + - Password: `{{ .Values.listmonkDbPass }}` + - Host: `{{ .Values.listmonkDbHost }}.{{ .Release.Namespace }}.svc.cluster.local` + - Port: `5432` + +
+ {{- $_ := unset .Values "listmonkDbPass" }} + {{- $_ := unset .Values "listmonkDbHost" }}