├── 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 |
81 |
82 | * 权限设置
83 |
84 | **NOTE:** 所有的bucket都按照如下进行设置
85 |
86 |
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 | ```
--------------------------------------------------------------------------------