diff --git a/Dockerfile b/Dockerfile index 4765fe7..bde9e78 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,30 @@ +FROM golang:1.13-alpine3.10 AS build + +WORKDIR /go/src/app + +ARG CGO_ENABLED=0 + +RUN apk --no-cache add ca-certificates git openssl && \ + openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=example.com" + +COPY . . + +RUN go get -d -v ./... && \ + go build -ldflags "-s -w" -o ./echo-server ./cmd/echo-server + FROM scratch -COPY bin /bin + +WORKDIR /bin + +COPY --from=build /go/src/app/echo-server . +COPY --from=build /go/src/app/cert.pem . +COPY --from=build /go/src/app/key.pem . ENV PORT 8080 ENV SSLPORT 8443 -EXPOSE 8080 8443 +EXPOSE "$PORT" "$SSLPORT" ENV ADD_HEADERS='{"X-Real-Server": "echo-server"}' -WORKDIR /bin ENTRYPOINT ["/bin/echo-server"] diff --git a/bin/cert.pem b/bin/cert.pem deleted file mode 100644 index 0773934..0000000 --- a/bin/cert.pem +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFEzCCAvugAwIBAgIJAKWi90CoCsaXMA0GCSqGSIb3DQEBCwUAMCAxHjAcBgNV -BAMMFWNha2V3YWxrLmhlcnBkZXJwLmNvbTAeFw0xNzAzMTYxNzU2MTRaFw0xODAz -MTYxNzU2MTRaMCAxHjAcBgNVBAMMFWNha2V3YWxrLmhlcnBkZXJwLmNvbTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOmMazLwQ1lCU1lv/7XFSdBJHfDY -e/YargMr7m5+mODrwM9S9OafSUwPSPNOh6MtvjUDhgdTq5Y5+LV/3bt0VPnElZgx -oJPf2W0kRY6j4C3mhx5XS+pKSms4YsHRhD0S3yh8RakQU2zx2+onHeSEQ0QVexzQ -0KqcMtR1i5RdHXSbe6TGn1o/n8tvazIM9bsejddv2K0aB61YbxXQwXT+0l7/0eTZ -QEWGOqV8WOz1/nVzYjmCTt0LUH0OyOX6qGIi2Ya6LIeSIUh6d7tkpnIDJkjCtBa+ -if9C5cE4DrhEmbfnM1EZ9VDJbFB71UrP+8PilrIJr8K4k6Hsxb457gJ9xoghIH2P -fbxQ4KK/AOMyqJQZv7q5Q1TmG/yd0yobtTLnhEwc9i6bbDqHM/Iva+Ae/xW0qbk3 -mkbqd3W5oeBFqAz9xdrVCXCmBK2Y7ANNj2ef2t3YL1oyvCbUmWzNiA0LpfXYnqDz -pvVwwG8hmJma5NzDa3POF2FSsbBNDsc8RdDSaKzSgHS8315r/fztWh+I8yheKerd -BPy+H6seRyG9tb9ZjOvZaYb1uxlXx17ueXdhFsyUfjODtLevOOXvXXmImzH0PZJZ -xQWQM+ry1Fr2YZ5aHlL9h7obQwV1wY1tsSSeF0JJi10A9M9IOtZ0IE2ZErJwX3ZJ -pRzezI/QkI8NYHhDAgMBAAGjUDBOMB0GA1UdDgQWBBScaiw6ZUF4zJm3ezYVr722 -8Adf0DAfBgNVHSMEGDAWgBScaiw6ZUF4zJm3ezYVr7228Adf0DAMBgNVHRMEBTAD -AQH/MA0GCSqGSIb3DQEBCwUAA4ICAQB1gg2ej4MBg2eIQGeiVjPUjn/1rc5yg/J7 -H1qW6ERtTXSO0wqS+bYx4INhRrbpaUGv3EA0SJIxsXqMnQigT9FzfqBpeQW/FAOk -4Upr3EW82I4Kr4wna2owehOlWbFO40lsDT4pEjrMVuGCPvxxMfXDceUfLMp71lNm -RPTqTQkzeKL5PM5IvcSUstPcR+fP/TOAQaK6UbIemljAtZlEfC2SFX7BLHFADjVk -ciyoameOVwzfuwtQVZBCJdyvvSW6fSp5FencGlBHdVmRiFyz9p1jPNFZv/gtb+8m -4OWnNztRw/J6rmleRUGfjdp3mFrmuyGBi7gFhCyg7FBYBXVjimLLpMQlmFDROQOg -0iJMB5M9W42WeRh7ivNg0SWEvniLRX+ZWE+/0Yfw83b3Ii5YkfTbVdgWNKd1334k -oQrM2l6BwPjP1mDnwF6NnjVnjUJXjfgookDY0efVDxfK31qoS3gwdTbdPXCkBbgM -1DNLWwyJcUvajcnXPIBYHFLbdk2CigOl4pfCtUUwrz+GouNBXTiIx1u2XzS45GLG -fgAViPVoQO06mpH/jhN+mhCKtMEDwTHN6hKJ0jSqFSugUa2S7r8ZPAdKIPVsecTR -oNY1YeR7SkJNU5b6wuLVP2SyNHWJtRuzhVBbmIpmNK4z2FUxqZqueIn3t3mx4myu -6gONrrrAYg== ------END CERTIFICATE----- diff --git a/bin/echo-server b/bin/echo-server deleted file mode 100755 index 53efb2e..0000000 Binary files a/bin/echo-server and /dev/null differ diff --git a/bin/key.pem b/bin/key.pem deleted file mode 100644 index 673ac37..0000000 --- a/bin/key.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -m16FY79N7m6bAWmob+o9/hiCRuLgrwE= ------END PRIVATE KEY----- diff --git a/cmd/echo-server/main.go b/cmd/echo-server/main.go index 0ff31c3..eaa6a9f 100644 --- a/cmd/echo-server/main.go +++ b/cmd/echo-server/main.go @@ -24,7 +24,6 @@ func RunServer(addr string, sslAddr string, ssl map[string]string) chan error { if err := http.ListenAndServe(addr, nil); err != nil { errs <- err } - }() go func() { @@ -70,18 +69,40 @@ var upgrader = websocket.Upgrader{ } func handler(wr http.ResponseWriter, req *http.Request) { - fmt.Printf("%s | %s %s\n", req.RemoteAddr, req.Method, req.URL) + fmt.Printf("%s | %s | %s %s\n", req.RemoteAddr, req.UserAgent(), req.Method, req.URL) if websocket.IsWebSocketUpgrade(req) { serveWebSocket(wr, req) - } else if req.URL.Path == "/ws" { + } else if req.URL.Path == "/ws" { wr.Header().Add("Content-Type", "text/html") wr.WriteHeader(200) io.WriteString(wr, websocketHTML) - } else { + } else if req.URL.Path == "/health" { + healthEndpoint(wr, req) + } else { serveHTTP(wr, req) } } +func healthEndpoint(wr http.ResponseWriter, req *http.Request) { + + // Health Check endpoint + + type Health struct { + Status string + } + + health := Health{"ok"} + + healthResponse, err := json.Marshal(health) + if err != nil { + panic(err) + } + + wr.Header().Set("Content-Type", "application/json") + wr.Write(healthResponse) + +} + func serveWebSocket(wr http.ResponseWriter, req *http.Request) { connection, err := upgrader.Upgrade(wr, req, nil) if err != nil {