package main import ( "context" "fmt" "log" "photum-backend/internal/config" "github.com/aws/aws-sdk-go-v2/aws" awsConfig "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 main() { // Load config manually or assume env vars are set cfg := config.LoadConfig() // Custom Resolver for Civo Object Store customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { return aws.Endpoint{ URL: cfg.S3Endpoint, SigningRegion: region, }, nil }) awsCfg, err := awsConfig.LoadDefaultConfig(context.TODO(), awsConfig.WithRegion(cfg.S3Region), awsConfig.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(cfg.S3AccessKey, cfg.S3SecretKey, "")), awsConfig.WithEndpointResolverWithOptions(customResolver), ) if err != nil { log.Fatalf("unable to load SDK config, %v", err) } client := s3.NewFromConfig(awsCfg, func(o *s3.Options) { o.UsePathStyle = true }) policy := fmt.Sprintf(`{ "Version": "2012-10-17", "Statement": [ { "Sid": "PublicRead", "Effect": "Allow", "Principal": "*", "Action": ["s3:GetObject"], "Resource": ["arn:aws:s3:::%s/*"] } ] }`, cfg.S3Bucket) log.Printf("Setting policy for bucket: %s...", cfg.S3Bucket) _, err = client.PutBucketPolicy(context.TODO(), &s3.PutBucketPolicyInput{ Bucket: aws.String(cfg.S3Bucket), Policy: aws.String(policy), }) if err != nil { log.Printf("Error setting policy: %v", err) log.Println("Ensure your credentials have permission to set bucket policies, or configure it manually in the Civo console.") } else { log.Println("Successfully set bucket policy to Public Read!") } }