mirror of
				https://github.com/openimsdk/open-im-server.git
				synced 2025-10-26 21:22:16 +08:00 
			
		
		
		
	* chore: config * chore: config * chore: config * chore: config * chore: config * feat: config * fix: config * fix: config * feat: config * feat: config * feat: config * feat: config * feat: config * feat: config * feat: config * feat: config * feat: config * feat: config * feat: config * feat: config * feat: config * feat: config * feat: config * feat: config * feat: config * feat: config * fix: config * fix: config * fix: config * fix: config * fix: config * fix: config * fix: config * fix: config * fix: config * fix: config * fix: config * fix: config * fix: config * fix: config * fix: config * fix: config * fix: config * fix: config
		
			
				
	
	
		
			197 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // 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.
 | |
| 
 | |
| package main
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"flag"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 	"log"
 | |
| 	"os"
 | |
| 	"path/filepath"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/openimsdk/open-im-server/v3/pkg/common/config"
 | |
| 	"github.com/openimsdk/tools/db/mongoutil"
 | |
| 	"github.com/openimsdk/tools/db/redisutil"
 | |
| 	"github.com/openimsdk/tools/discovery/etcd"
 | |
| 	"github.com/openimsdk/tools/discovery/zookeeper"
 | |
| 	"github.com/openimsdk/tools/mq/kafka"
 | |
| 	"github.com/openimsdk/tools/s3/minio"
 | |
| 	"github.com/openimsdk/tools/system/program"
 | |
| 	"github.com/openimsdk/tools/utils/runtimeenv"
 | |
| )
 | |
| 
 | |
| const maxRetry = 180
 | |
| 
 | |
| const (
 | |
| 	MountConfigFilePath = "CONFIG_PATH"
 | |
| 	DeploymentType      = "DEPLOYMENT_TYPE"
 | |
| 	KUBERNETES          = "kubernetes"
 | |
| )
 | |
| 
 | |
| func CheckZookeeper(ctx context.Context, config *config.ZooKeeper) error {
 | |
| 	// Temporary disable logging
 | |
| 	originalLogger := log.Default().Writer()
 | |
| 	log.SetOutput(io.Discard)
 | |
| 	defer log.SetOutput(originalLogger) // Ensure logging is restored
 | |
| 	return zookeeper.Check(ctx, config.Address, config.Schema, zookeeper.WithUserNameAndPassword(config.Username, config.Password))
 | |
| }
 | |
| 
 | |
| func CheckEtcd(ctx context.Context, config *config.Etcd) error {
 | |
| 	return etcd.Check(ctx, config.Address, "/check_openim_component",
 | |
| 		true,
 | |
| 		etcd.WithDialTimeout(10*time.Second),
 | |
| 		etcd.WithMaxCallSendMsgSize(20*1024*1024),
 | |
| 		etcd.WithUsernameAndPassword(config.Username, config.Password))
 | |
| }
 | |
| 
 | |
| func CheckMongo(ctx context.Context, config *config.Mongo) error {
 | |
| 	return mongoutil.Check(ctx, config.Build())
 | |
| }
 | |
| 
 | |
| func CheckRedis(ctx context.Context, config *config.Redis) error {
 | |
| 	return redisutil.Check(ctx, config.Build())
 | |
| }
 | |
| 
 | |
| func CheckMinIO(ctx context.Context, config *config.Minio) error {
 | |
| 	return minio.Check(ctx, config.Build())
 | |
| }
 | |
| 
 | |
| func CheckKafka(ctx context.Context, conf *config.Kafka) error {
 | |
| 	return kafka.CheckHealth(ctx, conf.Build())
 | |
| }
 | |
| 
 | |
| func initConfig(configDir string) (*config.Mongo, *config.Redis, *config.Kafka, *config.Minio, *config.Discovery, error) {
 | |
| 	var (
 | |
| 		mongoConfig = &config.Mongo{}
 | |
| 		redisConfig = &config.Redis{}
 | |
| 		kafkaConfig = &config.Kafka{}
 | |
| 		minioConfig = &config.Minio{}
 | |
| 		discovery   = &config.Discovery{}
 | |
| 		thirdConfig = &config.Third{}
 | |
| 	)
 | |
| 	runtimeEnv := runtimeenv.PrintRuntimeEnvironment()
 | |
| 
 | |
| 	err := config.Load(configDir, config.MongodbConfigFileName, config.EnvPrefixMap[config.MongodbConfigFileName], runtimeEnv, mongoConfig)
 | |
| 	if err != nil {
 | |
| 		return nil, nil, nil, nil, nil, err
 | |
| 	}
 | |
| 
 | |
| 	err = config.Load(configDir, config.RedisConfigFileName, config.EnvPrefixMap[config.RedisConfigFileName], runtimeEnv, redisConfig)
 | |
| 	if err != nil {
 | |
| 		return nil, nil, nil, nil, nil, err
 | |
| 	}
 | |
| 
 | |
| 	err = config.Load(configDir, config.KafkaConfigFileName, config.EnvPrefixMap[config.KafkaConfigFileName], runtimeEnv, kafkaConfig)
 | |
| 	if err != nil {
 | |
| 		return nil, nil, nil, nil, nil, err
 | |
| 	}
 | |
| 
 | |
| 	err = config.Load(configDir, config.OpenIMRPCThirdCfgFileName, config.EnvPrefixMap[config.OpenIMRPCThirdCfgFileName], runtimeEnv, thirdConfig)
 | |
| 	if err != nil {
 | |
| 		return nil, nil, nil, nil, nil, err
 | |
| 	}
 | |
| 
 | |
| 	if thirdConfig.Object.Enable == "minio" {
 | |
| 		err = config.Load(configDir, config.MinioConfigFileName, config.EnvPrefixMap[config.MinioConfigFileName], runtimeEnv, minioConfig)
 | |
| 		if err != nil {
 | |
| 			return nil, nil, nil, nil, nil, err
 | |
| 		}
 | |
| 	} else {
 | |
| 		minioConfig = nil
 | |
| 	}
 | |
| 	err = config.Load(configDir, config.DiscoveryConfigFilename, config.EnvPrefixMap[config.DiscoveryConfigFilename], runtimeEnv, discovery)
 | |
| 	if err != nil {
 | |
| 		return nil, nil, nil, nil, nil, err
 | |
| 	}
 | |
| 	return mongoConfig, redisConfig, kafkaConfig, minioConfig, discovery, nil
 | |
| }
 | |
| 
 | |
| func main() {
 | |
| 	var index int
 | |
| 	var configDir string
 | |
| 	flag.IntVar(&index, "i", 0, "Index number")
 | |
| 	defaultConfigDir := filepath.Join("..", "..", "..", "..", "..", "config")
 | |
| 	flag.StringVar(&configDir, "c", defaultConfigDir, "Configuration dir")
 | |
| 	flag.Parse()
 | |
| 
 | |
| 	fmt.Printf("%s Index: %d, Config Path: %s\n", filepath.Base(os.Args[0]), index, configDir)
 | |
| 
 | |
| 	mongoConfig, redisConfig, kafkaConfig, minioConfig, zookeeperConfig, err := initConfig(configDir)
 | |
| 	if err != nil {
 | |
| 		program.ExitWithError(err)
 | |
| 	}
 | |
| 
 | |
| 	ctx := context.Background()
 | |
| 	err = performChecks(ctx, mongoConfig, redisConfig, kafkaConfig, minioConfig, zookeeperConfig, maxRetry)
 | |
| 	if err != nil {
 | |
| 		// Assume program.ExitWithError logs the error and exits.
 | |
| 		// Replace with your error handling logic as necessary.
 | |
| 		program.ExitWithError(err)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func performChecks(ctx context.Context, mongoConfig *config.Mongo, redisConfig *config.Redis, kafkaConfig *config.Kafka, minioConfig *config.Minio, discovery *config.Discovery, maxRetry int) error {
 | |
| 	checksDone := make(map[string]bool)
 | |
| 
 | |
| 	checks := map[string]func(ctx context.Context) error{
 | |
| 		"Mongo": func(ctx context.Context) error {
 | |
| 			return CheckMongo(ctx, mongoConfig)
 | |
| 		},
 | |
| 		"Redis": func(ctx context.Context) error {
 | |
| 			return CheckRedis(ctx, redisConfig)
 | |
| 		},
 | |
| 		"Kafka": func(ctx context.Context) error {
 | |
| 			return CheckKafka(ctx, kafkaConfig)
 | |
| 		},
 | |
| 	}
 | |
| 	if minioConfig != nil {
 | |
| 		checks["MinIO"] = func(ctx context.Context) error {
 | |
| 			return CheckMinIO(ctx, minioConfig)
 | |
| 		}
 | |
| 	}
 | |
| 	if discovery.Enable == "etcd" {
 | |
| 		checks["Etcd"] = func(ctx context.Context) error {
 | |
| 			return CheckEtcd(ctx, &discovery.Etcd)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	for i := 0; i < maxRetry; i++ {
 | |
| 		allSuccess := true
 | |
| 		for name, check := range checks {
 | |
| 			if !checksDone[name] {
 | |
| 				if err := check(ctx); err != nil {
 | |
| 					fmt.Printf("%s check failed: %v\n", name, err)
 | |
| 					allSuccess = false
 | |
| 				} else {
 | |
| 					fmt.Printf("%s check succeeded.\n", name)
 | |
| 					checksDone[name] = true
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if allSuccess {
 | |
| 			fmt.Println("All components checks passed successfully.")
 | |
| 			return nil
 | |
| 		}
 | |
| 
 | |
| 		time.Sleep(1 * time.Second)
 | |
| 	}
 | |
| 
 | |
| 	return fmt.Errorf("not all components checks passed successfully after %d attempts", maxRetry)
 | |
| }
 |