Files
ragflow/internal/server/config/storage_engine_config.go
Jin Hai 36ae39bc60 Go: refactor config (#17544)
Signed-off-by: Jin Hai <haijin.chn@gmail.com>
2026-07-31 17:18:45 +08:00

298 lines
8.4 KiB
Go

//
// 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
}