Requirements
If you can scale resources as needed, or refer to our Performance Tuning documentation.
- Kubernetes Cluster
- 6 Worker Nodes: 8 CPU, 32 GB RAM each
- Container Registry (Plugins)
- AWS ECR (with AK/SK or IRSA) / Azure ACR / Aliyun ACR (with AK/SK) / Tencent TCR (with AK/SK) / Dockerhub / Google Artifact Registry
- Persistent Storage
- S3 / AWS S3 (with AK/SK or IRSA) / Azure Blob / Aliyun OSS (with AK/SK) / Tencent COS (with AK/SK) / Google GCS
- 512 GB Storage
- Postgres Database
- Version 14+
- 8 CPU, 16 GB RAM
- At least 512G SSD
- Redis Database
- Vector Database VM - Qdrant Cluster
- 3 VMs
- 8 CPU, 64 GB RAM
- 100 GB Storage
Dify Service Resource limits
workerBeat should always run as a single replica.
| Services | Replicas | CPU | RAM - GB | Total CPU | Total RAM - GB |
|---|
| api | 6 | 1 | 2 | 9 | 12 |
| worker | 9 | 1 | 2 | 6 | 18 |
| workerBeat | 1 | 1 | 1 | 1 | 1 |
| web | 3 | 1 | 1 | 3 | 3 |
| sandbox | 3 | 1 | 2 | 3 | 6 |
| enterprise | 3 | 1 | 2 | 3 | 6 |
| enterpriseAudit | 3 | 1 | 2 | 3 | 6 |
| enterpriseFrontend | 3 | 1 | 1 | 3 | 3 |
| enterpriseCollector | 1 | 1 | 1 | 1 | 1 |
| ssrfProxy | 3 | 1 | 1 | 3 | 3 |
| unstructured | 3 | 1 | 2 | 3 | 6 |
| plugin_daemon | 3 | 1 | 3 | 3 | 9 |
| plugin_controller | 3 | 1 | 2 | 3 | 6 |
| plugin_connector | 3 | 1 | 2 | 3 | 6 |
| plugin_manager | 3 | 1 | 2 | 3 | 6 |
| gateway | 3 | 1 | 2 | 3 | 6 |
| | | Total | 52 | 98 |
Deployment
1. Get Helm Repository Info
helm repo add dify https://langgenius.github.io/dify-helm
helm repo update
For more information, please refer to Dify Helm Chart.
2. Save Helm Chart Values
- Save Helm chart values to a file named
values.yaml.
- Update the
values.yaml file with your configuration.
- Please replace the
#REPLACE_ME# placeholder with your actual values.
- Please replace “dify123456” with your own value.
global.appSecretKey and enterprise.appSecretKey must be different.
###################################
# Please replace "dify123456" with your own value
###################################
global:
appSecretKey: 'dify123456'
innerApiKey: 'dify123456'
consoleApiDomain: "console.dify.local"
consoleWebDomain: "console.dify.local"
serviceApiDomain: "api.dify.local"
appApiDomain: "app.dify.local"
appWebDomain: "app.dify.local"
filesDomain: "upload.dify.local"
enterpriseDomain: "enterprise.dify.local"
ingress:
enabled: true
className: "nginx"
annotations: {
# set file upload size limit
nginx.ingress.kubernetes.io/proxy-body-size: "15m"
}
api:
replicas: 6
serverWorkerAmount: 1
resources:
limits:
cpu: 1000m
memory: 2048Mi
requests:
cpu: 500m
memory: 1024Mi
worker:
replicas: 9
celeryWorkerAmount: 1
resources:
limits:
cpu: 1000m
memory: 2048Mi
requests:
cpu: 500m
memory: 1024Mi
workerBeat:
resources:
limits:
cpu: 1000m
memory: 1024Mi
requests:
cpu: 500m
memory: 512Mi
web:
replicas: 3
resources:
limits:
cpu: 1000m
memory: 1024Mi
requests:
cpu: 500m
memory: 512Mi
sandbox:
replicas: 3
resources:
limits:
cpu: 1000m
memory: 2048Mi
requests:
cpu: 500m
memory: 1024Mi
enterprise:
replicas: 3
appSecretKey: "dify123456"
adminAPIsSecretKeySalt: "dify123456"
passwordEncryptionKey: "dify123456"
resources:
limits:
cpu: 1000m
memory: 2048Mi
requests:
cpu: 500m
memory: 1024Mi
enterpriseAudit:
replicas: 3
resources:
limits:
cpu: 1000m
memory: 2048Mi
requests:
cpu: 500m
memory: 1024Mi
enterpriseFrontend:
replicas: 3
resources:
limits:
cpu: 1000m
memory: 1024Mi
requests:
cpu: 500m
memory: 512Mi
ssrfProxy:
replicas: 3
resources:
limits:
cpu: 1000m
memory: 1024Mi
requests:
cpu: 500m
memory: 512Mi
unstructured:
replicas: 3
resources:
limits:
cpu: 1000m
memory: 2048Mi
requests:
cpu: 500m
memory: 1024Mi
plugin_daemon:
replicas: 3
resources:
limits:
cpu: 1000m
memory: 3072Mi
requests:
cpu: 500m
memory: 1536Mi
plugin_controller:
replicas: 3
resources:
limits:
cpu: 1000m
memory: 2048Mi
requests:
cpu: 500m
memory: 1024Mi
plugin_connector:
replicas: 3
resources:
limits:
cpu: 1000m
memory: 2048Mi
requests:
cpu: 500m
memory: 1024Mi
plugin_manager:
replicas: 3
resources:
limits:
cpu: 1000m
memory: 2048Mi
requests:
cpu: 500m
memory: 1024Mi
gateway:
replicas: 3
resources:
limits:
cpu: 1000m
memory: 2048Mi
requests:
cpu: 500m
memory: 1024Mi
###################################
# Persistence Configration
###################################
persistence:
type: "s3"
s3:
endpoint: "https://xxx.r2.cloudflarestorage.com"
accessKey: "#REPLACE_ME#"
secretKey: "#REPLACE_ME#"
region: "us-east-1"
bucketName: "your-bucket-name"
addressType: ""
useAwsManagedIam: false
useAwsS3: true
###################################
# External database (Postgres/MySQL/TiDB) v3.9.0 configuration
###################################
externalDatabase:
enabled: false
# postgres | mysql | tidb
engine: "postgres"
host: "localhost"
# Default ports: postgres=5432, mysql=3306, tidb=4000
# Note: when switching engine, remember to update port accordingly
port: 5432
user: "postgres"
password: "#REPLACE_ME#"
timezone: "UTC"
databases:
dify: "dify"
plugin_daemon: "dify_plugin_daemon"
enterprise: "enterprise"
audit: "audit"
dialectOptions:
postgres:
sslMode: "require"
uriScheme: "postgresql"
# extras: "options=-c search_path=your-schema -c your-other-option=xxx"
extras: ""
mysql:
# MySQL/TiDB params, e.g. charset=utf8mb4&parseTime=true&loc=UTC
params: "charset=utf8mb4&parseTime=true&loc=UTC"
tls: false
###################################
# External database (Postgres/MySQL/TiDB) v3.9.1 configuration
###################################
externalDatabase:
enabled: false
# postgres | mysql | tidb
engine: "postgres"
host: "localhost"
# Default ports: postgres=5432, mysql=3306, tidb=4000
# Note: when switching engine, remember to update port accordingly
port: 5432
# Global database credentials (used by default)
user: "postgres"
password: "#REPLACE_ME#"
timezone: "UTC"
databases:
dify: "dify"
plugin_daemon: "dify_plugin_daemon"
enterprise: "enterprise"
audit: "audit"
###################################
# Per-database credentials (optional)
###################################
# Configure username and password independently for each database
# These take precedence over the global user/password
# If empty, fallback to the global credentials
databaseCredentials:
dify:
user: ""
password: ""
enterprise:
user: ""
password: ""
audit:
user: ""
password: ""
plugin_daemon:
user: ""
password: ""
dialectOptions:
postgres:
sslMode: "require"
uriScheme: "postgresql"
# extras: "options=-c search_path=your-schema -c your-other-option=xxx"
extras: ""
mysql:
# MySQL/TiDB params, e.g. charset=utf8mb4&parseTime=true&loc=UTC
params: "charset=utf8mb4&parseTime=true&loc=UTC"
tls: false
###################################
# External Redis
###################################
externalRedis:
enabled: true
host: "#REPLACE_ME#"
port: 6379
username: ""
password: "#REPLACE_ME#"
useSSL: false
###################################
# External Qdrant
###################################
vectorDB:
useExternal: true
externalType: "qdrant"
externalQdrant:
endpoint: "http://your-qdrant-cluster-url.qdrant.tech/"
apiKey: "#REPLACE_ME#"
imagePullSecrets: []
- 3.1 Configure
Plugin Container Registry
- 3.2 Configure
Service Container Registry
9. Install Dify Helm Chart
helm upgrade -i dify -f values.yaml dify/dify
10. Verify Installation Results
Advanced Configuration
1. Domain and SSL Certificate
2. Email Service Provider