diff options
author | Michael Hunteman <huntemanmt@gmail.com> | 2025-01-25 13:40:09 -0600 |
---|---|---|
committer | Michael Hunteman <huntemanmt@gmail.com> | 2025-01-25 13:40:09 -0600 |
commit | 417ce259cacea581ab84336f46d881558dd4b4fc (patch) | |
tree | de42013bcdfd29763d27e599f03bc01ca07bf1e4 | |
parent | 5713d1f4f04563fb96cbea8907cc1d8cdd3edbc2 (diff) |
Containerize golang server with logging
-rw-r--r-- | server/Containerfile | 9 | ||||
-rw-r--r-- | server/admin/handler.go | 3 | ||||
-rw-r--r-- | server/cmd/main.go | 5 | ||||
-rw-r--r-- | server/guest/handler.go | 5 | ||||
-rw-r--r-- | server/middleware/logging.go | 50 | ||||
-rw-r--r-- | server/test/guest_test.go | 16 |
6 files changed, 76 insertions, 12 deletions
diff --git a/server/Containerfile b/server/Containerfile new file mode 100644 index 0000000..d9fd72e --- /dev/null +++ b/server/Containerfile @@ -0,0 +1,9 @@ +FROM golang:latest AS builder +WORKDIR /app +COPY . . +RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o server cmd/main.go +FROM alpine:latest +COPY --from=builder /app/server /app/server +WORKDIR /app +EXPOSE 8080 +CMD ["./server"]
\ No newline at end of file diff --git a/server/admin/handler.go b/server/admin/handler.go index 0aa9659..29e2c11 100644 --- a/server/admin/handler.go +++ b/server/admin/handler.go @@ -108,8 +108,7 @@ func (adminHandler *AdminHandler) createClaims(admin Admin, expirationTime time. } func (adminHandler *AdminHandler) readKey() ([]byte, error) { - // TODO: use properties file - return os.ReadFile("C:\\Users\\mhunt\\admin.pem") + return os.ReadFile(os.Getenv("ADMIN_KEY")) } func (adminHandler *AdminHandler) createToken(claims *Claims, key []byte) (string, error) { diff --git a/server/cmd/main.go b/server/cmd/main.go index 72d2aad..75caf19 100644 --- a/server/cmd/main.go +++ b/server/cmd/main.go @@ -12,12 +12,13 @@ import ( "git.huntm.net/wedding/server/admin" "git.huntm.net/wedding/server/guest" + "git.huntm.net/wedding/server/middleware" ) var ( user = "postgres" password = os.Getenv("PASS") - host = "localhost" + host = "host.containers.internal" port = "5432" database = "wedding" ) @@ -38,7 +39,7 @@ func main() { mux := http.NewServeMux() mux.Handle("/api/guests/", guestHandler) mux.Handle("/api/admin/", adminHandler) - log.Fatal(http.ListenAndServe(":8080", serveHTTP(mux))) + log.Fatal(http.ListenAndServe(":8080", serveHTTP(middleware.LoggingMiddleware(mux)))) } func serveHTTP(handler http.Handler) http.Handler { diff --git a/server/guest/handler.go b/server/guest/handler.go index 62de5be..6829086 100644 --- a/server/guest/handler.go +++ b/server/guest/handler.go @@ -159,12 +159,11 @@ func (handler *GuestHandler) createClaims(name Name, expirationTime time.Time) * } func (handler *GuestHandler) readGuestKey() ([]byte, error) { - // TODO: use properties file - return os.ReadFile("C:\\Users\\mhunt\\guest.pem") + return os.ReadFile(os.Getenv("GUEST_KEY")) } func (handler *GuestHandler) readAdminKey() ([]byte, error) { - return os.ReadFile("C:\\Users\\mhunt\\admin.pem") + return os.ReadFile(os.Getenv("ADMIN_KEY")) } func (handler *GuestHandler) createToken(claims *Claims, key []byte) (string, error) { diff --git a/server/middleware/logging.go b/server/middleware/logging.go new file mode 100644 index 0000000..860a467 --- /dev/null +++ b/server/middleware/logging.go @@ -0,0 +1,50 @@ +package middleware + +import ( + "bytes" + "log" + "net/http" + "time" +) + +type LoggingResponseWriter struct { + http.ResponseWriter + statusCode int + responseBody *bytes.Buffer +} + +func (w *LoggingResponseWriter) WriteHeader(code int) { + w.statusCode = code + w.ResponseWriter.WriteHeader(code) +} + +func (w *LoggingResponseWriter) Write(data []byte) (int, error) { + w.responseBody.Write(data) + return w.ResponseWriter.Write(data) +} + +func LoggingMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + start := time.Now() + + loggingWriter := &LoggingResponseWriter{ + ResponseWriter: w, + statusCode: http.StatusOK, + responseBody: &bytes.Buffer{}, + } + + next.ServeHTTP(loggingWriter, r) + + log.Printf( + "Client IP: %s | Method: %s | Path: %s | Status: %d | Duration: %v", + r.RemoteAddr, + r.Method, + r.URL.Path, + loggingWriter.statusCode, + time.Since(start), + ) + if loggingWriter.responseBody.Len() > 0 { + log.Print(loggingWriter.responseBody.String()) + } + }) +} diff --git a/server/test/guest_test.go b/server/test/guest_test.go index b7d1aae..09476d1 100644 --- a/server/test/guest_test.go +++ b/server/test/guest_test.go @@ -7,7 +7,6 @@ import ( "log" "net/http" "net/http/httptest" - "os" "strings" "testing" @@ -17,14 +16,16 @@ import ( ) var ( - user = os.Getenv("USER") - password = os.Getenv("PASS") + user = "postgres" + password = "pass" host = "localhost" port = "5432" database = "wedding" ) func TestUpdateRSVP(test *testing.T) { + test.Setenv("GUEST_KEY", "/Users/michael/secrets/guest.pem") + test.Setenv("ADMIN_KEY", "/Users/michael/secrets/admin.pem") databasePool, err := pgxpool.New(context.Background(), fmt.Sprintf("postgres://%s:%s@%s:%s/%s", user, password, host, port, database)) if err != nil { @@ -93,6 +94,8 @@ func addPartyMember(guestHandler *guest.GuestHandler, token string, test *testin } func logInAdmin(adminHandler *admin.AdminHandler, test *testing.T) admin.Login { + test.Setenv("GUEST_KEY", "/Users/michael/secrets/guest.pem") + test.Setenv("ADMIN_KEY", "/Users/michael/secrets/admin.pem") response := httptest.NewRecorder() loginRequest, err := http.NewRequest(http.MethodPost, fmt.Sprintf("http://%s:8080/api/admin/login", host), strings.NewReader(getCredentials())) @@ -158,8 +161,7 @@ func getName() string { } func getCredentials() string { - return fmt.Sprintf("{ \"username\": \"mhunteman\", \"password\": \"%s\" }", - os.Getenv("PASS")) + return "{ \"username\": \"mhunteman\", \"password\": \"pass\" }" } func getUpdatedGuest() string { @@ -176,6 +178,8 @@ func getEmptyGuest() string { } func TestAddGuest(test *testing.T) { + test.Setenv("GUEST_KEY", "/Users/michael/secrets/guest.pem") + test.Setenv("ADMIN_KEY", "/Users/michael/secrets/admin.pem") databasePool, err := pgxpool.New(context.Background(), fmt.Sprintf("postgres://%s:%s@%s:%s/%s", user, password, host, port, database)) if err != nil { @@ -230,6 +234,8 @@ func postGuest(guestHandler *guest.GuestHandler, token string, test *testing.T) } func TestInvalidGuest(test *testing.T) { + test.Setenv("GUEST_KEY", "/Users/michael/secrets/guest.pem") + test.Setenv("ADMIN_KEY", "/Users/michael/secrets/admin.pem") databasePool, err := pgxpool.New(context.Background(), fmt.Sprintf("postgres://%s:%s@%s:%s/%s", user, password, host, port, database)) if err != nil { |