From e1a2288762bd07814ee02ae25192ed9aac28fc73 Mon Sep 17 00:00:00 2001 From: Meng Sen Date: Thu, 10 Oct 2024 11:36:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=BA=94=E7=94=A8=20?= =?UTF-8?q?=E6=82=9F=E7=A9=BAIM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Meng Sen --- README.md | 1 + apps/wukongim/1.2.6/data.yml | 47 ++++++++++ apps/wukongim/1.2.6/docker-compose.yml | 26 ++++++ apps/wukongim/1.2.6/scripts/init.sh | 15 ++++ apps/wukongim/1.2.6/scripts/uninstall.sh | 10 +++ apps/wukongim/1.2.6/scripts/upgrade.sh | 15 ++++ apps/wukongim/README.md | 105 +++++++++++++++++++++++ apps/wukongim/data.yml | 15 ++++ apps/wukongim/logo.png | Bin 0 -> 26517 bytes 9 files changed, 234 insertions(+) create mode 100644 apps/wukongim/1.2.6/data.yml create mode 100644 apps/wukongim/1.2.6/docker-compose.yml create mode 100644 apps/wukongim/1.2.6/scripts/init.sh create mode 100644 apps/wukongim/1.2.6/scripts/uninstall.sh create mode 100644 apps/wukongim/1.2.6/scripts/upgrade.sh create mode 100644 apps/wukongim/README.md create mode 100644 apps/wukongim/data.yml create mode 100644 apps/wukongim/logo.png diff --git a/README.md b/README.md index 1c9829d2d..91bbf0522 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,7 @@ | 🟢 | | Uptime Kuma | https://uptime.kuma.pet/ | 自托管监控工具 | | | 🟢 | | Umami | https://umami.is/ | 为速度和效率而构建的网站分析 | | | 🟢 | | WiseFlow | https://github.com/TeamWiseFlow/wiseflow/ | Wiseflow 首席情报官 | | +| 🟢 | | 悟空IM | https://githubim.com/ | 让信息传递更简单 | | | 🟢 | | 迅雷 NAS版 | https://github.com/cnk3x/xunlei/ | 迅雷远程下载服务 NAS移植版 | | | 🔴 | | Yarr | https://github.com/nkanaev/yarr | Rss 阅读器 | | | 🔴 | | Ztncui | https://www.zerotier.com/ | 【自建服务端】ZeroTier 可让您构建几乎任何类型的现代化安全多点虚拟化网络 | | diff --git a/apps/wukongim/1.2.6/data.yml b/apps/wukongim/1.2.6/data.yml new file mode 100644 index 000000000..201cda9d4 --- /dev/null +++ b/apps/wukongim/1.2.6/data.yml @@ -0,0 +1,47 @@ +additionalProperties: + formFields: + - default: "/home/wukongim" + edit: true + envKey: WUKONGIM_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 5300 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: 5001 + envKey: PANEL_APP_PORT_WK_API + labelZh: API 端口 + labelEn: API port + required: true + type: number + - default: 5100 + envKey: PANEL_APP_PORT_WK_TCP + labelZh: TCP端口 + labelEn: Tcp port + required: true + type: number + - default: 5200 + envKey: PANEL_APP_PORT_WK_WS + labelZh: WebSocket 端口 + labelEn: WebSocket port + required: true + type: number + - default: 5172 + envKey: PANEL_APP_PORT_WK_DEMO_SERVER + labelZh: 悟空IM演示端口 + labelEn: WuKongIM demo port + required: true + type: number + - default: "127.0.0.1" + envKey: WK_EXTERNAL_IP + labelZh: 服务器IP + labelEn: Server IP + required: true + type: text diff --git a/apps/wukongim/1.2.6/docker-compose.yml b/apps/wukongim/1.2.6/docker-compose.yml new file mode 100644 index 000000000..f4f111213 --- /dev/null +++ b/apps/wukongim/1.2.6/docker-compose.yml @@ -0,0 +1,26 @@ +networks: + 1panel-network: + external: true + +services: + wukongim: + image: wukongim/wukongim:v1.2.6 + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + restart: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:5300 + - ${PANEL_APP_PORT_WK_API}:5001 + - ${PANEL_APP_PORT_WK_TCP}:5100 + - ${PANEL_APP_PORT_WK_WS}:5200 + - ${PANEL_APP_PORT_WK_DEMO_SERVER}:5172 + env_file: + - /etc/1panel/envs/global.env + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${WUKONGIM_ROOT_PATH}/wukongim:/root/wukongim + environment: + - WK_MODE=release diff --git a/apps/wukongim/1.2.6/scripts/init.sh b/apps/wukongim/1.2.6/scripts/init.sh new file mode 100644 index 000000000..77b849120 --- /dev/null +++ b/apps/wukongim/1.2.6/scripts/init.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/wukongim/1.2.6/scripts/uninstall.sh b/apps/wukongim/1.2.6/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/wukongim/1.2.6/scripts/uninstall.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/wukongim/1.2.6/scripts/upgrade.sh b/apps/wukongim/1.2.6/scripts/upgrade.sh new file mode 100644 index 000000000..77b849120 --- /dev/null +++ b/apps/wukongim/1.2.6/scripts/upgrade.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/wukongim/README.md b/apps/wukongim/README.md new file mode 100644 index 000000000..f02164bba --- /dev/null +++ b/apps/wukongim/README.md @@ -0,0 +1,105 @@ +# WuKongIM 悟空IM + +高性能通用分布式通讯服务,支持聊天应用,消息推送,物联网通讯,音视频信令,直播弹幕,客服系统,AI 通讯,即时社区等场景。 + +![WuKongIM](https://file.lifebus.top/imgs/wukongim_cover.jpg) + +![](https://img.shields.io/badge/%E6%96%B0%E7%96%86%E8%90%8C%E6%A3%AE%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E5%AE%A4-%E6%8F%90%E4%BE%9B%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81-blue) + +## 特性 + +🎦独特性 + +群成员无上限,轻松支持10万人群聊,消息可永久存储。 + +📚资源消耗低 + +自研二进制协议,心跳包只有1字节,省流量,省电量,传输更迅速。 + +🔐安全性 + +消息通道和消息内容全程加密,防中间人攻击和窜改消息内容,服务端数据实时备份,数据不丢失。 + +🚀 性能 + +基于pebble kv数据库,研发了针对于IM这种服务的特有分布式数据库,省了其他数据库为了通用性而带来的性能损耗, 因为存储快,所以消息快。 + +🔥高可用 + +通过魔改raft分布式协议,实现了自动容灾,一台机器宕机,另一台机器自动接管,对外无感知。 + +去中心化,无单点,无中心节点,每个节点都是独立且平等的,都可以提供服务。 + +扩容方便,只需增加机器,不需要停机,不需要迁移数据,自动按策略分配数据。 + +🕹️ 易用性 + +不依赖任何第三方中间件,部署简单,一条命令即可启动。 + +采用频道订阅发布的设计理念,容易理解,容易上手。 + +与Redis一样简单,Kafka一样高性能,MySQL一样可靠 + +🌲技术支持 + +官方团队提供技术支持,提供技术文档,提供技术交流群,提供issue反馈。 + +## 适用场景 + +### 即时通讯 + ++ 群频道支持 ++ 个人频道支持 ++ 消息永久存储 ++ 离线消息推送支持 ++ 最近会话维护 + +### 消息推送/站内消息 + ++ 群频道支持 ++ 个人频道支持 ++ 离线消息推送支持 + +### 客服系统 + ++ 客服频道支持 + ++ 消息支持投递给第三方服务器 + ++ 第三方服务器可决定分配指定的订阅者成组投递 + +(整体逻辑: 创建频道 -> 发送消息 -> 匹配客服 -> 客服加入频道 -> 开始聊天 ) + +### 游戏聊天室 + ++ 大群频道支持 + +### 音视频信令服务器 + ++ 支持临时指令消息投递 + +### 直播弹幕 + ++ 临时消息投递 + ++ 临时订阅者支持 + +一个直播一个频道,用户进入直播就是用户订阅频道,用户退出直播就是用户取消订阅频道,直播结束就是频道销毁。 + +### 实时 AI 反馈 + ++ 支持客户端发的消息推送给第三方服务器,第三方服务器反馈给 AI 后返回的结果再推送给客户端 + +### 即时社区 + ++ 社区频道支持 ++ 支持 topic 模式的消息投递 + +### 物联网通讯 + ++ mqtt 协议支持(待开发) ++ 支持发布与订阅 + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/apps/wukongim/data.yml b/apps/wukongim/data.yml new file mode 100644 index 000000000..95b5158df --- /dev/null +++ b/apps/wukongim/data.yml @@ -0,0 +1,15 @@ +additionalProperties: + key: wukongim + name: 悟空IM + tags: + - WebSite + - Tool + - Local + shortDescZh: 让信息传递更简单 + shortDescEn: Make messaging easier + type: website + crossVersionUpdate: true + recommend: 0 + website: https://githubim.com/ + github: https://github.com/TangSengDaoDao/TangSengDaoDaoServer/ + document: https://githubim.com/ diff --git a/apps/wukongim/logo.png b/apps/wukongim/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3ee5b050f2de10a3bb3436eb40976b1cf7baefa5 GIT binary patch literal 26517 zcmV;GXKI*004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0001l zWmrjOO-%qQ0000800jXO00RI3009620003R00jU50096107?NH00jU50096108#-c z00RI300963004(+00aO40096109pV50000007w7;0096107w7;00964paB2_00001 z00961paK8{000010002UpaTE|000010002U00000Xkk#600009a7bBm000XU000XU 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