CooCare 4 通讯服务器部署手册 - housekeeper-software/coocare GitHub Wiki

组件简介

IM 消息服务器

镜像名称: commserver_v4:latest
应用协议: v1,v2,v3
登录方式: tcp,ws, wss
OS: debian 10/11, X64
内存 >= 4G
CPU核心 >=4
带宽 >= 8M

VNC中转服务器

镜像名称:relayserver_v4:latest
OS: debian 10/11, X64
内存 >= 4G
CPU核心 >=4
带宽 >= 12M

部署准备工作

根据上述要求购买云主机,然后从svn 将 im/distribution/compose目录传到服务器上

IM 服务器构建基础系统环境

准备系统环境的脚本在 compose/basic目录
1) 将有效的数字证书放在 cert目录下,名字改为 coocare.pem  
2) chmod +x init.sh  
3) ./init.sh
此部署如果成功完成,则系统中将会包含:
docker, docker-compose,haproxy
并创建了虚拟网络,登录镜像仓库等

中转服务器构建基础系统环境

准备系统环境的脚本在 compose/basic目录
1) 将有效的数字证书放在 cert目录下,名字改为 coocare.pem  
2) chmod +x init.sh  
修改 init.sh:
apt-get -y install apt-utils gnupg2 ca-certificates procps net-tools wget curl vim unzip tcpdump haproxy(去掉 haproxy)
/* 如下三句话去掉 */
mkdir -p /etc/cert
cp cert/coocare.pem /etc/cert/coocare.pem
docker network create --driver bridge --subnet 172.10.0.0/16 --gateway 172.10.0.1 coocare

安装 mongodb

docker-compose.yml位于 compose/mongodb 目录
如果要修改用户名和密码,则编辑 docker-compose.yml文件直接修改即可。
默认端口为 27017,一般不需要在云主机防火墙中放开这个端口,一般是本机访问或者内网访问
cd compose/mongodb
docker-compose up -d
完成

这里需要注意:可以通过 mongodb url 设置连接池,方法是:在url末尾添加: ?maxPoolSize=10
这里的数字应当 >= 配置文件中的taskThreadCount数目。
通讯服务器使用的是 mongodb-c-driver 最新版,可以支持 mongodb 8。

安装 IM 通讯服务器镜像

脚本位于 compose/im/lite目录下
在conf目录下,修改 commserver.json,主要修改 mongodb的一些配置
修改 env 文件,设置redis服务器地址等。
执行 : cp env .env
执行: chmod +x init.sh
      ./init.sh
之后: docker-compose up -d
完毕

如果版本有更新,在构建系统处理好之后,进入 compose/im/lite,
执行 ./update.sh 即可完成镜像更新

安装 vnc 中转服务器

脚本位于 compose/relayserver
chmod +x init.sh
./init.sh
docker-compose up -d
完成

配置文件

IM 配置文件

配置位于 compose/im/lite/conf/commserver.json
{
   "serverId":"lite-prod", #服务器id
   "logLevel":2,  #日志等级,生产环境=2即可
   "logToFile":false, #是否将日志写入文件,生成环境可不写
   "forcePush":true, #强制推送,目前用不到
   "connThreadCount":10, # tcp线程数,
   "websocketThreadCount":2, # ws线程数,因为DL的登录方式是ws,但连接很少,一般这里写2个即可,满足工程师登录和web登录
   "taskThreadCount":10, # 任务线程数
   "bossTcpPort":10888, # TCP 登录端口
   "pushUrl":"", # 推送地址,目前没用到
   "disableCrypto":false, # 禁用加密,目前强制加密
   "heartbeat":{
      "heartbeatTimeoutMs":300000, # tcp心跳超时,毫秒单位
      "timingWheelGranularity":10 
   },
   "redis":{  # redis连接设置
      "host":"192.168.180.70", 
      "port":6379,
      "password":"ssc82893388",
      "index":0
   },
   "mongodb":{ # mongodb连接设置,如果是阿里云地址,则在后面加上 ?maxPoolSize=xx,这里的xx是 taskThreadCount一样
      "url":"mongodb://root:[email protected]:27017/?maxPoolSize=10",
      "dbName":"coocare_test", # 数据库名称 
      "setName":"HPDL",  # 集合名称
      "expire_after_seconds":604800, # 消息过期时间,秒单位
      "limit":100  #登录时获取离线消息最大数目
   },
   "websocket":{ # websocket设置
      "protocol":"ws",
      "assetsDir":"",
      "certsDir":"",
      "privateKeyPassword":"",
      "port":10889,  #这里是侦听端口
      "options":0,
      "pingIntervalSec":30,
      "hangupIntervalSec":100
   }
}

注意docker-compose.yml 中的设置会覆盖上述配置

relayserver的配置

配置位于: compose/relayserver/conf/relayserver.json

{
   "logLevel":2, # 生产环境=2
   "logToFile":false, #生产环境不要将日志写入文件
   "packetHeaderSize":32, # token的长度
   "connThreadCount":10, #线程数
   "sessionTimeoutMs":300000, #会话等待超时时间,毫秒单位
   "bossTcpPort":18888 # 侦听端口
}

IM docker-compose.yml中的配置

version: '3.1'
services:
  commserver:
    image: xxxx/commserver_v4:latest
    restart: always
    container_name: "commserver"
    privileged: true
    ports:
      - "20888:16888" #tcp listen port 
      - "20889:16889" #ws listen port
    volumes:
      - /data/coocare/commserver/etc:/app/etc
      - /data/coocare/commserver/log:/app/log
      - /etc/localtime:/etc/localtime
      - /etc/resolv.conf:/etc/resolv.conf 
    environment:
      - "TZ=Asia/Shanghai"
      - COOCARE_SERVER_ID=lite-prod  # override commserver.json
      - COOCARE_REDIS=${REDIS}  # override commserver.json
      - COOCARE_PUSHURL=${PUSHURL} # override commserver.json
      - COOCARE_CONNECT_THREAD=8  # override commserver.json
      - COOCARE_WEBSOCKET_THREAD=2  # override commserver.json
      - COOCARE_TASK_THREAD=10 # override commserver.json
      - COOCARE_HEARTBEAT=300000,10  # override commserver.json
      - COOCARE_FORCEPUSH=true  # override commserver.json
      - COOCARE_WEBSOCKT_CONF=${WEBSOCKET}  # override commserver.json
    networks:
      default:
        ipv4_address: 172.10.0.14
networks:
  default:
    external:
      name: coocare

其他

因为 docker-compose.yml中的配置会覆盖默认配置,最终生成的配置可以在如下目录查看
/data/coocare/commserver/log/current.json
/data/coocare/commserver/log/commserver_restart.txt  --- 容器重启日志
/data/coocare/commserver/log/message_statistics.txt  --- 容器每日0点记录前面24小时收到的工程师和用户的消息总数

/data/coocare/relayserver/log/ 是relayserver的日志位置

命令行

所有容器都支持两个 --cmd=free,--cmd=report
--cmd=free: 强制释放内存
--cmd=report: 报告进程内部状态
对于 im 服务器:
docker exec -it commserver ./commserver --cmd=report
显示:
output: {
   "activeConnections": 50100.0,  #总计有多少个在线连接,包含工程师
   "activeEngineers": 100.0,  #总计有多少个在线工程师
   "subscribers": 0.0,  # 总计有多少用户订阅了工程师状态
   "totalEngineerRecvMessage": 5e+07, #总计工程师收到了多少条消息,自容器启动以来
   "totalUserRecvMessage": 1e+07 #总计用户收到了多少条消息,自容器起来以来
}

对于 relayserver服务器:
docker exec -it relayserver ./relayserver --cmd=report
显示:
output: {
   "activeSession": 0, #当前活跃的会话,就是有多少对远程桌面
   "totalSession": 3  # 自容器启动以来,总计有多少个会话
}

--cmd=free,最好在用户比较少的时候用,因为tcmalloc 会锁住所有内存

升级服务器

每台服务器应当复制 compose/im/lite/update.sh 到本机某个地方
升级时,执行 ./update.sh即可完成,无需其他操作。

负载均衡配置

总体而言负载均衡无需配置,因为 compose中已经配置好了,主要看如下三个部分:
listen tcp-16888
  bind 0.0.0.0:16888
  balance roundrobin
  mode tcp
  stats enable
  option tcplog
  log global 
  server s1 127.0.0.1:20888 weight 1 maxconn 200000 check  send-proxy

listen wss-16889
  bind 0.0.0.0:16889 ssl crt /etc/cert/coocare.pem
  mode http
  option http-keep-alive
  stats enable
  option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户ip
  log global
  maxconn 200000
  balance roundrobin
  server websrv1 127.0.0.1:20889 check

listen ws-16990
  bind 0.0.0.0:16990 
  mode http
  option http-keep-alive
  stats enable
  option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户ip
  log global
  maxconn 10000
  balance roundrobin
  server websrv1 127.0.0.1:20889 check

最终部署方案

VNC中转服务器

主机:规格: ecs.e-c1m2.large(2vcpu,4G),debian 10,40G,4M基础带宽,1520/年

容器部署,无需外部数据库,也不需要负载均衡

IM服务器(所有服务器在同一个区,同一个子网下)

redis 从阿里云购买,规格:
 标准版,单可用区,redis 7.0,不启用集群,分片规格2GB,分片数量1,读写分离(关闭),内网带宽要调整到最高,1000多/年
mongodb 与 IM 服务器装在一起
IM虚拟主机:规格:
  ecs.e-c1m2.2xlarge(8vcpu,16GB), debian 10,ESSD(100G),带宽4M  ~5000/年