├── push-connector ├── config │ ├── chat.comsince.cn.jks │ ├── chat.comsince.cn.trustkeystore.jks │ └── application.properties ├── jvm.ini ├── push-connector.bat └── push-connector ├── push-api ├── config │ └── application.properties ├── jvm.ini ├── push-api.bat ├── push-api └── Readme.md ├── push-group ├── config │ └── application.properties ├── jvm.ini ├── push-group.bat └── push-group ├── fshare-on-windows.md └── Readme.md /push-connector/config/chat.comsince.cn.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsharechat/chat-server-release/HEAD/push-connector/config/chat.comsince.cn.jks -------------------------------------------------------------------------------- /push-connector/config/chat.comsince.cn.trustkeystore.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsharechat/chat-server-release/HEAD/push-connector/config/chat.comsince.cn.trustkeystore.jks -------------------------------------------------------------------------------- /push-api/config/application.properties: -------------------------------------------------------------------------------- 1 | # Spring boot application 2 | spring.application.name=spring-boot-web-push-api 3 | spring.main.allow-bean-definition-overriding=true 4 | ## Dubbo Registry 5 | dubbo.registry.address=zookeeper://zookeeper:2181 6 | 7 | ## http port 8 | server.port=8080 9 | ## redis address 10 | #push.redis.address=redis://172.16.178.28:22126 -------------------------------------------------------------------------------- /push-connector/config/application.properties: -------------------------------------------------------------------------------- 1 | # wss ssl 配置,这里配置jks需要指定其绝对路径地址 2 | push.ssl.keystore=/data/boot/push-connector/config/chat.comsince.cn.jks 3 | push.ssl.truststore=/data/boot/push-connector/config/chat.comsince.cn.trustkeystore.jks 4 | push.ssl.password=123456 5 | ## Dubbo Registry 6 | dubbo.registry.address=zookeeper://zookeeper:2181 7 | 8 | ## kafka broker 9 | #push.kafka.broker=kafka:9092 10 | 11 | ## kurento client url 12 | kurento.clientUrl=ws://media.comsince.cn:8888/kurento 13 | 14 | ## minio url 15 | minio.url=https://media.comsince.cn 16 | ## minio access_key 17 | minio.access_key= 18 | ## minio secret_key 19 | minio.secret_key= 20 | 21 | -------------------------------------------------------------------------------- /push-group/config/application.properties: -------------------------------------------------------------------------------- 1 | 2 | ## Dubbo 注册中心 3 | dubbo.registry.address=zookeeper://zookeeper:2181 4 | ## 绑定dubbo 本机host地址,防止dubbo无法绑定服务地址,导致不同机器无法访问服务,push-group与push-connector部署在不同机器时最好设置 5 | #dubbo.protocol.host=172.16.0.2 6 | 7 | #云短信厂商,1:代表阿里云短信 2: 代表腾讯云短信 8 | sms.cp=0 9 | # 应用id 10 | sms.appid=LTAI4Ff1jtqrSr3rkHMKEnfs 11 | # 应用key 12 | sms.appkey=gG33mvmMAxGYol7Vd1AEG6InRK9VCD 13 | # 模板id 14 | sms.templateId=SMS_180355435 15 | # 短信签名由于编码问题,请到相应的代码里面设置 16 | 17 | # 短信超级验证码,正式上线请修改 18 | sms.superCode=66666 19 | 20 | # 是否使用内置数据库 1: 表示使用 0: 使用mySql 21 | im.embed_db=0 22 | # jdbc url 23 | im.jdbc_url=jdbc:mysql://mysql:3306/fsharechat?useSSL=false&serverTimezone=GMT&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf8 24 | # mysql数据库访问用户名 25 | im.user=root 26 | #mysql数据库访问密码 27 | im.password=123456 28 | -------------------------------------------------------------------------------- /push-api/jvm.ini: -------------------------------------------------------------------------------- 1 | #-Xrunjdwp:transport=dt_socket,address=71099,server=y,suspend=n 2 | -Xmx300m 3 | -Xms300m 4 | -Xmn100m 5 | -XX:SurvivorRatio=8 6 | #-XX:PermSize=256m 7 | -server 8 | -verbose:gc 9 | -XX:ErrorFile=crash.log 10 | -Xloggc:gc.log 11 | -XX:-UseGCLogFileRotation 12 | -XX:GCLogFileSize=1024K 13 | -XX:+PrintGCDateStamps 14 | -XX:+PrintGCTimeStamps 15 | -XX:+PrintGCDetails 16 | -XX:+PrintTenuringDistribution 17 | -XX:+PrintCommandLineFlags 18 | -XX:+DisableExplicitGC 19 | -XX:+UseConcMarkSweepGC 20 | -XX:ParallelCMSThreads=2 21 | -XX:+CMSClassUnloadingEnabled 22 | -XX:+UseCMSCompactAtFullCollection 23 | -XX:CMSInitiatingOccupancyFraction=80 24 | -Djava.io.tmpdir=/dev/shm 25 | -Dfile.encoding=UTF-8 26 | -Dsun.jnu.encoding=UTF-8 27 | -Dsun.net.http.allowRestrictedHeaders=true 28 | # 服务器端口配置,配置在这里可以帮助启动脚本识别服务器启动的端口.必选,否则自启动脚本无法检查服务运作状态 29 | #-Dserver.port=8080 30 | -------------------------------------------------------------------------------- /push-group/jvm.ini: -------------------------------------------------------------------------------- 1 | #-Xrunjdwp:transport=dt_socket,address=71099,server=y,suspend=n 2 | -Xmx300m 3 | -Xms300m 4 | -Xmn100m 5 | -XX:SurvivorRatio=8 6 | #-XX:PermSize=256m 7 | -server 8 | -verbose:gc 9 | -XX:ErrorFile=crash.log 10 | -Xloggc:gc.log 11 | -XX:-UseGCLogFileRotation 12 | -XX:GCLogFileSize=1024K 13 | -XX:+PrintGCDateStamps 14 | -XX:+PrintGCTimeStamps 15 | -XX:+PrintGCDetails 16 | -XX:+PrintTenuringDistribution 17 | -XX:+PrintCommandLineFlags 18 | -XX:+DisableExplicitGC 19 | -XX:+UseConcMarkSweepGC 20 | -XX:ParallelCMSThreads=2 21 | -XX:+CMSClassUnloadingEnabled 22 | -XX:+UseCMSCompactAtFullCollection 23 | -XX:CMSInitiatingOccupancyFraction=80 24 | -Djava.io.tmpdir=/dev/shm 25 | -Dfile.encoding=UTF-8 26 | -Dsun.jnu.encoding=UTF-8 27 | -Dsun.net.http.allowRestrictedHeaders=true 28 | # 服务器端口配置,配置在这里可以帮助启动脚本识别服务器启动的端口.必选,否则自启动脚本无法检查服务运作状态 29 | #-Dserver.port=8081 30 | -------------------------------------------------------------------------------- /push-connector/jvm.ini: -------------------------------------------------------------------------------- 1 | #-Xrunjdwp:transport=dt_socket,address=73099,server=y,suspend=n 2 | -Xmx300m 3 | -Xms300m 4 | -Xmn100m 5 | -XX:SurvivorRatio=8 6 | #-XX:PermSize=256m 7 | -server 8 | -verbose:gc 9 | -XX:ErrorFile=crash.log 10 | -Xloggc:gc.log 11 | -XX:-UseGCLogFileRotation 12 | -XX:GCLogFileSize=1024K 13 | -XX:+PrintGCDateStamps 14 | -XX:+PrintGCTimeStamps 15 | -XX:+PrintGCDetails 16 | -XX:+PrintTenuringDistribution 17 | -XX:+PrintCommandLineFlags 18 | -XX:+DisableExplicitGC 19 | -XX:+UseConcMarkSweepGC 20 | -XX:ParallelCMSThreads=2 21 | -XX:+CMSClassUnloadingEnabled 22 | -XX:+UseCMSCompactAtFullCollection 23 | -XX:CMSInitiatingOccupancyFraction=80 24 | -Djava.io.tmpdir=/dev/shm 25 | -Dfile.encoding=UTF-8 26 | -Dsun.jnu.encoding=UTF-8 27 | #-Dsun.net.http.allowRestrictedHeaders=true 28 | # 服务器端口配置,配置在这里可以帮助启动脚本识别服务器启动的端口.必选,否则自启动脚本无法检查服务运作状态 29 | # 这里是至dubbo的server的端口 30 | -Dserver.port=7461 31 | # 不启用ECC加密算法,防止firefox报错 32 | #-Dcom.sun.net.ssl.enableECC=false 33 | #-Djsse.enableSNIExtension=false 34 | #-Djavax.net.debug=all 35 | -------------------------------------------------------------------------------- /push-api/push-api.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | set "CURRENT_DIR=%cd%" 4 | if not "%FSHARECHAT_PUSH_API_HOME%" == "" goto gotHome 5 | set "FSHARECHAT_PUSH_API_HOME=%CURRENT_DIR%" 6 | if exist "%FSHARECHAT_PUSH_API_HOME%\push-api.bat" goto okHome 7 | cd .. 8 | set "FSHARECHAT_PUSH_API_HOME=%cd%" 9 | cd "%CURRENT_DIR%" 10 | :gotHome 11 | if exist "%FSHARECHAT_PUSH_API_HOME%\push-api.bat" goto okHome 12 | echo The FSHARECHAT_PUSH_API_HOME environment variable is not defined correctly 13 | echo This environment variable is needed to run this program 14 | goto end 15 | :okHome 16 | 17 | rem Set JavaHome if it exists 18 | if exist { "%JAVA_HOME%\bin\java" } ( 19 | set "JAVA="%JAVA_HOME%\bin\java"" 20 | ) else ( 21 | set "JAVA="java"" 22 | ) 23 | 24 | echo Using JAVA_HOME: "%JAVA_HOME%" 25 | echo Using FSHARECHAT_PUSH_API_HOME: "%FSHARECHAT_PUSH_API_HOME%" 26 | 27 | rem set LOG_CONSOLE_LEVEL=info 28 | rem set LOG_FILE_LEVEL=fine 29 | set JAVA_OPTS= 30 | set JAVA_OPTS_SCRIPT=-XX:+HeapDumpOnOutOfMemoryError -Djava.awt.headless=true 31 | set FSHARECHAT_PUSH_API_PATH=%FSHARECHAT_PUSH_API_HOME% 32 | set LOG_FILE=%FSHARECHAT_PUSH_API_HOME%\config\logback.xml 33 | set CONFI_DIR = %FSHARECHAT_PUSH_API_HOME%\config\ 34 | 35 | for /F %%i in ('dir %FSHARECHAT_PUSH_API_HOME%\lib\ /B') do ( set JAR_NAME=%%i) 36 | echo Push-API JAR_NAME: "%JAR_NAME%" 37 | rem Use the Hotspot garbage-first collector. 38 | set JAVA_OPTS=%JAVA_OPTS% -XX:+UseG1GC 39 | 40 | rem Have the JVM do less remembered set work during STW, instead 41 | rem preferring concurrent GC. Reduces p99.9 latency. 42 | set JAVA_OPTS=%JAVA_OPTS% -XX:G1RSetUpdatingPauseTimePercent=5 43 | 44 | rem Main G1GC tunable: lowering the pause target will lower throughput and vise versa. 45 | rem 200ms is the JVM default and lowest viable setting 46 | rem 1000ms increases throughput. Keep it smaller than the timeouts. 47 | set JAVA_OPTS=%JAVA_OPTS% -XX:MaxGCPauseMillis=500 48 | 49 | 50 | rem rem GC logging options -- uncomment to enable 51 | 52 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCDetails 53 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCDateStamps 54 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintHeapAtGC 55 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintTenuringDistribution 56 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCApplicationStoppedTime 57 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintPromotionFailure 58 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:PrintFLSStatistics=1 59 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+UseGCLogFileRotation 60 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:NumberOfGCLogFiles=10 61 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:GCLogFileSize=10M" 62 | 63 | start javaw -server %JAVA_OPTS% %JAVA_OPTS_SCRIPT% -jar %FSHARECHAT_PUSH_API_HOME%\lib\%JAR_NAME% --spring.config.additional-location=file:.\config\ 64 | rem > %FSHARECHAT_PUSH_API_HOME%\logs\push-api.log 2<&1 65 | -------------------------------------------------------------------------------- /push-group/push-group.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | set "CURRENT_DIR=%cd%" 4 | if not "%FSHARECHAT_PUSH_GROUP_HOME%" == "" goto gotHome 5 | set "FSHARECHAT_PUSH_GROUP_HOME=%CURRENT_DIR%" 6 | if exist "%FSHARECHAT_PUSH_GROUP_HOME%\push-group.bat" goto okHome 7 | cd .. 8 | set "FSHARECHAT_PUSH_GROUP_HOME=%cd%" 9 | cd "%CURRENT_DIR%" 10 | :gotHome 11 | if exist "%FSHARECHAT_PUSH_GROUP_HOME%\push-group.bat" goto okHome 12 | echo The FSHARECHAT_PUSH_GROUP_HOME environment variable is not defined correctly 13 | echo This environment variable is needed to run this program 14 | goto end 15 | :okHome 16 | 17 | rem Set JavaHome if it exists 18 | if exist { "%JAVA_HOME%\bin\java" } ( 19 | set "JAVA="%JAVA_HOME%\bin\java"" 20 | ) else ( 21 | set "JAVA="java"" 22 | ) 23 | 24 | echo Using JAVA_HOME: "%JAVA_HOME%" 25 | echo Using FSHARECHAT_PUSH_GROUP_HOME: "%FSHARECHAT_PUSH_GROUP_HOME%" 26 | 27 | rem set LOG_CONSOLE_LEVEL=info 28 | rem set LOG_FILE_LEVEL=fine 29 | set JAVA_OPTS= 30 | set JAVA_OPTS_SCRIPT=-XX:+HeapDumpOnOutOfMemoryError -Djava.awt.headless=true 31 | set FSHARECHAT_PUSH_GROUP_PATH=%FSHARECHAT_PUSH_GROUP_HOME% 32 | set LOG_FILE=%FSHARECHAT_PUSH_GROUP_HOME%\config\logback.xml 33 | set CONFI_DIR = %FSHARECHAT_PUSH_GROUP_HOME%\config\ 34 | 35 | for /F %%i in ('dir %FSHARECHAT_PUSH_GROUP_HOME%\lib\ /B') do ( set JAR_NAME=%%i) 36 | echo Push-Group JAR_NAME: "%JAR_NAME%" 37 | rem Use the Hotspot garbage-first collector. 38 | set JAVA_OPTS=%JAVA_OPTS% -XX:+UseG1GC 39 | 40 | rem Have the JVM do less remembered set work during STW, instead 41 | rem preferring concurrent GC. Reduces p99.9 latency. 42 | set JAVA_OPTS=%JAVA_OPTS% -XX:G1RSetUpdatingPauseTimePercent=5 43 | 44 | rem Main G1GC tunable: lowering the pause target will lower throughput and vise versa. 45 | rem 200ms is the JVM default and lowest viable setting 46 | rem 1000ms increases throughput. Keep it smaller than the timeouts. 47 | set JAVA_OPTS=%JAVA_OPTS% -XX:MaxGCPauseMillis=500 48 | 49 | 50 | rem rem GC logging options -- uncomment to enable 51 | 52 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCDetails 53 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCDateStamps 54 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintHeapAtGC 55 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintTenuringDistribution 56 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCApplicationStoppedTime 57 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintPromotionFailure 58 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:PrintFLSStatistics=1 59 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+UseGCLogFileRotation 60 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:NumberOfGCLogFiles=10 61 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:GCLogFileSize=10M" 62 | 63 | start javaw -server %JAVA_OPTS% %JAVA_OPTS_SCRIPT% -jar %FSHARECHAT_PUSH_GROUP_HOME%\lib\%JAR_NAME% --spring.config.additional-location=file:.\config\ 64 | rem > %FSHARECHAT_PUSH_GROUP_HOME%\logs\push-group.log 2<&1 65 | -------------------------------------------------------------------------------- /push-connector/push-connector.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | set "CURRENT_DIR=%cd%" 4 | if not "%FSHARECHAT_PUSH_CONNECTOR_HOME%" == "" goto gotHome 5 | set "FSHARECHAT_PUSH_CONNECTOR_HOME=%CURRENT_DIR%" 6 | if exist "%FSHARECHAT_PUSH_CONNECTOR_HOME%\push-connector.bat" goto okHome 7 | cd .. 8 | set "FSHARECHAT_PUSH_CONNECTOR_HOME=%cd%" 9 | cd "%CURRENT_DIR%" 10 | :gotHome 11 | if exist "%FSHARECHAT_PUSH_CONNECTOR_HOME%\push-connector.bat" goto okHome 12 | echo The FSHARECHAT_PUSH_CONNECTOR_HOME environment variable is not defined correctly 13 | echo This environment variable is needed to run this program 14 | goto end 15 | :okHome 16 | 17 | rem Set JavaHome if it exists 18 | if exist { "%JAVA_HOME%\bin\java" } ( 19 | set "JAVA="%JAVA_HOME%\bin\java"" 20 | ) else ( 21 | set "JAVA="java"" 22 | ) 23 | 24 | echo Using JAVA_HOME: "%JAVA_HOME%" 25 | echo Using FSHARECHAT_PUSH_CONNECTOR_HOME: "%FSHARECHAT_PUSH_CONNECTOR_HOME%" 26 | 27 | rem set LOG_CONSOLE_LEVEL=info 28 | rem set LOG_FILE_LEVEL=fine 29 | set JAVA_OPTS= 30 | set JAVA_OPTS_SCRIPT=-XX:+HeapDumpOnOutOfMemoryError -Djava.awt.headless=true 31 | set FSHARECHAT_PUSH_CONNECTOR_PATH=%FSHARECHAT_PUSH_CONNECTOR_HOME% 32 | set LOG_FILE=%FSHARECHAT_PUSH_CONNECTOR_HOME%\config\logback.xml 33 | set CONFI_DIR = %FSHARECHAT_PUSH_CONNECTOR_HOME%\config\ 34 | 35 | for /F %%i in ('dir %FSHARECHAT_PUSH_CONNECTOR_HOME%\lib\ /B') do ( set JAR_NAME=%%i) 36 | echo Push-Connector JAR_NAME: "%JAR_NAME%" 37 | rem Use the Hotspot garbage-first collector. 38 | set JAVA_OPTS=%JAVA_OPTS% -XX:+UseG1GC 39 | 40 | rem Have the JVM do less remembered set work during STW, instead 41 | rem preferring concurrent GC. Reduces p99.9 latency. 42 | set JAVA_OPTS=%JAVA_OPTS% -XX:G1RSetUpdatingPauseTimePercent=5 43 | 44 | rem Main G1GC tunable: lowering the pause target will lower throughput and vise versa. 45 | rem 200ms is the JVM default and lowest viable setting 46 | rem 1000ms increases throughput. Keep it smaller than the timeouts. 47 | set JAVA_OPTS=%JAVA_OPTS% -XX:MaxGCPauseMillis=500 48 | 49 | 50 | rem rem GC logging options -- uncomment to enable 51 | 52 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCDetails 53 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCDateStamps 54 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintHeapAtGC 55 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintTenuringDistribution 56 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCApplicationStoppedTime 57 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintPromotionFailure 58 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:PrintFLSStatistics=1 59 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:+UseGCLogFileRotation 60 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:NumberOfGCLogFiles=10 61 | rem set JAVA_OPTS=%JAVA_OPTS% -XX:GCLogFileSize=10M" 62 | 63 | start javaw -server %JAVA_OPTS% %JAVA_OPTS_SCRIPT% -jar %FSHARECHAT_PUSH_CONNECTOR_HOME%\lib\%JAR_NAME% --spring.config.additional-location=file:.\config\ 64 | rem > %FSHARECHAT_PUSH_CONNECTOR_HOME%\logs\push-connector.log 2<&1 65 | -------------------------------------------------------------------------------- /fshare-on-windows.md: -------------------------------------------------------------------------------- 1 | 主要说明在windows部署步骤 2 | 3 | # 基础环境 4 | 基础环境同centos.主要包括`zookeeper`,`mysql5.7`,`minio`,`JDK1.8` 5 | 6 | **NOTE:** 在运行之前请确保`zookeeper`,`mysql`已经部署成功. `minio`是对象存储服务器,在发送图片,文件类型类型消息时需要使用.在运行之前请检查是否安装`Jdk` 7 | 8 | # 安装包 9 | 下载如下安装包,解压文件到任意目录即可 10 | * [飞享windows安装包](https://media.comsince.cn/minio-bucket-file-name/fshare-chat-windows-pro.tar.gz) 11 | 12 | # 配置 13 | 解压成功后,会看到`boot`如下目录 14 | 15 | ```shell 16 | boot 17 | ├── download 18 | │   └── chat-debug.apk 19 | ├── push-connector 20 | │   ├── config 21 | │   │   ├── application.properties 22 | │   │   ├── chat.comsince.cn.jks 23 | │   │   ├── chat.comsince.cn.trustkeystore.jks 24 | │   │   └── logback.xml 25 | │   ├── jvm.ini 26 | │   ├── lib 27 | │   │   └── spring-boot-dubbo-push-connector-1.2.3.jar 28 | │   ├── logs 29 | │   │   ├── push-connector-error.log 30 | │   │   ├── push-connector-error.log.20201013 31 | │   │   ├── push-connector.log 32 | │   │   └── push-connector.log.20201013 33 | │   ├── push-connector 34 | │   └── push-connector.bat 35 | └── push-group 36 | ├── config 37 | │   └── application.properties 38 | ├── jvm.ini 39 | ├── lib 40 | │   └── spring-boot-web-push-group-1.2.3.jar 41 | ├── logs 42 | │   ├── push-group-error.log 43 | │   ├── push-group-error.log.20201013 44 | │   ├── push-group.log 45 | │   └── push-group.log.20201013 46 | ├── push-group 47 | └── push-group.bat 48 | 49 | ``` 50 | 51 | ## push-connector配置 52 | 53 | > 修改`push-connector\config\application.properties` 54 | 55 | ```yaml 56 | # wss ssl 配置,这里配置jks需要指定其绝对路径地址.测试演示可以先不起动ssl.这里做配置为空即可 57 | push.ssl.keystore= 58 | push.ssl.truststore= 59 | push.ssl.password= 60 | ## Dubbo Registry 61 | dubbo.registry.address=zookeeper://{修改这里为你的zookeeper地址}:2181 62 | 63 | ## kafka broker 64 | #push.kafka.broker=kafka:9092 65 | 66 | ## 多人音视频媒体服务,默认使用公网服务,可先暂时不用修改 67 | kurento.clientUrl=ws://media.comsince.cn:8888/kurento 68 | 69 | ## minio对象存储,如果暂时不需要支持文件,图片,视频类消息发送,可以暂时不用配置 70 | minio.url=https://media.comsince.cn 71 | ## minio access_key 72 | minio.access_key= 73 | ## minio secret_key 74 | minio.secret_key= 75 | ``` 76 | 77 | ## push-group配置 78 | 79 | > 修改`push-group\config\application.properties` 80 | 81 | ```yaml 82 | 83 | ## Dubbo 注册中心 84 | dubbo.registry.address=zookeeper://{修改这里为你的zookeeper地址}:2181 85 | 86 | ## 绑定dubbo 本机host地址,防止dubbo无法绑定服务地址,导致不同机器无法访问服务,push-group与push-connector部署在不同机器时最好设置 87 | #dubbo.protocol.host=172.16.47.60 88 | 89 | #云短信厂商,0: 代表暂时关闭短信通道 1:代表阿里云短信 2: 代表腾讯云短信 90 | sms.cp=0 91 | # 应用id 92 | sms.appid=LTAI4Ff1jtqrSr3rkHMKEnfs 93 | # 应用key 94 | sms.appkey=gG33mvmMAxGYol7Vd1AEG6InRK9VCD 95 | # 模板id 96 | sms.templateId=SMS_180355435 97 | # 短信签名由于编码问题,请到相应的代码里面设置 98 | 99 | # 短信超级验证码,正式上线请修改,你可以使用这个超级验证码登录任意帐号 100 | sms.superCode=66666 101 | 102 | # 是否使用内置数据库 1: 表示使用 0: 使用mySql 103 | im.embed_db=0 104 | # jdbc url 105 | im.jdbc_url=jdbc:mysql://{你的mysql服务地址}:3306/fsharechat?useSSL=false&serverTimezone=GMT&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf8 106 | # mysql数据库访问用户名 107 | im.user=root 108 | #mysql数据库访问密码 109 | im.password=123456 110 | 111 | ``` 112 | 113 | # 启动服务 114 | 115 | **NOTE:** 启动服务请到各自服务目录下启动bat脚本 116 | 117 | * 启动`push-group`服务,到`data\push-group`目录下执行`push-group.bat` 118 | 119 | * 启动`push-connector`服务,到`data\push-connector`目录下执行`push-connector.bat` 120 | -------------------------------------------------------------------------------- /push-connector/push-connector: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 这里可以修改JAVA_HOME的路径 3 | JAVA_HOME=/data/jdk 4 | 5 | APP_NAME=$(basename "$0") 6 | APP_DIR=/data/boot/${APP_NAME} 7 | APP_VERSION_FILE=${APP_DIR}/version 8 | APP_LIB=${APP_DIR}/lib 9 | JVM_INI=${APP_DIR}/jvm.ini 10 | JVM_INI_LOCAL=${APP_DIR}/../jvm.ini 11 | 12 | if [ -f "${APP_VERSION_FILE}" ]; then 13 | APP_VERSION=$(cat ${APP_VERSION_FILE}) 14 | fi 15 | 16 | if [ -f "${JVM_INI_LOCAL}" ] && [ -f "${JVM_INI}" ]; then 17 | JVM_OPTIONS="$(sort -t= -k1,1 -s -u ${JVM_INI_LOCAL} ${JVM_INI} | grep -v "^#" | xargs)" 18 | elif [ -f "${JVM_INI}" ]; then 19 | JVM_OPTIONS="$(cat ${JVM_INI} | grep -v "^#" | xargs)" 20 | elif [ -f "${JVM_INI}" ]; then 21 | JVM_OPTIONS="$(cat ${JVM_INI_LOCAL} | grep -v "^#" | xargs)" 22 | else 23 | JVM_OPTIONS="" 24 | fi 25 | 26 | #服务器端口 27 | SERVER_PORT=$(echo ${JVM_OPTIONS} | sed 's/.*server\.port=\([[:digit:]]*\).*$/\1/') 28 | if [ -z "$SERVER_PORT" ]; then 29 | SERVER_PORT=8081 30 | fi 31 | 32 | echo "server port ${SERVER_PORT}" 33 | 34 | 35 | do_start() 36 | { 37 | cd ${APP_DIR} 38 | JAR_NAME=$(ls ${APP_LIB} | grep jar) 39 | 40 | if [ -z "${JAVA_HOME}" ]; then 41 | JAVA_HOME=/data/java 42 | fi 43 | 44 | mkdir -p /data/boot/$APP_NAME/logs 45 | 46 | COMMAND="$JAVA_HOME/bin/java $JVM_OPTIONS -jar $APP_LIB/$JAR_NAME --spring.config.additional-location=file:./config/" 47 | (${COMMAND} 2>&1 1> "/data/boot/$APP_NAME/logs/$APP_NAME.log" &) > /dev/null 48 | 49 | sleep 1 #避免进程启动太慢,导致无法进入后续循环 50 | 51 | for i in $(ps -ef | grep -w 'java' | grep "$APP_DIR" | grep -w '\-jar' | egrep -v 'grep' | awk '{print $2}') ; do 52 | echo "Starting Instance $i" 53 | RETRY_TIME=0 54 | NC_RESULT=1 55 | while [[ ${RETRY_TIME} -lt 24 && -z $(/usr/bin/nc -z -v -w 5 127.0.0.1 ${SERVER_PORT}) && $? -eq 1 ]]; do 56 | RETRY_TIME=$(expr ${RETRY_TIME} + 1) 57 | echo "Retry after 5 seconds ... " 58 | sleep 5 59 | done 60 | if [ ${RETRY_TIME} -lt 24 ]; then 61 | echo "Start Success" 62 | exit 0 63 | else 64 | echo "Start Timeout" 65 | exit 1 66 | fi 67 | done 68 | 69 | echo "Start Failure" 70 | exit 1 71 | } 72 | 73 | do_stop() 74 | { 75 | for i in $(ps -ef | grep -w 'java' | grep "$APP_DIR" | grep -w '\-jar' | egrep -v 'grep' | awk '{print $2}') ; do 76 | if [ ${i} != $$ ]; then 77 | kill ${i} 78 | while [[ -n $(ps -ef | grep -w 'java' | grep "$APP_DIR" | grep -w '\-jar' | egrep -v 'grep' | awk '{print $2}' | grep ${i}) ]] ; do 79 | echo "wait for ${i} exit" 80 | sleep 1; 81 | done 82 | echo "Stop Running Instance ${i}" 83 | fi 84 | done 85 | } 86 | 87 | do_status() { 88 | [ -n "${APP_VERSION}" ] && echo "${APP_NAME}-${APP_VERSION}" 89 | if [[ -z $(/usr/bin/nc -z -v -w 5 127.0.0.1 ${SERVER_PORT}) && $? -eq 1 ]] ; then 90 | echo "$APP_NAME is not running." 91 | else 92 | PID=$(ps -ef | grep -w 'java' | grep "$APP_DIR" | grep -w '\-jar' | egrep -v 'grep' | awk '{print $2}') 93 | echo "$APP_NAME is running, pid=$PID." 94 | fi 95 | } 96 | 97 | case "$1" in 98 | start) 99 | do_start 100 | exit $? 101 | ;; 102 | stop) 103 | do_stop 104 | exit $? 105 | ;; 106 | restart) 107 | do_stop 108 | if [ $? -eq 0 ]; then 109 | do_status 110 | do_start 111 | exit $? 112 | else 113 | exit 1 114 | fi 115 | ;; 116 | status) 117 | do_status 118 | ;; 119 | *) 120 | echo "Usage: $APP_NAME <{start|stop|restart|status}>" >&2 121 | exit 3 122 | ;; 123 | esac 124 | 125 | #到达这里一定是因为前面的代码出错 126 | exit 1 127 | -------------------------------------------------------------------------------- /push-api/push-api: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 这里可以修改JAVA_HOME的路径 3 | JAVA_HOME=/data/jdk 4 | 5 | APP_NAME=$(basename "$0") 6 | APP_DIR=/data/boot/${APP_NAME} 7 | APP_VERSION_FILE=${APP_DIR}/version 8 | APP_LIB=${APP_DIR}/lib 9 | JVM_INI=${APP_DIR}/jvm.ini 10 | JVM_INI_LOCAL=${APP_DIR}/../jvm.ini 11 | 12 | if [ -f "${APP_VERSION_FILE}" ]; then 13 | APP_VERSION=$(cat ${APP_VERSION_FILE}) 14 | fi 15 | 16 | if [ -f "${JVM_INI_LOCAL}" ] && [ -f "${JVM_INI}" ]; then 17 | JVM_OPTIONS="$(sort -t= -k1,1 -s -u ${JVM_INI_LOCAL} ${JVM_INI} | grep -v "^#" | xargs)" 18 | elif [ -f "${JVM_INI}" ]; then 19 | JVM_OPTIONS="$(cat ${JVM_INI} | grep -v "^#" | xargs)" 20 | elif [ -f "${JVM_INI}" ]; then 21 | JVM_OPTIONS="$(cat ${JVM_INI_LOCAL} | grep -v "^#" | xargs)" 22 | else 23 | JVM_OPTIONS="" 24 | fi 25 | 26 | #服务器端口 27 | SERVER_PORT=$(echo ${JVM_OPTIONS} | sed 's/.*server\.port=\([[:digit:]]*\).*$/\1/') 28 | if [ -z "${SERVER_PORT}" ]; then 29 | echo "server port is empty" 30 | SERVER_PORT=8080 31 | fi 32 | 33 | if [ -n "$(echo $SERVER_PORT | sed -n "/^[0-9]\+$/p")" ];then 34 | echo "$SERVER_PORT is a number." 35 | else 36 | echo "$SERVER_PORT is not a number" 37 | SERVER_PORT=8080 38 | fi 39 | 40 | echo "server port [${SERVER_PORT}]" 41 | 42 | 43 | do_start() 44 | { 45 | cd ${APP_DIR} 46 | JAR_NAME=$(ls ${APP_LIB} | grep jar) 47 | 48 | if [ -z "${JAVA_HOME}" ]; then 49 | JAVA_HOME=/data/java 50 | fi 51 | 52 | mkdir -p /data/boot/$APP_NAME/logs 53 | 54 | COMMAND="$JAVA_HOME/bin/java $JVM_OPTIONS -jar $APP_LIB/$JAR_NAME --spring.config.additional-location=file:./config/" 55 | (${COMMAND} 2>&1 1> "/data/boot/$APP_NAME/logs/$APP_NAME.log" &) > /dev/null 56 | 57 | sleep 1 #避免进程启动太慢,导致无法进入后续循环 58 | 59 | for i in $(ps -ef | grep -w 'java' | grep "$APP_DIR" | grep -w '\-jar' | egrep -v 'grep' | awk '{print $2}') ; do 60 | echo "Starting Instance $i" 61 | RETRY_TIME=0 62 | while [[ ${RETRY_TIME} -lt 24 && -z "$(/usr/bin/curl -s -m 1 "http://127.0.0.1:$SERVER_PORT/monitor/alive" | grep '"code":200')" ]]; do 63 | RETRY_TIME=$(expr ${RETRY_TIME} + 1) 64 | echo "Retry after 5 seconds ... " 65 | sleep 5 66 | done 67 | if [ ${RETRY_TIME} -lt 24 ]; then 68 | echo "Start Success" 69 | exit 0 70 | else 71 | echo "Start Timeout" 72 | exit 1 73 | fi 74 | done 75 | 76 | echo "Start Failure" 77 | exit 1 78 | } 79 | 80 | do_stop() 81 | { 82 | for i in $(ps -ef | grep -w 'java' | grep "$APP_DIR" | grep -w '\-jar' | egrep -v 'grep' | awk '{print $2}') ; do 83 | if [ ${i} != $$ ]; then 84 | kill ${i} 85 | while [[ -n $(ps -ef | grep -w 'java' | grep "$APP_DIR" | grep -w '\-jar' | egrep -v 'grep' | awk '{print $2}' | grep ${i}) ]] ; do 86 | echo "wait for ${i} exit" 87 | sleep 1; 88 | done 89 | echo "Stop Running Instance ${i}" 90 | fi 91 | done 92 | } 93 | 94 | do_status() { 95 | [ -n "${APP_VERSION}" ] && echo "${APP_NAME}-${APP_VERSION}" 96 | if [ -z "$(/usr/bin/curl -s -m 1 "http://127.0.0.1:$SERVER_PORT/monitor/alive" | grep '"code":200')" ] ; then 97 | echo "$APP_NAME is not running." 98 | else 99 | PID=$(ps -ef | grep -w 'java' | grep "$APP_DIR" | grep -w '\-jar' | egrep -v 'grep' | awk '{print $2}') 100 | echo "$APP_NAME is running, pid=$PID." 101 | fi 102 | } 103 | 104 | case "$1" in 105 | start) 106 | do_start 107 | exit $? 108 | ;; 109 | stop) 110 | do_stop 111 | exit $? 112 | ;; 113 | restart) 114 | do_stop 115 | if [ $? -eq 0 ]; then 116 | do_status 117 | do_start 118 | exit $? 119 | else 120 | exit 1 121 | fi 122 | ;; 123 | status) 124 | do_status 125 | ;; 126 | *) 127 | echo "Usage: $APP_NAME <{start|stop|restart|status}>" >&2 128 | exit 3 129 | ;; 130 | esac 131 | 132 | #到达这里一定是因 -------------------------------------------------------------------------------- /push-group/push-group: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 这里可以修改JAVA_HOME的路径 3 | JAVA_HOME=/data/jdk 4 | 5 | APP_NAME=$(basename "$0") 6 | APP_DIR=/data/boot/${APP_NAME} 7 | APP_VERSION_FILE=${APP_DIR}/version 8 | APP_LIB=${APP_DIR}/lib 9 | JVM_INI=${APP_DIR}/jvm.ini 10 | JVM_INI_LOCAL=${APP_DIR}/../jvm.ini 11 | 12 | if [ -f "${APP_VERSION_FILE}" ]; then 13 | APP_VERSION=$(cat ${APP_VERSION_FILE}) 14 | fi 15 | 16 | if [ -f "${JVM_INI_LOCAL}" ] && [ -f "${JVM_INI}" ]; then 17 | JVM_OPTIONS="$(sort -t= -k1,1 -s -u ${JVM_INI_LOCAL} ${JVM_INI} | grep -v "^#" | xargs)" 18 | elif [ -f "${JVM_INI}" ]; then 19 | JVM_OPTIONS="$(cat ${JVM_INI} | grep -v "^#" | xargs)" 20 | elif [ -f "${JVM_INI}" ]; then 21 | JVM_OPTIONS="$(cat ${JVM_INI_LOCAL} | grep -v "^#" | xargs)" 22 | else 23 | JVM_OPTIONS="" 24 | fi 25 | 26 | #服务器端口 27 | SERVER_PORT=$(echo ${JVM_OPTIONS} | sed 's/.*server\.port=\([[:digit:]]*\).*$/\1/') 28 | if [ -z "${SERVER_PORT}" ]; then 29 | echo "server port is empty" 30 | SERVER_PORT=8081 31 | fi 32 | 33 | if [ -n "$(echo $SERVER_PORT | sed -n "/^[0-9]\+$/p")" ];then 34 | echo "$SERVER_PORT is a number." 35 | else 36 | echo "$SERVER_PORT is not a number" 37 | SERVER_PORT=8081 38 | fi 39 | 40 | echo "server port [${SERVER_PORT}]" 41 | 42 | 43 | do_start() 44 | { 45 | cd ${APP_DIR} 46 | JAR_NAME=$(ls ${APP_LIB} | grep jar) 47 | 48 | if [ -z "${JAVA_HOME}" ]; then 49 | JAVA_HOME=/data/java 50 | fi 51 | 52 | mkdir -p /data/boot/$APP_NAME/logs 53 | 54 | COMMAND="$JAVA_HOME/bin/java $JVM_OPTIONS -jar $APP_LIB/$JAR_NAME --spring.config.additional-location=file:./config/" 55 | (${COMMAND} 2>&1 1> "/data/boot/$APP_NAME/logs/$APP_NAME.log" &) > /dev/null 56 | 57 | sleep 1 #避免进程启动太慢,导致无法进入后续循环 58 | 59 | for i in $(ps -ef | grep -w 'java' | grep "$APP_DIR" | grep -w '\-jar' | egrep -v 'grep' | awk '{print $2}') ; do 60 | echo "Starting Instance $i" 61 | RETRY_TIME=0 62 | while [[ ${RETRY_TIME} -lt 24 && -z "$(/usr/bin/curl -s -m 1 "http://127.0.0.1:$SERVER_PORT/monitor/alive" | grep '"code":200')" ]]; do 63 | RETRY_TIME=$(expr ${RETRY_TIME} + 1) 64 | echo "Retry after 5 seconds ... " 65 | sleep 5 66 | done 67 | if [ ${RETRY_TIME} -lt 24 ]; then 68 | echo "Start Success" 69 | exit 0 70 | else 71 | echo "Start Timeout" 72 | exit 1 73 | fi 74 | done 75 | 76 | echo "Start Failure" 77 | exit 1 78 | } 79 | 80 | do_stop() 81 | { 82 | for i in $(ps -ef | grep -w 'java' | grep "$APP_DIR" | grep -w '\-jar' | egrep -v 'grep' | awk '{print $2}') ; do 83 | if [ ${i} != $$ ]; then 84 | kill ${i} 85 | while [[ -n $(ps -ef | grep -w 'java' | grep "$APP_DIR" | grep -w '\-jar' | egrep -v 'grep' | awk '{print $2}' | grep ${i}) ]] ; do 86 | echo "wait for ${i} exit" 87 | sleep 1; 88 | done 89 | echo "Stop Running Instance ${i}" 90 | fi 91 | done 92 | } 93 | 94 | do_status() { 95 | [ -n "${APP_VERSION}" ] && echo "${APP_NAME}-${APP_VERSION}" 96 | if [ -z "$(/usr/bin/curl -s -m 1 "http://127.0.0.1:$SERVER_PORT/monitor/alive" | grep '"code":200')" ] ; then 97 | echo "$APP_NAME is not running." 98 | else 99 | PID=$(ps -ef | grep -w 'java' | grep "$APP_DIR" | grep -w '\-jar' | egrep -v 'grep' | awk '{print $2}') 100 | echo "$APP_NAME is running, pid=$PID." 101 | fi 102 | } 103 | 104 | case "$1" in 105 | start) 106 | do_start 107 | exit $? 108 | ;; 109 | stop) 110 | do_stop 111 | exit $? 112 | ;; 113 | restart) 114 | do_stop 115 | if [ $? -eq 0 ]; then 116 | do_status 117 | do_start 118 | exit $? 119 | else 120 | exit 1 121 | fi 122 | ;; 123 | status) 124 | do_status 125 | ;; 126 | *) 127 | echo "Usage: $APP_NAME <{start|stop|restart|status}>" >&2 128 | exit 3 129 | ;; 130 | esac 131 | 132 | #到达这里一定是因 -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # 飞享服务端发布说明 2 | 3 | * windows server部署详情请参见点击[这里](fshare-on-windows.md) 4 | 5 | 在部署之前,有必要对部署目录`boot`做一些说明 6 | ```shell 7 | ├── download #android客户端 Apk 8 | │   └── chat-debug.apk 9 | ├── push-connector # 信令消息服务器目录,支持TCP,WSS链接 10 | │   ├── jvm.ini #jvm参数配置 11 | │   ├── lib 12 | │   │   └── spring-boot-dubbo-push-connector-1.2.0-SNAPSHOT.jar 13 | │   ├── logs # 日志 14 | │   └── push-connector # 启动脚本 15 | └── push-group # 业务相关逻辑服务,包括http登录接口 16 | ├── jvm.ini #jvm参数配置 17 | ├── lib 18 | │   └── spring-boot-web-push-group-1.2.0-SNAPSHOT.jar 19 | ├── logs # 日志 20 | └── push-group # 启动脚本 21 | ``` 22 | 23 | 另外由于`Java`项目需要jdk支持,为了避免与系统其他jdk环境变量冲突,在shell脚本启动的时候,指定了`jdk`的目录.另外`Dubbo`需要注册中心支持,所以需要安装`zookeeper`.当然如果你们公司有现成的注册中心,可以直接配置不需要手动安装一套.因此我们推荐在`Centos`,`/data`施行如下的目录配置 24 | 25 | ```shell 26 | ├── boot //这里文件内容就是本项目的具体内容 27 | ├── jdk 28 | └── zookeeper-3.4.6 29 | ``` 30 | 31 | **NOTE:** 由于`jdk`和`zookeeper`文件过大,并没有把它们包含在项目中,本项目仅仅包括boot目录中内容,有人可能要问为什么要在/data 目录下放置如上的内容,下面展示一段shell命令. 32 | 33 | * push-connecotor脚本 34 | 35 | ```shell 36 | # 如果是ubuntu系统,请将这里改为#!/bin/bash 37 | #!/bin/sh 38 | # 这里可以修改JAVA_HOME的路径 39 | JAVA_HOME=/data/jdk 40 | 41 | APP_NAME=$(basename "$0") 42 | APP_DIR=/data/boot/${APP_NAME} 43 | APP_VERSION_FILE=${APP_DIR}/version 44 | APP_LIB=${APP_DIR}/lib 45 | JVM_INI=${APP_DIR}/jvm.ini 46 | JVM_INI_LOCAL=${APP_DIR}/../jvm.ini 47 | 48 | ``` 49 | __NOTE:__ 如果是ubuntu系统,请将这里改为#!/bin/bash 50 | 51 | **NOTE:** 上面指定了`JAVA_HOME` 目录在`/data/jdk`.当然你可以把jdk防止在任意位置,只要指定其具体位置就可以,或者你也可以修改脚本,只需要配置java环境变量即可.一切都是为了配置基础的运行环境,如果你熟悉java环境,你可以随时配置 52 | 53 | 54 | # 部署说明 55 | 56 | ## 前置安装说明 57 | 58 | ### centos 环境准备 59 | 60 | ```shell 61 | yum install nc 62 | ``` 63 | 64 | * [java 环境配置](https://www.comsince.cn/2020/04/13/universe-push-start-on-centos/#java%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE) 65 | * 如果使用`Mysql`请先事先安装,[【数据库】- MySQL基本安装](https://www.comsince.cn/wiki/2019-07-01-mysql-00-install/) 66 | 67 | ### minio配置 68 | 69 | * [安装](https://www.comsince.cn/2020/04/13/universe-push-start-on-centos/#%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8) 70 | * 创建不同的bucket用于存储不同的文件类型 71 | ```java 72 | public static String MINIO_BUCKET_GENERAL_NAME = "minio-bucket-general-name"; 73 | public static String MINIO_BUCKET_IMAGE_NAME = "minio-bucket-image-name"; 74 | public static String MINIO_BUCKET_VOICE_NAME = "minio-bucket-voice-name"; 75 | public static String MINIO_BUCKET_VIDEO_NAME = "minio-bucket-video-name"; 76 | public static String MINIO_BUCKET_FILE_NAME = "minio-bucket-file-name"; 77 | public static String MINIO_BUCKET_PORTRAIT_NAME = "minio-bucket-portrait-name"; 78 | public static String MINIO_BUCKET_FAVORITE_NAME = "minio-bucket-favorite-name"; 79 | ``` 80 | minio-bucket 81 | 82 | * 权限设置 83 | 84 | **NOTE:** 所有的bucket都按照如下进行设置 85 | 86 | minio-bucket 87 | 88 | ## 下载完整安装包 89 | * [chat-server-deploy](https://media.comsince.cn/minio-bucket-file-name/fshare-chat-pro.tar.gz) 90 | 91 | **NOTE:** 下载完成后,请将压缩文件解压到`/`根目录下即可,注意上面的命令行都是以这个目录为标准的,切忌不要随意放置 92 | 93 | ## 下载部署服务 94 | 95 | **NOTE:** 由于github仓库限制以及网络问题,不便上传.当你下载完下面两个服务jar包,分别放到相应服务的`lib`目录下,请选择以下最新版本下载 96 | 97 | ### push-connector服务 98 | * [push-connector-1.2.3](https://media.comsince.cn/minio-bucket-file-name/spring-boot-dubbo-push-connector-1.2.3.jar) 99 | 100 | ### push-group服务 101 | * [push-group-1.2.3](https://media.comsince.cn/minio-bucket-file-name/spring-boot-web-push-group-1.2.3.jar) 102 | 103 | 104 | 105 | # 参数配置 106 | 107 | 目前仅有两个服务启动既可运行,参数配置仅需关心,各个目录下config即可,你需要配置下面的文件即可,具体在每个服务的`config`目录下 108 | 109 | ## push-connector 110 | 111 | ```yaml 112 | # wss ssl 配置,这里配置jks需要指定其绝对路径地址,不启用wss 请将这里设置为空,即表示不启用wss,使用ws.本地部署可以考虑暂时不启用wss 113 | push.ssl.keystore=/data/boot/push-connector/config/chat.comsince.cn.jks 114 | push.ssl.truststore=/data/boot/push-connector/config/chat.comsince.cn.trustkeystore.jks 115 | push.ssl.password=123456 116 | ## Dubbo Registry 117 | dubbo.registry.address=zookeeper://zookeeper:2181 118 | 119 | ## kafka broker 暂时不建议使用集群,单击部署可暂时不用配置 120 | #push.kafka.broker=kafka:9092 121 | 122 | ## kurento client url,群组音视频服务 123 | kurento.clientUrl=ws://media.comsince.cn:8888/kurento 124 | 125 | ## minio url 126 | minio.url=https://media.comsince.cn 127 | ## minio access_key 128 | minio.access_key= 129 | ## minio secret_key 130 | minio.secret_key= 131 | 132 | 133 | ``` 134 | 135 | ## push-group 136 | 137 | ```yaml 138 | 139 | ## Dubbo 注册中心 140 | dubbo.registry.address=zookeeper://zookeeper:2181 141 | 142 | 143 | #云短信厂商,1:代表阿里云短信 2: 代表腾讯云短信.如果没有短信服务,可暂时不用配置,使用超级验证码登录 144 | sms.cp=2 145 | # 应用id 146 | sms.appid=LTAI4Ff1jtqrSr3rkHMKEnfs 147 | # 应用key 148 | sms.appkey=gG33mvmMAxGYol7Vd1AEG6InRK9VCD 149 | # 模板id 150 | sms.templateId=SMS_180355435 151 | # 短信签名由于编码问题,请到相应的代码里面设置 152 | 153 | # 短信超级验证码,正式上线请修改 154 | sms.superCode=6666 155 | 156 | # 是否使用内置数据库 1: 表示使用 0: 使用mySql 157 | im.embed_db=0 158 | # jdbc url 159 | im.jdbc_url=jdbc:mysql://mysql:3306/fsharechat?useSSL=false&serverTimezone=GMT&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf8 160 | # mysql数据库访问用户名 161 | im.user=root 162 | #mysql数据库访问密码 163 | im.password=123456 164 | 165 | ``` 166 | 167 | ## jvm.ini 参数配置 168 | 169 | **NOTE:** 由于我的线上服务器使用的内存比较小,所以对`push-connector`,`push-group`的jvm参数做了调整.所以以下内存参数配置,可以根据自己实际机器的配置修改 170 | 171 | ```shell 172 | -Xmx300m 最大使用内存 173 | -Xms300m 最小使用内存 174 | -Xmn100m 新生代内存 175 | ``` 176 | 177 | # 启动服务 178 | 179 | ```shell 180 | ./push-group/push-group start 181 | ./push-connector/push-connector start 182 | ``` 183 | 184 | # 客户端 185 | 186 | ## vue 客户端配置 187 | * 配置文件 `vue-chat\src\constant\index.js` 188 | 189 | ```java 190 | //ws 协议配置 191 | //export const WS_PROTOCOL = 'wss'; 192 | export const WS_PROTOCOL = 'ws'; 193 | 194 | //websocket 服务地址 195 | //export const WS_IP = 'github.comsince.cn'; 196 | export const WS_IP = 'localhost'; 197 | 198 | //登录接口服务配置,本地部署可以不启用https 199 | //export const HTTP_HOST = "https://"+WS_IP + ":8443/" 200 | export const HTTP_HOST = "http://"+WS_IP + ":8081/" 201 | ``` 202 | 203 | * 编译 204 | 205 | ```shell 206 | npm run build 207 | ``` 208 | 209 | ## android 客户端 210 | 211 | * 配置文件在chat工程下的`config.java` 212 | 213 | ```java 214 | //IM server 即是push-connector服务地址 215 | String IM_SERVER_HOST = "chat.comsince.cn"; 216 | int IM_SERVER_PORT = 6789; 217 | 218 | //push-group服务地址 219 | String APP_SERVER_HOST = "chat.comsince.cn"; 220 | int APP_SERVER_PORT = 8081; 221 | ``` 222 | 223 | * 编译APK 224 | 225 | **NOTE:** 编译前请确保`Android SDK`配置正确 226 | 227 | ```shell 228 | ./gradlew clean assembleDebug 229 | ``` -------------------------------------------------------------------------------- /push-api/Readme.md: -------------------------------------------------------------------------------- 1 | # API 说明 2 | 3 | ## 推送系统通知 4 | 5 | * API地址: localhost:8080/imopenapi/pushNotificationByMobile 6 | 7 | ### 结构定义说明 8 | 9 | ```json 10 | { 11 | "mobiles": [13900000001, 13900000000], //目标用手机号,以数组表示 12 | "content": { 13 | "content": { 14 | "type": //消息类型 1:文本 2:语音消息 3:图片 4: 位置 5: 文件 6: 视频 15 | "searchableContent": "[图片]", //消息显示内容 16 | "binaryContent": "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", 17 | "mediaType": //媒体类型 0: 通用 1: 图片 2: 语音 3: 视频 4: 文件 18 | "remoteMediaUrl": //媒体文件远程下载地址 19 | }, 20 | "messageId": 1602813889928, //消息id 当前时间粗 21 | "timestamp": 1602813889928 //当前时间戳 22 | } 23 | 24 | } 25 | ``` 26 | 27 | ### 文本类通知 28 | 29 | ```json 30 | { 31 | "mobiles": [13900000001, 13900000000], 32 | "content": { 33 | "content": { 34 | "type": 1, 35 | "searchableContent": "测试消息" 36 | } 37 | } 38 | } 39 | ``` 40 | 41 | ### 图片消息 42 | 43 | ```json 44 | { 45 | "mobiles": [13900000001, 13900000000], 46 | "content": { 47 | "content": { 48 | "type": 3, 49 | "searchableContent": "[图片]", 50 | "binaryContent": "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", 51 | "mediaType": 1, 52 | "remoteMediaUrl": "https://media.comsince.cn/minio-bucket-image-name/1-TWTVTVWW-1602813889836-一群改变世界的人_wps图片.jpg" 53 | }, 54 | "messageId": 1602813889928, 55 | "timestamp": 1602813889928 56 | } 57 | 58 | } 59 | ``` 60 | 61 | ### 视频消息 62 | 63 | ```json 64 | { 65 | "mobiles": [13900000001, 13900000000], 66 | "content": { 67 | "content": { 68 | "type": 6, 69 | "searchableContent": "[视频]", 70 | "binaryContent": "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", 71 | "mediaType": 3, 72 | "remoteMediaUrl": "https://media.comsince.cn/minio-bucket-video-name/3-TWTVTVWW-1602814987257-3-qJqkqkBB-1592275424099-video_1592275413715.mp4" 73 | }, 74 | "messageId": 1602813889928, 75 | "timestamp": 1602813889928 76 | } 77 | 78 | } 79 | ``` 80 | 81 | ### 文件消息 82 | 83 | ```json 84 | { 85 | "mobiles": [13900000001, 13900000000], 86 | "content": { 87 | "content": { 88 | "type": 5, 89 | "content": "104456", 90 | "searchableContent": "[文件] 一群改变世界的人_wps图片.jpg", 91 | "mediaType": 4, 92 | "remoteMediaUrl": "https://media.comsince.cn/minio-bucket-file-name/4-TWTVTVWW-1602815714665-一群改变世界的人_wps图片.jpg" 93 | }, 94 | "messageId": 1602813889928, 95 | "timestamp": 1602813889928 96 | } 97 | 98 | } 99 | ``` 100 | 101 | ### 地理位置信息 102 | 103 | ```json 104 | { 105 | "mobiles": [13900000001, 13900000000], 106 | "content": { 107 | "content": { 108 | "binaryContent": "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", 109 | "content": "{\"lat\":22.37225341796875,\"long\":113.56907653808594}", 110 | "searchableContent": "魅族科技大楼", 111 | "type": 4 112 | }, 113 | "messageId": 1602813889928, 114 | "timestamp": 1602813889928 115 | } 116 | 117 | } 118 | ``` --------------------------------------------------------------------------------