// // Copyright 2026 The InfiniFlow Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // package config import ( "fmt" "github.com/spf13/viper" ) // StorageConfig holds all storage-related configurations type StorageConfig struct { Minio MinioConfig `mapstructure:"minio"` S3 S3Config `mapstructure:"s3"` OSS OSSConfig `mapstructure:"oss"` GCS GCSConfig `mapstructure:"gcs"` } func (c *Config) ParseStorageEngineConfig(v *viper.Viper) error { switch c.general.StorageEngine { case "minio": c.parseMinioConfig(v) case "s3": c.parseS3Config(v) case "oss": c.parseOSSConfig(v) case "gcs": c.parseGCSConfig(v) default: return fmt.Errorf("invalid storage type: %s", c.general.StorageEngine) } return nil } // MinioConfig holds MinIO storage configuration type MinioConfig struct { Host string `mapstructure:"host"` // MinIO server host (e.g., "localhost:9000") User string `mapstructure:"user"` // Access key Password string `mapstructure:"password"` // Secret key Bucket string `mapstructure:"bucket"` // Default bucket (optional) PrefixPath string `mapstructure:"prefix_path"` // Path prefix (optional) Secure bool `mapstructure:"secure"` // Use HTTPS Verify bool `mapstructure:"verify"` // Verify SSL certificates Region string `mapstructure:"region"` // optional } func (c *Config) parseMinioConfig(v *viper.Viper) { // Default MinIO config c.storageEngine.Minio.Host = "localhost:23817" c.storageEngine.Minio.User = "rag_flow" c.storageEngine.Minio.Password = "infini_rag_flow" c.storageEngine.Minio.Bucket = "" c.storageEngine.Minio.PrefixPath = "" c.storageEngine.Minio.Secure = false c.storageEngine.Minio.Verify = false c.storageEngine.Minio.Region = "" if !v.IsSet("minio") { return } sub := v.Sub("minio") if sub == nil { return } if sub.IsSet("host") { c.storageEngine.Minio.Host = sub.GetString("host") } if sub.IsSet("user") { c.storageEngine.Minio.User = sub.GetString("user") } if sub.IsSet("password") { c.storageEngine.Minio.Password = sub.GetString("password") } if sub.IsSet("bucket") { c.storageEngine.Minio.Bucket = sub.GetString("bucket") } if sub.IsSet("prefix_path") { c.storageEngine.Minio.PrefixPath = sub.GetString("prefix_path") } if sub.IsSet("secure") { c.storageEngine.Minio.Secure = sub.GetBool("secure") } if sub.IsSet("verify") { c.storageEngine.Minio.Verify = sub.GetBool("verify") } if sub.IsSet("region") { c.storageEngine.Minio.Region = sub.GetString("region") } } // S3Config holds AWS S3 storage configuration type S3Config struct { AccessKey string `mapstructure:"access_key"` // AWS Access Key ID SecretKey string `mapstructure:"secret_key"` // AWS Secret Access Key Region string `mapstructure:"region_name"` // AWS Region SessionToken string `mapstructure:"session_token"` // AWS Session Token (optional) EndpointURL string `mapstructure:"endpoint_url"` // Custom endpoint (optional) SignatureVersion string `mapstructure:"signature_version"` // Signature version AddressingStyle string `mapstructure:"addressing_style"` // Addressing style Bucket string `mapstructure:"bucket"` // Default bucket (optional) PrefixPath string `mapstructure:"prefix_path"` // Path prefix (optional) } func (c *Config) parseS3Config(v *viper.Viper) { // Default S3 config c.storageEngine.S3.AccessKey = "" c.storageEngine.S3.SecretKey = "" c.storageEngine.S3.Region = "" c.storageEngine.S3.SessionToken = "" c.storageEngine.S3.EndpointURL = "" c.storageEngine.S3.SignatureVersion = "v4" c.storageEngine.S3.AddressingStyle = "path" c.storageEngine.S3.Bucket = "" c.storageEngine.S3.PrefixPath = "" if !v.IsSet("s3") { return } sub := v.Sub("s3") if sub == nil { return } if sub.IsSet("access_key") { c.storageEngine.S3.AccessKey = sub.GetString("access_key") } if sub.IsSet("secret_key") { c.storageEngine.S3.SecretKey = sub.GetString("secret_key") } if sub.IsSet("region") { c.storageEngine.S3.Region = sub.GetString("region") } if sub.IsSet("session_token") { c.storageEngine.S3.SessionToken = sub.GetString("session_token") } if sub.IsSet("endpoint_url") { c.storageEngine.S3.EndpointURL = sub.GetString("endpoint_url") } if sub.IsSet("signature_version") { c.storageEngine.S3.SignatureVersion = sub.GetString("signature_version") } if sub.IsSet("addressing_style") { c.storageEngine.S3.AddressingStyle = sub.GetString("addressing_style") } if sub.IsSet("bucket") { c.storageEngine.S3.Bucket = sub.GetString("bucket") } if sub.IsSet("prefix_path") { c.storageEngine.S3.PrefixPath = sub.GetString("prefix_path") } } // OSSConfig holds Aliyun OSS storage configuration // OSS is compatible with S3 API type OSSConfig struct { AccessKey string `mapstructure:"access_key"` // OSS Access Key ID SecretKey string `mapstructure:"secret_key"` // OSS Secret Access Key EndpointURL string `mapstructure:"endpoint_url"` // OSS Endpoint (e.g., "https://oss-cn-hangzhou.aliyuncs.com") Region string `mapstructure:"region"` // Region (e.g., "cn-hangzhou") Bucket string `mapstructure:"bucket"` // Default bucket (optional) PrefixPath string `mapstructure:"prefix_path"` // Path prefix (optional) SignatureVersion string `mapstructure:"signature_version"` // Signature version AddressingStyle string `mapstructure:"addressing_style"` // Addressing style } func (c *Config) parseOSSConfig(v *viper.Viper) { // Default OSS config c.storageEngine.OSS.AccessKey = "" c.storageEngine.OSS.SecretKey = "" c.storageEngine.OSS.EndpointURL = "" c.storageEngine.OSS.Region = "" c.storageEngine.OSS.Bucket = "" c.storageEngine.OSS.PrefixPath = "" c.storageEngine.OSS.SignatureVersion = "v4" c.storageEngine.OSS.AddressingStyle = "path" if !v.IsSet("oss") { return } sub := v.Sub("oss") if sub == nil { return } if sub.IsSet("access_key") { c.storageEngine.OSS.AccessKey = sub.GetString("access_key") } if sub.IsSet("secret_key") { c.storageEngine.OSS.SecretKey = sub.GetString("secret_key") } if sub.IsSet("endpoint_url") { c.storageEngine.OSS.EndpointURL = sub.GetString("endpoint_url") } if sub.IsSet("region") { c.storageEngine.OSS.Region = sub.GetString("region") } if sub.IsSet("bucket") { c.storageEngine.OSS.Bucket = sub.GetString("bucket") } if sub.IsSet("prefix_path") { c.storageEngine.OSS.PrefixPath = sub.GetString("prefix_path") } if sub.IsSet("signature_version") { c.storageEngine.OSS.SignatureVersion = sub.GetString("signature_version") } if sub.IsSet("addressing_style") { c.storageEngine.OSS.AddressingStyle = sub.GetString("addressing_style") } } type GCSConfig struct { Bucket string `mapstructure:"bucket"` // Default bucket (optional) PrefixPath string `mapstructure:"prefix_path"` // Path prefix (optional) EndpointURL string `mapstructure:"endpoint_url"` // Custom endpoint (optional) } func (c *Config) parseGCSConfig(v *viper.Viper) { // Default GCS config c.storageEngine.GCS.Bucket = "" c.storageEngine.GCS.PrefixPath = "" c.storageEngine.GCS.EndpointURL = "" if !v.IsSet("gcs") { return } sub := v.Sub("gcs") if sub == nil { return } if sub.IsSet("bucket") { c.storageEngine.GCS.Bucket = sub.GetString("bucket") } if sub.IsSet("prefix_path") { c.storageEngine.GCS.PrefixPath = sub.GetString("prefix_path") } if sub.IsSet("endpoint_url") { c.storageEngine.GCS.EndpointURL = sub.GetString("endpoint_url") } } func (c *Config) GetMinioConfig() MinioConfig { return c.storageEngine.Minio } func (c *Config) GetS3Config() S3Config { return c.storageEngine.S3 } func (c *Config) GetOSSConfig() OSSConfig { return c.storageEngine.OSS } func (c *Config) GetGCSConfig() GCSConfig { return c.storageEngine.GCS }