package main import ( "flag" "log" "github.com/gofiber/fiber/v2/middleware/cors" "github.com/pyroscope-io/pyroscope/pkg/agent/profiler" "github.com/sujit-baniya/fiber-boilerplate/app" "github.com/sujit-baniya/fiber-boilerplate/migrations" "github.com/sujit-baniya/fiber-boilerplate/pkg/models" "github.com/sujit-baniya/fiber-boilerplate/pkg/services" "github.com/sujit-baniya/fiber-boilerplate/rest/routes" "github.com/sujit-baniya/fiber-boilerplate/utils" ) func main() { configFile := flag.String("config", "config.yml", "User Config file from user") migrate := flag.Bool("migrate", false, "Update db structure") flag.Parse() // Cargar configuración app.Load(*configFile) // Configurar Pyroscope profiler if app.Http.Profiler.Enabled { _, _ = profiler.Start(profiler.Config{ ApplicationName: app.Http.Server.Name, ServerAddress: app.Http.Profiler.Server, }) } // Actualizar versión del servidor app.Http.Server.Version = app.Version // Habilitar CORS app.Http.Server.App.Use(cors.New(cors.Config{ AllowOrigins: "*", AllowMethods: "GET,POST,PUT,DELETE,OPTIONS", AllowHeaders: "Content-Type, Authorization", })) if *migrate { // Ejecutar migraciones migrations.Migrate() } else { // Crear/actualizar tablas de Renovaciones e idempotente) migrations.MigrateRenovaciones() // Crear/actualizar tablas de Portal, Telegram y Proyectos migrations.MigratePortal() // Crear tabla de Landing Generator migrations.MigrateLanding() // Crear tablas de integraciones y pasarelas si no existen app.Http.Database.DB.AutoMigrate( // Tablas base del sistema (columnas nuevas) &models.Users{}, &models.Roles{}, &models.Submodules{}, &models.QueryHistory{}, &models.OssApi{}, &models.QrVcard{}, &models.VcfVcard{}, &models.HostingerConfig{}, &models.CloudflareConfig{}, &models.BoldConfig{}, &models.BoldWebhookLog{}, &models.BoldCallbackLog{}, &models.DlocalPaymentLog{}, // Documentación por SaaS &models.SaasProducto{}, &models.DocCategoria{}, &models.DocPagina{}, // Integraciones SaaS (dispatcher de pagos) &models.SaasApiConfig{}, &models.SaasDispatchLog{}, // Notificaciones &models.NotifEventoConfig{}, &models.SistemaNotificacion{}, &models.ServidorAlertaUmbral{}, // Shield &models.ShieldConfig{}, // Partner &models.PartnerRecurso{}, &models.PartnerComunicado{}, // Portal: recuperación de contraseña &models.PortalPasswordResetToken{}, // Integración VCard API Admin &models.VcardApiConfig{}, // Integración Coolify &models.CoolifyConfig{}, // Servidores: nuevos campos de agente + tabla join de integraciones &models.Servidor{}, &models.ConxDb{}, &models.ProvServidor{}, // SMTP &models.SmtpConfig{}, // WebSMS (LabsMobile) &models.WebSmsConfig{}, &models.WebSmsLog{}, &models.WebSmsWebhookLog{}, // Contabilidad &models.Cuenta{}, &models.Entidad{}, &models.Transaccion{}, &models.CuentaCobro{}, &models.CuentaPagar{}, &models.ConsolidadoMensual{}, // Historial de métricas del agente &models.ServidorMetricasHistory{}, // Monitor de disponibilidad de URLs &models.UrlMonitor{}, &models.UrlMonitorLog{}, // Tablero de tareas &models.Tarea{}, &models.TareaComentario{}, ) // Seed automático (idempotente) de módulos del sistema migrations.SeedRenovaciones() migrations.SeedIntegraciones() migrations.SeedPasarelas() migrations.SeedSaas() migrations.SeedServidores() migrations.SeedAdministracion() migrations.SeedPlantillasBase() migrations.SeedTelegram() migrations.SeedPortalClientes() migrations.SeedNotifDefaults() migrations.SeedShield() migrations.SeedPartnerRecursos() models.SeedContabilidad() models.SeedBalanceData() migrations.SeedContabilidadMenu() migrations.SeedWebSms() migrations.SeedUrlMonitor() migrations.SeedTareas() // Cargar config SMTP desde BD (sobreescribe valores del .env/config.yml si hay registro activo) if smtpCfg, err := models.GetSmtpConfig(); err == nil { app.Http.Mail.Host = smtpCfg.Host app.Http.Mail.Port = smtpCfg.Port app.Http.Mail.Username = smtpCfg.Username app.Http.Mail.Password = utils.Decrypt(smtpCfg.Password, app.Http.Server.Key) app.Http.Mail.Encryption = smtpCfg.Encryption app.Http.Mail.FromAddress = smtpCfg.FromAddress app.Http.Mail.FromName = smtpCfg.FromName app.Http.Mail.SetupMailer() log.Println("[SMTP] Configuración cargada desde base de datos") } else { log.Println("[SMTP] Sin config en BD, usando valores del entorno") } // Iniciar cron de vencimientos services.IniciarCron() defer services.DetenerCron() // Cargar rutas routes.LoadRoutes(app.Http.Server.App) app.Http.Route404() log.Fatal(app.Http.Server.ServeWithGraceFullShutdown()) } }