├── image └── arch.png ├── sdk-introduction.md ├── config-client.md ├── config-client-en.md ├── README.md ├── config-push.md ├── create-user.md ├── create-user-en.md ├── README-en.md ├── docker-file.md ├── docker-file-en.md ├── download.md ├── 数据库中的群组 ├── README-cn.md └── source-build.md /image/arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/startalkIM/Startalk/HEAD/image/arch.png -------------------------------------------------------------------------------- /sdk-introduction.md: -------------------------------------------------------------------------------- 1 | [返回目录](https://github.com/startalkIM/Startalk) 2 | 3 | # SDK 介绍 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /config-client.md: -------------------------------------------------------------------------------- 1 | [返回首页](README.md#本文的目录) 2 | 3 | 4 | # 下载客户端 5 | 6 | ### 已发布客户端 7 | 8 | * 请在[这里](https://i.startalk.im/home/#/download)下载各平台最新版本客户端 9 | 10 | ### 客户端源码 11 | * [基于Objective-c的iOS客户端](https://github.com/startalkIM/imsdk-ios) 12 | * [基于Java的Android客户端](https://github.com/startalkIM/imsdk-android) 13 | * [Web客户端](https://github.com/startalkIM/startalk_web) 14 | * [基于c++的PC端](https://github.com/startalkIM/startalk_pc) 15 | 16 | # 配置客户端 17 | 18 | ### 配置导航 19 | 20 | 21 | ### 登录 22 | 23 | 24 | [![观看视频](https://raw.github.com/GabLeRoux/WebMole/master/ressources/WebMole_Youtube_Video.png)](https://qim.qunar.com/download/579957553ef9f92da20a3d8ac296acc1.mp4) 25 | 26 | [返回首页](README.md#本文的目录) -------------------------------------------------------------------------------- /config-client-en.md: -------------------------------------------------------------------------------- 1 | [Content](README-en.md#Contents) 2 | 3 | 4 | # Downlad 5 | 6 | ## Official website 7 | 8 | * Please download the latest version from [here](https://i.startalk.im/home/#/download) 9 | 10 | ## Source code 11 | * [iOS, based Objective-c](https://github.com/startalkIM/imsdk-ios) 12 | * [Android, based Java](https://github.com/startalkIM/imsdk-android) 13 | * [Web](https://github.com/startalkIM/startalk_web) 14 | * [PC, based C++ and qt](https://github.com/startalkIM/startalk_pc) 15 | 16 | # Configuration 17 | 18 | ## navigation 19 | 20 | 21 | ## sign in 22 | 23 | 24 | [![watch video](https://raw.github.com/GabLeRoux/WebMole/master/ressources/WebMole_Youtube_Video.png)](https://qim.qunar.com/download/579957553ef9f92da20a3d8ac296acc1.mp4) 25 | 26 | [Content](README-en.md#Contents) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Announcement 2 | 3 | [2021-03-25] We released Startalk 1.0.0.1! 4 | 5 | [2021-08-04] 6 | 7 | 今天,2021年8月4日,我很荣幸地宣布 Startalk XP IOS 版本上架 App Store 成功。大家可以在 App Store 搜索 startalk 找到一个红色 icon app 下载安装之。此次上架的版本做出了大量前后台修改,经历了许多周折。当前版本只具备基础框架和功能,尚需要大量改进和开发,相信 Startalk 这个开源软件可以持续让让我们感到惊喜。这个特别版本命名为 Startalk XP 用于特别感谢和纪念我们的顾问和好友 Xueping 先生。 8 | 9 | 10 | Today, 2021-08-04, we celebrate the launch of Startalk XP IOS version. Now you may search 'startalk' in app sotre with a magenta icon to download and intall it. We do a lot changes in server side and client side code, undergo a lot challenges with 3rd party package and appstore audit etc. It’s a humble start version with basic features and function, I believe the Startalk open source project will keep brining us happy surprise in the future. In memory to our dear friend and consultant Xueping, we name this version as Startalk XP. 11 | 12 | # Select your version: 13 | 14 | * [English Version](README-en.md) 15 | 16 | * [中文版](README-cn.md) 17 | -------------------------------------------------------------------------------- /config-push.md: -------------------------------------------------------------------------------- 1 | [返回首页](https://github.com/startalkIM/Startalk) 2 | 3 | # 简介 4 | 如果您按照后端的部署文档,或者使用我们的一键部署包完成了部署,那么只看这篇文档就可以 完善push能力了,并不需要单独下载和部署任何内容。 5 | 6 | IM后端的push服务,支持IOS apns协议推送,android 小米,华为,魅族,oppo厂商推送 push服务支持qtalk消息push,同时也支持接入自己的push服务 7 | 8 | #私有化部署push服务配置 9 | 10 | 全程只需要修改一个配置文件,重启下服务即可。 11 | 12 | 文件位置在: 13 | 14 | /startalk/tomcat/push_service/webapps/push_service/WEB-INF/classes/app.properties 15 | 16 | ### Android和IOS证书配置 17 | 18 | 如果需要使用服务支持的push,Android需要自己去小米和华为开发平台注册自己应用的app_key,Ios需要生产签名证书,配置如下: 19 | 20 | #### ios push 证书 21 | 22 | ``` 23 | ios_push_cer_qtalk=线上证书所在路径 24 | ios_push_cer_qtalk_beta=beta证书所在路径 25 | ``` 26 | 27 | #### Android配置 28 | 29 | ``` 30 | adr.qtalk.pkgname=应用包名 31 | adr.mipush.qtalk.key=mipush key(是个文本) 32 | adr.hwpush.qtalk.key=hwpush key(是个文本) 33 | ``` 34 | 35 | *** 36 | 37 | # 注意事项 38 | 39 | #### Android需要在项目的gradle文件中添加对应厂商push信息 40 | ``` 41 | startalk { 42 | dimension "qim" 43 | 44 | manifestPlaceholders = [ 45 | PACKAGE_NAME : "sdk.im.qunar.com.qtalksdkdemo",//Replace it with the application ID of your own project 46 | serverDoMain : true, 47 | baiduMap :"xxxxx",//key of Baidu map (for sending location) 48 | HUAWEI_APPID : "123",//HUAWEI push 49 | OPPO_APP_ID : "123",//OPPO push 50 | OPPO_APP_KEY : "123", 51 | OPPO_APP_SECRET : "123", 52 | MIPUSH_APP_ID : "123",//XIAOMI push 53 | MIPUSH_APP_KEY : "123", 54 | MEIZU_APP_ID : "123",//MEIZU push 55 | MEIZU_APP_KEY : "123", 56 | VIVO_APP_ID : "123",//vivoo 57 | VIVO_APP_KEY : "123", 58 | SCHEME : "qtalkaphone", 59 | currentPlat : "StarTalk", 60 | MAIN_SCHEMA : "start_qtalk_activity" 61 | ] 62 | } 63 | ``` 64 | 65 | [返回首页](https://github.com/startalkIM/Startalk) -------------------------------------------------------------------------------- /create-user.md: -------------------------------------------------------------------------------- 1 | 2 | [返回首页](README.md#本文的目录) 3 | 4 | # 简介 5 | 6 | 这个部分是后来写的。如有需要,请参见 [原始文档](https://github.com/startalkIM/ejabberd/wiki/%E7%94%A8%E6%88%B7%E7%AE%A1%E7%90%86) 7 | 8 | 当前startalk主要通过执行sql在后台生成用户,目的是扩展性。 9 | 10 | 11 | # 注意事项 12 | 需要手动生成用户,首先要了解几个事情: 13 | 14 | 15 | + startalk后台使用秘文密码。密码规则: 参照[密码规则](https://github.com/startalkIM/ejabberd/wiki/%E5%AF%86%E7%A0%81%E7%94%9F%E6%88%90%E8%A7%84%E5%88%99) 16 | 17 | + 用户id (大部分文档中会称之为user_id)生成规则:只能包含小写字母、数字、_、-、.,建议使用用户中文名的拼音当作user_id。 18 | 19 | + 为了让变更生效,在变更完信息后,需要: 20 | * host_users需要把version变成max(version) + 1 21 | * vcard_version需要把version=version + 1 22 | 23 | 24 | # 操作方法 25 | 26 | 插入用户 (使这个人存在) 27 | ``` 28 | insert into host_users (host_id, user_id, user_name, department, dep1, pinyin, frozen_flag, version, user_type, hire_flag, gender, password, initialpwd, pwd_salt, ps_deptid) values ('1', 'file-transfer', '文件传输助手', '/智能服务助手', '智能服务助手', 'file-transfer', '0', '1', 'U', '1', '1', 'CRY:fd540f073cc09aa98220bbb234153bd5', '1', 'qtalkadmin_pwd_salt_d2bf42081aab47f4ac00697d7dd32993', 'qtalk'); 29 | ``` 30 | 31 | 插入名片 (变更这个人的信息,例如名称,头像,等) 32 | ``` 33 | insert into vcard_version (username, version, profile_version, gender, host, url) values ('file-transfer', '1', '1', '1', 'qtalk', '/file/v2/download/avatar/new/daa8a007ae74eb307856a175a392b5e1.png?name=daa8a007ae74eb307856a175a392b5e1.png&file=file/daa8a007ae74eb307856a175a392b5e1.png&fileName=file/daa8a007ae74eb307856a175a392b5e1.png'); 34 | ``` 35 | 数据字典(db schema) 36 | 37 | ``` 38 | host_users: 39 | 序号 字段名称 字段描述 字段类型 40 | 1 host_id 域信息id bigint 41 | 2 user_id 用户名 text 42 | 3 user_name 中文名 text 43 | 4 department 组织架构 text 44 | 5 tel 电话 text 45 | 6 email 邮箱 text 46 | 7 dep1 一级部门 text 47 | 8 dep2 二级部门 text 48 | 9 dep3 三级部门 text 49 | 10 dep4 四级部门 text 50 | 11 dep5 五级部门 text 51 | 12 pinyin 拼音 text 52 | 13 frozen_flag 禁止标志 smallint 53 | 14 version 版本号 integer 54 | 15 user_type 用户类型(U) character 55 | 16 hire_flag 在职标志 smallint 56 | 17 gender 性别,1(男)2(女)0(未知) smallint 57 | 18 password 密码 text 58 | 19 initialpwd 是否是初始密码,1(是)0(否) smallint 59 | 20 ps_deptid 根级组织名字 text 60 | 21 pwd_salt 密码盐值 character varying(200) 61 | ``` 62 | ## 新加用户登录不上请参考如下解决方案 63 | 1、查看host_users 中该用户的host_id是否跟admin 用户的保持一致 64 | 2、查看host_users 中该用户的 frozen_flag是否为0,以及hire_flag 是否为1。 65 | 3、查看密码生成是否正确 66 | 67 | [返回首页](README.md#本文的目录) 68 | -------------------------------------------------------------------------------- /create-user-en.md: -------------------------------------------------------------------------------- 1 | 2 | [Content](README-en.md#Contents) 3 | 4 | # Introduction 5 | 6 | This is the lastest version of document.You can see the original version [here](https://github.com/startalkIM/ejabberd/wiki/%E7%94%A8%E6%88%B7%E7%AE%A1%E7%90%86) 7 | 8 | 9 | we can only register users through sql now. done more like this is to consider the suitability of your project. 10 | 11 | # Cautions 12 | + startalk uses cipher text password in back-end. this is the [rules](https://github.com/startalkIM/ejabberd/wiki/%E5%AF%86%E7%A0%81%E7%94%9F%E6%88%90%E8%A7%84%E5%88%99) 13 | 14 | * User Id (signed it as user_id in this document) generation rules are: 15 | it can only contain lowcase letters, number, dash, underline and point. 16 | 17 | * you need to do the following after your information updating to take effect: 18 | * update host_users set version = version + 1 where user_id = xxx 19 | * update vcard_version set version = version + 1 where user_id = xxx 20 | 21 | 22 | # detailed steps 23 | 24 | ## insert a user 25 | ``` 26 | insert into host_users (host_id, user_id, user_name, department, dep1, pinyin, frozen_flag, version, user_type, hire_flag, gender, password, initialpwd, pwd_salt, ps_deptid) values ('1', 'file-transfer', '文件传输助手', '/智能服务助手', '智能服务助手', 'file-transfer', '1', '1', 'U', '1', '1', 'CRY:fd540f073cc09aa98220bbb234153bd5', '1', 'qtalkadmin_pwd_salt_d2bf42081aab47f4ac00697d7dd32993', 'qtalk'); 27 | ``` 28 | 29 | ## insert a vcard 30 | ``` 31 | insert into vcard_version (username, version, profile_version, gender, host, url) values ('file-transfer', '1', '1', '1', 'qtalk', '/file/v2/download/avatar/new/daa8a007ae74eb307856a175a392b5e1.png?name=daa8a007ae74eb307856a175a392b5e1.png&file=file/daa8a007ae74eb307856a175a392b5e1.png&fileName=file/daa8a007ae74eb307856a175a392b5e1.png'); 32 | ``` 33 | 34 | ## db schema 35 | 36 | host_users: 37 | id name description type 38 | 1 host_id domain id bigint 39 | 2 user_id user id text 40 | 3 user_name user name text 41 | 4 department department text 42 | 5 tel telephone No. text 43 | 6 email Post No. text 44 | 7 dep1 department level 1 text 45 | 8 dep2 department level 2 text 46 | 9 dep3 department level 3 text 47 | 10 dep4 department level 4 text 48 | 11 dep5 department level 5 text 49 | 12 pinyin Chinese Pinyin text 50 | 13 frozen_flag frozen user flag smallint 51 | 14 version data version(for update) integer 52 | 15 user_type user type(U) character 53 | 16 hire_flag employed smallint 54 | 17 gender gender,1(man)2(woman)0(undefine smallint 55 | 18 password password text 56 | 19 initialpwd is pwd initiailized smallint 57 | 20 ps_deptid based department id text 58 | 21 pwd_salt password salt character varying(200) 59 | ``` 60 | 61 | [Content](README-en.md#Contents) -------------------------------------------------------------------------------- /README-en.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | STARTALK is an open source IM platform. It supports all the platforms and OSs you can think of, excellent performance. 3 | 4 | Startalk focuses on the application scenarios of to Business. 5 | 6 | The goal of Startalk is, to slove the problem that enterprises do not have a unified IM platform in the past 20 years: 7 | 8 | ``` 9 | The similar is, after more than 20 years of evolution in major operation systems,with the advent of nginx, deploying a set of http services has become very simple. 10 | ``` 11 | 12 | 13 | put it simply, the advantages of our system are very obvious: 14 | 15 | ``` 16 | 1. Performance, stability and platform adaptability can be regarded as the best in the industry. 17 | 2. Supporting all platforms in theoretically. 18 | 3. Almost all the code is open sourced. 19 | 4. Pure communication software, covering most scenarios what you can think of. 20 | ``` 21 | 22 | The disadvantages are also: 23 | 24 | ``` 25 | 1. The system is huge and complex 26 | 2. The technology stack involved is very wide. 27 | 3. It cannot be fully grasped by personal. 28 | ``` 29 | 30 | you can take a look the [previous version](https://github.com/startalkIM/startalk_backup). 31 | 32 | 33 | ### Contents 34 | 35 | * [Our slogan!](#Slogan) 36 | * [Platform features](#Features) 37 | * [Security](#Security) 38 | * [Performance and characteristics](#Performance) 39 | * [native coding, all platform support](#Supprting) 40 | * Start trial(there are 3 steps for the basic services deployment) 41 | 1. [Deploying backend services](Choose one out of three) 42 | * [Use the one-click installation package](https://i.startalk.im/home/#/download_easy) 43 | * [by the docker](docker-file-en.md) 44 | * [by source code documentation](source-build-en.md) 45 | 1. [User registration](create-user-en.md) 46 | 1. Client side Deployment 47 | * [Download](config-client-en.md) 48 | * [Configuration](config-client-en.md) 49 | * Extensions 50 | 1. [Notification Services(Push Services)](https://github.com/startalkIM/push_service) 51 | 1. [audio and video call](https://github.com/startalkIM/call_room_server) 52 | 1. [Red envelope, AA Pay(under construction)]() 53 | 54 | 55 | # Slogan 56 | 57 | ``` 58 | Even if not a milestone, at least be a paving stone! 59 | ``` 60 | 61 | 62 | # Features 63 | 64 | The characteristics of the platform are relected in the following aspects: 65 | 66 | ## Security 67 | 68 | * private protocol 69 | 70 | ``` 71 | Startalk's communication protocol is private, 72 | so the complexity and difficulty of eavesdropping during transamission 73 | are increased. 74 | ``` 75 | 76 | * Binary protocol 77 | 78 | ``` 79 | Different from common text protocols(such as xmpp, sip, http, etc.), Startalk's protocol is binary. 80 | it also increases the complexity and diffculty of being intercepted during transmission. 81 | ``` 82 | 83 | * TCP with TLS, end-to-end encryption supported 84 | 85 | * You have more than just the front-end, event the back-end. 86 | 87 | ## Performance 88 | 89 | ### back-end 90 | * Easily to support millions of users online, easily to support expansion 91 | 92 | ### front-end 93 | 94 | * Power saving on mobile, up to 90% 95 | * Data saving on mobile, up to 90% 96 | * Never miss a message 97 | * Even with a lot of messages, it is still very smooth -------------------------------------------------------------------------------- /docker-file.md: -------------------------------------------------------------------------------- 1 | [返回首页](README.md) 2 | 3 | ## 如何理解客户端的导航按钮/界面 4 | 5 | > * 最开始,用户希望服务器部署在自己家。而不是打开之后注册登录公共的服务器。 6 | > * 接着,用户把自己的服务器建立起来之后,发现还需要有客户端应用程序才可以。 7 | > * 用户自建app,那么问题到此结束。导航是不需要配置的。 8 | > * 如果用户手里没有app,也就是说没有客户端、用户端应用程序。 9 | > * 接下来,用户发现有一个选择,就是用开源社区提供的app。 10 | > * 紧接着,用户发现需要配置app(应用程序),使其去连用户自己配置的服务器。 11 | > * 登录页面中的选择导航按钮的作用就是让app去连你自己的服务器(而不是公有服务器) 12 | 13 | 14 | 我们希望我们的平台可以构建在企业环境中,因此我们推荐用户做私有化部署。 15 | 16 | 但是在私有化部署之前,有必要了解这套系统是怎么工作的,需要哪些服务,都有哪些功能。 17 | 18 | 所以在部署前进行有效的测试,将会让各位更加明晰当前版本的功能范围和性能指标。 19 | 20 | 我们推荐的试用分为两个方向: 21 | 22 | * 注册公共域试用 23 | * docker部署试用 24 | 25 | 26 | # 最新docker-compose项目: 27 | https://github.com/startalkIM/startalk-docker-compose 28 | 29 | # 以下文档为最初期的startalk-docker部署文档, 已过期 30 | 31 | ## 提前准备 32 | 33 | * 客户端 34 | * iOS客户端 (暂缺,审核中) 35 | * [Android客户端](https://i.startalk.im/home/#/download) 36 | * [PC客户端 32bit](https://i.startalk.im/pubapi/soft/download/StarTalk_x86.exe) (推荐) 37 | * [PC客户端 64bit](https://i.startalk.im/pubapi/soft/download/StarTalk_x64.exe) (推荐) 38 | * [Mac客户端](https://i.startalk.im/pubapi/soft/download/StarTalk.dmg) 39 | * linux 客户端 40 | * Web 客户端 41 | 42 | # Docker部署 43 | Docker起测试服务是我们目前推荐的方式。 44 | 45 | Docker 可以在Windows上起服务,这使得很多Windows用户不需要额外准备Linux主机就可以体验到startalk的各方面能力。 46 | 47 | ## 下载Docker 48 | 49 | + 下载/安装 Docker 50 | * [Windows版本](https://docs.docker.com/docker-for-windows/install/) 51 | * [Mac版本](https://docs.docker.com/docker-for-mac/install/) 52 | * [Ubuntu版本](https://docs.docker.com/install/linux/docker-ce/ubuntu/) 53 | * [Centos版本](https://docs.docker.com/install/linux/docker-ce/centos/) 54 | * [Debian版本](https://docs.docker.com/install/linux/docker-ce/debian/) 55 | * [其他Linux发行版](https://docs.docker.com/install/linux/docker-ce/binaries/) 56 | 57 | ## 部署Docker 58 | 59 | ### 安装步骤 60 | + 获取资源[文件](https://i.startalk.im/pubapi/soft/download/startalk_docker.zip) 并解压: 61 | ``` 62 | wget https://i.startalk.im/pubapi/soft/download/startalk_docker.zip 63 | ``` 64 | + 解压文件 65 | ``` 66 | unzip -x startalk_docker.zip 67 | ``` 68 | 得到: 69 | ``` 70 | -rw-r--r--. 1 root root 1.3K 12月 10 2019 Dockerfile 71 | drwxr-xr-x. 2 root root 33 12月 11 2019 images 72 | -rw-------. 1 root root 22M 12月 10 2019 permfile.zip 73 | -rw-r--r--. 1 root root 1.9K 12月 11 2019 README.md 74 | -rw-r--r--. 1 root root 93K 12月 10 2019 success.png 75 | 76 | ``` 77 | 之后再解压: 78 | ``` 79 | unzip -x permfile.zip 80 | ``` 81 | 得到: 82 | ``` 83 | -rw-r--r--. 1 root root 1.3K 12月 10 2019 Dockerfile 84 | drwxr-xr-x. 2 root root 33 12月 11 2019 images 85 | drwxr-xr-x. 6 root root 57 12月 9 2019 permfile 86 | -rw-------. 1 root root 22M 12月 10 2019 permfile.zip 87 | -rw-r--r--. 1 root root 1.9K 12月 11 2019 README.md 88 | -rw-r--r--. 1 root root 93K 12月 10 2019 success.png 89 | ``` 90 | + 用docker加载镜像 91 | ``` 92 | docker load < images/startalk_docker.tar 93 | ``` 94 | + 创建 Volume 95 | > 为什么要创建volume? 96 | > 97 | > 简单来说,Docker环境在虚拟机下无法保存数据。你需要用你的宿主机来保存这些文件,比如日志,比如图片,比如聊天记录。 98 | ``` 99 | docker volume create startalkpgdata 100 | ``` 101 | 102 | + 获取 docker image id 103 | ``` 104 | docker images 105 | 回车 106 | 然后,在结果中复制SIZE最大的那一列对应的IMAGE ID 107 | ``` 108 | 109 | + 启动镜像 110 | > 需要提前准备: 111 | > * 自己宿主机的IP (下文中的hosturl) 112 | > * 上一步获得的docker image id (下文中的镜像id) 113 | 114 | * liunx 用户使用: 115 | ``` 116 | 假设: 117 | permfile 全路径为 /home/xxx/permfile 118 | 宿主机IP是 192.168.0.1 119 | docker image id 是 1e977139e6ba 120 | 121 | 那么直接运行: 122 | docker run -v /home/xxx/permfile:/startalk/permfile -p 8080:8080 -p 5202:5202 -e hosturl="192.168.0.1" 1e977139e6ba 123 | ``` 124 | 125 | **注意,Docker当前版本必须使用全路径加载permfile,否则可能大概率启动失败** 126 | 127 | * Windows 用户使用: 128 | ``` 129 | 130 | 假设: 131 | 宿主机IP是 192.168.0.1 132 | docker image id 是 1e977139e6ba 133 | 134 | 那么直接运行: 135 | docker run -v permfile:/startalk/permfile -v startalkpgdata:/startalk/data -p 8080:8080 -p 5202:5202 -e hosturl="192.168.0.1" 1e977139e6ba 136 | ``` 137 | 138 | 注意: 139 | 140 | * docker run 加 -v参数,后面接的是持久性文件在宿主机上的绝对路径。 141 | 如您将permfile.zip 解压到了 /home/startalk/permfile 则-v /startalk/permfile:/startalk/permfile.冒号后面的路径不需改动 142 | * docker run 加了-p参数,配置了宿主机与container的端口映射。本例中需要用到宿主机暴露两个端口8080 5202 143 | * hosturl 是宿主机的ip,作为参数传给container。如果您配置的是内网ip 那整套IM 只能在内网使用。否则,如果您配置的是公网ip 则外网也可以使用 144 | * docker 版本:build image 是用的 Docker version 18.09.2,避免因为版本问题,建议使用>=18.09 145 | 146 | 147 | 这里是原文 [地址](https://github.com/startalkIM/startalk-docker) 148 | 149 | [返回首页](README.md) 150 | -------------------------------------------------------------------------------- /docker-file-en.md: -------------------------------------------------------------------------------- 1 | [Content](README-en.md#Contents) 2 | 3 | # Introduction 4 | 5 | Before the privatization deployment, effective trial is necessary to understand how this system works, what services are required, and what functions are available. 6 | 7 | so it will make you more aware of the functional scope and performance indicators of the platform. 8 | 9 | There are 2 trials are recommended: 10 | 11 | * [Sign up with public cloud](https://www.startalk.im) 12 | * using docker 13 | 14 | 15 | ## deploying with docker 16 | 17 | ### docker download & installation 18 | * [Windows version](https://docs.docker.com/docker-for-windows/install/) 19 | * [Mac version](https://docs.docker.com/docker-for-mac/install/) 20 | * [Ubuntu version](https://docs.docker.com/install/linux/docker-ce/ubuntu/) 21 | * [Centos version](https://docs.docker.com/install/linux/docker-ce/centos/) 22 | * [Debian version](https://docs.docker.com/install/linux/docker-ce/debian/) 23 | * [Other Linux distributions](https://docs.docker.com/install/linux/docker-ce/binaries/) 24 | 25 | # Document below is deprecated, please review the latest docker-compose at: https://github.com/startalkIM/startalk-docker-compose 26 | 27 | ### download file 28 | + Get the resource [file](https://i.startalk.im/pubapi/soft/download/startalk_docker.zip) and extract it: 29 | 30 | ``` 31 | wget https://i.startalk.im/pubapi/soft/download/startalk_docker.zip 32 | ``` 33 | + Unzip the file 34 | 35 | ``` 36 | unzip -x startalk_docker.zip 37 | ``` 38 | 39 | you get: 40 | ``` 41 | -rw-r--r--. 1 root root 1.3K Dec 10 2019 Dockerfile 42 | drwxr-xr-x. 2 root root 33 Dec 11 2019 images 43 | -rw -------. 1 root root 22M December 10 2019 permfile.zip 44 | -rw-r--r--. 1 root root 1.9K Dec 11 2019 README.md 45 | -rw-r--r--. 1 root root 93K Dec 10 2019 success.png 46 | ``` 47 | 48 | Unzip it later: 49 | ``` 50 | unzip -x permfile.zip 51 | ``` 52 | 53 | you get: 54 | ``` 55 | -rw-r--r--. 1 root root 1.3K Dec 10 2019 Dockerfile 56 | drwxr-xr-x. 2 root root 33 Dec 11 2019 images 57 | drwxr-xr-x. 6 root root 57 Dec 9 2019 permfile 58 | -rw -------. 1 root root 22M December 10 2019 permfile.zip 59 | -rw-r--r--. 1 root root 1.9K Dec 11 2019 README.md 60 | -rw-r--r--. 1 root root 93K Dec 10 2019 success.png 61 | ``` 62 | 63 | + Load image with docker 64 | ``` 65 | docker load Why create a volume? 70 | > 71 | > In simple terms, Docker environment cannot save data under virtual machine. You need to use your host machine to save these files, such as logs, such as pictures, such as chat records. 72 | 73 | ``` 74 | docker volume create startalkpgdata 75 | ``` 76 | 77 | + Get docker image id 78 | ``` 79 | docker images 80 | 81 | copy the IMAGE ID corresponding to the column with the largest size in the result. 82 | ``` 83 | 84 | + Boot image 85 | 86 | > Need to prepare: 87 | > * IP of your own host (hosturl below) 88 | > * Docker image id obtained in the previous step (the image id below) 89 | 90 | * liunx users use: 91 | 92 | ``` 93 | Assume: 94 | permfile file's full path is /home/xxx/permfile 95 | Host IP is 192.168.0.1 96 | docker image id is 1e977139e6ba 97 | 98 | Then run directly: 99 | docker run -v /home/xxx/permfile:/startalk/permfile -p 8080: 8080 -p 5202: 5202 -e hosturl = "192.168.0.1" 1e977139e6ba 100 | ``` 101 | 102 | **Note that the current version of Docker must use the full path to load the permfile, otherwise it may fail to start with a high probability** 103 | 104 | * For Windows users: 105 | ``` 106 | 107 | Assume: 108 | Host IP is 192.168.0.1 109 | docker image id is 1e977139e6ba 110 | 111 | Then run directly: 112 | docker run -v permfile: / startalk / permfile -v startalkpgdata: / startalk / data -p 8080: 8080 -p 5202: 5202 -e hosturl = "192.168.0.1" 1e977139e6ba 113 | ``` 114 | 115 | note: 116 | 117 | * docker run with -v parameter, there is the absolute path of the persistent file on the host machine followed. If you unzip permfile.zip to /home/startalk/permfile then -v /startalk/ permfile: /startalk/permfile. The path after the colon does not need to be changed. 118 | 119 | * docker run with the -p parameter to configure the port mapping between the host and the container. In this example, the host needs to be used to expose two ports: 8080 and 5202. 120 | 121 | * hosturl is the host's ip, which is passed as a parameter to the container. If you configure the intranet IP, the whole set of IM can only be used on the intranet. Otherwise, if you are using a public IP, the external network can also be used. 122 | 123 | * Docker version: 18.09.2 is used for build image, to avoid problems caused by tools, >= 18.09 of docker version is recommended 124 | 125 | 126 | Here is the original text [Address] (https://github.com/startalkIM/startalk-docker) 127 | 128 | [Content](README-en.md#Contents) 129 | -------------------------------------------------------------------------------- /download.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ### Startalk 的相关下载资源 4 | 5 | 这里是所有 Startalk 相关的下载链接,如果无法从 github 获得对应的包,可以从这里下载。 6 | 7 | ### 客户端 8 | 9 | | 下载链接 | MD5值 | 10 | | :---- | :---- | 11 | | [startalk_pc-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/client/startalk_pc-1.0.0.tar.gz) | 27e79032a979d45c4859eed2d15ea076 | 12 | | [imsdk-ios-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/client/imsdk-ios-1.0.0.tar.gz) | 2941c484ef8120c312071fb78ff3cda6 | 13 | | [imsdk-android-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/client/imsdk-android-1.0.0.tar.gz) | fe0f2079a7b089c16ade446dc3e0e102 | 14 | | [libqimcommoncategories-ios-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/client/libqimcommoncategories-ios-1.0.0.tar.gz) | fb20cdd69ce531f6344a04ceca128a84 | 15 | | [libqimdatabase-ios-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/client/libqimdatabase-ios-1.0.0.tar.gz) | c70cfa7e2d5fe0d905f130e0eedfbbac | 16 | | [qimrn-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/client/qimrn-1.0.0.tar.gz) | 584b7cc8a3c6a34191397c1ca3e880aa | 17 | | [libqimgeneralmodule-ios-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/client/libqimgeneralmodule-ios-1.0.0.tar.gz) | f548fd0987af08f79ca947b7b151ec16 | 18 | | [QIMReactNativeLibrary-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/client/QIMReactNativeLibrary-1.0.0.tar.gz) | f2690ab52ec1f55f1c0eac1b2ba2a753 | 19 | | [libqimopenssl-ios-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/client/libqimopenssl-ios-1.0.0.tar.gz) | b1d31ebd2426e08ed7db02379a67c51c | 20 | | [libqimcommon-ios-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/client/libqimcommon-ios-1.0.0.tar.gz) | 150cfa2b4464d4eb0a688819c68d99fc | 21 | | [libqimkitvendor-ios-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/client/libqimkitvendor-ios-1.0.0.tar.gz) | 098248019dd7cf45ea54cc6344e11f86 | 22 | 23 | [startalk-docker-compose-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/backend/startalk-docker-compose-1.0.0.tar.gz) ```md5sum: ce4347784632619fa14bc99c4ecce6b7``` 24 | 25 | 26 | 27 | | 下载链接 | MD5值 | 28 | | :---- | :---- | 29 | | [fe_qwebchat_admin-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/frontend/fe_qwebchat_admin-1.0.0.tar.gz) | 00e51e2ebe155b014180afb54019bdb2 | 30 | | [startalk_web-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/frontend/startalk_web-1.0.0.tar.gz) | 1127bdbaa2789759499023f6aa0e6f39 | 31 | | [startalk_node-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/frontend/startalk_node-1.0.0.tar.gz) | 45e7e117ddd38ea9a1857a5a4960f1b5 | 32 | | [fe_qunarchat_web-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/frontend/fe_qunarchat_web-1.0.0.tar.gz) | 0764e7876e2a154ba9a33d33b4e3d97b | 33 | 34 | ### 后端 35 | 36 | | 下载链接 | MD5值 | 37 | | :---- | :---- | 38 | | [startalk-docker-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/backend/startalk-docker-1.0.0.tar.gz) | abeb8e0a875bfdf682a0a8d950f211ef | 39 | | [openresty_ng-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/backend/openresty_ng-1.0.0.tar.gz) | 2951760b556c200f58f414362c85d42b | 40 | | [push_service-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/backend/push_service-1.0.0.tar.gz) | 9acb76fca167d3bdb278da6f38f967d1 | 41 | | [startalk-docker-compose-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/backend/startalk-docker-compose-1.0.0.tar.gz) | ce4347784632619fa14bc99c4ecce6b7 | 42 | | [ejabberd-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/backend/ejabberd-1.0.0.tar.gz) | 810b6f1192ece9e1633120008a700a3e | 43 | | [circlecamel-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/backend/circlecamel-1.0.0.tar.gz) | aeab75af3d9b0fdadca7ef7090c5f4f2 | 44 | | [call_room_server-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/backend/call_room_server-1.0.0.tar.gz) | 811aadd4b500c433c4d0a1be1584e9f0 | 45 | | [qfproxy-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/backend/qfproxy-1.0.0.tar.gz) | 99597c9b58ab0d0f5aebc9fce205a93a | 46 | | [red_envelope-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/backend/red_envelope-1.0.0.tar.gz) | 89640518c5c4e3dbc545be88702dc75b | 47 | | [qchat_admin_open-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/backend/qchat_admin_open-1.0.0.tar.gz) | bbec3587ef621dfc272ae838c267f57c | 48 | | [search-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/backend/search-1.0.0.tar.gz) | fe35754dffb81d6b8ad352a7db3d3ded | 49 | 50 | 51 | ### 文档 52 | 53 | | 下载链接 | MD5值 | 54 | | :---- | :---- | 55 | | [Startalk-1.0.0.tar.gz](https://i.startalk.im/pubapi/soft/download/git_projects/document/Startalk-1.0.0.tar.gz) | b640a1e8dbcc2eb8e2bc4a283f005ce8 | 56 | -------------------------------------------------------------------------------- /数据库中的群组: -------------------------------------------------------------------------------- 1 | 在数据库中,有以下表与群有关 2 | 关联列表 3 | 架构模式 | 名称 | 型别 | 拥有者 4 | ----------+---------------------------+--------+---------- 5 | public | destroy_muc_info | 资料表 | ejabberd 6 | public | muc_last | 资料表 | ejabberd 7 | public | muc_registered | 资料表 | ejabberd 8 | public | muc_room | 资料表 | ejabberd 9 | public | muc_room_backup | 资料表 | ejabberd 10 | public | muc_room_history | 资料表 | ejabberd 11 | public | muc_room_history_backup | 资料表 | postgres 12 | public | muc_room_users | 资料表 | ejabberd 13 | public | muc_user_mark | 资料表 | ejabberd 14 | public | muc_vcard_info | 资料表 | ejabberd 15 | public | user_register_mucs | 资料表 | ejabberd 16 | public | user_register_mucs_backup | 资料表 | ejabberd 17 | (12 行记录) 18 | 19 | muc_room 主要是记录了群的相关设置, 比较常用的设置包含群人数上限等 20 | 21 | name | d2b03928439549478c4391ae5772b810 22 | host | conference.qtalk 23 | opts | [{title,<<>>},{description,<<>>},{allow_change_subj,true},{allow_query_users,true},{allow_private_messages,false},{allow_private_messages_from_visitors,anyone},{allow_visitor_status,true},{allow_visitor_nickchange,true},{public,false},{public_list,false},{persistent,true},{moderated,true},{members_by_default,true},{members_only,false},{allow_user_invites,true},{password_protected,false},{captcha_protected,false},{password,<<>>},{anonymous,true},{logging,true},{max_users,600},{allow_voice_requests,true},{mam,false},{voice_request_min_interval,1800},{vcard,<<>>},{captcha_whitelist,[]},{affiliations,[{{<<"testuser1">>,<<"qtalk">>,<<>>},{owner,<<>>}}]},{subject,<<>>},{subject_author,<<>>},{subscribers,[]}] 24 | created_at | 2020-09-02 17:55:44.010197 25 | 26 | muc_room_users 常用于以群id检索群, 存储的是当前存在的群和成员, 意味着已被销毁的群或不在群内的成员将无法被检索. 27 | 28 | -[ RECORD 1 ]--+--------------------------------- 29 | muc_name | d2b03928439549478c4391ae5772b810 30 | username | admin 31 | host | qtalk 32 | subscribe_flag | 1 33 | id | 1542633 34 | date | 0 35 | login_date | 1599040546 36 | domain | conference.qtalk 37 | update_time | 2020-09-02 17:55:46.351104+08 38 | 39 | user_register_mucs 主要存储群成员信息, 常用于以人搜群, 例如搜索某成员所有的群 40 | 注意, 此表中存储的信息包含已被销毁的群, 如果registed_flag是0, 说明群成员曾经在群内但已被移出或退群, 也可能是该群已被销毁. 41 | 42 | -[ RECORD 1 ]-+--------------------------------- 43 | username | testuser1 44 | muc_name | d2b03928439549478c4391ae5772b810 45 | domain | conference.qtalk 46 | created_at | 2020-09-02 17:55:44.073+08 47 | registed_flag | 1 48 | host | qtalk 49 | 50 | muc_vcard_info存储群公告, 群名称, 群头像等信息 51 | muc_pic字段代表群头像地址, 客户端取出字段后将导航里fileurl与之拼接, 构成完整url 52 | version字段代表修改次数, 用于客户端同步 53 | 54 | -[ RECORD 1 ]----+------------------------------------------------------- 55 | muc_name | d2b03928439549478c4391ae5772b810@conference.qtalk 56 | show_name | 测试用户1,管理员 57 | muc_desc | 群公告 58 | muc_title | 59 | muc_pic | /file/v2/download/c48d543591c3ba25767a680d927e47a3.png 60 | show_name_pinyin | ceshiyonghu1guanliyuan|csyh1gly 61 | update_time | 2020-09-02 18:25:24.389083+08 62 | version | 5 63 | 64 | muc_room_history存储聊天信息 65 | msg_id为每条消息特有的uuid 66 | id为自增主键, muc_room_name为群id, nick为消息发送者的名称 67 | pakcet 字段使用xml格式存储消息具体信息, 由message和body两部分组成, 其中 68 | message属性: 69 | from: 群id/人 70 | to: 群id 71 | sendjid, realfrom,realto,type 等字段用于客人-店铺-店家咨询的模式使用, 平时不会涉及 72 | msec_times为毫秒级别时间戳 73 | client_ver及client_type标志发送者使用的客户端和版本号 74 | body属性: 75 | id为msg_id 76 | msgType是消息类型, 每种消息都有特有的消息类型, 客户端将根据消息类型来解析和生成消息 77 | body内为真正的内容 78 | 79 | -[ RECORD 1 ]-+-------------------------------- 80 | muc_room_name | d2b03928439549478c4391ae5772b810 81 | nick | testuser1_qtalk 82 | packet | asdf 83 | have_subject | t 84 | size | 0 85 | create_time | 2020-09-02 18:25:54.657+08 86 | id | 11 87 | host | qtalk 88 | msg_id | 4307c24c6e3d47178b57e70fbb44b357 89 | 90 | destroy_muc_info 用于存储销毁的群 91 | -[ RECORD 1 ]-------------------------------- 92 | muc_name | ba3fb485109a4301a3441666d796111a 93 | nick_name | 销毁群 94 | reason | Owner Destroy 95 | id | 1 96 | created_at | 2020-09-02 17:59:50.698467 97 | 98 | backup表常用于数据过大, 需要备份时, 或者集群需要调整时使用. 99 | 100 | 常用sql: 101 | 102 | 查询用户名为admin的用户当前拥有的群 103 | SELECT a.username, a.muc_name, b.show_name 104 | FROM user_register_mucs a 105 | RIGHT JOIN muc_vcard_info b 106 | ON concat(a.muc_name, '@', a.domain) = b.muc_name 107 | AND a.registed_flag = 1 108 | AND a.username = 'admin'; 109 | 110 | 查询群id为d2b03928439549478c4391ae5772b810的当前所有群成员 111 | SELECT concat(a.username, '@', a.host) AS user, b.user_name AS name 112 | FROM muc_room_users a 113 | LEFT JOIN host_users b 114 | ON a.username = b.user_id 115 | AND a.muc_name = 'd2b03928439549478c4391ae5772b810'; 116 | 117 | 查询群id为d2b03928439549478c4391ae5772b810@qtalk的最近2条发言 118 | SELECT * 119 | FROM muc_room_history 120 | WHERE muc_room_name = 'd2b03928439549478c4391ae5772b810' 121 | AND host = 'qtalk' 122 | ORDER BY id DESC 123 | LIMIT 2; 124 | 注意:如果要单纯提取消息内容, 需要postgres插件或自行解xml 125 | -------------------------------------------------------------------------------- /README-cn.md: -------------------------------------------------------------------------------- 1 | # 简介 2 | Startalk 是一套开源IM系统平台。涵盖了所有你所能想到的目标平台和目标系统。且性能优异。 3 | 4 | Startalk主攻 toB 场景。 5 | 6 | Startalk的目标是想解决企业在近20年的时间内没有统一的IM系统的问题: 7 | 8 | ``` 9 | 相比之下,各大操作系统经过近20年的演化,以及nginx的出现,已经让http服务变得非常简单了。 10 | ``` 11 | 12 | 简单来说,我们的优点很明显: 13 | 14 | ``` 15 | 第一,性能、稳定性以及平台适应性可以算是业界最好的,理论上支持所有平台 16 | 第二,公开了几乎全部的代码 17 | 第三,团队仍旧在持续迭代 18 | ``` 19 | 20 | 缺点也有: 21 | 22 | ``` 23 | 1. 系统很庞大和复杂 24 | 2. 涉及到的技术栈面很广,通常情况下您需要先想好自己要做什么,想实现什么功能,以及需要哪方面帮助 25 | ``` 26 | 27 | 28 | 之前写过一篇介绍。本篇希望在叙述上更针对典型用户的需求,如果对上一个版本的介绍文档感兴趣,可以看看[这里](https://github.com/startalkIM/startalk_backup)。 29 | 30 | ### 本文的目录 31 | 32 | * [我们的口号](#口号) 33 | * [系统特性](#系统特性) 34 | * [安全性](#安全性) 35 | * [性能特性](#性能特性) 36 | * [纯native实现,全平台支持](#全平台支持) 37 | * [支持自建应用嵌入](#自建应用) 38 | * [适用场景](#适用场景) 39 | * 开始试用(部署基础服务,3个步骤) 40 | 1. 部署后台基础功能(三选一) 41 | * [通过一键安装包安装后台](#一键包) 42 | * [通过部署Docker安装后台](docker-file.md) 43 | * [使用源码通过文档部署](source-build.md) 44 | 1. 生成注册用户 45 | * [生成用户](create-user.md) 46 | 1. 部署客户端 47 | * [下载客户端](config-client.md) 48 | * [配置客户端](config-client.md) 49 | * 部署扩展功能 50 | 1. [部署Push服务(推送服务)](https://github.com/startalkIM/push_service) 51 | 1. [部署音视频](https://github.com/startalkIM/call_room_server) 52 | 1. [部署红包、AA]() 53 | * 其他需求 54 | * [二次开发](sdk-introduction.md) 55 | * [商业客服 Saas]() 56 | * [系统架构](#系统架构) 57 | * [功能组件列表](#功能组件列表) 58 | * [后端](#后端) 59 | * [PC端](#PC端) 60 | * [iOS端](#iOS端) 61 | * [android端](#android端) 62 | * [常见问题](#常见问题) 63 | * [问题反馈](#问题反馈) 64 | * [相关资源入口](#相关资源入口) 65 | 66 | ## 为什么要用IM 67 | ``` 68 | 人类从有沟通需求开始,追求无止境。 69 | ``` 70 | 沟通即表达,传递信息和想法 71 | 72 | # 口号 73 | 74 | 我们的口号是 75 | ``` 76 | 不做里程碑,也要做铺路石! 77 | ``` 78 | 79 | # 系统特性 80 | 81 | IM系统本身很复杂。投入产出比不高。常见的开源方案的目标并不是性能和稳定性,大多以实现功能为主。 82 | 83 | 星语Startalk主要针对底层实现进行了较长时间的积累和沉淀。 这个也契合了[我们的口号](#口号) 84 | 85 | 谈到系统特性,主要围绕以下几个方面展开: 86 | 87 | * [安全性](#安全性) 88 | * [性能](#性能/扩展性) 89 | * [纯native实现,全平台支持](#全平台支持) 90 | * [支持自建应用嵌入](#自建应用) 91 | 92 | 93 | # 安全性 94 | * 自有协议 95 | ``` 96 | 不同于常见的im协议,startalk的协议是自有协议。 97 | 由于是自有协议,增大了传输过程中被窃听的复杂度和难度。 98 | ``` 99 | * 二进制协议 100 | ``` 101 | 区别于常见的文本协议(例如xmpp,又或者是http),startalk的通信协议是二进制的。 102 | 这个设计也增大了传输过程中被窃听的复杂度和难度。 103 | ``` 104 | * TCP长连接,默认全程TLS,保持端到端加密 105 | ``` 106 | 由于连接开启了TLS,进一步增加了传输过程中被窃听的难度。 107 | ``` 108 | * 服务端在自己机房,客户端在自己用户手中 109 | ``` 110 | startalk作为开源软件,区别于常见的通信软件服务,推荐用户进行私有化部署。 111 | 当用户私有化部署完成之后,用户间的通信过程就像公司内部的邮件和bbs一样,只于内部系统可见了。 112 | ``` 113 | 114 | # 性能特性 115 | 116 | * 轻松支持百万级用户在线,支持横向扩展 117 | ``` 118 | 因为支持几亿人同时在线的IM已经做的太强大了。 119 | 所以,startalk的目标和典型场景,是支持一个正常团队的人数协同工作。 120 | 这个数量从十几、几十到上百上千甚至上万。 121 | startalk非常善于轻松支持这个人数的用户进行协作。 122 | 123 | 当然,由于Startalk的后端基于erlang。这使得横向扩展变得非常容易。 124 | 通常我们需要支持上百万用户的时候, 125 | 除了加内存之外,还可以选择买机器,然后用集群来解决问题。 126 | 127 | 一切都是非常的简单和自然。 128 | ``` 129 | 130 | * 客户端更省电,最高可达90% 131 | ``` 132 | 我们测试了常见的xmpp服务端。 133 | 由于startalk用了二进制协议和自有协议,这使得协议在解析过程中更加的节省CPU, 134 | 从而节约了最高90%的电能损耗。 135 | 目前startalk的耗电量跟微信在同一水平线上(比常见的xmpp客户端省电90%)。 136 | 137 | ``` 138 | 139 | * 客户端更省流量,最高可达90% 140 | ``` 141 | 相信很多使用xmpp客户端的用户都有同感,每天没怎么聊流量用的很多。 142 | 143 | 同样由于优化了协议和传输,使得startalk比常见的xmpp客户端最高可节约90%流量。 144 | 145 | 同样的,目前startalk的流量损耗跟微信也在同一水平线上(比常见的xmpp客户端节约90%流量)。 146 | ``` 147 | 148 | * 不丢消息 149 | ``` 150 | 看起来是个很简单、很容易做到的功能, 151 | 然而对聊天软件来说,丢消息、消息不实时是致命的。 152 | 可怕的是,这个功能对很多产品来说却很难做好。 153 | startalk经过了近3年的高强度测试和改进,终于做到了这个目标。 154 | ``` 155 | 156 | * 消息量大了不卡顿 157 | ``` 158 | 同丢消息一样,这个点也是看起来很简单,很容易做到的功能, 159 | 然而确是大量软件不太容易做到的功能。 160 | 161 | 这个问题的现象是,起初刚开始用的时候很好用。等消息多起来之后, 162 | 列表页卡顿,消息页卡顿,优化也很耗精力和时间。 163 | 星语可以做到10G左右的聊天数据不卡顿。(微信还要更猛一些) 164 | 使用星语做您软件的底层可以尽可能的避免遇到这些问题。 165 | ``` 166 | 167 | # 全平台支持 168 | 169 | 与市面上主流面向web的通信服务工具不同,Startalk 面向平台,为了实现更强大的性能上限,客户端用了本地化的代码实现。 170 | 171 | 172 | Startalk 由以下客户端组成: 173 | 174 | * [iOS客户端,基于Objective-c](https://github.com/startalkIM/imsdk-ios) 175 | * [Android客户端,基于Java](https://github.com/startalkIM/imsdk-android) 176 | * [Web客户端, 基于JS](https://github.com/startalkIM/startalk_web) 177 | * [PC端, 基于c++](https://github.com/startalkIM/startalk_pc) 178 | 179 | # 自建应用 180 | 181 | (建设中) 182 | 183 | # 适用场景 184 | 185 | * 企业办公OA 186 | * 企业应用整合 187 | * SDK嵌入(企业自有业务支撑) 188 | * 商业客服 189 | 190 | # 企业办公OA 191 | 192 | * [通信] 193 | * [邮件] 194 | * [审批] 195 | * [APP整合] 196 | 197 | # 企业应用整合 198 | 199 | * [客户端SDK] 200 | * [OA二次开发] 201 | 202 | # SDK嵌入 203 | 204 | * IOS sdk嵌入: 205 | 206 | ```pod 207 | QIMSDK最低支持iOS9 208 | 209 | 默认依赖React-Native的CocoaPods集成 210 | 211 | 1. 在Podfile中加入以下内容: 212 | 213 | source 'https://github.com/startalkIM/libqimkit-ios-cook.git' 214 | 215 | source 'git@github.com:CocoaPods/Specs.git' 216 | 217 | target 'YourApp' do 218 | 219 | pod 'QIMUIKit', '~> 4.0' 220 | end 221 | 222 | post_install do |installer_representation| 223 | 224 | installer_representation.pods_project.targets.each do |target| 225 | target.build_configurations.each do |config| 226 | config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO' 227 | end 228 | end 229 | end 230 | 231 | 2. 在项目根目录执行 `pod install` 232 | 233 | ``` 234 | ###### [详细配置,参照Demo](https://github.com/startalkIM/imsdk-ios) 235 | 236 | 237 | * Android sdk嵌入: 238 | 239 | ```gradle 240 | 配置Gradle 241 | 242 | buildscript { 243 | repositories { 244 | google() 245 | jcenter() 246 | } 247 | } 248 | 249 | allprojects { 250 | repositories { 251 | maven { url 'https://dl.google.com/dl/android/maven2' } 252 | maven { 253 | url "https://raw.githubusercontent.com/froyomu/im/master" 254 | } 255 | maven { 256 | url "http://developer.huawei.com/repo/" 257 | } 258 | jcenter { 259 | url "http://jcenter.bintray.com/" 260 | } 261 | maven { 262 | url "https://jitpack.io" 263 | } 264 | google() 265 | jcenter() 266 | mavenCentral() 267 | } 268 | } 269 | ``` 270 | 271 | ```gradle 272 | dependencies { 273 |  compile project(':imsdk')//compile 'com.qunar.im:sdk-im:3.0.7' 274 | } 275 | ``` 276 | 277 | ```manifestPlaceholders 278 | 配置manifestPlaceholders 279 | 280 | flavorDimensions "qim" 281 | //Mutiple channels 282 | productFlavors { 283 | //startalk 284 | startalk { 285 | dimension "qim" 286 | 287 | manifestPlaceholders = [ 288 | PACKAGE_NAME : "sdk.im.qunar.com.qtalksdkdemo",//Replace it with the application ID of your own project 289 | serverDoMain : true, 290 | baiduMap :"xxxxx",//key of Baidu map (for sending location) 291 | HUAWEI_APPID : "123",//HUAWEI push 292 | OPPO_APP_ID : "123",//OPPO push 293 | OPPO_APP_KEY : "123", 294 | OPPO_APP_SECRET : "123", 295 | MIPUSH_APP_ID : "123",//XIAOMI push 296 | MIPUSH_APP_KEY : "123", 297 | MEIZU_APP_ID : "123",//MEIZU push 298 | MEIZU_APP_KEY : "123", 299 | VIVO_APP_ID : "123",//vivoo 300 | VIVO_APP_KEY : "123", 301 | SCHEME : "qtalkaphone", 302 | currentPlat : "QTalk", 303 | MAIN_SCHEMA : "start_qtalk_activity" 304 | ] 305 | } 306 | } 307 | 308 | ``` 309 | ###### [详细配置,参照Demo](https://github.com/startalkIM/imsdk-android) 310 | 311 | * [Web嵌入] 312 | 313 | 314 | # 商业客服 315 | 316 | 317 | # 系统架构 318 | 319 | ## 后端 320 | ![arch](/image/arch.png) 321 | 322 | ### 2.0 版本架构图 323 | 324 | (暂缺) 325 | 326 | # 功能组件列表 327 | 328 | 详细和原始的内容请参考[这里](https://github.com/startalkIM/ejabberd/blob/master/README.md#startalk-%E6%A8%A1%E5%9D%97) 329 | 330 | + [ejabberd](https://github.com/startalkIM/ejabberd) (erlang) 331 | 332 | IM核心组件,负责维持与客户端的长连接和消息路由 333 | 334 | + [openresty 组件](https://github.com/startalkIM/openresty_ng)(LUA) 335 | 336 | IM负载均衡组件,负责验证客户端身份,以及转发http请求到对应的后台服务 337 | 338 | + [im_http_service](https://github.com/startalkIM/im_http_service) (JAVA服务) 339 | 340 | IM HTTP接口服务,负责IM相关数据的查询、设置以及历史消息同步(基于tomcat的java服务) 341 | 342 | + [qfproxy](https://github.com/startalkIM/qfproxy)(JAVA服务) 343 | 344 | IM文件服务,负责文件的上传和下载(基于tomcat的java服务)(JAVA服务) 345 | 346 | + [push_service](https://github.com/startalkIM/push_service)(JAVA服务) 347 | 348 | IM的push服务,用于离线消息的推送(基于tomcat的java服务)(JAVA服务) 349 | 350 | + [search_serivce](https://github.com/startalkIM/search)(PYTHON服务) 351 | 352 | 提供远程搜索好友、群、聊天记录的服务 353 | 354 | + redis 355 | 356 | IM缓存服务 357 | 358 | + postgresql 359 | 360 | 数据持久化服务 361 | 362 | 363 | ## PC端 364 | 365 | (建设中) 366 | 367 | 技术文档可以先参阅[这里](https://github.com/startalkIM/startalk_pc) 368 | 369 | 370 | 371 | ## iOS端 372 | 373 | (建设中) 374 | 技术文档可以先参阅[这里](https://github.com/startalkIM/imsdk-ios) 375 | 376 | ## Android端 377 | 378 | (建设中) 379 | 技术文档可以先参阅[这里](https://github.com/startalkIM/imsdk-android) 380 | 381 | 382 | # 试用 383 | 384 | 385 | ## 如何理解客户端的导航按钮/界面 386 | 387 | > * 最开始,用户希望服务器部署在自己家。而不是打开之后注册登录公共的服务器。 388 | > * 接着,用户把自己的服务器建立起来之后,发现还需要有客户端应用程序才可以。 389 | > * 用户自建app,那么问题到此结束。导航是不需要配置的。 390 | > * 如果用户手里没有app,也就是说没有客户端、用户端应用程序。 391 | > * 接下来,用户发现有一个选择,就是用开源社区提供的app。 392 | > * 紧接着,用户发现需要配置app(应用程序),使其去连用户自己配置的服务器。 393 | > * 登录页面中的选择导航按钮的作用就是让app去连你自己的服务器(而不是公有服务器) 394 | 395 | 396 | 我们希望我们的平台可以构建在企业环境中,因此我们推荐用户做私有化部署。 397 | 398 | 但是在私有化部署之前,有必要了解这套系统是怎么工作的,需要哪些服务,都有哪些功能。 399 | 400 | 所以在部署前进行有效的测试,将会让各位更加明晰当前版本的功能范围和性能指标。 401 | 402 | 我们推荐的试用分为两个方向: 403 | 404 | * 注册公共域试用 405 | * docker部署试用 406 | 407 | ## 提前准备 408 | 409 | 410 | # 一键包 411 | 412 | 413 | [https://i.startalk.im/home/#/download_easy](https://i.startalk.im/home/#/download_easy) 414 | 415 | 416 | # Docker部署 417 | Docker起测试服务是我们目前推荐的方式。 418 | 419 | Docker 可以在Windows上起服务,这使得很多Windows用户不需要额外准备Linux主机就可以体验到startalk的各方面能力。 420 | 421 | ## 下载Docker 422 | 423 | + 下载/安装 Docker 424 | * [Windows版本](https://docs.docker.com/docker-for-windows/install/) 425 | * [Mac版本](https://docs.docker.com/docker-for-mac/install/) 426 | * [Ubuntu版本](https://docs.docker.com/install/linux/docker-ce/ubuntu/) 427 | * [Centos版本](https://docs.docker.com/install/linux/docker-ce/centos/) 428 | * [Debian版本](https://docs.docker.com/install/linux/docker-ce/debian/) 429 | * [其他Linux发行版](https://docs.docker.com/install/linux/docker-ce/binaries/) 430 | 431 | ## 部署Docker 432 | 433 | ### 安装步骤 434 | + 获取资源[文件](https://i.startalk.im/pubapi/soft/download/startalk_docker.zip) 并解压: 435 | ``` 436 | wget https://i.startalk.im/pubapi/soft/download/startalk_docker.zip 437 | ``` 438 | + 解压文件 439 | ``` 440 | unzip -x startalk_docker.zip 441 | ``` 442 | 得到: 443 | ``` 444 | -rw-r--r--. 1 root root 1.3K 12月 10 2019 Dockerfile 445 | drwxr-xr-x. 2 root root 33 12月 11 2019 images 446 | -rw-------. 1 root root 22M 12月 10 2019 permfile.zip 447 | -rw-r--r--. 1 root root 1.9K 12月 11 2019 README.md 448 | -rw-r--r--. 1 root root 93K 12月 10 2019 success.png 449 | 450 | ``` 451 | 之后再解压: 452 | ``` 453 | unzip -x permfile.zip 454 | ``` 455 | 得到: 456 | ``` 457 | -rw-r--r--. 1 root root 1.3K 12月 10 2019 Dockerfile 458 | drwxr-xr-x. 2 root root 33 12月 11 2019 images 459 | drwxr-xr-x. 6 root root 57 12月 9 2019 permfile 460 | -rw-------. 1 root root 22M 12月 10 2019 permfile.zip 461 | -rw-r--r--. 1 root root 1.9K 12月 11 2019 README.md 462 | -rw-r--r--. 1 root root 93K 12月 10 2019 success.png 463 | ``` 464 | + 用docker加载镜像 465 | ``` 466 | docker load < images/startalk_docker.tar 467 | ``` 468 | + 创建 Volume 469 | > 为什么要创建volume? 470 | > 471 | > 简单来说,Docker环境在虚拟机下无法保存数据。你需要用你的宿主机来保存这些文件,比如日志,比如图片,比如聊天记录。 472 | ``` 473 | docker volume create startalkpgdata 474 | ``` 475 | 476 | + 获取 docker image id 477 | ``` 478 | docker images 479 | 回车 480 | 然后,在结果中复制SIZE最大的那一列对应的IMAGE ID 481 | ``` 482 | 483 | + 启动镜像 484 | > 需要提前准备: 485 | > * 自己宿主机的IP (下文中的hosturl) 486 | > * 上一步获得的docker image id (下文中的镜像id) 487 | 488 | * liunx 用户使用: 489 | ``` 490 | 假设: 491 | permfile 全路径为 /home/xxx/permfile 492 | 宿主机IP是 192.168.0.1 493 | docker image id 是 1e977139e6ba 494 | 495 | 那么直接运行: 496 | docker run -v /home/xxx/permfile:/startalk/permfile -v startalkpgdata:/startalk/data -p 8080:8080 -p 5202:5202 -e hosturl="192.168.0.1" 1e977139e6ba 497 | ``` 498 | 499 | **注意,Docker当前版本必须使用全路径加载permfile,否则可能大概率启动失败** 500 | 501 | * Windows 用户使用: 502 | ``` 503 | 504 | 假设: 505 | 宿主机IP是 192.168.0.1 506 | docker image id 是 1e977139e6ba 507 | 508 | 那么直接运行: 509 | docker run -v permfile:/startalk/permfile -v startalkpgdata:/startalk/data -p 8080:8080 -p 5202:5202 -e hosturl="192.168.0.1" 1e977139e6ba 510 | ``` 511 | 512 | 注意: 513 | 514 | * docker run 加 -v参数,后面接的是持久性文件在宿主机上的绝对路径。 515 | 如您将permfile.zip 解压到了 /home/startalk/permfile 则-v /startalk/permfile:/startalk/permfile.冒号后面的路径不需改动 516 | * docker run 加了-p参数,配置了宿主机与container的端口映射。本例中需要用到宿主机暴露两个端口8080 5202 517 | * hosturl 是宿主机的ip,作为参数传给container。如果您配置的是内网ip 那整套IM 只能在内网使用。否则,如果您配置的是公网ip 则外网也可以使用 518 | * docker 版本:build image 是用的 Docker version 18.09.2,避免因为版本问题,建议使用>=18.09 519 | 520 | 521 | 这里是原文 [地址](https://github.com/startalkIM/startalk-docker) 522 | 523 | # 公共域注册登录 524 | 525 | 起先我们是推荐在[线上](https://www.startalk.im/)注册登录试用的。因为设备费用等问题以及人手的问题, 526 | 我们慢慢不太建议少量用户试用公共域了(当然您还可以继续使用它)。 527 | 528 | 如果您目前处于: 529 | * 需要一款完全私有化部署的系统 530 | * 暂时没精力折腾 531 | * 能接受暂时的公有域使用,当自己条件满足之后切成私有部署 532 | 533 | 那么您可以尝试暂时在公共域[入驻](https://i.startalk.im/home/#/register)了! 534 | 535 | 536 | # 获取客户端 537 | * 请在[这里](https://i.startalk.im/home/#/download)下载各平台最新版本客户端 538 | 539 | [[返回目录列表](#简介)] 540 | 541 | # 配置客户端 542 | 543 | [详见这里](https://i.startalk.im/home/#/platform/access_guide/config_navs?id=config_navs) 544 | 545 | 546 | # 生成用户 547 | 548 | 这个部分是后来写的。如有需要,请参见 [原始文档](https://github.com/startalkIM/ejabberd/wiki/%E7%94%A8%E6%88%B7%E7%AE%A1%E7%90%86) 549 | 550 | 当前startalk生成用户的部分主要是通过执行sql,在后台生成,目的是扩展性。 551 | 552 | 需要手动生成用户,首先要明确几个问题: 553 | 554 | 555 | + startalk后台使用秘文密码。密码规则: 参照[密码规则](https://github.com/startalkIM/ejabberd/wiki/%E5%AF%86%E7%A0%81%E7%94%9F%E6%88%90%E8%A7%84%E5%88%99) 556 | 557 | + 用户id (大部分文档中会称之为user_id)生成规则:只能包含小写字母、数字、_、-、.,建议使用用户中文名的拼音当作user_id。 558 | 559 | + 为了让变更生效,在变更完信息后,需要: 560 | * host_users需要把version变成max(version) + 1 561 | * vcard_version需要把version=version + 1 562 | 563 | 564 | 插入用户 (使这个人存在) 565 | ``` 566 | insert into host_users (host_id, user_id, user_name, department, dep1, pinyin, frozen_flag, version, user_type, hire_flag, gender, password, initialpwd, pwd_salt, ps_deptid) values ('1', 'file-transfer', '文件传输助手', '/智能服务助手', '智能服务助手', 'file-transfer', '1', '1', 'U', '1', '1', 'CRY:fd540f073cc09aa98220bbb234153bd5', '1', 'qtalkadmin_pwd_salt_d2bf42081aab47f4ac00697d7dd32993', 'qtalk'); 567 | ``` 568 | 569 | 插入名片 (变更这个人的信息,例如名称,头像,等) 570 | ``` 571 | insert into vcard_version (username, version, profile_version, gender, host, url) values ('file-transfer', '1', '1', '1', 'qtalk', '/file/v2/download/avatar/new/daa8a007ae74eb307856a175a392b5e1.png?name=daa8a007ae74eb307856a175a392b5e1.png&file=file/daa8a007ae74eb307856a175a392b5e1.png&fileName=file/daa8a007ae74eb307856a175a392b5e1.png'); 572 | ``` 573 | 数据字典(db schema) 574 | 575 | ``` 576 | host_users: 577 | 序号 字段名称 字段描述 字段类型 578 | 1 host_id 域信息id bigint 579 | 2 user_id 用户名 text 580 | 3 user_name 中文名 text 581 | 4 department 组织架构 text 582 | 5 tel 电话 text 583 | 6 email 邮箱 text 584 | 7 dep1 一级部门 text 585 | 8 dep2 二级部门 text 586 | 9 dep3 三级部门 text 587 | 10 dep4 四级部门 text 588 | 11 dep5 五级部门 text 589 | 12 pinyin 拼音 text 590 | 13 frozen_flag 禁止标志 smallint 591 | 14 version 版本号 integer 592 | 15 user_type 用户类型(U) character 593 | 16 hire_flag 在职标志 smallint 594 | 17 gender 性别,1(男)2(女)0(未知) smallint 595 | 18 password 密码 text 596 | 19 initialpwd 是否是初始密码,1(是)0(否) smallint 597 | 20 ps_deptid 根级组织名字 text 598 | 21 pwd_salt 密码盐值 character varying(200) 599 | ``` 600 | 601 | 602 | ## 常见问题 603 | 604 | 605 | 606 | # 相关资源入口 607 | 608 | -------------------------------------------------------------------------------- /source-build.md: -------------------------------------------------------------------------------- 1 | [返回首页](README.md) 2 | 3 | # 本文简介 4 | 这篇文档改自这篇[原始文档](https://github.com/startalkIM/ejabberd/blob/master/README.md)。 5 | 6 | 源码级部署的目标,并不是提高成功率和易用性,而是帮助理解系统间的调用关系。我们希望当各组件关系很清晰了之后,再进行调整。 7 | 本文的主要目的是帮助使用者在事实上很复杂的后台部署过程中,减少出错的可能。 8 | 9 | # 术语 10 | 11 | 本文用下面符号表示一些用户可替换的变量: 12 | 13 | ${STARTALK} 表示 Startalk 的安装路径,缺省是 `/startalk`。 14 | ${STARTALKHOST} 表示 Startalk 的主机名(域名),缺省是 `startalk.com`。 15 | 16 | # 系统简介 17 | 通信服务就是个状态机。startalk 后台包括连接保持和无状态服务两部分。 18 | 19 | * 状态机 使用[ejabberd](https://www.ejabberd.im/),保证协议扩展性(MQTT,xmpp,sip),容量扩展性和高并发。 20 | * 无状态服务使用java/python,尽可能使二次开发更便捷。 21 | 22 | 23 | # Startalk EJABBERD 24 | 25 | [English Version](README.en.md) 26 | Startalk 的消息交换服务器是基于 ejabberd 开发的,根据业务需要改造而来。修改和扩展了很多 ejaberd 不支持的功能。 27 | 28 | ## 关键功能 29 | 30 | - 分布式:去掉了依赖 mnesia 集群的代码,来支持更大的集群,以及防止由于网络分区导致的集群状态不一致。 31 | - 消息处理:通过 ejabberd 和 kafka 相连接,实现了消息的路由和订阅发布,可以对消息添加更丰富的处理逻辑。 32 | 33 | ## Startalk 模块 34 | ### Startalk 主要包含: 35 | 36 | * [ejabberd](https://github.com/startalkIM/ejabberd): IM 核心组件,负责维持与客户端的长连接和消息路由 37 | * [openresty](https://github.com/startalkIM/openresty_ng): IM 负载均衡组件,负责验证客户端身份,以及转发 http/https 请求到对应的后台服务 38 | * [im_http_service](https://github.com/startalkIM/im_http_service): IM HTTP 接口服务,负责 IM 相关数据的查询、设置以及历史消息同步(基于 tomcat 的 java 服务) 39 | * [qfproxy](https://github.com/startalkIM/qfproxy): IM 文件服务,负责文件的上传和下载(基于 tomcat 的 java服务) 40 | * [push_service](https://github.com/startalkIM/push_service): IM 的 push 服务,用于离线消息的推送(基于 tomcat 的 java 服务) 41 | * [qtalk_serach](https://github.com/startalkIM/search): 提供远程搜索人员和群的服务 42 | * redis: IM 缓存服务 43 | * postgresql: IM 数据库服务 44 | 45 | ### Startalk 各个模块之间的关系 46 | 47 | ![architecture](image/arch.png) 48 | 49 | ## 注意事项 50 | 51 | 以下文档请务必仔细阅读和参照执行,否则可能会创建失败 52 | 53 | 强调几点: 54 | 55 | * 切勿使用 root 账号进行如下操作,很多软件会检查当前用户名称,so 请新建用户来进行操作; 56 | * redis 启动需要加载配置 57 | * 对 startalk 来说,配置中的 domain 非常重要,请务必仔细配置,保持一致。 58 | * 在开始之前请务必保证以下几个端口没有被占用: 59 | 60 | |服务|端口|备注| 61 | | ------------- |:-------------:| -----:| 62 | |openresty服务|8080|| 63 | |im_http_service服务|8005 8009 8081|| 64 | |qfproxy服务|8006 8010 8082|| 65 | |push_service服务|8007 8011 8083|| 66 | |qtalk_search服务|8884|| 67 | |im服务|5202 10050 5280|| 68 | |db|5432|| 69 | |redis|6379|| 70 | 71 | 72 | ## 安装 73 | 74 | 预设条件(如果主机名,用户名和这里的不一致,则需要将安装步骤中的换成自己的名字): 75 | 76 | * 服务器要求:centos7.x 77 | * 主机名用变量 STARTALKHOST,可以替换成自己的主机名 78 | * hosts 添加: 127.0.0.1 ${STARTALKHOST} (sudo vim /etc/hosts) 79 | * 所有项目都安装到 ${STARTALK} 下面 80 | * 安装用户和用户组是:startalk:startalk,要保证 startalk 用户有 sudo 权限 81 | * 家目录下有 download 文件夹,所有文件会下载到该文件夹下 82 | * 数据库用户名密码是 ejabberd:123456,服务地址是:127.0.0.1 83 | * redis 密码是:123456,服务地址是:127.0.0.1 84 | * 数据库初始化 sql 在 doc 目录下 85 | * 保证可访问主机的:5202、8080 端口(关掉防火墙:`sudo systemctl stop firewalld.service`) 86 | * IM 服务的域名是: ${STARTALKHOST} (大家安装线上之前,最好确定好这个值,一旦定了,之后修改的成本就很高,可以参考[domain 修改](https://github.com/startalkIM/ejabberd/wiki/host%E4%BF%AE%E6%94%B9)来修改) 87 | * tls 证书:默认安装用的是一个测试证书,线上使用,请更换 /startalk/ejabberd/etc/ejabberd/server.pem 文件,生成方法见 [securing-ejabberd-with-tls-encryption](https://blog.process-one.net/securing-ejabberd-with-tls-encryption/) 88 | * 出现文件覆盖提示时,输入 yes 敲回车即可 89 | * 安装文档中 # 开头输入的命令表示 root 执行的,$ 开头的命令表示普通用户 90 | 91 | ### 依赖包 92 | 93 | ``` 94 | # yum -y install epel-release 95 | # yum -y update 96 | # yum -y groupinstall Base "Development Tools" "Perl Support" 97 | # yum install -y telnet aspell bzip2 collectd-postgresql collectd-rrdtool collectd.x86_64 curl db4 expat.x86_64 gcc gcc-c++ gd gdbm git gmp ImageMagick java-1.8.0-openjdk java-1.8.0-openjdk-devel libcollection libedit libffi libffi-devel libicu libpcap libtidy libwebp libxml2 libXpm libxslt libyaml.x86_64 mailcap ncurses ncurses npm openssl openssl-devel pcre perl perl-Business-ISBN perl-Business-ISBN-Data perl-Collectd perl-Compress-Raw-Bzip2 perl-Compress-Raw-Zlib perl-Config-General perl-Data-Dumper perl-Digest perl-Digest-MD5 perl-Encode-Locale perl-ExtUtils-Embed perl-ExtUtils-MakeMaker perl-GD perl-HTML-Parser perl-HTML-Tagset perl-HTTP-Date perl-HTTP-Message perl-IO-Compress perl-IO-HTML perl-JSON perl-LWP-MediaTypes perl-Regexp-Common perl-Thread-Queue perl-TimeDate perl-URI python readline recode redis rrdtool rrdtool-perl sqlite systemtap-sdt.x86_64 tk xz zlib rng-tools python36-psycopg2.x86_64 python34-psycopg2.x86_64 python-psycopg2.x86_64 python-pillow python34-pip screen unixODBC unixODBC-devel pkgconfig libSM libSM-devel ncurses-devel libyaml-devel expat-devel libxml2-devel pam-devel pcre-devel gd-devel bzip2-devel zlib-devel libicu-devel libwebp-devel gmp-devel curl-devel postgresql-devel libtidy-devel libmcrypt libmcrypt readline-devel libxslt-devel vim docbook-dtds docbook-style-xslt fop 98 | ``` 99 | 100 | ### 添加host 101 | 102 | 在 `/etc/hosts` 里面添加下面一行: 103 | 104 | ``` 105 | 127.0.0.1 startalk.com 106 | ``` 107 | 请注意如果是生产服务,可以设置自己的域名的 DNS,如果有正确 DNS 域名解析的话,这一步不是必须的。 108 | 109 | ### 新建安装用户 110 | 111 | 新增 startalk 用户: 112 | 113 | ``` 114 | # groupadd startalk 115 | # useradd -g startalk startalk 116 | # passwd startalk 117 | ``` 118 | 119 | 新增 postgresql 数据库用户(用缺省系统包管理安装 postgresql 的用户可以忽略这一步骤): 120 | 121 | ``` 122 | # groupadd postgres 123 | # useradd -g postgres postgres 124 | # passwd postgres 125 | ``` 126 | 127 | ### 新建安装目录 128 | 129 | ``` 130 | # mkdir /startalk 131 | # chown startalk:startalk /startalk 132 | ``` 133 | 134 | ### 新建数据库目录 135 | 136 | ``` 137 | # mkdir /startalk/database 138 | # chown -R postgres:postgres /startalk/database 139 | ``` 140 | 141 | ### 为startalk用户添加sudo权限 142 | 143 | ``` 144 | # visudo 145 | 146 | 在行 147 | root ALL= (ALL) ALL 148 | 行后添加 149 | 150 | startalk ALL= (ALL) ALL 151 | postgres ALL= (ALL) ALL 152 | 153 | 保存后退出 154 | ``` 155 | 156 | ### 下载源码 157 | 158 | ``` 159 | # su - startalk 160 | $ mkdir /startalk/download 161 | $ cd /startalk/download 162 | $ git clone https://github.com/startalkIM/ejabberd.git 163 | $ git clone https://github.com/startalkIM/openresty_ng.git 164 | $ git clone https://github.com/startalkIM/search.git 165 | $ git clone https://github.com/startalkIM/tomcat_projects.git 166 | 167 | $ cp ejabberd/doc/qtalk.sql /startalk/ 168 | $ cp ejabberd/doc/init.sql /startalk/ 169 | ``` 170 | 171 | ### 检测端口使用: 172 | 173 | ``` 174 | # sudo netstat -antlp | egrep "8080|8005|8009|8081|8006|8010|8082|8007|8011|8083|8888|5202|10050|5280|6379" 175 | ``` 176 | 若没有任何输出,则表明没有程序占用startalk使用的端口,否则需要关闭已经在使用端口的程序 177 | 178 | 179 | ### redis安装 180 | 181 | ``` 182 | $ sudo yum install -y redis 183 | $ sudo vim /etc/redis.conf 184 | 将对应的配置修改为下面内容 185 | daemonize yes 186 | requirepass 123456 187 | maxmemory 134217728 188 | 189 | ``` 190 | 191 | 192 | ### redis 启动 193 | 194 | 启动redis 195 | 196 | ``` 197 | $ sudo redis-server /etc/redis.conf 198 | ``` 199 | 200 | 确认启动成功: 201 | 202 | ``` 203 | $ sudo netstat -antlp | grep 6379 204 | tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 8813/redis-server 1 205 | 206 | ``` 207 | 208 | ### 数据库安装 209 | 210 | 建议使用 OS 发行版对应的预编译包,比如在 CentOS 7 里,我们可以执行下面命令搜索并安装 PostgreSQL12: 211 | 212 | > Install the repository RPM: 213 | ``` 214 | sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm 215 | ``` 216 | 217 | > Install PostgreSQL: 218 | ``` 219 | sudo yum install -y postgresql12-server 220 | ``` 221 | 222 | 在 CentOS 7 里,用预编译包安装完 postgresql 之后,可执行文件在 `/usr/pgsql-12/bin` 目录下,基本所有命令无序特殊路径设置。 223 | 224 | ### 初始化数据库实例 225 | 226 | ``` 227 | sudo -u postgres /usr/pgsql-12/bin/initdb -D /startalk/database 228 | ``` 229 | 230 | ### 数据库启动 231 | 232 | ``` 233 | sudo -u postgres /usr/pgsql-12/bin/pg_ctl -D /startalk/database start 234 | ``` 235 | 236 | 确认启动成功 237 | ``` 238 | $ sudo netstat -antlp | grep 5432 239 | ``` 240 | 输出看上去应该像下面这样: 241 | 242 | ``` 243 | tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 4751/postmaster 244 | 245 | ``` 246 | ### 初始化数据库 247 | 248 | 1. 初始化DB结构 249 | 250 | ``` 251 | 252 | $ psql -U postgres -d postgres -f /startalk/qtalk.sql 253 | $ psql -U postgres -d ejabberd -f /startalk/init.sql 254 | ``` 255 | 256 | 2. 初始化DB user: ejabberd的密码 257 | 258 | ``` 259 | $ psql -U postgres -d postgres -c "ALTER USER ejabberd WITH PASSWORD '123456';" 260 | ``` 261 | 262 | 3. psql 连接数据库 263 | 264 | ``` 265 | $ psql -U postgres -d ejabberd -h 127.0.0.1 266 | psql (12.6) 267 | 268 | ejabberd=# select * from host_users; 269 | ``` 270 | 4. 如果 ejabberd 和 postgresql 数据库不在同一服务器,则参考 postgresql 的文档修改数据库的 `pg_hba.conf` 文件允许 ejabberd 的服务器访问数据库服务器。 271 | 272 | ### openresty安装 273 | 274 | 以 CentOS 7 为例,参考[openresty 官网](http://openresty.org/en/linux-packages.html) 275 | 我们可以用包的方法快速安装 openresty: 276 | 277 | ``` 278 | wget https://openresty.org/package/centos/openresty.repo 279 | sudo mv openresty.repo /etc/yum.repos.d/ 280 | sudo yum check-update 281 | sudo yum install openresty 282 | ``` 283 | 284 | ### openresty 启动 285 | 286 | openresty 包安装之后位于 `/usr/local/openresty` 287 | 288 | 启动方法是: 289 | 290 | ``` 291 | sudo /usr/local/openresty/nginx/sbin/nginx 292 | ``` 293 | 294 | 执行下面命令确认启动成功: 295 | 296 | ``` 297 | $ sudo netstat -antlp | grep 8080 298 | ``` 299 | 输出看上去应该像下面这样: 300 | 301 | ``` 302 | tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 23438/nginx: master 303 | ``` 304 | ### 为 Startalk 配置 OpenResty 305 | 306 | 请参考[Startalk OpenResty 配置](https://github.com/startalkIM/openresty_ng/blob/master/README_CN.md) 把 Startalk 的 OpenResty 相关配置下载、配置上。 307 | 然后重启 OpenResty: 308 | 309 | ``` 310 | sudo killall nginx 311 | sudo /usr/local/openresty/nginx/sbin/nginx 312 | ``` 313 | 314 | ### 安装 erlang 315 | 316 | ``` 317 | $ cd /startalk/download 318 | $ wget http://erlang.org/download/otp_src_19.3.tar.gz 319 | $ tar -zxvf otp_src_19.3.tar.gz 320 | $ cd otp_src_19.3 321 | $ ./configure --prefix=/startalk/erlang1903 322 | $ make 323 | $ make install 324 | ``` 325 | 326 | 把执行路径添加到 PATH 环境变量 327 | 328 | ``` 329 | $ vim ~/.bash_profile 330 | 331 | ---------------------------------- 332 | # User specific environment and startup programs 333 | ERLANGPATH=/startalk/erlang1903 334 | PATH=$PATH:$HOME/bin:$ERLANGPATH/bin 335 | ---------------------------------- 336 | ``` 337 | 338 | ``` 339 | $ . ~/.bash_profile 340 | ``` 341 | 342 | 执行下面命令验证 erlang 是否安装成功: 343 | 344 | ``` 345 | $ erl 346 | ``` 347 | 输出看上去下面这样就是成功了: 348 | ``` 349 | Erlang/OTP 19 [erts-8.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] 350 | 351 | Eshell V8.3 (abort with ^G) 352 | 1> 353 | ``` 354 | 355 | ### 安装ejabberd 356 | 357 | ``` 358 | $ cd /startalk/download 359 | $ cd ejabberd/ 360 | $ ./configure --prefix=/startalk/ejabberd --with-erlang=/startalk/erlang1903 --enable-pgsql --enable-full-xml 361 | $ make 362 | $ make install 363 | $ cp ejabberd.yml.qunar /startalk/ejabberd/etc/ejabberd/ejabberd.yml 364 | $ cp ejabberdctl.cfg.qunar /startalk/ejabberd/etc/ejabberd/ejabberdctl.cfg 365 | ``` 366 | ### 启动 ejabberd 367 | 368 | ``` 369 | $ cd /startalk/ejabberd 370 | $ ./sbin/ejabberdctl start 371 | ``` 372 | 373 | 验证 ejabberd 是否启动成功: 374 | ``` 375 | $ ps -ef | grep 's ejabberd' 376 | startalk 23515 1 4 09:58 ? 00:00:03 /startalk/erlang1903/lib/erlang/erts-8.3/bin/beam.smp -K true -P 250000 -- -root /startalk/erlang1903/lib/erlang -progname erl -- -home /home/startalk -- -name ejabberd@startalk.com -noshell -noinput -noshell -noinput -mnesia dir "/startalk/ejabberd/var/lib/ejabberd" -ejabberd log_rate_limit 20000 log_rotate_size 504857600 log_rotate_count 41 log_rotate_date "$D0" -s ejabberd -smp auto start 377 | ``` 378 | 379 | ### 安装java服务 380 | > /startalk/download/tomcat_projects/ 下的是打好包的三个java服务,自己也可以使用源码打包,然后自己部署 381 | 382 | ``` 383 | $ cd /startalk/download/ 384 | $ cp -rf tomcat_projects /startalk/tomcat 385 | $ cd /startalk/tomcat 386 | 387 | 修改推送服务的地址 388 | 389 | $ vim /startalk/tomcat/push_service/webapps/push_service/WEB-INF/classes/app.properties 390 | #使用星语push url, 将ip换为服务器ip 391 | qtalk_push_url=http://ip:8091/qtapi/token/sendPush.qunar 392 | #使用星语push key 393 | qtalk_push_key=12342a14-e6c0-463f-90a0-92b8faec4063 394 | 395 | 修改导航地址和扩展键盘: 396 | $ vim /startalk/tomcat/im_http_service/webapps/im_http_service/WEB-INF/classes/nav.json 397 | $ vim /startalk/tomcat/im_http_service/webapps/im_http_service/WEB-INF/classes/androidqtalk.json 398 | $ vim /startalk/tomcat/im_http_service/webapps/im_http_service/WEB-INF/classes/androidstartalk.json 399 | $ vim /startalk/tomcat/im_http_service/webapps/im_http_service/WEB-INF/classes/iosqtalk.json 400 | $ vim /startalk/tomcat/im_http_service/webapps/im_http_service/WEB-INF/classes/iosstartalk.json 401 | 402 | 将ip替换成对应机器的ip地址(sed -i "s/ip/xxx.xxx.xxx.xxx/g" 或者在vim内 :%s/ip/xxx.xxx.xxx.xxx/g) 403 | 404 | ``` 405 | 406 | ### 启动java服务 407 | ``` 408 | $ cd /startalk/tomcat/im_http_service 409 | $ ./bin/startup.sh 410 | 411 | 412 | $ cd /startalk/tomcat/qfproxy 413 | $ ./bin/startup.sh 414 | 415 | $ cd /startalk/tomcat/push_service 416 | $ ./bin/startup.sh 417 | ``` 418 | 419 | 420 | ### 确认服务启动成功 421 | 422 | ``` 423 | $ sudo netstat -antlp | egrep '8081|8082|8083|8009|8010|8011|8005|8006|8007' 424 | ``` 425 | 输出看上去像下面这样: 426 | 427 | ``` 428 | tcp6 0 0 127.0.0.1:8007 :::* LISTEN 23853/java 429 | tcp6 0 0 :::8009 :::* LISTEN 23748/java 430 | tcp6 0 0 :::8010 :::* LISTEN 23785/java 431 | tcp6 0 0 :::8011 :::* LISTEN 23853/java 432 | tcp6 0 0 :::8081 :::* LISTEN 23748/java 433 | tcp6 0 0 :::8082 :::* LISTEN 23785/java 434 | tcp6 0 0 :::8083 :::* LISTEN 23853/java 435 | tcp6 0 0 127.0.0.1:8005 :::* LISTEN 23748/java 436 | tcp6 0 0 127.0.0.1:8006 :::* LISTEN 23785/java 437 | ``` 438 | 439 | ### 安装后端搜索服务 440 | 441 | #### 前提 442 | + openssl version >= 1.02 443 | + python3.7 及以上, 以3.9.2为例 444 | ``` 445 | cd /startalk/download && wget https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tgz 446 | tar -zxvf Python-3.9.2.tgz 447 | cd Python-3.9.2 448 | ./configure --prefix=/startalk/python392 449 | make && make install 450 | ``` 451 | * 添加到 `.bash_profile` 452 | * 453 | ``` 454 | vim ~/.bash_profile 455 | PYTHONPATH=/startalk/python392 456 | PATH=$PATH:$PYTHONPATH/bin 457 | :wq 458 | source ~/.bash_profile 459 | ``` 460 | 461 | * (可选) 建议使用virtualenv部署模块所需环境 462 | > 升级pip 463 | ``` 464 | /startalk/python392/bin/python3.9 -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple 465 | ``` 466 | > 下载安装virtualenv 467 | ``` 468 | pip3.9 install -U virtualenv -i https://pypi.tuna.tsinghua.edu.cn/simple 469 | ``` 470 | > 创建虚拟环境 471 | ``` 472 | cp -rf /startalk/download/search /startalk/ && cd /startalk/search && virtualenv --system-site-packages -p python3.9 ./venv 473 | ``` 474 | > 启动环境 475 | ``` 476 | source venv/bin/activate 477 | ``` 478 | 479 | #### 安装: 480 | * 配置conf/configure.ini 481 | * 安装依赖, 使用-i 国内源下载项目 482 | ``` 483 | pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple 484 | ``` 485 | * 启动项目 486 | ``` 487 | supervisord -c /startalk/search/conf/supervisor.conf 488 | ``` 489 | 490 | #### 确认服务正常: 491 | ``` 492 | tail -100f /startalk/search/log/access.log 493 | ``` 494 | -------------------------------------------------------------------------------- 495 | 496 | 497 | 可以执行以下脚本来检查一些常见的错误: 下载该文件[check.sh](https://github.com/startalkIM/openresty_ng/blob/master/tools/check.sh) 498 | 499 | ``` 500 | # sed -i 's/ip/自己的ip/g' ./check.sh 501 | # chmod +x check.sh 502 | # ./check.sh 503 | ``` 504 | 505 | 如果发现有提示:"ip的5202端口未开启外网访问,请开启该端口访问或者关掉防火墙",请在服务器上使用telnet ip 5202检查是否可以连上,一般是因为防火墙限制了或者端口就没监听。 506 | 507 | 到此,服务端已经安装完成。 508 | 请下载[startalk客户端](https://i.startalk.im/home/#/download) 509 | 510 | 客户端配置导航地址:[http://ip:8080/newapi/nck/qtalk_nav.qunar](http://ip:8080/newapi/nck/qtalk_nav.qunar),使用账号:admin,密码:testpassword登陆(将ip替换成自己服务器的ip) 511 | 512 | 客户端配置导航的说明[配置导航](https://im.qunar.com/#/platform/access_guide/config_navs?id=config_navs) 513 | 514 | 可以在二维码生成网站[http://www.liantu.com/](http://www.liantu.com/)生成导航地址的二维码,然后通过扫码在手机客户端添加导航 515 | 516 | 请参考wiki和接口文档进行相关了解 517 | 518 | 519 | 520 | ## 分支和PR 521 | 522 | 当前,我们项目的分支是: 523 | 524 | * master(主干分支) 525 | * release(用于合并到master的准发布分支) 526 | * develop(当前开发分支) 527 | * v1.0(1.0版本的分支) 528 | * v1.1(1.1版本的分支,当前最新稳定分支) 529 | * v2.0(2.0分支版本,支持Erlang/OTP 21.2) 530 | 531 | 532 | 大家提交pull request的时候,可以根据不同分支的功能,合并到不同的分支 533 | 534 | ## ejabberd 相关 wiki地址 535 | 536 | [wiki页](https://github.com/startalkIM/ejabberd/wiki) 537 | 538 | ## ejabberd 配置文件修改 539 | 540 | 参考文档 [setting.md](https://github.com/startalkIM/ejabberd/blob/master/doc/setting.md) 541 | 542 | ## ejabberd 接口文档 543 | 544 | 参考文档 [interface.md](https://github.com/startalkIM/ejabberd/blob/master/doc/interface.md) 545 | 546 | ## 开发指南 547 | 548 | - [developer guide](https://docs.ejabberd.im/developer/guide/) 549 | 550 | ## 日志路径 551 | 552 | 整个系统运行有如下日志可以供参考: 553 | 554 | * postgresql 数据库日志:缺省输出到标准输出,请参考 postgresql 配置文件修改配置(缺省是 ${STARTALK}/database/postgresql.conf),将其定向到合适的路径 555 | * redis 日志:系统安装的话缺省是:`/var/log/redis/redis.log`,若自己编译安装请自行查找位置 556 | * ejabberd 日志:缺省是 `${STARTALK}/ejabberd/var/log/ejabberd/` 557 | * openresty 日志:缺省是 `${STARTALK}/openresty/nginx/logs/`, 系统安装包的话,一般是在 `/usr/local/openresty/nginx/logs/` 558 | * 几个 Java 进程日志:缺省在 `${STARTALK}/tomcat/` 里头,有一些 Java 的应用,比如最重要的是:`${STARTALK}/tomcat/im_http_service/logs/`,可以关注里面的 `catalina.out`,其它还有 `qfproxy` 和 `push_service` 对应的 log 目录。 559 | 560 | 这些日志路径里有对应的运行日志,如果启动或者其他方面的失败,可以耐心看看这些目录里头的日志文件,里面有不少很有价值的信息。 561 | 562 | 563 | # 问题反馈 564 | 565 | - app@startalk.im(邮件) 566 | - 1065751631(QQ群) 567 | - QQ群二维码 ![qq](image/qq2.png) 568 | 569 | [返回首页](README.md) 570 | --------------------------------------------------------------------------------