package main import ( "context" "fmt" "net/http" "os" "os/signal" "syscall" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/tuusuario/go-sync-service/internal/config" email "github.com/tuusuario/go-sync-service/internal/email" "github.com/tuusuario/go-sync-service/internal/scheduler" "github.com/tuusuario/go-sync-service/metrics" ) func main() { // Cargar configuración conf, err := config.LoadConfig() if err != nil { fmt.Println("❌ Error cargando configuración:", err) os.Exit(1) } // Inicializar logger con configuración config.InitLogger(conf) config.Log.Info("🚀 Iniciando servicio: go-sync-service") emailService := email.NewSMTPEmailService(conf) // Conexión a Redis redisClient := config.GetRedisClient(conf) if err := redisClient.Ping(context.Background()).Err(); err != nil { config.Log.Fatalf("❌ Redis no disponible: %v", err) } config.Log.Info("✅ Redis conectado") // Crear proveedor de configuración desde Redis redisManager := config.NewRedisManager(redisClient) redisConfigProvider := config.NewRedisProvider(redisManager, context.Background()) // Conexión a Base de Datos database := config.GetDatabaseConnection(conf) if database == nil { config.Log.Fatal("❌ No se pudo establecer la conexión con la base de datos.") } config.Log.Info("✅ Conexión a base de datos establecida") scheduler.Start(context.Background(), redisClient, redisConfigProvider, database, *emailService) config.Log.Info("✅ Scheduler en ejecución y escuchando recargas") //metrics Grafana metrics.Register() startMetricsServer() // Esperar señal del sistema para cerrar ordenadamente stop := make(chan os.Signal, 1) signal.Notify(stop, os.Interrupt, syscall.SIGTERM) <-stop config.Log.Info("🛑 Señal de apagado recibida, cerrando servicio...") } func startMetricsServer() { go func() { http.Handle("/metrics", promhttp.Handler()) config.Log.Info("📊 Servidor de métricas en :9100/metrics") http.ListenAndServe(":9100", nil) }() }