summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hunteman <huntemanmt@gmail.com>2025-01-25 13:40:09 -0600
committerMichael Hunteman <huntemanmt@gmail.com>2025-01-25 13:40:09 -0600
commit417ce259cacea581ab84336f46d881558dd4b4fc (patch)
treede42013bcdfd29763d27e599f03bc01ca07bf1e4
parent5713d1f4f04563fb96cbea8907cc1d8cdd3edbc2 (diff)
Containerize golang server with logging
-rw-r--r--server/Containerfile9
-rw-r--r--server/admin/handler.go3
-rw-r--r--server/cmd/main.go5
-rw-r--r--server/guest/handler.go5
-rw-r--r--server/middleware/logging.go50
-rw-r--r--server/test/guest_test.go16
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 {