# 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: ${ENVS_DISCOVERY} ###################### Zookeeper ###################### # Zookeeper configuration # It's not recommended to modify the schema # # Zookeeper address # Zookeeper username # Zookeeper password zookeeper: schema: ${ZOOKEEPER_SCHEMA} address: [ ${ZOOKEEPER_ADDRESS}:${ZOOKEEPER_PORT} ] username: ${ZOOKEEPER_USERNAME} password: ${ZOOKEEPER_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: ${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: [ ${MONGO_ADDRESS}:${MONGO_PORT} ] database: ${MONGO_DATABASE} username: ${MONGO_OPENIM_USERNAME} password: ${MONGO_OPENIM_PASSWORD} maxPoolSize: ${MONGO_MAX_POOL_SIZE} ###################### Redis configuration information ###################### # Redis configuration # # Username is required only for Redis version 6.0+ redis: address: [ ${REDIS_ADDRESS}:${REDIS_PORT} ] username: ${REDIS_USERNAME} password: ${REDIS_PASSWORD} ###################### 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: ${KAFKA_USERNAME} password: ${KAFKA_PASSWORD} addr: [ ${KAFKA_ADDRESS}:${KAFKA_PORT} ] latestMsgToRedis: topic: "${KAFKA_LATESTMSG_REDIS_TOPIC}" offlineMsgToMongo: topic: "${KAFKA_OFFLINEMSG_MONGO_TOPIC}" msgToPush: topic: "${KAFKA_MSG_PUSH_TOPIC}" consumerGroupID: msgToRedis: ${KAFKA_CONSUMERGROUPID_REDIS} msgToMongo: ${KAFKA_CONSUMERGROUPID_MONGO} msgToMySql: ${KAFKA_CONSUMERGROUPID_MYSQL} msgToPush: ${KAFKA_CONSUMERGROUPID_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: ${RPC_REGISTER_IP} listenIP: ${RPC_LISTEN_IP} ###################### API configuration information ###################### # API configuration # # API service port # Default listen IP is 0.0.0.0 api: openImApiPort: [ ${API_OPENIM_PORT} ] listenIP: ${API_LISTEN_IP} ###################### 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: "${OBJECT_ENABLE}" apiURL: "${OBJECT_APIURL}" minio: bucket: "${MINIO_BUCKET}" endpoint: "${MINIO_ENDPOINT}" accessKeyID: "${MINIO_ACCESS_KEY}" secretAccessKey: "${MINIO_SECRET_KEY}" sessionToken: ${MINIO_SESSION_TOKEN} signEndpoint: "${MINIO_SIGN_ENDPOINT}" publicRead: ${MINIO_PUBLIC_READ} cos: bucketURL: ${COS_BUCKET_URL} secretID: ${COS_SECRET_ID} secretKey: ${COS_SECRET_KEY} sessionToken: ${COS_SESSION_TOKEN} publicRead: ${COS_PUBLIC_READ} oss: endpoint: "${OSS_ENDPOINT}" bucket: "${OSS_BUCKET}" bucketURL: "${OSS_BUCKET_URL}" accessKeyID: ${OSS_ACCESS_KEY_ID} accessKeySecret: ${OSS_ACCESS_KEY_SECRET} sessionToken: ${OSS_SESSION_TOKEN} publicRead: ${OSS_PUBLIC_READ} kodo: endpoint: "${KODO_ENDPOINT}" bucket: "${KODO_BUCKET}" bucketURL: "${KODO_BUCKET_URL}" accessKeyID: ${KODO_ACCESS_KEY_ID} accessKeySecret: ${KODO_ACCESS_KEY_SECRET} sessionToken: ${KODO_SESSION_TOKEN} publicRead: ${KODO_PUBLIC_READ} aws: endpoint: "${AWS_ENDPOINT}" # This might not be necessary unless you're using a custom endpoint region: "${AWS_REGION}" bucket: "${AWS_BUCKET}" accessKeyID: ${AWS_ACCESS_KEY_ID} accessKeySecret: ${AWS_SECRET_ACCESS_KEY} publicRead: ${AWS_PUBLIC_READ} ###################### 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: [ ${OPENIM_USER_PORT} ] openImFriendPort: [ ${OPENIM_FRIEND_PORT} ] openImMessagePort: [ ${OPENIM_MESSAGE_PORT} ] openImGroupPort: [ ${OPENIM_GROUP_PORT} ] openImAuthPort: [ ${OPENIM_AUTH_PORT} ] openImPushPort: [ ${OPENIM_PUSH_PORT} ] openImConversationPort: [ ${OPENIM_CONVERSATION_PORT} ] openImThirdPort: [ ${OPENIM_THIRD_PORT} ] ###################### RPC Register Name Configuration ###################### # RPC service names for registration, it's not recommended to modify these rpcRegisterName: openImUserName: ${OPENIM_USER_NAME} openImFriendName: ${OPENIM_FRIEND_NAME} openImMsgName: ${OPENIM_MSG_NAME} openImPushName: ${OPENIM_PUSH_NAME} openImMessageGatewayName: ${OPENIM_MESSAGE_GATEWAY_NAME} openImGroupName: ${OPENIM_GROUP_NAME} openImAuthName: ${OPENIM_AUTH_NAME} openImConversationName: ${OPENIM_CONVERSATION_NAME} openImThirdName: ${OPENIM_THIRD_NAME} ###################### 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: ${LOG_STORAGE_LOCATION} rotationTime: ${LOG_ROTATION_TIME} remainRotationCount: ${LOG_REMAIN_ROTATION_COUNT} remainLogLevel: ${LOG_REMAIN_LOG_LEVEL} isStdout: ${LOG_IS_STDOUT} isJson: ${LOG_IS_JSON} withStack: ${LOG_WITH_STACK} ###################### 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: [ ${OPENIM_WS_PORT} ] websocketMaxConnNum: ${WEBSOCKET_MAX_CONN_NUM} openImMessageGatewayPort: [ ${OPENIM_MESSAGE_GATEWAY_PORT} ] websocketMaxMsgLen: ${WEBSOCKET_MAX_MSG_LEN} websocketTimeout: ${WEBSOCKET_TIMEOUT} # 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: ${PUSH_ENABLE} geTui: pushUrl: "${GETUI_PUSH_URL}" masterSecret: ${GETUI_MASTER_SECRET} appKey: ${GETUI_APP_KEY} intent: ${GETUI_INTENT} channelID: ${GETUI_CHANNEL_ID} channelName: ${GETUI_CHANNEL_NAME} fcm: serviceAccount: "${FCM_SERVICE_ACCOUNT}" jpush: appKey: ${JPUSH_APP_KEY} masterSecret: ${JPUSH_MASTER_SECRET} pushUrl: ${JPUSH_PUSH_URL} pushIntent: ${JPUSH_PUSH_INTENT} # App manager configuration # # Built-in app manager user IDs # Built-in app manager nicknames # Attention, this configure is discarded. If you have used him before, configure your own manager: userID: nickname: # chatAdmin, use for send notification # # Built-in app system notification account ID # Built-in app system notification account nickname im-admin: userID: [ "${IM_ADMIN_USERID}" ] nickname: [ "${IM_ADMIN_NAME}" ] # Multi-platform login policy # For each platform(Android, iOS, Windows, Mac, web), only one can be online at a time multiLoginPolicy: ${MULTILOGIN_POLICY} # Whether to store messages in MySQL, messages in MySQL are only used for management background chatPersistenceMysql: ${CHAT_PERSISTENCE_MYSQL} # Message cache timeout in seconds, it's not recommended to modify msgCacheTimeout: ${MSG_CACHE_TIMEOUT} # Whether to enable read receipts for group chat groupMessageHasReadReceiptEnable: ${GROUP_MSG_READ_RECEIPT} # Whether to enable read receipts for single chat singleMessageHasReadReceiptEnable: ${SINGLE_MSG_READ_RECEIPT} # MongoDB offline message retention period in days retainChatRecords: ${RETAIN_CHAT_RECORDS} # 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: "${CHAT_RECORDS_CLEAR_TIME}" # 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: "${MSG_DESTRUCT_TIME}" # Secret key secret: ${SECRET} # Token policy # # Token expiration period in days tokenPolicy: expire: ${TOKEN_EXPIRE} # 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: "webhook://127.0.0.1:10008/callbackExample" beforeSendSingleMsg: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeUpdateUserInfoEx: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} afterUpdateUserInfoEx: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} afterSendSingleMsg: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeSendGroupMsg: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} afterSendGroupMsg: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} msgModify: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} userOnline: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} userOffline: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} userKickOff: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} offlinePush: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} onlinePush: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} superGroupOnlinePush: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeAddFriend: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeUpdateUserInfo: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeCreateGroup: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} afterCreateGroup: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeMemberJoinGroup: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeSetGroupMemberInfo: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} afterSetGroupMemberInfo: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} setMessageReactionExtensions: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} quitGroup: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} killGroupMember: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} dismissGroup: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} joinGroup: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} groupMsgRead: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} singleMsgRead: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} updateUserInfo: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeUserRegister: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} afterUserRegister: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} transferGroupOwner: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeSetFriendRemark: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} afterSetFriendRemark: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} afterGroupMsgRead: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} afterGroupMsgRevoke: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} afterJoinGroup: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeInviteUserToGroup: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} joinGroupAfter: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} setGroupInfoAfter: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} setGroupInfoBefore: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} revokeMsgAfter: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} addBlackBefore: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} addFriendAfter: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} addFriendAgreeBefore: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} deleteFriendAfter: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} importFriendsBefore: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} importFriendsAfter: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} removeBlackAfter: enable: ${CALLBACK_ENABLE} timeout: ${CALLBACK_TIMEOUT} failedContinue: ${CALLBACK_FAILED_CONTINUE} ###################### 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: ${PROMETHEUS_ENABLE} grafanaUrl: ${GRAFANA_URL} apiPrometheusPort: [${API_PROM_PORT}] userPrometheusPort: [ ${USER_PROM_PORT} ] friendPrometheusPort: [ ${FRIEND_PROM_PORT} ] messagePrometheusPort: [ ${MESSAGE_PROM_PORT} ] messageGatewayPrometheusPort: [ ${MSG_GATEWAY_PROM_PORT} ] groupPrometheusPort: [ ${GROUP_PROM_PORT} ] authPrometheusPort: [ ${AUTH_PROM_PORT} ] pushPrometheusPort: [ ${PUSH_PROM_PORT} ] conversationPrometheusPort: [ ${CONVERSATION_PROM_PORT} ] rtcPrometheusPort: [ ${RTC_PROM_PORT} ] thirdPrometheusPort: [ ${THIRD_PROM_PORT} ] messageTransferPrometheusPort: [ ${MSG_TRANSFER_PROM_PORT} ] # List of ports ###################### LocalCache configuration information ###################### # topic: redis subscriber channel # slotNum: number of slots, multiple slots can prevent too many keys from competing for a lock # slotSize: number of slots, the number of cached keys per slot, the overall cache quantity is slotNum * slotSize # successExpire: successful cache time seconds # failedExpire: failed cache time seconds # disable local caching and annotate topic, slotNum, and slotSize localCache: user: topic: DELETE_CACHE_USER slotNum: 100 slotSize: 2000 successExpire: 300 failedExpire: 5 group: topic: DELETE_CACHE_GROUP slotNum: 100 slotSize: 2000 successExpire: 300 failedExpire: 5 friend: topic: DELETE_CACHE_FRIEND slotNum: 100 slotSize: 2000 successExpire: 300 failedExpire: 5 conversation: topic: DELETE_CACHE_CONVERSATION slotNum: 100 slotSize: 2000 successExpire: 300 failedExpire: 5