From 505c2a239dd99db398cc6f51a591e0b3e6bc3151 Mon Sep 17 00:00:00 2001 From: Meng Sen Date: Mon, 17 Feb 2025 14:00:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=20Dify?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Meng Sen --- .github/README.md | 1 + README.md | 1 + apps/dify/0.15.3/data.yml | 65 ++ apps/dify/0.15.3/docker-compose.yml | 1025 +++++++++++++++++++++++++ apps/dify/0.15.3/envs/default.env | 2 + apps/dify/0.15.3/envs/dify.env | 938 ++++++++++++++++++++++ apps/dify/0.15.3/envs/global.env | 2 + apps/dify/0.15.3/scripts/init.sh | 23 + apps/dify/0.15.3/scripts/uninstall.sh | 10 + apps/dify/0.15.3/scripts/upgrade.sh | 34 + apps/dify/README.md | 121 +++ apps/dify/data.yml | 14 + apps/dify/logo.png | Bin 0 -> 42235 bytes envs/dify/dify.env | 938 ++++++++++++++++++++++ 14 files changed, 3174 insertions(+) create mode 100644 apps/dify/0.15.3/data.yml create mode 100644 apps/dify/0.15.3/docker-compose.yml create mode 100644 apps/dify/0.15.3/envs/default.env create mode 100644 apps/dify/0.15.3/envs/dify.env create mode 100644 apps/dify/0.15.3/envs/global.env create mode 100644 apps/dify/0.15.3/scripts/init.sh create mode 100644 apps/dify/0.15.3/scripts/uninstall.sh create mode 100644 apps/dify/0.15.3/scripts/upgrade.sh create mode 100644 apps/dify/README.md create mode 100644 apps/dify/data.yml create mode 100644 apps/dify/logo.png create mode 100644 envs/dify/dify.env diff --git a/.github/README.md b/.github/README.md index ff6aa5465..94aa329fa 100644 --- a/.github/README.md +++ b/.github/README.md @@ -60,6 +60,7 @@ | 🟢 | | Dash. | https://getdashdot.com/ | 现代服务器仪表板 | | | 🟢 | | Dash.(GPU) | https://getdashdot.com/ | 【GPU支持】现代服务器仪表板 | | | 🟢 | | DeepLX | https://deeplx.owo.network/ | DeepL免费API(无需TOKEN) | | +| 🟢 | | Dify | https://dify.ai/ | Dify 是一个开源的 LLM 应用开发平台 | | | 🟢 | | Dockge | https://dockge.kuma.pet/ | 面向堆栈的管理器 | | | 🟢 | | Dozzle | https://dozzle.dev/ | 一个轻量级的小应用程序,有一个基于web的界面来监控Docker日志 | | | 🟢 | | DPanel | https://dpanel.cc/ | Docker可视化管理面板 | | diff --git a/README.md b/README.md index 898bbb328..7c5703abb 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ | 🟢 | | Dash. | https://getdashdot.com/ | 现代服务器仪表板 | | | 🟢 | | Dash.(GPU) | https://getdashdot.com/ | 【GPU支持】现代服务器仪表板 | | | 🟢 | | DeepLX | https://deeplx.owo.network/ | DeepL免费API(无需TOKEN) | | +| 🟢 | | Dify | https://dify.ai/ | Dify 是一个开源的 LLM 应用开发平台 | | | 🟢 | | Dockge | https://dockge.kuma.pet/ | 面向堆栈的管理器 | | | 🟢 | | Dozzle | https://dozzle.dev/ | 一个轻量级的小应用程序,有一个基于web的界面来监控Docker日志 | | | 🟢 | | DPanel | https://dpanel.cc/ | Docker可视化管理面板 | | diff --git a/apps/dify/0.15.3/data.yml b/apps/dify/0.15.3/data.yml new file mode 100644 index 000000000..5064d8b3b --- /dev/null +++ b/apps/dify/0.15.3/data.yml @@ -0,0 +1,65 @@ +additionalProperties: + formFields: + - default: "/home/dify" + edit: true + envKey: DIFY_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 8080 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: 8443 + edit: true + envKey: PANEL_APP_PORT_HTTPS + labelZh: WebUI SSL 端口 + labelEn: WebUI SSL port + required: true + rule: paramPort + type: number + - default: 19530 + disabled: true + envKey: MILVUS_STANDALONE_PORT1 + labelZh: Milvus 端口 + labelEn: Milvus port + required: true + rule: paramPort + type: number + - default: 9091 + disabled: true + envKey: MILVUS_STANDALONE_PORT2 + labelZh: Milvus 端口 + labelEn: Milvus port + required: true + rule: paramPort + type: number + - default: 8123 + edit: true + envKey: MYSCALE_PORT + labelZh: MyScale 端口 + labelEn: MyScale port + required: true + rule: paramPort + type: number + - default: 9200 + edit: true + envKey: ELASTICSEARCH_PORT + labelZh: Elasticsearch 端口 + labelEn: Elasticsearch port + required: true + rule: paramPort + type: number + - default: 5601 + edit: true + envKey: KIBANA_PORT + labelZh: Kibana 端口 + labelEn: Kibana port + required: true + rule: paramPort + type: number diff --git a/apps/dify/0.15.3/docker-compose.yml b/apps/dify/0.15.3/docker-compose.yml new file mode 100644 index 000000000..d4573f9fb --- /dev/null +++ b/apps/dify/0.15.3/docker-compose.yml @@ -0,0 +1,1025 @@ +# ================================================================== +# WARNING: This file is auto-generated by generate_docker_compose +# Do not modify this file directly. Instead, update the .env.example +# or docker-compose-template.yaml and regenerate this file. +# ================================================================== + +x-shared-env: &shared-api-worker-env + CONSOLE_API_URL: ${CONSOLE_API_URL:-} + CONSOLE_WEB_URL: ${CONSOLE_WEB_URL:-} + SERVICE_API_URL: ${SERVICE_API_URL:-} + APP_API_URL: ${APP_API_URL:-} + APP_WEB_URL: ${APP_WEB_URL:-} + FILES_URL: ${FILES_URL:-} + LOG_LEVEL: ${LOG_LEVEL:-INFO} + LOG_FILE: ${LOG_FILE:-/app/logs/server.log} + LOG_FILE_MAX_SIZE: ${LOG_FILE_MAX_SIZE:-20} + LOG_FILE_BACKUP_COUNT: ${LOG_FILE_BACKUP_COUNT:-5} + LOG_DATEFORMAT: ${LOG_DATEFORMAT:-%Y-%m-%d %H:%M:%S} + LOG_TZ: ${LOG_TZ:-UTC} + DEBUG: ${DEBUG:-false} + FLASK_DEBUG: ${FLASK_DEBUG:-false} + SECRET_KEY: ${SECRET_KEY:-sk-9f73s3ljTXVcMT3Blb3ljTqtsKiGHXVcMT3BlbkFJLK7U} + INIT_PASSWORD: ${INIT_PASSWORD:-} + DEPLOY_ENV: ${DEPLOY_ENV:-PRODUCTION} + CHECK_UPDATE_URL: ${CHECK_UPDATE_URL:-https://updates.dify.ai} + OPENAI_API_BASE: ${OPENAI_API_BASE:-https://api.openai.com/v1} + MIGRATION_ENABLED: ${MIGRATION_ENABLED:-true} + FILES_ACCESS_TIMEOUT: ${FILES_ACCESS_TIMEOUT:-300} + ACCESS_TOKEN_EXPIRE_MINUTES: ${ACCESS_TOKEN_EXPIRE_MINUTES:-60} + REFRESH_TOKEN_EXPIRE_DAYS: ${REFRESH_TOKEN_EXPIRE_DAYS:-30} + APP_MAX_ACTIVE_REQUESTS: ${APP_MAX_ACTIVE_REQUESTS:-0} + APP_MAX_EXECUTION_TIME: ${APP_MAX_EXECUTION_TIME:-1200} + DIFY_BIND_ADDRESS: ${DIFY_BIND_ADDRESS:-0.0.0.0} + DIFY_PORT: ${DIFY_PORT:-5001} + SERVER_WORKER_AMOUNT: ${SERVER_WORKER_AMOUNT:-1} + SERVER_WORKER_CLASS: ${SERVER_WORKER_CLASS:-gevent} + SERVER_WORKER_CONNECTIONS: ${SERVER_WORKER_CONNECTIONS:-10} + CELERY_WORKER_CLASS: ${CELERY_WORKER_CLASS:-} + GUNICORN_TIMEOUT: ${GUNICORN_TIMEOUT:-360} + CELERY_WORKER_AMOUNT: ${CELERY_WORKER_AMOUNT:-} + CELERY_AUTO_SCALE: ${CELERY_AUTO_SCALE:-false} + CELERY_MAX_WORKERS: ${CELERY_MAX_WORKERS:-} + CELERY_MIN_WORKERS: ${CELERY_MIN_WORKERS:-} + API_TOOL_DEFAULT_CONNECT_TIMEOUT: ${API_TOOL_DEFAULT_CONNECT_TIMEOUT:-10} + API_TOOL_DEFAULT_READ_TIMEOUT: ${API_TOOL_DEFAULT_READ_TIMEOUT:-60} + DB_USERNAME: ${DB_USERNAME:-postgres} + DB_PASSWORD: ${DB_PASSWORD:-difyai123456} + DB_HOST: ${DB_HOST:-db} + DB_PORT: ${DB_PORT:-5432} + DB_DATABASE: ${DB_DATABASE:-dify} + SQLALCHEMY_POOL_SIZE: ${SQLALCHEMY_POOL_SIZE:-30} + SQLALCHEMY_POOL_RECYCLE: ${SQLALCHEMY_POOL_RECYCLE:-3600} + SQLALCHEMY_ECHO: ${SQLALCHEMY_ECHO:-false} + POSTGRES_MAX_CONNECTIONS: ${POSTGRES_MAX_CONNECTIONS:-100} + POSTGRES_SHARED_BUFFERS: ${POSTGRES_SHARED_BUFFERS:-128MB} + POSTGRES_WORK_MEM: ${POSTGRES_WORK_MEM:-4MB} + POSTGRES_MAINTENANCE_WORK_MEM: ${POSTGRES_MAINTENANCE_WORK_MEM:-64MB} + POSTGRES_EFFECTIVE_CACHE_SIZE: ${POSTGRES_EFFECTIVE_CACHE_SIZE:-4096MB} + REDIS_HOST: ${REDIS_HOST:-redis} + REDIS_PORT: ${REDIS_PORT:-6379} + REDIS_USERNAME: ${REDIS_USERNAME:-} + REDIS_PASSWORD: ${REDIS_PASSWORD:-difyai123456} + REDIS_USE_SSL: ${REDIS_USE_SSL:-false} + REDIS_DB: ${REDIS_DB:-0} + REDIS_USE_SENTINEL: ${REDIS_USE_SENTINEL:-false} + REDIS_SENTINELS: ${REDIS_SENTINELS:-} + REDIS_SENTINEL_SERVICE_NAME: ${REDIS_SENTINEL_SERVICE_NAME:-} + REDIS_SENTINEL_USERNAME: ${REDIS_SENTINEL_USERNAME:-} + REDIS_SENTINEL_PASSWORD: ${REDIS_SENTINEL_PASSWORD:-} + REDIS_SENTINEL_SOCKET_TIMEOUT: ${REDIS_SENTINEL_SOCKET_TIMEOUT:-0.1} + REDIS_USE_CLUSTERS: ${REDIS_USE_CLUSTERS:-false} + REDIS_CLUSTERS: ${REDIS_CLUSTERS:-} + REDIS_CLUSTERS_PASSWORD: ${REDIS_CLUSTERS_PASSWORD:-} + CELERY_BROKER_URL: ${CELERY_BROKER_URL:-redis://:difyai123456@redis:6379/1} + BROKER_USE_SSL: ${BROKER_USE_SSL:-false} + CELERY_USE_SENTINEL: ${CELERY_USE_SENTINEL:-false} + CELERY_SENTINEL_MASTER_NAME: ${CELERY_SENTINEL_MASTER_NAME:-} + CELERY_SENTINEL_SOCKET_TIMEOUT: ${CELERY_SENTINEL_SOCKET_TIMEOUT:-0.1} + WEB_API_CORS_ALLOW_ORIGINS: ${WEB_API_CORS_ALLOW_ORIGINS:-*} + CONSOLE_CORS_ALLOW_ORIGINS: ${CONSOLE_CORS_ALLOW_ORIGINS:-*} + STORAGE_TYPE: ${STORAGE_TYPE:-opendal} + OPENDAL_SCHEME: ${OPENDAL_SCHEME:-fs} + OPENDAL_FS_ROOT: ${OPENDAL_FS_ROOT:-storage} + S3_ENDPOINT: ${S3_ENDPOINT:-} + S3_REGION: ${S3_REGION:-us-east-1} + S3_BUCKET_NAME: ${S3_BUCKET_NAME:-difyai} + S3_ACCESS_KEY: ${S3_ACCESS_KEY:-} + S3_SECRET_KEY: ${S3_SECRET_KEY:-} + S3_USE_AWS_MANAGED_IAM: ${S3_USE_AWS_MANAGED_IAM:-false} + AZURE_BLOB_ACCOUNT_NAME: ${AZURE_BLOB_ACCOUNT_NAME:-difyai} + AZURE_BLOB_ACCOUNT_KEY: ${AZURE_BLOB_ACCOUNT_KEY:-difyai} + AZURE_BLOB_CONTAINER_NAME: ${AZURE_BLOB_CONTAINER_NAME:-difyai-container} + AZURE_BLOB_ACCOUNT_URL: ${AZURE_BLOB_ACCOUNT_URL:-https://.blob.core.windows.net} + GOOGLE_STORAGE_BUCKET_NAME: ${GOOGLE_STORAGE_BUCKET_NAME:-your-bucket-name} + GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64: ${GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64:-} + ALIYUN_OSS_BUCKET_NAME: ${ALIYUN_OSS_BUCKET_NAME:-your-bucket-name} + ALIYUN_OSS_ACCESS_KEY: ${ALIYUN_OSS_ACCESS_KEY:-your-access-key} + ALIYUN_OSS_SECRET_KEY: ${ALIYUN_OSS_SECRET_KEY:-your-secret-key} + ALIYUN_OSS_ENDPOINT: ${ALIYUN_OSS_ENDPOINT:-https://oss-ap-southeast-1-internal.aliyuncs.com} + ALIYUN_OSS_REGION: ${ALIYUN_OSS_REGION:-ap-southeast-1} + ALIYUN_OSS_AUTH_VERSION: ${ALIYUN_OSS_AUTH_VERSION:-v4} + ALIYUN_OSS_PATH: ${ALIYUN_OSS_PATH:-your-path} + TENCENT_COS_BUCKET_NAME: ${TENCENT_COS_BUCKET_NAME:-your-bucket-name} + TENCENT_COS_SECRET_KEY: ${TENCENT_COS_SECRET_KEY:-your-secret-key} + TENCENT_COS_SECRET_ID: ${TENCENT_COS_SECRET_ID:-your-secret-id} + TENCENT_COS_REGION: ${TENCENT_COS_REGION:-your-region} + TENCENT_COS_SCHEME: ${TENCENT_COS_SCHEME:-your-scheme} + OCI_ENDPOINT: ${OCI_ENDPOINT:-https://objectstorage.us-ashburn-1.oraclecloud.com} + OCI_BUCKET_NAME: ${OCI_BUCKET_NAME:-your-bucket-name} + OCI_ACCESS_KEY: ${OCI_ACCESS_KEY:-your-access-key} + OCI_SECRET_KEY: ${OCI_SECRET_KEY:-your-secret-key} + OCI_REGION: ${OCI_REGION:-us-ashburn-1} + HUAWEI_OBS_BUCKET_NAME: ${HUAWEI_OBS_BUCKET_NAME:-your-bucket-name} + HUAWEI_OBS_SECRET_KEY: ${HUAWEI_OBS_SECRET_KEY:-your-secret-key} + HUAWEI_OBS_ACCESS_KEY: ${HUAWEI_OBS_ACCESS_KEY:-your-access-key} + HUAWEI_OBS_SERVER: ${HUAWEI_OBS_SERVER:-your-server-url} + VOLCENGINE_TOS_BUCKET_NAME: ${VOLCENGINE_TOS_BUCKET_NAME:-your-bucket-name} + VOLCENGINE_TOS_SECRET_KEY: ${VOLCENGINE_TOS_SECRET_KEY:-your-secret-key} + VOLCENGINE_TOS_ACCESS_KEY: ${VOLCENGINE_TOS_ACCESS_KEY:-your-access-key} + VOLCENGINE_TOS_ENDPOINT: ${VOLCENGINE_TOS_ENDPOINT:-your-server-url} + VOLCENGINE_TOS_REGION: ${VOLCENGINE_TOS_REGION:-your-region} + BAIDU_OBS_BUCKET_NAME: ${BAIDU_OBS_BUCKET_NAME:-your-bucket-name} + BAIDU_OBS_SECRET_KEY: ${BAIDU_OBS_SECRET_KEY:-your-secret-key} + BAIDU_OBS_ACCESS_KEY: ${BAIDU_OBS_ACCESS_KEY:-your-access-key} + BAIDU_OBS_ENDPOINT: ${BAIDU_OBS_ENDPOINT:-your-server-url} + SUPABASE_BUCKET_NAME: ${SUPABASE_BUCKET_NAME:-your-bucket-name} + SUPABASE_API_KEY: ${SUPABASE_API_KEY:-your-access-key} + SUPABASE_URL: ${SUPABASE_URL:-your-server-url} + VECTOR_STORE: ${VECTOR_STORE:-weaviate} + WEAVIATE_ENDPOINT: ${WEAVIATE_ENDPOINT:-http://weaviate:8080} + WEAVIATE_API_KEY: ${WEAVIATE_API_KEY:-WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih} + QDRANT_URL: ${QDRANT_URL:-http://qdrant:6333} + QDRANT_API_KEY: ${QDRANT_API_KEY:-difyai123456} + QDRANT_CLIENT_TIMEOUT: ${QDRANT_CLIENT_TIMEOUT:-20} + QDRANT_GRPC_ENABLED: ${QDRANT_GRPC_ENABLED:-false} + QDRANT_GRPC_PORT: ${QDRANT_GRPC_PORT:-6334} + MILVUS_URI: ${MILVUS_URI:-http://127.0.0.1:19530} + MILVUS_TOKEN: ${MILVUS_TOKEN:-} + MILVUS_USER: ${MILVUS_USER:-root} + MILVUS_PASSWORD: ${MILVUS_PASSWORD:-Milvus} + MILVUS_ENABLE_HYBRID_SEARCH: ${MILVUS_ENABLE_HYBRID_SEARCH:-False} + MYSCALE_HOST: ${MYSCALE_HOST:-myscale} + MYSCALE_PORT: ${MYSCALE_PORT:-8123} + MYSCALE_USER: ${MYSCALE_USER:-default} + MYSCALE_PASSWORD: ${MYSCALE_PASSWORD:-} + MYSCALE_DATABASE: ${MYSCALE_DATABASE:-dify} + MYSCALE_FTS_PARAMS: ${MYSCALE_FTS_PARAMS:-} + COUCHBASE_CONNECTION_STRING: ${COUCHBASE_CONNECTION_STRING:-couchbase://couchbase-server} + COUCHBASE_USER: ${COUCHBASE_USER:-Administrator} + COUCHBASE_PASSWORD: ${COUCHBASE_PASSWORD:-password} + COUCHBASE_BUCKET_NAME: ${COUCHBASE_BUCKET_NAME:-Embeddings} + COUCHBASE_SCOPE_NAME: ${COUCHBASE_SCOPE_NAME:-_default} + PGVECTOR_HOST: ${PGVECTOR_HOST:-pgvector} + PGVECTOR_PORT: ${PGVECTOR_PORT:-5432} + PGVECTOR_USER: ${PGVECTOR_USER:-postgres} + PGVECTOR_PASSWORD: ${PGVECTOR_PASSWORD:-difyai123456} + PGVECTOR_DATABASE: ${PGVECTOR_DATABASE:-dify} + PGVECTOR_MIN_CONNECTION: ${PGVECTOR_MIN_CONNECTION:-1} + PGVECTOR_MAX_CONNECTION: ${PGVECTOR_MAX_CONNECTION:-5} + PGVECTO_RS_HOST: ${PGVECTO_RS_HOST:-pgvecto-rs} + PGVECTO_RS_PORT: ${PGVECTO_RS_PORT:-5432} + PGVECTO_RS_USER: ${PGVECTO_RS_USER:-postgres} + PGVECTO_RS_PASSWORD: ${PGVECTO_RS_PASSWORD:-difyai123456} + PGVECTO_RS_DATABASE: ${PGVECTO_RS_DATABASE:-dify} + ANALYTICDB_KEY_ID: ${ANALYTICDB_KEY_ID:-your-ak} + ANALYTICDB_KEY_SECRET: ${ANALYTICDB_KEY_SECRET:-your-sk} + ANALYTICDB_REGION_ID: ${ANALYTICDB_REGION_ID:-cn-hangzhou} + ANALYTICDB_INSTANCE_ID: ${ANALYTICDB_INSTANCE_ID:-gp-ab123456} + ANALYTICDB_ACCOUNT: ${ANALYTICDB_ACCOUNT:-testaccount} + ANALYTICDB_PASSWORD: ${ANALYTICDB_PASSWORD:-testpassword} + ANALYTICDB_NAMESPACE: ${ANALYTICDB_NAMESPACE:-dify} + ANALYTICDB_NAMESPACE_PASSWORD: ${ANALYTICDB_NAMESPACE_PASSWORD:-difypassword} + ANALYTICDB_HOST: ${ANALYTICDB_HOST:-gp-test.aliyuncs.com} + ANALYTICDB_PORT: ${ANALYTICDB_PORT:-5432} + ANALYTICDB_MIN_CONNECTION: ${ANALYTICDB_MIN_CONNECTION:-1} + ANALYTICDB_MAX_CONNECTION: ${ANALYTICDB_MAX_CONNECTION:-5} + TIDB_VECTOR_HOST: ${TIDB_VECTOR_HOST:-tidb} + TIDB_VECTOR_PORT: ${TIDB_VECTOR_PORT:-4000} + TIDB_VECTOR_USER: ${TIDB_VECTOR_USER:-} + TIDB_VECTOR_PASSWORD: ${TIDB_VECTOR_PASSWORD:-} + TIDB_VECTOR_DATABASE: ${TIDB_VECTOR_DATABASE:-dify} + TIDB_ON_QDRANT_URL: ${TIDB_ON_QDRANT_URL:-http://127.0.0.1} + TIDB_ON_QDRANT_API_KEY: ${TIDB_ON_QDRANT_API_KEY:-dify} + TIDB_ON_QDRANT_CLIENT_TIMEOUT: ${TIDB_ON_QDRANT_CLIENT_TIMEOUT:-20} + TIDB_ON_QDRANT_GRPC_ENABLED: ${TIDB_ON_QDRANT_GRPC_ENABLED:-false} + TIDB_ON_QDRANT_GRPC_PORT: ${TIDB_ON_QDRANT_GRPC_PORT:-6334} + TIDB_PUBLIC_KEY: ${TIDB_PUBLIC_KEY:-dify} + TIDB_PRIVATE_KEY: ${TIDB_PRIVATE_KEY:-dify} + TIDB_API_URL: ${TIDB_API_URL:-http://127.0.0.1} + TIDB_IAM_API_URL: ${TIDB_IAM_API_URL:-http://127.0.0.1} + TIDB_REGION: ${TIDB_REGION:-regions/aws-us-east-1} + TIDB_PROJECT_ID: ${TIDB_PROJECT_ID:-dify} + TIDB_SPEND_LIMIT: ${TIDB_SPEND_LIMIT:-100} + CHROMA_HOST: ${CHROMA_HOST:-127.0.0.1} + CHROMA_PORT: ${CHROMA_PORT:-8000} + CHROMA_TENANT: ${CHROMA_TENANT:-default_tenant} + CHROMA_DATABASE: ${CHROMA_DATABASE:-default_database} + CHROMA_AUTH_PROVIDER: ${CHROMA_AUTH_PROVIDER:-chromadb.auth.token_authn.TokenAuthClientProvider} + CHROMA_AUTH_CREDENTIALS: ${CHROMA_AUTH_CREDENTIALS:-} + ORACLE_HOST: ${ORACLE_HOST:-oracle} + ORACLE_PORT: ${ORACLE_PORT:-1521} + ORACLE_USER: ${ORACLE_USER:-dify} + ORACLE_PASSWORD: ${ORACLE_PASSWORD:-dify} + ORACLE_DATABASE: ${ORACLE_DATABASE:-FREEPDB1} + RELYT_HOST: ${RELYT_HOST:-db} + RELYT_PORT: ${RELYT_PORT:-5432} + RELYT_USER: ${RELYT_USER:-postgres} + RELYT_PASSWORD: ${RELYT_PASSWORD:-difyai123456} + RELYT_DATABASE: ${RELYT_DATABASE:-postgres} + OPENSEARCH_HOST: ${OPENSEARCH_HOST:-opensearch} + OPENSEARCH_PORT: ${OPENSEARCH_PORT:-9200} + OPENSEARCH_USER: ${OPENSEARCH_USER:-admin} + OPENSEARCH_PASSWORD: ${OPENSEARCH_PASSWORD:-admin} + OPENSEARCH_SECURE: ${OPENSEARCH_SECURE:-true} + TENCENT_VECTOR_DB_URL: ${TENCENT_VECTOR_DB_URL:-http://127.0.0.1} + TENCENT_VECTOR_DB_API_KEY: ${TENCENT_VECTOR_DB_API_KEY:-dify} + TENCENT_VECTOR_DB_TIMEOUT: ${TENCENT_VECTOR_DB_TIMEOUT:-30} + TENCENT_VECTOR_DB_USERNAME: ${TENCENT_VECTOR_DB_USERNAME:-dify} + TENCENT_VECTOR_DB_DATABASE: ${TENCENT_VECTOR_DB_DATABASE:-dify} + TENCENT_VECTOR_DB_SHARD: ${TENCENT_VECTOR_DB_SHARD:-1} + TENCENT_VECTOR_DB_REPLICAS: ${TENCENT_VECTOR_DB_REPLICAS:-2} + ELASTICSEARCH_HOST: ${ELASTICSEARCH_HOST:-0.0.0.0} + ELASTICSEARCH_PORT: ${ELASTICSEARCH_PORT:-9200} + ELASTICSEARCH_USERNAME: ${ELASTICSEARCH_USERNAME:-elastic} + ELASTICSEARCH_PASSWORD: ${ELASTICSEARCH_PASSWORD:-elastic} + KIBANA_PORT: ${KIBANA_PORT:-5601} + BAIDU_VECTOR_DB_ENDPOINT: ${BAIDU_VECTOR_DB_ENDPOINT:-http://127.0.0.1:5287} + BAIDU_VECTOR_DB_CONNECTION_TIMEOUT_MS: ${BAIDU_VECTOR_DB_CONNECTION_TIMEOUT_MS:-30000} + BAIDU_VECTOR_DB_ACCOUNT: ${BAIDU_VECTOR_DB_ACCOUNT:-root} + BAIDU_VECTOR_DB_API_KEY: ${BAIDU_VECTOR_DB_API_KEY:-dify} + BAIDU_VECTOR_DB_DATABASE: ${BAIDU_VECTOR_DB_DATABASE:-dify} + BAIDU_VECTOR_DB_SHARD: ${BAIDU_VECTOR_DB_SHARD:-1} + BAIDU_VECTOR_DB_REPLICAS: ${BAIDU_VECTOR_DB_REPLICAS:-3} + VIKINGDB_ACCESS_KEY: ${VIKINGDB_ACCESS_KEY:-your-ak} + VIKINGDB_SECRET_KEY: ${VIKINGDB_SECRET_KEY:-your-sk} + VIKINGDB_REGION: ${VIKINGDB_REGION:-cn-shanghai} + VIKINGDB_HOST: ${VIKINGDB_HOST:-api-vikingdb.xxx.volces.com} + VIKINGDB_SCHEMA: ${VIKINGDB_SCHEMA:-http} + VIKINGDB_CONNECTION_TIMEOUT: ${VIKINGDB_CONNECTION_TIMEOUT:-30} + VIKINGDB_SOCKET_TIMEOUT: ${VIKINGDB_SOCKET_TIMEOUT:-30} + LINDORM_URL: ${LINDORM_URL:-http://lindorm:30070} + LINDORM_USERNAME: ${LINDORM_USERNAME:-lindorm} + LINDORM_PASSWORD: ${LINDORM_PASSWORD:-lindorm} + OCEANBASE_VECTOR_HOST: ${OCEANBASE_VECTOR_HOST:-oceanbase} + OCEANBASE_VECTOR_PORT: ${OCEANBASE_VECTOR_PORT:-2881} + OCEANBASE_VECTOR_USER: ${OCEANBASE_VECTOR_USER:-root@test} + OCEANBASE_VECTOR_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} + OCEANBASE_VECTOR_DATABASE: ${OCEANBASE_VECTOR_DATABASE:-test} + OCEANBASE_CLUSTER_NAME: ${OCEANBASE_CLUSTER_NAME:-difyai} + OCEANBASE_MEMORY_LIMIT: ${OCEANBASE_MEMORY_LIMIT:-6G} + UPSTASH_VECTOR_URL: ${UPSTASH_VECTOR_URL:-https://xxx-vector.upstash.io} + UPSTASH_VECTOR_TOKEN: ${UPSTASH_VECTOR_TOKEN:-dify} + UPLOAD_FILE_SIZE_LIMIT: ${UPLOAD_FILE_SIZE_LIMIT:-15} + UPLOAD_FILE_BATCH_LIMIT: ${UPLOAD_FILE_BATCH_LIMIT:-5} + ETL_TYPE: ${ETL_TYPE:-dify} + UNSTRUCTURED_API_URL: ${UNSTRUCTURED_API_URL:-} + UNSTRUCTURED_API_KEY: ${UNSTRUCTURED_API_KEY:-} + SCARF_NO_ANALYTICS: ${SCARF_NO_ANALYTICS:-true} + PROMPT_GENERATION_MAX_TOKENS: ${PROMPT_GENERATION_MAX_TOKENS:-512} + CODE_GENERATION_MAX_TOKENS: ${CODE_GENERATION_MAX_TOKENS:-1024} + MULTIMODAL_SEND_FORMAT: ${MULTIMODAL_SEND_FORMAT:-base64} + UPLOAD_IMAGE_FILE_SIZE_LIMIT: ${UPLOAD_IMAGE_FILE_SIZE_LIMIT:-10} + UPLOAD_VIDEO_FILE_SIZE_LIMIT: ${UPLOAD_VIDEO_FILE_SIZE_LIMIT:-100} + UPLOAD_AUDIO_FILE_SIZE_LIMIT: ${UPLOAD_AUDIO_FILE_SIZE_LIMIT:-50} + SENTRY_DSN: ${SENTRY_DSN:-} + API_SENTRY_DSN: ${API_SENTRY_DSN:-} + API_SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0} + API_SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0} + WEB_SENTRY_DSN: ${WEB_SENTRY_DSN:-} + NOTION_INTEGRATION_TYPE: ${NOTION_INTEGRATION_TYPE:-public} + NOTION_CLIENT_SECRET: ${NOTION_CLIENT_SECRET:-} + NOTION_CLIENT_ID: ${NOTION_CLIENT_ID:-} + NOTION_INTERNAL_SECRET: ${NOTION_INTERNAL_SECRET:-} + MAIL_TYPE: ${MAIL_TYPE:-resend} + MAIL_DEFAULT_SEND_FROM: ${MAIL_DEFAULT_SEND_FROM:-} + RESEND_API_URL: ${RESEND_API_URL:-https://api.resend.com} + RESEND_API_KEY: ${RESEND_API_KEY:-your-resend-api-key} + SMTP_SERVER: ${SMTP_SERVER:-} + SMTP_PORT: ${SMTP_PORT:-465} + SMTP_USERNAME: ${SMTP_USERNAME:-} + SMTP_PASSWORD: ${SMTP_PASSWORD:-} + SMTP_USE_TLS: ${SMTP_USE_TLS:-true} + SMTP_OPPORTUNISTIC_TLS: ${SMTP_OPPORTUNISTIC_TLS:-false} + INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH: ${INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH:-4000} + INVITE_EXPIRY_HOURS: ${INVITE_EXPIRY_HOURS:-72} + RESET_PASSWORD_TOKEN_EXPIRY_MINUTES: ${RESET_PASSWORD_TOKEN_EXPIRY_MINUTES:-5} + CODE_EXECUTION_ENDPOINT: ${CODE_EXECUTION_ENDPOINT:-http://sandbox:8194} + CODE_EXECUTION_API_KEY: ${CODE_EXECUTION_API_KEY:-dify-sandbox} + CODE_MAX_NUMBER: ${CODE_MAX_NUMBER:-9223372036854775807} + CODE_MIN_NUMBER: ${CODE_MIN_NUMBER:--9223372036854775808} + CODE_MAX_DEPTH: ${CODE_MAX_DEPTH:-5} + CODE_MAX_PRECISION: ${CODE_MAX_PRECISION:-20} + CODE_MAX_STRING_LENGTH: ${CODE_MAX_STRING_LENGTH:-80000} + CODE_MAX_STRING_ARRAY_LENGTH: ${CODE_MAX_STRING_ARRAY_LENGTH:-30} + CODE_MAX_OBJECT_ARRAY_LENGTH: ${CODE_MAX_OBJECT_ARRAY_LENGTH:-30} + CODE_MAX_NUMBER_ARRAY_LENGTH: ${CODE_MAX_NUMBER_ARRAY_LENGTH:-1000} + CODE_EXECUTION_CONNECT_TIMEOUT: ${CODE_EXECUTION_CONNECT_TIMEOUT:-10} + CODE_EXECUTION_READ_TIMEOUT: ${CODE_EXECUTION_READ_TIMEOUT:-60} + CODE_EXECUTION_WRITE_TIMEOUT: ${CODE_EXECUTION_WRITE_TIMEOUT:-10} + TEMPLATE_TRANSFORM_MAX_LENGTH: ${TEMPLATE_TRANSFORM_MAX_LENGTH:-80000} + WORKFLOW_MAX_EXECUTION_STEPS: ${WORKFLOW_MAX_EXECUTION_STEPS:-500} + WORKFLOW_MAX_EXECUTION_TIME: ${WORKFLOW_MAX_EXECUTION_TIME:-1200} + WORKFLOW_CALL_MAX_DEPTH: ${WORKFLOW_CALL_MAX_DEPTH:-5} + MAX_VARIABLE_SIZE: ${MAX_VARIABLE_SIZE:-204800} + WORKFLOW_PARALLEL_DEPTH_LIMIT: ${WORKFLOW_PARALLEL_DEPTH_LIMIT:-3} + WORKFLOW_FILE_UPLOAD_LIMIT: ${WORKFLOW_FILE_UPLOAD_LIMIT:-10} + HTTP_REQUEST_NODE_MAX_BINARY_SIZE: ${HTTP_REQUEST_NODE_MAX_BINARY_SIZE:-10485760} + HTTP_REQUEST_NODE_MAX_TEXT_SIZE: ${HTTP_REQUEST_NODE_MAX_TEXT_SIZE:-1048576} + SSRF_PROXY_HTTP_URL: ${SSRF_PROXY_HTTP_URL:-http://ssrf_proxy:3128} + SSRF_PROXY_HTTPS_URL: ${SSRF_PROXY_HTTPS_URL:-http://ssrf_proxy:3128} + TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000} + PGUSER: ${PGUSER:-${DB_USERNAME}} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-${DB_PASSWORD}} + POSTGRES_DB: ${POSTGRES_DB:-${DB_DATABASE}} + PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata} + SANDBOX_API_KEY: ${SANDBOX_API_KEY:-dify-sandbox} + SANDBOX_GIN_MODE: ${SANDBOX_GIN_MODE:-release} + SANDBOX_WORKER_TIMEOUT: ${SANDBOX_WORKER_TIMEOUT:-15} + SANDBOX_ENABLE_NETWORK: ${SANDBOX_ENABLE_NETWORK:-true} + SANDBOX_HTTP_PROXY: ${SANDBOX_HTTP_PROXY:-http://ssrf_proxy:3128} + SANDBOX_HTTPS_PROXY: ${SANDBOX_HTTPS_PROXY:-http://ssrf_proxy:3128} + SANDBOX_PORT: ${SANDBOX_PORT:-8194} + WEAVIATE_PERSISTENCE_DATA_PATH: ${WEAVIATE_PERSISTENCE_DATA_PATH:-/var/lib/weaviate} + WEAVIATE_QUERY_DEFAULTS_LIMIT: ${WEAVIATE_QUERY_DEFAULTS_LIMIT:-25} + WEAVIATE_AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: ${WEAVIATE_AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED:-true} + WEAVIATE_DEFAULT_VECTORIZER_MODULE: ${WEAVIATE_DEFAULT_VECTORIZER_MODULE:-none} + WEAVIATE_CLUSTER_HOSTNAME: ${WEAVIATE_CLUSTER_HOSTNAME:-node1} + WEAVIATE_AUTHENTICATION_APIKEY_ENABLED: ${WEAVIATE_AUTHENTICATION_APIKEY_ENABLED:-true} + WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS: ${WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS:-WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih} + WEAVIATE_AUTHENTICATION_APIKEY_USERS: ${WEAVIATE_AUTHENTICATION_APIKEY_USERS:-hello@dify.ai} + WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED: ${WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED:-true} + WEAVIATE_AUTHORIZATION_ADMINLIST_USERS: ${WEAVIATE_AUTHORIZATION_ADMINLIST_USERS:-hello@dify.ai} + CHROMA_SERVER_AUTHN_CREDENTIALS: ${CHROMA_SERVER_AUTHN_CREDENTIALS:-difyai123456} + CHROMA_SERVER_AUTHN_PROVIDER: ${CHROMA_SERVER_AUTHN_PROVIDER:-chromadb.auth.token_authn.TokenAuthenticationServerProvider} + CHROMA_IS_PERSISTENT: ${CHROMA_IS_PERSISTENT:-TRUE} + ORACLE_PWD: ${ORACLE_PWD:-Dify123456} + ORACLE_CHARACTERSET: ${ORACLE_CHARACTERSET:-AL32UTF8} + ETCD_AUTO_COMPACTION_MODE: ${ETCD_AUTO_COMPACTION_MODE:-revision} + ETCD_AUTO_COMPACTION_RETENTION: ${ETCD_AUTO_COMPACTION_RETENTION:-1000} + ETCD_QUOTA_BACKEND_BYTES: ${ETCD_QUOTA_BACKEND_BYTES:-4294967296} + ETCD_SNAPSHOT_COUNT: ${ETCD_SNAPSHOT_COUNT:-50000} + MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-minioadmin} + MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:-minioadmin} + ETCD_ENDPOINTS: ${ETCD_ENDPOINTS:-etcd:2379} + MINIO_ADDRESS: ${MINIO_ADDRESS:-minio:9000} + MILVUS_AUTHORIZATION_ENABLED: ${MILVUS_AUTHORIZATION_ENABLED:-true} + PGVECTOR_PGUSER: ${PGVECTOR_PGUSER:-postgres} + PGVECTOR_POSTGRES_PASSWORD: ${PGVECTOR_POSTGRES_PASSWORD:-difyai123456} + PGVECTOR_POSTGRES_DB: ${PGVECTOR_POSTGRES_DB:-dify} + PGVECTOR_PGDATA: ${PGVECTOR_PGDATA:-/var/lib/postgresql/data/pgdata} + OPENSEARCH_DISCOVERY_TYPE: ${OPENSEARCH_DISCOVERY_TYPE:-single-node} + OPENSEARCH_BOOTSTRAP_MEMORY_LOCK: ${OPENSEARCH_BOOTSTRAP_MEMORY_LOCK:-true} + OPENSEARCH_JAVA_OPTS_MIN: ${OPENSEARCH_JAVA_OPTS_MIN:-512m} + OPENSEARCH_JAVA_OPTS_MAX: ${OPENSEARCH_JAVA_OPTS_MAX:-1024m} + OPENSEARCH_INITIAL_ADMIN_PASSWORD: ${OPENSEARCH_INITIAL_ADMIN_PASSWORD:-Qazwsxedc!@#123} + OPENSEARCH_MEMLOCK_SOFT: ${OPENSEARCH_MEMLOCK_SOFT:--1} + OPENSEARCH_MEMLOCK_HARD: ${OPENSEARCH_MEMLOCK_HARD:--1} + OPENSEARCH_NOFILE_SOFT: ${OPENSEARCH_NOFILE_SOFT:-65536} + OPENSEARCH_NOFILE_HARD: ${OPENSEARCH_NOFILE_HARD:-65536} + NGINX_SERVER_NAME: ${NGINX_SERVER_NAME:-_} + NGINX_HTTPS_ENABLED: ${NGINX_HTTPS_ENABLED:-false} + NGINX_PORT: ${NGINX_PORT:-80} + NGINX_SSL_PORT: ${NGINX_SSL_PORT:-443} + NGINX_SSL_CERT_FILENAME: ${NGINX_SSL_CERT_FILENAME:-dify.crt} + NGINX_SSL_CERT_KEY_FILENAME: ${NGINX_SSL_CERT_KEY_FILENAME:-dify.key} + NGINX_SSL_PROTOCOLS: ${NGINX_SSL_PROTOCOLS:-TLSv1.1 TLSv1.2 TLSv1.3} + NGINX_WORKER_PROCESSES: ${NGINX_WORKER_PROCESSES:-auto} + NGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-15M} + NGINX_KEEPALIVE_TIMEOUT: ${NGINX_KEEPALIVE_TIMEOUT:-65} + NGINX_PROXY_READ_TIMEOUT: ${NGINX_PROXY_READ_TIMEOUT:-3600s} + NGINX_PROXY_SEND_TIMEOUT: ${NGINX_PROXY_SEND_TIMEOUT:-3600s} + NGINX_ENABLE_CERTBOT_CHALLENGE: ${NGINX_ENABLE_CERTBOT_CHALLENGE:-false} + CERTBOT_EMAIL: ${CERTBOT_EMAIL:-your_email@example.com} + CERTBOT_DOMAIN: ${CERTBOT_DOMAIN:-your_domain.com} + CERTBOT_OPTIONS: ${CERTBOT_OPTIONS:-} + SSRF_HTTP_PORT: ${SSRF_HTTP_PORT:-3128} + SSRF_COREDUMP_DIR: ${SSRF_COREDUMP_DIR:-/var/spool/squid} + SSRF_REVERSE_PROXY_PORT: ${SSRF_REVERSE_PROXY_PORT:-8194} + SSRF_SANDBOX_HOST: ${SSRF_SANDBOX_HOST:-sandbox} + SSRF_DEFAULT_TIME_OUT: ${SSRF_DEFAULT_TIME_OUT:-5} + SSRF_DEFAULT_CONNECT_TIME_OUT: ${SSRF_DEFAULT_CONNECT_TIME_OUT:-5} + SSRF_DEFAULT_READ_TIME_OUT: ${SSRF_DEFAULT_READ_TIME_OUT:-5} + SSRF_DEFAULT_WRITE_TIME_OUT: ${SSRF_DEFAULT_WRITE_TIME_OUT:-5} + EXPOSE_NGINX_PORT: ${PANEL_APP_PORT_HTTP:-8080} + EXPOSE_NGINX_SSL_PORT: ${PANEL_APP_PORT_HTTPS:-8443} + POSITION_TOOL_PINS: ${POSITION_TOOL_PINS:-} + POSITION_TOOL_INCLUDES: ${POSITION_TOOL_INCLUDES:-} + POSITION_TOOL_EXCLUDES: ${POSITION_TOOL_EXCLUDES:-} + POSITION_PROVIDER_PINS: ${POSITION_PROVIDER_PINS:-} + POSITION_PROVIDER_INCLUDES: ${POSITION_PROVIDER_INCLUDES:-} + POSITION_PROVIDER_EXCLUDES: ${POSITION_PROVIDER_EXCLUDES:-} + CSP_WHITELIST: ${CSP_WHITELIST:-} + CREATE_TIDB_SERVICE_JOB_ENABLED: ${CREATE_TIDB_SERVICE_JOB_ENABLED:-false} + MAX_SUBMIT_COUNT: ${MAX_SUBMIT_COUNT:-100} + TOP_K_MAX_VALUE: ${TOP_K_MAX_VALUE:-10} + +services: + api: + image: langgenius/dify-api:0.15.3 + container_name: api-${CONTAINER_NAME} + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + environment: + <<: *shared-api-worker-env + MODE: api + SENTRY_DSN: ${API_SENTRY_DSN:-} + SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0} + SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0} + depends_on: + - db + - redis + volumes: + - ${DIFY_ROOT_PATH}/volumes/app/storage:/app/api/storage + networks: + - ssrf_proxy_network + - default + + worker: + image: langgenius/dify-api:0.15.3 + container_name: worker-${CONTAINER_NAME} + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + environment: + <<: *shared-api-worker-env + MODE: worker + SENTRY_DSN: ${API_SENTRY_DSN:-} + SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0} + SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0} + depends_on: + - db + - redis + volumes: + - ${DIFY_ROOT_PATH}/volumes/app/storage:/app/api/storage + networks: + - ssrf_proxy_network + - default + + web: + image: langgenius/dify-web:0.15.3 + container_name: web-${CONTAINER_NAME} + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + environment: + CONSOLE_API_URL: ${CONSOLE_API_URL:-} + APP_API_URL: ${APP_API_URL:-} + SENTRY_DSN: ${WEB_SENTRY_DSN:-} + NEXT_TELEMETRY_DISABLED: ${NEXT_TELEMETRY_DISABLED:-0} + TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000} + CSP_WHITELIST: ${CSP_WHITELIST:-} + TOP_K_MAX_VALUE: ${TOP_K_MAX_VALUE:-} + INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH: ${INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH:-} + + db: + image: postgres:15-alpine + container_name: db-${CONTAINER_NAME} + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + environment: + PGUSER: ${PGUSER:-postgres} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-difyai123456} + POSTGRES_DB: ${POSTGRES_DB:-dify} + PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata} + command: > + postgres -c 'max_connections=${POSTGRES_MAX_CONNECTIONS:-100}' + -c 'shared_buffers=${POSTGRES_SHARED_BUFFERS:-128MB}' + -c 'work_mem=${POSTGRES_WORK_MEM:-4MB}' + -c 'maintenance_work_mem=${POSTGRES_MAINTENANCE_WORK_MEM:-64MB}' + -c 'effective_cache_size=${POSTGRES_EFFECTIVE_CACHE_SIZE:-4096MB}' + volumes: + - ${DIFY_ROOT_PATH}/volumes/db/data:/var/lib/postgresql/data + healthcheck: + test: [ 'CMD', 'pg_isready' ] + interval: 1s + timeout: 3s + retries: 30 + + redis: + image: redis:6-alpine + container_name: redis-${CONTAINER_NAME} + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + environment: + REDISCLI_AUTH: ${REDIS_PASSWORD:-difyai123456} + volumes: + - ${DIFY_ROOT_PATH}/volumes/redis/data:/data + command: redis-server --requirepass ${REDIS_PASSWORD:-difyai123456} + healthcheck: + test: [ 'CMD', 'redis-cli', 'ping' ] + + sandbox: + image: langgenius/dify-sandbox:0.2.10 + container_name: sandbox-${CONTAINER_NAME} + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + environment: + API_KEY: ${SANDBOX_API_KEY:-dify-sandbox} + GIN_MODE: ${SANDBOX_GIN_MODE:-release} + WORKER_TIMEOUT: ${SANDBOX_WORKER_TIMEOUT:-15} + ENABLE_NETWORK: ${SANDBOX_ENABLE_NETWORK:-true} + HTTP_PROXY: ${SANDBOX_HTTP_PROXY:-http://ssrf_proxy:3128} + HTTPS_PROXY: ${SANDBOX_HTTPS_PROXY:-http://ssrf_proxy:3128} + SANDBOX_PORT: ${SANDBOX_PORT:-8194} + volumes: + - ${DIFY_ROOT_PATH}/volumes/sandbox/dependencies:/dependencies + healthcheck: + test: [ 'CMD', 'curl', '-f', 'http://localhost:8194/health' ] + networks: + - ssrf_proxy_network + + ssrf_proxy: + image: ubuntu/squid:latest + container_name: ssrf_proxy-${CONTAINER_NAME} + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${DIFY_ROOT_PATH}/ssrf_proxy/squid.conf.template:/etc/squid/squid.conf.template + - ${DIFY_ROOT_PATH}/ssrf_proxy/docker-entrypoint.sh:/docker-entrypoint-mount.sh + entrypoint: [ 'sh', '-c', "cp /docker-entrypoint-mount.sh /docker-entrypoint.sh && sed -i 's/\r$$//' /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh && /docker-entrypoint.sh" ] + environment: + HTTP_PORT: ${SSRF_HTTP_PORT:-3128} + COREDUMP_DIR: ${SSRF_COREDUMP_DIR:-/var/spool/squid} + REVERSE_PROXY_PORT: ${SSRF_REVERSE_PROXY_PORT:-8194} + SANDBOX_HOST: ${SSRF_SANDBOX_HOST:-sandbox} + SANDBOX_PORT: ${SANDBOX_PORT:-8194} + networks: + - ssrf_proxy_network + - default + + certbot: + image: certbot/certbot + container_name: certbot-${CONTAINER_NAME} + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + profiles: + - certbot + volumes: + - ${DIFY_ROOT_PATH}/volumes/certbot/conf:/etc/letsencrypt + - ${DIFY_ROOT_PATH}/volumes/certbot/www:/var/www/html + - ${DIFY_ROOT_PATH}/volumes/certbot/logs:/var/log/letsencrypt + - ${DIFY_ROOT_PATH}/volumes/certbot/conf/live:/etc/letsencrypt/live + - ${DIFY_ROOT_PATH}/certbot/update-cert.template.txt:/update-cert.template.txt + - ${DIFY_ROOT_PATH}/certbot/docker-entrypoint.sh:/docker-entrypoint.sh + environment: + - CERTBOT_EMAIL=${CERTBOT_EMAIL} + - CERTBOT_DOMAIN=${CERTBOT_DOMAIN} + - CERTBOT_OPTIONS=${CERTBOT_OPTIONS:-} + entrypoint: [ '/docker-entrypoint.sh' ] + command: [ 'tail', '-f', '/dev/null' ] + + nginx: + image: nginx:latest + container_name: nginx-${CONTAINER_NAME} + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${DIFY_ROOT_PATH}/nginx/nginx.conf.template:/etc/nginx/nginx.conf.template + - ${DIFY_ROOT_PATH}/nginx/proxy.conf.template:/etc/nginx/proxy.conf.template + - ${DIFY_ROOT_PATH}/nginx/https.conf.template:/etc/nginx/https.conf.template + - ${DIFY_ROOT_PATH}/nginx/conf.d:/etc/nginx/conf.d + - ${DIFY_ROOT_PATH}/nginx/docker-entrypoint.sh:/docker-entrypoint-mount.sh + - ${DIFY_ROOT_PATH}/nginx/ssl:/etc/ssl + - ${DIFY_ROOT_PATH}/volumes/certbot/conf/live:/etc/letsencrypt/live + - ${DIFY_ROOT_PATH}/volumes/certbot/conf:/etc/letsencrypt + - ${DIFY_ROOT_PATH}/volumes/certbot/www:/var/www/html + entrypoint: [ 'sh', '-c', "cp /docker-entrypoint-mount.sh /docker-entrypoint.sh && sed -i 's/\r$$//' /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh && /docker-entrypoint.sh" ] + environment: + NGINX_SERVER_NAME: ${NGINX_SERVER_NAME:-_} + NGINX_HTTPS_ENABLED: ${NGINX_HTTPS_ENABLED:-false} + NGINX_SSL_PORT: ${NGINX_SSL_PORT:-443} + NGINX_PORT: ${NGINX_PORT:-80} + NGINX_SSL_CERT_FILENAME: ${NGINX_SSL_CERT_FILENAME:-dify.crt} + NGINX_SSL_CERT_KEY_FILENAME: ${NGINX_SSL_CERT_KEY_FILENAME:-dify.key} + NGINX_SSL_PROTOCOLS: ${NGINX_SSL_PROTOCOLS:-TLSv1.1 TLSv1.2 TLSv1.3} + NGINX_WORKER_PROCESSES: ${NGINX_WORKER_PROCESSES:-auto} + NGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-15M} + NGINX_KEEPALIVE_TIMEOUT: ${NGINX_KEEPALIVE_TIMEOUT:-65} + NGINX_PROXY_READ_TIMEOUT: ${NGINX_PROXY_READ_TIMEOUT:-3600s} + NGINX_PROXY_SEND_TIMEOUT: ${NGINX_PROXY_SEND_TIMEOUT:-3600s} + NGINX_ENABLE_CERTBOT_CHALLENGE: ${NGINX_ENABLE_CERTBOT_CHALLENGE:-false} + CERTBOT_DOMAIN: ${CERTBOT_DOMAIN:-} + depends_on: + - api + - web + ports: + - '${EXPOSE_NGINX_PORT:-80}:${NGINX_PORT:-80}' + - '${EXPOSE_NGINX_SSL_PORT:-443}:${NGINX_SSL_PORT:-443}' + + weaviate: + image: semitechnologies/weaviate:1.19.0 + container_name: weaviate-${CONTAINER_NAME} + profiles: + - '' + - weaviate + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${DIFY_ROOT_PATH}/volumes/weaviate:/var/lib/weaviate + environment: + PERSISTENCE_DATA_PATH: ${WEAVIATE_PERSISTENCE_DATA_PATH:-/var/lib/weaviate} + QUERY_DEFAULTS_LIMIT: ${WEAVIATE_QUERY_DEFAULTS_LIMIT:-25} + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: ${WEAVIATE_AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED:-false} + DEFAULT_VECTORIZER_MODULE: ${WEAVIATE_DEFAULT_VECTORIZER_MODULE:-none} + CLUSTER_HOSTNAME: ${WEAVIATE_CLUSTER_HOSTNAME:-node1} + AUTHENTICATION_APIKEY_ENABLED: ${WEAVIATE_AUTHENTICATION_APIKEY_ENABLED:-true} + AUTHENTICATION_APIKEY_ALLOWED_KEYS: ${WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS:-WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih} + AUTHENTICATION_APIKEY_USERS: ${WEAVIATE_AUTHENTICATION_APIKEY_USERS:-hello@dify.ai} + AUTHORIZATION_ADMINLIST_ENABLED: ${WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED:-true} + AUTHORIZATION_ADMINLIST_USERS: ${WEAVIATE_AUTHORIZATION_ADMINLIST_USERS:-hello@dify.ai} + + qdrant: + image: langgenius/qdrant:v1.7.3 + container_name: qdrant-${CONTAINER_NAME} + profiles: + - qdrant + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${DIFY_ROOT_PATH}/volumes/qdrant:/qdrant/storage + environment: + QDRANT_API_KEY: ${QDRANT_API_KEY:-difyai123456} + + couchbase-server: + build: ./couchbase-server + profiles: + - couchbase + restart: always + container_name: couchbase-server-${CONTAINER_NAME} + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + environment: + - CLUSTER_NAME=dify_search + - COUCHBASE_ADMINISTRATOR_USERNAME=${COUCHBASE_USER:-Administrator} + - COUCHBASE_ADMINISTRATOR_PASSWORD=${COUCHBASE_PASSWORD:-password} + - COUCHBASE_BUCKET=${COUCHBASE_BUCKET_NAME:-Embeddings} + - COUCHBASE_BUCKET_RAMSIZE=512 + - COUCHBASE_RAM_SIZE=2048 + - COUCHBASE_EVENTING_RAM_SIZE=512 + - COUCHBASE_INDEX_RAM_SIZE=512 + - COUCHBASE_FTS_RAM_SIZE=1024 + hostname: couchbase-server + working_dir: /opt/couchbase + stdin_open: true + tty: true + entrypoint: [ "" ] + command: sh -c "/opt/couchbase/init/init-cbserver.sh" + volumes: + - ${DIFY_ROOT_PATH}/volumes/couchbase/data:/opt/couchbase/var/lib/couchbase/data + healthcheck: + test: [ "CMD-SHELL", "curl -s -f -u Administrator:password http://localhost:8091/pools/default/buckets | grep -q '\\[{' || exit 1" ] + interval: 10s + retries: 10 + start_period: 30s + timeout: 10s + + pgvector: + image: pgvector/pgvector:pg16 + container_name: pgvector-${CONTAINER_NAME} + profiles: + - pgvector + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + environment: + PGUSER: ${PGVECTOR_PGUSER:-postgres} + POSTGRES_PASSWORD: ${PGVECTOR_POSTGRES_PASSWORD:-difyai123456} + POSTGRES_DB: ${PGVECTOR_POSTGRES_DB:-dify} + PGDATA: ${PGVECTOR_PGDATA:-/var/lib/postgresql/data/pgdata} + volumes: + - ${DIFY_ROOT_PATH}/volumes/pgvector/data:/var/lib/postgresql/data + healthcheck: + test: [ 'CMD', 'pg_isready' ] + interval: 1s + timeout: 3s + retries: 30 + + pgvecto-rs: + image: tensorchord/pgvecto-rs:pg16-v0.3.0 + container_name: pgvecto-rs-${CONTAINER_NAME} + profiles: + - pgvecto-rs + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + environment: + PGUSER: ${PGVECTOR_PGUSER:-postgres} + POSTGRES_PASSWORD: ${PGVECTOR_POSTGRES_PASSWORD:-difyai123456} + POSTGRES_DB: ${PGVECTOR_POSTGRES_DB:-dify} + PGDATA: ${PGVECTOR_PGDATA:-/var/lib/postgresql/data/pgdata} + volumes: + - ${DIFY_ROOT_PATH}/volumes/pgvecto_rs/data:/var/lib/postgresql/data + healthcheck: + test: [ 'CMD', 'pg_isready' ] + interval: 1s + timeout: 3s + retries: 30 + + chroma: + image: ghcr.io/chroma-core/chroma:0.5.20 + container_name: chroma-${CONTAINER_NAME} + profiles: + - chroma + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${DIFY_ROOT_PATH}/volumes/chroma:/chroma/chroma + environment: + CHROMA_SERVER_AUTHN_CREDENTIALS: ${CHROMA_SERVER_AUTHN_CREDENTIALS:-difyai123456} + CHROMA_SERVER_AUTHN_PROVIDER: ${CHROMA_SERVER_AUTHN_PROVIDER:-chromadb.auth.token_authn.TokenAuthenticationServerProvider} + IS_PERSISTENT: ${CHROMA_IS_PERSISTENT:-TRUE} + + oceanbase: + image: quay.io/oceanbase/oceanbase-ce:4.3.3.0-100000142024101215 + container_name: oceanbase-${CONTAINER_NAME} + profiles: + - oceanbase + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${DIFY_ROOT_PATH}/volumes/oceanbase/data:/root/ob + - ${DIFY_ROOT_PATH}/volumes/oceanbase/conf:/root/.obd/cluster + - ${DIFY_ROOT_PATH}/volumes/oceanbase/init.d:/root/boot/init.d + environment: + OB_MEMORY_LIMIT: ${OCEANBASE_MEMORY_LIMIT:-6G} + OB_SYS_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} + OB_TENANT_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} + OB_CLUSTER_NAME: ${OCEANBASE_CLUSTER_NAME:-difyai} + OB_SERVER_IP: '127.0.0.1' + + oracle: + image: container-registry.oracle.com/database/free:latest + container_name: oracle-${CONTAINER_NAME} + profiles: + - oracle + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - source: oradata + type: volume + target: /opt/oracle/oradata + - ${DIFY_ROOT_PATH}/startupscripts:/opt/oracle/scripts/startup + environment: + ORACLE_PWD: ${ORACLE_PWD:-Dify123456} + ORACLE_CHARACTERSET: ${ORACLE_CHARACTERSET:-AL32UTF8} + + etcd: + image: quay.io/coreos/etcd:v3.5.5 + container_name: milvus-etcd-${CONTAINER_NAME} + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + profiles: + - milvus + environment: + ETCD_AUTO_COMPACTION_MODE: ${ETCD_AUTO_COMPACTION_MODE:-revision} + ETCD_AUTO_COMPACTION_RETENTION: ${ETCD_AUTO_COMPACTION_RETENTION:-1000} + ETCD_QUOTA_BACKEND_BYTES: ${ETCD_QUOTA_BACKEND_BYTES:-4294967296} + ETCD_SNAPSHOT_COUNT: ${ETCD_SNAPSHOT_COUNT:-50000} + volumes: + - ${DIFY_ROOT_PATH}/volumes/milvus/etcd:/etcd + command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd + healthcheck: + test: [ 'CMD', 'etcdctl', 'endpoint', 'health' ] + interval: 30s + timeout: 20s + retries: 3 + networks: + - milvus + + minio: + image: minio/minio:RELEASE.2023-03-20T20-16-18Z + container_name: milvus-minio-${CONTAINER_NAME} + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + profiles: + - milvus + environment: + MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-minioadmin} + MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:-minioadmin} + volumes: + - ${DIFY_ROOT_PATH}/volumes/milvus/minio:/minio_data + command: minio server /minio_data --console-address ":9001" + healthcheck: + test: [ 'CMD', 'curl', '-f', 'http://localhost:9000/minio/health/live' ] + interval: 30s + timeout: 20s + retries: 3 + networks: + - milvus + + milvus-standalone: + image: milvusdb/milvus:v2.5.0-beta + container_name: milvus-standalone-${CONTAINER_NAME} + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + profiles: + - milvus + command: [ 'milvus', 'run', 'standalone' ] + environment: + ETCD_ENDPOINTS: ${ETCD_ENDPOINTS:-etcd:2379} + MINIO_ADDRESS: ${MINIO_ADDRESS:-minio:9000} + common.security.authorizationEnabled: ${MILVUS_AUTHORIZATION_ENABLED:-true} + volumes: + - ${DIFY_ROOT_PATH}/volumes/milvus/milvus:/var/lib/milvus + healthcheck: + test: [ 'CMD', 'curl', '-f', 'http://localhost:9091/healthz' ] + interval: 30s + start_period: 90s + timeout: 20s + retries: 3 + depends_on: + - etcd + - minio + ports: + - 19530:19530 + - 9091:9091 + networks: + - milvus + + opensearch: + image: opensearchproject/opensearch:latest + container_name: opensearch-${CONTAINER_NAME} + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + profiles: + - opensearch + environment: + discovery.type: ${OPENSEARCH_DISCOVERY_TYPE:-single-node} + bootstrap.memory_lock: ${OPENSEARCH_BOOTSTRAP_MEMORY_LOCK:-true} + OPENSEARCH_JAVA_OPTS: -Xms${OPENSEARCH_JAVA_OPTS_MIN:-512m} -Xmx${OPENSEARCH_JAVA_OPTS_MAX:-1024m} + OPENSEARCH_INITIAL_ADMIN_PASSWORD: ${OPENSEARCH_INITIAL_ADMIN_PASSWORD:-Qazwsxedc!@#123} + ulimits: + memlock: + soft: ${OPENSEARCH_MEMLOCK_SOFT:--1} + hard: ${OPENSEARCH_MEMLOCK_HARD:--1} + nofile: + soft: ${OPENSEARCH_NOFILE_SOFT:-65536} + hard: ${OPENSEARCH_NOFILE_HARD:-65536} + volumes: + - ${DIFY_ROOT_PATH}/volumes/opensearch/data:/usr/share/opensearch/data + networks: + - opensearch-net + + opensearch-dashboards: + image: opensearchproject/opensearch-dashboards:latest + container_name: opensearch-dashboards-${CONTAINER_NAME} + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + profiles: + - opensearch + environment: + OPENSEARCH_HOSTS: '["https://opensearch:9200"]' + volumes: + - ${DIFY_ROOT_PATH}/volumes/opensearch/opensearch_dashboards.yml:/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml + networks: + - opensearch-net + depends_on: + - opensearch + + myscale: + image: myscale/myscaledb:1.6.4 + container_name: myscale-${CONTAINER_NAME} + profiles: + - myscale + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + tty: true + volumes: + - ${DIFY_ROOT_PATH}/volumes/myscale/data:/var/lib/clickhouse + - ${DIFY_ROOT_PATH}/volumes/myscale/log:/var/log/clickhouse-server + - ${DIFY_ROOT_PATH}/volumes/myscale/config/users.d/custom_users_config.xml:/etc/clickhouse-server/users.d/custom_users_config.xml + ports: + - ${MYSCALE_PORT:-8123}:${MYSCALE_PORT:-8123} + + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:8.14.3 + container_name: elasticsearch-${CONTAINER_NAME} + profiles: + - elasticsearch + - elasticsearch-ja + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${DIFY_ROOT_PATH}/elasticsearch/docker-entrypoint.sh:/docker-entrypoint-mount.sh + - dify_es01_data:/usr/share/elasticsearch/data + environment: + ELASTIC_PASSWORD: ${ELASTICSEARCH_PASSWORD:-elastic} + VECTOR_STORE: ${VECTOR_STORE:-} + cluster.name: dify-es-cluster + node.name: dify-es0 + discovery.type: single-node + xpack.license.self_generated.type: basic + xpack.security.enabled: 'true' + xpack.security.enrollment.enabled: 'false' + xpack.security.http.ssl.enabled: 'false' + ports: + - ${ELASTICSEARCH_PORT:-9200}:9200 + deploy: + resources: + limits: + memory: 2g + entrypoint: [ 'sh', '-c', "sh /docker-entrypoint-mount.sh" ] + healthcheck: + test: [ 'CMD', 'curl', '-s', 'http://localhost:9200/_cluster/health?pretty' ] + interval: 30s + timeout: 10s + retries: 50 + + kibana: + image: docker.elastic.co/kibana/kibana:8.14.3 + container_name: kibana-${CONTAINER_NAME} + profiles: + - elasticsearch + depends_on: + - elasticsearch + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + environment: + XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY: d1a66dfd-c4d3-4a0a-8290-2abcb83ab3aa + NO_PROXY: localhost,127.0.0.1,elasticsearch,kibana + XPACK_SECURITY_ENABLED: 'true' + XPACK_SECURITY_ENROLLMENT_ENABLED: 'false' + XPACK_SECURITY_HTTP_SSL_ENABLED: 'false' + XPACK_FLEET_ISAIRGAPPED: 'true' + I18N_LOCALE: zh-CN + SERVER_PORT: '5601' + ELASTICSEARCH_HOSTS: http://elasticsearch:9200 + ports: + - ${KIBANA_PORT:-5601}:5601 + healthcheck: + test: [ 'CMD-SHELL', 'curl -s http://localhost:5601 >/dev/null || exit 1' ] + interval: 30s + timeout: 10s + retries: 3 + + unstructured: + image: downloads.unstructured.io/unstructured-io/unstructured-api:latest + container_name: unstructured-${CONTAINER_NAME} + profiles: + - unstructured + restart: always + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/dify/dify.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${DIFY_ROOT_PATH}/volumes/unstructured:/app/data + +networks: + ssrf_proxy_network: + driver: bridge + internal: true + milvus: + driver: bridge + opensearch-net: + driver: bridge + internal: true + +volumes: + oradata: + dify_es01_data: diff --git a/apps/dify/0.15.3/envs/default.env b/apps/dify/0.15.3/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/apps/dify/0.15.3/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/apps/dify/0.15.3/envs/dify.env b/apps/dify/0.15.3/envs/dify.env new file mode 100644 index 000000000..3bc79059d --- /dev/null +++ b/apps/dify/0.15.3/envs/dify.env @@ -0,0 +1,938 @@ +# ------------------------------ +# Environment Variables for API service & worker +# ------------------------------ + +# ------------------------------ +# Common Variables +# ------------------------------ + +# The backend URL of the console API, +# used to concatenate the authorization callback. +# If empty, it is the same domain. +# Example: https://api.console.dify.ai +CONSOLE_API_URL= + +# The front-end URL of the console web, +# used to concatenate some front-end addresses and for CORS configuration use. +# If empty, it is the same domain. +# Example: https://console.dify.ai +CONSOLE_WEB_URL= + +# Service API Url, +# used to display Service API Base Url to the front-end. +# If empty, it is the same domain. +# Example: https://api.dify.ai +SERVICE_API_URL= + +# WebApp API backend Url, +# used to declare the back-end URL for the front-end API. +# If empty, it is the same domain. +# Example: https://api.app.dify.ai +APP_API_URL= + +# WebApp Url, +# used to display WebAPP API Base Url to the front-end. +# If empty, it is the same domain. +# Example: https://app.dify.ai +APP_WEB_URL= + +# File preview or download Url prefix. +# used to display File preview or download Url to the front-end or as Multi-model inputs; +# Url is signed and has expiration time. +FILES_URL= + +# ------------------------------ +# Server Configuration +# ------------------------------ + +# The log level for the application. +# Supported values are `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` +LOG_LEVEL=INFO +# Log file path +LOG_FILE=/app/logs/server.log +# Log file max size, the unit is MB +LOG_FILE_MAX_SIZE=20 +# Log file max backup count +LOG_FILE_BACKUP_COUNT=5 +# Log dateformat +LOG_DATEFORMAT=%Y-%m-%d %H:%M:%S +# Log Timezone +LOG_TZ=UTC + +# Debug mode, default is false. +# It is recommended to turn on this configuration for local development +# to prevent some problems caused by monkey patch. +DEBUG=false + +# Flask debug mode, it can output trace information at the interface when turned on, +# which is convenient for debugging. +FLASK_DEBUG=false + +# A secretkey that is used for securely signing the session cookie +# and encrypting sensitive information on the database. +# You can generate a strong key using `openssl rand -base64 42`. +SECRET_KEY=sk-9f73s3ljTXVcMT3Blb3ljTqtsKiGHXVcMT3BlbkFJLK7U + +# Password for admin user initialization. +# If left unset, admin user will not be prompted for a password +# when creating the initial admin account. +# The length of the password cannot exceed 30 charactors. +INIT_PASSWORD= + +# Deployment environment. +# Supported values are `PRODUCTION`, `TESTING`. Default is `PRODUCTION`. +# Testing environment. There will be a distinct color label on the front-end page, +# indicating that this environment is a testing environment. +DEPLOY_ENV=PRODUCTION + +# Whether to enable the version check policy. +# If set to empty, https://updates.dify.ai will be called for version check. +CHECK_UPDATE_URL=https://updates.dify.ai + +# Used to change the OpenAI base address, default is https://api.openai.com/v1. +# When OpenAI cannot be accessed in China, replace it with a domestic mirror address, +# or when a local model provides OpenAI compatible API, it can be replaced. +OPENAI_API_BASE=https://api.openai.com/v1 + +# When enabled, migrations will be executed prior to application startup +# and the application will start after the migrations have completed. +MIGRATION_ENABLED=true + +# File Access Time specifies a time interval in seconds for the file to be accessed. +# The default value is 300 seconds. +FILES_ACCESS_TIMEOUT=300 + +# Access token expiration time in minutes +ACCESS_TOKEN_EXPIRE_MINUTES=60 + +# Refresh token expiration time in days +REFRESH_TOKEN_EXPIRE_DAYS=30 + +# The maximum number of active requests for the application, where 0 means unlimited, should be a non-negative integer. +APP_MAX_ACTIVE_REQUESTS=0 +APP_MAX_EXECUTION_TIME=1200 + +# ------------------------------ +# Container Startup Related Configuration +# Only effective when starting with docker image or docker-compose. +# ------------------------------ + +# API service binding address, default: 0.0.0.0, i.e., all addresses can be accessed. +DIFY_BIND_ADDRESS=0.0.0.0 + +# API service binding port number, default 5001. +DIFY_PORT=5001 + +# The number of API server workers, i.e., the number of workers. +# Formula: number of cpu cores x 2 + 1 for sync, 1 for Gevent +# Reference: https://docs.gunicorn.org/en/stable/design.html#how-many-workers +SERVER_WORKER_AMOUNT=1 + +# Defaults to gevent. If using windows, it can be switched to sync or solo. +SERVER_WORKER_CLASS=gevent + +# Default number of worker connections, the default is 10. +SERVER_WORKER_CONNECTIONS=10 + +# Similar to SERVER_WORKER_CLASS. +# If using windows, it can be switched to sync or solo. +CELERY_WORKER_CLASS= + +# Request handling timeout. The default is 200, +# it is recommended to set it to 360 to support a longer sse connection time. +GUNICORN_TIMEOUT=360 + +# The number of Celery workers. The default is 1, and can be set as needed. +CELERY_WORKER_AMOUNT= + +# Flag indicating whether to enable autoscaling of Celery workers. +# +# Autoscaling is useful when tasks are CPU intensive and can be dynamically +# allocated and deallocated based on the workload. +# +# When autoscaling is enabled, the maximum and minimum number of workers can +# be specified. The autoscaling algorithm will dynamically adjust the number +# of workers within the specified range. +# +# Default is false (i.e., autoscaling is disabled). +# +# Example: +# CELERY_AUTO_SCALE=true +CELERY_AUTO_SCALE=false + +# The maximum number of Celery workers that can be autoscaled. +# This is optional and only used when autoscaling is enabled. +# Default is not set. +CELERY_MAX_WORKERS= + +# The minimum number of Celery workers that can be autoscaled. +# This is optional and only used when autoscaling is enabled. +# Default is not set. +CELERY_MIN_WORKERS= + +# API Tool configuration +API_TOOL_DEFAULT_CONNECT_TIMEOUT=10 +API_TOOL_DEFAULT_READ_TIMEOUT=60 + + +# ------------------------------ +# Database Configuration +# The database uses PostgreSQL. Please use the public schema. +# It is consistent with the configuration in the 'db' service below. +# ------------------------------ + +DB_USERNAME=postgres +DB_PASSWORD=difyai123456 +DB_HOST=db +DB_PORT=5432 +DB_DATABASE=dify +# The size of the database connection pool. +# The default is 30 connections, which can be appropriately increased. +SQLALCHEMY_POOL_SIZE=30 +# Database connection pool recycling time, the default is 3600 seconds. +SQLALCHEMY_POOL_RECYCLE=3600 +# Whether to print SQL, default is false. +SQLALCHEMY_ECHO=false + +# Maximum number of connections to the database +# Default is 100 +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-connection.html#GUC-MAX-CONNECTIONS +POSTGRES_MAX_CONNECTIONS=100 + +# Sets the amount of shared memory used for postgres's shared buffers. +# Default is 128MB +# Recommended value: 25% of available memory +# Reference: https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-SHARED-BUFFERS +POSTGRES_SHARED_BUFFERS=128MB + +# Sets the amount of memory used by each database worker for working space. +# Default is 4MB +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-WORK-MEM +POSTGRES_WORK_MEM=4MB + +# Sets the amount of memory reserved for maintenance activities. +# Default is 64MB +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-MAINTENANCE-WORK-MEM +POSTGRES_MAINTENANCE_WORK_MEM=64MB + +# Sets the planner's assumption about the effective cache size. +# Default is 4096MB +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-query.html#GUC-EFFECTIVE-CACHE-SIZE +POSTGRES_EFFECTIVE_CACHE_SIZE=4096MB + +# ------------------------------ +# Redis Configuration +# This Redis configuration is used for caching and for pub/sub during conversation. +# ------------------------------ + +REDIS_HOST=redis +REDIS_PORT=6379 +REDIS_USERNAME= +REDIS_PASSWORD=difyai123456 +REDIS_USE_SSL=false +REDIS_DB=0 + +# Whether to use Redis Sentinel mode. +# If set to true, the application will automatically discover and connect to the master node through Sentinel. +REDIS_USE_SENTINEL=false + +# List of Redis Sentinel nodes. If Sentinel mode is enabled, provide at least one Sentinel IP and port. +# Format: `:,:,:` +REDIS_SENTINELS= +REDIS_SENTINEL_SERVICE_NAME= +REDIS_SENTINEL_USERNAME= +REDIS_SENTINEL_PASSWORD= +REDIS_SENTINEL_SOCKET_TIMEOUT=0.1 + +# List of Redis Cluster nodes. If Cluster mode is enabled, provide at least one Cluster IP and port. +# Format: `:,:,:` +REDIS_USE_CLUSTERS=false +REDIS_CLUSTERS= +REDIS_CLUSTERS_PASSWORD= + +# ------------------------------ +# Celery Configuration +# ------------------------------ + +# Use redis as the broker, and redis db 1 for celery broker. +# Format as follows: `redis://:@:/` +# Example: redis://:difyai123456@redis:6379/1 +# If use Redis Sentinel, format as follows: `sentinel://:@:/` +# Example: sentinel://localhost:26379/1;sentinel://localhost:26380/1;sentinel://localhost:26381/1 +CELERY_BROKER_URL=redis://:difyai123456@redis:6379/1 +BROKER_USE_SSL=false + +# If you are using Redis Sentinel for high availability, configure the following settings. +CELERY_USE_SENTINEL=false +CELERY_SENTINEL_MASTER_NAME= +CELERY_SENTINEL_SOCKET_TIMEOUT=0.1 + +# ------------------------------ +# CORS Configuration +# Used to set the front-end cross-domain access policy. +# ------------------------------ + +# Specifies the allowed origins for cross-origin requests to the Web API, +# e.g. https://dify.app or * for all origins. +WEB_API_CORS_ALLOW_ORIGINS=* + +# Specifies the allowed origins for cross-origin requests to the console API, +# e.g. https://cloud.dify.ai or * for all origins. +CONSOLE_CORS_ALLOW_ORIGINS=* + +# ------------------------------ +# File Storage Configuration +# ------------------------------ + +# The type of storage to use for storing user files. +STORAGE_TYPE=opendal + +# Apache OpenDAL Configuration +# The configuration for OpenDAL consists of the following format: OPENDAL__. +# You can find all the service configurations (CONFIG_NAME) in the repository at: https://github.com/apache/opendal/tree/main/core/src/services. +# Dify will scan configurations starting with OPENDAL_ and automatically apply them. +# The scheme name for the OpenDAL storage. +OPENDAL_SCHEME=fs +# Configurations for OpenDAL Local File System. +OPENDAL_FS_ROOT=storage + +# S3 Configuration +# +S3_ENDPOINT= +S3_REGION=us-east-1 +S3_BUCKET_NAME=difyai +S3_ACCESS_KEY= +S3_SECRET_KEY= +# Whether to use AWS managed IAM roles for authenticating with the S3 service. +# If set to false, the access key and secret key must be provided. +S3_USE_AWS_MANAGED_IAM=false + +# Azure Blob Configuration +# +AZURE_BLOB_ACCOUNT_NAME=difyai +AZURE_BLOB_ACCOUNT_KEY=difyai +AZURE_BLOB_CONTAINER_NAME=difyai-container +AZURE_BLOB_ACCOUNT_URL=https://.blob.core.windows.net + +# Google Storage Configuration +# +GOOGLE_STORAGE_BUCKET_NAME=your-bucket-name +GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64= + +# The Alibaba Cloud OSS configurations, +# +ALIYUN_OSS_BUCKET_NAME=your-bucket-name +ALIYUN_OSS_ACCESS_KEY=your-access-key +ALIYUN_OSS_SECRET_KEY=your-secret-key +ALIYUN_OSS_ENDPOINT=https://oss-ap-southeast-1-internal.aliyuncs.com +ALIYUN_OSS_REGION=ap-southeast-1 +ALIYUN_OSS_AUTH_VERSION=v4 +# Don't start with '/'. OSS doesn't support leading slash in object names. +ALIYUN_OSS_PATH=your-path + +# Tencent COS Configuration +# +TENCENT_COS_BUCKET_NAME=your-bucket-name +TENCENT_COS_SECRET_KEY=your-secret-key +TENCENT_COS_SECRET_ID=your-secret-id +TENCENT_COS_REGION=your-region +TENCENT_COS_SCHEME=your-scheme + +# Oracle Storage Configuration +# +OCI_ENDPOINT=https://objectstorage.us-ashburn-1.oraclecloud.com +OCI_BUCKET_NAME=your-bucket-name +OCI_ACCESS_KEY=your-access-key +OCI_SECRET_KEY=your-secret-key +OCI_REGION=us-ashburn-1 + +# Huawei OBS Configuration +# +HUAWEI_OBS_BUCKET_NAME=your-bucket-name +HUAWEI_OBS_SECRET_KEY=your-secret-key +HUAWEI_OBS_ACCESS_KEY=your-access-key +HUAWEI_OBS_SERVER=your-server-url + +# Volcengine TOS Configuration +# +VOLCENGINE_TOS_BUCKET_NAME=your-bucket-name +VOLCENGINE_TOS_SECRET_KEY=your-secret-key +VOLCENGINE_TOS_ACCESS_KEY=your-access-key +VOLCENGINE_TOS_ENDPOINT=your-server-url +VOLCENGINE_TOS_REGION=your-region + +# Baidu OBS Storage Configuration +# +BAIDU_OBS_BUCKET_NAME=your-bucket-name +BAIDU_OBS_SECRET_KEY=your-secret-key +BAIDU_OBS_ACCESS_KEY=your-access-key +BAIDU_OBS_ENDPOINT=your-server-url + +# Supabase Storage Configuration +# +SUPABASE_BUCKET_NAME=your-bucket-name +SUPABASE_API_KEY=your-access-key +SUPABASE_URL=your-server-url + +# ------------------------------ +# Vector Database Configuration +# ------------------------------ + +# The type of vector store to use. +# Supported values are `weaviate`, `qdrant`, `milvus`, `myscale`, `relyt`, `pgvector`, `pgvecto-rs`, `chroma`, `opensearch`, `tidb_vector`, `oracle`, `tencent`, `elasticsearch`, `elasticsearch-ja`, `analyticdb`, `couchbase`, `vikingdb`, `oceanbase`. +VECTOR_STORE=weaviate + +# The Weaviate endpoint URL. Only available when VECTOR_STORE is `weaviate`. +WEAVIATE_ENDPOINT=http://weaviate:8080 +WEAVIATE_API_KEY=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih + +# The Qdrant endpoint URL. Only available when VECTOR_STORE is `qdrant`. +QDRANT_URL=http://qdrant:6333 +QDRANT_API_KEY=difyai123456 +QDRANT_CLIENT_TIMEOUT=20 +QDRANT_GRPC_ENABLED=false +QDRANT_GRPC_PORT=6334 + +# Milvus configuration Only available when VECTOR_STORE is `milvus`. +# The milvus uri. +MILVUS_URI=http://127.0.0.1:19530 +MILVUS_TOKEN= +MILVUS_USER=root +MILVUS_PASSWORD=Milvus +MILVUS_ENABLE_HYBRID_SEARCH=False + +# MyScale configuration, only available when VECTOR_STORE is `myscale` +# For multi-language support, please set MYSCALE_FTS_PARAMS with referring to: +# https://myscale.com/docs/en/text-search/#understanding-fts-index-parameters +MYSCALE_HOST=myscale +MYSCALE_PORT=8123 +MYSCALE_USER=default +MYSCALE_PASSWORD= +MYSCALE_DATABASE=dify +MYSCALE_FTS_PARAMS= + +# Couchbase configurations, only available when VECTOR_STORE is `couchbase` +# The connection string must include hostname defined in the docker-compose file (couchbase-server in this case) +COUCHBASE_CONNECTION_STRING=couchbase://couchbase-server +COUCHBASE_USER=Administrator +COUCHBASE_PASSWORD=password +COUCHBASE_BUCKET_NAME=Embeddings +COUCHBASE_SCOPE_NAME=_default + +# pgvector configurations, only available when VECTOR_STORE is `pgvector` +PGVECTOR_HOST=pgvector +PGVECTOR_PORT=5432 +PGVECTOR_USER=postgres +PGVECTOR_PASSWORD=difyai123456 +PGVECTOR_DATABASE=dify +PGVECTOR_MIN_CONNECTION=1 +PGVECTOR_MAX_CONNECTION=5 + +# pgvecto-rs configurations, only available when VECTOR_STORE is `pgvecto-rs` +PGVECTO_RS_HOST=pgvecto-rs +PGVECTO_RS_PORT=5432 +PGVECTO_RS_USER=postgres +PGVECTO_RS_PASSWORD=difyai123456 +PGVECTO_RS_DATABASE=dify + +# analyticdb configurations, only available when VECTOR_STORE is `analyticdb` +ANALYTICDB_KEY_ID=your-ak +ANALYTICDB_KEY_SECRET=your-sk +ANALYTICDB_REGION_ID=cn-hangzhou +ANALYTICDB_INSTANCE_ID=gp-ab123456 +ANALYTICDB_ACCOUNT=testaccount +ANALYTICDB_PASSWORD=testpassword +ANALYTICDB_NAMESPACE=dify +ANALYTICDB_NAMESPACE_PASSWORD=difypassword +ANALYTICDB_HOST=gp-test.aliyuncs.com +ANALYTICDB_PORT=5432 +ANALYTICDB_MIN_CONNECTION=1 +ANALYTICDB_MAX_CONNECTION=5 + +# TiDB vector configurations, only available when VECTOR_STORE is `tidb` +TIDB_VECTOR_HOST=tidb +TIDB_VECTOR_PORT=4000 +TIDB_VECTOR_USER= +TIDB_VECTOR_PASSWORD= +TIDB_VECTOR_DATABASE=dify + +# Tidb on qdrant configuration, only available when VECTOR_STORE is `tidb_on_qdrant` +TIDB_ON_QDRANT_URL=http://127.0.0.1 +TIDB_ON_QDRANT_API_KEY=dify +TIDB_ON_QDRANT_CLIENT_TIMEOUT=20 +TIDB_ON_QDRANT_GRPC_ENABLED=false +TIDB_ON_QDRANT_GRPC_PORT=6334 +TIDB_PUBLIC_KEY=dify +TIDB_PRIVATE_KEY=dify +TIDB_API_URL=http://127.0.0.1 +TIDB_IAM_API_URL=http://127.0.0.1 +TIDB_REGION=regions/aws-us-east-1 +TIDB_PROJECT_ID=dify +TIDB_SPEND_LIMIT=100 + +# Chroma configuration, only available when VECTOR_STORE is `chroma` +CHROMA_HOST=127.0.0.1 +CHROMA_PORT=8000 +CHROMA_TENANT=default_tenant +CHROMA_DATABASE=default_database +CHROMA_AUTH_PROVIDER=chromadb.auth.token_authn.TokenAuthClientProvider +CHROMA_AUTH_CREDENTIALS= + +# Oracle configuration, only available when VECTOR_STORE is `oracle` +ORACLE_HOST=oracle +ORACLE_PORT=1521 +ORACLE_USER=dify +ORACLE_PASSWORD=dify +ORACLE_DATABASE=FREEPDB1 + +# relyt configurations, only available when VECTOR_STORE is `relyt` +RELYT_HOST=db +RELYT_PORT=5432 +RELYT_USER=postgres +RELYT_PASSWORD=difyai123456 +RELYT_DATABASE=postgres + +# open search configuration, only available when VECTOR_STORE is `opensearch` +OPENSEARCH_HOST=opensearch +OPENSEARCH_PORT=9200 +OPENSEARCH_USER=admin +OPENSEARCH_PASSWORD=admin +OPENSEARCH_SECURE=true + +# tencent vector configurations, only available when VECTOR_STORE is `tencent` +TENCENT_VECTOR_DB_URL=http://127.0.0.1 +TENCENT_VECTOR_DB_API_KEY=dify +TENCENT_VECTOR_DB_TIMEOUT=30 +TENCENT_VECTOR_DB_USERNAME=dify +TENCENT_VECTOR_DB_DATABASE=dify +TENCENT_VECTOR_DB_SHARD=1 +TENCENT_VECTOR_DB_REPLICAS=2 + +# ElasticSearch configuration, only available when VECTOR_STORE is `elasticsearch` +ELASTICSEARCH_HOST=0.0.0.0 +ELASTICSEARCH_PORT=9200 +ELASTICSEARCH_USERNAME=elastic +ELASTICSEARCH_PASSWORD=elastic +KIBANA_PORT=5601 + +# baidu vector configurations, only available when VECTOR_STORE is `baidu` +BAIDU_VECTOR_DB_ENDPOINT=http://127.0.0.1:5287 +BAIDU_VECTOR_DB_CONNECTION_TIMEOUT_MS=30000 +BAIDU_VECTOR_DB_ACCOUNT=root +BAIDU_VECTOR_DB_API_KEY=dify +BAIDU_VECTOR_DB_DATABASE=dify +BAIDU_VECTOR_DB_SHARD=1 +BAIDU_VECTOR_DB_REPLICAS=3 + +# VikingDB configurations, only available when VECTOR_STORE is `vikingdb` +VIKINGDB_ACCESS_KEY=your-ak +VIKINGDB_SECRET_KEY=your-sk +VIKINGDB_REGION=cn-shanghai +VIKINGDB_HOST=api-vikingdb.xxx.volces.com +VIKINGDB_SCHEMA=http +VIKINGDB_CONNECTION_TIMEOUT=30 +VIKINGDB_SOCKET_TIMEOUT=30 + +# Lindorm configuration, only available when VECTOR_STORE is `lindorm` +LINDORM_URL=http://lindorm:30070 +LINDORM_USERNAME=lindorm +LINDORM_PASSWORD=lindorm + +# OceanBase Vector configuration, only available when VECTOR_STORE is `oceanbase` +OCEANBASE_VECTOR_HOST=oceanbase +OCEANBASE_VECTOR_PORT=2881 +OCEANBASE_VECTOR_USER=root@test +OCEANBASE_VECTOR_PASSWORD=difyai123456 +OCEANBASE_VECTOR_DATABASE=test +OCEANBASE_CLUSTER_NAME=difyai +OCEANBASE_MEMORY_LIMIT=6G + +# Upstash Vector configuration, only available when VECTOR_STORE is `upstash` +UPSTASH_VECTOR_URL=https://xxx-vector.upstash.io +UPSTASH_VECTOR_TOKEN=dify + +# ------------------------------ +# Knowledge Configuration +# ------------------------------ + +# Upload file size limit, default 15M. +UPLOAD_FILE_SIZE_LIMIT=15 + +# The maximum number of files that can be uploaded at a time, default 5. +UPLOAD_FILE_BATCH_LIMIT=5 + +# ETL type, support: `dify`, `Unstructured` +# `dify` Dify's proprietary file extraction scheme +# `Unstructured` Unstructured.io file extraction scheme +ETL_TYPE=dify + +# Unstructured API path and API key, needs to be configured when ETL_TYPE is Unstructured +# Or using Unstructured for document extractor node for pptx. +# For example: http://unstructured:8000/general/v0/general +UNSTRUCTURED_API_URL= +UNSTRUCTURED_API_KEY= +SCARF_NO_ANALYTICS=true + +# ------------------------------ +# Model Configuration +# ------------------------------ + +# The maximum number of tokens allowed for prompt generation. +# This setting controls the upper limit of tokens that can be used by the LLM +# when generating a prompt in the prompt generation tool. +# Default: 512 tokens. +PROMPT_GENERATION_MAX_TOKENS=512 + +# The maximum number of tokens allowed for code generation. +# This setting controls the upper limit of tokens that can be used by the LLM +# when generating code in the code generation tool. +# Default: 1024 tokens. +CODE_GENERATION_MAX_TOKENS=1024 + +# ------------------------------ +# Multi-modal Configuration +# ------------------------------ + +# The format of the image/video/audio/document sent when the multi-modal model is input, +# the default is base64, optional url. +# The delay of the call in url mode will be lower than that in base64 mode. +# It is generally recommended to use the more compatible base64 mode. +# If configured as url, you need to configure FILES_URL as an externally accessible address so that the multi-modal model can access the image/video/audio/document. +MULTIMODAL_SEND_FORMAT=base64 +# Upload image file size limit, default 10M. +UPLOAD_IMAGE_FILE_SIZE_LIMIT=10 +# Upload video file size limit, default 100M. +UPLOAD_VIDEO_FILE_SIZE_LIMIT=100 +# Upload audio file size limit, default 50M. +UPLOAD_AUDIO_FILE_SIZE_LIMIT=50 + +# ------------------------------ +# Sentry Configuration +# Used for application monitoring and error log tracking. +# ------------------------------ +SENTRY_DSN= + +# API Service Sentry DSN address, default is empty, when empty, +# all monitoring information is not reported to Sentry. +# If not set, Sentry error reporting will be disabled. +API_SENTRY_DSN= +# API Service The reporting ratio of Sentry events, if it is 0.01, it is 1%. +API_SENTRY_TRACES_SAMPLE_RATE=1.0 +# API Service The reporting ratio of Sentry profiles, if it is 0.01, it is 1%. +API_SENTRY_PROFILES_SAMPLE_RATE=1.0 + +# Web Service Sentry DSN address, default is empty, when empty, +# all monitoring information is not reported to Sentry. +# If not set, Sentry error reporting will be disabled. +WEB_SENTRY_DSN= + +# ------------------------------ +# Notion Integration Configuration +# Variables can be obtained by applying for Notion integration: https://www.notion.so/my-integrations +# ------------------------------ + +# Configure as "public" or "internal". +# Since Notion's OAuth redirect URL only supports HTTPS, +# if deploying locally, please use Notion's internal integration. +NOTION_INTEGRATION_TYPE=public +# Notion OAuth client secret (used for public integration type) +NOTION_CLIENT_SECRET= +# Notion OAuth client id (used for public integration type) +NOTION_CLIENT_ID= +# Notion internal integration secret. +# If the value of NOTION_INTEGRATION_TYPE is "internal", +# you need to configure this variable. +NOTION_INTERNAL_SECRET= + +# ------------------------------ +# Mail related configuration +# ------------------------------ + +# Mail type, support: resend, smtp +MAIL_TYPE=resend + +# Default send from email address, if not specified +MAIL_DEFAULT_SEND_FROM= + +# API-Key for the Resend email provider, used when MAIL_TYPE is `resend`. +RESEND_API_URL=https://api.resend.com +RESEND_API_KEY=your-resend-api-key + + +# SMTP server configuration, used when MAIL_TYPE is `smtp` +SMTP_SERVER= +SMTP_PORT=465 +SMTP_USERNAME= +SMTP_PASSWORD= +SMTP_USE_TLS=true +SMTP_OPPORTUNISTIC_TLS=false + +# ------------------------------ +# Others Configuration +# ------------------------------ + +# Maximum length of segmentation tokens for indexing +INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=4000 + +# Member invitation link valid time (hours), +# Default: 72. +INVITE_EXPIRY_HOURS=72 + +# Reset password token valid time (minutes), +RESET_PASSWORD_TOKEN_EXPIRY_MINUTES=5 + +# The sandbox service endpoint. +CODE_EXECUTION_ENDPOINT=http://sandbox:8194 +CODE_EXECUTION_API_KEY=dify-sandbox +CODE_MAX_NUMBER=9223372036854775807 +CODE_MIN_NUMBER=-9223372036854775808 +CODE_MAX_DEPTH=5 +CODE_MAX_PRECISION=20 +CODE_MAX_STRING_LENGTH=80000 +CODE_MAX_STRING_ARRAY_LENGTH=30 +CODE_MAX_OBJECT_ARRAY_LENGTH=30 +CODE_MAX_NUMBER_ARRAY_LENGTH=1000 +CODE_EXECUTION_CONNECT_TIMEOUT=10 +CODE_EXECUTION_READ_TIMEOUT=60 +CODE_EXECUTION_WRITE_TIMEOUT=10 +TEMPLATE_TRANSFORM_MAX_LENGTH=80000 + +# Workflow runtime configuration +WORKFLOW_MAX_EXECUTION_STEPS=500 +WORKFLOW_MAX_EXECUTION_TIME=1200 +WORKFLOW_CALL_MAX_DEPTH=5 +MAX_VARIABLE_SIZE=204800 +WORKFLOW_PARALLEL_DEPTH_LIMIT=3 +WORKFLOW_FILE_UPLOAD_LIMIT=10 + +# HTTP request node in workflow configuration +HTTP_REQUEST_NODE_MAX_BINARY_SIZE=10485760 +HTTP_REQUEST_NODE_MAX_TEXT_SIZE=1048576 + +# SSRF Proxy server HTTP URL +SSRF_PROXY_HTTP_URL=http://ssrf_proxy:3128 +# SSRF Proxy server HTTPS URL +SSRF_PROXY_HTTPS_URL=http://ssrf_proxy:3128 + +# ------------------------------ +# Environment Variables for web Service +# ------------------------------ + +# The timeout for the text generation in millisecond +TEXT_GENERATION_TIMEOUT_MS=60000 + +# ------------------------------ +# Environment Variables for db Service +# ------------------------------ + +PGUSER=${DB_USERNAME} +# The password for the default postgres user. +POSTGRES_PASSWORD=${DB_PASSWORD} +# The name of the default postgres database. +POSTGRES_DB=${DB_DATABASE} +# postgres data directory +PGDATA=/var/lib/postgresql/data/pgdata + +# ------------------------------ +# Environment Variables for sandbox Service +# ------------------------------ + +# The API key for the sandbox service +SANDBOX_API_KEY=dify-sandbox +# The mode in which the Gin framework runs +SANDBOX_GIN_MODE=release +# The timeout for the worker in seconds +SANDBOX_WORKER_TIMEOUT=15 +# Enable network for the sandbox service +SANDBOX_ENABLE_NETWORK=true +# HTTP proxy URL for SSRF protection +SANDBOX_HTTP_PROXY=http://ssrf_proxy:3128 +# HTTPS proxy URL for SSRF protection +SANDBOX_HTTPS_PROXY=http://ssrf_proxy:3128 +# The port on which the sandbox service runs +SANDBOX_PORT=8194 + +# ------------------------------ +# Environment Variables for weaviate Service +# (only used when VECTOR_STORE is weaviate) +# ------------------------------ +WEAVIATE_PERSISTENCE_DATA_PATH=/var/lib/weaviate +WEAVIATE_QUERY_DEFAULTS_LIMIT=25 +WEAVIATE_AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true +WEAVIATE_DEFAULT_VECTORIZER_MODULE=none +WEAVIATE_CLUSTER_HOSTNAME=node1 +WEAVIATE_AUTHENTICATION_APIKEY_ENABLED=true +WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih +WEAVIATE_AUTHENTICATION_APIKEY_USERS=hello@dify.ai +WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED=true +WEAVIATE_AUTHORIZATION_ADMINLIST_USERS=hello@dify.ai + +# ------------------------------ +# Environment Variables for Chroma +# (only used when VECTOR_STORE is chroma) +# ------------------------------ + +# Authentication credentials for Chroma server +CHROMA_SERVER_AUTHN_CREDENTIALS=difyai123456 +# Authentication provider for Chroma server +CHROMA_SERVER_AUTHN_PROVIDER=chromadb.auth.token_authn.TokenAuthenticationServerProvider +# Persistence setting for Chroma server +CHROMA_IS_PERSISTENT=TRUE + +# ------------------------------ +# Environment Variables for Oracle Service +# (only used when VECTOR_STORE is Oracle) +# ------------------------------ +ORACLE_PWD=Dify123456 +ORACLE_CHARACTERSET=AL32UTF8 + +# ------------------------------ +# Environment Variables for milvus Service +# (only used when VECTOR_STORE is milvus) +# ------------------------------ +# ETCD configuration for auto compaction mode +ETCD_AUTO_COMPACTION_MODE=revision +# ETCD configuration for auto compaction retention in terms of number of revisions +ETCD_AUTO_COMPACTION_RETENTION=1000 +# ETCD configuration for backend quota in bytes +ETCD_QUOTA_BACKEND_BYTES=4294967296 +# ETCD configuration for the number of changes before triggering a snapshot +ETCD_SNAPSHOT_COUNT=50000 +# MinIO access key for authentication +MINIO_ACCESS_KEY=minioadmin +# MinIO secret key for authentication +MINIO_SECRET_KEY=minioadmin +# ETCD service endpoints +ETCD_ENDPOINTS=etcd:2379 +# MinIO service address +MINIO_ADDRESS=minio:9000 +# Enable or disable security authorization +MILVUS_AUTHORIZATION_ENABLED=true + +# ------------------------------ +# Environment Variables for pgvector / pgvector-rs Service +# (only used when VECTOR_STORE is pgvector / pgvector-rs) +# ------------------------------ +PGVECTOR_PGUSER=postgres +# The password for the default postgres user. +PGVECTOR_POSTGRES_PASSWORD=difyai123456 +# The name of the default postgres database. +PGVECTOR_POSTGRES_DB=dify +# postgres data directory +PGVECTOR_PGDATA=/var/lib/postgresql/data/pgdata + +# ------------------------------ +# Environment Variables for opensearch +# (only used when VECTOR_STORE is opensearch) +# ------------------------------ +OPENSEARCH_DISCOVERY_TYPE=single-node +OPENSEARCH_BOOTSTRAP_MEMORY_LOCK=true +OPENSEARCH_JAVA_OPTS_MIN=512m +OPENSEARCH_JAVA_OPTS_MAX=1024m +OPENSEARCH_INITIAL_ADMIN_PASSWORD=Qazwsxedc!@#123 +OPENSEARCH_MEMLOCK_SOFT=-1 +OPENSEARCH_MEMLOCK_HARD=-1 +OPENSEARCH_NOFILE_SOFT=65536 +OPENSEARCH_NOFILE_HARD=65536 + +# ------------------------------ +# Environment Variables for Nginx reverse proxy +# ------------------------------ +NGINX_SERVER_NAME=_ +NGINX_HTTPS_ENABLED=false +# HTTP port +NGINX_PORT=80 +# SSL settings are only applied when HTTPS_ENABLED is true +NGINX_SSL_PORT=443 +# if HTTPS_ENABLED is true, you're required to add your own SSL certificates/keys to the `./nginx/ssl` directory +# and modify the env vars below accordingly. +NGINX_SSL_CERT_FILENAME=dify.crt +NGINX_SSL_CERT_KEY_FILENAME=dify.key +NGINX_SSL_PROTOCOLS=TLSv1.1 TLSv1.2 TLSv1.3 + +# Nginx performance tuning +NGINX_WORKER_PROCESSES=auto +NGINX_CLIENT_MAX_BODY_SIZE=15M +NGINX_KEEPALIVE_TIMEOUT=65 + +# Proxy settings +NGINX_PROXY_READ_TIMEOUT=3600s +NGINX_PROXY_SEND_TIMEOUT=3600s + +# Set true to accept requests for /.well-known/acme-challenge/ +NGINX_ENABLE_CERTBOT_CHALLENGE=false + +# ------------------------------ +# Certbot Configuration +# ------------------------------ + +# Email address (required to get certificates from Let's Encrypt) +CERTBOT_EMAIL=your_email@example.com + +# Domain name +CERTBOT_DOMAIN=your_domain.com + +# certbot command options +# i.e: --force-renewal --dry-run --test-cert --debug +CERTBOT_OPTIONS= + +# ------------------------------ +# Environment Variables for SSRF Proxy +# ------------------------------ +SSRF_HTTP_PORT=3128 +SSRF_COREDUMP_DIR=/var/spool/squid +SSRF_REVERSE_PROXY_PORT=8194 +SSRF_SANDBOX_HOST=sandbox +SSRF_DEFAULT_TIME_OUT=5 +SSRF_DEFAULT_CONNECT_TIME_OUT=5 +SSRF_DEFAULT_READ_TIME_OUT=5 +SSRF_DEFAULT_WRITE_TIME_OUT=5 + +# ------------------------------ +# docker env var for specifying vector db type at startup +# (based on the vector db type, the corresponding docker +# compose profile will be used) +# if you want to use unstructured, add ',unstructured' to the end +# ------------------------------ +COMPOSE_PROFILES=${VECTOR_STORE:-weaviate} + +# ------------------------------ +# Docker Compose Service Expose Host Port Configurations +# ------------------------------ +EXPOSE_NGINX_PORT=80 +EXPOSE_NGINX_SSL_PORT=443 + +# ---------------------------------------------------------------------------- +# ModelProvider & Tool Position Configuration +# Used to specify the model providers and tools that can be used in the app. +# ---------------------------------------------------------------------------- + +# Pin, include, and exclude tools +# Use comma-separated values with no spaces between items. +# Example: POSITION_TOOL_PINS=bing,google +POSITION_TOOL_PINS= +POSITION_TOOL_INCLUDES= +POSITION_TOOL_EXCLUDES= + +# Pin, include, and exclude model providers +# Use comma-separated values with no spaces between items. +# Example: POSITION_PROVIDER_PINS=openai,openllm +POSITION_PROVIDER_PINS= +POSITION_PROVIDER_INCLUDES= +POSITION_PROVIDER_EXCLUDES= + +# CSP https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP +CSP_WHITELIST= + +# Enable or disable create tidb service job +CREATE_TIDB_SERVICE_JOB_ENABLED=false + +# Maximum number of submitted thread count in a ThreadPool for parallel node execution +MAX_SUBMIT_COUNT=100 + +# The maximum number of top-k value for RAG. +TOP_K_MAX_VALUE=10 diff --git a/apps/dify/0.15.3/envs/global.env b/apps/dify/0.15.3/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/apps/dify/0.15.3/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/apps/dify/0.15.3/scripts/init.sh b/apps/dify/0.15.3/scripts/init.sh new file mode 100644 index 000000000..2f4cc2a26 --- /dev/null +++ b/apps/dify/0.15.3/scripts/init.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + echo "APP_ENV_FILE=${CURRENT_DIR}/envs/dify.env" >> .env + + # setup-2 update dir permissions + mkdir -p "$DIFY_ROOT_PATH" + + cp -r conf/. "$DIFY_ROOT_PATH/" + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/dify/0.15.3/scripts/uninstall.sh b/apps/dify/0.15.3/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/dify/0.15.3/scripts/uninstall.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/dify/0.15.3/scripts/upgrade.sh b/apps/dify/0.15.3/scripts/upgrade.sh new file mode 100644 index 000000000..2bf20e996 --- /dev/null +++ b/apps/dify/0.15.3/scripts/upgrade.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + echo "APP_ENV_FILE=${CURRENT_DIR}/envs/dify.env" >> .env + + # setup-2 update dir permissions + mkdir -p "$DIFY_ROOT_PATH" + + if [ -d "conf" ]; then + find conf -type f | while read -r file; do + dest="$DIFY_ROOT_PATH/${file#conf/}" + if [ ! -e "$dest" ]; then + mkdir -p "$(dirname "$dest")" + cp "$file" "$dest" + fi + done + echo "Conf files copied to $DIFY_ROOT_PATH." + else + echo "Warning: conf directory not found." + fi + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/dify/README.md b/apps/dify/README.md new file mode 100644 index 000000000..80b39160d --- /dev/null +++ b/apps/dify/README.md @@ -0,0 +1,121 @@ +# Dify + +Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等,让您可以快速从原型到生产 + +![Dify](https://file.lifebus.top/imgs/dify_cover.png) + +![](https://img.shields.io/badge/%E6%96%B0%E7%96%86%E8%90%8C%E6%A3%AE%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E5%AE%A4-%E6%8F%90%E4%BE%9B%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81-blue) + +## 简介 + +### 工作流 + +在画布上构建和测试功能强大的 AI 工作流程,利用以下所有功能以及更多功能 + +### 全面的模型支持 + +与数百种专有/开源 LLMs 以及数十种推理提供商和自托管解决方案无缝集成,涵盖 GPT、Mistral、Llama3 以及任何与 OpenAI API 兼容的模型 + +### Prompt IDE + +用于制作提示、比较模型性能以及向基于聊天的应用程序添加其他功能(如文本转语音)的直观界面 + +### RAG Pipeline + +广泛的 RAG 功能,涵盖从文档摄入到检索的所有内容,支持从 PDF、PPT 和其他常见文档格式中提取文本的开箱即用的支持 + +### Agent 智能体 + +您可以基于 LLM 函数调用或 ReAct 定义 Agent,并为 Agent 添加预构建或自定义工具。Dify 为 AI Agent +提供了50多种内置工具,如谷歌搜索、DALL·E、Stable Diffusion 和 WolframAlpha 等 + +### LLMOps + +随时间监视和分析应用程序日志和性能。您可以根据生产数据和标注持续改进提示、数据集和模型 + +### 后端即服务 + +所有 Dify 的功能都带有相应的 API,因此您可以轻松地将 Dify 集成到自己的业务逻辑中 + +## 功能比较 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
功能Dify.AILangChainFlowiseOpenAI Assistant API
编程方法API + 应用程序导向Python 代码应用程序导向API 导向
支持的 LLMs丰富多样丰富多样丰富多样仅限 OpenAI
RAG引擎
Agent
工作流
可观测性
企业功能(SSO/访问控制)
本地部署
+ +## 安装说明 + +在安装 Dify 之前,请确保您的机器满足以下最低系统要求: + ++ CPU >= 2 Core ++ RAM >= 4 GiB + +## 修改配置 + +应用安装后,如有需要的配置,请修改应用目录下的 `.env` 文件 + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/apps/dify/data.yml b/apps/dify/data.yml new file mode 100644 index 000000000..5f2192304 --- /dev/null +++ b/apps/dify/data.yml @@ -0,0 +1,14 @@ +additionalProperties: + key: dify + name: Dify + tags: + - WebSite + - Local + shortDescZh: Dify 是一个开源的 LLM 应用开发平台 + shortDescEn: Dify is an open-source LLM application development platform + type: website + crossVersionUpdate: true + limit: 0 + website: https://dify.ai/ + github: https://github.com/langgenius/dify/ + document: https://docs.dify.ai/ diff --git a/apps/dify/logo.png b/apps/dify/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..82eaea8a569d693bcb79e0fbe45ab7ce5522213e GIT binary patch literal 42235 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 C^G4=g8whK>DLm`q& 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 L0yWCj9bf(rj=nqe literal 0 HcmV?d00001 diff --git a/envs/dify/dify.env b/envs/dify/dify.env new file mode 100644 index 000000000..3bc79059d --- /dev/null +++ b/envs/dify/dify.env @@ -0,0 +1,938 @@ +# ------------------------------ +# Environment Variables for API service & worker +# ------------------------------ + +# ------------------------------ +# Common Variables +# ------------------------------ + +# The backend URL of the console API, +# used to concatenate the authorization callback. +# If empty, it is the same domain. +# Example: https://api.console.dify.ai +CONSOLE_API_URL= + +# The front-end URL of the console web, +# used to concatenate some front-end addresses and for CORS configuration use. +# If empty, it is the same domain. +# Example: https://console.dify.ai +CONSOLE_WEB_URL= + +# Service API Url, +# used to display Service API Base Url to the front-end. +# If empty, it is the same domain. +# Example: https://api.dify.ai +SERVICE_API_URL= + +# WebApp API backend Url, +# used to declare the back-end URL for the front-end API. +# If empty, it is the same domain. +# Example: https://api.app.dify.ai +APP_API_URL= + +# WebApp Url, +# used to display WebAPP API Base Url to the front-end. +# If empty, it is the same domain. +# Example: https://app.dify.ai +APP_WEB_URL= + +# File preview or download Url prefix. +# used to display File preview or download Url to the front-end or as Multi-model inputs; +# Url is signed and has expiration time. +FILES_URL= + +# ------------------------------ +# Server Configuration +# ------------------------------ + +# The log level for the application. +# Supported values are `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` +LOG_LEVEL=INFO +# Log file path +LOG_FILE=/app/logs/server.log +# Log file max size, the unit is MB +LOG_FILE_MAX_SIZE=20 +# Log file max backup count +LOG_FILE_BACKUP_COUNT=5 +# Log dateformat +LOG_DATEFORMAT=%Y-%m-%d %H:%M:%S +# Log Timezone +LOG_TZ=UTC + +# Debug mode, default is false. +# It is recommended to turn on this configuration for local development +# to prevent some problems caused by monkey patch. +DEBUG=false + +# Flask debug mode, it can output trace information at the interface when turned on, +# which is convenient for debugging. +FLASK_DEBUG=false + +# A secretkey that is used for securely signing the session cookie +# and encrypting sensitive information on the database. +# You can generate a strong key using `openssl rand -base64 42`. +SECRET_KEY=sk-9f73s3ljTXVcMT3Blb3ljTqtsKiGHXVcMT3BlbkFJLK7U + +# Password for admin user initialization. +# If left unset, admin user will not be prompted for a password +# when creating the initial admin account. +# The length of the password cannot exceed 30 charactors. +INIT_PASSWORD= + +# Deployment environment. +# Supported values are `PRODUCTION`, `TESTING`. Default is `PRODUCTION`. +# Testing environment. There will be a distinct color label on the front-end page, +# indicating that this environment is a testing environment. +DEPLOY_ENV=PRODUCTION + +# Whether to enable the version check policy. +# If set to empty, https://updates.dify.ai will be called for version check. +CHECK_UPDATE_URL=https://updates.dify.ai + +# Used to change the OpenAI base address, default is https://api.openai.com/v1. +# When OpenAI cannot be accessed in China, replace it with a domestic mirror address, +# or when a local model provides OpenAI compatible API, it can be replaced. +OPENAI_API_BASE=https://api.openai.com/v1 + +# When enabled, migrations will be executed prior to application startup +# and the application will start after the migrations have completed. +MIGRATION_ENABLED=true + +# File Access Time specifies a time interval in seconds for the file to be accessed. +# The default value is 300 seconds. +FILES_ACCESS_TIMEOUT=300 + +# Access token expiration time in minutes +ACCESS_TOKEN_EXPIRE_MINUTES=60 + +# Refresh token expiration time in days +REFRESH_TOKEN_EXPIRE_DAYS=30 + +# The maximum number of active requests for the application, where 0 means unlimited, should be a non-negative integer. +APP_MAX_ACTIVE_REQUESTS=0 +APP_MAX_EXECUTION_TIME=1200 + +# ------------------------------ +# Container Startup Related Configuration +# Only effective when starting with docker image or docker-compose. +# ------------------------------ + +# API service binding address, default: 0.0.0.0, i.e., all addresses can be accessed. +DIFY_BIND_ADDRESS=0.0.0.0 + +# API service binding port number, default 5001. +DIFY_PORT=5001 + +# The number of API server workers, i.e., the number of workers. +# Formula: number of cpu cores x 2 + 1 for sync, 1 for Gevent +# Reference: https://docs.gunicorn.org/en/stable/design.html#how-many-workers +SERVER_WORKER_AMOUNT=1 + +# Defaults to gevent. If using windows, it can be switched to sync or solo. +SERVER_WORKER_CLASS=gevent + +# Default number of worker connections, the default is 10. +SERVER_WORKER_CONNECTIONS=10 + +# Similar to SERVER_WORKER_CLASS. +# If using windows, it can be switched to sync or solo. +CELERY_WORKER_CLASS= + +# Request handling timeout. The default is 200, +# it is recommended to set it to 360 to support a longer sse connection time. +GUNICORN_TIMEOUT=360 + +# The number of Celery workers. The default is 1, and can be set as needed. +CELERY_WORKER_AMOUNT= + +# Flag indicating whether to enable autoscaling of Celery workers. +# +# Autoscaling is useful when tasks are CPU intensive and can be dynamically +# allocated and deallocated based on the workload. +# +# When autoscaling is enabled, the maximum and minimum number of workers can +# be specified. The autoscaling algorithm will dynamically adjust the number +# of workers within the specified range. +# +# Default is false (i.e., autoscaling is disabled). +# +# Example: +# CELERY_AUTO_SCALE=true +CELERY_AUTO_SCALE=false + +# The maximum number of Celery workers that can be autoscaled. +# This is optional and only used when autoscaling is enabled. +# Default is not set. +CELERY_MAX_WORKERS= + +# The minimum number of Celery workers that can be autoscaled. +# This is optional and only used when autoscaling is enabled. +# Default is not set. +CELERY_MIN_WORKERS= + +# API Tool configuration +API_TOOL_DEFAULT_CONNECT_TIMEOUT=10 +API_TOOL_DEFAULT_READ_TIMEOUT=60 + + +# ------------------------------ +# Database Configuration +# The database uses PostgreSQL. Please use the public schema. +# It is consistent with the configuration in the 'db' service below. +# ------------------------------ + +DB_USERNAME=postgres +DB_PASSWORD=difyai123456 +DB_HOST=db +DB_PORT=5432 +DB_DATABASE=dify +# The size of the database connection pool. +# The default is 30 connections, which can be appropriately increased. +SQLALCHEMY_POOL_SIZE=30 +# Database connection pool recycling time, the default is 3600 seconds. +SQLALCHEMY_POOL_RECYCLE=3600 +# Whether to print SQL, default is false. +SQLALCHEMY_ECHO=false + +# Maximum number of connections to the database +# Default is 100 +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-connection.html#GUC-MAX-CONNECTIONS +POSTGRES_MAX_CONNECTIONS=100 + +# Sets the amount of shared memory used for postgres's shared buffers. +# Default is 128MB +# Recommended value: 25% of available memory +# Reference: https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-SHARED-BUFFERS +POSTGRES_SHARED_BUFFERS=128MB + +# Sets the amount of memory used by each database worker for working space. +# Default is 4MB +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-WORK-MEM +POSTGRES_WORK_MEM=4MB + +# Sets the amount of memory reserved for maintenance activities. +# Default is 64MB +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-MAINTENANCE-WORK-MEM +POSTGRES_MAINTENANCE_WORK_MEM=64MB + +# Sets the planner's assumption about the effective cache size. +# Default is 4096MB +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-query.html#GUC-EFFECTIVE-CACHE-SIZE +POSTGRES_EFFECTIVE_CACHE_SIZE=4096MB + +# ------------------------------ +# Redis Configuration +# This Redis configuration is used for caching and for pub/sub during conversation. +# ------------------------------ + +REDIS_HOST=redis +REDIS_PORT=6379 +REDIS_USERNAME= +REDIS_PASSWORD=difyai123456 +REDIS_USE_SSL=false +REDIS_DB=0 + +# Whether to use Redis Sentinel mode. +# If set to true, the application will automatically discover and connect to the master node through Sentinel. +REDIS_USE_SENTINEL=false + +# List of Redis Sentinel nodes. If Sentinel mode is enabled, provide at least one Sentinel IP and port. +# Format: `:,:,:` +REDIS_SENTINELS= +REDIS_SENTINEL_SERVICE_NAME= +REDIS_SENTINEL_USERNAME= +REDIS_SENTINEL_PASSWORD= +REDIS_SENTINEL_SOCKET_TIMEOUT=0.1 + +# List of Redis Cluster nodes. If Cluster mode is enabled, provide at least one Cluster IP and port. +# Format: `:,:,:` +REDIS_USE_CLUSTERS=false +REDIS_CLUSTERS= +REDIS_CLUSTERS_PASSWORD= + +# ------------------------------ +# Celery Configuration +# ------------------------------ + +# Use redis as the broker, and redis db 1 for celery broker. +# Format as follows: `redis://:@:/` +# Example: redis://:difyai123456@redis:6379/1 +# If use Redis Sentinel, format as follows: `sentinel://:@:/` +# Example: sentinel://localhost:26379/1;sentinel://localhost:26380/1;sentinel://localhost:26381/1 +CELERY_BROKER_URL=redis://:difyai123456@redis:6379/1 +BROKER_USE_SSL=false + +# If you are using Redis Sentinel for high availability, configure the following settings. +CELERY_USE_SENTINEL=false +CELERY_SENTINEL_MASTER_NAME= +CELERY_SENTINEL_SOCKET_TIMEOUT=0.1 + +# ------------------------------ +# CORS Configuration +# Used to set the front-end cross-domain access policy. +# ------------------------------ + +# Specifies the allowed origins for cross-origin requests to the Web API, +# e.g. https://dify.app or * for all origins. +WEB_API_CORS_ALLOW_ORIGINS=* + +# Specifies the allowed origins for cross-origin requests to the console API, +# e.g. https://cloud.dify.ai or * for all origins. +CONSOLE_CORS_ALLOW_ORIGINS=* + +# ------------------------------ +# File Storage Configuration +# ------------------------------ + +# The type of storage to use for storing user files. +STORAGE_TYPE=opendal + +# Apache OpenDAL Configuration +# The configuration for OpenDAL consists of the following format: OPENDAL__. +# You can find all the service configurations (CONFIG_NAME) in the repository at: https://github.com/apache/opendal/tree/main/core/src/services. +# Dify will scan configurations starting with OPENDAL_ and automatically apply them. +# The scheme name for the OpenDAL storage. +OPENDAL_SCHEME=fs +# Configurations for OpenDAL Local File System. +OPENDAL_FS_ROOT=storage + +# S3 Configuration +# +S3_ENDPOINT= +S3_REGION=us-east-1 +S3_BUCKET_NAME=difyai +S3_ACCESS_KEY= +S3_SECRET_KEY= +# Whether to use AWS managed IAM roles for authenticating with the S3 service. +# If set to false, the access key and secret key must be provided. +S3_USE_AWS_MANAGED_IAM=false + +# Azure Blob Configuration +# +AZURE_BLOB_ACCOUNT_NAME=difyai +AZURE_BLOB_ACCOUNT_KEY=difyai +AZURE_BLOB_CONTAINER_NAME=difyai-container +AZURE_BLOB_ACCOUNT_URL=https://.blob.core.windows.net + +# Google Storage Configuration +# +GOOGLE_STORAGE_BUCKET_NAME=your-bucket-name +GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64= + +# The Alibaba Cloud OSS configurations, +# +ALIYUN_OSS_BUCKET_NAME=your-bucket-name +ALIYUN_OSS_ACCESS_KEY=your-access-key +ALIYUN_OSS_SECRET_KEY=your-secret-key +ALIYUN_OSS_ENDPOINT=https://oss-ap-southeast-1-internal.aliyuncs.com +ALIYUN_OSS_REGION=ap-southeast-1 +ALIYUN_OSS_AUTH_VERSION=v4 +# Don't start with '/'. OSS doesn't support leading slash in object names. +ALIYUN_OSS_PATH=your-path + +# Tencent COS Configuration +# +TENCENT_COS_BUCKET_NAME=your-bucket-name +TENCENT_COS_SECRET_KEY=your-secret-key +TENCENT_COS_SECRET_ID=your-secret-id +TENCENT_COS_REGION=your-region +TENCENT_COS_SCHEME=your-scheme + +# Oracle Storage Configuration +# +OCI_ENDPOINT=https://objectstorage.us-ashburn-1.oraclecloud.com +OCI_BUCKET_NAME=your-bucket-name +OCI_ACCESS_KEY=your-access-key +OCI_SECRET_KEY=your-secret-key +OCI_REGION=us-ashburn-1 + +# Huawei OBS Configuration +# +HUAWEI_OBS_BUCKET_NAME=your-bucket-name +HUAWEI_OBS_SECRET_KEY=your-secret-key +HUAWEI_OBS_ACCESS_KEY=your-access-key +HUAWEI_OBS_SERVER=your-server-url + +# Volcengine TOS Configuration +# +VOLCENGINE_TOS_BUCKET_NAME=your-bucket-name +VOLCENGINE_TOS_SECRET_KEY=your-secret-key +VOLCENGINE_TOS_ACCESS_KEY=your-access-key +VOLCENGINE_TOS_ENDPOINT=your-server-url +VOLCENGINE_TOS_REGION=your-region + +# Baidu OBS Storage Configuration +# +BAIDU_OBS_BUCKET_NAME=your-bucket-name +BAIDU_OBS_SECRET_KEY=your-secret-key +BAIDU_OBS_ACCESS_KEY=your-access-key +BAIDU_OBS_ENDPOINT=your-server-url + +# Supabase Storage Configuration +# +SUPABASE_BUCKET_NAME=your-bucket-name +SUPABASE_API_KEY=your-access-key +SUPABASE_URL=your-server-url + +# ------------------------------ +# Vector Database Configuration +# ------------------------------ + +# The type of vector store to use. +# Supported values are `weaviate`, `qdrant`, `milvus`, `myscale`, `relyt`, `pgvector`, `pgvecto-rs`, `chroma`, `opensearch`, `tidb_vector`, `oracle`, `tencent`, `elasticsearch`, `elasticsearch-ja`, `analyticdb`, `couchbase`, `vikingdb`, `oceanbase`. +VECTOR_STORE=weaviate + +# The Weaviate endpoint URL. Only available when VECTOR_STORE is `weaviate`. +WEAVIATE_ENDPOINT=http://weaviate:8080 +WEAVIATE_API_KEY=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih + +# The Qdrant endpoint URL. Only available when VECTOR_STORE is `qdrant`. +QDRANT_URL=http://qdrant:6333 +QDRANT_API_KEY=difyai123456 +QDRANT_CLIENT_TIMEOUT=20 +QDRANT_GRPC_ENABLED=false +QDRANT_GRPC_PORT=6334 + +# Milvus configuration Only available when VECTOR_STORE is `milvus`. +# The milvus uri. +MILVUS_URI=http://127.0.0.1:19530 +MILVUS_TOKEN= +MILVUS_USER=root +MILVUS_PASSWORD=Milvus +MILVUS_ENABLE_HYBRID_SEARCH=False + +# MyScale configuration, only available when VECTOR_STORE is `myscale` +# For multi-language support, please set MYSCALE_FTS_PARAMS with referring to: +# https://myscale.com/docs/en/text-search/#understanding-fts-index-parameters +MYSCALE_HOST=myscale +MYSCALE_PORT=8123 +MYSCALE_USER=default +MYSCALE_PASSWORD= +MYSCALE_DATABASE=dify +MYSCALE_FTS_PARAMS= + +# Couchbase configurations, only available when VECTOR_STORE is `couchbase` +# The connection string must include hostname defined in the docker-compose file (couchbase-server in this case) +COUCHBASE_CONNECTION_STRING=couchbase://couchbase-server +COUCHBASE_USER=Administrator +COUCHBASE_PASSWORD=password +COUCHBASE_BUCKET_NAME=Embeddings +COUCHBASE_SCOPE_NAME=_default + +# pgvector configurations, only available when VECTOR_STORE is `pgvector` +PGVECTOR_HOST=pgvector +PGVECTOR_PORT=5432 +PGVECTOR_USER=postgres +PGVECTOR_PASSWORD=difyai123456 +PGVECTOR_DATABASE=dify +PGVECTOR_MIN_CONNECTION=1 +PGVECTOR_MAX_CONNECTION=5 + +# pgvecto-rs configurations, only available when VECTOR_STORE is `pgvecto-rs` +PGVECTO_RS_HOST=pgvecto-rs +PGVECTO_RS_PORT=5432 +PGVECTO_RS_USER=postgres +PGVECTO_RS_PASSWORD=difyai123456 +PGVECTO_RS_DATABASE=dify + +# analyticdb configurations, only available when VECTOR_STORE is `analyticdb` +ANALYTICDB_KEY_ID=your-ak +ANALYTICDB_KEY_SECRET=your-sk +ANALYTICDB_REGION_ID=cn-hangzhou +ANALYTICDB_INSTANCE_ID=gp-ab123456 +ANALYTICDB_ACCOUNT=testaccount +ANALYTICDB_PASSWORD=testpassword +ANALYTICDB_NAMESPACE=dify +ANALYTICDB_NAMESPACE_PASSWORD=difypassword +ANALYTICDB_HOST=gp-test.aliyuncs.com +ANALYTICDB_PORT=5432 +ANALYTICDB_MIN_CONNECTION=1 +ANALYTICDB_MAX_CONNECTION=5 + +# TiDB vector configurations, only available when VECTOR_STORE is `tidb` +TIDB_VECTOR_HOST=tidb +TIDB_VECTOR_PORT=4000 +TIDB_VECTOR_USER= +TIDB_VECTOR_PASSWORD= +TIDB_VECTOR_DATABASE=dify + +# Tidb on qdrant configuration, only available when VECTOR_STORE is `tidb_on_qdrant` +TIDB_ON_QDRANT_URL=http://127.0.0.1 +TIDB_ON_QDRANT_API_KEY=dify +TIDB_ON_QDRANT_CLIENT_TIMEOUT=20 +TIDB_ON_QDRANT_GRPC_ENABLED=false +TIDB_ON_QDRANT_GRPC_PORT=6334 +TIDB_PUBLIC_KEY=dify +TIDB_PRIVATE_KEY=dify +TIDB_API_URL=http://127.0.0.1 +TIDB_IAM_API_URL=http://127.0.0.1 +TIDB_REGION=regions/aws-us-east-1 +TIDB_PROJECT_ID=dify +TIDB_SPEND_LIMIT=100 + +# Chroma configuration, only available when VECTOR_STORE is `chroma` +CHROMA_HOST=127.0.0.1 +CHROMA_PORT=8000 +CHROMA_TENANT=default_tenant +CHROMA_DATABASE=default_database +CHROMA_AUTH_PROVIDER=chromadb.auth.token_authn.TokenAuthClientProvider +CHROMA_AUTH_CREDENTIALS= + +# Oracle configuration, only available when VECTOR_STORE is `oracle` +ORACLE_HOST=oracle +ORACLE_PORT=1521 +ORACLE_USER=dify +ORACLE_PASSWORD=dify +ORACLE_DATABASE=FREEPDB1 + +# relyt configurations, only available when VECTOR_STORE is `relyt` +RELYT_HOST=db +RELYT_PORT=5432 +RELYT_USER=postgres +RELYT_PASSWORD=difyai123456 +RELYT_DATABASE=postgres + +# open search configuration, only available when VECTOR_STORE is `opensearch` +OPENSEARCH_HOST=opensearch +OPENSEARCH_PORT=9200 +OPENSEARCH_USER=admin +OPENSEARCH_PASSWORD=admin +OPENSEARCH_SECURE=true + +# tencent vector configurations, only available when VECTOR_STORE is `tencent` +TENCENT_VECTOR_DB_URL=http://127.0.0.1 +TENCENT_VECTOR_DB_API_KEY=dify +TENCENT_VECTOR_DB_TIMEOUT=30 +TENCENT_VECTOR_DB_USERNAME=dify +TENCENT_VECTOR_DB_DATABASE=dify +TENCENT_VECTOR_DB_SHARD=1 +TENCENT_VECTOR_DB_REPLICAS=2 + +# ElasticSearch configuration, only available when VECTOR_STORE is `elasticsearch` +ELASTICSEARCH_HOST=0.0.0.0 +ELASTICSEARCH_PORT=9200 +ELASTICSEARCH_USERNAME=elastic +ELASTICSEARCH_PASSWORD=elastic +KIBANA_PORT=5601 + +# baidu vector configurations, only available when VECTOR_STORE is `baidu` +BAIDU_VECTOR_DB_ENDPOINT=http://127.0.0.1:5287 +BAIDU_VECTOR_DB_CONNECTION_TIMEOUT_MS=30000 +BAIDU_VECTOR_DB_ACCOUNT=root +BAIDU_VECTOR_DB_API_KEY=dify +BAIDU_VECTOR_DB_DATABASE=dify +BAIDU_VECTOR_DB_SHARD=1 +BAIDU_VECTOR_DB_REPLICAS=3 + +# VikingDB configurations, only available when VECTOR_STORE is `vikingdb` +VIKINGDB_ACCESS_KEY=your-ak +VIKINGDB_SECRET_KEY=your-sk +VIKINGDB_REGION=cn-shanghai +VIKINGDB_HOST=api-vikingdb.xxx.volces.com +VIKINGDB_SCHEMA=http +VIKINGDB_CONNECTION_TIMEOUT=30 +VIKINGDB_SOCKET_TIMEOUT=30 + +# Lindorm configuration, only available when VECTOR_STORE is `lindorm` +LINDORM_URL=http://lindorm:30070 +LINDORM_USERNAME=lindorm +LINDORM_PASSWORD=lindorm + +# OceanBase Vector configuration, only available when VECTOR_STORE is `oceanbase` +OCEANBASE_VECTOR_HOST=oceanbase +OCEANBASE_VECTOR_PORT=2881 +OCEANBASE_VECTOR_USER=root@test +OCEANBASE_VECTOR_PASSWORD=difyai123456 +OCEANBASE_VECTOR_DATABASE=test +OCEANBASE_CLUSTER_NAME=difyai +OCEANBASE_MEMORY_LIMIT=6G + +# Upstash Vector configuration, only available when VECTOR_STORE is `upstash` +UPSTASH_VECTOR_URL=https://xxx-vector.upstash.io +UPSTASH_VECTOR_TOKEN=dify + +# ------------------------------ +# Knowledge Configuration +# ------------------------------ + +# Upload file size limit, default 15M. +UPLOAD_FILE_SIZE_LIMIT=15 + +# The maximum number of files that can be uploaded at a time, default 5. +UPLOAD_FILE_BATCH_LIMIT=5 + +# ETL type, support: `dify`, `Unstructured` +# `dify` Dify's proprietary file extraction scheme +# `Unstructured` Unstructured.io file extraction scheme +ETL_TYPE=dify + +# Unstructured API path and API key, needs to be configured when ETL_TYPE is Unstructured +# Or using Unstructured for document extractor node for pptx. +# For example: http://unstructured:8000/general/v0/general +UNSTRUCTURED_API_URL= +UNSTRUCTURED_API_KEY= +SCARF_NO_ANALYTICS=true + +# ------------------------------ +# Model Configuration +# ------------------------------ + +# The maximum number of tokens allowed for prompt generation. +# This setting controls the upper limit of tokens that can be used by the LLM +# when generating a prompt in the prompt generation tool. +# Default: 512 tokens. +PROMPT_GENERATION_MAX_TOKENS=512 + +# The maximum number of tokens allowed for code generation. +# This setting controls the upper limit of tokens that can be used by the LLM +# when generating code in the code generation tool. +# Default: 1024 tokens. +CODE_GENERATION_MAX_TOKENS=1024 + +# ------------------------------ +# Multi-modal Configuration +# ------------------------------ + +# The format of the image/video/audio/document sent when the multi-modal model is input, +# the default is base64, optional url. +# The delay of the call in url mode will be lower than that in base64 mode. +# It is generally recommended to use the more compatible base64 mode. +# If configured as url, you need to configure FILES_URL as an externally accessible address so that the multi-modal model can access the image/video/audio/document. +MULTIMODAL_SEND_FORMAT=base64 +# Upload image file size limit, default 10M. +UPLOAD_IMAGE_FILE_SIZE_LIMIT=10 +# Upload video file size limit, default 100M. +UPLOAD_VIDEO_FILE_SIZE_LIMIT=100 +# Upload audio file size limit, default 50M. +UPLOAD_AUDIO_FILE_SIZE_LIMIT=50 + +# ------------------------------ +# Sentry Configuration +# Used for application monitoring and error log tracking. +# ------------------------------ +SENTRY_DSN= + +# API Service Sentry DSN address, default is empty, when empty, +# all monitoring information is not reported to Sentry. +# If not set, Sentry error reporting will be disabled. +API_SENTRY_DSN= +# API Service The reporting ratio of Sentry events, if it is 0.01, it is 1%. +API_SENTRY_TRACES_SAMPLE_RATE=1.0 +# API Service The reporting ratio of Sentry profiles, if it is 0.01, it is 1%. +API_SENTRY_PROFILES_SAMPLE_RATE=1.0 + +# Web Service Sentry DSN address, default is empty, when empty, +# all monitoring information is not reported to Sentry. +# If not set, Sentry error reporting will be disabled. +WEB_SENTRY_DSN= + +# ------------------------------ +# Notion Integration Configuration +# Variables can be obtained by applying for Notion integration: https://www.notion.so/my-integrations +# ------------------------------ + +# Configure as "public" or "internal". +# Since Notion's OAuth redirect URL only supports HTTPS, +# if deploying locally, please use Notion's internal integration. +NOTION_INTEGRATION_TYPE=public +# Notion OAuth client secret (used for public integration type) +NOTION_CLIENT_SECRET= +# Notion OAuth client id (used for public integration type) +NOTION_CLIENT_ID= +# Notion internal integration secret. +# If the value of NOTION_INTEGRATION_TYPE is "internal", +# you need to configure this variable. +NOTION_INTERNAL_SECRET= + +# ------------------------------ +# Mail related configuration +# ------------------------------ + +# Mail type, support: resend, smtp +MAIL_TYPE=resend + +# Default send from email address, if not specified +MAIL_DEFAULT_SEND_FROM= + +# API-Key for the Resend email provider, used when MAIL_TYPE is `resend`. +RESEND_API_URL=https://api.resend.com +RESEND_API_KEY=your-resend-api-key + + +# SMTP server configuration, used when MAIL_TYPE is `smtp` +SMTP_SERVER= +SMTP_PORT=465 +SMTP_USERNAME= +SMTP_PASSWORD= +SMTP_USE_TLS=true +SMTP_OPPORTUNISTIC_TLS=false + +# ------------------------------ +# Others Configuration +# ------------------------------ + +# Maximum length of segmentation tokens for indexing +INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=4000 + +# Member invitation link valid time (hours), +# Default: 72. +INVITE_EXPIRY_HOURS=72 + +# Reset password token valid time (minutes), +RESET_PASSWORD_TOKEN_EXPIRY_MINUTES=5 + +# The sandbox service endpoint. +CODE_EXECUTION_ENDPOINT=http://sandbox:8194 +CODE_EXECUTION_API_KEY=dify-sandbox +CODE_MAX_NUMBER=9223372036854775807 +CODE_MIN_NUMBER=-9223372036854775808 +CODE_MAX_DEPTH=5 +CODE_MAX_PRECISION=20 +CODE_MAX_STRING_LENGTH=80000 +CODE_MAX_STRING_ARRAY_LENGTH=30 +CODE_MAX_OBJECT_ARRAY_LENGTH=30 +CODE_MAX_NUMBER_ARRAY_LENGTH=1000 +CODE_EXECUTION_CONNECT_TIMEOUT=10 +CODE_EXECUTION_READ_TIMEOUT=60 +CODE_EXECUTION_WRITE_TIMEOUT=10 +TEMPLATE_TRANSFORM_MAX_LENGTH=80000 + +# Workflow runtime configuration +WORKFLOW_MAX_EXECUTION_STEPS=500 +WORKFLOW_MAX_EXECUTION_TIME=1200 +WORKFLOW_CALL_MAX_DEPTH=5 +MAX_VARIABLE_SIZE=204800 +WORKFLOW_PARALLEL_DEPTH_LIMIT=3 +WORKFLOW_FILE_UPLOAD_LIMIT=10 + +# HTTP request node in workflow configuration +HTTP_REQUEST_NODE_MAX_BINARY_SIZE=10485760 +HTTP_REQUEST_NODE_MAX_TEXT_SIZE=1048576 + +# SSRF Proxy server HTTP URL +SSRF_PROXY_HTTP_URL=http://ssrf_proxy:3128 +# SSRF Proxy server HTTPS URL +SSRF_PROXY_HTTPS_URL=http://ssrf_proxy:3128 + +# ------------------------------ +# Environment Variables for web Service +# ------------------------------ + +# The timeout for the text generation in millisecond +TEXT_GENERATION_TIMEOUT_MS=60000 + +# ------------------------------ +# Environment Variables for db Service +# ------------------------------ + +PGUSER=${DB_USERNAME} +# The password for the default postgres user. +POSTGRES_PASSWORD=${DB_PASSWORD} +# The name of the default postgres database. +POSTGRES_DB=${DB_DATABASE} +# postgres data directory +PGDATA=/var/lib/postgresql/data/pgdata + +# ------------------------------ +# Environment Variables for sandbox Service +# ------------------------------ + +# The API key for the sandbox service +SANDBOX_API_KEY=dify-sandbox +# The mode in which the Gin framework runs +SANDBOX_GIN_MODE=release +# The timeout for the worker in seconds +SANDBOX_WORKER_TIMEOUT=15 +# Enable network for the sandbox service +SANDBOX_ENABLE_NETWORK=true +# HTTP proxy URL for SSRF protection +SANDBOX_HTTP_PROXY=http://ssrf_proxy:3128 +# HTTPS proxy URL for SSRF protection +SANDBOX_HTTPS_PROXY=http://ssrf_proxy:3128 +# The port on which the sandbox service runs +SANDBOX_PORT=8194 + +# ------------------------------ +# Environment Variables for weaviate Service +# (only used when VECTOR_STORE is weaviate) +# ------------------------------ +WEAVIATE_PERSISTENCE_DATA_PATH=/var/lib/weaviate +WEAVIATE_QUERY_DEFAULTS_LIMIT=25 +WEAVIATE_AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true +WEAVIATE_DEFAULT_VECTORIZER_MODULE=none +WEAVIATE_CLUSTER_HOSTNAME=node1 +WEAVIATE_AUTHENTICATION_APIKEY_ENABLED=true +WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih +WEAVIATE_AUTHENTICATION_APIKEY_USERS=hello@dify.ai +WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED=true +WEAVIATE_AUTHORIZATION_ADMINLIST_USERS=hello@dify.ai + +# ------------------------------ +# Environment Variables for Chroma +# (only used when VECTOR_STORE is chroma) +# ------------------------------ + +# Authentication credentials for Chroma server +CHROMA_SERVER_AUTHN_CREDENTIALS=difyai123456 +# Authentication provider for Chroma server +CHROMA_SERVER_AUTHN_PROVIDER=chromadb.auth.token_authn.TokenAuthenticationServerProvider +# Persistence setting for Chroma server +CHROMA_IS_PERSISTENT=TRUE + +# ------------------------------ +# Environment Variables for Oracle Service +# (only used when VECTOR_STORE is Oracle) +# ------------------------------ +ORACLE_PWD=Dify123456 +ORACLE_CHARACTERSET=AL32UTF8 + +# ------------------------------ +# Environment Variables for milvus Service +# (only used when VECTOR_STORE is milvus) +# ------------------------------ +# ETCD configuration for auto compaction mode +ETCD_AUTO_COMPACTION_MODE=revision +# ETCD configuration for auto compaction retention in terms of number of revisions +ETCD_AUTO_COMPACTION_RETENTION=1000 +# ETCD configuration for backend quota in bytes +ETCD_QUOTA_BACKEND_BYTES=4294967296 +# ETCD configuration for the number of changes before triggering a snapshot +ETCD_SNAPSHOT_COUNT=50000 +# MinIO access key for authentication +MINIO_ACCESS_KEY=minioadmin +# MinIO secret key for authentication +MINIO_SECRET_KEY=minioadmin +# ETCD service endpoints +ETCD_ENDPOINTS=etcd:2379 +# MinIO service address +MINIO_ADDRESS=minio:9000 +# Enable or disable security authorization +MILVUS_AUTHORIZATION_ENABLED=true + +# ------------------------------ +# Environment Variables for pgvector / pgvector-rs Service +# (only used when VECTOR_STORE is pgvector / pgvector-rs) +# ------------------------------ +PGVECTOR_PGUSER=postgres +# The password for the default postgres user. +PGVECTOR_POSTGRES_PASSWORD=difyai123456 +# The name of the default postgres database. +PGVECTOR_POSTGRES_DB=dify +# postgres data directory +PGVECTOR_PGDATA=/var/lib/postgresql/data/pgdata + +# ------------------------------ +# Environment Variables for opensearch +# (only used when VECTOR_STORE is opensearch) +# ------------------------------ +OPENSEARCH_DISCOVERY_TYPE=single-node +OPENSEARCH_BOOTSTRAP_MEMORY_LOCK=true +OPENSEARCH_JAVA_OPTS_MIN=512m +OPENSEARCH_JAVA_OPTS_MAX=1024m +OPENSEARCH_INITIAL_ADMIN_PASSWORD=Qazwsxedc!@#123 +OPENSEARCH_MEMLOCK_SOFT=-1 +OPENSEARCH_MEMLOCK_HARD=-1 +OPENSEARCH_NOFILE_SOFT=65536 +OPENSEARCH_NOFILE_HARD=65536 + +# ------------------------------ +# Environment Variables for Nginx reverse proxy +# ------------------------------ +NGINX_SERVER_NAME=_ +NGINX_HTTPS_ENABLED=false +# HTTP port +NGINX_PORT=80 +# SSL settings are only applied when HTTPS_ENABLED is true +NGINX_SSL_PORT=443 +# if HTTPS_ENABLED is true, you're required to add your own SSL certificates/keys to the `./nginx/ssl` directory +# and modify the env vars below accordingly. +NGINX_SSL_CERT_FILENAME=dify.crt +NGINX_SSL_CERT_KEY_FILENAME=dify.key +NGINX_SSL_PROTOCOLS=TLSv1.1 TLSv1.2 TLSv1.3 + +# Nginx performance tuning +NGINX_WORKER_PROCESSES=auto +NGINX_CLIENT_MAX_BODY_SIZE=15M +NGINX_KEEPALIVE_TIMEOUT=65 + +# Proxy settings +NGINX_PROXY_READ_TIMEOUT=3600s +NGINX_PROXY_SEND_TIMEOUT=3600s + +# Set true to accept requests for /.well-known/acme-challenge/ +NGINX_ENABLE_CERTBOT_CHALLENGE=false + +# ------------------------------ +# Certbot Configuration +# ------------------------------ + +# Email address (required to get certificates from Let's Encrypt) +CERTBOT_EMAIL=your_email@example.com + +# Domain name +CERTBOT_DOMAIN=your_domain.com + +# certbot command options +# i.e: --force-renewal --dry-run --test-cert --debug +CERTBOT_OPTIONS= + +# ------------------------------ +# Environment Variables for SSRF Proxy +# ------------------------------ +SSRF_HTTP_PORT=3128 +SSRF_COREDUMP_DIR=/var/spool/squid +SSRF_REVERSE_PROXY_PORT=8194 +SSRF_SANDBOX_HOST=sandbox +SSRF_DEFAULT_TIME_OUT=5 +SSRF_DEFAULT_CONNECT_TIME_OUT=5 +SSRF_DEFAULT_READ_TIME_OUT=5 +SSRF_DEFAULT_WRITE_TIME_OUT=5 + +# ------------------------------ +# docker env var for specifying vector db type at startup +# (based on the vector db type, the corresponding docker +# compose profile will be used) +# if you want to use unstructured, add ',unstructured' to the end +# ------------------------------ +COMPOSE_PROFILES=${VECTOR_STORE:-weaviate} + +# ------------------------------ +# Docker Compose Service Expose Host Port Configurations +# ------------------------------ +EXPOSE_NGINX_PORT=80 +EXPOSE_NGINX_SSL_PORT=443 + +# ---------------------------------------------------------------------------- +# ModelProvider & Tool Position Configuration +# Used to specify the model providers and tools that can be used in the app. +# ---------------------------------------------------------------------------- + +# Pin, include, and exclude tools +# Use comma-separated values with no spaces between items. +# Example: POSITION_TOOL_PINS=bing,google +POSITION_TOOL_PINS= +POSITION_TOOL_INCLUDES= +POSITION_TOOL_EXCLUDES= + +# Pin, include, and exclude model providers +# Use comma-separated values with no spaces between items. +# Example: POSITION_PROVIDER_PINS=openai,openllm +POSITION_PROVIDER_PINS= +POSITION_PROVIDER_INCLUDES= +POSITION_PROVIDER_EXCLUDES= + +# CSP https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP +CSP_WHITELIST= + +# Enable or disable create tidb service job +CREATE_TIDB_SERVICE_JOB_ENABLED=false + +# Maximum number of submitted thread count in a ThreadPool for parallel node execution +MAX_SUBMIT_COUNT=100 + +# The maximum number of top-k value for RAG. +TOP_K_MAX_VALUE=10