refactor: update Dockerfile to expose port 8080 and enhance logging middleware with detailed request and response information
All checks were successful
Release / build-image (push) Successful in 40s

This commit is contained in:
Tommy 2025-03-15 19:05:07 +01:00
parent d7ac488610
commit 5f99618449
Signed by: tommy
SSH key fingerprint: SHA256:1LWgQT3QPHIT29plS8jjXc3S1FcE/4oGvsx3Efxs6Uc
3 changed files with 98 additions and 6 deletions

View file

@ -29,7 +29,7 @@ FROM gcr.io/distroless/base-debian11 AS build-release-stage
WORKDIR /
COPY --from=builder /app /app
EXPOSE 8888
EXPOSE 8080
USER nonroot:nonroot

View file

@ -1 +1 @@
appVersion: v0.1.0
appVersion: v0.5.0

View file

@ -19,11 +19,42 @@ import (
func loggingMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
next(w, r)
log.Printf("%s %s %s %s", r.RemoteAddr, r.Method, r.URL.Path, time.Since(start))
// Add debug logging for request details
logLevel := strings.ToLower(os.Getenv("LOG_LEVEL"))
if logLevel == "debug" {
log.Printf("Request received: %s %s", r.Method, r.URL.Path)
log.Printf("Request headers: %v", r.Header)
if r.ContentLength > 0 {
log.Printf("Request content length: %d bytes", r.ContentLength)
}
}
// Create a response wrapper to capture status code
rwWrapper := &responseWriterWrapper{ResponseWriter: w, statusCode: http.StatusOK}
next(rwWrapper, r)
duration := time.Since(start)
log.Printf("%s %s %s %d %s", r.RemoteAddr, r.Method, r.URL.Path, rwWrapper.statusCode, duration)
if logLevel == "debug" && rwWrapper.statusCode >= 400 {
log.Printf("Warning: Request %s %s returned status code %d", r.Method, r.URL.Path, rwWrapper.statusCode)
}
}
}
// responseWriterWrapper captures the status code of the response
type responseWriterWrapper struct {
http.ResponseWriter
statusCode int
}
// WriteHeader captures the status code before writing it
func (rww *responseWriterWrapper) WriteHeader(statusCode int) {
rww.statusCode = statusCode
rww.ResponseWriter.WriteHeader(statusCode)
}
// corsMiddleware adds CORS headers to responses
func corsMiddleware(next http.HandlerFunc, allowedOrigins []string) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
@ -56,6 +87,12 @@ func chainMiddleware(h http.HandlerFunc, middlewares ...func(http.HandlerFunc) h
}
func main() {
// Configure log level
logLevel := strings.ToLower(os.Getenv("LOG_LEVEL"))
if logLevel == "debug" {
log.Println("Debug logging enabled")
}
apiToken := os.Getenv("TOKEN")
apiSecret := os.Getenv("SECRET")
@ -63,12 +100,22 @@ func main() {
log.Fatal("TOKEN and SECRET environment variables must be set")
}
// Debug logging for environment variables when in debug mode
if logLevel == "debug" {
log.Println("Environment variables:")
log.Printf("TOKEN: %s", maskSecret(apiToken))
log.Printf("SECRET: %s", maskSecret(apiSecret))
}
// Configure port from environment or use default
port := 8080
if portEnv := os.Getenv("PORT"); portEnv != "" {
if p, err := strconv.Atoi(portEnv); err == nil {
port = p
}
if logLevel == "debug" {
log.Printf("Port set to %d", port)
}
}
// TLS configuration
@ -76,13 +123,25 @@ func main() {
keyFile := os.Getenv("TLS_KEY_FILE")
enableTLS := certFile != "" && keyFile != ""
if logLevel == "debug" && enableTLS {
log.Println("TLS enabled")
log.Printf("Using cert file: %s", certFile)
log.Printf("Using key file: %s", keyFile)
}
// Get allowed origins for CORS (default to "*" if not specified)
allowedOriginsStr := os.Getenv("ALLOWED_ORIGINS")
var allowedOrigins []string
if allowedOriginsStr != "" {
allowedOrigins = strings.Split(allowedOriginsStr, ",")
if logLevel == "debug" {
log.Printf("CORS allowed origins: %v", allowedOrigins)
}
} else {
allowedOrigins = []string{"*"}
if logLevel == "debug" {
log.Println("CORS allowed origins: *")
}
}
webhook := webhook.New(apiToken, apiSecret)
@ -101,12 +160,27 @@ func main() {
mux.HandleFunc("/healthz", loggingMiddleware(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("ok"))
if logLevel == "debug" {
log.Printf("Health check responded with 200 OK")
}
}))
mux.HandleFunc("/readyz", loggingMiddleware(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("ready"))
if logLevel == "debug" {
log.Printf("Readiness check responded with 200 OK")
}
}))
if logLevel == "debug" {
log.Println("Server routes initialized:")
log.Println("- / (Domain Filter)")
log.Println("- /records (DNS Records)")
log.Println("- /adjustendpoints (Adjust Endpoints)")
log.Println("- /healthz (Health Check)")
log.Println("- /readyz (Readiness Check)")
}
// Create server
server := &http.Server{
Addr: fmt.Sprintf(":%d", port),
@ -121,10 +195,10 @@ func main() {
var err error
if enableTLS {
fmt.Printf("Server is listening on TLS port %d...\n", port)
log.Printf("Server is listening on TLS port %d...\n", port)
err = server.ListenAndServeTLS(certFile, keyFile)
} else {
fmt.Printf("Server is listening on port %d...\n", port)
log.Printf("Server is listening on port %d...\n", port)
err = server.ListenAndServe()
}
@ -133,12 +207,19 @@ func main() {
}
}()
if logLevel == "debug" {
log.Println("Server started successfully and is ready to handle requests")
}
// Wait for interrupt signal
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
// Graceful shutdown
if logLevel == "debug" {
log.Println("Shutdown signal received, attempting graceful shutdown...")
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
@ -147,4 +228,15 @@ func main() {
log.Fatalf("Server forced to shutdown: %v", err)
}
fmt.Println("Server exited properly")
if logLevel == "debug" {
log.Println("Server shutdown completed successfully")
}
}
// Helper function to mask secrets in logs
func maskSecret(secret string) string {
if len(secret) <= 4 {
return "****"
}
return secret[:2] + "****" + secret[len(secret)-2:]
}