mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-30 12:39:27 +08:00
@@ -220,24 +220,24 @@ func main() {
|
||||
arguments, err := parseArgs()
|
||||
if err != nil {
|
||||
fmt.Printf("Failed to parse arguments: %v\n", err)
|
||||
return
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if arguments.helpFlag || arguments.mode == nil {
|
||||
printHelp(arguments)
|
||||
return
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if arguments.versionFlag {
|
||||
fmt.Printf("RAGFlow version: %s\n", common.GetRAGFlowVersion())
|
||||
return
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Initialize local variables (runtime variables from Redis)
|
||||
err = server.InitLocalVariables()
|
||||
if err != nil {
|
||||
fmt.Printf("Failed to start %s server: %v\n", *arguments.mode, err)
|
||||
return
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Temporary logger initialization
|
||||
@@ -267,7 +267,7 @@ func main() {
|
||||
|
||||
if err = server.Init(configPath); err != nil {
|
||||
common.Error("Failed to initialize configuration", err)
|
||||
return
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
config := server.GetConfig()
|
||||
@@ -275,10 +275,10 @@ func main() {
|
||||
// override default port if provided
|
||||
switch *arguments.mode {
|
||||
case "api":
|
||||
port := config.Server.Port
|
||||
port := config.APIServer.Port
|
||||
if arguments.port != nil {
|
||||
port = *arguments.port
|
||||
config.Server.Port = port
|
||||
config.APIServer.Port = port
|
||||
}
|
||||
if arguments.name == nil {
|
||||
serverName = fmt.Sprintf("api_server_%d", port)
|
||||
@@ -303,8 +303,9 @@ func main() {
|
||||
serverName = fmt.Sprintf("syncer_server_%s", uuid)
|
||||
}
|
||||
default:
|
||||
common.Error("invalid server mode", errors.New(*arguments.mode))
|
||||
return
|
||||
err = errors.New(*arguments.mode)
|
||||
common.Error("invalid server mode", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// set server name and log file path
|
||||
@@ -333,6 +334,8 @@ func main() {
|
||||
if config.Log.Path != "" {
|
||||
fileOut.Path = config.Log.Path
|
||||
}
|
||||
|
||||
common.SyncLog()
|
||||
if err = common.Init(logLevel, fileOut, serverName); err != nil {
|
||||
common.Error("Failed to reinitialize logger with configured level", err)
|
||||
}
|
||||
@@ -340,7 +343,7 @@ func main() {
|
||||
server.SetLogger(common.Logger)
|
||||
|
||||
// Print all configuration settings
|
||||
common.Info(fmt.Sprintf("Starting %s server: %s, mode: %s", *arguments.mode, serverName, config.Server.Mode))
|
||||
common.Info(fmt.Sprintf("Starting %s server: %s, mode: %s", *arguments.mode, serverName, config.General.Mode))
|
||||
server.PrintAll()
|
||||
|
||||
// Initialize database
|
||||
@@ -377,7 +380,7 @@ func main() {
|
||||
|
||||
if err = server.StartServer(ctx, cancel, serverName); err != nil {
|
||||
common.Error("Failed to start EE server", err)
|
||||
return
|
||||
os.Exit(1)
|
||||
}
|
||||
defer server.ShutdownServer(ctx)
|
||||
|
||||
@@ -389,36 +392,36 @@ func main() {
|
||||
case "api":
|
||||
if err = runAPI(ctx, arguments, config); err != nil {
|
||||
fmt.Printf("Failed to start API server: %v\n", err)
|
||||
return
|
||||
os.Exit(1)
|
||||
}
|
||||
case "admin":
|
||||
if err = runAdmin(ctx, cancel, arguments, config); err != nil {
|
||||
if err = runAdmin(ctx, arguments, config); err != nil {
|
||||
fmt.Printf("Failed to start ADMIN server: %v\n", err)
|
||||
return
|
||||
os.Exit(1)
|
||||
}
|
||||
case "ingestor":
|
||||
if err = runIngestor(ctx, cancel, arguments, config); err != nil {
|
||||
fmt.Printf("Failed to start INGESTION worker: %v\n", err)
|
||||
return
|
||||
os.Exit(1)
|
||||
}
|
||||
case "syncer":
|
||||
if err = runSyncer(ctx, cancel, arguments, config); err != nil {
|
||||
fmt.Printf("Failed to start SYNCER: %v\n", err)
|
||||
return
|
||||
os.Exit(1)
|
||||
}
|
||||
default:
|
||||
fmt.Printf("Invalid server mode: %s\n", *arguments.mode)
|
||||
return
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func runAdmin(ctx context.Context, cancel context.CancelFunc, args *serverArgs, config *server.Config) error {
|
||||
func runAdmin(ctx context.Context, args *serverArgs, config *server.Config) error {
|
||||
|
||||
// Set Gin mode
|
||||
if config.Server.Mode == "release" {
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
} else {
|
||||
if config.General.Mode == "debug" {
|
||||
gin.SetMode(gin.DebugMode)
|
||||
} else {
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
}
|
||||
|
||||
adminService := admin.NewService()
|
||||
@@ -659,10 +662,10 @@ func runAPI(ctx context.Context, args *serverArgs, config *server.Config) error
|
||||
func startServer(ctx context.Context, config *server.Config) {
|
||||
|
||||
// Set Gin mode
|
||||
if config.Server.Mode == "release" {
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
} else {
|
||||
if config.General.Mode == "debug" {
|
||||
gin.SetMode(gin.DebugMode)
|
||||
} else {
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
}
|
||||
|
||||
// Initialize service layer
|
||||
@@ -844,7 +847,7 @@ func startServer(ctx context.Context, config *server.Config) {
|
||||
r.Setup(ginEngine)
|
||||
|
||||
// Create HTTP server with timeouts to prevent slow clients from blocking shutdown
|
||||
addr := fmt.Sprintf(":%d", config.Server.Port)
|
||||
addr := fmt.Sprintf(":%d", config.APIServer.Port)
|
||||
srv := &http.Server{
|
||||
Addr: addr,
|
||||
Handler: ginEngine,
|
||||
@@ -864,7 +867,7 @@ func startServer(ctx context.Context, config *server.Config) {
|
||||
" /_/ |_|/_/ |_|\\____//_/ /_/ \\____/ |__/|__/\n",
|
||||
)
|
||||
common.Info(fmt.Sprintf("RAGFlow Go Version: %s", common.GetRAGFlowVersion()))
|
||||
common.Info(fmt.Sprintf("Server starting on port: %d", config.Server.Port))
|
||||
common.Info(fmt.Sprintf("Server starting on port: %d", config.APIServer.Port))
|
||||
if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
|
||||
common.Fatal("Failed to start server", zap.Error(err))
|
||||
}
|
||||
@@ -873,8 +876,8 @@ func startServer(ctx context.Context, config *server.Config) {
|
||||
// Start heartbeat reporter to admin server
|
||||
if hb := startHeartbeat(
|
||||
common.ServerTypeAPI,
|
||||
fmt.Sprintf("ragflow-server-%d", config.Server.Port),
|
||||
config.Server.Port,
|
||||
fmt.Sprintf("ragflow-server-%d", config.APIServer.Port),
|
||||
config.APIServer.Port,
|
||||
config,
|
||||
); hb != nil {
|
||||
defer hb.Stop()
|
||||
|
||||
@@ -215,10 +215,10 @@ func (h *Handler) ListUsers(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
ctx := c.Request.Context()
|
||||
var users []map[string]interface{}
|
||||
switch common.GetRAGFlowType() {
|
||||
case common.OpenSourceVersion:
|
||||
ctx := c.Request.Context()
|
||||
users, err = h.service.ListUsers(ctx, pageInt, pageSizeInt, name, status, sort, orderBy)
|
||||
if err != nil {
|
||||
common.ErrorWithCode(c, common.CodeServerError, err.Error())
|
||||
@@ -228,7 +228,7 @@ func (h *Handler) ListUsers(c *gin.Context) {
|
||||
common.SuccessWithData(c, users, "List users")
|
||||
return
|
||||
case common.EnterpriseEdition:
|
||||
users, err = h.service.ListUsersEE(pageInt, pageSizeInt, name, status, role, sort, orderBy, plan, topInt, daysInt, quotaPtr)
|
||||
users, err = h.service.ListUsersEE(ctx, pageInt, pageSizeInt, name, status, role, sort, orderBy, plan, topInt, daysInt, quotaPtr)
|
||||
if err != nil {
|
||||
common.ErrorWithCode(c, common.CodeServerError, err.Error())
|
||||
return
|
||||
@@ -865,7 +865,7 @@ func (h *Handler) HandleNoRoute(c *gin.Context) {
|
||||
|
||||
// GetLogLevel returns the current log level
|
||||
func (h *Handler) GetLogLevel(c *gin.Context) {
|
||||
level := common.GetLevel()
|
||||
level := common.GetLogLevel()
|
||||
common.SuccessWithData(c, gin.H{"level": level}, "SUCCESS")
|
||||
}
|
||||
|
||||
@@ -882,7 +882,7 @@ func (h *Handler) SetLogLevel(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
if err := common.SetLevel(req.Level); err != nil {
|
||||
if err := common.SetLogLevel(req.Level); err != nil {
|
||||
common.ErrorWithCode(c, common.CodeBadRequest, err.Error())
|
||||
return
|
||||
}
|
||||
@@ -1095,11 +1095,12 @@ func (h *Handler) ListIngestionTasks(c *gin.Context) {
|
||||
var err error
|
||||
var tasks []map[string]interface{}
|
||||
var req ListIngestionTasksRequest
|
||||
ctx := c.Request.Context()
|
||||
|
||||
if err = c.ShouldBindJSON(&req); err != nil {
|
||||
ctx := c.Request.Context()
|
||||
tasks, err = h.service.ListIngestionTasks(ctx)
|
||||
} else {
|
||||
tasks, err = h.service.ListIngestionTasksByCondition(req.Email, req.Status)
|
||||
tasks, err = h.service.ListIngestionTasksByCondition(ctx, req.Email, req.Status)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
|
||||
@@ -887,7 +887,9 @@ func (h *Handler) ShowUserSummary(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
userSummary, err := h.service.ShowUserSummary(username)
|
||||
ctx := c.Request.Context()
|
||||
|
||||
userSummary, err := h.service.ShowUserSummary(ctx, username)
|
||||
if err != nil {
|
||||
if errors.Is(err, common.ErrUserNotFound) {
|
||||
common.ErrorWithCode(c, common.CodeNotFound, "User not found")
|
||||
@@ -927,7 +929,9 @@ func (h *Handler) ShowUserQuota(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
userQuota, err := h.service.ShowUserQuota(username)
|
||||
ctx := c.Request.Context()
|
||||
|
||||
userQuota, err := h.service.ShowUserQuota(ctx, username)
|
||||
if err != nil {
|
||||
if errors.Is(err, common.ErrUserNotFound) {
|
||||
common.ErrorWithCode(c, common.CodeNotFound, "User not found")
|
||||
@@ -1923,7 +1927,9 @@ func (h *Handler) GetTokenStats(c *gin.Context) {
|
||||
}
|
||||
granularity = strings.ToLower(granularity)
|
||||
|
||||
stats, err := h.service.GetTokenStats(userName, fromDate, toDate, granularity)
|
||||
ctx := c.Request.Context()
|
||||
|
||||
stats, err := h.service.GetTokenStats(ctx, userName, fromDate, toDate, granularity)
|
||||
if err != nil {
|
||||
common.ErrorWithCode(c, common.CodeDataError, err.Error())
|
||||
return
|
||||
@@ -1990,8 +1996,9 @@ func (h *Handler) ListLogs(c *gin.Context) {
|
||||
common.ErrorWithCode(c, common.CodeBadRequest, "Invalid days")
|
||||
return
|
||||
}
|
||||
ctx := c.Request.Context()
|
||||
|
||||
stats, err := h.service.ListLogs(userName, daysInt)
|
||||
stats, err := h.service.ListLogs(ctx, userName, daysInt)
|
||||
if err != nil {
|
||||
common.ErrorWithCode(c, common.CodeDataError, err.Error())
|
||||
return
|
||||
|
||||
@@ -441,10 +441,10 @@ func (s *Service) ShowUserDatasetSummary(email, dataset string) (map[string]inte
|
||||
}
|
||||
|
||||
// ShowUserSummary show user summary for enterprise edition
|
||||
func (s *Service) ShowUserSummary(email string) (map[string]interface{}, error) {
|
||||
func (s *Service) ShowUserSummary(ctx context.Context, email string) (map[string]interface{}, error) {
|
||||
// Query user by email
|
||||
var user entity.User
|
||||
err := dao.DB.Where("email = ?", email).First(&user).Error
|
||||
err := dao.DB.WithContext(ctx).Where("email = ?", email).First(&user).Error
|
||||
if err != nil {
|
||||
return nil, common.ErrUserNotFound
|
||||
}
|
||||
@@ -477,10 +477,10 @@ func (s *Service) ShowUserStorage(email string) (map[string]interface{}, error)
|
||||
}
|
||||
|
||||
// ShowUserQuota show user quota for enterprise edition
|
||||
func (s *Service) ShowUserQuota(email string) (map[string]interface{}, error) {
|
||||
func (s *Service) ShowUserQuota(ctx context.Context, email string) (map[string]interface{}, error) {
|
||||
// Query user by email
|
||||
var user entity.User
|
||||
err := dao.DB.Where("email = ?", email).First(&user).Error
|
||||
err := dao.DB.WithContext(ctx).Where("email = ?", email).First(&user).Error
|
||||
if err != nil {
|
||||
return nil, common.ErrUserNotFound
|
||||
}
|
||||
@@ -794,7 +794,7 @@ func (s *Service) ShowUsersActivity(days, windows *int) (map[string]interface{},
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *Service) ListUsersEE(pageIndex, pageSize int, name string, status, role, sort, orderBy, plan string, top, days int, quota *int) ([]map[string]interface{}, error) {
|
||||
func (s *Service) ListUsersEE(ctx context.Context, pageIndex, pageSize int, name string, status, role, sort, orderBy, plan string, top, days int, quota *int) ([]map[string]interface{}, error) {
|
||||
item := map[string]interface{}{}
|
||||
item["pageIndex"] = pageIndex
|
||||
item["pageSize"] = pageSize
|
||||
@@ -1119,7 +1119,7 @@ func (s *Service) ListUserAPIKeys(ctx context.Context, username string) ([]map[s
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *Service) ListIngestionTasksByCondition(email, status *string) ([]map[string]interface{}, error) {
|
||||
func (s *Service) ListIngestionTasksByCondition(ctx context.Context, email, status *string) ([]map[string]interface{}, error) {
|
||||
|
||||
if email == nil && status == nil {
|
||||
return nil, fmt.Errorf("email or status are required")
|
||||
@@ -1299,7 +1299,7 @@ func (s *Service) BatchDeleteWhiteList(ids []int) (map[string]interface{}, error
|
||||
}
|
||||
|
||||
// GetTokenStats returns API token statistics for the user.
|
||||
func (s *Service) GetTokenStats(userName, fromDate, toDate, granularity string) ([]map[string]interface{}, error) {
|
||||
func (s *Service) GetTokenStats(ctx context.Context, userName, fromDate, toDate, granularity string) ([]map[string]interface{}, error) {
|
||||
result := []map[string]interface{}{
|
||||
{
|
||||
"command": "get_token_stats",
|
||||
@@ -1340,7 +1340,7 @@ func (s *Service) GetTokenStatsSummary(fromDate, toDate string) (map[string]inte
|
||||
}
|
||||
|
||||
// ListLogs lists operation logs for the user.
|
||||
func (s *Service) ListLogs(userName string, days int) ([]map[string]interface{}, error) {
|
||||
func (s *Service) ListLogs(ctx context.Context, userName string, days int) ([]map[string]interface{}, error) {
|
||||
result := []map[string]interface{}{
|
||||
{
|
||||
"command": "list_logs",
|
||||
|
||||
@@ -17,14 +17,14 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"go.uber.org/zap"
|
||||
"go.uber.org/zap/zapcore"
|
||||
@@ -108,7 +108,7 @@ func Init(level string, file FileOutput, serviceName string) error {
|
||||
TimeKey: "timestamp",
|
||||
LevelKey: "level",
|
||||
NameKey: "service",
|
||||
CallerKey: "",
|
||||
CallerKey: "caller",
|
||||
FunctionKey: "",
|
||||
MessageKey: "msg",
|
||||
StacktraceKey: "stacktrace",
|
||||
@@ -167,26 +167,20 @@ func Init(level string, file FileOutput, serviceName string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Sync flushes any buffered log entries.
|
||||
func Sync() {
|
||||
// SyncLog flushes any buffered log entries.
|
||||
func SyncLog() {
|
||||
if Logger != nil {
|
||||
_ = Logger.Sync()
|
||||
}
|
||||
}
|
||||
|
||||
// Fatal logs a fatal message using zap with caller info, then calls os.Exit(1).
|
||||
func Fatal(msg string, fields ...zap.Field) {
|
||||
if Logger == nil {
|
||||
panic("logger not initialized")
|
||||
}
|
||||
_, file, line, ok := runtime.Caller(1)
|
||||
if ok {
|
||||
fields = append(fields, zap.String("caller", fmt.Sprintf("%s:%d", file, line)))
|
||||
}
|
||||
Logger.Fatal(msg, fields...)
|
||||
}
|
||||
|
||||
// Info logs an info message.
|
||||
func Info(msg string, fields ...zap.Field) {
|
||||
if Logger == nil {
|
||||
return
|
||||
@@ -194,19 +188,18 @@ func Info(msg string, fields ...zap.Field) {
|
||||
Logger.Info(msg, fields...)
|
||||
}
|
||||
|
||||
// Error logs an error message. err may be nil; if non-nil it is appended as
|
||||
// a zap.Error field. Additional fields follow.
|
||||
func Error(msg string, err error, fields ...zap.Field) {
|
||||
if Logger == nil {
|
||||
return
|
||||
}
|
||||
if err != nil {
|
||||
fields = append(fields, zap.Error(err))
|
||||
|
||||
if IsDebugEnabled() {
|
||||
Logger.Error(fmt.Sprintf("%s, %+v", msg, err), fields...)
|
||||
} else {
|
||||
Logger.Error(fmt.Sprintf("%s, %v", msg, err), fields...)
|
||||
}
|
||||
Logger.Error(msg, fields...)
|
||||
}
|
||||
|
||||
// Debug logs a debug message.
|
||||
func Debug(msg string, fields ...zap.Field) {
|
||||
if Logger == nil {
|
||||
return
|
||||
@@ -214,7 +207,6 @@ func Debug(msg string, fields ...zap.Field) {
|
||||
Logger.Debug(msg, fields...)
|
||||
}
|
||||
|
||||
// Warn logs a warning message.
|
||||
func Warn(msg string, fields ...zap.Field) {
|
||||
if Logger == nil {
|
||||
return
|
||||
@@ -227,13 +219,13 @@ func IsDebugEnabled() bool {
|
||||
return atomicLevel.Enabled(zapcore.DebugLevel)
|
||||
}
|
||||
|
||||
// GetLevel returns the current log level.
|
||||
func GetLevel() string {
|
||||
// GetLogLevel returns the current log level.
|
||||
func GetLogLevel() string {
|
||||
return atomicLevel.String()
|
||||
}
|
||||
|
||||
// SetLevel sets the log level at runtime.
|
||||
func SetLevel(level string) error {
|
||||
// SetLogLevel sets the log level at runtime.
|
||||
func SetLogLevel(level string) error {
|
||||
zapLevel, err := parseZapLevel(level)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -242,15 +234,6 @@ func SetLevel(level string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// ResolveCompress applies the project default (true) when the config-level
|
||||
// Compress is nil. When non-nil, the operator's choice is used as-is.
|
||||
//
|
||||
// The project default is compression on; operators can opt out by setting
|
||||
// log.compress: false in service_conf.yaml. Because Go's bool zero value is
|
||||
// false and would otherwise be indistinguishable from "not set", the YAML
|
||||
// struct uses *bool and this helper resolves the defaulting at the cmd/
|
||||
// boundary. The *bool does not live in this file because FileOutput itself
|
||||
// takes a plain bool (the caller has already resolved the default by then).
|
||||
func ResolveCompress(c *bool) bool {
|
||||
if c == nil {
|
||||
return true
|
||||
@@ -319,7 +302,7 @@ func GinLogger() gin.HandlerFunc {
|
||||
// Likely a panic recovered by gin.Recovery() with no c.Error attached.
|
||||
// Use a sentinel so the err field is non-empty; operators can
|
||||
// grep for this string in logs.
|
||||
ginErr = errors.New("5xx response with no handler error attached")
|
||||
ginErr = err5xxNoError
|
||||
}
|
||||
Error(msg, ginErr, fields...)
|
||||
case status >= 400:
|
||||
@@ -329,3 +312,5 @@ func GinLogger() gin.HandlerFunc {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var err5xxNoError = errors.New("5xx response with no handler error attached")
|
||||
|
||||
@@ -81,7 +81,7 @@ func InitDB(ctx context.Context, migrateDB bool) error {
|
||||
|
||||
// Set log level
|
||||
var gormLogLevel gormLogger.LogLevel
|
||||
if cfg.Server.Mode == "debug" {
|
||||
if cfg.General.Mode == "debug" {
|
||||
gormLogLevel = gormLogger.Info
|
||||
} else {
|
||||
gormLogLevel = gormLogger.Silent
|
||||
|
||||
@@ -18,7 +18,6 @@ package dao
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"ragflow/internal/entity"
|
||||
|
||||
"gorm.io/gorm"
|
||||
|
||||
@@ -144,7 +144,7 @@ func (h *SystemHandler) GetVersion(c *gin.Context) {
|
||||
// table carried (e.g. "peewee", "pdfminer") were inert for the Go
|
||||
// side and are no longer returned.
|
||||
func (h *SystemHandler) GetLogLevel(c *gin.Context) {
|
||||
common.SuccessWithData(c, gin.H{"level": common.GetLevel()}, "success")
|
||||
common.SuccessWithData(c, gin.H{"level": common.GetLogLevel()}, "success")
|
||||
}
|
||||
|
||||
// SetLogLevelRequest set log level request. PkgName is accepted for
|
||||
@@ -172,13 +172,13 @@ func (h *SystemHandler) SetLogLevel(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
if err := common.SetLevel(req.Level); err != nil {
|
||||
if err := common.SetLogLevel(req.Level); err != nil {
|
||||
common.ErrorWithCode(c, common.CodeDataError, "Invalid log level: "+req.Level)
|
||||
return
|
||||
}
|
||||
|
||||
if config := server.GetConfig(); config != nil {
|
||||
config.Log.Level = common.GetLevel()
|
||||
config.Log.Level = common.GetLogLevel()
|
||||
}
|
||||
|
||||
common.SuccessWithData(c, gin.H{"level": req.Level}, "SUCCESS")
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/mail"
|
||||
@@ -37,7 +38,6 @@ const DefaultConnectTimeout = 5 * time.Second
|
||||
// Config application configuration
|
||||
type Config struct {
|
||||
General GeneralConfig `mapstructure:"general"`
|
||||
Server ServerConfig `mapstructure:"server"`
|
||||
Authentication AuthenticationConfig `mapstructure:"authentication"`
|
||||
Database DatabaseConfig `mapstructure:"database"`
|
||||
Redis RedisConfig `mapstructure:"redis"`
|
||||
@@ -49,6 +49,7 @@ type Config struct {
|
||||
OAuth map[string]OAuthConfig `mapstructure:"oauth"`
|
||||
SMTP common.SMTPConfig `mapstructure:"smtp"`
|
||||
Admin AdminConfig `mapstructure:"admin"`
|
||||
APIServer APIServerConfig `mapstructure:"ragflow"`
|
||||
UserDefaultLLM UserDefaultLLMConfig `mapstructure:"user_default_llm"`
|
||||
DefaultSuperUser DefaultSuperUser `mapstructure:"default_super_user"`
|
||||
Language string `mapstructure:"language"`
|
||||
@@ -61,6 +62,13 @@ type Config struct {
|
||||
// GeneralConfig general configuration
|
||||
type GeneralConfig struct {
|
||||
HeartbeatInterval time.Duration `mapstructure:"heartbeat_interval"`
|
||||
Mode string `mapstructure:"mode"` // debug, release
|
||||
SecretKey *string `mapstructure:"secret_key"`
|
||||
DocEngine string `mapstructure:"doc_engine"` // Infinity, Elasticsearch
|
||||
StorageEngine string `mapstructure:"storage_engine"` // Minio, S3
|
||||
CacheEngine string `mapstructure:"cache_engine"` // Redis
|
||||
QueueEngine string `mapstructure:"queue_engine"` // NATS
|
||||
AnalyticEngine string `mapstructure:"analytic_engine"` // Clickhouse
|
||||
}
|
||||
|
||||
// AdminConfig admin server configuration
|
||||
@@ -69,6 +77,11 @@ type AdminConfig struct {
|
||||
Port int `mapstructure:"http_port"`
|
||||
}
|
||||
|
||||
type APIServerConfig struct {
|
||||
Host string `mapstructure:"host"`
|
||||
Port int `mapstructure:"http_port"`
|
||||
}
|
||||
|
||||
type AuthenticationConfig struct {
|
||||
DisablePasswordLogin bool `mapstructure:"disable_password_login"`
|
||||
RegisterEnabled bool `mapstructure:"register_enabled"`
|
||||
@@ -135,7 +148,7 @@ type ModelConfig struct {
|
||||
|
||||
// OAuthConfig OAuth configuration for a channel.
|
||||
// Mirrors api/apps/auth/__init__.py's OAUTH_CONFIG entries: a Type that
|
||||
// selects the auth client flavor (oauth2 / oidc / github), plus the
|
||||
// selects the auth client flavor (oauth2 / oidc / GitHub), plus the
|
||||
// transport URLs and client credentials. For OIDC the URLs are derived
|
||||
// from Issuer via the .well-known/openid-configuration document, so they
|
||||
// may be left blank.
|
||||
@@ -153,13 +166,6 @@ type OAuthConfig struct {
|
||||
Issuer string `mapstructure:"issuer"`
|
||||
}
|
||||
|
||||
// ServerConfig server configuration
|
||||
type ServerConfig struct {
|
||||
Mode string `mapstructure:"mode"` // debug, release
|
||||
Port int `mapstructure:"port"`
|
||||
SecretKey *string `mapstructure:"secret_key"`
|
||||
}
|
||||
|
||||
// DatabaseConfig database configuration
|
||||
type DatabaseConfig struct {
|
||||
Driver string `mapstructure:"driver"` // mysql
|
||||
@@ -485,7 +491,7 @@ func Init(configPath string) error {
|
||||
func FromEnvironments() error {
|
||||
// Secret key
|
||||
if envVal := common.GetEnv(common.EnvRAGFlowSecretKey); envVal != "" {
|
||||
globalConfig.Server.SecretKey = &envVal
|
||||
globalConfig.General.SecretKey = &envVal
|
||||
}
|
||||
|
||||
// Load REGISTER_ENABLED from environment variable (default: true)
|
||||
@@ -593,7 +599,7 @@ func FromEnvironments() error {
|
||||
minioRegion := strings.ToLower(common.GetEnv(common.EnvMinioRegion))
|
||||
if minioRegion != "" {
|
||||
if globalConfig.StorageEngine.Minio == nil {
|
||||
return fmt.Errorf("Minio config not found")
|
||||
return fmt.Errorf("minio config not found")
|
||||
}
|
||||
globalConfig.StorageEngine.Minio.Region = minioRegion
|
||||
}
|
||||
@@ -641,7 +647,8 @@ func FromConfigFile(configPath string) error {
|
||||
|
||||
// Read configuration file
|
||||
if err := v.ReadInConfig(); err != nil {
|
||||
if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
|
||||
var configFileNotFoundError viper.ConfigFileNotFoundError
|
||||
if !errors.As(err, &configFileNotFoundError) {
|
||||
return fmt.Errorf("read config file error: %w", err)
|
||||
}
|
||||
zapLogger.Info("Config file not found, using environment variables only")
|
||||
@@ -702,25 +709,31 @@ func FromConfigFile(configPath string) error {
|
||||
}
|
||||
|
||||
// Map ragflow section to ServerConfig
|
||||
if globalConfig != nil && globalConfig.Server.Port == 0 {
|
||||
if globalConfig != nil && globalConfig.APIServer.Port == 0 {
|
||||
// Try to map from ragflow section
|
||||
if v.IsSet("ragflow") {
|
||||
ragflowConfig := v.Sub("ragflow")
|
||||
if ragflowConfig != nil {
|
||||
globalConfig.Server.Port = ragflowConfig.GetInt("http_port") + 4 // 9384, by default
|
||||
globalConfig.APIServer.Port = ragflowConfig.GetInt("http_port") + 4 // 9384, by default
|
||||
//globalConfig.Server.Port = ragflowConfig.GetInt("http_port") // Correct
|
||||
// If mode is not set, default to debug
|
||||
if globalConfig.Server.Mode == "" {
|
||||
globalConfig.Server.Mode = "release"
|
||||
if globalConfig.General.Mode == "" {
|
||||
globalConfig.General.Mode = "release"
|
||||
}
|
||||
secretKey := ragflowConfig.GetString("secret_key")
|
||||
if secretKey != "" {
|
||||
globalConfig.Server.SecretKey = &secretKey
|
||||
globalConfig.General.SecretKey = &secretKey
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if globalConfig.APIServer.Port == 0 {
|
||||
globalConfig.APIServer.Port = 9384
|
||||
} else {
|
||||
globalConfig.APIServer.Port += 4
|
||||
}
|
||||
|
||||
// Map redis section to RedisConfig
|
||||
if globalConfig != nil && globalConfig.Redis.Host != "" {
|
||||
if v.IsSet("redis") {
|
||||
@@ -729,7 +742,7 @@ func FromConfigFile(configPath string) error {
|
||||
hostStr := redisConfig.GetString("host")
|
||||
// Handle host:port format (e.g., "localhost:6379")
|
||||
if hostStr == "" {
|
||||
return fmt.Errorf("Empty host of redis configuration")
|
||||
return fmt.Errorf("empty host of Redis configuration")
|
||||
}
|
||||
|
||||
if idx := strings.LastIndex(hostStr, ":"); idx != -1 {
|
||||
@@ -740,7 +753,7 @@ func FromConfigFile(configPath string) error {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return fmt.Errorf("Error address format of redis: %s", hostStr)
|
||||
return fmt.Errorf("error address format of Redis: %s", hostStr)
|
||||
}
|
||||
|
||||
globalConfig.Redis.Password = redisConfig.GetString("password")
|
||||
@@ -925,7 +938,7 @@ func FromConfigFile(configPath string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Get get global configuration
|
||||
// GetConfig gets the global configuration
|
||||
func GetConfig() *Config {
|
||||
return globalConfig
|
||||
}
|
||||
@@ -943,10 +956,6 @@ func SetLogger(l *zap.Logger) {
|
||||
zapLogger = l
|
||||
}
|
||||
|
||||
func GetGlobalViperConfig() *viper.Viper {
|
||||
return globalViper
|
||||
}
|
||||
|
||||
func GetAllConfigs() []map[string]interface{} {
|
||||
return allConfigs
|
||||
}
|
||||
|
||||
@@ -91,8 +91,8 @@ func InitVariables(store VariableStore) error {
|
||||
|
||||
// GetSecretKey returns the current secret key
|
||||
func GetSecretKey(store VariableStore) (string, error) {
|
||||
if globalConfig.Server.SecretKey != nil {
|
||||
return *globalConfig.Server.SecretKey, nil
|
||||
if globalConfig.General.SecretKey != nil {
|
||||
return *globalConfig.General.SecretKey, nil
|
||||
}
|
||||
|
||||
generatedKey, err := utility.GenerateSecretKey()
|
||||
|
||||
@@ -23,7 +23,6 @@ import (
|
||||
"crypto/sha512"
|
||||
"encoding/base64"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"hash"
|
||||
"ragflow/internal/common"
|
||||
@@ -35,6 +34,8 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"golang.org/x/crypto/pbkdf2"
|
||||
"golang.org/x/crypto/scrypt"
|
||||
"gorm.io/gorm"
|
||||
@@ -392,6 +393,7 @@ func (s *UserService) Login(ctx context.Context, req *LoginRequest) (*entity.Use
|
||||
func (s *UserService) LoginByEmail(ctx context.Context, req *EmailLoginRequest) (*entity.User, common.ErrorCode, error) {
|
||||
user, err := s.userDAO.GetByEmail(ctx, dao.DB, req.Email)
|
||||
if err != nil {
|
||||
common.Error("user not found by email", err)
|
||||
return nil, common.CodeAuthenticationError, fmt.Errorf("email: %s is not registered", req.Email)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user