Files
backend_jupiter/internal/backup/s3_upload.go
2026-05-25 11:45:56 +05:30

68 lines
1.5 KiB
Go

package backup
import (
"context"
"fmt"
"os"
"path/filepath"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/credentials"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func UploadParquetToSpaces(localFilePath, objectPath string) (string, error) {
region := os.Getenv("DO_SPACES_REGION")
endpoint := os.Getenv("DO_SPACES_ENDPOINT")
bucket := os.Getenv("DO_SPACES_BUCKET")
accessKey := os.Getenv("DO_SPACES_ACCESS_KEY")
secretKey := os.Getenv("DO_SPACES_SECRET_KEY")
cfg, err := config.LoadDefaultConfig(
context.TODO(),
config.WithRegion(region),
config.WithCredentialsProvider(
credentials.NewStaticCredentialsProvider(accessKey, secretKey, ""),
),
config.WithEndpointResolver(
aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) {
return aws.Endpoint{
URL: "https://" + endpoint,
SigningRegion: region,
}, nil
}),
),
)
if err != nil {
return "", err
}
client := s3.NewFromConfig(cfg)
file, err := os.Open(localFilePath)
if err != nil {
return "", err
}
defer file.Close()
_, err = client.PutObject(context.TODO(), &s3.PutObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(objectPath),
Body: file,
ContentType: aws.String("application/octet-stream"),
ACL: "public-read",
})
if err != nil {
return "", err
}
cdnURL := fmt.Sprintf(
"https://images.nearle.app/%s",
filepath.ToSlash(objectPath),
)
return cdnURL, nil
}