mirror of
https://github.com/openimsdk/open-im-server.git
synced 2025-04-06 04:15:46 +08:00
Merge branch 'superGroup' of https://github.com/OpenIMSDK/Open-IM-Server into superGroup
This commit is contained in:
commit
c94fb80cb0
139
docker-compose-mongos.yaml
Normal file
139
docker-compose-mongos.yaml
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
version: "3"
|
||||||
|
#fixme Clone openIM Server project before using docker-compose,project address:https://github.com/OpenIMSDK/Open-IM-Server.git
|
||||||
|
|
||||||
|
services:
|
||||||
|
mysql:
|
||||||
|
image: mysql:5.7
|
||||||
|
ports:
|
||||||
|
- 13306:3306
|
||||||
|
- 23306:33060
|
||||||
|
container_name: mysql
|
||||||
|
volumes:
|
||||||
|
- ./components/mysql/data:/var/lib/mysql
|
||||||
|
- /etc/localtime:/etc/localtime
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: openIM
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
mongos:
|
||||||
|
image: mongo:latest
|
||||||
|
ports:
|
||||||
|
- 37017:27017
|
||||||
|
container_name: mongos
|
||||||
|
command: mongos --configdb config/103.116.45.174:27019 --bind_ip_all
|
||||||
|
volumes:
|
||||||
|
- ./components/mongos_mongodb/data/db:/data/db
|
||||||
|
- ./components/mongos_mongodb/data/logs:/data/logs
|
||||||
|
- ./components/mongos_mongodb/data/conf:/etc/mongo
|
||||||
|
- ./components/mongos_mongodb/data/configdb:/data/configdb
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
|
# cache
|
||||||
|
- wiredTigerCacheSizeGB=1
|
||||||
|
# environment:
|
||||||
|
# - MONGO_INITDB_ROOT_USERNAME=openIM
|
||||||
|
# - MONGO_INITDB_ROOT_PASSWORD=openIM
|
||||||
|
|
||||||
|
|
||||||
|
#TZ: Asia/Shanghai
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis
|
||||||
|
ports:
|
||||||
|
- 16379:6379
|
||||||
|
container_name: redis
|
||||||
|
volumes:
|
||||||
|
- ./components/redis/data:/data
|
||||||
|
#redis config file
|
||||||
|
- ./components/redis/config/redis.conf:/usr/local/redis/config/redis.conf
|
||||||
|
environment:
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
restart: always
|
||||||
|
sysctls:
|
||||||
|
net.core.somaxconn: 1024
|
||||||
|
command: redis-server --requirepass openIM --appendonly yes
|
||||||
|
|
||||||
|
|
||||||
|
zookeeper:
|
||||||
|
image: wurstmeister/zookeeper
|
||||||
|
ports:
|
||||||
|
- 2181:2181
|
||||||
|
container_name: zookeeper
|
||||||
|
volumes:
|
||||||
|
- /etc/localtime:/etc/localtime
|
||||||
|
environment:
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
|
||||||
|
kafka:
|
||||||
|
image: wurstmeister/kafka
|
||||||
|
container_name: kafka
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 9092:9092
|
||||||
|
environment:
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
KAFKA_BROKER_ID: 0
|
||||||
|
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
|
||||||
|
KAFKA_CREATE_TOPICS: "ws2ms_chat:8:1,ms2ps_chat:8:1,msg_to_mongo:8:1"
|
||||||
|
KAFKA_ADVERTISED_LISTENERS: INSIDE://127.0.0.1:9092,OUTSIDE://103.116.45.174:9092
|
||||||
|
KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9093
|
||||||
|
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT"
|
||||||
|
KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
|
||||||
|
depends_on:
|
||||||
|
- zookeeper
|
||||||
|
|
||||||
|
etcd:
|
||||||
|
image: quay.io/coreos/etcd
|
||||||
|
ports:
|
||||||
|
- 2379:2379
|
||||||
|
- 2380:2380
|
||||||
|
container_name: etcd
|
||||||
|
volumes:
|
||||||
|
- /etc/timezone:/etc/timezone
|
||||||
|
- /etc/localtime:/etc/localtime
|
||||||
|
environment:
|
||||||
|
ETCDCTL_API: 3
|
||||||
|
restart: always
|
||||||
|
command: /usr/local/bin/etcd --name etcd0 --data-dir /etcd-data --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379 --listen-peer-urls http://0.0.0.0:2380 --initial-advertise-peer-urls http://0.0.0.0:2380 --initial-cluster etcd0=http://0.0.0.0:2380 --initial-cluster-token tkn --initial-cluster-state new
|
||||||
|
|
||||||
|
minio:
|
||||||
|
image: minio/minio
|
||||||
|
ports:
|
||||||
|
- 10005:9000
|
||||||
|
- 9090:9090
|
||||||
|
container_name: minio
|
||||||
|
volumes:
|
||||||
|
- /mnt/data:/data
|
||||||
|
- /mnt/config:/root/.minio
|
||||||
|
environment:
|
||||||
|
MINIO_ROOT_USER: user12345
|
||||||
|
MINIO_ROOT_PASSWORD: key12345
|
||||||
|
restart: always
|
||||||
|
command: minio server /data --console-address ':9090'
|
||||||
|
|
||||||
|
open_im_server:
|
||||||
|
image: openim/open_im_server:v2.2.0
|
||||||
|
container_name: open_im_server
|
||||||
|
volumes:
|
||||||
|
- ./logs:/Open-IM-Server/logs
|
||||||
|
- ./config/config.yaml:/Open-IM-Server/config/config.yaml
|
||||||
|
- ./db/sdk:/Open-IM-Server/db/sdk
|
||||||
|
- ./script:/Open-IM-Server/script
|
||||||
|
restart: always
|
||||||
|
depends_on:
|
||||||
|
- kafka
|
||||||
|
- mysql
|
||||||
|
- mongos
|
||||||
|
- redis
|
||||||
|
- etcd
|
||||||
|
- minio
|
||||||
|
network_mode: "host"
|
||||||
|
logging:
|
||||||
|
driver: json-file
|
||||||
|
options:
|
||||||
|
max-size: "1g"
|
||||||
|
max-file: "2"
|
113
docker-compose-shard-cluster.yaml
Normal file
113
docker-compose-shard-cluster.yaml
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
version: '3'
|
||||||
|
networks:
|
||||||
|
mongo-network:
|
||||||
|
external: false
|
||||||
|
services:
|
||||||
|
# 配置服务器configsvr
|
||||||
|
config:
|
||||||
|
image: mongo:latest
|
||||||
|
networks:
|
||||||
|
- mongo-network
|
||||||
|
container_name: config
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 27019:27019
|
||||||
|
command: --configsvr --replSet "config" --bind_ip_all
|
||||||
|
volumes:
|
||||||
|
- ./components/config_mongodb/data/db:/data/db
|
||||||
|
- ./components/config_mongodb/data/logs:/data/logs
|
||||||
|
- ./components/config_mongodb/data/conf:/etc/mongo
|
||||||
|
- ./components/config_mongodb/data/configdb:/data/configdb
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
|
# cache
|
||||||
|
- wiredTigerCacheSizeGB=1
|
||||||
|
|
||||||
|
# shard分片1
|
||||||
|
shard1:
|
||||||
|
image: mongo:latest
|
||||||
|
networks:
|
||||||
|
- mongo-network
|
||||||
|
container_name: shard1
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 27118:27018
|
||||||
|
command: --shardsvr --replSet "shard1" --bind_ip_all
|
||||||
|
volumes:
|
||||||
|
- /data01/mongo/shard1/db:/data/db
|
||||||
|
- /data01/mongo/shard1/configdb:/data/configdb
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
|
# cache
|
||||||
|
- wiredTigerCacheSizeGB=1
|
||||||
|
|
||||||
|
# shard分片2
|
||||||
|
shard2:
|
||||||
|
image: mongo:latest
|
||||||
|
networks:
|
||||||
|
- mongo-network
|
||||||
|
container_name: shard2
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 27218:27018
|
||||||
|
command: --shardsvr --replSet "shard2" --bind_ip_all
|
||||||
|
volumes:
|
||||||
|
- /data02/mongo/shard2/db:/data/db
|
||||||
|
- /data02/mongo/shard2/configdb:/data/configdb
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
|
# cache
|
||||||
|
- wiredTigerCacheSizeGB=1
|
||||||
|
# - ${PWD}/key.file:/data/mongodb/key.file
|
||||||
|
|
||||||
|
# shard分片3
|
||||||
|
shard3:
|
||||||
|
image: mongo:latest
|
||||||
|
networks:
|
||||||
|
- mongo-network
|
||||||
|
container_name: shard3
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 27318:27018
|
||||||
|
command: --shardsvr --replSet "shard3" --bind_ip_all
|
||||||
|
volumes:
|
||||||
|
- /data03/mongo/shard3/db:/data/db
|
||||||
|
- /data03/mongo/shard3/configdb:/data/configdb
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
|
# cache
|
||||||
|
- wiredTigerCacheSizeGB=1
|
||||||
|
# shard分片4
|
||||||
|
shard4:
|
||||||
|
image: mongo:latest
|
||||||
|
networks:
|
||||||
|
- mongo-network
|
||||||
|
container_name: shard4
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 27418:27018
|
||||||
|
command: --shardsvr --replSet "shard4" --bind_ip_all
|
||||||
|
volumes:
|
||||||
|
- /data04/mongo/shard4/db:/data/db
|
||||||
|
- /data04/mongo/shard4/configdb:/data/configdb
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
|
# cache
|
||||||
|
- wiredTigerCacheSizeGB=1
|
||||||
|
# shard分片5
|
||||||
|
shard5:
|
||||||
|
image: mongo:latest
|
||||||
|
networks:
|
||||||
|
- mongo-network
|
||||||
|
container_name: shard5
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 27518:27018
|
||||||
|
command: --shardsvr --replSet "shard5" --bind_ip_all
|
||||||
|
volumes:
|
||||||
|
- /data05/mongo/shard5/db:/data/db
|
||||||
|
- /data05/mongo/shard5/configdb:/data/configdb
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
|
# cache
|
||||||
|
- wiredTigerCacheSizeGB=1
|
@ -15,6 +15,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type ParamsLogin struct {
|
type ParamsLogin struct {
|
||||||
|
UserID string `json:"userID"`
|
||||||
Email string `json:"email"`
|
Email string `json:"email"`
|
||||||
PhoneNumber string `json:"phoneNumber"`
|
PhoneNumber string `json:"phoneNumber"`
|
||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
@ -32,11 +33,13 @@ func Login(c *gin.Context) {
|
|||||||
var account string
|
var account string
|
||||||
if params.Email != "" {
|
if params.Email != "" {
|
||||||
account = params.Email
|
account = params.Email
|
||||||
} else {
|
} else if params.PhoneNumber != "" {
|
||||||
account = params.PhoneNumber
|
account = params.PhoneNumber
|
||||||
|
} else {
|
||||||
|
account = params.UserID
|
||||||
}
|
}
|
||||||
|
|
||||||
r, err := im_mysql_model.GetRegister(account, params.AreaCode)
|
r, err := im_mysql_model.GetRegister(account, params.AreaCode, params.UserID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.NewError(params.OperationID, "user have not register", params.Password, account, err.Error())
|
log.NewError(params.OperationID, "user have not register", params.Password, account, err.Error())
|
||||||
c.JSON(http.StatusOK, gin.H{"errCode": constant.NotRegistered, "errMsg": "Mobile phone number is not registered"})
|
c.JSON(http.StatusOK, gin.H{"errCode": constant.NotRegistered, "errMsg": "Mobile phone number is not registered"})
|
||||||
|
@ -44,7 +44,7 @@ func ResetPassword(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
user, err := im_mysql_model.GetRegister(account, req.AreaCode)
|
user, err := im_mysql_model.GetRegister(account, req.AreaCode, "")
|
||||||
if err != nil || user.Account == "" {
|
if err != nil || user.Account == "" {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.NewError(req.OperationID, utils.GetSelfFuncName(), "get register error", err.Error())
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "get register error", err.Error())
|
||||||
|
@ -66,7 +66,7 @@ func SendVerificationCode(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
switch params.UsedFor {
|
switch params.UsedFor {
|
||||||
case constant.VerificationCodeForRegister:
|
case constant.VerificationCodeForRegister:
|
||||||
_, err := im_mysql_model.GetRegister(account, params.AreaCode)
|
_, err := im_mysql_model.GetRegister(account, params.AreaCode, "")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
log.NewError(params.OperationID, "The phone number has been registered", params)
|
log.NewError(params.OperationID, "The phone number has been registered", params)
|
||||||
c.JSON(http.StatusOK, gin.H{"errCode": constant.HasRegistered, "errMsg": "The phone number has been registered"})
|
c.JSON(http.StatusOK, gin.H{"errCode": constant.HasRegistered, "errMsg": "The phone number has been registered"})
|
||||||
|
@ -18,6 +18,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type ParamsSetPassword struct {
|
type ParamsSetPassword struct {
|
||||||
|
UserID string `json:"userID"`
|
||||||
Email string `json:"email"`
|
Email string `json:"email"`
|
||||||
Nickname string `json:"nickname"`
|
Nickname string `json:"nickname"`
|
||||||
PhoneNumber string `json:"phoneNumber"`
|
PhoneNumber string `json:"phoneNumber"`
|
||||||
@ -40,29 +41,37 @@ func SetPassword(c *gin.Context) {
|
|||||||
var account string
|
var account string
|
||||||
if params.Email != "" {
|
if params.Email != "" {
|
||||||
account = params.Email
|
account = params.Email
|
||||||
} else {
|
} else if params.PhoneNumber != "" {
|
||||||
account = params.PhoneNumber
|
account = params.PhoneNumber
|
||||||
|
} else {
|
||||||
|
account = params.UserID
|
||||||
}
|
}
|
||||||
if params.Nickname == "" {
|
if params.Nickname == "" {
|
||||||
params.Nickname = account
|
params.Nickname = account
|
||||||
}
|
}
|
||||||
if (config.Config.Demo.UseSuperCode && params.VerificationCode != config.Config.Demo.SuperCode) || !config.Config.Demo.UseSuperCode {
|
if params.UserID == "" {
|
||||||
accountKey := params.AreaCode + account + "_" + constant.VerificationCodeForRegisterSuffix
|
if (config.Config.Demo.UseSuperCode && params.VerificationCode != config.Config.Demo.SuperCode) || !config.Config.Demo.UseSuperCode {
|
||||||
v, err := db.DB.GetAccountCode(accountKey)
|
accountKey := params.AreaCode + account + "_" + constant.VerificationCodeForRegisterSuffix
|
||||||
if err != nil || v != params.VerificationCode {
|
v, err := db.DB.GetAccountCode(accountKey)
|
||||||
log.NewError(params.OperationID, "password Verification code error", account, params.VerificationCode)
|
if err != nil || v != params.VerificationCode {
|
||||||
data := make(map[string]interface{})
|
log.NewError(params.OperationID, "password Verification code error", account, params.VerificationCode)
|
||||||
data["PhoneNumber"] = account
|
data := make(map[string]interface{})
|
||||||
c.JSON(http.StatusOK, gin.H{"errCode": constant.CodeInvalidOrExpired, "errMsg": "Verification code error!", "data": data})
|
data["PhoneNumber"] = account
|
||||||
return
|
c.JSON(http.StatusOK, gin.H{"errCode": constant.CodeInvalidOrExpired, "errMsg": "Verification code error!", "data": data})
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//userID := utils.Base64Encode(account)
|
//userID := utils.Base64Encode(account)
|
||||||
|
var userID string
|
||||||
userID := utils.Md5(params.OperationID + strconv.FormatInt(time.Now().UnixNano(), 10))
|
if params.UserID == "" {
|
||||||
bi := big.NewInt(0)
|
userID := utils.Md5(params.OperationID + strconv.FormatInt(time.Now().UnixNano(), 10))
|
||||||
bi.SetString(userID[0:8], 16)
|
bi := big.NewInt(0)
|
||||||
userID = bi.String()
|
bi.SetString(userID[0:8], 16)
|
||||||
|
userID = bi.String()
|
||||||
|
} else {
|
||||||
|
userID = params.UserID
|
||||||
|
}
|
||||||
|
|
||||||
url := config.Config.Demo.ImAPIURL + "/auth/user_register"
|
url := config.Config.Demo.ImAPIURL + "/auth/user_register"
|
||||||
openIMRegisterReq := api.UserRegisterReq{}
|
openIMRegisterReq := api.UserRegisterReq{}
|
||||||
@ -97,7 +106,9 @@ func SetPassword(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
log.Info(params.OperationID, "end setPassword", account, params.Password)
|
log.Info(params.OperationID, "end setPassword", account, params.Password)
|
||||||
// demo onboarding
|
// demo onboarding
|
||||||
onboardingProcess(params.OperationID, userID, params.Nickname, params.FaceURL, params.AreaCode+params.PhoneNumber, params.Email)
|
if params.UserID == "" {
|
||||||
|
onboardingProcess(params.OperationID, userID, params.Nickname, params.FaceURL, params.AreaCode+params.PhoneNumber, params.Email)
|
||||||
|
}
|
||||||
c.JSON(http.StatusOK, gin.H{"errCode": constant.NoError, "errMsg": "", "data": openIMRegisterResp.UserToken})
|
c.JSON(http.StatusOK, gin.H{"errCode": constant.NoError, "errMsg": "", "data": openIMRegisterResp.UserToken})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -5,14 +5,14 @@ import (
|
|||||||
_ "github.com/jinzhu/gorm"
|
_ "github.com/jinzhu/gorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetRegister(account, areaCode string) (*db.Register, error) {
|
func GetRegister(account, areaCode, userID string) (*db.Register, error) {
|
||||||
dbConn, err := db.DB.MysqlDB.DefaultGormDB()
|
dbConn, err := db.DB.MysqlDB.DefaultGormDB()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var r db.Register
|
var r db.Register
|
||||||
return &r, dbConn.Table("registers").Where("account = ? or account =? and area_code=?",
|
return &r, dbConn.Table("registers").Where("user_id = ? and user_id != ? or account = ? or account =? and area_code=?",
|
||||||
account, account, areaCode).Take(&r).Error
|
userID, "", account, account, areaCode).Take(&r).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetPassword(account, password, ex, userID, areaCode string) error {
|
func SetPassword(account, password, ex, userID, areaCode string) error {
|
||||||
|
@ -302,6 +302,6 @@ func GetRandomDepartmentID() (string, error) {
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
department := &db.Department{}
|
department := &db.Department{}
|
||||||
err = dbConn.Model(department).Order("RAND()").Where("related_group_id != ? AND department_id != ?", "", "0").First(department).Error
|
err = dbConn.Model(department).Order("RAND()").Where("related_group_id != ? AND department_id != ? AND department_type = ?", "", "0", 1).First(department).Error
|
||||||
return department.DepartmentID, err
|
return department.DepartmentID, err
|
||||||
}
|
}
|
||||||
|
@ -119,3 +119,9 @@ func Test_GetAccountCode(t *testing.T) {
|
|||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
fmt.Println(code)
|
fmt.Println(code)
|
||||||
}
|
}
|
||||||
|
func Test_GetGroupMemberList(t *testing.T) {
|
||||||
|
groupID := "3791742301"
|
||||||
|
list, err := DB.GetGroupMemberIDListFromCache(groupID)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
fmt.Println(list)
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user