# The class cannot be named by Pascal or camel case.
# The class cannot be named by Pascal or camel case.
# If it is not used, the corresponding structure will not be set,
# and it will not be read naturally.
serverversion: 2.3.0-rc1
#---------------Infrastructure configuration---------------------#
etcd:
  etcdSchema: openim  #默认即可
  etcdAddr: [ 127.0.0.1:2379 ] #单机部署时，默认即可

k8sMod: false #开启k8s模式 使用pod里面环境变量请求services调用服务 而并非etcd

mysql:
  dbMysqlAddress: [ 127.0.0.1:13306 ] #mysql地址 目前仅支持单机，默认即可
  dbMysqlUserName: root #mysql用户名，建议修改
  dbMysqlPassword: openIM # mysql密码，建议修改
  dbMysqlDatabaseName: openIM_v2 #默认即可
  dbTableName: eMsg #默认即可
  dbMsgTableNum: 1
  dbMaxOpenConns: 20
  dbMaxIdleConns: 10
  dbMaxLifeTime: 120

mongo:
  dbUri: ""#当dbUri值不为空则直接使用该值
  dbAddress: 127.0.0.1:37017  #单机时为mongo地址，使用分片集群时，为mongos地址 默认即可
  dbDirect: false
  dbTimeout: 60
  dbDatabase: openIM  #mongo db 默认即可
  dbSource: admin
  dbUserName:  #mongo用户名，建议先不设置
  dbPassword:  #mongo密码，建议先不设置
  dbMaxPoolSize: 100
  dbRetainChatRecords: 3650 #mongo保存离线消息时间（天），根据需求修改

redis:
  dbAddress: [ 127.0.0.1:16379 ] #redis地址 单机时，填写一个地址即可，使用redis集群时候，填写集群中多个节点地址（主从地址都可以填写，增加容灾能力），默认即可
  dbMaxIdle: 128
  dbMaxActive: 0
  dbIdleTimeout: 120
  dbUserName:     #only redis version 6.0+ need username
  dbPassWord: openIM #redis密码 建议修改
  enableCluster: false #如果外部redis以集群方式启动，需要打开此开关

kafka:
  ws2mschat:
    addr: [ 127.0.0.1:9092 ] #kafka配置，默认即可
    topic: "ws2ms_chat"
  ws2mschatoffline:
    addr: [ 127.0.0.1:9092 ] #kafka配置，默认即可
    topic: "ws2ms_chat_offline"
  msgtomongo:
    addr: [ 127.0.0.1:9092 ] #kafka配置，默认即可
    topic: "msg_to_mongo"
  ms2pschat:
    addr: [ 127.0.0.1:9092 ] #kafka配置，默认即可
    topic: "ms2ps_chat"
  consumergroupid:
    msgToTransfer: mongo
    msgToMongo: mongo_ex
    msgToMySql: mysql
    msgToPush: push



#---------------Internal service configuration---------------------#

# The service ip default is empty,
# automatically obtain the machine's valid network card ip as the service ip,
# otherwise the configuration ip is preferred
#如果是单机模式，用0.0.0.0或者不填，默认即可
serverip: 0.0.0.0

#作为rpc时，注册到etcd的地址，单机默认即可，如果是集群部署，需要修改（具体使用内网地址还是外网地址，要依情况而定，目的是api/gateway能访问到）
rpcRegisterIP: 127.0.0.1
#默认即可
listenIP: 0.0.0.0

# endpoints 内部组件间访问的端点host名称，访问时，可以内部直接访问 host:port 来访问
endpoints:
  api: openim_api
  cmsapi: openim_cms_api
  push: openim_push
  msg_gateway: openim_msg_gateway
  rpc_auth: openim_rpc_auth
  rpc_friend: openim_rpc_friend
  rpc_group: openim_rpc_group
  rpc_msg: openim_rpc_msg
  rpc_user: openim_rpc_user
  rpc_statistic: openim_rpc_statistic
  rpc_admin_cms: openim_rpc_admin_cms
  rpc_message_cms: openim_rpc_admin_cms
  rpc_office: openim_rpc_office

api:
  openImApiPort: [ 10002 ] #api服务端口，默认即可，需要开放此端口或做nginx转发
  listenIP: 0.0.0.0
cmsapi:
  openImCmsApiPort: [ 10006 ] #管理后台api服务端口，默认即可，需要开放此端口或做nginx转发
  listenIP: 0.0.0.0
sdk:
  openImSdkWsPort: [ 10003 ] #jssdk服务端口，默认即可，项目中使用jssdk才需开放此端口或做nginx转发
  dataDir: [ ../db/sdk/ ]
#对象存储服务，以下配置二选一，目前支持两种，腾讯云和minio，二者配置好其中一种即可（如果使用minio参考https://doc.rentsoft.cn/#/qa/minio搭建minio服务器）
credential: #腾讯cos，发送图片、视频、文件时需要，请自行申请后替换，必须修改
  tencent:
    appID: 1302656840
    region: ap-chengdu
    bucket: echat-1302656840
    secretID: AKIDGNYVChzIQinu7QEgtNp0hnNgqcV8vZTC1
    secretKey: kz15vW83qM6dBUWIq681eBZA0c0vlIbe1
  minio: #MinIO 发送图片、视频、文件时需要，请自行申请后替换，必须修改。 客户端初始化InitSDK，中 object_storage参数为minio
    bucket: openim # 存储内容桶
    appBucket: app # 存储app的桶
    location: us-east-1
    endpoint: http://127.0.0.1:10005 #minio外网ip 这个ip是给客户端访问的
    endpointInner: http://127.0.0.1:10005 #minio内网地址 如果im server 可以通过内网访问到 minio就可以填写
    endpointInnerEnable: true #是否启用minio内网地址 启用可以让桶初始化，IM server连接minio走内网地址访问
    accessKeyID: user12345
    secretAccessKey: key12345
    storageTime: 50 #文件在minio中保存的时间
  ali: # ali oss
    regionID: "oss-cn-beijing"
    accessKeyID: ""
    accessKeySecret: ""
    stsEndpoint: "sts.cn-beijing.aliyun.com"
    ossEndpoint: "oss-cn-beijing.aliyuncs.com"
    bucket: "bucket1"
    finalHost: "http://bucket1.oss-cn-beijing.aliyuncs.com"
    stsDurationSeconds: 3600
    OssRoleArn: "acs:ram::xxx:role/xxx"

dtm:
  serverURL: 127.0.0.1:10007

rpcport: #rpc服务端口 默认即可
  openImUserPort: [ 10110 ]
  openImFriendPort: [ 10120 ]
  openImMessagePort: [ 10130 ]
  openImMessageGatewayPort: [ 10140 ]
  openImGroupPort: [ 10150 ]
  openImAuthPort: [ 10160 ]
  openImPushPort: [ 10170 ]
  openImStatisticsPort: [ 10180 ]
  openImMessageCmsPort: [ 10190 ]
  openImAdminCmsPort: [ 10200 ]
  openImOfficePort: [ 10210 ]
  openImOrganizationPort: [ 10220 ]
  openImConversationPort: [ 10230 ]
  openImCachePort: [10240]
  c2c:
    callbackBeforeSendMsg:
      switch: false
      timeoutStrategy: 1 #1:send
    callbackAfterSendMsg:
      switch: false
  state:
    stateChange:
      switch: false

rpcregistername: #rpc注册服务名，默认即可
  openImUserName: User
  openImFriendName: Friend
  openImMsgName: Msg
  openImPushName: Push
  openImRelayName: Relay
  openImGroupName: Group
  openImAuthName: Auth
  openImStatisticsName: Statistics
  openImMessageCMSName: MessageCMS
  openImAdminCMSName: AdminCMS
  openImOfficeName: Office
  openImOrganizationName: Organization
  openImConversationName: Conversation
  openImCacheName: Cache
  openImRealTimeCommName: RealTimeComm
log:
  storageLocation: ../logs/
  rotationTime: 24
  remainRotationCount: 2 #日志数量
  #日志级别 6表示全都打印，测试阶段建议设置为6
  remainLogLevel: 6
  elasticSearchSwitch: false
  elasticSearchAddr: [ 127.0.0.1:9201 ]
  elasticSearchUser: ""
  elasticSearchPassword: ""

modulename: #日志文件按模块命名，默认即可
  longConnSvrName: msg_gateway
  msgTransferName: msg_transfer
  pushName: push

longconnsvr:
  openImWsPort: [ 10001 ] # ws服务端口，默认即可，要开放此端口或做nginx转发
  websocketMaxConnNum: 10000
  websocketMaxMsgLen: 4096
  websocketTimeOut: 10

## 推送只能开启一个 enable代表开启
push:
  tpns: #腾讯推送，暂未测试 暂不要使用
    ios:
      accessID: 1600018281
      secretKey: 3cd68a77a95b89e5089a1aca523f318f
    android:
      accessID: 111
      secretKey: 111
    enable: false
  jpns: #极光推送 在极光后台申请后，修改以下四项，必须修改
    appKey: cf47465a368f24c659608e7e
    masterSecret: 02204efe3f3832947a236ee5
    pushUrl: "https://api.jpush.cn/v3/push"
    pushIntent: "intent:#Intent;component=io.openim.app.enterprisechat/io.openim.app.enterprisechat.MainActivity;end"
    enable: true
  getui:  #个推推送
    pushUrl: "https://restapi.getui.com/v2/$appId"
    masterSecret: ""
    appKey: ""
    intent: ""
    enable: false
  fcm:  #firebase cloud message 消息推送
    serviceAccount: "openim-*-firebase-adminsdk-*-*.json" #帐号文件，此处需要改修配置，并且这个文件放在 config目录下
    enable: false



manager:
  #app管理员userID和对应的secret  建议修改。 用于管理后台登录，也可以用户管理后台对应的api
  appManagerUid: [ "openIM123456","openIM654321", "openIM333", "openIMAdmin"]
  secrets: [ "openIM1","openIM2", "openIM333", "openIMAdmin"]
  appSysNotificationName: "系统通知"

secret: tuoyun
# 多端互踢策略
# 1：多平台登录：Android、iOS、Windows、Mac 每种平台只能一个在线，web端可以多个同时在线
multiloginpolicy: 1

#msg log insert to db
chatpersistencemysql: true
#可靠性存储
reliablestorage: false
#消息缓存时间
msgCacheTimeout: 86400
#群聊已读开启
groupMessageHasReadReceiptEnable: true
#单聊已读开启
singleMessageHasReadReceiptEnable: true

#token config
tokenpolicy:
  accessSecret: "open_im_server" #token生成相关，默认即可
  # Token effective time day as a unit
  accessExpire: 3650 #token过期时间（天） 默认即可
messageverify:
  friendVerify: false

#  c2c:
#    callbackBeforeSendMsg:
#      switch: false
#      timeoutStrategy: 1 #1:send
#    callbackAfterSendMsg:
#      switch: false
#  state:
#    stateChange:
#      switch: false
#ios系统推送声音以及标记计数
iospush:
  pushSound: "xxx"
  badgeCount: true
  production: false

callback:
  # callback url 需要自行更换callback url
  callbackUrl : "http://127.0.0.1:8080/callback"
  # 开启关闭操作前后回调的配置
  callbackBeforeSendSingleMsg:
    enable: false # 回调是否启用
    callbackTimeOut: 2 # 回调超时时间
    callbackFailedContinue: true # 回调超时是否继续执行代码
  callbackAfterSendSingleMsg:
    enable: false
    callbackTimeOut: 2
  callbackBeforeSendGroupMsg:
    enable: false
    callbackTimeOut: 2
    callbackFailedContinue: true
  callbackAfterSendGroupMsg:
    enable: false
    callbackTimeOut: 2
  callbackWordFilter:
    enable: false
    callbackTimeOut: 2
    callbackFailedContinue: true
  callbackUserOnline:
    enable: false
    callbackTimeOut: 2
  callbackUserOffline:
    enable: false
    callbackTimeOut: 2
  callbackOfflinePush:
    enable: false
    callbackTimeOut: 2
    callbackFailedContinue: true # 回调超时是否继续离线推送
  callbackOnlinePush:
    enable: false
    callbackTimeOut: 2
    callbackFailedContinue: true # 回调超时是否继续离线推送
  callbackSuperGroupOnlinePush:
    enable: false
    callbackTimeOut: 2
    callbackFailedContinue: true # 回调超时是否继续离线推送


notification:
  groupCreated:
    conversation:
      reliabilityLevel: 3
      unreadCount: true
    offlinePush:
      switch: true
      title: "create group title" # xx create the group
      desc: "create group desc"
      ext: "create group ext"
    defaultTips:
      tips: "create the group"  # xx create the group

  groupInfoSet:
    conversation:
      reliabilityLevel: 3
      unreadCount: true
    offlinePush:
      switch: false
      title: "groupInfoSet title"
      desc: "groupInfoSet desc"
      ext: "groupInfoSet ext"
    defaultTips:
      tips: "modified the group profile"  # group info changed by xx

  joinGroupApplication:
    conversation:
      reliabilityLevel: 2
      unreadCount: false
    offlinePush:
      switch: false
      title: "joinGroupApplication title"
      desc: "joinGroupApplication desc"
      ext: "joinGroupApplication ext"
    defaultTips:
      tips: "apply to join the group"  # group info changed by xx

  memberQuit:
    conversation:
      reliabilityLevel: 3
      unreadCount: true
    offlinePush:
      switch: false
      title: "memberQuit title"
      desc: "memberQuit desc"
      ext: "memberQuit ext"
    defaultTips:
      tips: "quit group msg"  # group info changed by xx

  groupApplicationAccepted:
    conversation:
      reliabilityLevel: 2
      unreadCount: true
    offlinePush:
      switch: false
      title: "groupApplicationAccepted title"
      desc: "groupApplicationAccepted desc"
      ext: "groupApplicationAccepted ext"
    defaultTips:
      tips: "was allowed to join the group"  # group info changed by xx

  groupApplicationRejected:
    conversation:
      reliabilityLevel: 2
      unreadCount: false
    offlinePush:
      switch: false
      title: " title"
      desc: " desc"
      ext: " ext"
    defaultTips:
      tips: "was rejected into the group"  # group info changed by xx

  groupOwnerTransferred:
    conversation:
      reliabilityLevel: 3
      unreadCount: true
    offlinePush:
      switch: false
      title: "groupOwnerTransferred title"
      desc: "groupOwnerTransferred desc"
      ext: "groupOwnerTransferred ext"
    defaultTips:
      tips: "become a new group owner"  # group info changed by xx

  memberKicked:
    conversation:
      reliabilityLevel: 3
      unreadCount: true
    offlinePush:
      switch: false
      title: "memberKicked title"
      desc: "memberKicked desc"
      ext: "memberKicked ext"
    defaultTips:
      tips: "was kicked out of the group"  # group info changed by xx

  memberInvited:
    conversation:
      reliabilityLevel: 3
      unreadCount: true
    offlinePush:
      switch: false
      title: "memberInvited title"
      desc: "memberInvited desc"
      ext: "memberInvited ext"
    defaultTips:
      tips: "was invited into the group"  # group info changed by xx

  memberEnter:
    conversation:
      reliabilityLevel: 3
      unreadCount: true
    offlinePush:
      switch: false
      title: "memberEnter title"
      desc: "memberEnter desc"
      ext: "memberEnter ext"
    defaultTips:
      tips: "entered the group"  # group info changed by xx

  groupDismissed:
    conversation:
      reliabilityLevel: 3
      unreadCount: true
    offlinePush:
      switch: false
      title: "groupDismissed title"
      desc: "groupDismissed desc"
      ext: "groupDismissed ext"
    defaultTips:
      tips: "group dismissed"


  groupMuted:
    conversation:
      reliabilityLevel: 3
      unreadCount: true
    offlinePush:
      switch: false
      title: "groupMuted title"
      desc: "groupMuted desc"
      ext: "groupMuted ext"
    defaultTips:
      tips: "group Muted"

  groupCancelMuted:
    conversation:
      reliabilityLevel: 3
      unreadCount: true
    offlinePush:
      switch: false
      title: "groupCancelMuted title"
      desc: "groupCancelMuted desc"
      ext: "groupCancelMuted ext"
    defaultTips:
      tips: "group Cancel Muted"


  groupMemberMuted:
    conversation:
      reliabilityLevel: 3
      unreadCount: true
    offlinePush:
      switch: false
      title: "groupMemberMuted title"
      desc: "groupMemberMuted desc"
      ext: "groupMemberMuted ext"
    defaultTips:
      tips: "group Member Muted"

  groupMemberCancelMuted:
    conversation:
      reliabilityLevel: 3
      unreadCount: true
    offlinePush:
      switch: false
      title: "groupMemberCancelMuted title"
      desc: "groupMemberCancelMuted desc"
      ext: "groupMemberCancelMuted ext"
    defaultTips:
      tips: "group Member Cancel Muted"

  groupMemberInfoSet:
    conversation:
      reliabilityLevel: 2
      unreadCount: false
    offlinePush:
      switch: false
      title: "groupMemberInfoSet title"
      desc: "groupMemberInfoSet desc"
      ext: "groupMemberInfoSet ext"
    defaultTips:
      tips: "group member info set"


  organizationChanged:
    conversation:
      reliabilityLevel: 2
      unreadCount: false
    offlinePush:
      switch: false
      title: "organizationChanged title"
      desc: "organizationChanged desc"
      ext: "organizationChanged ext"
    defaultTips:
      tips: "organization changed"



  #############################friend#################################

  friendApplicationAdded:
    conversation:
      reliabilityLevel: 2
      unreadCount: false
    offlinePush:
      switch: true
      title: "Somebody applies to add you as a friend"
      desc: "Somebody applies to add you as a friend"
      ext: "Somebody applies to add you as a friend"
    defaultTips:
      tips: "I applies to add you as a friend"  #

  friendApplicationApproved:
    conversation:
      reliabilityLevel: 2
      unreadCount: false
    offlinePush:
      switch: true
      title: "Someone applies to add your friend application"
      desc: "Someone applies to add your friend application"
      ext: "Someone applies to add your friend application"
    defaultTips:
      tips: "I applies to add your friend application"  #


  friendApplicationRejected:
    conversation:
      reliabilityLevel: 2
      unreadCount: false
    offlinePush:
      switch: true
      title: "Someone rejected your friend application"
      desc: "Someone rejected your friend application"
      ext: "Someone rejected your friend application"
    defaultTips:
      tips: "I rejected your friend application"  #





  friendAdded:
    conversation:
      reliabilityLevel: 3
      unreadCount: true
    offlinePush:
      switch: true
      title: "We have become friends"
      desc: "We have become friends"
      ext: "We have become friends"
    defaultTips:
      tips: "We have become friends"  #



  friendDeleted:
    conversation:
      reliabilityLevel: 2
      unreadCount: false
    offlinePush:
      switch: true
      title: "deleted a friend"
      desc: "deleted a friend"
      ext: "deleted a friend"
    defaultTips:
      tips: "deleted a friend"  #


  friendRemarkSet:
    conversation:
      reliabilityLevel: 2
      unreadCount: false
    offlinePush:
      switch: true
      title: "Your friend's profile has been changed"
      desc: "Your friend's profile has been changed"
      ext: "Your friend's profile has been changed"
    defaultTips:
      tips: "Your friend's profile has been changed"  #



  blackAdded:
    conversation:
      reliabilityLevel: 2
      unreadCount: false
    offlinePush:
      switch: true
      title: "blocked a user"
      desc: "blocked a user"
      ext: "blocked a user"
    defaultTips:
      tips: "blocked a user"  #


  blackDeleted:
    conversation:
      reliabilityLevel: 2
      unreadCount: false
    offlinePush:
      switch: true
      title: "Remove a blocked user"
      desc: "Remove a blocked user"
      ext: "Remove a blocked user"
    defaultTips:
      tips: "Remove a blocked user"

  #####################user#########################
  userInfoUpdated:
    conversation:
      reliabilityLevel: 2
      unreadCount: false
    offlinePush:
      switch: true
      title: "Remove a blocked user"
      desc: "Remove a blocked user"
      ext: "Remove a blocked user"
    defaultTips:
      tips: "remove a blocked user"

  #####################conversation#########################
  conversationOptUpdate:
    conversation:
      reliabilityLevel: 1
      unreadCount: false
      offlinePush:
        switch: true
        title: "conversation opt update"
        desc: "conversation opt update"
        ext: "conversation opt update"
      defaultTips:
        tips: "conversation opt update"

  conversationSetPrivate:
    conversation:
      reliabilityLevel: 3
      unreadCount: true
    offlinePush:
      switch: true
      title: "burn after reading"
      desc: "burn after reading"
      ext: "burn after reading"
    defaultTips:
      openTips: "burn after reading was opened"
      closeTips: "burn after reading was closed"

  ###################workMoments################
  workMomentsNotification:
    conversation:
      reliabilityLevel: 2
      unreadCount: true
      offlinePush:
        switch: true
        title: "burn after reading"
        desc: "burn after reading"
        ext: "burn after reading"
      defaultTips:
        openTips: "burn after reading was opened"
        closeTips: "burn after reading was closed"

  ###################organization################
  joinDepartmentNotification:
    conversation:
      reliabilityLevel: 3
      unreadCount: true
      offlinePush:
        switch: false
        title: "welcome user join department"
        desc: "welcome user join department"
        ext: "welcome user join department"
      defaultTips:
        tips: "welcome user join department"

#---------------demo configuration---------------------#
#The following configuration items are applied to openIM Demo configuration
#是否启动demo，如果自身没有账号体系，设置为true
demoswitch: true
demo:
  listenIP: 0.0.0.0
  #demo对外服务端口，默认即可，需要开放此端口或做nginx转发
  openImDemoPort: [ 10004 ]
  alismsverify: #阿里云短信配置，在阿里云申请成功后修改以下四项，enable为true则必须修改，阿里云为默认短信验证方式
    accessKeyId: LTAI5tJPkn4HuuePdiLdGqe7
    accessKeySecret: 4n9OJ7ZCVN1U6KeHDAtOyNeVZcjOuV
    signName: 托云信息技术
    verificationCodeTemplateCode: SMS_226810164
    enable: false
  tencentsms: #腾讯云短信配置，在腾讯云申请成功后，修改以下选项，enable为true则必须修改
    appID:  2400000648
    region: "ap-singapore"
    secretID: IKIDra4JPGsFMDwQedMq42lESQBgwwgBQQAe
    secretKey: HI6fz4uUotjJdiX6QUIrAE2buxlKdgU2
    signName: ""
    verificationCodeTemplateCode: 2902877
    enable: true
  superCode: 666666 #超级验证码，建议修改掉，收不到短信验证码时可以用此替代
  #  second
  codeTTL: 60
  useSuperCode: true
  mail: #仅支持qq邮箱，具体操作参考 https://service.mail.qq.com/cgi-bin/help?subtype=1&id=28&no=1001256 必须修改
    title: "openIM"
    senderMail: "765567899@qq.com"
    senderAuthorizationCode: "gxyausfoevlzbfag"
    smtpAddr: "smtp.qq.com"
    smtpPort: 25   #需开放此端口 出口方向
  testDepartMentID: 001
  imAPIURL: http://127.0.0.1:10002

rtc:
  signalTimeout: 35
