config.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. // plugin remote installing
  14. PluginRemoteInstallingHost string `envconfig:"PLUGIN_REMOTE_INSTALLING_HOST"`
  15. PluginRemoteInstallingPort uint16 `envconfig:"PLUGIN_REMOTE_INSTALLING_PORT"`
  16. PluginRemoteInstallingEnabled bool `envconfig:"PLUGIN_REMOTE_INSTALLING_ENABLED"`
  17. PluginRemoteInstallingMaxConn int `envconfig:"PLUGIN_REMOTE_INSTALLING_MAX_CONN"`
  18. PluginRemoteInstallServerEventLoopNums int `envconfig:"PLUGIN_REMOTE_INSTALL_SERVER_EVENT_LOOP_NUMS"`
  19. PluginEndpointEnabled bool `envconfig:"PLUGIN_ENDPOINT_ENABLED"`
  20. PluginStoragePath string `envconfig:"STORAGE_PLUGIN_PATH" validate:"required"`
  21. PluginWorkingPath string `envconfig:"PLUGIN_WORKING_PATH"`
  22. PluginMediaCacheSize uint16 `envconfig:"PLUGIN_MEDIA_CACHE_SIZE"`
  23. PluginMediaCachePath string `envconfig:"PLUGIN_MEDIA_CACHE_PATH"`
  24. ProcessCachingPath string `envconfig:"PROCESS_CACHING_PATH"`
  25. PluginMaxExecutionTimeout int `envconfig:"PLUGIN_MAX_EXECUTION_TIMEOUT" validate:"required"`
  26. // platform like local or aws lambda
  27. Platform PlatformType `envconfig:"PLATFORM" validate:"required"`
  28. // routine pool
  29. RoutinePoolSize int `envconfig:"ROUTINE_POOL_SIZE" validate:"required"`
  30. // redis
  31. RedisHost string `envconfig:"REDIS_HOST" validate:"required"`
  32. RedisPort uint16 `envconfig:"REDIS_PORT" validate:"required"`
  33. RedisPass string `envconfig:"REDIS_PASS" validate:"required"`
  34. // database
  35. DBUsername string `envconfig:"DB_USERNAME" validate:"required"`
  36. DBPassword string `envconfig:"DB_PASSWORD" validate:"required"`
  37. DBHost string `envconfig:"DB_HOST" validate:"required"`
  38. DBPort uint16 `envconfig:"DB_PORT" validate:"required"`
  39. DBDatabase string `envconfig:"DB_DATABASE" validate:"required"`
  40. DBSslMode string `envconfig:"DB_SSL_MODE" validate:"required,oneof=disable require"`
  41. // persistence storage
  42. PersistenceStorageType string `envconfig:"PERSISTENCE_STORAGE_TYPE" validate:"required,oneof=local s3"`
  43. PersistenceStorageLocalPath string `envconfig:"PERSISTENCE_STORAGE_LOCAL_PATH"`
  44. PersistenceStorageS3Region string `envconfig:"PERSISTENCE_STORAGE_S3_REGION"`
  45. PersistenceStorageS3AccessKey string `envconfig:"PERSISTENCE_STORAGE_S3_ACCESS_KEY"`
  46. PersistenceStorageS3SecretKey string `envconfig:"PERSISTENCE_STORAGE_S3_SECRET_KEY"`
  47. PersistenceStorageS3Bucket string `envconfig:"PERSISTENCE_STORAGE_S3_BUCKET"`
  48. // force verifying signature for all plugins, not allowing install plugin not signed
  49. ForceVerifyingSignature bool `envconfig:"FORCE_VERIFYING_SIGNATURE"`
  50. // lifetime state management
  51. LifetimeCollectionHeartbeatInterval int `envconfig:"LIFETIME_COLLECTION_HEARTBEAT_INTERVAL" validate:"required"`
  52. LifetimeCollectionGCInterval int `envconfig:"LIFETIME_COLLECTION_GC_INTERVAL" validate:"required"`
  53. LifetimeStateGCInterval int `envconfig:"LIFETIME_STATE_GC_INTERVAL" validate:"required"`
  54. DifyInvocationConnectionIdleTimeout int `envconfig:"DIFY_INVOCATION_CONNECTION_IDLE_TIMEOUT" validate:"required"`
  55. DifyPluginServerlessConnectorURL *string `envconfig:"DIFY_PLUGIN_SERVERLESS_CONNECTOR_URL"`
  56. DifyPluginServerlessConnectorAPIKey *string `envconfig:"DIFY_PLUGIN_SERVERLESS_CONNECTOR_API_KEY"`
  57. MaxPluginPackageSize int64 `envconfig:"MAX_PLUGIN_PACKAGE_SIZE" validate:"required"`
  58. MaxAWSLambdaTransactionTimeout int `envconfig:"MAX_AWS_LAMBDA_TRANSACTION_TIMEOUT"`
  59. }
  60. func (c *Config) Validate() error {
  61. validator := validator.New()
  62. err := validator.Struct(c)
  63. if err != nil {
  64. return err
  65. }
  66. if c.PluginRemoteInstallingEnabled {
  67. if c.PluginRemoteInstallingHost == "" {
  68. return fmt.Errorf("plugin remote installing host is empty")
  69. }
  70. if c.PluginRemoteInstallingPort == 0 {
  71. return fmt.Errorf("plugin remote installing port is empty")
  72. }
  73. if c.PluginRemoteInstallingMaxConn == 0 {
  74. return fmt.Errorf("plugin remote installing max connection is empty")
  75. }
  76. if c.PluginRemoteInstallServerEventLoopNums == 0 {
  77. return fmt.Errorf("plugin remote install server event loop nums is empty")
  78. }
  79. }
  80. if c.Platform == PLATFORM_AWS_LAMBDA {
  81. if c.DifyPluginServerlessConnectorURL == nil {
  82. return fmt.Errorf("dify plugin serverless connector url is empty")
  83. }
  84. if c.DifyPluginServerlessConnectorAPIKey == nil {
  85. return fmt.Errorf("dify plugin serverless connector api key is empty")
  86. }
  87. if c.MaxAWSLambdaTransactionTimeout == 0 {
  88. return fmt.Errorf("max aws lambda transaction timeout is empty")
  89. }
  90. } else if c.Platform == PLATFORM_LOCAL {
  91. if c.PluginWorkingPath == "" {
  92. return fmt.Errorf("plugin working path is empty")
  93. }
  94. if c.ProcessCachingPath == "" {
  95. return fmt.Errorf("process caching path is empty")
  96. }
  97. } else {
  98. return fmt.Errorf("invalid platform")
  99. }
  100. if c.PersistenceStorageType == "s3" {
  101. if c.PersistenceStorageS3Region == "" ||
  102. c.PersistenceStorageS3AccessKey == "" ||
  103. c.PersistenceStorageS3SecretKey == "" ||
  104. c.PersistenceStorageS3Bucket == "" {
  105. return fmt.Errorf("s3 region, access key, secret key, bucket is empty")
  106. }
  107. }
  108. return nil
  109. }
  110. type PlatformType string
  111. const (
  112. PLATFORM_LOCAL PlatformType = "local"
  113. PLATFORM_AWS_LAMBDA PlatformType = "aws_lambda"
  114. )