# Copyright © 2023 OpenIM. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the License);
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# -----------------------------------------------------------------
# TODO: This config file is the template file
# --| source: deployments/templates/config.yaml
# --| env: scripts/install/environment
# --| target: config/config.yaml
# -----------------------------------------------------------------

envs:
  discovery: zookeeper

###################### Zookeeper ######################
# Zookeeper configuration
# It's not recommended to modify the schema
# 
# Zookeeper address
# Zookeeper username
# Zookeeper password
zookeeper:
  schema: openim
  address: [ 172.28.0.1:12181 ]
  username: ''
  password: ''

###################### Mongo ######################
# MongoDB configuration

# If uri is not empty, it will be used directly for the MongoDB connection.
# This is a complete MongoDB URI string.
# Example: mongodb://user:password@host1:port1,host2:port2/dbname?options
mongo:
  uri: ''

# List of MongoDB server addresses.
# Used for constructing the MongoDB URI if 'uri' above is empty.
# For a standalone setup, specify the address of the single server.
# For a sharded cluster, specify the addresses of the Mongos servers.
# Example: [ '172.28.0.1:37017', '172.28.0.2:37017' ]
# Default MongoDB database name
# Maximum connection pool size
  address: [ 172.28.0.1:37017 ]
  database: openim_v3
  username: openIM
  password: openIM123
  maxPoolSize: 100

###################### Redis configuration information ######################
# Redis configuration
#
# Username is required only for Redis version 6.0+
redis:
  address: [ 172.28.0.1:16379 ]
  username: ''
  password: openIM123

###################### Kafka configuration information ######################
# Kafka configuration
#
# Kafka username
# Kafka password
# It's not recommended to modify this topic name
# Consumer group ID, it's not recommended to modify
kafka:
  username: ''
  password: ''
  addr: [ 172.28.0.1:19094 ]
  latestMsgToRedis:
    topic: "latestMsgToRedis"
  offlineMsgToMongo:
    topic: "offlineMsgToMongoMysql"
  msgToPush:
    topic: "msgToPush"
  consumerGroupID:
    msgToRedis: redis
    msgToMongo: mongo
    msgToMySql: mysql
    msgToPush: push

###################### RPC configuration information ######################
# RPC configuration
#
# IP address to register with zookeeper when starting RPC, the IP and corresponding rpcPort should be accessible by api/gateway
# Default listen IP is 0.0.0.0
rpc:
  registerIP: ''
  listenIP: 0.0.0.0

###################### API configuration information ######################
# API configuration
#
# API service port
# Default listen IP is 0.0.0.0
api:
  openImApiPort: [ 10002 ]
  listenIP: 0.0.0.0

###################### Object configuration information ######################
# Object storage configuration
#
# Use minio for object storage
# API URL should be accessible by the app
# It's not recommended to modify the bucket name
# Endpoint should be accessible by the app
# Session token
# Configuration for Tencent COS
# Configuration for Aliyun OSS
# apiURL is the address of the api, the access address of the app, use s3 must be configured
# minio.endpoint can be configured as an intranet address,
# minio.signEndpoint is minio public network address
object:
  enable: "minio"
  apiURL: "http://172.28.0.1:10002"
  minio:
    bucket: "openim"
    endpoint: "http://172.28.0.1:10005"
    accessKeyID: "root"
    secretAccessKey: "openIM123"
    sessionToken: ''
    signEndpoint: "http://172.28.0.1:10005"
    publicRead: false
  cos:
    bucketURL: https://temp-1252357374.cos.ap-chengdu.myqcloud.com
    secretID: ''
    secretKey: ''
    sessionToken: ''
    publicRead: false
  oss:
    endpoint: "https://oss-cn-chengdu.aliyuncs.com"
    bucket: "demo-9999999"
    bucketURL: "https://demo-9999999.oss-cn-chengdu.aliyuncs.com"
    accessKeyID: ''
    accessKeySecret: ''
    sessionToken: ''
    publicRead: false
  kodo:
    endpoint: "http://s3.cn-east-1.qiniucs.com"
    bucket: "demo-9999999"
    bucketURL: "http://your.domain.com"
    accessKeyID: ''
    accessKeySecret: ''
    sessionToken: ''
    publicRead: false

###################### RPC Port Configuration ######################
# RPC service ports
# These ports are passed into the program by the script and are not recommended to modify
# For launching multiple programs, just fill in multiple ports separated by commas
# For example, [10110, 10111]
rpcPort:
  openImUserPort: [ 10110 ]
  openImFriendPort: [ 10120 ]
  openImMessagePort: [ 10130 ]
  openImGroupPort: [ 10150 ]
  openImAuthPort: [ 10160 ]
  openImPushPort: [ 10170 ]
  openImConversationPort: [ 10180 ]
  openImThirdPort: [ 10190 ]

###################### RPC Register Name Configuration ######################
# RPC service names for registration, it's not recommended to modify these
rpcRegisterName:
  openImUserName: User
  openImFriendName: Friend
  openImMsgName: Msg
  openImPushName: Push
  openImMessageGatewayName: MessageGateway
  openImGroupName: Group
  openImAuthName: Auth
  openImConversationName: Conversation
  openImThirdName: Third

###################### Log Configuration ######################
# Log configuration
#
# Storage directory
# Log rotation time
# Maximum number of logs to retain
# Log level, 6 means all levels
# Whether to output to stdout
# Whether to output in json format
# Whether to include stack trace in logs
log:
  storageLocation: /workspaces/open-im-server/logs/
  rotationTime: 24
  remainRotationCount: 2
  remainLogLevel: 6
  isStdout: false
  isJson: false
  withStack: false

###################### Variables definition ######################
# Long connection server configuration
#
# Websocket port for msg_gateway
# Maximum number of websocket connections
# Maximum length of websocket request package
# Websocket connection handshake timeout
longConnSvr:
  openImWsPort: [ 10001 ]
  websocketMaxConnNum: 100000
  openImMessageGatewayPort: [ 10140 ]
  websocketMaxMsgLen: 4096
  websocketTimeout: 10

# Push notification service configuration
#
# Use GeTui for push notifications
# GeTui offline push configuration
# FCM offline push configuration
# Account file, place it in the config directory
# JPush configuration, modify these after applying in JPush backend
push:
  enable: getui
  geTui:
    pushUrl: "https://restapi.getui.com/v2/$appId"
    masterSecret: ''
    appKey: ''
    intent: ''
    channelID: ''
    channelName: ''
  fcm:
    serviceAccount: "x.json"
  jpns:
    appKey: ''
    masterSecret: ''
    pushUrl: ''
    pushIntent: ''

# App manager configuration
#
# Built-in app manager user IDs
# Built-in app manager nicknames
manager:
  userID: [ "openIM123456", "openIM654321", "openIMAdmin" ]
  nickname: [ "system1", "system2", "system3" ]

# chatAdmin, use for send notification
#
# Built-in app system notification account ID
# Built-in app system notification account nickname
im-admin:
  userID: [ "imAdmin" ]
  nickname: [ "imAdmin" ]

# Multi-platform login policy
# For each platform(Android, iOS, Windows, Mac, web), only one can be online at a time
multiLoginPolicy: 1

# Whether to store messages in MySQL, messages in MySQL are only used for management background
chatPersistenceMysql: true

# Message cache timeout in seconds, it's not recommended to modify
msgCacheTimeout: 86400

# Whether to enable read receipts for group chat
groupMessageHasReadReceiptEnable: true

# Whether to enable read receipts for single chat
singleMessageHasReadReceiptEnable: true

# MongoDB offline message retention period in days
retainChatRecords: 365

# Schedule to clear expired messages(older than retainChatRecords days) in MongoDB every Wednesday at 2am
# This deletion is just for cleaning up disk usage according to previous configuration retainChatRecords, no notification will be sent
chatRecordsClearTime: "0 2 * * 3"

# Schedule to auto delete messages every day at 2am
# This deletion is for messages that have been retained for more than msg_destruct_time (seconds) in the conversation field
msgDestructTime: "0 2 * * *"

# Secret key
secret: openIM123

# Token policy
#
# Token expiration period in days
tokenPolicy:
  expire: 90

# Message verification policy
#
# Whether to verify friendship when sending messages
messageVerify:
  friendVerify: false

# iOS push notification configuration
#
# iOS push notification sound
# Whether to count badge
# Whether it's production environment
iosPush:
  pushSound: "xxx"
  badgeCount: true
  production: false

###################### Third-party service configuration ######################
# Callback configuration
#
# Callback URL
# Whether to enable this callback event
# Timeout in seconds
# Whether to continue execution if callback fails
callback:
  url: "http://127.0.0.1:10008/callbackExample"
  beforeSendSingleMsg:
    enable: false
    timeout: 5
    failedContinue: true
  beforeUpdateUserInfoEx:
    enable:  false
    timeout: 5
    failedContinue: true
  afterUpdateUserInfoEx:
    enable:  false
    timeout: 5
    failedContinue: true
  afterSendSingleMsg:
    enable: true
    timeout: 5
    failedContinue: true
  beforeSendGroupMsg:
    enable: false
    timeout: 5
    failedContinue: true
  afterSendGroupMsg:
    enable: false
    timeout: 5
    failedContinue: true
  msgModify:
    enable: false
    timeout: 5
    failedContinue: true
  userOnline:
    enable: false
    timeout: 5
    failedContinue: true
  userOffline:
    enable: false
    timeout: 5
    failedContinue: true
  userKickOff:
    enable: false
    timeout: 5
    failedContinue: true
  offlinePush:
    enable: false
    timeout: 5
    failedContinue: true
  onlinePush:
    enable: false
    timeout: 5
    failedContinue: true
  superGroupOnlinePush:
    enable: false
    timeout: 5
    failedContinue: true
  beforeAddFriend:
    enable: false
    timeout: 5
    failedContinue: true
  beforeUpdateUserInfo:
    enable: false
    timeout: 5
    failedContinue: true
  beforeCreateGroup:
    enable: false
    timeout: 5
    failedContinue: true
  afterCreateGroup:
    enable: false
    timeout: 5
    failedContinue: true
  beforeMemberJoinGroup:
    enable: false
    timeout: 5
    failedContinue: true
  beforeSetGroupMemberInfo:
    enable: false
    timeout: 5
    failedContinue: true
  afterSetGroupMemberInfo:
    enable: false
    timeout: 5
    failedContinue: true
  setMessageReactionExtensions:
    enable: false
    timeout: 5
    failedContinue: true
  quitGroup:
    enable: false
    timeout: 5
    failedContinue: true
  killGroupMember:
    enable: false
    timeout: 5
    failedContinue: true
  dismissGroup:
    enable: false
    timeout: 5
    failedContinue: true
  joinGroup:
    enable: false
    timeout: 5
    failedContinue: true
  groupMsgRead:
    enable: false
    timeout: 5
    failedContinue: true
  singleMsgRead:
    enable: false
    timeout: 5
    failedContinue: true
  updateUserInfo:
    enable: false
    timeout: 5
    failedContinue: true
  beforeUserRegister:
    enable: false
    timeout: 5
    failedContinue: true
  afterUserRegister:
    enable: false
    timeout: 5
    failedContinue: true
  transferGroupOwner:
    enable: false
    timeout: 5
    failedContinue: true
  beforeSetFriendRemark:
    enable: false
    timeout: 5
    failedContinue: true
  afterSetFriendRemark:
    enable: false
    timeout: 5
    failedContinue: true
  afterGroupMsgRead:
    enable: false
    timeout: 5
    failedContinue: true
  afterGroupMsgRevoke:
    enable: false
    timeout: 5
    failedContinue: true
  afterJoinGroup:
    enable: false
    timeout: 5
    failedContinue: true
  beforeInviteUserToGroup:
    enable: false
    timeout: 5
    failedContinue: true
  joinGroupAfter:
    enable: false
    timeout: 5
    failedContinue: true
  setGroupInfoAfter:
    enable: false
    timeout: 5
    failedContinue: true
  setGroupInfoBefore:
    enable: false
    timeout: 5
    failedContinue: true
  revokeMsgAfter:
    enable: false
    timeout: 5
    failedContinue: true
  addBlackBefore:
    enable: false
    timeout: 5
    failedContinue: true
  addFriendAfter:
    enable: false
    timeout: 5
    failedContinue: true
  addFriendAgreeBefore:
    enable: false
    timeout: 5
    failedContinue: true
  deleteFriendAfter:
    enable: false
    timeout: 5
    failedContinue: true
  importFriendsBefore:
    enable: false
    timeout: 5
    failedContinue: true
  importFriendsAfter:
    enable: false
    timeout: 5
    failedContinue: true
  removeBlackAfter:
    enable: false
    timeout: 5
    failedContinue: true
###################### Prometheus ######################
# Prometheus configuration for various services
# The number of Prometheus ports per service needs to correspond to rpcPort
# The number of ports needs to be consistent with msg_transfer_service_num in script/path_info.sh
prometheus:
  enable: true
  grafanaUrl: http://172.28.0.1:13000/
  apiPrometheusPort: [20100]
  userPrometheusPort: [ 20110 ]
  friendPrometheusPort: [ 20120 ]
  messagePrometheusPort: [ 20130 ]
  messageGatewayPrometheusPort: [ 20140 ]
  groupPrometheusPort: [ 20150 ]
  authPrometheusPort: [ 20160 ]
  pushPrometheusPort: [ 20170 ]
  conversationPrometheusPort: [ 20230 ]
  rtcPrometheusPort: [ 21300 ]
  thirdPrometheusPort: [ 21301 ]
  messageTransferPrometheusPort: [ 21400, 21401, 21402, 21403 ] # List of ports