From fa0eb3188f165a938c52e78931209396f1c823db Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 4 Jul 2025 00:50:03 +0300 Subject: [PATCH] =?UTF-8?q?add:=20=D0=9F=D0=BE=D0=B4=20=D1=81=20ChartDB=20?= =?UTF-8?q?(=D0=B3=D1=80=D0=B0=D1=84=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8?= =?UTF-8?q?=D0=B9=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=BE=D1=80=20?= =?UTF-8?q?=D1=81=D1=85=D0=B5=D0=BC=20=D0=B1=D0=B0=D0=B7=20=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + images/k3s--chartdb-ui.png | Bin 0 -> 34778 bytes kubernetes/k3s-chartdb.md | 125 +++++++++++++++++++++++++++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 images/k3s--chartdb-ui.png create mode 100644 kubernetes/k3s-chartdb.md diff --git a/README.md b/README.md index bc6cdc2..1cced60 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ * [Настройка доступа к панелям управления](kubernetes/k3s-setting-up-web-access-to-dashboard.md) Longhorn и Traefik * [Под с SmokePing](kubernetes/k3s_smokeping.md) для мониторинга доступности хостов * [PostgeSQL в K3s](kubernetes/k3s-postresql.md) +* [ChartDB в K3s](kubernetes/k3s-chartdb.md) — графический редактор схем баз данных ## Python * [Устранение проблем при установке Python-коннектора mysqlclient (MySQL/MariaDB)](python/python-mysql.md) diff --git a/images/k3s--chartdb-ui.png b/images/k3s--chartdb-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ad2b2f60856cbf96a193de07ee745010e9d7c6 GIT binary patch literal 34778 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 z zx6=Ithf_|mdJh!~`=0@sk4&T7B8K@rZ{R?NZ05RI9Fc3p8?74S0GHQ2*dZ_qATYe`9KfSOquHO&sxACX*XSFycwry9QU8cb)BK>I9V7EA# zW5qs6vcc8k&_6|sY84--F(t{&#PNi=K1Le`t% z%#5ojYQ^wQ7}M|Mj3W>%DZ1gq3=@XNpMQ-5l{33VB*^ESq-}(!RYM3@DJ5!M=JdV_ zn13x$I<4H*I5;~#WhYr7>ltW%j`boj*}IRqC0EJbB3LA!1nIh+U}h$czBxGebn@J| z+h;wFy6hk2Q!ZtorZ5d>BdQ?OXqrwUUdLwLT7Av>{K7FYDN_3Mt=N6CR)Y`c$;)B2 zv*6e};v21H zff65+gR_QgE_xwfySQGmbE4g=RKuVGc6?B^)P&XN7AMM7&d@FrWo-{(9R>e1;#l17 zd|+|xgj+^|{n-6OiOvRPovVRxnw)LPQ_MoC)bHT5%$n@D&RzE*6@#F0AVOZI`U4|Q zhpBv4rIAon8&=4Rk!y#}YS{!$A^S~C7uNL{?~L~oPlR3;rB~b8;I5jeiT~&qJ8l!) zhJ;0R+8R8Nq)PTLBI03iF) zS+y)@H*S)*cxme<+pXO}F_aCZin*YeFOW8_|Cax!X%m9PCp@m*8&L(ubxk>8XrfKG(YtiZONZpxw4DU(dcO8)N`7^dHL_6idj3f}3aKat0DK^+^ z{037U(9z3znQEa;z)3raR(`@@PDw})@_>mITK{HIhRA5`Q|^kw zN+WzGTM_m_!@!`=3_2(0-vWa342TfBD#R{69z^JOI}z?wHZW)`y;8_ZxAdoLods>{t=J@u6_`lK{PbdewynA$K-o*UdA zyNcqY!q9y53vsEm#&b;9jL>>5K57x~$X=k|Ls+=A#@6*-B!B#6uT;S>>@RX8X?wM8 z`(ZI$i)sw1GUMOD6L-zze5h5N*1P9fHufn;@{0-aJjGk9CY9;(-^>I2fy1Odrm);R zwOs-!fmunc|MYGOE-39kjDdFISvg^s)TX&F-x;9Qc=>7s`Z>bH*b>S{ZTG6o8hewE zh?6ThzI8Mn)##*o1T9VcbXX~`CR(66GZX_EdYYu16)e>A8OnF%G|=($Jf8O?u(U1^ z^Zx3Qw`Zx0>y0+tU2oq&yWfT}^qE=&SW!zk{<~9P(LIkM_OYzk{6xqP`o3tSGT9kA zk9|sRDE#`}Wb;MR5dubRzXoS@=L*HPeR=eS`VV;$81vq0sbkW%)qpIFM60 z-r0X^z^6PAqo1@tBjeugBt#(WFrTt&}hdTMAldJKJ{ z?}#)LqJz65_-}hQ>MPN7Gr=YzrwRe0V%^m5i7zkH*G9VZ5B$Y*)q9J5N46Cc5^TJ4ZB6-ZVQVu9BAPcXXTb-|)BG_CuZS zJV~fBy{WWn^#gh*{Vv1$Q-_;}pkhl6D$r)NN;nM5S)8nVlro|v#f725=Ez0OlQpyg zt~(worJh!WIXtRGi>C%R4_>=;`0J`f)BIn}*<(84+`rboJYK6d0nnT;2F1U28mN{%~!^qsbl?59z5@?u;-HX;hsQuFpgl1Pk zhp0+;#LtOPBOanuPPh}G7bv)`zHUPuoVl{0$p@5a8zjC4m3O?|E00Jrv>3*afS-#l zIoRARhyrmazmuU%4+Zy9KeFCLmawuh#w^so$KR?tp{Ot01YW7x@m*lX-SwLzIXIc_ z&s=8A(yB}mjW@tC&k_F9_Q#mo?B80xCy52n7a{ZjEL(^%j3hEDgTTzcWL>a|oMBgv zBPushYC-ePnlLDN37fwnCOgN&k741s6gpoZ^9X%%-lPTZ0=O5%32W-nG29Evg-7T$3| zCmTT=%bLs1%i~=A;m*+su#uHE-IZyMtT0_*4OEO%!N?oZh~Z`}P9mL~Nao&95vH;5 zIE9pJ^(!r8*RM6t+_1*Iiv()>sjmn=W>%Nyq{ut{2#3Pbr5hQCfTc4t;aAIRzPO`O zwmtuKzxQbg%3m^-jc)iTt1ERbtyzE{ASJ{7yk^s>yB~>jKC9;KMa1#2w1AVjP0qd{ zUdHS%1!mEvjfI`_kJ7?d<*Q75;h0}l1qndF?L+E#W6U@YI*(_NEz_pQ`v{40jsaC+=sFy?E9 zQ+#&XL^=HrA80wCnT%F!CwO-O^g@#w(hx?$e>Iq9BdwCI-CzJp- zt3^cI$|9FBdfxS!m)XRg_4_)9X=tuua~N2o+o!%{Z#Kydwx7$p4X%&79D(A`39DQG zZmeX8oP_?U9e!WeV(5FPj|z=SWU2UG9pN0^FF!~$U2I~NF&pLBTLW7`SCjfjw?r00 z(4&$O8jc`gJZr=jtjDL%x?1M>z4Lx7={_$1VHbbq#IdMDkBPugO9Hv>lg*($r7-L1 zU-ypsSQx<$`)ga0ncvts_FO!(=@-UYMy64OI?>L)twBS#-kY?V z5QugW^>0LBdBd^76_F#5%DlGZd?@kwd-07VQ1DSZwKdR@y7M>gkq4>_m<7POgKU!` z7bAKNCIQ<%&flyTX3hOnr7cNHvB?8#0mb*Lg3^Bx*(# zKGyyEqT=cmR=nsuKK@nkobS3Q+9cQT6DAWzpOJvAxb>>^*dja--I3vZLe<}b8o-pUM(88{Ps?C)XcF_!J`xX+~Ea{_>x8mnKFoeAHTo5AFNd0 z(O~p_(|RToXj}Gi8@DhuLCT zR)R4kuloO(cfa9cbOf_re6#dUFb zH_zw&R{j3is(Wj1-I_bo({sAd={Du&EtWE4ym1?h7sO=QwSxQ*O=3 z7XJn96kQ=Z#en5&co9ha?&gcm%J6k?!f%4D?=A*aS=TM3>nZuwl|asD@zuzL_VTl-h8spMSb1}2}f%x z;A_)_4lM^$2T>j3P}`qhcEK;qt6K>R&d%ha9<2c8%CrwTF@-kd;j;}{w$`NGb{>XJ zBBH-XE(sdj+cMfd099uKzgFRy+FI+?Vw6%$rMN9lc$h3A)JctTgFCE6PSK^1_dQjE zEZ&Eu;p*a{0ysa&;0v>6aqJFlWNF?fV=vtkCi>KzMV9g^C~)!TmYxxQ5pD@OtGM8v zkpXwsDQyXr;bsR2&4{Tjb?6&}9T#nw`HiyihN~Hk;NinD{FX}R7E?UA{d{A7UOkr_ z738cLjmxCN7B5*U8 zwz-5Rvw7F!WL(l|msisV)s!O9Pl#C_&%aUJ)qR8sUJ1&$25=MS@|V&KMuItM@NdjM zB%Bpl4bMO|9{4NGv)|jP&flF~IN4MDB?j+SA;?kUyjQ6tv&rDzUmRX8r{p7eK>PB& zdJbz>5?JYmRu*&4fpn9japH(B{K}J?L3v_|O6-YiZPBiaygn+m{H0Wqco>7>m>1FN z2vU%#7h4d77wSOR=3S0nr+Yn`7w(kQku?-y&Xt7THj}~T^Oo>^Z9tjHIEA*^-koB% z{wxc8I+tElSTws4Ep)-M!E3=_f@O;wv%h>BZL%rxw4?7xQiQmFs42~B8*R4j$6@pr zkN8Y{XYmwJ_eCE@#_{!eWKqVuDPD$#)BYTA#QPIV1@)2-q&fk2rX;Z*3rkaBr!`Gl z5f7ff1E9I#22YQ;zh@9H%|qxWNZFVEEG15~V>6T2^Xk9ua$8dJM%P)=yV+rPsChX}^k>e>fs7+;Xh@eE zlUs+gAT=50E`1O$;~6znf{LtR(G;L3ZXT9%4m-|<+m*9nXmc!t8L-O7VHzkkgMwh} zp{W>9{)UhatFF%c_rYLIE`RKx8vJBQU(H8Aupj4;bV$`PsrO;|nv03|sIfhylsEyJ zOT8`DvEL-cIr`p>6KOuF*m25~u0l^+``src)+&riB4rF)VR>e5hm!dy?P5~MyFH$V zTxTMrZ!sZW8W{!Ez8$ex^LU@El!fb<4C*wU^dJhqLf&k4X|}DRRC(7sZj}-J`uAaC zT2yWwZa1mH>h(pW0-jr7SnLJ_8bu zhWu?yV?efzOb{x!F{(4sW{sZja36U?h0K+P#hu18`$IV8CJ7Gx)=1(Fkpl>KyU zV0Y$BVz~T#j(Y@lw8g>&;zjwNBM<=S%~C1y^fnZR?Jd}JVbLcL{gNZgivW6baxG(o>(=@xLGAc@t^|K8ZYW9-r|p#Tzx8)a3d6DRPFUnQ+WE;`Rz*=8#(JG z6;Z?7qV~n7MlbykZa@FbzAYVd-#=yibh)m6LqGPjBWvp^yo6(uneLyrZip z0$@n;N1wt~oMy{EdTV3DvFia;{MU|+J3=6j;;~`NSD;zEuwTc1_FYh}tK*kn9Otce zezS$x@YW)4^+$3U#x>8K49ufGJZdg|{0+>dfkftl04YTY#V;hV;Z4g-r|>KtgqaU z^TjeMCfCbgpB81S7KhZ$6fgmxZH>8fR>(EAZp@}t^B04cPPBe}hjd>-{-agR?CmDu z;+X9Y-yJ>8*z?)xy_;O(IFVSSJZzTPjmfpI%q3YH6h8-ApCD|!CUBKsR36?34mj^} zQ|OL6M9SZoq6j}P_fngkO2ZMgrtC>08NZX>F)&Ck!IJ2huGWce8wvMpmP)2f+DGuq z=83@}yF)*zcn*aYWAhA5xPxCBx}TP*9Yij&`ve6J2KmQz4Uk5w z885E{rQ=ZiA=;6Q4OE(2kEuKJzZR5B8V2ZZC1tH4lHA@GCe^99NmCBmH53sY)n9k{ z#uM{B#QYw=9pOAkWLtiWn=WKUHc(Q}R@GxMsgj!f6*2_J9kN#L5cwT}QQpHmPUo@g z!^E3Ff}+u)U!wEyJ#@~yn+SV~mRXU%8|eJ{-y&s@N>~CoCRbyW1Uod%80IBrN)W5u zO&D~S9f!Shc}|w%E(!;xM;G*Qo+}3GjViofXdkYAonQKe?UUP$xmQTi1N~zm04Qh5 zv;osu$?L_%{7Pk6R!rF6u7cH9+$$bY?^h?K66o1+%%FyL6HXyZigBN<`krTQ1cQ zOPB^PM5HAtNf~$?q#6jrYW{b1lZEM_2?(=h5-E29js-W=P{DjXAD?np6; zm_a93=hYz#C#E6$00#Q}xqcZ!Pw*G$F!1NO>Ag4q#StCQPMBTr*IJ+h=c4yVAhD+K z>Mfq><1*=cqR`!DboVXV_Pi8*zTPptfmRYcas}}Ykx!&y#BZ{`pcGt__GBKe-ZAgT zTP#r5@S)MeqFh(IB0Y*}l22b;!E0-Hl*S03rdf()fQDR1ch{I^*nP{0+kc)MHsL(V zWwLhHG!R-wj(UK;K~Bl�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 literal 0 HcmV?d00001 diff --git a/kubernetes/k3s-chartdb.md b/kubernetes/k3s-chartdb.md new file mode 100644 index 0000000..2b09dc1 --- /dev/null +++ b/kubernetes/k3s-chartdb.md @@ -0,0 +1,125 @@ +# Под с ChartDB + +ChatBD ([chartdb.io](https://chartdb.io/)) - это визуальный редактор структуры базы данных и инструмент проектирования +схем (ER-диаграмм), мини-конструктор для работы с локальной псевдо-БД. Все это доступно в веб-интерфейсе. Пока ChatBD +не позволяет подключаться к реальным базам данных, но в будущем планируется поддержка. Зато в нее можно импортировать +схемы рабочих баз данных из PostgreSQL, MySQL, MariaDB, SQLite, MSSQL, ClickHouse и CockroachDB. Так же поддерживается +экспорт из JSON и DBML. Импорт готовых схем возможен в любую из поддерживаемых СУБД (плюс JSON и DBML). + +Можно работать с таблицами, колонками, индексами, ключами... и здесь нет аутентификации, но при этом нельзя +одновременно работать нескольким пользователем в режиме "живой доски" (live board). Но самое печальное, в нем нет +никаких инструментов для создания запросов. + +_Из интересных фишек ChatDB -- к нему можно подключить LLM (через API OpenAI или локальный Ollama) и тогда он, +похоже, сможет генерировать SQL-запросы по текстовым описаниям. Но это я пока пока не проверил (ждите обновления этой +инструкции)._ + +Манифест для развертывания пода с ChartDB в k3s, который предоставляет веб-интерфейс по адресу `http://chartdb.local`: +```yaml +# ~/k3s/chartdb/chartdb.yaml +# Все манифесты для ChartDB + +# 1. Манифест создания пространства имён `chartdb`. Если оно уже есть — kubectl apply ничего не изменит +apiVersion: v1 +kind: Namespace +metadata: + name: chartdb + +--- +# 2. Манифест PVC (Longhorn) -- том в блочном хранилище, в котором будут храниться данные ChartDB. +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: chartdb-data + namespace: chartdb +spec: + accessModes: + - ReadWriteOnce + storageClassName: longhorn + resources: + requests: + storage: 720Mi + +--- +# 3. Deployment: развёртывание ChartDB +apiVersion: apps/v1 +kind: Deployment +metadata: + name: chartdb + namespace: chartdb +spec: + replicas: 1 + selector: + matchLabels: + app: chartdb + template: + metadata: + labels: + app: chartdb + spec: + containers: + - name: chartdb + image: ghcr.io/chartdb/chartdb:latest + ports: + - containerPort: 80 + env: + - name: TZ # Часовой пояс, который будет в поде + value: Europe/Moscow + resources: + requests: + memory: "128Mi" + cpu: "100m" + limits: + memory: "512Mi" + cpu: "500m" + volumeMounts: # Монтируем том: + - name: chartdb-storage # ... имя PVC-тома + mountPath: /data # ...путь внутри контейнера, куда будет смонтирован PVC-том + volumes: # Используемые том: + - name: chartdb-storage # ... c именем + persistentVolumeClaim: # ... PVC (Longhorn) + claimName: chartdb-data + +--- +# 4. Service: внутренний доступ к контейнеру ChartDB +apiVersion: v1 +kind: Service +metadata: + name: chartdb + namespace: chartdb +spec: + selector: + app: chartdb + ports: + - port: 80 + targetPort: 80 + type: ClusterIP + +--- +# 5. IngressRoute для Traefik (под твою конфигурацию) +# Это публикует ChartDB по адресу http://chartdb.local (заменить на свой домен) +apiVersion: traefik.io/v1alpha1 +kind: IngressRoute +metadata: + name: chartdb + namespace: chartdb +spec: + entryPoints: + - web # это должен быть один из entrypoints в Traefik (обычно "web" = порт 80) + routes: + - match: Host("chartdb.local") # доменное имя, по которому будет доступен сервис + kind: Rule + services: + - name: chartdb + port: 80 +``` + +Применим манифесты командой: +```shell +kubectl apply -f ~/k3s/chartdb/chartdb.yaml +``` + +После этого ChartDB будет доступен по адресу `http://chartdb.local`. и в нем можно будет создавать и редактировать +схемы, например: + +![k3s--chartdb-ui.png](../images/k3s--chartdb-ui.png)