mirror of
https://github.com/openimsdk/open-im-server.git
synced 2025-10-27 14:02:15 +08:00
Merge branch 'openimsdk:main' into main
This commit is contained in:
commit
8cd1acaa53
4
.env
4
.env
@ -1,6 +1,5 @@
|
|||||||
MONGO_IMAGE=mongo:6.0.2
|
MONGO_IMAGE=mongo:7.0
|
||||||
REDIS_IMAGE=redis:7.0.0
|
REDIS_IMAGE=redis:7.0.0
|
||||||
ZOOKEEPER_IMAGE=bitnami/zookeeper:3.8
|
|
||||||
KAFKA_IMAGE=bitnami/kafka:3.5.1
|
KAFKA_IMAGE=bitnami/kafka:3.5.1
|
||||||
MINIO_IMAGE=minio/minio:RELEASE.2024-01-11T07-46-16Z
|
MINIO_IMAGE=minio/minio:RELEASE.2024-01-11T07-46-16Z
|
||||||
ETCD_IMAGE=quay.io/coreos/etcd:v3.5.13
|
ETCD_IMAGE=quay.io/coreos/etcd:v3.5.13
|
||||||
@ -16,4 +15,3 @@ OPENIM_ADMIN_FRONT_IMAGE=openim/openim-admin-front:release-v1.8.2
|
|||||||
#OPENIM_ADMIN_FRONT_IMAGE=registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-admin-front:release-v1.8.2
|
#OPENIM_ADMIN_FRONT_IMAGE=registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-admin-front:release-v1.8.2
|
||||||
|
|
||||||
DATA_DIR=./
|
DATA_DIR=./
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
# Use Go 1.21 Alpine as the base image for building the application
|
# Use Go 1.22 Alpine as the base image for building the application
|
||||||
FROM golang:1.21-alpine AS builder
|
FROM golang:1.22-alpine AS builder
|
||||||
|
|
||||||
# Define the base directory for the application as an environment variable
|
# Define the base directory for the application as an environment variable
|
||||||
ENV SERVER_DIR=/openim-server
|
ENV SERVER_DIR=/openim-server
|
||||||
@ -22,7 +22,7 @@ RUN go install github.com/magefile/mage@v1.15.0
|
|||||||
RUN mage build
|
RUN mage build
|
||||||
|
|
||||||
# Using Alpine Linux with Go environment for the final image
|
# Using Alpine Linux with Go environment for the final image
|
||||||
FROM golang:1.21-alpine
|
FROM golang:1.22-alpine
|
||||||
|
|
||||||
# Install necessary packages, such as bash
|
# Install necessary packages, such as bash
|
||||||
RUN apk add --no-cache bash
|
RUN apk add --no-cache bash
|
||||||
|
|||||||
@ -8,6 +8,8 @@ database: openim_v3
|
|||||||
username: openIM
|
username: openIM
|
||||||
# Password for database authentication
|
# Password for database authentication
|
||||||
password: openIM123
|
password: openIM123
|
||||||
|
# Authentication source for database authentication, if use root user, set it to admin
|
||||||
|
authSource: openim_v3
|
||||||
# Maximum number of connections in the connection pool
|
# Maximum number of connections in the connection pool
|
||||||
maxPoolSize: 100
|
maxPoolSize: 100
|
||||||
# Maximum number of retry attempts for a failed database connection
|
# Maximum number of retry attempts for a failed database connection
|
||||||
|
|||||||
@ -13,7 +13,7 @@ prometheus:
|
|||||||
ports: [ 12170, 12171, 12172, 12173, 12174, 12175, 12176, 12177, 12178, 12179, 12180, 12182, 12183, 12184, 12185, 12186 ]
|
ports: [ 12170, 12171, 12172, 12173, 12174, 12175, 12176, 12177, 12178, 12179, 12180, 12182, 12183, 12184, 12185, 12186 ]
|
||||||
|
|
||||||
maxConcurrentWorkers: 3
|
maxConcurrentWorkers: 3
|
||||||
#Use geTui for offline push notifications, or choose fcm or jpns; corresponding configuration settings must be specified.
|
#Use geTui for offline push notifications, or choose fcm or jpush; corresponding configuration settings must be specified.
|
||||||
enable: geTui
|
enable: geTui
|
||||||
geTui:
|
geTui:
|
||||||
pushUrl: https://restapi.getui.com/v2/$appId
|
pushUrl: https://restapi.getui.com/v2/$appId
|
||||||
@ -26,7 +26,7 @@ fcm:
|
|||||||
# Prioritize using file paths. If the file path is empty, use URL
|
# Prioritize using file paths. If the file path is empty, use URL
|
||||||
filePath: # File path is concatenated with the parameters passed in through - c(`mage` default pass in `config/`) and filePath.
|
filePath: # File path is concatenated with the parameters passed in through - c(`mage` default pass in `config/`) and filePath.
|
||||||
authURL: # Must start with https or http.
|
authURL: # Must start with https or http.
|
||||||
jpns:
|
jpush:
|
||||||
appKey:
|
appKey:
|
||||||
masterSecret:
|
masterSecret:
|
||||||
pushURL:
|
pushURL:
|
||||||
|
|||||||
@ -240,11 +240,11 @@ push:
|
|||||||
channelName: ${GETUI_CHANNEL_NAME}
|
channelName: ${GETUI_CHANNEL_NAME}
|
||||||
fcm:
|
fcm:
|
||||||
serviceAccount: "${FCM_SERVICE_ACCOUNT}"
|
serviceAccount: "${FCM_SERVICE_ACCOUNT}"
|
||||||
jpns:
|
jpush:
|
||||||
appKey: ${JPNS_APP_KEY}
|
appKey: ${JPUSH_APP_KEY}
|
||||||
masterSecret: ${JPNS_MASTER_SECRET}
|
masterSecret: ${JPUSH_MASTER_SECRET}
|
||||||
pushUrl: ${JPNS_PUSH_URL}
|
pushUrl: ${JPUSH_PUSH_URL}
|
||||||
pushIntent: ${JPNS_PUSH_INTENT}
|
pushIntent: ${JPUSH_PUSH_INTENT}
|
||||||
|
|
||||||
# App manager configuration
|
# App manager configuration
|
||||||
#
|
#
|
||||||
|
|||||||
@ -8,12 +8,35 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- "37017:27017"
|
- "37017:27017"
|
||||||
container_name: mongo
|
container_name: mongo
|
||||||
command: ["/bin/bash", "-c", "/docker-entrypoint-initdb.d/mongo-init.sh; docker-entrypoint.sh mongod --wiredTigerCacheSizeGB 1 --auth"]
|
command: >
|
||||||
|
bash -c '
|
||||||
|
docker-entrypoint.sh mongod --wiredTigerCacheSizeGB $$wiredTigerCacheSizeGB --auth &
|
||||||
|
until mongosh -u $$MONGO_INITDB_ROOT_USERNAME -p $$MONGO_INITDB_ROOT_PASSWORD --authenticationDatabase admin --eval "db.runCommand({ ping: 1 })" &>/dev/null; do
|
||||||
|
echo "Waiting for MongoDB to start..."
|
||||||
|
sleep 1
|
||||||
|
done &&
|
||||||
|
mongosh -u $$MONGO_INITDB_ROOT_USERNAME -p $$MONGO_INITDB_ROOT_PASSWORD --authenticationDatabase admin --eval "
|
||||||
|
db = db.getSiblingDB(\"$$MONGO_INITDB_DATABASE\");
|
||||||
|
if (!db.getUser(\"$$MONGO_OPENIM_USERNAME\")) {
|
||||||
|
db.createUser({
|
||||||
|
user: \"$$MONGO_OPENIM_USERNAME\",
|
||||||
|
pwd: \"$$MONGO_OPENIM_PASSWORD\",
|
||||||
|
roles: [{role: \"readWrite\", db: \"$$MONGO_INITDB_DATABASE\"}]
|
||||||
|
});
|
||||||
|
print(\"User created successfully: \");
|
||||||
|
print(\"Username: $$MONGO_OPENIM_USERNAME\");
|
||||||
|
print(\"Password: $$MONGO_OPENIM_PASSWORD\");
|
||||||
|
print(\"Database: $$MONGO_INITDB_DATABASE\");
|
||||||
|
} else {
|
||||||
|
print(\"User already exists in database: $$MONGO_INITDB_DATABASE, Username: $$MONGO_OPENIM_USERNAME\");
|
||||||
|
}
|
||||||
|
" &&
|
||||||
|
tail -f /dev/null
|
||||||
|
'
|
||||||
volumes:
|
volumes:
|
||||||
- "${DATA_DIR}/components/mongodb/data/db:/data/db"
|
- "${DATA_DIR}/components/mongodb/data/db:/data/db"
|
||||||
- "${DATA_DIR}/components/mongodb/data/logs:/data/logs"
|
- "${DATA_DIR}/components/mongodb/data/logs:/data/logs"
|
||||||
- "${DATA_DIR}/components/mongodb/data/conf:/etc/mongo"
|
- "${DATA_DIR}/components/mongodb/data/conf:/etc/mongo"
|
||||||
- "./scripts/mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh:ro"
|
|
||||||
environment:
|
environment:
|
||||||
- TZ=Asia/Shanghai
|
- TZ=Asia/Shanghai
|
||||||
- wiredTigerCacheSizeGB=1
|
- wiredTigerCacheSizeGB=1
|
||||||
@ -71,10 +94,7 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- "19094:9094"
|
- "19094:9094"
|
||||||
volumes:
|
volumes:
|
||||||
- ./scripts/create-topic.sh:/opt/bitnami/kafka/create-topic.sh
|
|
||||||
- "${DATA_DIR}/components/kafka:/bitnami/kafka"
|
- "${DATA_DIR}/components/kafka:/bitnami/kafka"
|
||||||
command: >
|
|
||||||
bash -c "/opt/bitnami/scripts/kafka/run.sh & /opt/bitnami/kafka/create-topic.sh; wait"
|
|
||||||
environment:
|
environment:
|
||||||
#KAFKA_HEAP_OPTS: "-Xms128m -Xmx256m"
|
#KAFKA_HEAP_OPTS: "-Xms128m -Xmx256m"
|
||||||
TZ: Asia/Shanghai
|
TZ: Asia/Shanghai
|
||||||
@ -85,10 +105,11 @@ services:
|
|||||||
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,EXTERNAL://localhost:19094
|
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,EXTERNAL://localhost:19094
|
||||||
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
|
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
|
||||||
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
|
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
|
||||||
|
KAFKA_NUM_PARTITIONS: 8
|
||||||
|
KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: "true"
|
||||||
networks:
|
networks:
|
||||||
- openim
|
- openim
|
||||||
|
|
||||||
|
|
||||||
minio:
|
minio:
|
||||||
image: "${MINIO_IMAGE}"
|
image: "${MINIO_IMAGE}"
|
||||||
ports:
|
ports:
|
||||||
@ -171,4 +192,3 @@ services:
|
|||||||
# - ${DATA_DIR:-./}/components/grafana:/var/lib/grafana
|
# - ${DATA_DIR:-./}/components/grafana:/var/lib/grafana
|
||||||
# networks:
|
# networks:
|
||||||
# - openim
|
# - openim
|
||||||
|
|
||||||
|
|||||||
@ -474,10 +474,10 @@ This section involves setting up additional configuration variables for Websocke
|
|||||||
| GETUI_CHANNEL_ID | [User Defined] | GeTui Channel ID |
|
| GETUI_CHANNEL_ID | [User Defined] | GeTui Channel ID |
|
||||||
| GETUI_CHANNEL_NAME | [User Defined] | GeTui Channel Name |
|
| GETUI_CHANNEL_NAME | [User Defined] | GeTui Channel Name |
|
||||||
| FCM_SERVICE_ACCOUNT | "x.json" | FCM Service Account |
|
| FCM_SERVICE_ACCOUNT | "x.json" | FCM Service Account |
|
||||||
| JPNS_APP_KEY | [User Defined] | JPNS Application Key |
|
| JPUSH_APP_KEY | [User Defined] | JPUSH Application Key |
|
||||||
| JPNS_MASTER_SECRET | [User Defined] | JPNS Master Secret |
|
| JPUSH_MASTER_SECRET | [User Defined] | JPUSH Master Secret |
|
||||||
| JPNS_PUSH_URL | [User Defined] | JPNS Push Notification URL |
|
| JPUSH_PUSH_URL | [User Defined] | JPUSH Push Notification URL |
|
||||||
| JPNS_PUSH_INTENT | [User Defined] | JPNS Push Intent |
|
| JPUSH_PUSH_INTENT | [User Defined] | JPUSH Push Intent |
|
||||||
| IM_ADMIN_USERID | "imAdmin" | IM Administrator ID |
|
| IM_ADMIN_USERID | "imAdmin" | IM Administrator ID |
|
||||||
| IM_ADMIN_NAME | "imAdmin" | IM Administrator Nickname |
|
| IM_ADMIN_NAME | "imAdmin" | IM Administrator Nickname |
|
||||||
| MULTILOGIN_POLICY | "1" | Multi-login Policy |
|
| MULTILOGIN_POLICY | "1" | Multi-login Policy |
|
||||||
|
|||||||
8
go.mod
8
go.mod
@ -1,6 +1,8 @@
|
|||||||
module github.com/openimsdk/open-im-server/v3
|
module github.com/openimsdk/open-im-server/v3
|
||||||
|
|
||||||
go 1.21.2
|
go 1.22.0
|
||||||
|
|
||||||
|
toolchain go1.23.2
|
||||||
|
|
||||||
require (
|
require (
|
||||||
firebase.google.com/go/v4 v4.14.1
|
firebase.google.com/go/v4 v4.14.1
|
||||||
@ -13,7 +15,7 @@ require (
|
|||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
||||||
github.com/mitchellh/mapstructure v1.5.0
|
github.com/mitchellh/mapstructure v1.5.0
|
||||||
github.com/openimsdk/protocol v0.0.72-alpha.54
|
github.com/openimsdk/protocol v0.0.72-alpha.54
|
||||||
github.com/openimsdk/tools v0.0.50-alpha.16
|
github.com/openimsdk/tools v0.0.50-alpha.32
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/prometheus/client_golang v1.18.0
|
github.com/prometheus/client_golang v1.18.0
|
||||||
github.com/stretchr/testify v1.9.0
|
github.com/stretchr/testify v1.9.0
|
||||||
@ -92,7 +94,7 @@ require (
|
|||||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
||||||
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
|
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
|
||||||
github.com/gin-contrib/sse v0.1.0 // indirect
|
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||||
github.com/go-logr/logr v1.4.1 // indirect
|
github.com/go-logr/logr v1.4.2 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/go-ole/go-ole v1.2.6 // indirect
|
github.com/go-ole/go-ole v1.2.6 // indirect
|
||||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||||
|
|||||||
12
go.sum
12
go.sum
@ -126,8 +126,8 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm
|
|||||||
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
|
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
|
||||||
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
|
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
|
||||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
|
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
|
||||||
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
||||||
@ -321,8 +321,8 @@ github.com/openimsdk/gomake v0.0.14-alpha.5 h1:VY9c5x515lTfmdhhPjMvR3BBRrRquAUCF
|
|||||||
github.com/openimsdk/gomake v0.0.14-alpha.5/go.mod h1:PndCozNc2IsQIciyn9mvEblYWZwJmAI+06z94EY+csI=
|
github.com/openimsdk/gomake v0.0.14-alpha.5/go.mod h1:PndCozNc2IsQIciyn9mvEblYWZwJmAI+06z94EY+csI=
|
||||||
github.com/openimsdk/protocol v0.0.72-alpha.54 h1:opato7N4QjjRq/SHD54bDSVBpOEEDp1VLWVk5Os2A9s=
|
github.com/openimsdk/protocol v0.0.72-alpha.54 h1:opato7N4QjjRq/SHD54bDSVBpOEEDp1VLWVk5Os2A9s=
|
||||||
github.com/openimsdk/protocol v0.0.72-alpha.54/go.mod h1:OZQA9FR55lseYoN2Ql1XAHYKHJGu7OMNkUbuekrKCM8=
|
github.com/openimsdk/protocol v0.0.72-alpha.54/go.mod h1:OZQA9FR55lseYoN2Ql1XAHYKHJGu7OMNkUbuekrKCM8=
|
||||||
github.com/openimsdk/tools v0.0.50-alpha.16 h1:bC1AQvJMuOHtZm8LZRvN8L5mH1Ws2VYdL+TLTs1iGSc=
|
github.com/openimsdk/tools v0.0.50-alpha.32 h1:JEsUFHFnaYg230TG+Ke3SUnaA2h44t4kABAzEdv5VZw=
|
||||||
github.com/openimsdk/tools v0.0.50-alpha.16/go.mod h1:h1cYmfyaVtgFbKmb1Cfsl8XwUOMTt8ubVUQrdGtsUh4=
|
github.com/openimsdk/tools v0.0.50-alpha.32/go.mod h1:r5U6RbxcR4xhKb2fhTmKGC9Yt5LcErHBVt3lhXQIHSo=
|
||||||
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
|
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
|
||||||
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
|
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
|
||||||
github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
|
github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
|
||||||
@ -356,8 +356,8 @@ github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
|
|||||||
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
|
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
|
||||||
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
|
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
|
||||||
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
|
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
|
||||||
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
|
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
||||||
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
|
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
||||||
github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
|
github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
|
||||||
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
|
|||||||
@ -15,6 +15,7 @@
|
|||||||
package body
|
package body
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/options"
|
||||||
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
|
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -26,38 +27,44 @@ type Notification struct {
|
|||||||
|
|
||||||
type Android struct {
|
type Android struct {
|
||||||
Alert string `json:"alert,omitempty"`
|
Alert string `json:"alert,omitempty"`
|
||||||
|
Title string `json:"title,omitempty"`
|
||||||
Intent struct {
|
Intent struct {
|
||||||
URL string `json:"url,omitempty"`
|
URL string `json:"url,omitempty"`
|
||||||
} `json:"intent,omitempty"`
|
} `json:"intent,omitempty"`
|
||||||
Extras Extras `json:"extras"`
|
Extras map[string]string `json:"extras,omitempty"`
|
||||||
}
|
}
|
||||||
type Ios struct {
|
type Ios struct {
|
||||||
Alert string `json:"alert,omitempty"`
|
Alert IosAlert `json:"alert,omitempty"`
|
||||||
Sound string `json:"sound,omitempty"`
|
Sound string `json:"sound,omitempty"`
|
||||||
Badge string `json:"badge,omitempty"`
|
Badge string `json:"badge,omitempty"`
|
||||||
Extras Extras `json:"extras"`
|
Extras map[string]string `json:"extras,omitempty"`
|
||||||
MutableContent bool `json:"mutable-content"`
|
MutableContent bool `json:"mutable-content"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Extras struct {
|
type IosAlert struct {
|
||||||
ClientMsgID string `json:"clientMsgID"`
|
Title string `json:"title,omitempty"`
|
||||||
|
Body string `json:"body,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *Notification) SetAlert(alert string) {
|
func (n *Notification) SetAlert(alert string, title string, opts *options.Opts) {
|
||||||
n.Alert = alert
|
n.Alert = alert
|
||||||
n.Android.Alert = alert
|
n.Android.Alert = alert
|
||||||
n.IOS.Alert = alert
|
n.Android.Title = title
|
||||||
n.IOS.Sound = "default"
|
n.IOS.Alert.Body = alert
|
||||||
|
n.IOS.Alert.Title = title
|
||||||
|
n.IOS.Sound = opts.IOSPushSound
|
||||||
|
if opts.IOSBadgeCount {
|
||||||
n.IOS.Badge = "+1"
|
n.IOS.Badge = "+1"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (n *Notification) SetExtras(extras Extras) {
|
func (n *Notification) SetExtras(extras map[string]string) {
|
||||||
n.IOS.Extras = extras
|
n.IOS.Extras = extras
|
||||||
n.Android.Extras = extras
|
n.Android.Extras = extras
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *Notification) SetAndroidIntent(pushConf *config.Push) {
|
func (n *Notification) SetAndroidIntent(pushConf *config.Push) {
|
||||||
n.Android.Intent.URL = pushConf.JPNS.PushIntent
|
n.Android.Intent.URL = pushConf.JPush.PushIntent
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *Notification) IOSEnableMutableContent() {
|
func (n *Notification) IOSEnableMutableContent() {
|
||||||
|
|||||||
@ -18,9 +18,9 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/options"
|
|
||||||
|
|
||||||
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/jpush/body"
|
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/jpush/body"
|
||||||
|
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/options"
|
||||||
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
|
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
|
||||||
"github.com/openimsdk/tools/utils/httputil"
|
"github.com/openimsdk/tools/utils/httputil"
|
||||||
)
|
)
|
||||||
@ -57,17 +57,23 @@ func (j *JPush) Push(ctx context.Context, userIDs []string, title, content strin
|
|||||||
var au body.Audience
|
var au body.Audience
|
||||||
au.SetAlias(userIDs)
|
au.SetAlias(userIDs)
|
||||||
var no body.Notification
|
var no body.Notification
|
||||||
var extras body.Extras
|
extras := make(map[string]string)
|
||||||
|
extras["ex"] = opts.Ex
|
||||||
if opts.Signal.ClientMsgID != "" {
|
if opts.Signal.ClientMsgID != "" {
|
||||||
extras.ClientMsgID = opts.Signal.ClientMsgID
|
extras["ClientMsgID"] = opts.Signal.ClientMsgID
|
||||||
}
|
}
|
||||||
no.IOSEnableMutableContent()
|
no.IOSEnableMutableContent()
|
||||||
no.SetExtras(extras)
|
no.SetExtras(extras)
|
||||||
no.SetAlert(title)
|
no.SetAlert(content, title, opts)
|
||||||
no.SetAndroidIntent(j.pushConf)
|
no.SetAndroidIntent(j.pushConf)
|
||||||
|
|
||||||
var msg body.Message
|
var msg body.Message
|
||||||
msg.SetMsgContent(content)
|
msg.SetMsgContent(content)
|
||||||
|
msg.SetTitle(title)
|
||||||
|
if opts.Signal.ClientMsgID != "" {
|
||||||
|
msg.SetExtras("ClientMsgID", opts.Signal.ClientMsgID)
|
||||||
|
}
|
||||||
|
msg.SetExtras("ex", opts.Ex)
|
||||||
var opt body.Options
|
var opt body.Options
|
||||||
opt.SetApnsProduction(j.pushConf.IOSPush.Production)
|
opt.SetApnsProduction(j.pushConf.IOSPush.Production)
|
||||||
var pushObj body.PushObj
|
var pushObj body.PushObj
|
||||||
@ -76,19 +82,26 @@ func (j *JPush) Push(ctx context.Context, userIDs []string, title, content strin
|
|||||||
pushObj.SetNotification(&no)
|
pushObj.SetNotification(&no)
|
||||||
pushObj.SetMessage(&msg)
|
pushObj.SetMessage(&msg)
|
||||||
pushObj.SetOptions(&opt)
|
pushObj.SetOptions(&opt)
|
||||||
var resp any
|
var resp map[string]any
|
||||||
return j.request(ctx, pushObj, resp, 5)
|
return j.request(ctx, pushObj, &resp, 5)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j *JPush) request(ctx context.Context, po body.PushObj, resp any, timeout int) error {
|
func (j *JPush) request(ctx context.Context, po body.PushObj, resp *map[string]any, timeout int) error {
|
||||||
return j.httpClient.PostReturn(
|
err := j.httpClient.PostReturn(
|
||||||
ctx,
|
ctx,
|
||||||
j.pushConf.JPNS.PushURL,
|
j.pushConf.JPush.PushURL,
|
||||||
map[string]string{
|
map[string]string{
|
||||||
"Authorization": j.getAuthorization(j.pushConf.JPNS.AppKey, j.pushConf.JPNS.MasterSecret),
|
"Authorization": j.getAuthorization(j.pushConf.JPush.AppKey, j.pushConf.JPush.MasterSecret),
|
||||||
},
|
},
|
||||||
po,
|
po,
|
||||||
resp,
|
resp,
|
||||||
timeout,
|
timeout,
|
||||||
)
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if (*resp)["sendno"] != "0" {
|
||||||
|
return fmt.Errorf("jpush push failed %v", resp)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -73,7 +73,7 @@ func (o *OfflinePushConsumerHandler) getOfflinePushInfos(msg *sdkws.MsgData) (ti
|
|||||||
IsAtSelf bool `json:"isAtSelf"`
|
IsAtSelf bool `json:"isAtSelf"`
|
||||||
}
|
}
|
||||||
|
|
||||||
opts = &options.Opts{Signal: &options.Signal{}}
|
opts = &options.Opts{Signal: &options.Signal{ClientMsgID: msg.ClientMsgID}}
|
||||||
if msg.OfflinePushInfo != nil {
|
if msg.OfflinePushInfo != nil {
|
||||||
opts.IOSBadgeCount = msg.OfflinePushInfo.IOSBadgeCount
|
opts.IOSBadgeCount = msg.OfflinePushInfo.IOSBadgeCount
|
||||||
opts.IOSPushSound = msg.OfflinePushInfo.IOSPushSound
|
opts.IOSPushSound = msg.OfflinePushInfo.IOSPushSound
|
||||||
|
|||||||
@ -4,6 +4,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
||||||
|
"math/rand"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/IBM/sarama"
|
"github.com/IBM/sarama"
|
||||||
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush"
|
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush"
|
||||||
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/options"
|
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/options"
|
||||||
@ -27,9 +31,6 @@ import (
|
|||||||
"github.com/openimsdk/tools/utils/timeutil"
|
"github.com/openimsdk/tools/utils/timeutil"
|
||||||
"github.com/redis/go-redis/v9"
|
"github.com/redis/go-redis/v9"
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
"math/rand"
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ConsumerHandler struct {
|
type ConsumerHandler struct {
|
||||||
@ -335,6 +336,7 @@ func (c *ConsumerHandler) groupMessagesHandler(ctx context.Context, groupID stri
|
|||||||
func (c *ConsumerHandler) offlinePushMsg(ctx context.Context, msg *sdkws.MsgData, offlinePushUserIDs []string) error {
|
func (c *ConsumerHandler) offlinePushMsg(ctx context.Context, msg *sdkws.MsgData, offlinePushUserIDs []string) error {
|
||||||
title, content, opts, err := c.getOfflinePushInfos(msg)
|
title, content, opts, err := c.getOfflinePushInfos(msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.ZError(ctx, "getOfflinePushInfos failed", err, "msg", msg)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = c.offlinePusher.Push(ctx, offlinePushUserIDs, title, content, opts)
|
err = c.offlinePusher.Push(ctx, offlinePushUserIDs, title, content, opts)
|
||||||
@ -364,7 +366,7 @@ func (c *ConsumerHandler) getOfflinePushInfos(msg *sdkws.MsgData) (title, conten
|
|||||||
IsAtSelf bool `json:"isAtSelf"`
|
IsAtSelf bool `json:"isAtSelf"`
|
||||||
}
|
}
|
||||||
|
|
||||||
opts = &options.Opts{Signal: &options.Signal{}}
|
opts = &options.Opts{Signal: &options.Signal{ClientMsgID: msg.ClientMsgID}}
|
||||||
if msg.OfflinePushInfo != nil {
|
if msg.OfflinePushInfo != nil {
|
||||||
opts.IOSBadgeCount = msg.OfflinePushInfo.IOSBadgeCount
|
opts.IOSBadgeCount = msg.OfflinePushInfo.IOSBadgeCount
|
||||||
opts.IOSPushSound = msg.OfflinePushInfo.IOSPushSound
|
opts.IOSPushSound = msg.OfflinePushInfo.IOSPushSound
|
||||||
|
|||||||
@ -69,6 +69,7 @@ type Mongo struct {
|
|||||||
Database string `mapstructure:"database"`
|
Database string `mapstructure:"database"`
|
||||||
Username string `mapstructure:"username"`
|
Username string `mapstructure:"username"`
|
||||||
Password string `mapstructure:"password"`
|
Password string `mapstructure:"password"`
|
||||||
|
AuthSource string `mapstructure:"authSource"`
|
||||||
MaxPoolSize int `mapstructure:"maxPoolSize"`
|
MaxPoolSize int `mapstructure:"maxPoolSize"`
|
||||||
MaxRetry int `mapstructure:"maxRetry"`
|
MaxRetry int `mapstructure:"maxRetry"`
|
||||||
}
|
}
|
||||||
@ -212,12 +213,12 @@ type Push struct {
|
|||||||
FilePath string `mapstructure:"filePath"`
|
FilePath string `mapstructure:"filePath"`
|
||||||
AuthURL string `mapstructure:"authURL"`
|
AuthURL string `mapstructure:"authURL"`
|
||||||
} `mapstructure:"fcm"`
|
} `mapstructure:"fcm"`
|
||||||
JPNS struct {
|
JPush struct {
|
||||||
AppKey string `mapstructure:"appKey"`
|
AppKey string `mapstructure:"appKey"`
|
||||||
MasterSecret string `mapstructure:"masterSecret"`
|
MasterSecret string `mapstructure:"masterSecret"`
|
||||||
PushURL string `mapstructure:"pushURL"`
|
PushURL string `mapstructure:"pushURL"`
|
||||||
PushIntent string `mapstructure:"pushIntent"`
|
PushIntent string `mapstructure:"pushIntent"`
|
||||||
} `mapstructure:"jpns"`
|
} `mapstructure:"jpush"`
|
||||||
IOSPush struct {
|
IOSPush struct {
|
||||||
PushSound string `mapstructure:"pushSound"`
|
PushSound string `mapstructure:"pushSound"`
|
||||||
BadgeCount bool `mapstructure:"badgeCount"`
|
BadgeCount bool `mapstructure:"badgeCount"`
|
||||||
@ -490,6 +491,7 @@ func (m *Mongo) Build() *mongoutil.Config {
|
|||||||
Database: m.Database,
|
Database: m.Database,
|
||||||
Username: m.Username,
|
Username: m.Username,
|
||||||
Password: m.Password,
|
Password: m.Password,
|
||||||
|
AuthSource: m.AuthSource,
|
||||||
MaxPoolSize: m.MaxPoolSize,
|
MaxPoolSize: m.MaxPoolSize,
|
||||||
MaxRetry: m.MaxRetry,
|
MaxRetry: m.MaxRetry,
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,55 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# Wait for Kafka to be ready
|
|
||||||
|
|
||||||
KAFKA_SERVER=localhost:9092
|
|
||||||
|
|
||||||
MAX_ATTEMPTS=300
|
|
||||||
attempt_num=1
|
|
||||||
|
|
||||||
echo "Waiting for Kafka to be ready..."
|
|
||||||
|
|
||||||
until /opt/bitnami/kafka/bin/kafka-topics.sh --list --bootstrap-server $KAFKA_SERVER; do
|
|
||||||
echo "Attempt $attempt_num of $MAX_ATTEMPTS: Kafka not ready yet..."
|
|
||||||
if [ $attempt_num -eq $MAX_ATTEMPTS ]; then
|
|
||||||
echo "Kafka not ready after $MAX_ATTEMPTS attempts, exiting"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
attempt_num=$((attempt_num+1))
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "Kafka is ready. Creating topics..."
|
|
||||||
|
|
||||||
|
|
||||||
topics=("toRedis" "toMongo" "toPush" "toOfflinePush")
|
|
||||||
partitions=8
|
|
||||||
replicationFactor=1
|
|
||||||
|
|
||||||
for topic in "${topics[@]}"; do
|
|
||||||
if /opt/bitnami/kafka/bin/kafka-topics.sh --create \
|
|
||||||
--bootstrap-server $KAFKA_SERVER \
|
|
||||||
--replication-factor $replicationFactor \
|
|
||||||
--partitions $partitions \
|
|
||||||
--topic $topic
|
|
||||||
then
|
|
||||||
echo "Topic $topic created."
|
|
||||||
else
|
|
||||||
echo "Failed to create topic $topic."
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "All topics created."
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
# 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.
|
|
||||||
mongosh <<EOF
|
|
||||||
var maxRetries = 300;
|
|
||||||
var connected = false;
|
|
||||||
var rootUsername = '$MONGO_INITDB_ROOT_USERNAME';
|
|
||||||
var rootPassword = '$MONGO_INITDB_ROOT_PASSWORD';
|
|
||||||
var dbName = '$MONGO_INITDB_DATABASE';
|
|
||||||
var openimUsername = '$MONGO_OPENIM_USERNAME';
|
|
||||||
var openimPassword = '$MONGO_OPENIM_PASSWORD';
|
|
||||||
|
|
||||||
while (!connected && maxRetries > 0) {
|
|
||||||
try {
|
|
||||||
db = connect('mongodb://127.0.0.1:27017/admin');
|
|
||||||
var authResult = db.auth(rootUsername, rootPassword);
|
|
||||||
if (authResult) {
|
|
||||||
print('Authentication successful for root user: ' + rootUsername);
|
|
||||||
connected = true;
|
|
||||||
} else {
|
|
||||||
print('Authentication failed for root user: ' + rootUsername + ' with password: ' + rootPassword);
|
|
||||||
quit(1);
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
maxRetries--;
|
|
||||||
print('Connection failed, retrying... Remaining attempts: ' + maxRetries);
|
|
||||||
sleep(1000); // Sleep for 1 second
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (connected) {
|
|
||||||
db = db.getSiblingDB(dbName);
|
|
||||||
var createUserResult = db.createUser({
|
|
||||||
user: openimUsername,
|
|
||||||
pwd: openimPassword,
|
|
||||||
roles: [{
|
|
||||||
role: 'readWrite',
|
|
||||||
db: dbName
|
|
||||||
}]
|
|
||||||
});
|
|
||||||
|
|
||||||
if (createUserResult.ok == 1) {
|
|
||||||
print('User creation successful. User: ' + openimUsername + ', Database: ' + dbName);
|
|
||||||
} else {
|
|
||||||
print('User creation failed for user: ' + openimUsername + ' in database: ' + dbName);
|
|
||||||
quit(1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print('Failed to connect to MongoDB after 300 retries.');
|
|
||||||
quit(1);
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -66,7 +66,7 @@ func CheckMinIO(ctx context.Context, config *config.Minio) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func CheckKafka(ctx context.Context, conf *config.Kafka) error {
|
func CheckKafka(ctx context.Context, conf *config.Kafka) error {
|
||||||
return kafka.Check(ctx, conf.Build(), []string{conf.ToMongoTopic, conf.ToRedisTopic, conf.ToPushTopic, conf.ToOfflinePushTopic})
|
return kafka.CheckHealth(ctx, conf.Build())
|
||||||
}
|
}
|
||||||
|
|
||||||
func initConfig(configDir string) (*config.Mongo, *config.Redis, *config.Kafka, *config.Minio, *config.Discovery, error) {
|
func initConfig(configDir string) (*config.Mongo, *config.Redis, *config.Kafka, *config.Minio, *config.Discovery, error) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user