package main import ( "log" "net/http" "time" "github.com/orohi/vpn-panel/internal/auth" "github.com/orohi/vpn-panel/internal/config" "github.com/orohi/vpn-panel/internal/db" "github.com/orohi/vpn-panel/internal/handlers" ) func main() { cfg, err := config.Load() if err != nil { log.Fatalf("config: %v", err) } database, err := db.Connect(cfg) if err != nil { log.Fatalf("db: %v", err) } defer database.Close() if err := db.Migrate(database); err != nil { log.Fatalf("migrate: %v", err) } if err := db.SeedAdmin(database, cfg); err != nil { log.Fatalf("seed admin: %v", err) } if err := db.SeedProtocols(database); err != nil { log.Fatalf("seed protocols: %v", err) } authMgr := auth.New(cfg.Secret) srv, err := handlers.New(database, authMgr, "web/templates") if err != nil { log.Fatalf("handlers: %v", err) } httpServer := &http.Server{ Addr: ":" + cfg.Port, Handler: srv.Routes(), ReadTimeout: 15 * time.Second, WriteTimeout: 15 * time.Second, IdleTimeout: 60 * time.Second, } log.Printf("VPN Panel listening on :%s", cfg.Port) if err := httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("server: %v", err) } }