From 88d7198cf6929a107c68664b85aac530bf5bffaa Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Tue, 29 Aug 2023 23:33:31 +0300 Subject: [PATCH] NAS-123737 / 24.04 / add `firefly-iii` to `community` train (#1485) * add `firefly-iii` to `community` train * initial templates * fix path * llint * remove app_env * more work * add service * typo * redis service * restart never cron * add cap * more cap * more caps * fix port * fix few things * more fixes * fix cron * another var * typo * update meta * add importer port gui * add missing keys from values * conditionally render the importer config * fix config --- .../ix-dev/community/firefly-iii/Chart.lock | 6 + .../ix-dev/community/firefly-iii/Chart.yaml | 25 ++ .../ix-dev/community/firefly-iii/README.md | 11 + .../community/firefly-iii/app-readme.md | 11 + .../firefly-iii/charts/common-1.1.0.tgz | Bin 0 -> 61701 bytes .../firefly-iii/ci/basic-values.yaml | 14 + .../firefly-iii/ci/importer-values.yaml | 18 ++ .../ix-dev/community/firefly-iii/item.yaml | 10 + .../community/firefly-iii/metadata.yaml | 31 ++ .../community/firefly-iii/questions.yaml | 284 ++++++++++++++++++ .../community/firefly-iii/templates/NOTES.txt | 1 + .../firefly-iii/templates/_configuration.tpl | 78 +++++ .../firefly-iii/templates/_firefly.tpl | 56 ++++ .../firefly-iii/templates/_firefly_cron.tpl | 46 +++ .../templates/_firefly_importer.tpl | 67 +++++ .../firefly-iii/templates/_persistence.tpl | 52 ++++ .../firefly-iii/templates/_portal.tpl | 25 ++ .../firefly-iii/templates/_postgres.tpl | 6 + .../firefly-iii/templates/_redis.tpl | 6 + .../firefly-iii/templates/_service.tpl | 50 +++ .../firefly-iii/templates/common.yaml | 18 ++ .../community/firefly-iii/upgrade_info.json | 1 + .../community/firefly-iii/upgrade_strategy | 38 +++ .../ix-dev/community/firefly-iii/values.yaml | 61 ++++ 24 files changed, 915 insertions(+) create mode 100644 library/ix-dev/community/firefly-iii/Chart.lock create mode 100644 library/ix-dev/community/firefly-iii/Chart.yaml create mode 100644 library/ix-dev/community/firefly-iii/README.md create mode 100644 library/ix-dev/community/firefly-iii/app-readme.md create mode 100644 library/ix-dev/community/firefly-iii/charts/common-1.1.0.tgz create mode 100644 library/ix-dev/community/firefly-iii/ci/basic-values.yaml create mode 100644 library/ix-dev/community/firefly-iii/ci/importer-values.yaml create mode 100644 library/ix-dev/community/firefly-iii/item.yaml create mode 100644 library/ix-dev/community/firefly-iii/metadata.yaml create mode 100644 library/ix-dev/community/firefly-iii/questions.yaml create mode 100644 library/ix-dev/community/firefly-iii/templates/NOTES.txt create mode 100644 library/ix-dev/community/firefly-iii/templates/_configuration.tpl create mode 100644 library/ix-dev/community/firefly-iii/templates/_firefly.tpl create mode 100644 library/ix-dev/community/firefly-iii/templates/_firefly_cron.tpl create mode 100644 library/ix-dev/community/firefly-iii/templates/_firefly_importer.tpl create mode 100644 library/ix-dev/community/firefly-iii/templates/_persistence.tpl create mode 100644 library/ix-dev/community/firefly-iii/templates/_portal.tpl create mode 100644 library/ix-dev/community/firefly-iii/templates/_postgres.tpl create mode 100644 library/ix-dev/community/firefly-iii/templates/_redis.tpl create mode 100644 library/ix-dev/community/firefly-iii/templates/_service.tpl create mode 100644 library/ix-dev/community/firefly-iii/templates/common.yaml create mode 100644 library/ix-dev/community/firefly-iii/upgrade_info.json create mode 100755 library/ix-dev/community/firefly-iii/upgrade_strategy create mode 100644 library/ix-dev/community/firefly-iii/values.yaml diff --git a/library/ix-dev/community/firefly-iii/Chart.lock b/library/ix-dev/community/firefly-iii/Chart.lock new file mode 100644 index 0000000000..6ee7574d29 --- /dev/null +++ b/library/ix-dev/community/firefly-iii/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.1.0 +digest: sha256:752ce76025f5b61094bd2b18ca11693eb9d26d0dde4eb2e63cd2330cbffe9e73 +generated: "2023-08-28T18:32:28.064951481+03:00" diff --git a/library/ix-dev/community/firefly-iii/Chart.yaml b/library/ix-dev/community/firefly-iii/Chart.yaml new file mode 100644 index 0000000000..01ecbda95f --- /dev/null +++ b/library/ix-dev/community/firefly-iii/Chart.yaml @@ -0,0 +1,25 @@ +name: firefly-iii +description: Firefly III is a personal finances manager +annotations: + title: Firefly III +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: '6.0.20' +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.0 +home: https://www.firefly-iii.org/ +icon: https://raw.githubusercontent.com/firefly-iii/firefly-iii/develop/.github/assets/img/logo-small.png +sources: + - https://hub.docker.com/r/fireflyiii/core/ + - https://github.com/truenas/charts/tree/master/community/firefly-iii + - https://github.com/firefly-iii/firefly-iii +keywords: + - finance diff --git a/library/ix-dev/community/firefly-iii/README.md b/library/ix-dev/community/firefly-iii/README.md new file mode 100644 index 0000000000..a992ac1f51 --- /dev/null +++ b/library/ix-dev/community/firefly-iii/README.md @@ -0,0 +1,11 @@ +# Firefly III + +[Firefly III](https://www.firefly-iii.org/) is a personal finances 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 `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/library/ix-dev/community/firefly-iii/app-readme.md b/library/ix-dev/community/firefly-iii/app-readme.md new file mode 100644 index 0000000000..a992ac1f51 --- /dev/null +++ b/library/ix-dev/community/firefly-iii/app-readme.md @@ -0,0 +1,11 @@ +# Firefly III + +[Firefly III](https://www.firefly-iii.org/) is a personal finances 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 `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/library/ix-dev/community/firefly-iii/charts/common-1.1.0.tgz b/library/ix-dev/community/firefly-iii/charts/common-1.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..b9a326999f29bd52909dc9bc4464f22844d3fba8 GIT binary patch literal 61701 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 y>Fn0bJL%6y5nZIF~x(<28AG2@f=whr_cC4^hQ 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

FT!rl}fo~77)z;M)Q?kr_#~1 z7|KbxbJ99gkXEV+Tce6@+?TO$dh(ciG(*7t`oR#eFdpyF-5$6c37->jC2vn{L{uO@ z$OHy!p$#QPPAG=zvREoe9Mzi%p-5d;M4`{n8zpSJIYHo-k><7sexYcT27G^&QWWPM zVd!vm;KyGs*SZbuaZJ9QEeh+-ko{kWp+%_GlYh(+OShwk$Ilrt|t zJxv*3`SlZ;yK_odsFqobrK?;p7mi56Pp;c7*o+xnKB0MEculn_2CBWx?eJ$be}_gc zRF|RZ491wBkMbR9ZDVav?S*#KuNphN?(|ne)!YfQ0DLJ_KiPbt7FCm~m8cegFNG@l z9Kq0k%Tqk@5NI_AtlU)M``<6Sdx%W3_YD8UPd3 z5k`Su#p9Nns~Py#^RygQ@dwZTY@@o&1mI9b-t7fS392x{?@>$(dQcJ7N~&6@mO*Wb zYUepqIB`tEDGHNpY^a_t<`#vs+w49S^l=Y1S%K;x`QPI-k(o*@a^pM|~9*@fS^tIu-583U;G_A7Ys6 zM-MMyBX?pWpjd7Zu}oYH!4xIXhY9RC@yprj5X=rXcw$m&|B)Vgt7xOf{&URU73}|q zTl>!@3b+3NHrNl(2(&qeM62DV)}PHeC%Vl(Y}o2)Xazbd_1$*adw2_r8GJMx<*uap zp0u4aWi|BHI4-goH4kdmu@$v&TwrTw`01}@W5;pKw2g+gveuVeDxf!|qYkCDk*s#C zEep*maBORGTIE<53{IWr43Y?7BJ_VY*k4coZyI^9g_>Vb;akQYY@(?vY0Ze2_e5#iwaT{b z-dc9Js=U)*gaMdA-7(_w$<)_N+&?uon_Fv!GhSR3_wcTUG6k58WR( zv$)#8j!J-aAFd0uTmEYoaaYhrUHp&1fqnny?o_gGE`aa#6HbtRKykZ~zJ zt$B^sQrZPQ%ID4B!0*MLXkGB-Y`gi}s=A;jI%?hpBQ$AEQYO|TtqVMUo9u?DQ0&Rh zxs2zU5Lt(*IsC7W*Dr5&%`WJvsaD+u4x5ijNf&s9>K?EvJ@Cu*%Xc3yU+jTjE??~0 zqoC(WZlTND^T(aeIh#@?UC`?mda?%)^dNjzs-Gt}hjIshOYIxBZ($<9Xx<(A^ao5^T&5@f4Slq|Hv@DA;PvjQq>t2 zYDq@K2RkpZFr;hCSH9LVVhZ=;JQn@&vq6WBt|l z|G?0w^=rYbWCnrk+47<07bLM%M|6*4G2oKqb+Z>H(q2bpqq$(e~ii2_c_8Xn9Wsa=9N(>mFDqN({b; zXtsksBX18(k|YxUr@LV17b)(kPGzwKS`Qd;+V()~e&S?LM@y%2j@eSPXhLYR z=qxgOko~3gfI;5_pZ-kM&P^DH-o5~rR||B^JqFrUo+W#5+b@m*gTAsMC>et!iGD)R zM=@>6i|SHX=wqNk$01WSMCvdQK^)W8eOqf#i#+n&bB-2fYE>jmRBL-6Opp9j_pwupxyARY|ZpY~_`#zmj~V}F-Vydu_G z5{*C1me{@j%Yr|zq>bwR-@)<8(V4yfI~r{Fe;X-Jz!e|s2ebLJi+eLDin%4s-#a#j zO-j`nauKbsx4|s#=vtjH*K9slRo1_W61A>P1YCQw}ucZVCPhd5%h5_nH~p~^1iHuOd6GV+;BVN zzXO@aKqb|e)l4OwN+OkpGs}*F4A8FfteHycDo~@I$h-i6#K0G60mSZe1%xW2l5Rh; zkSWX09fs))YqjnQ^nNHLQ$Ey1mLmrdq~1s8nJmYf=`KaqY})wR5YCN|f#Xc+OxL zyg&h*Un7r%K6R|PS}M8Tna+YE7zB6F`y_X5w8v4o!Ba%i#KO#ll<q6u9HLHA{t45UKRIv0^|OL24~*z=-P0Bat8qY^z1(4p`f z@101NAUH)+63<&8Sc9L0SFn`W72H8fa)1Gz;)GVr!OE+ZZX_j4?NX(2K*(QKOhOle zYJeR>T!CN}dfEuP5G)_y5(Fi^TOnA9pEkly1WN~4-8zNdL|QVF2}}SM8I-l?EBqo| z*6yvmZ|1m(mPd;lqXfh#3ZRF45nDUI$)+IR7P@rHW4NiQ$#1JYdlpLp^6c3jxI-RH zDdG@GngE>afluijibIqjZs!zfuWv=)ZvmtVdkM1#{xZSdgr8Id2>NU*%DqSLn9#&t z!tj-m@#bt3;&Ie*oWmqBClH#Uke~keX@Go=xvIhOCXonx!|;~pA~N_~Hw}4B;^KJmVh}KyvC1XJF_h75=QHwBUg=zCJAk8X7T*v=CKRKny1>oY7juKG6&l-kKH-so+MSxUVd! zxI|7#8z~qB6FDoESxZq3SG64Hqpu7{NOn-~?M1;uXo%X0$M{D4~T> zXYI7;LEkrMVWdu3gcj{7!EtaJt_!u6qDL(){5TJ)unJl%KnjjRJuP^(Wr*RT1x21m zrqNYQM%W0Lu$nc}j2adaZfmzyX~|VmPYcaWzmO`WJuMa?guuXMSa;QPgoS*Uh6$b` zx%JxvuhdQAJ@8A&V;zRdx4ecHQ8qtJTI5-(xkWf@K={?}E}?6cAW+n`N-8?Yk>jbn zelvV`^Lf$S-ftnldaHjab@(a3L-2T+8iq*3?z@G)FGBD!_HheHSdQDXXK&u# zJbT7*oT7M){LXU=M;^RCCR0IxmVEA4==*(!#)sP;_&&{}ViGM-=ya{YKyN!yBr7nvMqos|75NryWX0M-5p`!Rav|Q`4M+H z>?fozAN2lCNods7XRX}^^!*|D^@H`4&1#o3*!inh{7AtJ49oLMsWYvD?w8M#JrJWQ zn%;?IR%&_T&dz`<(n+U(;Wi0`P1GX z=A^@I|4&dn#UY=GEARlT%l~tDd|>;39UX4{zcx~yfSY`*ABO3_sR!6{vHn)+)wQ5a zoa3M^wIUswddU=GENMV%w*wXyy(yv;j*-lAzf2Y&4GRfWT-bBFlen=U0rng&O-o`S zpt}5))~I4>n0!O(mDVd$&TI2%2>L#n>0)I+AY*53J~BhVw5F}g!TO6X|M8R!KpF(s zJm~+b!avpK|2a86wBtV=91OPde-q^ixMZUa*sudJ?yW;KWvthot$W3RdfP@vvL$+z zNMByAbM&l*)R1~sUSvbU)rWZHH<mp}rX%Hn)rn!`%*BC(Z*TOinr z(HPUjcFS&vpd-X?2CoXqHVCE^#WLaNN)XK8tqQ>iQhHBfe^m%(@K%K&nnE08jAMBO z1-zO`*bu=4#$%LRqX2oyc@WfPhA)j9Wu%7}d0zBX|LkE92#s9Bz?Jyo=?`fTyn$1+|Mb%QNF>|eiBW(c6`>LKd1`#|Cob0BE#E&|wTGP! z0QRIT+e!=Rs5(SRzutF}X^st%;Tox4I;ws-)E7>pvzol^A!z6p7nDP)z z=O5XR?2Y1v{0;k&z2R(#KW2aYFKHw1c|=_VuvU$vR0oLUaQjWkTHXu2`_uWyO!VoQ zcJrQDwNv4N*md;Os>xm$HD%AOYMd+Q)yx%?qrY$3We&<-96kaAhQ9v~NwT`2&swRs z{~ufX|D%KBt^I!^v}kol>;Lp#f;r8@RSl7%VLOhYy2&m)kakGtsdKSD9Z zG(n+<`tM$zzj*y}6Z!uSPEQUB_Wy1EhYgh{;3^;W1ug$gcx>6>z_Pjh*P4i-qAYd_ z(MTO>a!|2=!n4+V3>8I$Wy~kpDhHwZ(4;)szbX|0b?u<18TyVRl@%6?SiN6oBuJ;I zcgZuVyUyG64+%2PU~4Es@Y0nl}6rg z0=ZxkFI|S!aZ+>aZj^t2=`s|N_VMTUycc^sBiI#8CVTRvaSEe7Y1G^UKAK?=yZvY;{to#=_V;cLv8E&qldH1G>1~N+&Me)P$yq7_%IC-GIfiTx z0E0kt0um-=7$ZQrX=}kHqBYxqSTTv<*yZI`4Y_7!t&&(8hU=tRHL+-Vx8S_m6tNVB z8<Yz2AU#9|EoK0AE$701UEh(4%;IAvZJ z;ja0*1vmjDw28YyVv)A@=Qg2~Lau{~cMXaJqwwN@$Em8FTKlZ+TH*Os3 zbN}{J5cU95Hp+_2WjlicHh|md&UnyCj5wLbw}#P@C6T9hs;meLV`R0S z1+(73DzRi8`7GDS=~cxO;)x$_HZrez1gpf7bz~h}GpASc8Rl56XGN=}RZ)3=(XEQ; z#?3E(=(I9Ts-`b9 zO{yYNKB9=-dS@OhOef5W!1*fV?(a`{1s*(J6W`@LKo%Z_x?=D&ho7x?;4|f69}t0K zR+VrrT@hIBw2}2lG0S;?=EyfUQGZmaeZzK!Seo*`!3eAHq%^>K2fi*aflQF$^JBTh z5peI|6LFQ;v$v;Fwzo%-(oBZwvtxjwIZl>*SD?KX)<|Rw2!xcyXR}IzbB7{k-l?xz zESjy-{#=jLPiGmhptWp@y+_IQNdA&{q#o&7X_Vw0saLul$zSpgS1MhP`2WkRT;+5< zBGQM3U5)Sk>rs5~XYENH6m3!dR&^+?)b%L)E$?P}s_Rkqo87HEcHIHuBE?KiX^DcE zeOnrsvn?Q=sxs;l89+o8?2=-IX5bBfnO&Akv+lNTwk%^u#}zb-FNC!L8Rzb0(;-{z znMkDFQ8X2M$7e^2-kHt8mQVXJ*3z9UpY|0oGw`qPnvyK( zO*Qub@ruwDh1t><)s1U|Y{V$*L-y)=gJHmRT~J^8B)40sI{(+#&UM>pu>YGLzAgLz z9}M4aY@V5f9oUt_5Ae9?Y263Z+o2H*C}~}NQH0y0exo4uF$kU7BYF1s8N)Q zc;s2?Wf~4qA7d{HK4;{%5a?vK@tkJ~uMmv9AdtJrd=-X_T#twt6T5{zvAgwzimm7) z4yr=-G=_lJc8_w&Ivc%hUs`+~(+qLxK{d*kNb6?r=Pp@U`l6Hr|%quCZ20FW{ zeJ?ZdMX>8^bR>7R&pl!8;L}9&+MtXU{dZD&>d^4ikKk7E!;~uiPYJa>w9&x-O-|mv zE!uyc4EY~6Q+B|6HqtGazy9Jg*|T!}1!QX2OQe#gxQ}$%M)Gx8HOp{aC)knJEU#;8 z>m6|U*X*k3o^b-x^a(6iJV6y8g8OpiyRHMiF1V*Z2+({E6Sg%WVYYzgz$@1(bj(c8 z3z@e;>fJ%$X~6+}<`p>xA-aPq&L3IDaR}L#7qWngq@-Iz+CG0Hl z>2q?HKrj7~PvtgOs@DIUQNo&SG_3zeZ;wj+|MX;7|2I;0GlF57xM1Skzl(;RlDdmgc)sFUdoYIFAbZS9{Q4vy|P;`9&uGfmaHl@7VNA#bEM2? z^{Xt9P>YKm9P_1cDF*1=3^+}mT&ag5Ni5Kgn2krGh8TvrW9e;(Z@kdpUwZF<;SCit zM@iqK1-I`E04ikSgi>x_8o&^y z^4$B=Ws{?+=lhV5k2ruN;|bsJ!{Q2Da=|ApQ90F`DQBtFZVHXX#oy1y0L=kP|4aZu z(QOE2a2c6r$;*Noj z`8PMYMTBeJDe6o~f5XDE^2Avv0$-CA{B(LL0uQ|d=fbLbMFjCFPP|(P{LmwWn^&Od zAKVS`=85Zw)P(LRKwR`IK*aZcv+STTGoTdDk^MChaTq66p&GMGg-5gRU9X|ii^#k!t=LA@gC9}yZs5EAjZWcC48;WL=R8C^onuMTg{$H6vugzmN>VFPT zO8TGULI1yzLiv9_(u4jd3;0Z+u+3Xj|C6ul53T<}k2b5fn2JDzj1}0ib=`~OLF?0d zsapSYjwNfh(Xjr%eS2Ke|4)wx{m(|qju!T&L-@Br5oEV#HEmo?dscnbVM4}gR;n^EYi9=XpKx-qx^jM1F4T{0fNbWDPDpZpoXM3Ri!4xm=4gV zUoOF=iI`_E4FE0ZCtITWg#cp2j6SYN3MdmR!a=!j+}+OIZ!Q+W{yxX~ZH#{~(#6U8 z6Ehd#0aZnv1c(Q3z;U*R(GTtH@_fDCTNHbMuC9f5RlhUH4j|!-rQ@_Am|6kEd7F-l zw7FOUB)F;sQQ@u}!`ds}`KC4l%cp(*(^)VJ+W)5)O!*+kg^?G-Vigif?G+4f6-<3&KyAwWnmGfH~) z(xBMk_E2Y`M~Db>(-$~dXv`|gUOhNPz3CrKXS($c?1S?;&}WI}@GgT><|Ojj);lHy zZtriiUtD-iS4l*el5Y$i7RX8<)+|oY zEux#bB*)e1bQ$sVUAi>WO%2M7(^_Zbt0<~Z(UN=V`*(Ltw=+%%B0rGY;sp!@vpr!3 zw9ji_>3>xC+8)|y(Em&ikBadh zk53Md2mQ|`%8tm9H3WbBfrCHtA^Z=D{3tp!gng6`T7-QRn5{SH&l&U4l0a)Jhk%b- zsCI^JGv6x~dr%1VC|)1pJpSQICI6?V9ayuCdj4-RIXo!&|4gTY|IbFsj+O#-u>Y_&i^-4cEFdPPS09tek;%Zjr!i64FEU=Ei|!qHUNc-y(&~0 zx%AtzMOP{Oth8A|t(Q-RPh0Z{pcNIBu9o<+#o&tm%h{?H1ee&(3WEQN!+>yFnF0uP zo*E{C9l>xI2rk+&)D!G7zJNaaGpmsRoPhU;@ZSpV^$C_~>zfI#pAs3tmoO!{2~pKV zH-i0eMN*jjhJvEN-y6ZA3GhJM7@hIIzTgm!f%eBwC<;(?yW2#t@f4!=qpQ%dt2t~w zRcJpUDhM{73iL&AQOn-|))w)qhXFbBnDukvry-aY^ zI&2`=WwpCXNX^mLaZ0c%9WO>Aw_Cpit9o62L?9`*>xm7)&J~Q(uB@43S-;|TAlSJ>QII3JCBi0yM3+{|m2?^TY#7%^*eRTe^g}SM z^tlL@3udnb%SyWu&78u1TfhjoWtPVUhzJ|#F+0siVW{u=l!4LMgVP*$P{|gITw-Vj z-9|X!o?Gbx5#W0S?kd_$Z}7A9F@T=G5WPj&xjPRcRi=&`W3%k9tUEVQ)N{5P+iD*4937<;gvL#Fe^o zZ^@F;`U|*(?6C`8(G0kM`ehY{pV$l^B`|~@5zbrw!b`Z_?C#b+_=KZr`tsB1 zS^ew#@{!$Y?K-7)wgrItM5+|)v7|v=(IhqPYF^jQb<7l)>_QrcGqA1MIuN{s;z;HD z_w6c$eCMi4pOQu`+tMb<0IUixM*Fw)udOWrFcp~g8>dO(v&#q*H}-|tqB$J) zGz2jYNE@)}g4GMG%cra}H5mSJ&LnjGKk>Z~p1~wVbL4wzPuc$){r`>+O8GyJ503`@ z|3=CVxTK>Fv|)dRhXJoo;m=4aelT??t*_MgwT3Em`zE5CEBc~AC%(QOyhzpPYv$(V zCy?<3yUj!uvc>hPiLG)vYb2_Ws;z%*tAVmcqEMjEsYWTNFsGyxbpBq7@%rGQ2%tx; zVWNoIdIwG=xsvy1!z=PlfkVpQ5iWx8q$l)o+SM6w(~vlRlDfc)0{+(>d~%%z&b$ai zHJ7gQ+4O}5K3hIg!)F)UrmTe;gaR{_*^CHg8vN^fi7S@ZP%r}%#$0Uu7hW;rXKor) z__RHV_KGM^SsaG=fptAXaSYS7>E*-}O?Gy8axpf{oHmro_$E@YigEBpS$fE}y1E`J zLMt2(X)Ry}NWAb8rA*Krb31a)Wmj0SkkyUK9$aa4@`g4`r={c}`9ry@I{+u#tFgYW zO7BN8^9!zxs*MJ;Neq2Dpg$1Y3P-)?X4|0$oZN-j>%o91Ka{-el!p|IWS_XRfqVk6 zh&Ubr4=@bJAcjds#I9)`bQtMPz_7Ko1AfBkf={Ld63SAI;=IY6hXAv=UnY|H)YL6$a zx`hp{Z+(u|Z!G#?Mw_vFEo=vCy0yS0t(%f1NmlQcc9K`ut%@v|s@X9ZNmm{efe+u# zL5$;7$Yj`gf|o#Z$xYxKCR89IyLH_{u~!?zwWKxZ&@F=+sHs`2($Fm@RS_Kw-FlYM zV%=iRjskxXj{%`m&~KN@rm0)J&hv{i9L>?~D)F+7CI4*+y-xVVJ+b+F8I8MEE1`Jn z`~u|L6BVO$VW_ybZaG)y7Y2)(enuJ#4FhPvehEb6PA zhtE4&dRy)L*Q#5$UJ4()Cq>qCc1yO^ZOAl3jsjOPV@mn)WNns*Jt4BI(NCS4rdP-JnS-ctXV&_ zpVtueuaYUr{~s>C_3Z=J82@!rJpY{@9Zv`Oe-lN@{~s>CbrtwEY5!S5!FH6{jc30- z3g+2{_~GJPOS~lSVmJ%#L$=l_YZNLAlnIHYkuoWn{KoX>d9Q|QKx!y+uB1P)!Pl${ zW?vUjt)7%X!Wyavz=}NQDzBf@OMgh3okk(KphxDr$ z!aMjR4z^w*Ej@n>;7cMDVC#W9Qm$ax@UDF)o5BXP1lIe5#0D7a)5$01~)6GGwV z;qY@lBzZ;r01}MT5E7F0lHX(@3sfI1IH?a8-`oba=flM}&gk66E6G{xfb-}dyq8S> zad~$7>(AiZ`5R3U!jGT-l)$-oDY{1i@*E#8-_WYSw#ata>TqknaJ)5~GreHR@qazW z{MSn(|5u9tI-MR2=RX@MJK)kj{(m=PKP!gMhRN$>*=NVt@%^au#y5@ zC*P3epd8ZkbL{#F=Lh(A6XU}kwX+H2 z>sy0WVD?a*3W+^5+sfkY*LhcPl@UjqS5KGD*Xegdhrv*XawW0oZmEiYD~6Bh96^Yp z% z$)QB+olShYaGTF%*&{Y#_CeBJm^Cz~6cg$PFJ`NbG~!jYZHfK^BM(W2vv>YWrVAzr1I(8p0gIG>H8%Bj`V5m6nJ zM`RZay*t?d%gNEfLAhHs9g*i2=NC59w$i|(Xx-5iKq~jB=xIArdM|b$Iak>q6`x?G zT}9ETqA9vd?$NLMA=5f5|60W|gt35+hcA}lwz`Ba7Vq+8YJ5n`VZq#TOj{9*aApQ;F-yr_I0`afKH`0f6_k1Fn%{S7c z1ZL5ZuL&JlzhM<#_Zw0DNqKW17VEIsWX9lE?0aG5r&7}qCMh^qN=CSLBEi#`J5u~c z+O1l&ZYC+@gCWAl7!w%C=nWALDjcX@fnZCCW3rC5T+0tL6{`q(kYit$C~Eu|W|9N? z&yrT<4f&PK!1Un9mSTs}wV338wXF2iM!oz$nI0V%&wr1OCMSdZzlpK~M8MT`#Q%17 zfu>TM{{0o?elL|Z)C}Fs7;VdI$OT_2I``Hd>eg15rc#sr+?=wbbM~ZON;SJ{@osA) zQB$b}Od6ANtk%rl)Jv%obSe@-W$(7MX*CsP=W1@C+V-{EN3njX0jw%bQuc0Z16Wh3 zoncj`x-SJ+EntliQ#K1&*|PXWP^$r~CccPxx21t|xwy)(&4`(C(dY3;)Qe*!@wN*? zQfjM4cTpiI>p*l$oRx#3er*y!JY<26Dyb4#ww}Ax&73B8R*RWqv-?$NQP0hs7&G6} z5Jh+TOd5lmCmAS{tB6(v7JUxaf~Y`KgLbU;-L^T5jK!9};^Zik|5v#CmDGvl{yaN> zRRD~!qU&~fz0ykm8s~Md4Jua~v!n*%N`M)4vo}v0oOP`L%XD<2KegvLO@O(@u_#Tn z{HYIXoZ~k7gqa(5z(3S6m4i|hqxc5Wbu1`2V=Mh6qd&!(OLI@hd4?G#be*a{E&ZW1 zf0(%!hBuynCv*@*ri8qZO??0E8fKWHV6;fnc+7OJWDHV29)nd7?>b;~8WPL_6EiRK z_vg!?7X`GQ8%X&3>;kI@cnN#_9ww>Cu;j;di%uYjAPitodm`OmlfW5ubpDsWD`t9q_ zzy8RotaP>H~Lhnr=(NmJMeXZ z31o{KA2t2hlZvWd7=pb$(U-kFXX~9V*wW|507Y}0EO{I|x?nsdHj=5H~wzZ9*Yt{9a zkE5$4IPNcgZe8D7M$yf^zd^2Fv}nitYY*=h>>hv06y!V~_bSCK0a5QQ zovU0ZJ1YDJmofC6TACY8GR4!(GSh3B(D~JckST>WW~62jWa>Lu75zA8V@WUY+SKL2 zWO2=+%YSl`_iX@JFaJ%CCzH2D`R`pEC{ zu~q5Q-j5-mLME>TWiK{+qSTy}W;JNstLi}~8$KO_;>O>uqF#=PMX|zw%igN{-Ocjq zFlaWX%h9yHWt}XwRxGN9DgnRsw64XVP8KiIv}p{K7D4|K+K{ZOs>7hsN-#%LANFse zSbYm-RYixztrmkesnT8)gQ7m99T2q`G}`jzXlj|Xysp&PXk|5M`+__P%6%E5_b?9e z(-KDM7@Q?I`WwC(gTLXM;(1{GdcXxjOAKCSUyyo^HLSI5FtAz|Ui4eIzybKR#o|?{ z$_4|Qbz$=u(2k#WN$yyx$_j%Tf_nz=pOyFyQ>60Qy%H-5DlcCk!e8Ftk^~ zL1JJ-TOSxCkfdIc*813YG|8$!A>Sec;52;jo-&g>i9zm3M?N+NpWr=A#^7`Gi-*Eh zQlCW6@>^g!_Bt^8G)uGM53+BeiMFPyY%oY+vJ@#8KO~+HFJOXjAj5ZLy=r6pSup|X zn_?4Ua(J+tVPHdB9~e-qPebI9ngBMfPqEf4`aA$$191&iwZytQvPo;6%{5-f~6XBZA1VxtH z9uX@Hf`~Lm0PBW9#mbm9$W}pN0Qd_^i1PE2>%sd^m*65FsD?c^2KryWp>*+A&P|P_ z(pp4*a;!1nu}f+(SVN~;4TWg;dr5xKF=!;NzO=)@VbcvJ_b}XW@}5FtF%)R}2XB5`SS@T3*FGxRm6vNnjhgt|JD{ z75{au(ew)D0ms0u=bbUYah1Me^XE(k3_e$qS6fvl44kr*@+#&5#{jgHp*mu~^>x`oMrdf0gj?pDeMU8H05=MIDMlYm|x_>Dh+1XTZRj6PA0th(Ukff_r@O zmj*UTVql`BWmyM2MT*g@vcUjFC_QVy;l(h>5!VTaTtxY; zt#`mxCmhOgiW$6kDe}EAd}2OO6$coukWn=25Y3GbyaR5Lt8=+;8+XnFUi2h1AgtLa zP?67+>)LIIZ@kb!k7o-nN#(~G-J<|`Uy7BFx84CX2Ojuv@s0V^37X=>LCf={KU-ONqQ*?I>kvfMRLdh#)8j(Mcfo|PdHQ7Bk=IQky< zS5(yAzz|2b1f-Z&zqiL1fxSK8Mlf|ye1GJi`1e&5C+Hr9@D>KY$2duUXOtykH@qMmPa3j|PS2T2y$7YJ`Q4HVk$_v|8R!L^Y&EUn+@>QFQzJ zE#1<8Pbh<9Pa=zWgl-qlLvFnfrCcsH;XV1AXsf|*GPi=Y4VxlgCcOqu$sC0C!Bu80 zdp!!&Zy7p8*w0>%`~*k;z&G+byC(l`Lm5AUZn4R^BEE~fa6NLIEQC(x*~Z8^*O%U^ zCwJ%qt*-A@dv!|MW?KN{=v)Nfwz#;GEYcsfZ8fr8>Rbwle%Uq#t88g7F?Zl0; zm0kY6G%=U~f|qb#{weO(+9l1v5$cYjvmzm;!vkhIhzep zfK!r#gU!ns*go7gJPw11$kEkQgZf;Mn%9}o%WJi8W#tSgU8Q!fq{N$n>4}<2#ob>_ zV{v)kr`NY6lsSncBTc9WX5jebFU5h%ga$OyT{ey|zG`3|`vSd9MP+3wv-8%_CN52uq-{@1rd{@0C^9qIGb)&2Y5nYVXs zvR7G3KHXg%xI21l8y&K%)4G;QXMgK@RRs}8U`B+MhRUFzGUcl)DWdXG!>XGyVO;I^ zhnDcaab!huWv)Q|VCC!oDTmsvX`~ggK92lVlEBC>rJJ=UR-yX~PHs@(n(-|+H98GL z{4fSzU>tfr90UITZav9!4}~!J8@?fbMU>@y`V}paiVt0v=F^ZJ699LTKV;TPu4$?j z%4FsHkdXN*EY;PC;)Nj$5n1*@a@~qi(^M;x(=-&H!Refdu@NE*9$caW$?oLvpmN`< zX{r^;o}Z$7X#9x#o)|Svl}WZrE2~tVEU&Ecf-fYNRei5dE!%^}izk+qJSe>)*^_+4 zF)ET|vBm^bP!3A=Rk926(b8r-18g&9H_hAL3>j13woxL($}IHI2IJ? zOX>`WWwdaQ$j7x0O&0GYj6JPG0uV+=kkD{s|xMDks1(KTo3J${S4dk=+lyKTW= z)+RVA)LK%y{^cuc6JW!Y;C<0 zj`#ZOc9BF};Cm6bMY(~%<>sW)Pa6@Q&oY06|Jc(QI + Examples:
+ https://firefly.example.com
+ http://192.168.1.100:30064 + schema: + type: uri + default: "" + required: true + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Firefly III. + 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: enableImporter + label: Enable Firefly III Data Importer + description: Enable Firefly III Data Importer. + schema: + type: boolean + default: false + - variable: additionalImporterEnvs + label: Additional Data Importer Environment Variables + description: Configure additional environment variables for Firefly III Data Importer. + schema: + type: list + show_if: [["enableImporter", "=", true]] + 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: fireflyNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: Web Port + description: The port for the Firefly III WebUI. + schema: + type: int + default: 30064 + min: 9000 + max: 65535 + required: true + - variable: importerPort + label: Data Importer Port + description: The port for the Firefly III Data Importer WebUI. + schema: + type: int + default: 30065 + 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: fireflyStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: uploads + label: Firefly III Uploads Storage + description: The path to store Firefly III 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: Firefly III Postgres Data Storage + description: The path to store Firefly III 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: Firefly III Postgres Backup Storage + description: The path to store Firefly III 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: resources + label: "" + group: Resources Configuration + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for Firefly III. + 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 Firefly III. + 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/firefly-iii/templates/NOTES.txt b/library/ix-dev/community/firefly-iii/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/firefly-iii/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/firefly-iii/templates/_configuration.tpl b/library/ix-dev/community/firefly-iii/templates/_configuration.tpl new file mode 100644 index 0000000000..d0d421fd3e --- /dev/null +++ b/library/ix-dev/community/firefly-iii/templates/_configuration.tpl @@ -0,0 +1,78 @@ +{{- define "firefly.configuration" -}} + + {{- $fullname := (include "ix.v1.common.lib.chart.names.fullname" $) -}} + + {{- $dbHost := (printf "%s-postgres" $fullname) -}} + {{- $dbUser := "firefly" -}} + {{- $dbName := "firefly" -}} + + {{- $dbPass := (randAlphaNum 32) -}} + {{- with (lookup "v1" "Secret" .Release.Namespace (printf "%s-postgres-creds" $fullname)) -}} + {{- $dbPass = ((index .data "POSTGRES_PASSWORD") | b64dec) -}} + {{- end -}} + + {{/* Temporary set dynamic db details on values, + so we can print them on the notes */}} + {{- $_ := set .Values "fireflyDbPass" $dbPass -}} + {{- $_ := set .Values "fireflyDbHost" $dbHost -}} + + {{- $redisHost := (printf "%s-redis" $fullname) -}} + + {{- $redisPass := randAlphaNum 32 -}} + {{- with (lookup "v1" "Secret" .Release.Namespace (printf "%s-redis-creds" $fullname)) -}} + {{- $redisPass = ((index .data "REDIS_PASSWORD") | b64dec) -}} + {{- end -}} + + {{- $appKey := (randAlphaNum 32) -}} + {{- $cronToken := (randAlphaNum 32) -}} + {{- with (lookup "v1" "Secret" .Release.Namespace (printf "%s-firefly-config" $fullname)) -}} + {{- $appKey = ((index .data "APP_KEY") | b64dec) -}} + {{- $cronToken = ((index .data "STATIC_CRON_TOKEN") | b64dec) -}} + {{- end -}} + + {{- $dbURL := (printf "postgres://%s:%s@%s:5432/%s?sslmode=disable" $dbUser $dbPass $dbHost $dbName) }} +secret: + postgres-creds: + enabled: true + data: + POSTGRES_USER: {{ $dbUser }} + POSTGRES_DB: {{ $dbName }} + POSTGRES_PASSWORD: {{ $dbPass }} + POSTGRES_HOST: {{ $dbHost }} + POSTGRES_URL: {{ $dbURL }} + + redis-creds: + enabled: true + data: + ALLOW_EMPTY_PASSWORD: "no" + REDIS_PASSWORD: {{ $redisPass }} + REDIS_HOST: {{ $redisHost }} + + firefly-config: + enabled: true + data: + DB_CONNECTION: pgsql + DB_HOST: {{ $dbHost }} + DB_PORT: "5432" + DB_DATABASE: {{ $dbName }} + DB_USERNAME: {{ $dbUser }} + DB_PASSWORD: {{ $dbPass }} + CACHE_DRIVER: redis + SESSION_DRIVER: redis + REDIS_HOST: {{ $redisHost }} + REDIS_PORT: "6379" + REDIS_USERNAME: default + REDIS_PASSWORD: {{ $redisPass }} + REDIS_DB: "0" + REDIS_CACHE_DB: "1" + APP_URL: {{ .Values.fireflyConfig.appUrl | trimSuffix "/" }} + APP_KEY: {{ $appKey }} + STATIC_CRON_TOKEN: {{ $cronToken }} + + importer-config: + enabled: {{ .Values.fireflyConfig.enableImporter }} + data: + FIREFLY_III_URL: http://{{ $fullname }}:{{ .Values.fireflyNetwork.webPort }} + EXPECT_SECURE_URL: "false" + VANITY_URL: {{ .Values.fireflyConfig.appUrl | trimSuffix "/" }} +{{- end -}} diff --git a/library/ix-dev/community/firefly-iii/templates/_firefly.tpl b/library/ix-dev/community/firefly-iii/templates/_firefly.tpl new file mode 100644 index 0000000000..74b9b313d3 --- /dev/null +++ b/library/ix-dev/community/firefly-iii/templates/_firefly.tpl @@ -0,0 +1,56 @@ +{{- define "firefly.workload" -}} +workload: + firefly: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.fireflyNetwork.hostNetwork }} + containers: + firefly: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: 0 + runAsGroup: 0 + runAsNonRoot: false + readOnlyRootFilesystem: false + capabilities: + add: + - CHOWN + - FOWNER + - SETUID + - SETGID + envFrom: + - secretRef: + name: firefly-config + {{ with .Values.fireflyConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: http + path: /health + port: 8080 + readiness: + enabled: true + type: http + path: /health + port: 8080 + startup: + enabled: true + type: http + path: /health + port: 8080 + initContainers: + {{- include "ix.v1.common.app.postgresWait" (dict "name" "postgres-wait" + "secretName" "postgres-creds") | nindent 8 }} + {{- include "ix.v1.common.app.redisWait" (dict "name" "redis-wait" + "secretName" "redis-creds") | nindent 8 }} +{{- end -}} diff --git a/library/ix-dev/community/firefly-iii/templates/_firefly_cron.tpl b/library/ix-dev/community/firefly-iii/templates/_firefly_cron.tpl new file mode 100644 index 0000000000..6bfb54af05 --- /dev/null +++ b/library/ix-dev/community/firefly-iii/templates/_firefly_cron.tpl @@ -0,0 +1,46 @@ +{{- define "firefly.cron" -}} +{{- $fullname := (include "ix.v1.common.lib.chart.names.fullname" $) }} +workload: + firefly-cron: + enabled: true + type: CronJob + schedule: "0 3 * * *" + podSpec: + restartPolicy: Never + backoffLimit: 2 + containers: + firefly-cron: + enabled: true + primary: true + imageSelector: bashImage + env: + CRON_TOKEN: + secretKeyRef: + name: firefly-config + key: STATIC_CRON_TOKEN + probes: + startup: + enabled: false + readiness: + enabled: false + liveness: + enabled: false + command: + - bash + args: + - -c + - | + until wget --spider --quiet --timeout=3 --tries=1 \ + {{ $fullname }}:{{ .Values.fireflyNetwork.webPort }}/health; do + echo "Waiting for Firefly to start..." + sleep 2 + done + if wget --spider --quiet --timeout=3 --tries=1 \ + {{ $fullname }}:{{ .Values.fireflyNetwork.webPort }}/api/v1/cron/$(CRON_TOKEN); + then + echo "Cron job successfully executed" + else + echo "Cron job failed" + exit 1 + fi +{{- end -}} diff --git a/library/ix-dev/community/firefly-iii/templates/_firefly_importer.tpl b/library/ix-dev/community/firefly-iii/templates/_firefly_importer.tpl new file mode 100644 index 0000000000..5fbdba2a2d --- /dev/null +++ b/library/ix-dev/community/firefly-iii/templates/_firefly_importer.tpl @@ -0,0 +1,67 @@ +{{- define "firefly.importer" -}} +{{- $fullname := (include "ix.v1.common.lib.chart.names.fullname" $) }} +workload: + firefly-importer: + enabled: true + type: Deployment + podSpec: + containers: + firefly-importer: + enabled: true + primary: true + imageSelector: importerImage + securityContext: + runAsUser: 0 + runAsGroup: 0 + runAsNonRoot: false + readOnlyRootFilesystem: false + capabilities: + add: + - CHOWN + - FOWNER + - SETUID + - SETGID + envFrom: + - secretRef: + name: importer-config + {{ with .Values.fireflyConfig.additionalImporterEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: http + path: /health + port: 8080 + readiness: + enabled: true + type: http + path: /health + port: 8080 + startup: + enabled: true + type: http + path: /health + port: 8080 + initContainers: + firefly-wait: + enabled: true + type: init + imageSelector: bashImage + command: + - bash + args: + - -c + - | + until wget --spider --quiet --timeout=3 --tries=1 \ + http://{{ $fullname }}:{{ .Values.fireflyNetwork.webPort }}/health; + do + echo "Waiting for Firefly III to be ready..." + sleep 2 + done + +{{- end -}} diff --git a/library/ix-dev/community/firefly-iii/templates/_persistence.tpl b/library/ix-dev/community/firefly-iii/templates/_persistence.tpl new file mode 100644 index 0000000000..54ab538217 --- /dev/null +++ b/library/ix-dev/community/firefly-iii/templates/_persistence.tpl @@ -0,0 +1,52 @@ +{{- define "firefly.persistence" -}} +persistence: + uploads: + enabled: true + type: {{ .Values.fireflyStorage.uploads.type }} + datasetName: {{ .Values.fireflyStorage.uploads.datasetName | default "" }} + hostPath: {{ .Values.fireflyStorage.uploads.hostPath | default "" }} + targetSelector: + firefly: + firefly: + mountPath: /var/www/html/storage/upload + tmp: + enabled: true + type: emptyDir + targetSelector: + firefly: + firefly: + mountPath: /tmp + firefly-importer: + firefly-importer: + mountPath: /tmp + + # Postgres + postgresdata: + enabled: true + type: {{ .Values.fireflyStorage.pgData.type }} + datasetName: {{ .Values.fireflyStorage.pgData.datasetName | default "" }} + hostPath: {{ .Values.fireflyStorage.pgData.hostPath | default "" }} + targetSelector: + # Postgres pod + postgres: + # Postgres container + postgres: + mountPath: /var/lib/postgresql/data + # Permissions container + permissions: + mountPath: /mnt/directories/postgres_data + postgresbackup: + enabled: true + type: {{ .Values.fireflyStorage.pgBackup.type }} + datasetName: {{ .Values.fireflyStorage.pgBackup.datasetName | default "" }} + hostPath: {{ .Values.fireflyStorage.pgBackup.hostPath | default "" }} + targetSelector: + # Postgres backup pod + postgresbackup: + # Postgres backup container + postgresbackup: + mountPath: /postgres_backup + # Permissions container + permissions: + mountPath: /mnt/directories/postgres_backup +{{- end -}} diff --git a/library/ix-dev/community/firefly-iii/templates/_portal.tpl b/library/ix-dev/community/firefly-iii/templates/_portal.tpl new file mode 100644 index 0000000000..bd4f3f1fce --- /dev/null +++ b/library/ix-dev/community/firefly-iii/templates/_portal.tpl @@ -0,0 +1,25 @@ +{{- define "firefly.portal" -}} + {{ $prot := "http" }} + {{ if hasPrefix "https://" .Values.fireflyConfig.appUrl }} + {{ $prot = "https" }} + {{ end }} + {{ $host := "$node_ip" }} + {{ $port := .Values.fireflyNetwork.webPort }} + {{ with .Values.fireflyConfig.appUrl }} + {{ $host = . | trimPrefix "http://" | trimPrefix "https://" | trimSuffix "/" }} + {{ if contains ":" $host }} + {{ $port = (split ":" $host)._1 }} + {{ $host = (split ":" $host)._0 }} + {{ end }} + {{ end }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + port: {{ $port | quote }} + path: "/" + protocol: {{ $prot }} + host: {{ $host }} +{{- end -}} diff --git a/library/ix-dev/community/firefly-iii/templates/_postgres.tpl b/library/ix-dev/community/firefly-iii/templates/_postgres.tpl new file mode 100644 index 0000000000..0c050b6ca0 --- /dev/null +++ b/library/ix-dev/community/firefly-iii/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/firefly-iii/templates/_redis.tpl b/library/ix-dev/community/firefly-iii/templates/_redis.tpl new file mode 100644 index 0000000000..c90b61b2be --- /dev/null +++ b/library/ix-dev/community/firefly-iii/templates/_redis.tpl @@ -0,0 +1,6 @@ +{{- define "redis.workload" -}} +workload: +{{- include "ix.v1.common.app.redis" (dict "secretName" "redis-creds" + "resources" .Values.resources) | nindent 2 }} + +{{- end -}} diff --git a/library/ix-dev/community/firefly-iii/templates/_service.tpl b/library/ix-dev/community/firefly-iii/templates/_service.tpl new file mode 100644 index 0000000000..3fa9e9f8bc --- /dev/null +++ b/library/ix-dev/community/firefly-iii/templates/_service.tpl @@ -0,0 +1,50 @@ +{{- define "firefly.service" -}} +service: + firefly: + enabled: true + primary: true + type: NodePort + targetSelector: firefly + ports: + webui: + enabled: true + primary: true + port: {{ .Values.fireflyNetwork.webPort }} + nodePort: {{ .Values.fireflyNetwork.webPort }} + targetPort: 8080 + targetSelector: firefly + firefly-importer: + enabled: {{ .Values.fireflyConfig.enableImporter }} + type: NodePort + targetSelector: firefly-importer + ports: + webui: + enabled: true + primary: true + port: {{ .Values.fireflyNetwork.importerPort }} + nodePort: {{ .Values.fireflyNetwork.importerPort }} + targetPort: 8080 + targetSelector: firefly-importer + redis: + enabled: true + type: ClusterIP + targetSelector: redis + ports: + redis: + enabled: true + primary: true + port: 6379 + targetPort: 6379 + targetSelector: redis + # Postgres + postgres: + enabled: true + type: ClusterIP + targetSelector: postgres + ports: + postgres: + enabled: true + primary: true + port: 5432 + targetSelector: postgres +{{- end -}} diff --git a/library/ix-dev/community/firefly-iii/templates/common.yaml b/library/ix-dev/community/firefly-iii/templates/common.yaml new file mode 100644 index 0000000000..6f829918ed --- /dev/null +++ b/library/ix-dev/community/firefly-iii/templates/common.yaml @@ -0,0 +1,18 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "firefly.configuration" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "firefly.service" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "firefly.persistence" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "firefly.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "firefly.cron" $ | fromYaml) -}} +{{- if .Values.fireflyConfig.enableImporter -}} + {{- $_ := mustMergeOverwrite .Values (include "firefly.importer" $ | fromYaml) -}} +{{- end -}} +{{- $_ := mustMergeOverwrite .Values (include "postgres.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "redis.workload" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "firefly.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/firefly-iii/upgrade_info.json b/library/ix-dev/community/firefly-iii/upgrade_info.json new file mode 100644 index 0000000000..a07425305d --- /dev/null +++ b/library/ix-dev/community/firefly-iii/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image", "importerImage"]} diff --git a/library/ix-dev/community/firefly-iii/upgrade_strategy b/library/ix-dev/community/firefly-iii/upgrade_strategy new file mode 100755 index 0000000000..5b71ea0446 --- /dev/null +++ b/library/ix-dev/community/firefly-iii/upgrade_strategy @@ -0,0 +1,38 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'version-[0-9]+\.[0-9]+\.[0-9]+') + + +def newer_mapping(image_tags): + output = { + "tags": {}, + "app_version": "" + } + + for key in image_tags.keys(): + tags = {t.strip('version-'): t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + version = semantic_versioning(list(tags)) + if not version: + continue + + if key == 'image': + output['app_version'] = version + + output['tags'][key] = tags[version] + + return output + + +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/firefly-iii/values.yaml b/library/ix-dev/community/firefly-iii/values.yaml new file mode 100644 index 0000000000..252fefaa4a --- /dev/null +++ b/library/ix-dev/community/firefly-iii/values.yaml @@ -0,0 +1,61 @@ +image: + repository: fireflyiii/core + pullPolicy: IfNotPresent + tag: 'version-6.0.20' + +importerImage: + repository: fireflyiii/data-importer + pullPolicy: IfNotPresent + tag: 'version-1.3.5' + +resources: + limits: + cpu: 4000m + memory: 8Gi + +fireflyConfig: + appUrl: http://localhost:30064 + additionalEnvs: [] + enableImporter: false + additionalImporterEnvs: [] + +fireflyNetwork: + webPort: 30064 + importerPort: 30065 + hostNetwork: false + +fireflyStorage: + uploads: + type: ixVolume + datasetName: uploads + pgData: + type: ixVolume + hostPath: pgData + pgBackup: + type: ixVolume + hostPath: pgBackup + + +notes: + custom: | + {{- if .Values.fireflyConfig.enableImporter }} + ## Data Importer + + You can reach data importer at http://:{{ .Values.fireflyNetwork.importerPort }} + {{- end }} + + ## Database + You can connect to the database using the pgAdmin App from the catalog + +

+ Database Details + + - Database: `firefly` + - Username: `firefly` + - Password: `{{ .Values.fireflyDbPass }}` + - Host: `{{ .Values.fireflyDbHost }}.{{ .Release.Namespace }}.svc.cluster.local` + - Port: `5432` + +
+ {{- $_ := unset .Values "fireflyDbPass" }} + {{- $_ := unset .Values "fireflyDbHost" }}