package main import ( "fmt" "log/slog" "os" "vctp/db" utils "vctp/internal/utils" "vctp/log" "vctp/server" "vctp/server/router" "github.com/joho/godotenv" ) var ( bindDisableTls bool sha1ver string // sha1 revision used to build the program buildTime string // when the executable was built ) func main() { // Load data from environment file envFilename := utils.GetFilePath(".env") err := godotenv.Load(envFilename) if err != nil { panic("Error loading .env file") } logger := log.New( log.GetLevel(), log.GetOutput(), ) // Configure database database, err := db.New(logger, "./db.sqlite3") if err != nil { logger.Error("Failed to create database", "error", err) os.Exit(1) } defer database.Close() /* if err = db.Migrate(database); err != nil && !errors.Is(err, migrate.ErrNoChange) { logger.Error("failed to migrate database", "error", err) return } */ if err = db.Migrate(database); err != nil { logger.Error("failed to migrate database", "error", err) return } // Determine bind IP bindIP := os.Getenv("BIND_IP") if bindIP == "" { bindIP = utils.GetOutboundIP().String() } // Determine bind port bindPort := os.Getenv("BIND_PORT") if bindPort == "" { bindPort = "9443" } bindAddress := fmt.Sprint(bindIP, ":", bindPort) slog.Info("Will listen on address", "ip", bindIP, "port", bindPort) // Determine bind disable TLS bindDisableTlsEnv := os.Getenv("BIND_DISABLE_TLS") if bindDisableTlsEnv == "true" { bindDisableTls = true } // Get file names for TLS cert/key tlsCertFilename := os.Getenv("TLS_CERT_FILE") if tlsCertFilename != "" { tlsCertFilename = utils.GetFilePath(tlsCertFilename) } else { tlsCertFilename = "./cert.pem" } tlsKeyFilename := os.Getenv("TLS_KEY_FILE") if tlsKeyFilename != "" { tlsKeyFilename = utils.GetFilePath(tlsKeyFilename) } else { tlsKeyFilename = "./privkey.pem" } // Generate certificate if required if !(utils.FileExists(tlsCertFilename) && utils.FileExists(tlsKeyFilename)) { slog.Warn("Specified TLS certificate or private key do not exist", "certificate", tlsCertFilename, "tls-key", tlsKeyFilename) utils.GenerateCerts(tlsCertFilename, tlsKeyFilename) } // Start server svr := server.New( logger, bindAddress, server.WithRouter(router.New(logger, database)), ) svr.DisableTls(bindDisableTls) svr.SetCertificate(tlsCertFilename) svr.SetPrivateKey(tlsKeyFilename) svr.StartAndWait() }