diff --git a/Dockerfile b/Dockerfile index c05cbe3..33390eb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,14 @@ FROM golang:1.25.1-alpine3.22 AS builder +RUN apk add --no-cache \ + bash \ + curl \ + git \ + ca-certificates + + +RUN apk add --no-cache tzdata + WORKDIR /app COPY go.mod go.sum ./ RUN go mod download @@ -7,11 +16,19 @@ COPY . . RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags="-s -w" -o main "./cmd" -FROM ubuntu:24.04 +FROM alpine:3.22 + +RUN apk add --no-cache \ + bash \ + curl \ + ca-certificates \ + tzdata COPY --from=builder /app/main /usr/local/bin/app RUN chmod +x /usr/local/bin/app +#RUN adduser -D -s /bin/bash appuser +#USER appuser ENTRYPOINT ["app"] \ No newline at end of file diff --git a/api.env b/api.env index add3486..0a477e8 100644 --- a/api.env +++ b/api.env @@ -12,7 +12,6 @@ MEDIA_STORAGE_USER= MEDIA_STORAGE_PASS= MEDIA_STORAGE_HOST= MEDIA_STORAGE_PORT= -MEDIA_STORAGE_SECURE=false DB_HOST= DB_PORT= diff --git a/internal/api/merch/controller.go b/internal/api/merch/controller.go index d4e05f8..f0d8e8b 100644 --- a/internal/api/merch/controller.go +++ b/internal/api/merch/controller.go @@ -362,7 +362,7 @@ func (co *controller) getMerchImage(c *gin.Context) { log.WithError(err).Error("Merch | Failed to get merch image") return } - c.JSON(http.StatusOK, link) + c.JSON(http.StatusOK, ImageLink{Link: link.String()}) } // @Summary Удалить (безвозвратно) картинки по merch_uuid и query параметрам diff --git a/internal/api/merch/dto.go b/internal/api/merch/dto.go index bc1646e..3f94688 100644 --- a/internal/api/merch/dto.go +++ b/internal/api/merch/dto.go @@ -56,5 +56,4 @@ type UpdateMerchDTO struct { type ImageLink struct { Link string `json:"link"` - ETag string `json:"etag"` } diff --git a/internal/api/merch/handler.go b/internal/api/merch/handler.go index b9b8227..a83f913 100644 --- a/internal/api/merch/handler.go +++ b/internal/api/merch/handler.go @@ -32,10 +32,10 @@ func NewHandler(deps Deps) *Handler { "addr": media, }).Debug("Merch handler constructor | Media provider") - exists, err := media.CheckBucketExists(packageBucketName) - if err != nil || !exists { - log.WithError(err).Fatal("Merch handler constructor | Failed to ensure bucket exists") - } + //exists, err := media.CheckBucketExists(packageBucketName) + //if err != nil || !exists { + // log.WithError(err).Fatal("Merch handler constructor | Failed to ensure bucket exists") + //} return &Handler{ repo: r, diff --git a/internal/api/merch/service.go b/internal/api/merch/service.go index eb0c85d..de751ec 100644 --- a/internal/api/merch/service.go +++ b/internal/api/merch/service.go @@ -14,6 +14,7 @@ import ( "io" "merch-parser-api/internal/interfaces" "mime/multipart" + "net/url" "path/filepath" "strings" "time" @@ -303,14 +304,14 @@ func (s *service) uploadMerchImage(ctx context.Context, userUuid, merchUuid, ima return nil } -func (s *service) getMerchImage(ctx context.Context, userUuid, merchUuid, imageType string) (ImageLink, error) { +func (s *service) getMerchImage(ctx context.Context, userUuid, merchUuid, imageType string) (*url.URL, error) { exists, err := s.repo.merchRecordExists(userUuid, merchUuid) if err != nil { - return ImageLink{}, err + return nil, err } if !exists { - return ImageLink{}, fmt.Errorf("no merch found for user %s with uuid %s", userUuid, merchUuid) + return nil, fmt.Errorf("no merch found for user %s with uuid %s", userUuid, merchUuid) } var object string @@ -320,23 +321,10 @@ func (s *service) getMerchImage(ctx context.Context, userUuid, merchUuid, imageT case "full": object = fmt.Sprintf("%s/merch/%s/full.jpg", userUuid, merchUuid) default: - return ImageLink{}, fmt.Errorf("unknown image type %s", imageType) + return nil, fmt.Errorf("unknown image type %s", imageType) } - link, err := s.media.Get(ctx, s.bucketName, object, s.expires, nil) - if err != nil { - return ImageLink{}, err - } - - etag, err := s.media.GetObjectEtag(ctx, s.bucketName, object) - if err != nil { - return ImageLink{}, err - } - - return ImageLink{ - Link: link.String(), - ETag: etag, - }, nil + return s.media.Get(ctx, s.bucketName, object, s.expires, nil) } func (s *service) deleteMerchImage(ctx context.Context, userUuid, merchUuid string) error { @@ -379,7 +367,7 @@ func (s *service) _uploadToStorage(params uploadImageParams) error { if err != nil { log.WithFields(log.Fields{ "error": err, - "img type": params.imageType, + "img type": "full", }).Error("Merch | Failed to upload file to media storage") return err } diff --git a/internal/interfaces/mediaStorage.go b/internal/interfaces/mediaStorage.go index bf46f47..ef8e178 100644 --- a/internal/interfaces/mediaStorage.go +++ b/internal/interfaces/mediaStorage.go @@ -12,5 +12,4 @@ type MediaStorage interface { Upload(ctx context.Context, bucket, object string, reader io.Reader, size int64) error Get(ctx context.Context, bucket, object string, expires time.Duration, params url.Values) (*url.URL, error) Delete(ctx context.Context, bucket, object string) error - GetObjectEtag(ctx context.Context, bucketName, object string) (string, error) } diff --git a/internal/mediaStorage/service.go b/internal/mediaStorage/service.go index 3a5b7aa..39fedce 100644 --- a/internal/mediaStorage/service.go +++ b/internal/mediaStorage/service.go @@ -42,11 +42,3 @@ func (s *Service) Get(ctx context.Context, bucket, object string, expires time.D func (s *Service) Delete(ctx context.Context, bucket, object string) error { return s.client.RemoveObject(ctx, bucket, object, minio.RemoveObjectOptions{}) } - -func (s *Service) GetObjectEtag(ctx context.Context, bucketName, object string) (string, error) { - info, err := s.client.StatObject(ctx, bucketName, object, minio.StatObjectOptions{}) - if err != nil { - return "", err - } - return info.ETag, nil -}