diff --git a/main.go b/main.go index bd7c2af..b8e9880 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,7 @@ package main import ( - "log" + "fmt" "log/slog" "net/http" @@ -11,17 +11,26 @@ import ( ) func main() { - certmagic.DefaultACME.Email = "serverussnap@outlook.com" - certmagic.DefaultACME.Agreed = true + domain := "qgo-server.quizer.space" + email := "serverussnap@outlook.com" - tlsConfig, err := certmagic.TLS([]string{"qgo-server.quizer.space"}) + // 1. Настройка CertMagic + certmagic.DefaultACME.Email = email + certmagic.DefaultACME.Agreed = true + certmagic.Default.Storage = &certmagic.FileStorage{Path: "/root/.local/share/certmagic"} + + // Создаем TLS конфигурацию + tlsConfig, err := certmagic.TLS([]string{domain}) if err != nil { - log.Fatal(err) + slog.Error("failed to setup TLS", "error", err) + return } - tlsConfig.NextProtos = append([]string{"h3"}, tlsConfig.NextProtos...) + // Поддержка протоколов для браузера и MoQ + tlsConfig.NextProtos = []string{"h3", "moq-00", "http/1.1"} - server := moqt.Server{ + // 2. Инициализация MoQ сервера + moqServer := moqt.Server{ Addr: ":443", TLSConfig: tlsConfig, QUICConfig: &quic.Config{ @@ -32,39 +41,43 @@ func main() { path := "/relay" - http.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { - slog.Info("Incoming WebTransport request") + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Alt-Svc", `h3=":443"; ma=2592000`) - err := server.HandleWebTransport(w, r) - if err != nil { - slog.Error("WebTransport error", "error", err) + if r.URL.Path == path { + err := moqServer.HandleWebTransport(w, r) + if err != nil { + slog.Error("WebTransport error", "error", err) + } + return } + fmt.Fprintf(w, "MoQ Server is active at %s", path) }) moqt.HandleFunc(path, func(w moqt.SetupResponseWriter, r *moqt.SetupRequest) { - slog.Info("MoQ setup request received") - sess, err := moqt.Accept(w, r, nil) if err != nil { - slog.Error("Failed to accept session", "error", err) return } - - slog.Info("MoQ session established", "remote", sess.RemoteAddr()) go handleSession(sess) }) - slog.Info("Server starting on https://localhost:8080") + slog.Info("Starting MoQ server", "url", "https://"+domain) - if err := server.ListenAndServe(); err != nil { - slog.Error("Server failed", "error", err) + go func() { + err := certmagic.HTTPS([]string{domain}, http.DefaultServeMux) + if err != nil { + slog.Error("TCP/HTTPS Server failed", "error", err) + } + }() + + if err := moqServer.ListenAndServe(); err != nil { + slog.Error("MoQ UDP Server failed", "error", err) } } func handleSession(sess *moqt.Session) { - defer sess.Context().Done() - - for { - select {} - } + slog.Info("MoQ session established", "remote", sess.RemoteAddr()) + <-sess.Context().Done() + slog.Info("MoQ session closed") }