package main import ( "context" "log" "net/http" "os" "os/signal" "syscall" "time" "erp-mvp/core-service/internal/api" "erp-mvp/core-service/internal/config" "erp-mvp/core-service/internal/database" "erp-mvp/core-service/internal/grpc" "erp-mvp/core-service/internal/logger" "erp-mvp/core-service/internal/redis" ) func main() { // Инициализация логгера logger := logger.New() // Загрузка конфигурации cfg, err := config.Load() if err != nil { logger.Fatal("Failed to load config", err) } // Подключение к базе данных db, err := database.Connect(cfg.Database) if err != nil { logger.Fatal("Failed to connect to database", err) } defer db.Close() // Подключение к Redis redisClient, err := redis.Connect(cfg.Redis) if err != nil { logger.Fatal("Failed to connect to Redis", err) } defer redisClient.Close() // Инициализация gRPC клиента для Document Service grpcClient, err := grpc.NewDocumentServiceClient(cfg.DocumentService.URL) if err != nil { logger.Fatal("Failed to connect to Document Service", err) } defer grpcClient.Close() // Создание API сервера server := api.NewServer(cfg, db, redisClient, grpcClient, logger) // Запуск HTTP сервера go func() { logger.Info("Starting HTTP server on", cfg.Server.Port) if err := server.Start(); err != nil && err != http.ErrServerClosed { logger.Fatal("Failed to start server", err) } }() // Graceful shutdown quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit logger.Info("Shutting down server...") ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { logger.Fatal("Server forced to shutdown", err) } logger.Info("Server exited") }