Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> # Conflicts: # main.go
172 lines
5.2 KiB
Go
Executable File
172 lines
5.2 KiB
Go
Executable File
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 (multi-instancia)
|
|
&models.CoolifyConfig{},
|
|
// AI Config: campos del agente Telegram
|
|
&models.AiConfig{},
|
|
// Agente Telegram: historial y chats autorizados
|
|
&models.TelegramAgentHistory{},
|
|
&models.TelegramAgentAuth{},
|
|
// 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{},
|
|
// Soporte: webhook de correo entrante
|
|
&models.SoporteWebhookConfig{},
|
|
// Automatización de cotizaciones, contratos, actas y cuentas de cobro con IA
|
|
&models.PlantillaDocumento{},
|
|
&models.Tarifa{},
|
|
&models.DocumentoGenerado{},
|
|
&models.Arquitectura{},
|
|
)
|
|
// 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()
|
|
migrations.SeedAutomatizacionIA()
|
|
// 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())
|
|
}
|
|
}
|