From 2ac2ca83a68be776031e97aa12682668c230a768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sun, 9 Aug 2026 09:27:24 +0400 Subject: [PATCH] =?UTF-8?q?debug:=20/debug=20endpoint=20=E2=80=94=20DNS,?= =?UTF-8?q?=20TCP,=20S3=20=D0=B4=D0=B8=D0=B0=D0=B3=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/main.go | 52 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/server/main.go b/server/main.go index 5632f25..a963fdd 100644 --- a/server/main.go +++ b/server/main.go @@ -8,6 +8,7 @@ import ( "fmt" "io" "log" + "net" "net/http" "net/url" "os" @@ -96,13 +97,15 @@ func main() { var err error useSSL := os.Getenv("S3_USE_SSL") != "false" + log.Printf("S3 connecting: endpoint=%s bucket=%s useSSL=%v", endpoint, bucketName, useSSL) s3Client, err = s3.New(endpoint, &s3.Options{ Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""), Secure: useSSL, }) if err != nil { - log.Fatalln(err) + log.Fatalf("S3 init failed: %v", err) } + log.Printf("S3 client created, testing BucketExists...") // 2. HTTP Handlers http.HandleFunc("/.well-known/terraform.json", discoveryHandler) @@ -113,6 +116,7 @@ func main() { http.Handle("/", http.HandlerFunc(rootHandler)) http.HandleFunc("/healthz", healthzHandler) http.HandleFunc("/readyz", readyzHandler) + http.HandleFunc("/debug", debugHandler) port := os.Getenv("PORT") if port == "" { @@ -141,6 +145,47 @@ func main() { log.Println("Server stopped") } +func debugHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + + fmt.Fprintf(w, "=== ENV ===\n") + for _, e := range os.Environ() { + if strings.Contains(e, "S3_") || strings.Contains(e, "REGISTRY") || strings.Contains(e, "PORT") { + fmt.Fprintln(w, e) + } + } + + s3ep := os.Getenv("S3_ENDPOINT") + fmt.Fprintf(w, "\n=== DNS: %s ===\n", s3ep) + addrs, err := net.LookupHost(s3ep) + if err != nil { + fmt.Fprintf(w, "DNS ERROR: %v\n", err) + } else { + for _, a := range addrs { + fmt.Fprintf(w, " %s\n", a) + } + } + + fmt.Fprintf(w, "\n=== TCP dial: %s:443 ===\n", s3ep) + conn, err := net.DialTimeout("tcp", s3ep+":443", 5*time.Second) + if err != nil { + fmt.Fprintf(w, "TCP ERROR: %v\n", err) + } else { + fmt.Fprintf(w, "TCP OK: %s -> %s\n", conn.LocalAddr(), conn.RemoteAddr()) + conn.Close() + } + + fmt.Fprintf(w, "\n=== S3 BucketExists ===\n") + ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second) + defer cancel() + _, err = s3Client.BucketExists(ctx, bucketName) + if err != nil { + fmt.Fprintf(w, "S3 ERROR: %v\n", err) + } else { + fmt.Fprintf(w, "S3 OK: bucket %s accessible\n", bucketName) + } +} + func rootHandler(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/" { http.NotFound(w, r) @@ -415,9 +460,10 @@ func healthzHandler(w http.ResponseWriter, r *http.Request) { func readyzHandler(w http.ResponseWriter, r *http.Request) { _, err := s3Client.BucketExists(context.Background(), bucketName) if err != nil { - log.Printf("readyz: S3 bucket check failed: %v", err) + msg := fmt.Sprintf("s3 unreachable: %v", err) + log.Printf("readyz: %s", msg) w.WriteHeader(http.StatusServiceUnavailable) - w.Write([]byte("s3 unreachable")) + w.Write([]byte(msg)) return } w.WriteHeader(http.StatusOK)