package config import ( "context" "fmt" "time" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" ) // S3Config S3 存储配置 type S3Config struct { Endpoint string `mapstructure:"endpoint"` AccessKey string `mapstructure:"access_key"` SecretKey string `mapstructure:"secret_key"` Bucket string `mapstructure:"bucket"` UseSSL bool `mapstructure:"use_ssl"` Region string `mapstructure:"region"` Domain string `mapstructure:"domain"` // 自定义域名,如 s3.carrot.skin } // NewS3 创建 S3 客户端 func NewS3(cfg *S3Config) (*minio.Client, error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() client, err := minio.New(cfg.Endpoint, &minio.Options{ Creds: credentials.NewStaticV4(cfg.AccessKey, cfg.SecretKey, ""), Secure: cfg.UseSSL, }) if err != nil { return nil, fmt.Errorf("failed to create S3 client: %w", err) } exists, err := client.BucketExists(ctx, cfg.Bucket) if err != nil { // Access Denied 或网络不通时,跳过 bucket 检查,假定 bucket 已存在 } else if !exists { if err := client.MakeBucket(ctx, cfg.Bucket, minio.MakeBucketOptions{ Region: cfg.Region, }); err != nil { return nil, fmt.Errorf("failed to create bucket: %w", err) } } return client, nil }