diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e151baa --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +auth/go.work +feedbacks/go.work +votes/go.work \ No newline at end of file diff --git a/README.md b/README.md index 91c66bb..3787043 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ You need to use the token generated by the ```Auth``` service: curl -X "POST" "http://localhost:8082/v1/feedback" \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ - -H 'Authorization:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImVtaW5ldHRvQGVtYWlsLmNvbSIsImV4cCI6MTY4MDY1Mzg3MSwiaWF0IjoxNjgwNjUwMjQxLCJuYmYiOjE2ODA2NTAyNDF9.wLCwGjmazo3mdvPWpaGrjENnrI7J16wNVghRY4v4I1E' \ + -H 'Authorization:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImVtaW5ldHRvQGVtYWlsLmNvbSIsImV4cCI6MTY4MDcwNzI3OSwiaWF0IjoxNjgwNzAzNjQ5LCJuYmYiOjE2ODA3MDM2NDl9.M9RSuq_oGsTCz-2m0EgUmK3mvjqg0ujhF59WVRnMAZ8' \ -d $'{ "title": "Feedback test", "body": "Feedback body" diff --git a/auth/Dockerfile b/auth/Dockerfile index ec72c8a..b4fa15a 100644 --- a/auth/Dockerfile +++ b/auth/Dockerfile @@ -1,21 +1,17 @@ -FROM golang:1.19.2-alpine AS builder -#RUN apk add build-base +FROM golang:1.20-alpine AS builder -WORKDIR /app/ +WORKDIR /src # Restore dependencies -COPY * /app/ +COPY auth/ . -RUN ls -la / -RUN go mod download +RUN go mod tidy # Build executable -RUN go build -o /app/auth ./ +RUN go build -o /src/auth ./ FROM scratch - -WORKDIR /app/ - -COPY --from=builder /app/auth ./ +WORKDIR /src +COPY --from=builder /src/auth ./ EXPOSE 8081 -CMD ["/app/auth"] +CMD ["/src/auth"] diff --git a/auth/go.mod b/auth/go.mod index f75f88e..683575d 100644 --- a/auth/go.mod +++ b/auth/go.mod @@ -1,13 +1,18 @@ -module auth +module github.com/eminetto/api-o11y/auth -go 1.12 +go 1.20 require ( github.com/dgrijalva/jwt-go v3.2.0+incompatible - github.com/eminetto/api-o11y v0.0.1 // indirect github.com/go-chi/chi/v5 v5.0.8 github.com/go-sql-driver/mysql v1.7.0 github.com/google/uuid v1.3.0 github.com/gorilla/context v1.1.1 github.com/stretchr/testify v1.4.0 ) + +require ( + github.com/davecgh/go-spew v1.1.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v2 v2.2.2 // indirect +) diff --git a/auth/go.sum b/auth/go.sum index fea2010..bb05b95 100644 --- a/auth/go.sum +++ b/auth/go.sum @@ -2,8 +2,6 @@ github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/eminetto/api-o11y v0.0.1 h1:fSi83tPiKJFpsC8+aseb6gHJz528bebYlVgMj54P3gU= -github.com/eminetto/api-o11y v0.0.1/go.mod h1:rwcGFE85b639qzTaL13QJR+n5XAmVdKBub6cbzQxsjI= github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= diff --git a/auth/go.work.sum b/auth/go.work.sum new file mode 100644 index 0000000..cbf6cbc --- /dev/null +++ b/auth/go.work.sum @@ -0,0 +1 @@ +github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= diff --git a/auth/main.go b/auth/main.go index f81dd3f..e825c7d 100644 --- a/auth/main.go +++ b/auth/main.go @@ -18,18 +18,8 @@ import ( "github.com/gorilla/context" ) -// @todo get this variables from env or config -const ( - DB_USER = "auth_user" - DB_PASSWORD = "auth_pwd" - DB_HOST = "localhost" - DB_DATABASE = "auth_db" - DB_PORT = "3306" - PORT = "8081" -) - func main() { - dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true", DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_DATABASE) + dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true", os.Getenv("DB_USER"), os.Getenv("DB_PASSWORD"), os.Getenv("DB_HOST"), os.Getenv("DB_PORT"), os.Getenv("DB_DATABASE")) db, err := sql.Open("mysql", dataSourceName) if err != nil { log.Panic(err.Error()) @@ -48,7 +38,7 @@ func main() { srv := &http.Server{ ReadTimeout: 30 * time.Second, WriteTimeout: 30 * time.Second, - Addr: ":" + PORT, + Addr: ":" + os.Getenv("PORT"), Handler: context.ClearHandler(http.DefaultServeMux), ErrorLog: logger, } diff --git a/docker-compose.yml b/docker-compose.yml index d71cdb9..8e20e17 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,6 +4,10 @@ x-default-logging: &logging options: max-size: "5m" max-file: "2" +networks: + default: + name: api-o11y + driver: bridge services: mysql-auth: image: mariadb:10.5.8 @@ -18,7 +22,6 @@ services: ports: - "3306:3306" container_name: auth_mysql - network_mode: "bridge" mysql-feedbacks: image: mariadb:10.5.8 command: --default-authentication-plugin=mysql_native_password --init-file /data/application/init.sql @@ -32,7 +35,6 @@ services: ports: - "3307:3306" container_name: feedbacks_mysql - network_mode: "bridge" mysql-votes: image: mariadb:10.5.8 command: --default-authentication-plugin=mysql_native_password --init-file /data/application/init.sql @@ -46,24 +48,59 @@ services: ports: - "3308:3306" container_name: votes_mysql - network_mode: "bridge" auth: image: auth build: context: ./ dockerfile: ./auth/Dockerfile -# environment: -# MYSQL_ROOT_PASSWORD: votes_user -# MYSQL_DATABASE: votes_db -# MYSQL_USER: votes_user -# MYSQL_PASSWORD: votes_pwd + environment: + DB_USER: "auth_user" + DB_PASSWORD: "auth_pwd" + DB_HOST: "auth_mysql" + DB_DATABASE: "auth_db" + DB_PORT: "3306" + PORT: "8081" ports: - "8081:8081" container_name: auth - network_mode: "bridge" - - - + depends_on: + - mysql-auth + feedbacks: + image: feedbacks + build: + context: ./ + dockerfile: ./feedbacks/Dockerfile + environment: + DB_USER: "feedbacks_user" + DB_PASSWORD: "feedbacks_pwd" + DB_HOST: "feedbacks_mysql" + DB_DATABASE: "feedbacks_db" + DB_PORT: "3307" + PORT: "8082" + AUTH_URL: "http://auth:8081" + ports: + - "8082:8082" + container_name: feedbacks + depends_on: + - mysql-feedbacks + votes: + image: votes + build: + context: ./ + dockerfile: ./votes/Dockerfile + environment: + DB_USER: "votes_user" + DB_PASSWORD: "votes_pwd" + DB_HOST: "votes_mysql" + DB_DATABASE: "votes_db" + DB_PORT: "3308" + PORT: "8083" + AUTH_URL: "http://auth:8081" + ports: + - "8083:8083" + container_name: votes + depends_on: + - mysql-votes # ******************** # Telemetry Components @@ -72,7 +109,6 @@ services: jaeger: image: jaegertracing/all-in-one container_name: jaeger - network_mode: "bridge" command: - "--memory.max-traces" - "10000" @@ -97,7 +133,6 @@ services: grafana: image: grafana/grafana:9.1.0 container_name: grafana - network_mode: "bridge" deploy: resources: limits: @@ -113,7 +148,6 @@ services: otelcol: image: otel/opentelemetry-collector-contrib:0.74.0 container_name: otel-col - network_mode: "bridge" deploy: resources: limits: @@ -136,7 +170,6 @@ services: prometheus: image: quay.io/prometheus/prometheus:v2.34.0 container_name: prometheus - network_mode: "bridge" command: - --web.console.templates=/etc/prometheus/consoles - --web.console.libraries=/etc/prometheus/console_libraries @@ -156,30 +189,3 @@ services: - "${PROMETHEUS_SERVICE_PORT}:${PROMETHEUS_SERVICE_PORT}" logging: *logging - -# grafana: -# image: grafana/grafana -# ports: -# - "3000:3000" -# container_name: clean-architecture-go-v2-grafana -# network_mode: "bridge" -# depends_on: -# - prometheus -# - prometheus-pushgateway -# prometheus: -# image: prom/prometheus -# ports: -# - 9090:9090 -# command: -# - --config.file=/etc/prometheus/prometheus.yml -# volumes: -# - ./ops/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro -# container_name: clean-architecture-go-v2-prometheus -# network_mode: "bridge" -# prometheus-pushgateway: -# image: prom/pushgateway -# container_name: clean-architecture-go-v2-pushgateway -# expose: -# - 9091 -# ports: -# - "9091:9091" diff --git a/feedbacks/Dockerfile b/feedbacks/Dockerfile index 6c70dde..039d301 100644 --- a/feedbacks/Dockerfile +++ b/feedbacks/Dockerfile @@ -1,4 +1,18 @@ +FROM golang:1.20-alpine AS builder + +WORKDIR /src + +# Restore dependencies +COPY feedbacks/ . + +RUN go mod tidy + +# Build executable +RUN go build -o /src/feedbacks ./ + + FROM scratch -ADD bin/feedbacks / +WORKDIR /src +COPY --from=builder /src/feedbacks ./ EXPOSE 8082 -CMD ["/feedbacks"] +CMD ["/src/feedbacks"] diff --git a/feedbacks/main.go b/feedbacks/main.go index 53814b7..1cefab4 100644 --- a/feedbacks/main.go +++ b/feedbacks/main.go @@ -17,18 +17,8 @@ import ( "time" ) -// @todo get this variables from env or config -const ( - DB_USER = "feedbacks_user" - DB_PASSWORD = "feedbacks_pwd" - DB_HOST = "localhost" - DB_DATABASE = "feedbacks_db" - DB_PORT = "3307" - PORT = "8082" -) - func main() { - dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true", DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_DATABASE) + dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true", os.Getenv("DB_USER"), os.Getenv("DB_PASSWORD"), os.Getenv("DB_HOST"), os.Getenv("DB_PORT"), os.Getenv("DB_DATABASE")) db, err := sql.Open("mysql", dataSourceName) if err != nil { log.Panic(err.Error()) @@ -48,7 +38,7 @@ func main() { srv := &http.Server{ ReadTimeout: 30 * time.Second, WriteTimeout: 30 * time.Second, - Addr: ":" + PORT, + Addr: ":" + os.Getenv("PORT"), Handler: http.DefaultServeMux, ErrorLog: logger, } diff --git a/pkg/middleware/is_authenticated.go b/pkg/middleware/is_authenticated.go index 3f6ab04..05c22d7 100644 --- a/pkg/middleware/is_authenticated.go +++ b/pkg/middleware/is_authenticated.go @@ -5,13 +5,11 @@ import ( "encoding/json" "errors" "net/http" + "os" "strconv" "strings" ) -//@TODO get address from environment variables -const URL = "http://localhost:8081/v1/validate-token" - func IsAuthenticated(next http.Handler) http.Handler { return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { errorMessage := "Erro na autenticaĆ§Ć£o" @@ -25,7 +23,7 @@ func IsAuthenticated(next http.Handler) http.Handler { "token": "` + tokenString + `" }` - req, err := http.Post(URL, "text/plain", strings.NewReader(payload)) + req, err := http.Post(os.Getenv("AUTH_URL")+"/v1/validate-token", "text/plain", strings.NewReader(payload)) if err != nil { respondWithError(rw, http.StatusUnauthorized, err.Error(), errorMessage) return diff --git a/votes/Dockerfile b/votes/Dockerfile index a63afcc..a56d45e 100644 --- a/votes/Dockerfile +++ b/votes/Dockerfile @@ -1,4 +1,17 @@ +FROM golang:1.20-alpine AS builder + +WORKDIR /src + +# Restore dependencies +COPY votes/ . + +RUN go mod tidy + +# Build executable +RUN go build -o /src/votes ./ + FROM scratch -ADD bin/votes / +WORKDIR /src +COPY --from=builder /src/votes ./ EXPOSE 8083 -CMD ["/votes"] +CMD ["/src/votes"]