From d7e05406b730420bc9615eb14973df5c07cbbd5f Mon Sep 17 00:00:00 2001 From: moonrailgun Date: Mon, 15 May 2023 14:54:41 +0800 Subject: [PATCH] feat: add tailchat (#89) Co-authored-by: zhengkunwang223 <31820853+zhengkunwang223@users.noreply.github.com> --- apps/list.json | 28 ++- apps/tailchat/metadata/logo.png | Bin 0 -> 7381 bytes apps/tailchat/versions/1.7.3/README.md | 53 ++++++ apps/tailchat/versions/1.7.3/config.json | 175 ++++++++++++++++++ .../versions/1.7.3/docker-compose.yml | 31 ++++ 5 files changed, 280 insertions(+), 7 deletions(-) create mode 100644 apps/tailchat/metadata/logo.png create mode 100644 apps/tailchat/versions/1.7.3/README.md create mode 100644 apps/tailchat/versions/1.7.3/config.json create mode 100644 apps/tailchat/versions/1.7.3/docker-compose.yml diff --git a/apps/list.json b/apps/list.json index ae554fd9a..21f0184bf 100644 --- a/apps/list.json +++ b/apps/list.json @@ -260,7 +260,7 @@ "github": "https://github.com/requarks/wiki", "document": "https://docs.requarks.io/" }, - { + { "key": "uptime-kuma", "name": "Uptime Kuma", "tags": ["Tool"], @@ -333,7 +333,7 @@ "github": "https://github.com/php/php-src", "document": "https://www.php.net/docs.php" }, - { + { "key": "gitea", "name": "Gitea", "tags": ["CI/CD"], @@ -347,7 +347,7 @@ "github": "https://github.com/go-gitea/gitea", "document": "https://docs.gitea.io/" }, - { + { "key": "qBittorrent", "name": "qBittorrent", "tags": ["Tool"], @@ -361,7 +361,7 @@ "github": "https://github.com/qbittorrent/qBittorrent", "document": "http://wiki.qbittorrent.org/" }, - { + { "key": "jellyfin", "name": "Jellyfin", "tags": ["Tool"], @@ -375,7 +375,7 @@ "github": "https://github.com/jellyfin/jellyfin", "document": "https://jellyfin.org/docs/" }, - { + { "key": "alist", "name": "alist", "tags": ["Tool"], @@ -389,7 +389,7 @@ "github": "https://github.com/alist-org/alist", "document": "https://alist.nn.ci/zh/" }, - { + { "key": "watchtower", "name": "watchtower", "tags": ["Tool"], @@ -403,7 +403,7 @@ "github": "https://github.com/containrrr/watchtower", "document": "https://containrrr.dev/watchtower/" }, - { + { "key": "flarum", "name": "flarum", "tags": ["WebSite"], @@ -431,6 +431,20 @@ "github": "https://github.com/xiahao90/adminer", "document": "https://github.com/xiahao90/adminer" }, + { + "key": "tailchat", + "name": "Tailchat", + "tags": ["WebSite"], + "versions": ["1.7.3"], + "shortDescZh": "在你自己工作区的下一代noIM应用", + "shortDescEn": "The next-generation noIM Application in your own workspace", + "type": "website", + "limit": 1, + "crossVersionUpdate": true, + "website": "https://tailchat.msgbyte.com/", + "github": "https://github.com/msgbyte/tailchat", + "document": "https://tailchat.msgbyte.com/docs/intro" + }, { "key": "nps", "name": "nps", diff --git a/apps/tailchat/metadata/logo.png b/apps/tailchat/metadata/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..55c5ab6c1cba9390ae36360503b3a57f29c67e1d GIT binary patch literal 7381 zcmV;`94h09P)KQdK57TAQ@s!5n7*{ubKCXPSNq4%xecrj}oO>>jAr!7(zn8iwuUi!UC@1aeZiL==$eZuHf`C zj}#dUafHR&GB!4Led!N>bp5Bd-*p}5%po!a&iBX=2C1>Jar@-Tl@a>w(c?JX$)c_! zL!cNzN5H95FVckzJvcpKT#sNef)0n#>>KtxzL&SxRlP^$H(^f=1x=Tt*`pDp$5=uBodhj7tsE~w+8+ah}mX^0epkU6N zQYtMiwa;A+=;PomW#Y_G%f_8E6>1XMv6B}+}QGFzZ#m8no^s-A~H8wsl ztuI^*U0tu*@oA=!48Aae&H|RV0iqolu`M!6KKa;o^3;ndm0|`Ev$#q$o4B+;k}l}a za@`0Q1mf-L>b6*9bq5bVLl{B37`fmNj!cQ~BtyX%3q1v}#HhFUyT4y)i!3Z)rO%$V zed%U06pRtHh9C^cq)d%R;TS<{2wWaf<6+#60!h4}%gPpzjtuk<;IN7e1(9??XGl|q zoUCKY#H0%&@fI327dkRB5gs(*y8=kOg_Z?Gy5TA}HG(dHqzl?!8YOBt3^RbF3wjV= z7HB##G!#yv1uaTNN0(NVlVN6H;?QiRt812%ZY-E^gGR~V86#+-w`!`ZNjF@R)eIRt zV+2jq2k~IVh)&cv&nLrfk+IMPka$6h; zCXFznu+V48P!LAY4sGmqjBeVrk#t~N(^eedZgi5NAdH~Nc01swcGuV6AGwvT<0}QO z7EB8n3dRU}f)-e5VI3m@u13=~`|&%Bb@s=M5i}OE7PH-hNU|KR-*i7(2~gPJ%FxmA zJCw6#_}f-8_#*awImBX8OrFx$u3e+qvuBU8IBzDOV72#^D=tz4T z#0=MGS-xgBhN+ne7WxDWIsNdC9rVnB1Ngq!8sfDOR{N1Q3Iq7eosMNjU5OEMk;Gci zq9IJ(-aUKhp8N*zIzvWXhUYmPizG(_9toS zJaNJnGl0t>@a=K{k!)FeTkY!6S6(?yDvOsyiu+@e5e$Y{3R<`nhXz^5C!c@*#_cXa z7Yz#xR&yC9X%O{OPd%YBJ?{I8Vwg-^Ep#)B*Lv3RnUw(-fX6~U-ORD!41C=;&Y!cz zecNrT1Br%oIsNSF%-X?Vh+ULJyz!UeYPhYlGm(KUbT<&=FgWmLGW#UQp`x^coiMCMIIj? z--jM~(*ZXH4bRyH!E<_u48Dkspyl=va5dQF$b0{}6T+o0g_r@mBe39f=iPVHid%2R zO&K07UW6_BM7NM*@jVGoKJOp?P5wZ}CQiHWery*`*NP~Mp+Mp!=)BgsP+-ODw`{S+ zO?mcM5lNhuS6+IFzTuQOevhf+`*+jy&%2QiC$K{RCXe|z(td~|D7CQu3ytehII#%Z z2~k+n`ObcTrN;*ZX>&fe$Z2qH<#>Es%!sTUYi}nUFF9FBFPqP2r~t5wfawqIpSZ-K z_px>MYWB zq!_UgXxdn5Z|H2HvGJvh_iD#%$3kaFF{soN8weRI?E#$yZ7+Hi@m{TP)rn+0+}*;L z@gf%78Y}G`odsQ~t970`A!skDX*)Sm%nEYXHgCpC=Rs#dr@ql}G6-fD*6KDD#Qxwe zE8RebDbYI0p<{FdELyx6hf$BkLsk%ic3J5bGE9kS1?GdrOP1g;=<)8ij9(k0AP`pC zVk>P@;!~irpg&vW2uC}F51sLN_p0HcixdQ~(qd8VK2x}q8=VC`n7!&m2Owr)q4O5t z3(=*9F9suMfMg3f6HQ~KbD*`LpzKjImLrdJ{rDXUH+6r236|rLF zO413jQl-P=gwPhW*ta_{F7%+X)$ZZ9h76O?eNuS%&U@~WS-Hrmtg4bp6|d|4s)BSk zB(8{uaXYfmUC?c4k1MQVlzb-_Hk&@0jY1-o;{Je9#1%{%?sJc$M&BG9M?bz zVshAELUjZMYlG9fRXh>Z3ZTru=pY@*g=k%GvuFD zVffFItj08LNpA8Ow}$5yAL_icHh_=4E=TKKhhD(25X-X(@=nrl2VW$^Y17NZzCVauh^}JzMzNsuo%E$YTtFwv{N*pXSCW0w1t_E;5 zfl<~ObQ;nK*IfxIp^^(R8BJ`GMQcIJi6EjHUK^gf!f_c2pEdpc(OGBEPWXl@S%Q>uc z_jCxiBasVeb+*t2Tjz*bHP9b!GG!`6^_`VOKUzyc`?bzsZUoI~gu7v#?Ru4Tz!hal z+tGgi)6T?bM5IR}tqOCJ^8xpauF;NK?T`Y7U)>(4N+1t<}h3M{X0M}L+7A1tp1s$Yy zmWYX=YTr?7cLRuh!a-sthB{d2K&>+nyU(h=)N1W+07N;GmNAS}&?>AmaP2^=kNb+of581kgVz-h=;q8M540L`&3$I;A*#KQ%IPh2jGI=ZcDQoJP^OG7`eH&=6Hh zWvDI}VlS4U{Aer6MvR3b#0-puRzSlbTW6J_x?G4WLQsCRMKPkT&h7?=oeV% zZKZ?}hJ{WCvGZ#&z(R}gU7Gw8cE4%gY-`$z1FUnR+zk+hphJy4PlfnE`ECLpm+gjs zP*#>$>kO0%T5fX|rFE7B6uui36D@5yapFI5NThWJsx5RHUo^7NpppDDS~_PA=}J@6 z&t+tzmJ*6`K_ih8b}}Uw@S(*AD^30xEGwH&I7OHwy~I7D8VQbv|Qbxlb}C#>Z6MZ-wooDK1ZXXd5F1# z{pQlrQoPWKoCvy6X`$_sO;^*G$Z>`5{3coY@TIzDIqAUKwQJmBu8m71MkUGxE!uKv z!|P5{n+EcM@J%z-)zuUw{5NnkgoxgpUg}m8_c>4T8ZpMMQj`73h5a(|Vyq9d<- zpA;YplC<-mC2%{|ZP;MD9e#uX%ZUGR_hY*n(3wa@pAM9NHt|)Urg}MC3w(&$$qCCD z_hK4US!g@Gd~ICM1*HKMEA3?0qw7d}n=QPc5n|5p=@uTa$Sp?9`B5ck3tx1#&_JZZ zeYqU~;^MKEPg|R|{hZ!7e=blLWT~?r@Gw6{hY_-OlnGjgboX?K)iYMHh5I5iw~!Mq zod=$Jg5Lk1cjzfTA{C8@1bpDKva*7rA{FK3vg1)=)&d5F5+9l%=!p$5wd50?u)^(_ zJ$rT|f7?PuAmY=F{NZR}A@1a`9;esum3zFD;LGi|-%Vp4U9i$QH^gr&bAhO`(6^B0 zK+K;6yw(uH=CPBJVv>bk-`4ShCvG=la);sq@_ltRpjYD678Dm$cUGD+$5-vNGM|1Xqe{?&vtzVbjjLEG z$PI=h8KkibNqx)BGWi2Wg@F4PGG-#GQr}-MTC#-V1hR&e%a*12H0YvvJ6Zuzdrhv0 z?Tmp%Q@AWyf-Diol=vM>oZm9V^Z5*am;Z*$MB0B0_1AGnm7oU~FJ9aLw<8YmXmH69 zbR`9kEt-m@<N_AZkV;1^|d#mbebxCr_i z=Sre#B9^JBD7U=c8HG$3?55y%R+E#-Y(VlyW;g$LaFE{N$?TUtsv70rzcC5RFk`AaHfUW=`i{dyVc}zaC>BKL;#+sEwPoRvCxx!Y7|E zXA}n%`}%_@+Rqp1fN;<}1|3Ap%m11_`tZZlBhAfJ$JP^uLG{%R!p7rl+^~VJUcGAZ zO`q~;VNsU^5fyPoSV~-jf<&31#p2UU!{*IoaOM={6Wgp!0xb%#!sYzyuhElFw9;Sx z#rFt8{soUHTs8cwQV=i=PF8N|yt4vW4C^ zmo2sK_0g_GP~b&Da!yfGU7Z>j_(0yuLN29^EM&Aqz~iGa&%Zx?P@9P~+z^B_f4O^i z9sBc$qIh;evLZ6b!tNk3k%c>jQTBrcXwcrww__FkLqWJUss)XhZgbO)9jU#0_D~#9 zxFEH=x@LJp$?+1qMZuai_u8HIG5Ldke1<1yI-KhwCyYJhLDWLbu*MK8 z<^iex{sHRg?W69lS0}~eab?>5*sh&?`ZboY6)S4x-abD`JlR7J@7SSr2(O-9qlPV8 zu#)>`3J~$;;&sL(>qI|W=<4NvYy0eHUVfR*oIV|kSUu)LENWs=BaDcyOU2fCl3cJCrIMvY+oA|sNi26BpL(q?ezg;V>sY}QfIYLguB0v4iuW5MrV&1=t zEb5zYoWrrT*#6dGRogwpFUDy7mMx?!B7;_xb;z3h;L6m)-}kUv(aaO9)PoN^5ZOd8 z2;dSu`>S8!6h84ou9^`1zrW$}>E~Cjq#HN?6K&q|&z{5#;C7un`2tRxi;a4y_MvUW zq^Nb>`t^s92tY7jH!yJ}ADg_ptP@Dn#N@}e#%I~Ba1}o($L)iP|H*!AkvJ;4C<#6_ z-amdXAz)Z)Tz&S9jg6&FoqCZl#(b=aXF^4&Mfod9WaxfDo4zxVFD;rPZZUOb6KoWicGs=ATRp37Go{-3_1T%O#O;I+pj z6uTMt756E2JMO&uZal_^_@Ch?A3OdZMb&Y;+B{ek2SEe$tl$@*a{qw?X-pD7(WE;m z1R>~~=1q22w555V?^m5nN2|=_O?nb6;#vFwT(M#WaVFMIT)D(MD8~QMgeY*dc-+K- zui~+a#fZ*UC6DlXP-sISxMsU{@1|L^X3_ia_opD_=_Y($DV<0<71fI*^qi(xjEZ)h zRmXVNtb_X@CWJVBh{xA7*+R%NOj*%}f+1T7@3DZx5HWy|VTBQmfh86q?&I;cI1YM^ z5b*Pd4-A)KA!5xZd6JsXTBE+bp|O$fF%YA!LANmhFcR zVIeU-oJDUK8hII&ctPQUSZK}F$rd{fZNyaJ783kaDdcQF_0e6wpoWG`IBgZfcd4g* z4_MUJadrcL#C|zGNGgSl`jxGmP(j+CfzNhd5LJ%a)CCG_-OMklT|=ETVP^~3Yldwb z4b9LRVoa zTF6zrt_Cl>__Dc~&uZ%_#+eaXFJ;)aO-M8Pi*Ux(O7LJQn|JhR2qY zkhY9R+fi?efr;Lo9D2h0}1VO#k4zwV_s-|Qh>krO_bpN#+a;gaB2&3k`NG=mWn z%Dp_&5H^XTT1o_-9rdL1N&5_|d%%fE|Axjc1=(r(W5S}oWym_IQUU=a}J3*pi zvYTVV*GEn~IYSy_1RXP65gglPVppW(LQgOC@VLn0mg(z4MGgVW3}bEWYP)9$yB1na z_`F~Q9b?4GlS%Udw%8?T$2&YUOc($3C%bvNTa^cON^jr2(HX&B~2_B^V%LbLyjf3C%L-271QzmX5whx$fS-R00000NkvXX Hu0mjfpzIp; literal 0 HcmV?d00001 diff --git a/apps/tailchat/versions/1.7.3/README.md b/apps/tailchat/versions/1.7.3/README.md new file mode 100644 index 000000000..cce59ca0c --- /dev/null +++ b/apps/tailchat/versions/1.7.3/README.md @@ -0,0 +1,53 @@ +# 关于 1panel 安装 + +本应用不包含开放平台OAuth相关能力与Admin管理平台 + +如需要相关能力需要另行安装. + +# 本应用介绍 + +官方网站: [https://tailchat.msgbyte.com/](https://tailchat.msgbyte.com/) + +Github: [https://github.com/msgbyte/tailchat](https://github.com/msgbyte/tailchat) + +![tailchat](https://socialify.git.ci/msgbyte/tailchat/image?description=1&font=Inter&forks=1&issues=1&language=1&logo=https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F86033898%3Fs%3D200%26v%3D4&name=1&owner=1&pattern=Circuit%20Board&stargazers=1&theme=Light) + + +## 在您自己工作区中的下一代 noIM 应用程序 + +### 不仅仅是另一个 `Slack`, `Discord`, `Rocket.Chat`.... + +如果您对`noIM`的概念感兴趣,欢迎阅读我的博客: +- [是时候正式步入noIM的时代了](https://tailchat.msgbyte.com/zh-Hans/blog/2023/03/01/the-era-of-noIM) + +官方文档: [https://tailchat.msgbyte.com/](https://tailchat.msgbyte.com/) + +**Nightly版** 在线体验: [https://nightly.paw.msgbyte.com/](https://nightly.paw.msgbyte.com/) + +> Nightly版 为自动编译版本, 即每次提交代码都会自动编译。 +> 不保证数据的可靠性与稳定性 + +## 动机 + +目前现有的IM应用都仅仅把目光局限在聊天本身,而IM天然作为一个多人协作方式,在我看来应当能够承担更多的职责,将外部的应用以IM为转发方式形成自己独特的工作流。 + +因此,我提出了 `noIM` 的观点,意味着 **Not only IM**。而是设计了以IM为中心,第三方应用为增强功能,中间以插件系统作为胶水连接层的个人/团队高度自定义的应用平台。 + +为此,将功能进行抽象,并且花费了大量时间设计底层的机制,诞生了 `Tailchat` 这样的一个从底层设计之初就为了拓展而存在的即时通讯应用。通过`Tailchat`的插件系统,开发者可以很轻松的将喜欢的应用以一种非常自然的方式作为`Tailchat`的一部分。与传统的类似如`Slack`的集成方式不同的是,`Tailchat`的集成更加自由,就仿佛天然就是一个原生的功能一般。 + +## 特性 + +- 注重隐私,只有被邀请的成员才能加入群组 +- 防止陌生人,只有通过昵称+一串随机的数字才能添加好友 +- 二维的群组空间,通过频道来分割不同的话题 +- 高度自定义的群组空间, 通过分组和拖拽来创建独创的群组空间。同时可以通过更多的插件来增加更多的能力 +- 可以严谨,也可以乐趣。通过插件的组合可以创造用于不同场景的 Tailchat。可以是面向娱乐,也可以是面向企业 +- 后端微服务架构,已经为大规模部署做好了准备。不用担心用户量大了以后怎么办 + +## 性能与拓展 + +`Tailchat` 是一个基于 **React** + **Typescript** 的现代开源 noIM 应用程序 + +前端微内核架构+后端微服务架构,`Tailchat` 已经为集群化部署做好了准备。 + +前端通过插件机制为应用赋能,对于 `Tailchat` 的二次开发来说非常简单且易用。 diff --git a/apps/tailchat/versions/1.7.3/config.json b/apps/tailchat/versions/1.7.3/config.json new file mode 100644 index 000000000..9f020e7a2 --- /dev/null +++ b/apps/tailchat/versions/1.7.3/config.json @@ -0,0 +1,175 @@ +{ + "formFields": [ + { + "type": "number", + "labelZh": "端口", + "labelEn": "Port", + "required": true, + "default": 11000, + "rule": "paramPort", + "envKey": "PANEL_APP_PORT_HTTP", + "edit": true + }, + { + "type": "service", + "key": "redis", + "labelZh": "缓存服务服务", + "labelEn": "Redis Service", + "required": true, + "default": "", + "envKey": "REDIS_HOST", + "edit": true + }, + { + "type": "number", + "labelZh": "缓存服务服务端口", + "labelEn": "Redis Service Port", + "required": true, + "default": "6379", + "envKey": "REDIS_PORT", + "rule": "paramPort", + "edit": true + }, + { + "type": "password", + "labelZh": "缓存服务服务密码", + "labelEn": "Redis Service Password", + "required": true, + "default": "", + "rule": "paramCommon", + "envKey": "REDIS_PASS", + "edit": true + }, + { + "type": "service", + "key": "mongodb", + "labelZh": "数据库服务", + "labelEn": "Database Service", + "required": true, + "default": "", + "envKey": "MONGO_HOST", + "edit": true + }, + { + "type": "number", + "labelZh": "数据库服务端口", + "labelEn": "Database Service Port", + "required": true, + "default": "27017", + "envKey": "MONGO_PORT", + "rule": "paramPort", + "edit": true + }, + { + "type": "text", + "labelZh": "数据库名", + "labelEn": "Database Name", + "required": true, + "default": "tailchat", + "rule": "paramCommon", + "envKey": "MONGO_DB", + "edit": true + }, + { + "type": "text", + "labelZh": "数据库用户名", + "labelEn": "Database User Name", + "required": true, + "default": "", + "rule": "paramCommon", + "envKey": "MONGO_USER", + "edit": true + }, + { + "type": "password", + "labelZh": "数据库密码", + "labelEn": "Database User Password", + "required": true, + "default": "", + "rule": "paramCommon", + "envKey": "MONGO_PASS", + "edit": true + }, + { + "type": "service", + "key": "minio", + "labelZh": "文件存储服务", + "labelEn": "Storage Service", + "required": true, + "default": "", + "envKey": "MINIO_HOST", + "edit": true + }, + { + "type": "number", + "labelZh": "文件存储服务API端口", + "labelEn": "Storage Service Port", + "required": true, + "default": "9001", + "envKey": "MINIO_PORT", + "rule": "paramPort", + "edit": true + }, + { + "type": "text", + "labelZh": "文件存储服务用户名", + "labelEn": "User", + "required": true, + "default": "", + "rule": "paramCommon", + "envKey": "MINIO_USER", + "edit": true + }, + { + "type": "password", + "labelZh": "文件存储服务密码", + "labelEn": "User", + "required": true, + "default": "", + "rule": "paramComplexity", + "envKey": "MINIO_PASS", + "edit": true + }, + { + "type": "text", + "labelZh": "秘钥", + "labelEn": "Secret", + "required": true, + "default": "any-random-text", + "random": true, + "rule": "paramExtUrl", + "envKey": "SECRET", + "edit": true + }, + { + "type": "text", + "labelZh": "外部访问地址", + "labelEn": "External URL", + "required": true, + "default": "http://localhost:11000", + "rule": "paramExtUrl", + "envKey": "API_URL", + "edit": true + }, + { + "type": "text", + "labelZh": "邮件服务发送人", + "labelEn": "SMTP Sender", + "required": false, + "default": "", + "rule": "paramExtUrl", + "envKey": "SMTP_SENDER", + "edit": true + }, + { + "type": "text", + "labelZh": "邮件服务URI", + "labelEn": "SMTP Sender", + "required": false, + "default": "", + "rule": "paramExtUrl", + "envKey": "SMTP_URI", + "edit": true + } + ] +} diff --git a/apps/tailchat/versions/1.7.3/docker-compose.yml b/apps/tailchat/versions/1.7.3/docker-compose.yml new file mode 100644 index 000000000..32a8d368a --- /dev/null +++ b/apps/tailchat/versions/1.7.3/docker-compose.yml @@ -0,0 +1,31 @@ +version: "3" +services: + tailchat: + container_name: ${CONTAINER_NAME} + restart: unless-stopped + image: "moonrailgun/tailchat:1.7.3" + networks: + - 1panel-network + environment: + - SERVICEDIR=services,plugins + - LOGGER=true + - LOGLEVEL=info + - PORT=11000 + - REDIS_URL=redis://:${REDIS_PASS}@${REDIS_HOST}:${REDIS_PORT} + - TRANSPORTER=redis://:${REDIS_PASS}@${REDIS_HOST}:${REDIS_PORT} + - MONGO_URL=mongodb://${MONGO_USER}:${MONGO_PASS}@${MONGO_HOST}:${MONGO_PORT}/${MONGO_DB}?authSource=admin + - MINIO_URL=${MINIO_HOST}:${MINIO_PORT} + - MINIO_USER=${MINIO_USER} + - MINIO_PASS=${MINIO_PASS} + - SMTP_SENDER=${SMTP_SENDER} + - SMTP_URI=${SMTP_URI} + - SECRET=${SECRET} + - API_URL=${API_URL} + ports: + - "${PANEL_APP_PORT_HTTP}:11000" + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true