// Package database provides database initialization and access for RSMon. package database import ( "fmt" "log" "os" "time" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" "rocketgit.ru/rsmon/worker/app/models" _ "rocketgit.ru/rsmon/worker/config/env" // Import to ensure .env is loaded before reading env vars ) // db Gorm DB var db *gorm.DB // Logger provides functionality. var Logger logger.Interface func envOrDefault(key, fallbackKey, defaultVal string) string { if v := os.Getenv(key); v != "" { return v } if fallbackKey != "" { if v := os.Getenv(fallbackKey); v != "" { return v } } return defaultVal } // Init provides functionality. func Init() { host := envOrDefault("DATABASE_HOST", "POSTGRES_HOST", "localhost") portStr := envOrDefault("DATABASE_PORT", "POSTGRES_PORT", "5432") user := envOrDefault("DATABASE_USER", "POSTGRES_USER", "rsmon") pass := envOrDefault("DATABASE_PASSWORD", "POSTGRES_PASSWORD", "rsmon") dbname := envOrDefault("DATABASE_NAME", "POSTGRES_DB", "rsmon_development") dbLog := envOrDefault("DATABASE_LOG", "", "false") port := 5432 _, _ = fmt.Sscanf(portStr, "%d", &port) connstr := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, pass, dbname) logMode := logger.Silent if dbLog == "true" || dbLog == "1" { logMode = logger.Info } cfg := &gorm.Config{ Logger: logger.Default.LogMode(logMode), } pg := postgres.Open(connstr) var err error db, err = gorm.Open(pg, cfg) if err != nil { panic(err) } sqlDB, err := db.DB() if err != nil { panic(err) } sqlDB.SetMaxIdleConns(10) sqlDB.SetMaxOpenConns(10) sqlDB.SetConnMaxLifetime(time.Hour) models.RegisterCallbacks(db) db = db.Set("gorm:association_autoupdate", false) models.SetDB(db) log.Printf("Database connected: %s@%s:%d/%s (log=%s)", user, host, port, dbname, dbLog) }