diff --git a/backend.Dockerfile b/backend.Dockerfile new file mode 100644 index 0000000..7a2b478 --- /dev/null +++ b/backend.Dockerfile @@ -0,0 +1,23 @@ +FROM golang:1.22-alpine AS builder +WORKDIR /build + +COPY go.mod go.sum ./ +RUN go mod download && go mod verify + +COPY cmd/backend cmd/backend +COPY pkg pkg +COPY internal internal + +RUN GOEXPERIMENT=boringcrypto go build -ldflags "-s -w" -o ./app ./cmd/backend +RUN chmod +x ./app + +FROM alpine:3.21.2 AS production +WORKDIR /backend + +COPY --from=builder /build/app . +COPY deploy/backend-config.yaml ./config.yaml +COPY deploy/backend-jwt-privkey ./privkey + +EXPOSE 8080 + +CMD ["./app", "-c", "config.yaml", "-k", "privkey"] \ No newline at end of file diff --git a/cmd/backend/app.go b/cmd/backend/app.go index f36ac80..d62f7d2 100644 --- a/cmd/backend/app.go +++ b/cmd/backend/app.go @@ -1,7 +1,6 @@ package main import ( - "backend/cmd/backend/args_parser" "backend/cmd/backend/server" "backend/internal/core/models" "backend/internal/core/repos" @@ -55,7 +54,7 @@ func (a *App) Run(p RunParams) { //----------------------------------------- - args, err := args_parser.Parse(osArgs) + args, err := CmdArgsParse(osArgs) if err != nil { log.Fatalf("failed to parse os args: %v\n", err) } @@ -90,7 +89,7 @@ func (a *App) Run(p RunParams) { var key *rsa.PrivateKey { - keyRawBytes, err := os.ReadFile(conf.GetJwtSigningKey()) + keyRawBytes, err := os.ReadFile(args.GetSigningKeyPath()) if err != nil { logger.Fatal().Err(err).Msg("failed reading signing key file") } diff --git a/cmd/backend/args_parser/args.go b/cmd/backend/cmdargs.go similarity index 62% rename from cmd/backend/args_parser/args.go rename to cmd/backend/cmdargs.go index 543d0df..3726db5 100644 --- a/cmd/backend/args_parser/args.go +++ b/cmd/backend/cmdargs.go @@ -1,19 +1,21 @@ -package args_parser +package main import ( "github.com/akamensky/argparse" ) -type Args interface { +type CmdArgs interface { GetProfilePath() string GetConfigPath() string GetLogPath() string + GetSigningKeyPath() string } -func Parse(osArgs []string) (Args, error) { +func CmdArgsParse(osArgs []string) (CmdArgs, error) { parser := argparse.NewParser("backend", "runs backend") s := parser.String("c", "config", &argparse.Options{Required: true, Help: "Path to a config file"}) + k := parser.String("k", "key", &argparse.Options{Required: false, Default: "", Help: "Path to a jwt signing key"}) l := parser.String("o", "log", &argparse.Options{Required: false, Default: "", Help: "Path to a log file"}) p := parser.String("p", "profile", &argparse.Options{Required: false, Default: "", Help: "Path to a cpu profile file"}) @@ -23,16 +25,18 @@ func Parse(osArgs []string) (Args, error) { } return &args{ - ConfigPath: *s, - LogPath: *l, - ProfilePath: *p, + ConfigPath: *s, + LogPath: *l, + ProfilePath: *p, + SigningKeyPath: *k, }, nil } type args struct { - ProfilePath string - ConfigPath string - LogPath string + ProfilePath string + ConfigPath string + LogPath string + SigningKeyPath string } func (a *args) GetConfigPath() string { @@ -46,3 +50,7 @@ func (a *args) GetLogPath() string { func (a *args) GetProfilePath() string { return a.ProfilePath } + +func (a *args) GetSigningKeyPath() string { + return a.SigningKeyPath +} diff --git a/cmd/backend/config.go b/cmd/backend/config.go index 893c0db..f24abf9 100644 --- a/cmd/backend/config.go +++ b/cmd/backend/config.go @@ -5,7 +5,6 @@ import "backend/pkg/config" type IConfig interface { GetPort() uint16 GetPostgresUrl() string - GetJwtSigningKey() string GetKafkaUrl() string GetKafkaTopic() string } @@ -15,11 +14,10 @@ func LoadConfig(filePath string) (IConfig, error) { } type Config struct { - Port uint16 `yaml:"port"` - PostgresUrl string `yaml:"postgres_url"` - JwtSigningKey string `yaml:"jwt_signing_key" validate:"file"` - KafkaUrl string `yaml:"kafka_url"` - KafkaTopic string `yaml:"kafka_topic"` + Port uint16 `yaml:"port"` + PostgresUrl string `yaml:"postgres_url"` + KafkaUrl string `yaml:"kafka_url"` + KafkaTopic string `yaml:"kafka_topic"` } func (c *Config) GetPort() uint16 { @@ -30,10 +28,6 @@ func (c *Config) GetPostgresUrl() string { return c.PostgresUrl } -func (c *Config) GetJwtSigningKey() string { - return c.JwtSigningKey -} - func (c *Config) GetKafkaUrl() string { return c.KafkaUrl } diff --git a/cmd/backend/config.yaml b/cmd/backend/config.yaml deleted file mode 100644 index e50060a..0000000 --- a/cmd/backend/config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -port: 8080 -postgres_url: "postgres://postgres:postgres@localhost:5432/postgres" -jwt_signing_key: "./jwt_signing_key" -kafka_url: "localhost:9091" -kafka_topic: "events" \ No newline at end of file diff --git a/cmd/backend/server/server.go b/cmd/backend/server/server.go index e76b7d4..028ee83 100644 --- a/cmd/backend/server/server.go +++ b/cmd/backend/server/server.go @@ -28,14 +28,14 @@ func NewServer(opts NewServerOpts) *httpserver.Server { r := gin.New() r.ContextWithFallback = true // Use it to allow getting values from c.Request.Context() - // r.Static("/webapp", "./webapp") + metrics := integrations.NewMetrics("backend") + serverMetrics := httpserver.NewServerMetrics(metrics) + r.GET("/health", handlers.New200OkHandler()) + r.Any("/metrics", gin.WrapH(metrics.HttpHandler())) - prometheus := integrations.NewPrometheus() - r.Any("/metrics", gin.WrapH(prometheus.GetRequestHandler())) - - r.Use(httpserver.NewRecoveryMiddleware(opts.Logger, prometheus, opts.DebugMode)) - r.Use(httpserver.NewRequestLogMiddleware(opts.Logger, opts.Tracer, prometheus)) + r.Use(httpserver.NewRecoveryMiddleware(opts.Logger, serverMetrics, opts.DebugMode)) + r.Use(httpserver.NewRequestLogMiddleware(opts.Logger, opts.Tracer, serverMetrics)) r.Use(httpserver.NewTracingMiddleware(opts.Tracer)) r.GET("/verify-user", handlers.NewUserVerifyEmailHandler(opts.Logger, opts.UserService)) diff --git a/cmd/notifyer/config.go b/cmd/notifyer/config.go index e40f597..f0c0437 100644 --- a/cmd/notifyer/config.go +++ b/cmd/notifyer/config.go @@ -8,6 +8,7 @@ func LoadConfig(filePath string) (Config, error) { type Config struct { App struct { + Port uint16 `yaml:"port"` LogFile string `yaml:"logFile"` ServiceUrl string `yaml:"serviceUrl"` } diff --git a/cmd/notifyer/emailer.go b/cmd/notifyer/emailer.go index 7c496c6..71cc508 100644 --- a/cmd/notifyer/emailer.go +++ b/cmd/notifyer/emailer.go @@ -14,7 +14,7 @@ const MSG_TEXT = `
{{.Text}}
{{if .Link}} - Clicklink + link {{end}}