config.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package app
  2. import (
  3. "fmt"
  4. "github.com/go-playground/validator/v10"
  5. )
  6. type Config struct {
  7. // server
  8. ServerPort uint16 `envconfig:"SERVER_PORT" validate:"required"`
  9. ServerKey string `envconfig:"SERVER_KEY" validate:"required"`
  10. // dify inner api
  11. DifyInnerApiURL string `envconfig:"DIFY_INNER_API_URL" validate:"required"`
  12. DifyInnerApiKey string `envconfig:"DIFY_INNER_API_KEY" validate:"required"`
  13. AWSAccessKey string `envconfig:"AWS_ACCESS_KEY"`
  14. AWSSecretKey string `envconfig:"AWS_SECRET_KEY"`
  15. AWSRegion string `envconfig:"AWS_REGION"`
  16. PluginStorageType string `envconfig:"PLUGIN_STORAGE_TYPE" validate:"required,oneof=local aws_s3"`
  17. PluginStorageOSSBucket string `envconfig:"PLUGIN_STORAGE_OSS_BUCKET"`
  18. PluginStorageLocalRoot string `envconfig:"PLUGIN_STORAGE_LOCAL_ROOT"`
  19. // plugin remote installing
  20. PluginRemoteInstallingHost string `envconfig:"PLUGIN_REMOTE_INSTALLING_HOST"`
  21. PluginRemoteInstallingPort uint16 `envconfig:"PLUGIN_REMOTE_INSTALLING_PORT"`
  22. PluginRemoteInstallingEnabled bool `envconfig:"PLUGIN_REMOTE_INSTALLING_ENABLED"`
  23. PluginRemoteInstallingMaxConn int `envconfig:"PLUGIN_REMOTE_INSTALLING_MAX_CONN"`
  24. PluginRemoteInstallingMaxSingleTenantConn int `envconfig:"PLUGIN_REMOTE_INSTALLING_MAX_SINGLE_TENANT_CONN"`
  25. PluginRemoteInstallServerEventLoopNums int `envconfig:"PLUGIN_REMOTE_INSTALL_SERVER_EVENT_LOOP_NUMS"`
  26. PluginEndpointEnabled bool `envconfig:"PLUGIN_ENDPOINT_ENABLED"`
  27. PluginWorkingPath string `envconfig:"PLUGIN_WORKING_PATH"` // where the plugin finally running
  28. PluginMediaCacheSize uint16 `envconfig:"PLUGIN_MEDIA_CACHE_SIZE"`
  29. PluginMediaCachePath string `envconfig:"PLUGIN_MEDIA_CACHE_PATH"`
  30. PluginInstalledPath string `envconfig:"PLUGIN_INSTALLED_PATH" validate:"required"` // where the plugin finally installed
  31. PluginPackageCachePath string `envconfig:"PLUGIN_PACKAGE_CACHE_PATH"` // where plugin packages stored
  32. PluginMaxExecutionTimeout int `envconfig:"PLUGIN_MAX_EXECUTION_TIMEOUT" validate:"required"`
  33. // platform like local or aws lambda
  34. Platform PlatformType `envconfig:"PLATFORM" validate:"required"`
  35. // routine pool
  36. RoutinePoolSize int `envconfig:"ROUTINE_POOL_SIZE" validate:"required"`
  37. // redis
  38. RedisHost string `envconfig:"REDIS_HOST" validate:"required"`
  39. RedisPort uint16 `envconfig:"REDIS_PORT" validate:"required"`
  40. RedisPass string `envconfig:"REDIS_PASSWORD"`
  41. // database
  42. DBUsername string `envconfig:"DB_USERNAME" validate:"required"`
  43. DBPassword string `envconfig:"DB_PASSWORD" validate:"required"`
  44. DBHost string `envconfig:"DB_HOST" validate:"required"`
  45. DBPort uint16 `envconfig:"DB_PORT" validate:"required"`
  46. DBDatabase string `envconfig:"DB_DATABASE" validate:"required"`
  47. DBSslMode string `envconfig:"DB_SSL_MODE" validate:"required,oneof=disable require"`
  48. // persistence storage
  49. PersistenceStoragePath string `envconfig:"PERSISTENCE_STORAGE_PATH"`
  50. PersistenceStorageMaxSize int64 `envconfig:"PERSISTENCE_STORAGE_MAX_SIZE"`
  51. // force verifying signature for all plugins, not allowing install plugin not signed
  52. ForceVerifyingSignature bool `envconfig:"FORCE_VERIFYING_SIGNATURE"`
  53. // lifetime state management
  54. LifetimeCollectionHeartbeatInterval int `envconfig:"LIFETIME_COLLECTION_HEARTBEAT_INTERVAL" validate:"required"`
  55. LifetimeCollectionGCInterval int `envconfig:"LIFETIME_COLLECTION_GC_INTERVAL" validate:"required"`
  56. LifetimeStateGCInterval int `envconfig:"LIFETIME_STATE_GC_INTERVAL" validate:"required"`
  57. DifyInvocationConnectionIdleTimeout int `envconfig:"DIFY_INVOCATION_CONNECTION_IDLE_TIMEOUT" validate:"required"`
  58. DifyPluginServerlessConnectorURL *string `envconfig:"DIFY_PLUGIN_SERVERLESS_CONNECTOR_URL"`
  59. DifyPluginServerlessConnectorAPIKey *string `envconfig:"DIFY_PLUGIN_SERVERLESS_CONNECTOR_API_KEY"`
  60. MaxPluginPackageSize int64 `envconfig:"MAX_PLUGIN_PACKAGE_SIZE" validate:"required"`
  61. MaxBundlePackageSize int64 `envconfig:"MAX_BUNDLE_PACKAGE_SIZE" validate:"required"`
  62. MaxAWSLambdaTransactionTimeout int `envconfig:"MAX_AWS_LAMBDA_TRANSACTION_TIMEOUT"`
  63. PythonInterpreterPath string `envconfig:"PYTHON_INTERPRETER_PATH"`
  64. }
  65. func (c *Config) Validate() error {
  66. validator := validator.New()
  67. err := validator.Struct(c)
  68. if err != nil {
  69. return err
  70. }
  71. if c.PluginRemoteInstallingEnabled {
  72. if c.PluginRemoteInstallingHost == "" {
  73. return fmt.Errorf("plugin remote installing host is empty")
  74. }
  75. if c.PluginRemoteInstallingPort == 0 {
  76. return fmt.Errorf("plugin remote installing port is empty")
  77. }
  78. if c.PluginRemoteInstallingMaxConn == 0 {
  79. return fmt.Errorf("plugin remote installing max connection is empty")
  80. }
  81. if c.PluginRemoteInstallServerEventLoopNums == 0 {
  82. return fmt.Errorf("plugin remote install server event loop nums is empty")
  83. }
  84. }
  85. if c.Platform == PLATFORM_AWS_LAMBDA {
  86. if c.DifyPluginServerlessConnectorURL == nil {
  87. return fmt.Errorf("dify plugin serverless connector url is empty")
  88. }
  89. if c.DifyPluginServerlessConnectorAPIKey == nil {
  90. return fmt.Errorf("dify plugin serverless connector api key is empty")
  91. }
  92. if c.MaxAWSLambdaTransactionTimeout == 0 {
  93. return fmt.Errorf("max aws lambda transaction timeout is empty")
  94. }
  95. } else if c.Platform == PLATFORM_LOCAL {
  96. if c.PluginWorkingPath == "" {
  97. return fmt.Errorf("plugin working path is empty")
  98. }
  99. } else {
  100. return fmt.Errorf("invalid platform")
  101. }
  102. if c.PluginPackageCachePath == "" {
  103. return fmt.Errorf("plugin package cache path is empty")
  104. }
  105. if c.PluginStorageType == "aws_s3" {
  106. if c.PluginStorageOSSBucket == "" {
  107. return fmt.Errorf("plugin storage bucket is empty")
  108. }
  109. if c.AWSAccessKey == "" || c.AWSSecretKey == "" || c.AWSRegion == "" {
  110. return fmt.Errorf("aws access key, secret key or region is empty")
  111. }
  112. }
  113. return nil
  114. }
  115. type PlatformType string
  116. const (
  117. PLATFORM_LOCAL PlatformType = "local"
  118. PLATFORM_AWS_LAMBDA PlatformType = "aws_lambda"
  119. )