dify_containers.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. package models
  2. import (
  3. "errors"
  4. "fmt"
  5. "path"
  6. "yunion.io/x/onecloud/pkg/apis"
  7. computeapi "yunion.io/x/onecloud/pkg/apis/compute"
  8. api "yunion.io/x/onecloud/pkg/apis/llm"
  9. )
  10. type DifyContainerEnv map[string]string
  11. func (envsPtr *DifyContainerEnv) GetContainerEnvs(userCustomizedEnvs *DifyContainerEnv) []*apis.ContainerKeyValue {
  12. envs := *envsPtr
  13. if len(envs) == 0 {
  14. return nil
  15. }
  16. ctrEnvs := make([]*apis.ContainerKeyValue, 0, len(envs))
  17. for key, value := range envs {
  18. if userCustomizedEnvs != nil && (*userCustomizedEnvs)[key] != "" {
  19. value = (*userCustomizedEnvs)[key]
  20. }
  21. ctrEnvs = append(ctrEnvs, &apis.ContainerKeyValue{
  22. Key: key,
  23. Value: value,
  24. })
  25. }
  26. return ctrEnvs
  27. }
  28. func (envsPtr *DifyContainerEnv) SetContainerEnv(key, value string) error {
  29. if key == "" {
  30. return errors.New("environment variable key cannot be empty")
  31. }
  32. if envsPtr == nil {
  33. return errors.New("DifyContainerEnv pointer is nil")
  34. }
  35. if *envsPtr == nil {
  36. *envsPtr = make(DifyContainerEnv)
  37. }
  38. (*envsPtr)[key] = value
  39. return nil
  40. }
  41. // DifyCustomizedEnvsToMap converts API DifyCustomizedEnvs to DifyContainerEnv for container build. Returns nil if empty.
  42. func DifyCustomizedEnvsToMap(envs []*api.DifyCustomizedEnv) DifyContainerEnv {
  43. if len(envs) == 0 {
  44. return nil
  45. }
  46. m := make(DifyContainerEnv, len(envs))
  47. for _, e := range envs {
  48. if e != nil && e.Key != "" {
  49. m[e.Key] = e.Value
  50. }
  51. }
  52. if len(m) == 0 {
  53. return nil
  54. }
  55. return m
  56. }
  57. func getPVCMount(name, subDir, mountPath string) *apis.ContainerVolumeMount {
  58. diskIndex := 0
  59. pvc := &apis.ContainerVolumeMount{
  60. UniqueName: name + "-data-pvc",
  61. Type: apis.CONTAINER_VOLUME_MOUNT_TYPE_DISK,
  62. Disk: &apis.ContainerVolumeMountDisk{
  63. SubDirectory: subDir,
  64. Index: &diskIndex,
  65. },
  66. MountPath: mountPath,
  67. ReadOnly: false,
  68. Propagation: apis.MOUNTPROPAGATION_PROPAGATION_PRIVATE,
  69. }
  70. return pvc
  71. }
  72. func _getRegistryImage(imageId string) string {
  73. image, err := GetLLMImageManager().FetchById(imageId)
  74. if err != nil {
  75. return ""
  76. }
  77. return image.(*SLLMImage).ToContainerImage()
  78. }
  79. // getDifySpecFromSku returns the Dify spec from the SKU via the container driver, or nil.
  80. func getDifySpecFromSku(sku *SLLMSku) *api.LLMSpecDify {
  81. s := sku.GetLLMContainerDriver().GetSpec(sku)
  82. if s == nil {
  83. return nil
  84. }
  85. d, _ := s.(*api.LLMSpecDify)
  86. return d
  87. }
  88. func getDifyContainerByNameKeyAndSku(name, key string, difySpec *api.LLMSpecDify, customEnvs *DifyContainerEnv) (*computeapi.PodContainerCreateInput, error) {
  89. if difySpec == nil {
  90. return nil, errors.New("dify spec is nil")
  91. }
  92. switch key {
  93. case api.DIFY_REDIS_KEY:
  94. return getRedisContainer(name, key, _getRegistryImage(difySpec.RedisImageId), customEnvs), nil
  95. case api.DIFY_POSTGRES_KEY:
  96. return getPostgresContainer(name, key, _getRegistryImage(difySpec.PostgresImageId), customEnvs), nil
  97. case api.DIFY_API_KEY:
  98. return getApiContainer(name, key, _getRegistryImage(difySpec.DifyApiImageId), customEnvs), nil
  99. case api.DIFY_WORKER_KEY:
  100. return getWorkerContainer(name, key, _getRegistryImage(difySpec.DifyApiImageId), customEnvs), nil
  101. case api.DIFY_WORKER_BEAT_KEY:
  102. return getWorkerBeatContainer(name, key, _getRegistryImage(difySpec.DifyApiImageId), customEnvs), nil
  103. case api.DIFY_PLUGIN_KEY:
  104. return getPluginContainer(name, key, _getRegistryImage(difySpec.DifyPluginImageId), customEnvs), nil
  105. case api.DIFY_WEB_KEY:
  106. return getWebContainer(name, key, _getRegistryImage(difySpec.DifyWebImageId), customEnvs), nil
  107. case api.DIFY_SSRF_KEY:
  108. return getSsrfContainer(name, key, _getRegistryImage(difySpec.DifySSRFImageId), customEnvs), nil
  109. case api.DIFY_NGINX_KEY:
  110. return getNginxContainer(name, key, _getRegistryImage(difySpec.NginxImageId), customEnvs), nil
  111. case api.DIFY_WEAVIATE_KEY:
  112. return getWeaviateContainer(name, key, _getRegistryImage(difySpec.DifyWeaviateImageId), customEnvs), nil
  113. case api.DIFY_SANDBOX_KEY:
  114. return getSandboxContainer(name, key, _getRegistryImage(difySpec.DifySandboxImageId), customEnvs), nil
  115. default:
  116. return nil, errors.New("unsupported container key")
  117. }
  118. }
  119. // DifyContainerKeys is the ordered list of container keys for a Dify pod (used by driver and SDify).
  120. var DifyContainerKeys = []string{
  121. api.DIFY_POSTGRES_KEY,
  122. api.DIFY_REDIS_KEY,
  123. api.DIFY_API_KEY,
  124. api.DIFY_WORKER_KEY,
  125. api.DIFY_WORKER_BEAT_KEY,
  126. api.DIFY_PLUGIN_KEY,
  127. api.DIFY_SANDBOX_KEY,
  128. api.DIFY_SSRF_KEY,
  129. api.DIFY_WEB_KEY,
  130. api.DIFY_NGINX_KEY,
  131. api.DIFY_WEAVIATE_KEY,
  132. }
  133. // mergeDifyContainerEnvs merges base and overrides; overrides take precedence. Returns nil if both are nil/empty.
  134. func mergeDifyContainerEnvs(base, overrides *DifyContainerEnv) *DifyContainerEnv {
  135. if base == nil && overrides == nil {
  136. return nil
  137. }
  138. out := make(DifyContainerEnv)
  139. if base != nil {
  140. for k, v := range *base {
  141. out[k] = v
  142. }
  143. }
  144. if overrides != nil {
  145. for k, v := range *overrides {
  146. out[k] = v
  147. }
  148. }
  149. if len(out) == 0 {
  150. return nil
  151. }
  152. return &out
  153. }
  154. func GetDifyContainersByNameAndSku(name string, sku *SLLMSku, customEnvs *DifyContainerEnv, difySpec *api.LLMSpecDify) []*computeapi.PodContainerCreateInput {
  155. if difySpec == nil {
  156. difySpec = getDifySpecFromSku(sku)
  157. }
  158. var skuEnvs *DifyContainerEnv
  159. if difySpec != nil && len(difySpec.CustomizedEnvs) > 0 {
  160. m := DifyCustomizedEnvsToMap(difySpec.CustomizedEnvs)
  161. if m != nil {
  162. skuEnvs = &m
  163. }
  164. }
  165. mergedEnvs := mergeDifyContainerEnvs(skuEnvs, customEnvs)
  166. var out []*computeapi.PodContainerCreateInput
  167. for _, key := range DifyContainerKeys {
  168. c, err := getDifyContainerByNameKeyAndSku(name, key, difySpec, mergedEnvs)
  169. if err != nil {
  170. continue
  171. }
  172. c.AlwaysRestart = true
  173. out = append(out, c)
  174. }
  175. return out
  176. }
  177. func getRedisContainer(name, key, image string, customEnvs *DifyContainerEnv) *computeapi.PodContainerCreateInput {
  178. // set name and image
  179. ctr := &computeapi.PodContainerCreateInput{
  180. Name: name + "-" + key,
  181. }
  182. ctr.Image = image
  183. // set container environments
  184. envs := &DifyContainerEnv{
  185. "REDISCLI_AUTH": api.DIFY_REDISCLI_AUTH,
  186. }
  187. ctr.Envs = envs.GetContainerEnvs(customEnvs)
  188. // set PVC to store data
  189. ctr.VolumeMounts = []*apis.ContainerVolumeMount{
  190. getPVCMount(key, key, api.DIFY_REDIS_PVC_MOUNT_PATH),
  191. }
  192. // set command
  193. ctr.Args = []string{
  194. "redis-server", "--requirepass", api.DIFY_REDISCLI_AUTH,
  195. }
  196. return ctr
  197. }
  198. func getPostgresContainer(name, key, image string, customEnvs *DifyContainerEnv) *computeapi.PodContainerCreateInput {
  199. // set name and image
  200. ctr := &computeapi.PodContainerCreateInput{
  201. Name: name + "-" + key,
  202. }
  203. ctr.Image = image
  204. // set container environments
  205. envs := &DifyContainerEnv{
  206. "POSTGRES_USER": api.DIFY_POSTGRES_USER,
  207. "POSTGRES_PASSWORD": api.DIFY_POSTGRES_PASSWORD,
  208. "POSTGRES_DB": api.DIFY_POSTGRES_DB,
  209. "PGDATA": path.Join(api.DIFY_POSTGRES_PVC_MOUNT_PATH, api.DIFY_POSTGRES_PGDATA),
  210. }
  211. ctr.Envs = envs.GetContainerEnvs(customEnvs)
  212. // set PVC to store data
  213. ctr.VolumeMounts = []*apis.ContainerVolumeMount{
  214. getPVCMount(key, key, api.DIFY_POSTGRES_PVC_MOUNT_PATH),
  215. }
  216. // set command for ctr
  217. ctr.Args = []string{
  218. "postgres",
  219. "-c", "max_connections=" + api.DIFY_POSTGRES_MAX_CONNECTIONS,
  220. "-c", "shared_buffers=" + api.DIFY_POSTGRES_SHARED_BUFFERS,
  221. "-c", "work_mem=" + api.DIFY_POSTGRES_WORK_MEM,
  222. "-c", "maintenance_work_mem=" + api.DIFY_POSTGRES_MAINTENANCE_WORK_MEM,
  223. "-c", "effective_cache_size=" + api.DIFY_POSTGRES_EFFECTIVE_CACHE_SIZE,
  224. }
  225. return ctr
  226. }
  227. func getApiContainer(name, key, image string, customEnvs *DifyContainerEnv) *computeapi.PodContainerCreateInput {
  228. // set name and image
  229. ctr := &computeapi.PodContainerCreateInput{
  230. Name: name + "-" + key,
  231. }
  232. ctr.Image = image
  233. // set depends on
  234. ctr.DependsOn = []string{
  235. name + "-" + api.DIFY_REDIS_KEY,
  236. name + "-" + api.DIFY_POSTGRES_KEY,
  237. }
  238. // set container environments
  239. envs := &DifyContainerEnv{
  240. "MODE": api.DIFY_API_MODE,
  241. "SENTRY_DSN": api.DIFY_API_SENTRY_DSN,
  242. "SENTRY_TRACES_SAMPLE_RATE": api.DIFY_API_SENTRY_TRACES_SAMPLE_RATE,
  243. "SENTRY_PROFILES_SAMPLE_RATE": api.DIFY_API_SENTRY_PROFILES_SAMPLE_RATE,
  244. "PLUGIN_REMOTE_INSTALL_HOST": api.DIFY_LOCALHOST,
  245. "PLUGIN_REMOTE_INSTALL_PORT": api.DIFY_PLUGIN_REMOTE_INSTALLING_PORT,
  246. "PLUGIN_MAX_PACKAGE_SIZE": api.DIFY_PLUGIN_MAX_PACKAGE_SIZE,
  247. "INNER_API_KEY_FOR_PLUGIN": api.DIFY_API_INNER_KEY,
  248. }
  249. ctr.Envs = append(getSharedApiWorkerEnv(customEnvs), envs.GetContainerEnvs(customEnvs)...)
  250. // set PVC to store data
  251. ctr.VolumeMounts = []*apis.ContainerVolumeMount{
  252. getPVCMount(key, "api", api.DIFY_API_PVC_MOUNT_PATH),
  253. }
  254. return ctr
  255. }
  256. func getWorkerContainer(name, key, image string, customEnvs *DifyContainerEnv) *computeapi.PodContainerCreateInput {
  257. // set name and image
  258. ctr := &computeapi.PodContainerCreateInput{
  259. Name: name + "-" + key,
  260. }
  261. ctr.Image = image
  262. // set depends on
  263. ctr.DependsOn = []string{
  264. name + "-" + api.DIFY_REDIS_KEY,
  265. name + "-" + api.DIFY_POSTGRES_KEY,
  266. }
  267. // set container environments
  268. envs := &DifyContainerEnv{
  269. "MODE": api.DIFY_WORKER_MODE,
  270. "SENTRY_DSN": api.DIFY_API_SENTRY_DSN,
  271. "SENTRY_TRACES_SAMPLE_RATE": api.DIFY_API_SENTRY_TRACES_SAMPLE_RATE,
  272. "SENTRY_PROFILES_SAMPLE_RATE": api.DIFY_API_SENTRY_PROFILES_SAMPLE_RATE,
  273. "PLUGIN_MAX_PACKAGE_SIZE": api.DIFY_PLUGIN_MAX_PACKAGE_SIZE,
  274. "INNER_API_KEY_FOR_PLUGIN": api.DIFY_API_INNER_KEY,
  275. }
  276. ctr.Envs = append(getSharedApiWorkerEnv(customEnvs), envs.GetContainerEnvs(customEnvs)...)
  277. // set PVC to store data
  278. ctr.VolumeMounts = []*apis.ContainerVolumeMount{
  279. getPVCMount(key, "api", api.DIFY_API_PVC_MOUNT_PATH),
  280. }
  281. return ctr
  282. }
  283. func getWorkerBeatContainer(name, key, image string, customEnvs *DifyContainerEnv) *computeapi.PodContainerCreateInput {
  284. // set name and image
  285. ctr := &computeapi.PodContainerCreateInput{
  286. Name: name + "-" + key,
  287. }
  288. ctr.Image = image
  289. // set depends on
  290. ctr.DependsOn = []string{
  291. name + "-" + api.DIFY_REDIS_KEY,
  292. name + "-" + api.DIFY_POSTGRES_KEY,
  293. }
  294. // set container environments
  295. envs := &DifyContainerEnv{
  296. "MODE": api.DIFY_WORKER_BEAT_MODE,
  297. }
  298. ctr.Envs = append(getSharedApiWorkerEnv(customEnvs), envs.GetContainerEnvs(customEnvs)...)
  299. return ctr
  300. }
  301. func getPluginContainer(name, key, image string, customEnvs *DifyContainerEnv) *computeapi.PodContainerCreateInput {
  302. // set name and image
  303. ctr := &computeapi.PodContainerCreateInput{
  304. Name: name + "-" + key,
  305. }
  306. ctr.Image = image
  307. // set depends on
  308. ctr.DependsOn = []string{
  309. name + "-" + api.DIFY_POSTGRES_KEY,
  310. }
  311. // set container environments
  312. envs := &DifyContainerEnv{
  313. "DB_DATABASE": api.DIFY_PLUGIN_DB_DATABASE,
  314. "SERVER_PORT": api.DIFY_PLUGIN_SERVER_PORT,
  315. "SERVER_KEY": api.DIFY_PLUGIN_SERVER_KEY,
  316. "MAX_PACKAGE_CACHE_PATH": api.DIFY_PLUGIN_PACKAGE_CACHE_PATH,
  317. "PPROF_ENABLED": api.DIFY_PLUGIN_PPROF_ENABLED,
  318. "DIFY_INNER_API_URL": api.DIFY_PLUGIN_DIFY_INNER_API_URL,
  319. "DIFY_INNER_API_KEY": api.DIFY_API_INNER_KEY,
  320. "PLUGIN_REMOTE_INSTALLING_HOST": api.DIFY_PLUGIN_REMOTE_INSTALLING_HOST,
  321. "PLUGIN_REMOTE_INSTALLING_PORT": api.DIFY_PLUGIN_REMOTE_INSTALLING_PORT,
  322. "PLUGIN_WORKING_PATH": api.DIFY_PLUGIN_WORKING_PATH,
  323. "FORCE_VERIFYING_SIGNATURE": api.DIFY_PLUGIN_FORCE_VERIFYING_SIGNATURE,
  324. "PYTHON_ENV_INIT_TIMEOUT": api.DIFY_PLUGIN_PYTHON_ENV_INIT_TIMEOUT,
  325. "PLUGIN_MAX_EXECUTION_TIMEOUT": api.DIFY_PLUGIN_MAX_EXECUTION_TIMEOUT,
  326. "PIP_MIRROR_URL": api.PIP_MIRROR_URL,
  327. "PLUGIN_STORAGE_TYPE": api.DIFY_PLUGIN_STORAGE_TYPE,
  328. "PLUGIN_STORAGE_LOCAL_ROOT": api.DIFY_PLUGIN_STORAGE_LOCAL_ROOT,
  329. "PLUGIN_INSTALLED_PATH": api.DIFY_PLUGIN_INSTALLED_PATH,
  330. "PLUGIN_PACKAGE_CACHE_PATH": api.DIFY_PLUGIN_PACKAGE_CACHE_PATH,
  331. "PLUGIN_MEDIA_CACHE_PATH": api.DIFY_PLUGIN_MEDIA_CACHE_PATH,
  332. }
  333. ctr.Envs = append(getSharedApiWorkerEnv(customEnvs), envs.GetContainerEnvs(customEnvs)...)
  334. // set PVC to store data
  335. ctr.VolumeMounts = []*apis.ContainerVolumeMount{
  336. getPVCMount(key, key, api.DIFY_PLUGIN_STORAGE_LOCAL_ROOT),
  337. }
  338. return ctr
  339. }
  340. func getWebContainer(name, key, image string, customEnvs *DifyContainerEnv) *computeapi.PodContainerCreateInput {
  341. // set name and image
  342. ctr := &computeapi.PodContainerCreateInput{
  343. Name: name + "-" + key,
  344. }
  345. ctr.Image = image
  346. // set container environments
  347. envs := &DifyContainerEnv{
  348. "HOSTNAME": "", // set HOSTNAME to empty, to avoid Error: getaddrinfo ENOTFOUND
  349. "CONSOLE_API_URL": api.DIFY_WEB_CONSOLE_API_URL,
  350. "APP_API_URL": api.DIFY_WEB_APP_API_URL,
  351. "SENTRY_DSN": api.DIFY_WEB_SENTRY_DSN,
  352. "NEXT_TELEMETRY_DISABLED": api.DIFY_WEB_NEXT_TELEMETRY_DISABLED,
  353. "TEXT_GENERATION_TIMEOUT_MS": api.DIFY_WEB_TEXT_GENERATION_TIMEOUT_MS,
  354. "CSP_WHITELIST": api.DIFY_WEB_CSP_WHITELIST,
  355. "ALLOW_EMBED": api.DIFY_WEB_ALLOW_EMBED,
  356. "ALLOW_UNSAFE_DATA_SCHEME": api.DIFY_WEB_ALLOW_UNSAFE_DATA_SCHEME,
  357. "MARKETPLACE_API_URL": api.DIFY_WEB_MARKETPLACE_API_URL,
  358. "MARKETPLACE_URL": api.DIFY_WEB_MARKETPLACE_URL,
  359. "TOP_K_MAX_VALUE": api.DIFY_WEB_TOP_K_MAX_VALUE,
  360. "INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH": api.DIFY_WEB_INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH,
  361. "PM2_INSTANCES": api.DIFY_WEB_PM2_INSTANCES,
  362. "LOOP_NODE_MAX_COUNT": api.DIFY_WEB_LOOP_NODE_MAX_COUNT,
  363. "MAX_TOOLS_NUM": api.DIFY_WEB_MAX_TOOLS_NUM,
  364. "MAX_PARALLEL_LIMIT": api.DIFY_WEB_MAX_PARALLEL_LIMIT,
  365. "MAX_ITERATIONS_NUM": api.DIFY_WEB_MAX_ITERATIONS_NUM,
  366. "ENABLE_WEBSITE_JINAREADER": api.DIFY_WEB_ENABLE_WEBSITE_JINAREADER,
  367. "ENABLE_WEBSITE_FIRECRAWL": api.DIFY_WEB_ENABLE_WEBSITE_FIRECRAWL,
  368. "ENABLE_WEBSITE_WATERCRAWL": api.DIFY_WEB_ENABLE_WEBSITE_WATERCRAWL,
  369. }
  370. ctr.Envs = envs.GetContainerEnvs(customEnvs)
  371. return ctr
  372. }
  373. func getSsrfContainer(name, key, image string, customEnvs *DifyContainerEnv) *computeapi.PodContainerCreateInput {
  374. // set name and image
  375. ctr := &computeapi.PodContainerCreateInput{
  376. Name: name + "-" + key,
  377. }
  378. ctr.Image = image
  379. // set container environments
  380. envs := &DifyContainerEnv{
  381. // "VISIBLE_HOSTNAME": "localhost", // set VISIBLE_HOSTNAME to localhost, to avoid rDNS test failed
  382. "HTTP_PORT": api.DIFY_SSRF_HTTP_PORT,
  383. "COREDUMP_DIR": api.DIFY_SSRF_COREDUMP_DIR,
  384. "REVERSE_PROXY_PORT": api.DIFY_SANDBOX_PORT,
  385. "SANDBOX_HOST": api.DIFY_LOCALHOST,
  386. "SANDBOX_PORT": api.DIFY_SANDBOX_PORT,
  387. }
  388. ctr.Envs = envs.GetContainerEnvs(customEnvs)
  389. // set PVC to store data
  390. // ctr.VolumeMounts = []*apis.ContainerVolumeMount{
  391. // getPVCMount(key, key, api.SSRF_MOUNT_PATH),
  392. // }
  393. // generate entrypoint
  394. entrypointSH := fmt.Sprintf(api.DIFY_SSRF_ENTRYPINT_SHELL, api.DIFY_SSRF_SQUID_CONFIGURATION_FILE)
  395. ctr.Command = []string{
  396. "/bin/sh", "-c", entrypointSH,
  397. }
  398. return ctr
  399. }
  400. func getNginxContainer(name, key, image string, customEnvs *DifyContainerEnv) *computeapi.PodContainerCreateInput {
  401. // set name and image
  402. ctr := &computeapi.PodContainerCreateInput{
  403. Name: name + "-" + key,
  404. }
  405. ctr.Image = image
  406. // set depends on
  407. ctr.DependsOn = []string{
  408. name + "-" + api.DIFY_API_KEY,
  409. name + "-" + api.DIFY_WEB_KEY,
  410. }
  411. // set container environments
  412. envs := &DifyContainerEnv{
  413. "NGINX_SERVER_NAME": api.DIFY_NGINX_SERVER_NAME,
  414. "NGINX_PORT": api.DIFY_NGINX_PORT,
  415. "NGINX_WORKER_PROCESSES": api.DIFY_NGINX_WORKER_PROCESSES,
  416. "NGINX_CLIENT_MAX_BODY_SIZE": api.DIFY_NGINX_CLIENT_MAX_BODY_SIZE,
  417. "NGINX_KEEPALIVE_TIMEOUT": api.DIFY_NGINX_KEEPALIVE_TIMEOUT,
  418. "NGINX_PROXY_READ_TIMEOUT": api.DIFY_NGINX_PROXY_READ_TIMEOUT,
  419. "NGINX_PROXY_SEND_TIMEOUT": api.DIFY_NGINX_PROXY_SEND_TIMEOUT,
  420. }
  421. ctr.Envs = envs.GetContainerEnvs(customEnvs)
  422. // set PVC to store data
  423. ctr.VolumeMounts = []*apis.ContainerVolumeMount{
  424. getPVCMount(key, key, api.DIFY_NGINX_MOUNT_PATH),
  425. }
  426. // generate entrypoint
  427. entrypointSH := fmt.Sprintf(api.DIFY_NGINX_ENTRYPINT_SHELL, api.DIFY_NGINX_NGINX_CONF_FILE, api.DIFY_NGINX_PROXY_CONF_FILE, api.DIFY_NGINX_DEFAULT_CONF_FILE)
  428. ctr.Command = []string{
  429. "/bin/sh", "-c", entrypointSH,
  430. }
  431. return ctr
  432. }
  433. func getWeaviateContainer(name, key, image string, customEnvs *DifyContainerEnv) *computeapi.PodContainerCreateInput {
  434. // set name and image
  435. ctr := &computeapi.PodContainerCreateInput{
  436. Name: name + "-" + key,
  437. }
  438. ctr.Image = image
  439. // set container environments
  440. envs := &DifyContainerEnv{
  441. "PERSISTENCE_DATA_PATH": api.DIFY_WEAVIATE_PERSISTENCE_DATA_PATH,
  442. "QUERY_DEFAULTS_LIMIT": api.DIFY_WEAVIATE_QUERY_DEFAULTS_LIMIT,
  443. "AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED": api.DIFY_WEAVIATE_AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED,
  444. "DEFAULT_VECTORIZER_MODULE": api.DIFY_WEAVIATE_DEFAULT_VECTORIZER_MODULE,
  445. "CLUSTER_HOSTNAME": api.DIFY_WEAVIATE_CLUSTER_HOSTNAME,
  446. "AUTHENTICATION_APIKEY_ENABLED": api.DIFY_WEAVIATE_AUTHENTICATION_APIKEY_ENABLED,
  447. "AUTHENTICATION_APIKEY_ALLOWED_KEYS": api.DIFY_WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS,
  448. "AUTHENTICATION_APIKEY_USERS": api.DIFY_WEAVIATE_AUTHENTICATION_APIKEY_USERS,
  449. "AUTHORIZATION_ADMINLIST_ENABLED": api.DIFY_WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED,
  450. "AUTHORIZATION_ADMINLIST_USERS": api.DIFY_WEAVIATE_AUTHORIZATION_ADMINLIST_USERS,
  451. }
  452. ctr.Envs = envs.GetContainerEnvs(customEnvs)
  453. // set PVC to store data
  454. ctr.VolumeMounts = []*apis.ContainerVolumeMount{
  455. getPVCMount(key, key, api.DIFY_WEAVIATE_PERSISTENCE_DATA_PATH),
  456. }
  457. return ctr
  458. }
  459. func getSandboxContainer(name, key, image string, customEnvs *DifyContainerEnv) *computeapi.PodContainerCreateInput {
  460. // set name and image
  461. ctr := &computeapi.PodContainerCreateInput{
  462. Name: name + "-" + key,
  463. }
  464. ctr.Image = image
  465. // set container environments
  466. envs := &DifyContainerEnv{
  467. "API_KEY": api.DIFY_SANDBOX_API_KEY,
  468. "GIN_MODE": api.DIFY_SANDBOX_GIN_MODE,
  469. "WORKER_TIMEOUT": api.DIFY_SANDBOX_WORKER_TIMEOUT,
  470. "ENABLE_NETWORK": api.DIFY_SANDBOX_ENABLE_NETWORK,
  471. "HTTP_PROXY": api.DIFY_SANDBOX_HTTP_PROXY,
  472. "HTTPS_PROXY": api.DIFY_SANDBOX_HTTPS_PROXY,
  473. "SANDBOX_PORT": api.DIFY_SANDBOX_PORT,
  474. "PIP_MIRROR_URL": api.PIP_MIRROR_URL,
  475. }
  476. ctr.Envs = envs.GetContainerEnvs(customEnvs)
  477. // set PVC to store data
  478. ctr.VolumeMounts = []*apis.ContainerVolumeMount{
  479. getPVCMount(key+"conf", key+"conf", api.DIFY_SANDBOX_CONF_MOUNT_PATH),
  480. getPVCMount(key+"dep", key+"dep", api.DIFY_SANDBOX_DEP_MOUNT_PATH),
  481. }
  482. // set command
  483. writeConfigCommand := fmt.Sprintf(api.DIFY_SANDBOX_WRITE_CONF_SHELL, api.DIFY_SANDBOX_CONF_FILE, api.DIFY_SANDBOX_CONF_TEMP_FILE)
  484. ctr.Command = []string{
  485. "/bin/sh", "-c", writeConfigCommand,
  486. }
  487. return ctr
  488. }