mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-09-12 13:10:05 +00:00

- Add MySQL database support with environment-based configuration - Fix MySQL compatibility issue with 'key' column name - Maintain SQLite as default database - Add proper validation for MySQL configuration - Test and verify compatibility with existing database - Replaced raw SQL queries using JSON_EACH functions with standard GORM queries - Modified functions to handle JSON parsing in Go code instead of database since JSON_EACH is not available on MySQL or MariaDB: - getAllEmails() - GetClientTrafficByID() - getFallbackMaster() - MigrationRemoveOrphanedTraffics() The system now supports both MySQL and SQLite databases, with SQLite remaining as the default option. MySQL connection is only used when explicitly configured through environment variables.
124 lines
2.4 KiB
Go
124 lines
2.4 KiB
Go
package config
|
|
|
|
import (
|
|
_ "embed"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
//go:embed version
|
|
var version string
|
|
|
|
//go:embed name
|
|
var name string
|
|
|
|
type LogLevel string
|
|
|
|
const (
|
|
Debug LogLevel = "debug"
|
|
Info LogLevel = "info"
|
|
Notice LogLevel = "notice"
|
|
Warn LogLevel = "warn"
|
|
Error LogLevel = "error"
|
|
)
|
|
|
|
func GetVersion() string {
|
|
return strings.TrimSpace(version)
|
|
}
|
|
|
|
func GetName() string {
|
|
return strings.TrimSpace(name)
|
|
}
|
|
|
|
func GetLogLevel() LogLevel {
|
|
if IsDebug() {
|
|
return Debug
|
|
}
|
|
logLevel := os.Getenv("XUI_LOG_LEVEL")
|
|
if logLevel == "" {
|
|
return Info
|
|
}
|
|
return LogLevel(logLevel)
|
|
}
|
|
|
|
func IsDebug() bool {
|
|
return os.Getenv("XUI_DEBUG") == "true"
|
|
}
|
|
|
|
func GetBinFolderPath() string {
|
|
binFolderPath := os.Getenv("XUI_BIN_FOLDER")
|
|
if binFolderPath == "" {
|
|
binFolderPath = "bin"
|
|
}
|
|
return binFolderPath
|
|
}
|
|
|
|
func GetDBFolderPath() string {
|
|
dbFolderPath := os.Getenv("XUI_DB_FOLDER")
|
|
if dbFolderPath == "" {
|
|
dbFolderPath = "/etc/x-ui"
|
|
}
|
|
return dbFolderPath
|
|
}
|
|
|
|
// DatabaseConfig holds the database configuration
|
|
type DatabaseConfig struct {
|
|
Connection string
|
|
Host string
|
|
Port string
|
|
Database string
|
|
Username string
|
|
Password string
|
|
}
|
|
|
|
// GetDatabaseConfig returns the database configuration from environment variables
|
|
func GetDatabaseConfig() (*DatabaseConfig, error) {
|
|
config := &DatabaseConfig{
|
|
Connection: strings.ToLower(os.Getenv("DB_CONNECTION")),
|
|
Host: os.Getenv("DB_HOST"),
|
|
Port: os.Getenv("DB_PORT"),
|
|
Database: os.Getenv("DB_DATABASE"),
|
|
Username: os.Getenv("DB_USERNAME"),
|
|
Password: os.Getenv("DB_PASSWORD"),
|
|
}
|
|
|
|
if config.Connection == "mysql" {
|
|
if config.Host == "" || config.Database == "" || config.Username == "" {
|
|
return nil, fmt.Errorf("missing required MySQL configuration: host, database, and username are required")
|
|
}
|
|
if config.Port == "" {
|
|
config.Port = "3306"
|
|
}
|
|
}
|
|
|
|
return config, nil
|
|
}
|
|
|
|
func GetDBPath() string {
|
|
config, err := GetDatabaseConfig()
|
|
if err != nil {
|
|
log.Fatalf("Error getting database config: %v", err)
|
|
}
|
|
|
|
if config.Connection == "mysql" {
|
|
return fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",
|
|
config.Username,
|
|
config.Password,
|
|
config.Host,
|
|
config.Port,
|
|
config.Database)
|
|
}
|
|
|
|
// Connection is sqlite
|
|
return fmt.Sprintf("%s/%s.db", GetDBFolderPath(), GetName())
|
|
}
|
|
|
|
func GetLogFolder() string {
|
|
logFolderPath := os.Getenv("XUI_LOG_FOLDER")
|
|
if logFolderPath == "" {
|
|
logFolderPath = "/var/log"
|
|
}
|
|
return logFolderPath
|
|
}
|