From bb24fc2864b2cd6982dd3941d4e2c913549d889b 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 --- wukongim/1.2.6/data.yml | 47 +++++++++++++ wukongim/1.2.6/docker-compose.yml | 26 +++++++ wukongim/1.2.6/scripts/init.sh | 15 ++++ wukongim/1.2.6/scripts/uninstall.sh | 10 +++ wukongim/1.2.6/scripts/upgrade.sh | 15 ++++ wukongim/README.md | 105 ++++++++++++++++++++++++++++ wukongim/data.yml | 15 ++++ wukongim/logo.png | Bin 0 -> 26517 bytes 8 files changed, 233 insertions(+) create mode 100644 wukongim/1.2.6/data.yml create mode 100644 wukongim/1.2.6/docker-compose.yml create mode 100644 wukongim/1.2.6/scripts/init.sh create mode 100644 wukongim/1.2.6/scripts/uninstall.sh create mode 100644 wukongim/1.2.6/scripts/upgrade.sh create mode 100644 wukongim/README.md create mode 100644 wukongim/data.yml create mode 100644 wukongim/logo.png diff --git a/wukongim/1.2.6/data.yml b/wukongim/1.2.6/data.yml new file mode 100644 index 000000000..201cda9d4 --- /dev/null +++ b/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/wukongim/1.2.6/docker-compose.yml b/wukongim/1.2.6/docker-compose.yml new file mode 100644 index 000000000..f4f111213 --- /dev/null +++ b/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/wukongim/1.2.6/scripts/init.sh b/wukongim/1.2.6/scripts/init.sh new file mode 100644 index 000000000..77b849120 --- /dev/null +++ b/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/wukongim/1.2.6/scripts/uninstall.sh b/wukongim/1.2.6/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/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/wukongim/1.2.6/scripts/upgrade.sh b/wukongim/1.2.6/scripts/upgrade.sh new file mode 100644 index 000000000..77b849120 --- /dev/null +++ b/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/wukongim/README.md b/wukongim/README.md new file mode 100644 index 000000000..f02164bba --- /dev/null +++ b/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/wukongim/data.yml b/wukongim/data.yml new file mode 100644 index 000000000..95b5158df --- /dev/null +++ b/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/wukongim/logo.png b/wukongim/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3ee5b050f2de10a3bb3436eb40976b1cf7baefa5 GIT binary patch literal 26517 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 QPXGV_07*qoM6N<$f{R8KX#fBK literal 0 HcmV?d00001