From 620ba20ba00534192944dfbc60c1cb49da3f9c88 Mon Sep 17 00:00:00 2001 From: Smile Rex Date: Wed, 4 Mar 2026 01:21:03 +0300 Subject: [PATCH] fix2 --- main.go | 64 +++++++++++++++++---------------------------------------- 1 file changed, 19 insertions(+), 45 deletions(-) diff --git a/main.go b/main.go index 6365f45..315650e 100644 --- a/main.go +++ b/main.go @@ -43,13 +43,12 @@ func (s *Server) handleSession(roomName string, sess *webtransport.Session) { room.conns[sess] = true room.mu.Unlock() - log.Printf("User joined room: %s", roomName) - + log.Printf("Joined room: %s", roomName) defer func() { room.mu.Lock() delete(room.conns, sess) room.mu.Unlock() - log.Printf("User left room: %s", roomName) + log.Printf("Left room: %s", roomName) }() for { @@ -92,69 +91,44 @@ func main() { domain := "qgo-server.quizer.space" email := "serverussnap@outlook.com" - // 1. Настройка CertMagic + // Настройка CertMagic (как в вашем рабочем коде) certmagic.DefaultACME.Email = email certmagic.DefaultACME.Agreed = true - cfg := certmagic.NewDefault() - - // Важно: ManageSync получит сертификат ДО запуска серверов - err := cfg.ManageSync(context.Background(), []string{domain}) - if err != nil { - log.Fatal("CertMagic error:", err) - } - - tlsConf := cfg.TLSConfig() - // NextProtos критически важен для WebTransport - tlsConf.NextProtos = []string{"h3", "http/1.1"} + certmagic.Default.Storage = &certmagic.FileStorage{Path: "/root/.local/share/certmagic"} server := NewServer() - mux := http.NewServeMux() - // 2. WebTransport сервер + // Настройка WebTransport wt := &webtransport.Server{ H3: &http3.Server{ - Addr: ":443", - TLSConfig: tlsConf, - Handler: mux, + Addr: ":443", + EnableDatagrams: true, // Важно для WebTransport }, - CheckOrigin: func(r *http.Request) bool { return true }, // Разрешаем подключения отовсюду + CheckOrigin: func(r *http.Request) bool { return true }, } + mux := http.NewServeMux() mux.HandleFunc("/room/", func(w http.ResponseWriter, r *http.Request) { - // Сообщаем браузеру, что сервер поддерживает HTTP/3 на порту 443 - w.Header().Set("Alt-Svc", `h3=":443"; ma=86400`) + // Обязательный заголовок для браузера + w.Header().Set("Alt-Svc", `h3=":443"; ma=2592000`) roomName := strings.TrimPrefix(r.URL.Path, "/room/") - if roomName == "" { - http.Error(w, "Room name required", 400) - return - } + // Попытка апгрейда sess, err := wt.Upgrade(w, r) if err != nil { - log.Printf("Upgrade error (check if you use https): %v", err) + log.Printf("Upgrade error: %v", err) return } go server.handleSession(roomName, sess) }) - // 3. Запуск UDP (HTTP/3 + WebTransport) - go func() { - log.Printf("Starting UDP (WebTransport) on https://%s/room/", domain) - if err := wt.ListenAndServe(); err != nil { - log.Fatalf("UDP Server Error: %v", err) - } - }() + log.Printf("Starting server on %s", domain) - // 4. Запуск TCP (HTTPS + ACME Challenge) - // Это нужно, чтобы браузер сначала зашел по TCP и узнал про Alt-Svc - log.Printf("Starting TCP (HTTPS) on https://%s", domain) - httpServer := &http.Server{ - Addr: ":443", - TLSConfig: tlsConf, - Handler: mux, + // Используем certmagic.HTTPS, который сам создаст нужный TLSConfig + // и запустит HTTP/3 (UDP) + HTTPS (TCP) корректно. + err := certmagic.HTTPS([]string{domain}, mux) + if err != nil { + log.Fatalf("Server failed: %v", err) } - - // Используем ListenAndServeTLS с пустыми путями, так как сертификаты в tlsConf - log.Fatal(httpServer.ListenAndServeTLS("", "")) }