2026-03-13 09:38:18 +08:00
|
|
|
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 {
|
2026-04-25 21:22:52 +08:00
|
|
|
// Access Denied 或网络不通时,跳过 bucket 检查,假定 bucket 已存在
|
|
|
|
|
} else if !exists {
|
2026-03-13 09:38:18 +08:00
|
|
|
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
|
|
|
|
|
}
|