package main import ( "crypto/tls" "fmt" "net/http" "github.com/quic-go/quic-go/http3" "golang.org/x/crypto/acme/autocert" ) func main() { // 1. Настройка менеджера сертификатов certManager := autocert.Manager{ Prompt: autocert.AcceptTOS, HostPolicy: autocert.HostWhitelist("qgo-server.quizer.space"), // ЗАМЕНИТЕ НА ВАШ ДОМЕН Cache: autocert.DirCache("certs"), // Папка для хранения ключей } mux := http.NewServeMux() mux.HandleFunc("/api/hello", func(w http.ResponseWriter, r *http.Request) { // Добавляем CORS для вашего фронтенда w.Header().Set("Access-Control-Allow-Origin", "https://your-svelte-app.com") w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS") w.Header().Set("Alt-Svc", `h3=":443"; ma=86400`) // Порт 443 стандартный для HTTPS fmt.Printf("Запрос по протоколу: %s\n", r.Proto) w.Write([]byte(`{"message": "Работает через Let's Encrypt и QUIC!"}`)) }) // Настройка TLS конфигурации для QUIC tlsConfig := &tls.Config{ GetCertificate: certManager.GetCertificate, NextProtos: []string{"h3", "h3-29"}, // Поддержка разных версий HTTP/3 } // 2. Запуск HTTP/3 (UDP) на порту 443 go func() { server := &http3.Server{ Addr: ":443", Handler: mux, TLSConfig: tlsConfig, } fmt.Println("Запуск QUIC на :443 UDP...") if err := server.ListenAndServe(); err != nil { fmt.Printf("Ошибка QUIC: %v\n", err) } }() // 3. Запуск стандартного HTTPS (TCP) на порту 443 // Это также необходимо для выдачи сертификатов через ACME fmt.Println("Запуск HTTPS на :443 TCP...") httpsServer := &http.Server{ Addr: ":443", Handler: mux, TLSConfig: tlsConfig, } // Важно: для Let's Encrypt также нужен сервер на порту 80 (HTTP) go http.ListenAndServe(":80", certManager.HTTPHandler(nil)) if err := httpsServer.ListenAndServeTLS("", ""); err != nil { panic(err) } }