package main import ( "flag" "fmt" "log" "github.com/gotunnel/internal/server/app" "github.com/gotunnel/internal/server/config" "github.com/gotunnel/internal/server/db" "github.com/gotunnel/internal/server/tunnel" "github.com/gotunnel/pkg/crypto" "github.com/gotunnel/pkg/plugin" "github.com/gotunnel/pkg/plugin/builtin" ) func main() { configPath := flag.String("c", "server.yaml", "config file path") flag.Parse() // 加载 YAML 配置 cfg, err := config.LoadServerConfig(*configPath) if err != nil { log.Fatalf("Load config error: %v", err) } // 初始化数据库 clientStore, err := db.NewSQLiteStore(cfg.Server.DBPath) if err != nil { log.Fatalf("Init database error: %v", err) } defer clientStore.Close() // 创建隧道服务 server := tunnel.NewServer( clientStore, cfg.Server.BindAddr, cfg.Server.BindPort, cfg.Server.Token, cfg.Server.HeartbeatSec, cfg.Server.HeartbeatTimeout, ) // 配置 TLS(默认启用) if !cfg.Server.TLSDisabled { tlsConfig, err := crypto.GenerateTLSConfig() if err != nil { log.Fatalf("Generate TLS config error: %v", err) } server.SetTLSConfig(tlsConfig) log.Printf("[Server] TLS enabled") } // 初始化插件系统 registry := plugin.NewRegistry() if err := registry.RegisterBuiltin(builtin.NewSOCKS5Plugin()); err != nil { log.Printf("[Plugin] Register socks5 error: %v", err) } if err := registry.RegisterBuiltin(builtin.NewHTTPPlugin()); err != nil { log.Printf("[Plugin] Register http error: %v", err) } server.SetPluginRegistry(registry) log.Printf("[Plugin] Plugins registered: socks5, http") // 启动 Web 控制台 if cfg.Web.Enabled { ws := app.NewWebServer(clientStore, server, cfg, *configPath) addr := fmt.Sprintf("%s:%d", cfg.Web.BindAddr, cfg.Web.BindPort) go func() { var err error if cfg.Web.Username != "" && cfg.Web.Password != "" { err = ws.RunWithAuth(addr, cfg.Web.Username, cfg.Web.Password) } else { err = ws.Run(addr) } if err != nil { log.Printf("[Web] Server error: %v", err) } }() } log.Fatal(server.Run()) }