From 27d7c91608681e34057f4fe4f89d54beb23a1562 Mon Sep 17 00:00:00 2001 From: Viktor Barzin Date: Wed, 15 Apr 2026 21:32:45 +0000 Subject: [PATCH] feat(beads-server): add Dolt Workbench web UI Deploy dolthub/dolt-workbench alongside the Dolt server in beads-server namespace. Provides SQL console, spreadsheet editor, and commit graph visualization for the centralized beads task database. - Workbench at dolt-workbench.viktorbarzin.me (Cloudflare-proxied) - Connects to Dolt server via in-cluster service DNS - Added to cloudflare_proxied_names for external access Co-Authored-By: Claude Opus 4.6 (1M context) --- config.tfvars | Bin 10275 -> 10293 bytes stacks/beads-server/main.tf | 134 ++++++++++++++++++++++++++++++++++++ stacks/beads-server/secrets | 1 + 3 files changed, 135 insertions(+) create mode 120000 stacks/beads-server/secrets diff --git a/config.tfvars b/config.tfvars index 950c9fc0a67c6eb849d97e96932d16964ead97c5..37fe950261f227238b677ab66d618c14dbca9b89 100644 GIT binary patch literal 10293 zcmV-5D9YCWM@dveQdv+`0G`^%Pg_w_$WucxdYL!&iG8AHMjEh(r{qKiz~;sF5uRrY zd~}q1Ne>dWFHakvv^(^5!mxB1L_aSWyj>S4j(a{tlU}n5$gcC3!1_>OFC>48BSQ^u z_w$-kzsv?C6j)k2;#*7A=Vj!f8BRd5$3`nZqjCdIeOn){x`iXgN1ost#hbNh!fOB%oT?E~wMHtKTGKNY`{s zyHw7|yf(eZ)|qzP69N^dpJCzLC{`^E*FBZG z2GRFpL`Xn7hznSBd9CTG7%{1>3G^pv^7tUpENo>b7a3qbrU7An-vr@Gi?u4J<{#)? zdA6|+Sp^%|`a?ckQO}8%y)k8}e6rkl9?$1RoUYj%R&7bfY_ePe4cK(+pt7>o^#*!4 zWE_2PsceUR!f^RQ`;Luq^RDSkGSJ-rO-35ho?SPOrRQFe6*DJ|pkQ0F~Z+D0lMa`7V%0#Y@0*EO{ z*4qa-CX`xxR>GWPF3ZElQX;N(z0)u@VZ02pupebI*=_RZ753=TlH4y|;nJ%6-wK>$ zbP8aD&4J!`*3Z-zr_!d`)58+$xS`O_X^epznh9FSe7K=|)~|>ud~6hF*r{xB9uR>P zPVQteR(#2hB($G)STFum|N2YRSqtvp6dw(qMG}!Q?2nnf{(MclqANdjrV71m3g=T} z9=Nbs_O_Ekx+3Sk`toP%T)&>x7mW*b6Eqaq`>iAV;$U-~n)U?3chccTy6{U^wG(>D zclvdb!X7%!*>9YVbe^ z7xx2rPTn{M2~k;lkMSTE%uUQhH96eJWmsg=bx0!gBbf8)aeb%owBw{?@_$5nY%c9{ zcJX>K4>)$tcIjpN6y%K~yRbpTGI)>WCNrq4bBqLu9UyI8M%uch&UVj<&j3)htpCql zdXF)FDp5RG$sd4c{=7lJ%T&XMe=0?R5`v2cKK?urjcCFK3eGPkyaybKZH2!$J%5{& z!{t&LfC+#Uf{g^C>5%zOIo1y#8KlS^&IajukG-Z@78SaHjwN%QR$p7}<`tAzSX4xi zq;w;&FaK<&AhApOP2)fK9V6;hWE4IYu3~5F>}hF2fZyb_Zo{|e*l+fGs7vF z-*llRgEVvZy0rs%#IZ>9YzXjJ*xeG%uDq6)-{2U2Mxo3lXTf|Lz6yHo7^4)h<%vym-YKp0R zfB5R1^WOJ4j@wEAFpESAhynezftZK&S(VZ0v;tRePPcVkclYdayHRw)mW(<3K1X_v zF8^ z|6qwp#(BMHz;N_S*+T^RI;G_upT5&SYIQSXS`2|yg|M#zl^I9|F8nv~y&RR!nd|hF zSx{dzV$J3YR&2qvq-qs!3!UZf>!6|O{|BXA)1I&vC$ySM>(!$X2qFlP2!euJj)u7e z`oZ5-E|#`ggxwC@HUHeb?i(bdHFN3T-`5>2aXpHq{5gU1Z_`_$KgM; z+A>JLcg{Raf^@M6_{-m)m=fxu3fr6~2z|?N6x0F^{$!@tnQ?ij4|+`2I?8&_(bGk7qnE}^w~wH z0FINeAO$X7MHfU~MY~5x`OY5cwnpEn!Y4pPINRGahUe?($P0;F_og`%NbQbij2B{{ z=bXp8pSs(|%Q|VS@e|y?N?7iV@f`?{S$j&k=Gfu>8VR8~K>!S8WLcAc_@YapLET(T z9|~}z62GYrDCk&93p}8XO^3a{BGnovaB=_cmc0tgYZC;xsJOr3ee!bjCFkm2x2aFog}AHw6Y!8Iok_N8LrJP zDDXWo~YPHOjPYuYac$TckPviK{B#|8>YlY#8UVmKA9z21$tZ6>$<4(l+M39Ayv4>aA zTdNGy)}1A5e~3n${0P0OqcACKTrl?@=_(ny-j1roA;hk`({%KNaXPUexw(k@oZ18g-@wQ5uFf93P8*@XA%3b z_Ru74R263{>Q8dUQAfa3vH!ne zyg8TL%MI7|K~$zg|CC`V$&--!n3z7Hos^x7NZ*GP4-uKoR7DW*Z2c=;UZY7D^vUv^ zp3wotrBj_ADF10G#tee`)*x6bei$sigL}EAb4jKy7Ilk>oJ)M1m1#_UfFQ#f9 zlIjK0Ap^};%+%9X2r7m7(w6c!?LgrpGm-#sMM&AN=Dv3%Hq1p9_S@(3 zE%i5P)iEEhnXpV$(0#}@WeaneJ{DL>n;az@yyGuB3Lv(mX;9OChoaD*ovt=P;Ts?S z)T7c(+7}Y)7rQ0I^qW+UiB>olaZe6Y(zs1a!z@c(Q3AHEbCX}MbzD7!XnX>ADw5ga zjnsuGcUccUrq%i6ODwDoc+SQSJMZ7IM;$dfQ*p<4#K8Gz+hezF7@d&#LJ1@|f~>00 zEKr9r{llhW>mq9H@zD}j*jDDKNxcc1Tr`-0Rw8-}?LXd?4};RQrXeV>F2q3W8m!z& zS;y=Bz!#4BcOacuUpfR0=HhGrU9sY8ngbO@qxe9kH#dMcDjb%w!Pn)e`VY%{d*#!J zxO>GBLHp|PsJCm&*$dIs{X?+9vLw?RNdd}R_(kT^@xzmLDI+FidrAzlf8 zF>=0pZ?}Kc4mKH8zQ?7)cqi;y-wr9YG|dVnoKz2F5RdB=sG1OeJ}To?ElqmmnISEC411=O9!Uu3`?QLl;sd;Ata& z@Y=e7RO~pQIq{!l=b^?ZCh~bTL=4M{dDzM1;8&1P|By!Q46b*m zc)$zb_rXt!$2Ny#Pe0J9_${P77jpvCsGp|5?WO|s z`@$xnS^@ty<(XN<9bqyY;dC;tt}L9g-PjHm>E;*soITFK!nG!dl_x!-_Dn9taqBy zuK#}1-pB}NHt_oJ$*Cs7^>`l6hCrIHo;J1e+^>Ky$(TyJR}hyl8z;?Fd7O9J)P$qW zcYx-yzR+rid!=UIaag_%j)HJ<0}Ai#(%?V-;9@wL8P@Dj6BG2HI>e7L0SX3I+u4tz zdzcUb2p&Qv+beT+5@6~5jJg7s1Ancdqq!THV9JA7We`L0(#YLMDkqFr`VL1Zor$N}FlBgLkqD>Stt7fFe%9lT&Wo@^n%@t1XtyX*`+ z?7|~t(N-w4ZSr8yp2qu@)N^SB1e5sq8|B-QekBmmmETeE;hC*SL*I-ln|=U z`jaG>=-*edPA&J{WhZgm!^hSgH8Ldm-4?Z~L=PQ@M8g49PvI-(Tq$QhSSA)#MMVp{Z7-Mgt>tvdWW@M)V2OhKZd}nB6 zkxvo=-9eR&bR%0E0(-GU3}qv9PLSy+q>vv`{!fPiXU>!N#xxt`-ey!p44+*1rr!54 zlT>Z*#dFvYUeT1LEb}A%I~9G5YAS6p{Y_jXDC{C2v8L{$nJXapT;P!%G~^7}zQW>j zS8*tO_=8zL7Si@50a=O*F3aot-O1!X>kZslw4K^14Y0Iv%(9(`5Q>p@<}PnSxHc&g z0h5YLO#|Q?ohH0WQ2S!;m(UC?v5NY^&*; z#*pHxu+f*)wA0g+y}H7CqhEwf^$L5b-N(J{rA^d7_SX}X32p62<51kdtBRH{`?#S} zQMPBW4&a&FutZbJf8TZm-5vj3a(dTa(l}&t4az*fqjfXD*>wOi7I&$xMfY~26UP=> zo8AQ9R(5mvQID0P_@aw@6UUm&0a@YT@>C%>b~kKd3j)2TOS^F+Lnay|5LO~iBUD&bFc1fl9DxFR`u%|mSprky{85_D-quPvl8t<=@V03`0` zrycA=!9&I1=};7{Fda6;55UcRX_oc0nH}4TXe^W8N4xog-${9-V8)0Jhy4gXs;_Ep z@&z{m3$bpzUk?@oS*DjHa~~~J9=UIquzXt`xIc8^mfcImiUOjUK%$Ih5<*E-OR#VU zki9yQxQp!yK$stKUq_oG2`~u_j=DuJO&md-0p<6?6Hg$-4(f9X$jQ|rSzBhd^a4DWEwR#ZD@F1=FrHdRi1$=2RP(ByH0zy*xi|7 zGd0A;znbZp)WF3bUS5BP&}IRN7vae)OE0@yB#Yy^A`rtM7GmSG0~=b~H5lvujUwzv z;v8V>@iDW6Z?V5LVNpO_Ln03!OADU>L8E}V@I^f+$`o|Qi>*NW19l#N5m6(GS`x6x zU#0IX)(u^GD-Aw);++UJDtK>^#)d+&WL_U3f0KhVs0DS1hEY3X=4itKz}(olE>kds z#$;bkpQojkm2=KD(h$ zKcFk@oDbC1@IK(eSO63{R4my+3%IyJ5AC~#)X2ErwabQ56GTmtN zP_^d<>02&22I39YGr$W``q&Hp3a(0+aO=lzn^Gf2&xy#Zmy$hyFYN8!WeLB!RA*&m z5$Q*f+oW)o1}4$*H>aB~sg&>fbzSt$(Br{Eu(-AA0fG+NRJ&G2#Xkezc?=~wC%33R zQTtDB%NL(8|5jW@9f>tTM{5Z1iDd}+Mn`&+1X2m7%$R$at1i3!=`1UN7^st7j!O)6 zB|YSNhg-?FmJfNMCh)6P4whXb8YdDX?()ywTg@4EMC?{vKlWO`7jKMPhc4BZ(l5Y% zuzKk&xmur2i7^wyd{mqZAi__DgZ0$3wHxaz0X^#xs=$l{1j>`;lA0$?VgX#C)KE_A z@2{;@0Z&XukoF08pP|xUX$e8_gV)%Qk%kIlJ)bm+3g(t(TfRyRf9)Mz0uJp?j9SW8 z3G{%c8-jFVLrW!?| zCQy~~)<6*y5jt4@Wup<&>E|-M0CDiT=Djv}8F}V$6ss`rlG_KDmzIuLK3Uw^En_t@ z3i=%|MolUO$v!t8c{pch#{?4G5+(o4Eyh+sGqE3q&`hth&+W$rsQHgPtKEyZK)``v(`<`L7V86#Arxt7!XjGol-QL4(mD;@8e z;*VEgXu)ClusyV*ar)1iA|msln-AWd$Ncc2m32Jo92^XAP&w`RoenYbbqconrKLkj z7-vjrXki^NUFm|b?jka+Q%pTMuV;$Z$%Ee0AMoT~Vujs~7>&uyKF z&ytaa!28pZ{($VCRk}{0CHAd-H;B{rcC{hlsq}Z345!gG`HS58E@K0Cp1es5xbx7J zXLBl_7ap#>Pa7;JwY^EuYZc*Jh~~)WyrhCHtcQXQ9;kBvP*Fj2k|08&fsf**>|**0 zR43F0462)P0YySOp(2ccGbKh}JBuW3uk-uxF=Y55=fenHbNy*vNyyzdyjJr|sq0J) z4mt!!+_o)qp|;LNew`Z}V#B>~%Vr64Qe=co<5ZUUjOOg)mL1_t}(p5rI*)c8Ab)tHkxE)mcB?**Wq06(QX`tAj=As|&?XP1Sq)&bQTtoG z=0#E<3Uo)YV5E0-kK3KaI^GI7U=7Q$hHC1hlfw^;>xD~(;H~3TosB=Wzsknss)Y(V z9ru=ZC*Mfge&F;oR$8{ffTpI6P)wh2C1M}eQ>mrLedf`v1BhZUS>5T5*D zV=ZdZl0=_uo5po(rxx1kq~=&Qu-y`AF5-;XZ;)_kkdtp!av|JTqq^F+;NI6%T=1O{ zRS|oZte;n&BP>;VS!M7X&Q?ttyKetTH?JXPeqW+a3sa4>%Qt+gFryRg0rVzF%`3X}L@&4l^5%UQ2fk=VZrbR-SPQ>?#jRi%siJe_dAi?!i+ItgWB${f0 zl#1A@LI?SQ2W>UCJv4KTtw!?-oTpkC0+<9YL(osg=mFL3PIEbssQxG`4ir|zid|%F zuyk?o`7@tRVw>yha}hCp9t7Q8&zil`WiOLN0Y`SadwVEP)}1j>B^Psd7Bo9(ew#(J z^;ff2H?zoOyG;8G$((VX3!DA2)YGI1SU)17YgI7wWvr#*z!${5tqc^EdFj{E-F zKr&r#IZ@y(TV%iID%g(N^`ZJ4JuZ7i2hfn^LUb8f_tJv~yx=qfPdCTF8Sv+1q8yY0 z`B7%&(OunOlGXQxTrB9}EgEru0OsaQTzP|54K^SDWwPCfU8iB5SaYLycISl8R-Gk- zx_YawW&B^Av88%2(Kf$mY;W)^pkWq*BkWbuCjNwdM}Z)25^|82!`38aSkwNj2>mRN z3Q%@sOFgh%{Te(;`ahbS6c1WK7z~f_S(<1Z$Bp@-3_AdFfv{wB{*{bH_U(IL)*l{g z(-RcApJ0b>8|LvpTXtkP>h|9X5nONY9&x=7w}(kwe3Hvl!YwPx^mt}tb@Fx-vu>>C z@uudUkqS6y%B0YI=ae-^dJ>l*8{BGM!8lGYKhJbl6}W1gTl>LK@=DRI4_A zAVts|D{X4J8QYPaIuwfEzMvPojXilCIj5;Qz}UtJEPz)WqXDv&iV6xv6A_}Fr&YjR z(Lw**$h<2;=aWN_PN218SPi-29mqG4^Fp;e3Wt;E-I@Mzq+Q{)8e;L~aVS&lo$nx! zScnyq!sRPsk0Ee+HVVnV4r%g*N}xUhBafmvgdj;OG`TY2S! zi+okZrqMix9;Y()nmA{@&(sY$>QKve)*3q-P4a`Mrph+%(QGJT)#g9jAk-UEH55PP za+TCt9_jrQBz&19*>B~tkah`83w@h6VAkNS2ei#Qr|4B|9{8kRp<3kEo2Y-dVGFDvZtV(w zz)nL4zB~jH#4+`tSDRf;H3gY)G&$p<$c)D=1FjiQ?Y<>KLBqPQ9vw)3WS9hb9V_t}6+9c`(I>Ce}}; zce4@zJQDtO;haGZ(9zS^efd0;xC%PpW?FliyqE{06V-=Bb&(?v_i-=gS*FTmJnaJp zUN%q-GcJbxy^lGrAwI%kDihZk4vOy|%m+%CKm8QygWfwJ5}JWr0%Jz{nMFW2^5UEJbz~SzUmtN0krq5>0(r1EwHUcD9$< zE9Bi2`lF1e1ytVPm}4Tr$w59hFbO#Hu(a6G2m^qBIsF18)Hao+c63lMUsOej1&6Pq z7KeRZz;j`B@{s)S+M@+lQ}D0DX+9kN^*0x!;8zM4LkS7a#&#(@FAtK}f$Hf}*CV5M zKlQUlHXMlPtXO%BoR|vLx%ylN2@bK^)TY4t&#mA;^QItcP1ai z>A?v5+dovYK}WR?NO8b0|qP_ z0H#MeBl9*WNR*SP0|IBXJ|J4DzML-1WlxJ+Li;T~XI}5@LW#JAR*3NYR}BDOC9^Zy zzSk8hFPjX)I0Q(S2fpQSw9Gb=ZL3}nt2}OPq5+w9q|9o$Iywnnv=aF$SE(D#HO3vL z9*2UOieA_6*IXl|=pOAou~*PNSM)E1vy zZ)Wn*=hodyb5xE@zXQv&7_N2jMzHHto#^RDePH>ycFL8f==i5UlJWRP(<2RAnMsZu z=bY>^!71kk?)!vYPh1v3ajGygLYTIId;QSG*K@`|3=MvzHJV+muD5)PG4cqwc3E@x z;tQo^x#ihxXnlONLCS=be<~|tOfW&Xcqw^?z4ka5k2P~A8BzkN(rdJ!1l!5GJ$r(a z(|nE^>&bJ@Ks$@|ggH&`VPf$a-vc?2Ic#YT_5M?!(yU`*nky@|)bknmsJ3!kTDC4Q z8|bP#WJKD$kHSfq#IO06`&*PW9!^3f&e2PjHGn?pe#eIkrZwa%O>8XW3RTyk=c?s5 z0Nx1nl*2}2=G}f5dU{wfk?YlsNafPw0-J;Dg6>cgNa?LxyZvNuB*!!`K0A zUM>TqCZ0z}0$(og$AH~Z;jka09xVTJ(|6HfVnwPcEt{AD#L9j=pENS;qM#5%o;DR^nOWd(FA=@e>=Vb94}%M^FvH&0<^9hp_Ts z-rZrk!fYyzL{v=_KmCG38`$Qet|E0$3BgH$xgt>g^&*b;1 zWXhVvy&#xItWt<*%k>Q}E#20xiZ!29i$)gR)TCsv{5l|Z-|cgNldeB5XFTrc^XTAn zq%VKU&i{s}4bhRxL>dGe`#!XqqsSOgnJ3WoB-W{_^-=hyW}Qs_!)B9x8F!=c zLXtBy?GP(BXD%K5;gbQHekYWIOhqUlfCQ02X2j=hv0~Wh$GEd(3#Il`R}GAesf~2s zXCAjcVwh~RiH`j$wu@L1`X060z0#ctL93dS;6CSsey5Z~5+pNF+g294pj2!o#@y5| z2j=jf1QITv4%aUw9Lv=2j1^T>e^&)e!Hx>O*@7XXQdv>?0ZRpx;y|Jrsw!si`tXP6 zx>*muaVK4bK`Vu_=_rzb%k>+fnAjT{;i=n5@N&?t+EFaJZUd-&O;`suCbm#J;RkdF zy$VhdPdfAq!9K=jMLv2mhi!ZH&?OXskc1GPG=@k{M!W&{Voy*i!oxsp9bXcEd2I;3 zFbu7N?G!ky?Y~fk)P~ky9k-YsiuZ}qybes`+I-lAFxt-b(RW{7{i;Q6x41dVq|_D| z>c=9F_Xeqa&=lO`b#y^}OocphiE~{ECN^GG6tL0#+Q&5_oxN59VSsD?w;_dnqY0p6RgI4JXBYAo>crvU_?5UUnE^>=O zcSvAqSPzJ~g54jZHWdK)Y$Na?8Cy3{8EvPV0`eC;}*c z?{nfxf556vhy|nFy5m86{C=X7p_xM1e)P5{GggV3bnndpyQk%`_ehPX?;M9{`I0J( z&I=iC${2bXagrw9Dzu#q zx&@n&y@N1qE5^2uA@>&~B|&DPCmv$!&rz|cYUL3PP2sim)WwH?Pw6jmot%HCF|S}< zXK??I6vV#mD&}V`rXAtc)D>XQbcc&Y7~=heOGeU`IF?y@vCpBR&`d?PD{7LNTdbr!326s+SHVyRwoo7B?*H+N*|ImkE7~Y z+-$RfwN)WZ{{LWx_;couZeV=+{zIVdD)^4wFjwqg#Rh3n z#1G0W`&-*UT>n$Y=EgdUqr{Wuv11n>1yFr^`K|(XqvV3NFTYbf{3%o~H4{`JA9JgS zNJPMQX}Z}T%(}2Ci8w_<@)hv1*^S%qF=L?4{sM+NM$!qpR{#nfl;8b^zep<+%O7A3 zqMLC3YolCsy!y*iadiZQ>U&xNnUwsW#LjQ#P1B+yb0vms)HwoL&Lc7@aS|7ZqfNm@ ziL=f}Jz!Vn8HC7|P*CeSM&omtwHl zdIWNfE@D@Dc<-P@6a)qZHUJNm$qYbyYL?!z{4>1q67`bMvWYNP&M{W-?IJ)XF|mR4 zq=WKO-y#?6wbNOs{3;M@$wyDF_FrnXCwR}FbbPJg|HyX9!YV%mCAhKm6iDjc=P)v^;QRQcJY4fc|A$I)Uy6Cw0=$_qTgxb~5o@!9NaqpBWk#Nl zZAiKX>60(=GvidH{=*lYv(HFB!{M5V60zi$yxcbaH~{|8UOIfiV&N^&IJh&EbfO72 z;M^r*v{aB1?W#JVoJwL)I&}ZY4GCW~)3Z8Tspd9pyj12hS&!)i9xp~_W55m^tG~2m zI3l4HTi_soS*W7m$^tS4&7ezp&X^v}nQQD=0o$S>CS10Y_2<1GF4P)(8aDXG^bpJJ z{WOAUMj(dC!DR;YKh<}Hy>|t%_DUuYSfsAbDb)kh+n|-^$tiC%>Lw^Ll93s(xWX0e zS)+uYr}ah>d;Kj77idwL6>}c|!B!no4&cFP6-^n43+eg(bF*oil;ULE>r(EWYV8JE zOJr=77D?4?zKZL&DAa*dzcIV7Y7-?0n;w*&r6PoF!nDbzlj_;EhCdnp=T5YjcUEJG z5^ky!O=c$YS=KxZ)8=4_PB3RpBdbB|vzBR?{rO)oC1-vx?GbqN`yA3%4uru^Km5cU zl@i56y_sCk|H^DdK4ZD(b&tfFV0wd5HyJkWpn-2b;C@~%EvkS>>i^_^QNs?=2Kw5< z*~6E7c5v~)m-CS1VEcboF?rREG>1urD2}0#@;M8RYUTVw9S;fzaw@lV@xLfl{|ua0 z&q);%UvFHiBW2R1W^&<2WNJFE#e~eOGqKbl#ruTQWUg<~hZ17C4_4%JLe-NNz-|WY zXTR8*1R7lxlM{gKAx(2VaKJ)|YXnFP8}xs|{?&)W)eX@dnq){Ng5D;KQ{i(K-Nr{S z!CuV#Wa!E<51bpI>i*#~-*nQ3$57JgTTry_06Ra?gPB#05t{8`WngxO% z2{)c}&=sBC8RvqmbM|UXN~hG&_5U}ZxpbVx(RPA~wA3`wD8a$hNAu3~+M@O;<|`-g zN~u#?YfrTBK188ndW{hF@|E{0>Dtio%NmtGd^NON%*>CaJBP@Wph3RH=ycYk&r+S? zMLH>jjtxLdaukChcNw7V{~PGlzh6iJ+6;17rlD3AZ>$?c|Bo;oH_*Q&xuFZ>LkLuM z%BTvQ(95ZMSKVj|8Uil+1qi9R)qGVxG`4(604wc{!a7;@^-dRVLFLg$ec*vyP)|-G zr3-U|#_t4C0hzo&%XE}_{EgVV$ALp_b4$cUz>ZRqIa(*~ zr>B1xZJqiWbS>rON$fYHS6BFw_7QVQ)x$WoX@m8jQ!ZYS6 z+~r$wG8NcW6*_{}RM{@JMBo|!A`XTw22hr337DV@A9bJ_Cl)!%BnTkQ+rRZb$H?&m zGdidO_$o7aG;U_B+Cqirr&g+C4v~D-$i3_8D$a)ApQh1Z0izHeQ@R37=-^(iawf&u zy~m_97O{p=QWRv{x+ZVygB|9+=18h?c3=iQ1u=(mlM^P(b%5iRg{3jkqmJwRKiW~A z0`#HE8={wsq%jeUKA1h@ei*<*(;_B`hnrx`_E$j{qQ*ksESv!SwuSRVvSLqF)P~sl z&DkCft}q3_kz?DtRt&q^wJ8#XuNDVhXmbMJd(hFq56n-f^r}6g{_&!%6>jHKCu255 z4Gr#0DMJ5KzgD1r7@~bIWb|&1Kh5$)qvR~5;^qJUiuNk@JJVQK&lMY4#VD1Dm1>Qm zLnKy*J(r^+=~o_yobgbH*T9FoOV*26+?jxX7faXB9!o_WKMnkc?0 zlna{t=}UIGds@{o-N5HPA1$*7r&m?yIn02V=NfT->~+GF0m4~^*a-y{pM=(j>K#qFQL~L1H}299x`Tf!Pzj26czWiX~JQs=wjWre=%GYA*HrNL!4ajrlb(~pV_Eb!#EpKE{_^BaS3wMw&Z{XHj>$vW*7=II$_Py`_w=M*ud=Gw_I~bjZ@g1v`)^^pXf1{Y%=KGF3w|$Fq#C zlXv9S)WCJtBsHy1D5xJ}B5;!kW2;(_VC-41BR^v1Y8GU)ej_7mpf}&f+{AK#3)Bwm zB3<#W-L@E6H_LRlx@PQj4RQEzHU(bYgcHZBZ^&KLFA6*MSLy`4L_2n~=q1b%TOY%+vhrp7X;`|DH&Uwh2XmLY#^=&YlA{D_F;xB!p z|G5n}o13kyKiddE$aitHPH1Q^l#|T%oHUL$=*54aF1d}w(XZpoic8?RK@LFYL>w-OY{ev@+-@t^ zueBddCxMk5Uv(sjX8%DA`1g=|7f&7%>Dn5JBig-xsnX6StGwbFy9!D9N|}QbsIklF zdF(>YsGbXCF;xJ%cV)8%*N`{2)A1vxf1G}jv2-ceRFG6Xr5Sw5;_j{OQJ$LZGl+(hTSFS`<`dXYRXRfQc+AmGi!LJL4ibiy|q7ZJ_Ky^sZ zmUYMa>&wdH!H+X5Hv#R2xYMH>i8{Y2AeZ2rvtny)>g%-LvqsXYfeK#n(t7h5WY+$8 z*oP`O81)-sN)J3)gzyI~ZHG%_x2e4tz7(>9Q7;gqeQ*8xCecDMYXkB5vtwie3~Y)% zcnWbP6$wX{N?e8J3ow9Dt8;%BJpB-cf!_IUuZ-hg z<;!9r&f5Rw0o@;1pAdqPHG$`K4dG+39l8P%F^tsQL=2P_K%2zKiJog*3$_Me^X{m; z+ta^=9>UggM*LZ4c$az_wlhF~_CXi*R2_*coFEB|x)-;8efcdCtl`vP&fG+YY+wnWg83T6L{Z{a#LQ!E-eay^onGRZU>G6!`&Q}CWm;-DHX(+t!$LFf8=9mmzzFe;(|}tRrXsBL8xnb z)9S!JN2MjwK0jLnuCQ$K(5}G6%F1uSMTgbhVkI1W1H>yddz<4XA#`gR0t>WwT$ z));&hCDLEPnedqqU^W_?QiDOsI-4ccz(~WfIPHVY#_Ya;X=@GVN%QK_Vf)xrerP+A zh|O(edc^OHRntpIZ2rl{VN?!sy8+lvTWAk3s4LhS@%pzw6S#sc$C0pj$sN~0W8E zeajhO{rO zSE4HFGaR_PDz3D4Giq!Yh@<|69lQvT(x>PQoJf%4zkst`OFpsg?svs?1@rx6(f8%!9r`%G1|)L0j**cdl|!Gy~HUT&Z>coz?ov9Z5C!; z7O3vPx&!psB51N}cCI4+aR}EP--9>bc)029t-T* z>yt@YBs1U}va3un^Ekd1jQ z(q+>E!OeNBbxFWI*uY_pra_z%NLuHp^BMLAPQYZp9h`tG84V9TNLe4UP45Q)0M1L@C6sc2Bu(NwKc3;}0LkI!FI}h!iDagMQYx_2L9N8-St6e8IP8^`-Z?hP;Ln>~ZG(oA z`a!ig4F)%a9aVy+$#C1Ad%SYRh56VH)Tr%xa`m3xI$Cf3`~adDT;6mO`VV`wyX#|j z&P>=o<==CFgb_9j5O#R|Z&dMA5CsO|FnkFm&;GuK(C2y)o>?epG;Qk84DxNLVJwMT zNw-VAs|XfM`TcY_yBpnm9`yFKF6B@26*PVs!?F`G#E@_Wpd4tanR$O%A^$6y@mzh% zYZk^#jw{C7==>)z&OT`G=98y~u97^-Hn)2NIW)855^a?9tJr4dc9CO|QXdv(}Q zqgSM3dMa&B(|z@B1t-YU)75eUSTQx$>YHE6-& z;N#rsA8v2+{@&*&mTiUZARw*1i6$C2ejH(14=!U*VjcVv;BkwOT(VOUzgeR?M4jyj z$jVF7V5M|sn$fVVyw~*o)8H8WxiGpZaND9145r>;vv|dIHCDC8$mB0M>x%oM+#B1V*bqPw&WUGlb#ECyggPu8{(h9D(8Z6JLU|TJjCaB$ z*5zUOrBM=9?zKJg(w2Pv*UesWLQT2RjK84%#Ywu5?iiqLyq+&Yk(bu_*J5pK@kpM6 zgGX$6;_yBV9W>mNkd@+EhA!}ga}#Y8whhxeU2dA#>Ke?!n?q22|23=C?32c?C=(y9 zsM7)!R8Y;AmCMQeGXODpwBYiB{R&31N-Guxbou>OD$#l%pX|n#`h=c@g6#*`(|HwA zL+V_G_TsgIOvA62aHwct^19W>;VcbkD61H9B6uuj01xz0qZ46}lqC;ef*eIj*(0*o zci9R_zxmzXL(-92zxc*sv{_LEu}RMY(V_c8Ydet$-kEU<|Dgwejp8BTj8DI!pOmRackb~UxTkg zMNYD5d5XRMJX!Sqx|2dz+F=>$nrWCP&~#AUwZttB*(uo-4(!D~3Nv3>%I@k>Vl(|f zqpxl*NxV;|_&GE4Z&9|G8yC{hm9^Fi;kJ%(TzPkKaoezKtwnDhLl#^0#1lF>M{Ya( zAA;cYRI%=&f}F~fwz{{bUCt&NS6g@6OH|n0i{$h!jY+qrx6m{Lx0W`reux0YpG5>` z#4@H=TD+80V5#}Q5iE~Y4V@b^7vKx^F4FkqGEZw;yuc~`q!0C%%@)u7A4V1cm_-e> z!dw{u#hEstWJ!!m8ltmTl$h7Y-1sEx(?H{lU}eSS*@@5Lf_^N!eaidr)^|$H?911aOSCbp1E1xuggU@#qqm(=*8~eJk+vG8SP?pm_EiGRDX_-aZT~b z*1l}z;wIq3^mG?<77S(gACZ_9rY2*Cz9}<7D*ryk2o?%tWGXsaD>1XcTb}iwZx2IO z9UU8*ux4dTgwp)R8!KfUW`t=&p}rS7d))8(d_SZhv;+<^GdVq}X4;0I5`etQz{3U6 z-~auk{0OITVU9JzhL7bqYl%`Tpg36QeNAub6_^sezoOq2tSHb9f|DFyH)!tMgjc4Q zw-A*DyZ0nM_JS!4uXXU|0!|2+Ztj2X2n$UG6+hb)3~Cp>vGcONG1 znd|+B#sqpz$E4fOp4Wnk=$YklyfGi1P(UaZ1Bv?^0;Rwz|NU^y4Iw98m?_C-PZgnG zMe2}at}))GAfek)m2oWaN;^dgr3JpkdK!pNl)AF#CV(s2$*;8qX=S*?2 zjl#x!-P62vIv+Dy!Tb>WixKd#DX;KB7OVKSN%>Zgd~weWt>;lSnV_WiRWT>Faqcf^ z=-s+x7XFOFvv-1PE6|??Q%wunuzzm$}Z5N^vXp50(;^m}HeDNBT zeiAd1^e8-Kc4-Au3nzAHkq0MJsjAgE4QlnyR6bMjlD!it%JSu6FuuPp&F#` z7YLpV>)tB>nDNY`wIp4qmuYNmx6bP_SRv0OCv1giExQMY;)|qWW8)t>v5rY}%ssyIFZSo}Jikc|^ zRQ5Vnbgw%CUz_7P-yRok6%GZ|PZYy~pH>{~(A*ZT!=l5;YHjBAsUw`&Zp%uB^qdE8>LuXg>v?tRaU2w?T7n{5Wx`O4F9X`S~^Y}SG2_)R~F*)6Eut_?H|q? z_+Y`MxKSFOVM`E@-?#G)qIB4I46BieYY`%cX_@(E423dRRNzJMjNb zfiPVHd_~1JJqh;mnr7$RqK+ef>s;#xmvbOYR{mKu;}zq)%7AqdE9FS0H;>A05ENQ% zM}rIYew4|1I7{lO5-CfBc*Q;UMyWHu$=2*aNUR-thL(Mi>OglH9cg#x&_{c}mBxQI z0Gk{zx)%mzsIcgh&>kd!mwri8-OHD4Hwj})u4$vLy~C-FpFuQ0=P@%A!)LZXKUMXI zKG*oQm5^pu1M}r~YvKP9ZSzP;9s+|>x22ML$M!$BrgQJ`E1aDXg=>)B5Ji@q-@In% zD&M^@d|dd^M+p7C2yJMIzXk28#-D>s&HqJ2YX0U~1--?*8i5ep0W8ZIH@bR8jp9bfwfum{wmdMPjZWuPP>z$b${x(+K~h~L*6 z8fRmr;S-dU^xU(b`CT;JK-2cOs;Fsz2{c(PDYz3E9>u@Tqy7}@>+cHk;U77KEkb@o z<9#lTQMO=G1J6)S!iSYigX+qLJ3ZghJy82EyJp`@p6)<&(L)YdlD{lX2MK1Je)$lW ziQ-pKy>i=H$UV=7slbg(sfJE=rMW?}j85;2h_Gdg!0vhkbN2zu9$O8k(K#F-Vqj>> z9$*+~-NcglOD&&?<*9S8 z2*6yQftfA3Rl`FltMQ2Z`wh<{MlNAG-nek(Im6CnhDdUpxotKlGu#wkqPdru2OrCT z7Ul;;`Ce^1Ahny$jJMOH!F$5yOmH`C+ZgXX)n1 z{fqNqO^GV*)!Y5Kr)y_i*S|-IWe;`mG`8JH?x}7lep^+V!^!4yK*qsT6NL6H#6p3v z1+Sz+Ctt@>%edmhaYD}NT2y!PZgjF|F4U)c|LANkV4S$>RQTG;^~7wi9lRv16v$wu z_niWeXT;<^{P(x}w>j}K18VF~KBcNZUZ?gg#I-tbEVaGZyM!Y7K)5f}N8XH2%K~)& ztx;@J8uGLVI`x~UZTETr?qkGv3l|zeS+*8$c{W{l)>H;RvbjuDsbmU{!8GT+egODe_-@CU&x5tZBH7rxWe78_0nAij{4hRyk#6 zTYu+^Y1TMm*ZD#3Cd6w9tvsvEM$7b-mp+^{(+8+H zStmK1*al!uBft*qV6SetWF>p*u9BiZ|M3z_AO!0d05hyC=lHDOv~%9`hUwg++<86% zQrNY+p(^5>A+O!RKP6HP76fnh@Ee3c>h0muF0mNDBKN8 zHXh`DQfZA6X61yAMRJjTvt9NwyKsW*aD_0oZ#}=Y-2r=t#^bQxQYogEcFRHs%6fg3Vpe@0 zz&K$JABP5^&=2H~?#1Pu|0Qy|V%m{WoyeWqPPCA8<`$ z=R){aq4dAXDO$sS^AE)=(e=!*PywVP(_txUoy6p z@pak2y=OE6NTu7W>bUo2JNpRb-F0Twj%3v6WPkiDZ`18dAh9A<;$)oZ-~0eC1#8~sH9-|!)~MAz`oRZfK?8nBK)QA$WyO|bb) zQK;?|tuhh=O#abY#<+xOu9PwPUTMpp2PiZ`6NdqK4C8O)yuEDLf&1^d_dRbS%EU8c zayIza$r3P5*tfF(2PVe%RDQ{QESJOB|0~w-&RI{oKKVyUq5^m{nq}X!KvGRFRUlQI z3mMu`M$&tryyts|Z$GGe3atklMd8EydhPwb0`LNulaj1=$w!rbN$u&an7y(|Q94^) zTwc^UHqg;or2eo-6qT+4jqzjQ?zo;g*FbYtw0j)_RE!hY8p{jPDG68yw9=rW`GBIm zIhVzr(cqUQq;GY+}iTgt#tj7!-TK!Oa4o%EDpWOMOWf z8>#CptdHnqDM~liV)AM0v#782A9`ko(1vpuJ)Q~faD{r3Z<1S)l)@4+h)cUGr-qBq$B_;d pYZ(Nc*aQ@w diff --git a/stacks/beads-server/main.tf b/stacks/beads-server/main.tf index de40759c..39d228d5 100644 --- a/stacks/beads-server/main.tf +++ b/stacks/beads-server/main.tf @@ -1,3 +1,8 @@ +variable "tls_secret_name" { + type = string + sensitive = true +} + resource "kubernetes_namespace" "beads" { metadata { name = "beads-server" @@ -170,3 +175,132 @@ resource "kubernetes_service" "dolt" { } } } + +# ── Dolt Workbench (web UI) ── + +resource "kubernetes_deployment" "workbench" { + metadata { + name = "dolt-workbench" + namespace = kubernetes_namespace.beads.metadata[0].name + labels = { + app = "dolt-workbench" + tier = local.tiers.aux + } + } + spec { + replicas = 1 + selector { + match_labels = { + app = "dolt-workbench" + } + } + template { + metadata { + labels = { + app = "dolt-workbench" + } + } + spec { + container { + name = "workbench" + image = "dolthub/dolt-workbench:latest" + + port { + name = "http" + container_port = 3000 + } + port { + name = "graphql" + container_port = 9002 + } + + env { + name = "DATABASE_URL" + value = "mysql://beads@dolt.beads-server.svc.cluster.local:3306/code" + } + + startup_probe { + http_get { + path = "/" + port = 3000 + } + failure_threshold = 30 + period_seconds = 2 + } + liveness_probe { + http_get { + path = "/" + port = 3000 + } + initial_delay_seconds = 10 + period_seconds = 30 + } + readiness_probe { + http_get { + path = "/" + port = 3000 + } + initial_delay_seconds = 5 + period_seconds = 10 + } + + resources { + requests = { + memory = "128Mi" + cpu = "10m" + } + limits = { + memory = "512Mi" + } + } + } + } + } + } + lifecycle { + ignore_changes = [ + spec[0].template[0].spec[0].dns_config + ] + } +} + +resource "kubernetes_service" "workbench" { + metadata { + name = "dolt-workbench" + namespace = kubernetes_namespace.beads.metadata[0].name + labels = { + app = "dolt-workbench" + } + } + spec { + selector = { + app = "dolt-workbench" + } + port { + name = "http" + port = 80 + target_port = 3000 + } + } +} + +module "tls_secret" { + source = "../../modules/kubernetes/setup_tls_secret" + namespace = kubernetes_namespace.beads.metadata[0].name + tls_secret_name = var.tls_secret_name +} + +module "ingress" { + source = "../../modules/kubernetes/ingress_factory" + namespace = kubernetes_namespace.beads.metadata[0].name + name = "dolt-workbench" + tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Dolt Workbench" + "gethomepage.dev/description" = "Beads task database UI" + "gethomepage.dev/icon" = "dolt.png" + "gethomepage.dev/group" = "Core Platform" + "gethomepage.dev/pod-selector" = "" + } +} diff --git a/stacks/beads-server/secrets b/stacks/beads-server/secrets new file mode 120000 index 00000000..ca54a7cf --- /dev/null +++ b/stacks/beads-server/secrets @@ -0,0 +1 @@ +../../secrets \ No newline at end of file