package main import ( "flag" "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" ) func main() { configPath := flag.String("config", "./config.json", "path to config file") dbPath := flag.String("db", "./database.db", "path to database file") flag.Parse() if _, err := os.Stat(*configPath); os.IsNotExist(err) { defaultConfig := `{ listenAddr": " "0.0.0.0", "listenPort": "8080", "configDir": "./configs" }` if err := os.WriteFile(*configPath, []byte(defaultConfig), 0644); err != nil { log.Fatalf("failed to create default config file: %v", err) } log.Printf("created default config file at %s", *configPath) } _, err := LoadConfig(*configPath) if err != nil { log.Fatalf("failed to load config: %v", err) } if err := InitDatabase(*dbPath); err != nil { log.Fatalf("failed to initialize database: %v", err) } log.Println("database initialized successfully") if err := InitFrpcDatabase(*dbPath); err != nil { log.Printf("warning: failed to initialize frpc database: %v", err) } config, err := GetConfig() if err != nil { log.Fatalf("failed to get config: %v", err) } setupRoutes() addr := fmt.Sprintf("%s:%s", config.ListenAddr, config.ListenPort) server := &http.Server{ Addr: addr, ReadTimeout: 15 * time.Second, WriteTimeout: 15 * time.Second, IdleTimeout: 60 * time.Second, } go func() { log.Printf("server starting on %s", addr) if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("failed to start server: %v", err) } }() quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("shutting down server...") if err := server.Close(); err != nil { log.Printf("server closed with error: %v", err) } if err := CloseDatabase(); err != nil { log.Printf("error closing database: %v", err) } if err := CloseFrpcDatabase(); err != nil { log.Printf("error closing frpc database: %v", err) } log.Println("server stopped") }