dify是什么?

官方的简介:Dify 是一个开源 LLM 应用开发平台。其直观的界面结合了 Agentic AI 工作流、RAG 管道、代理功能、模型管理、可观察性功能等,让您可以快速从原型转向生产。

个人补充亮点:

  • 支持市场主流模型接入

  • 低代码

  • 后端API

  • 插件

  • 工作流

它可以集合绘画,联网搜索,常用工具,http请求,python代码执行等等,只要你有想法,它将无所不能。

你可以用它来构建自己的知识库,也可以用来构建企业客服,也可以跟各种工具搭配制作属于自己的专属工具。

如何拉取dify?

两种方式

第一种:git clone https://github.com/langgenius/dify.git

第二种:去github下载

https://github.com/langgenius/dify


上传至目录

使用1panel图形化操作

  • 文件-打开目录opt>1panel>docker>compose

    • 新建dify1.0-上传或者拉取到此目录

    • 解压缩-dify-main

Docker 官方版部署指南(此部分由AI根据官方教程生成)

https://github.com/langgenius/dify/tree/96eed571d9fc73a1a45217d3946b335a26073e8c/docker

# 1. 进入 Dify Docker 目录
cd dify/docker

# 2. 复制并配置 .env 文件(必须)
cp .env.example .env

# 3. (可选)如需独立中间件,复制并配置 middleware.env
cp middleware.env.example middleware.env

# 4. 启动 Dify 服务
docker compose up -d

# 5. (可选)配置 SSL 证书,参考 docker/certbot/README.md
#    需提前配置 DNS 解析

# 6. (可选)单独启动中间件(开发环境)
docker-compose -f docker-compose.middleware.yaml up --env-file middleware.env -d

过程:

  1. 进入目录: 首先切换到 dify/docker 目录。

  2. 环境配置:

    • 复制 .env.example.env,这是启动 Dify 的必需步骤。

    • 如果需要独立的中间件服务(如数据库、缓存等,通常用于开发环境),复制 middleware.env.examplemiddleware.env

  3. 启动: 使用 docker compose up -d 命令启动 Dify 服务。

  4. SSL (可选): 如果需要配置 SSL 证书(生产环境强烈推荐),参考 docker/certbot/README.md 进行配置,但需要提前设置好域名 DNS 解析。

  5. 中间件 (可选): 如果只需要单独启动中间件服务,可以使用 docker-compose -f docker-compose.middleware.yaml up --env-file middleware.env -d 命令。

如何手动使用1panel安装dify 1.0.0?(基础版,仅包含必装)

首先1panel本身使用的是OpenResty,OpenResty 基于 Nginx 构建,它可以使用反向代理和证书自动续签,可视化比较方便一些。

数据库redis和PostgreSQL以及开源s3存储minio都是支持一键安装,部分小伙伴大多数这3个组件+nginx都是有的,

本教程的作用就是如何复用这4个组件,咱将简化其中的流程

翻译为中文的环境变量和docker模板文件

如果你不复用docker容器,则参考https://docs.dify.ai/getting-started/install-self-hosted/docker-compose 官方文档进行一键安装,一句代码即可成功搭建,不需要看下面的教程

解压缩后下面会有一个docker目录,下面是翻译过的,如果你有需要可以根据中文提示自己修改

  • .env.example(主要)

    • 中文翻译下载链接:env.example 这地方要注意哦,因为上传的问题,默认会去掉.env前面的 .,自己上传需要手动重命名

  • docker-compose-template.yaml(主要)

修改.env.example

  • 通用变量(重要

    • url如果是局域网填写你局域网ip,公网填写你要使用的域名即可

  • 服务器配置

    • 日志开启了debug,调试模式为true,其他根据需求填,

  • 数据库配置(复用1

    • 去1panel里面新建一个表,数据库-pgSQL-创建数据库

    • 注意修用户名,数据库名,密码,host地址,端口

  • redis配置(复用2

    • 去1panel里面查看,数据库-redis-连接信息

    • 用户名一般为空,其他根据需求填

  • 跨域配置

    • 建议公网访问的限制请求域名

  • 文件存储配置(复用3

    • 1panel里面查看minio信息,并新建一个桶

    • 需注意OPENDAL_SCHEME=s3 如果你使用云存储记得修改

  • 向量存储类型(建议)

    • 大多数人是没有向量数据库的,根据自己喜欢用的类型来

    • 建议weaviate

  • 知识库配置(可选)

    • 建议自建Unstructured,它可以实现自托管,但在资源占用方面相对较高。如果你的资源配置足够高,建议安装它。请注意,仅容器就近6GB哦,需要根据实际情况进行资源分配和配置。

    • 官方saas采用的也是Unstructured

  • nginx(复用4)

    • 直接删除此相关配置 使用1panel主用的OpenResty

  • smtp(必填)#

    • 1.0.0版本发现需要必填,不填则api容器报错

  • 其他未提及皆为(可选

# ------------------------------
# API 服务和 Worker 的环境变量
# ------------------------------

# ------------------------------
# 通用变量
# ------------------------------

#-------------这一块你需要使用什么地址就填什么地址,比如是本地搭建可以填写当前服务器ip,如果你是域名,则直接填写你的域名即可,填写后,后面需要通过nginx(OpenResty)反向代理指向你所填写的地址---------------
# 控制台 API 的后端 URL,用于拼接授权回调地址。
CONSOLE_API_URL=http://10.255.255.242

# 控制台网页的前端 URL,用于拼接部分前端地址和 CORS 跨域配置。
CONSOLE_WEB_URL=http://10.255.255.242

# 服务 API 地址,
# 用于向前端展示服务 API 基础地址。
SERVICE_API_URL=http://10.255.255.242

# WebApp API 后端地址,
# 用于声明前端 API 调用的后端地址。
APP_API_URL=http://10.255.255.242

# WebApp 地址,
# 用于向前端展示 WebAPP 基础地址。
APP_WEB_URL=http://10.255.255.242

# 文件预览/下载地址前缀。
# 用于向前端展示文件预览/下载地址或作为多模态输入;
# 该地址为签名地址且有过期时间。
FILES_URL=http://10.255.255.242

# ------------------------------
# 服务端配置
# ------------------------------
#-------------默认修改了日志为debug级别,开启调试模式
# 应用程序日志级别。
# 支持的值包括 `DEBUG`、`INFO`、`WARNING`、`ERROR`、`CRITICAL`
LOG_LEVEL=DEBUG
# 日志文件路径
LOG_FILE=/app/logs/server.log
# 日志文件最大大小(单位:MB)
LOG_FILE_MAX_SIZE=20
# 日志文件最大备份数量
LOG_FILE_BACKUP_COUNT=5
# 日志日期格式
LOG_DATEFORMAT=%Y-%m-%d %H:%M:%S
# 日志时区
LOG_TZ=UTC

# 调试模式,默认关闭。
# 建议本地开发时开启此配置以防止 monkey patch 导致的问题
DEBUG=true

# Flask 调试模式,开启后可在接口处输出跟踪信息便于调试
FLASK_DEBUG=true

# 用于安全签名会话 Cookie 和加密数据库敏感信息的密钥。
# 可使用 `openssl rand -base64 42` 生成强密钥
SECRET_KEY=sk-9f73s3ljTXVcMT3Blb3ljTqtsKiGHXVcMT3BlbkFJLK7U

# 管理员用户初始密码。
# 如果留空,则在创建初始管理员账户时不会提示设置密码
# 密码长度不能超过 30 个字符
INIT_PASSWORD=

# 部署环境。
# 支持的值包括 `PRODUCTION`、`TESTING`,默认为 `PRODUCTION`
# 测试环境会在前端页面显示明显颜色标签,标识当前为测试环境
DEPLOY_ENV=TESTING

# 是否启用版本检查策略。
# 如果留空,将调用 https://updates.dify.ai 进行版本检查
CHECK_UPDATE_URL=https://updates.dify.ai

# 用于修改 OpenAI 基础地址,默认 https://api.openai.com/v1
# 当国内无法访问 OpenAI 时,可替换为国内镜像地址
# 或当本地模型提供 OpenAI 兼容 API 时可替换
OPENAI_API_BASE=https://api.openai.com/v1

# 启用后将在应用启动前执行数据库迁移
# 并在迁移完成后启动应用
MIGRATION_ENABLED=true

# 文件访问时效,指定文件可被访问的时间间隔(秒)
# 默认值 300 秒
FILES_ACCESS_TIMEOUT=300

# 访问令牌过期时间(分钟)
ACCESS_TOKEN_EXPIRE_MINUTES=60

# 刷新令牌过期时间(天)
REFRESH_TOKEN_EXPIRE_DAYS=30

# 应用的最大活跃请求数,0 表示无限制,应为非负整数
APP_MAX_ACTIVE_REQUESTS=0
APP_MAX_EXECUTION_TIME=1200

# ------------------------------
# 容器启动相关配置
# 仅在使用 docker 镜像或 docker-compose 启动时生效
# ------------------------------

# API 服务绑定地址,默认 0.0.0.0(所有地址可访问)
DIFY_BIND_ADDRESS=0.0.0.0

# API 服务绑定端口号,默认 5001
DIFY_PORT=5001

# API 服务 worker 数量(即 worker 进程数)
# 计算公式:CPU 核心数 x 2 + 1(同步模式)或 1(Gevent 模式)
# 参考:https://docs.gunicorn.org/en/stable/design.html#how-many-workers
SERVER_WORKER_AMOUNT=1

# 默认使用 gevent,如果在 Windows 环境可切换为 sync 或 solo
SERVER_WORKER_CLASS=gevent

# 默认 worker 连接数,默认 10
SERVER_WORKER_CONNECTIONS=10

# 类似 SERVER_WORKER_CLASS
# 如果在 Windows 环境可切换为 sync 或 solo
CELERY_WORKER_CLASS=

# 请求处理超时时间,默认 200
# 建议设置为 360 以支持更长的 SSE 连接时间
GUNICORN_TIMEOUT=360

# Celery worker 数量,默认 1,可按需设置
CELERY_WORKER_AMOUNT=

# 是否启用 Celery worker 自动扩缩容标志
#
# 当任务对 CPU 资源需求较高时,自动扩缩容功能非常有用
# 可根据工作负载动态分配和释放 worker
#
# 启用后可以指定最大最小 worker 数量
# 扩缩容算法会在指定范围内动态调整 worker 数量
#
# 默认关闭(即 false)
#
# 示例:
# CELERY_AUTO_SCALE=true
CELERY_AUTO_SCALE=false

# Celery 自动扩缩容最大 worker 数量
# 仅在启用自动扩缩容时使用(可选)
# 默认未设置
CELERY_MAX_WORKERS=

# Celery 自动扩缩容最小 worker 数量
# 仅在启用自动扩缩容时使用(可选)
# 默认未设置
CELERY_MIN_WORKERS=

# API 工具配置
API_TOOL_DEFAULT_CONNECT_TIMEOUT=10
API_TOOL_DEFAULT_READ_TIMEOUT=60


# ------------------------------
# 数据库配置
# 使用 PostgreSQL,请使用 public schema
# 需与下方 'db' 服务配置保持一致
# ------------------------------
# ---------------------------------这个位置填写数据库信息---------------------------------
DB_USERNAME=dify
DB_PASSWORD=nRXxfPbrxxxxxxxxxxxxxxxxxxxxx
DB_HOST=10.255.255.242
DB_PORT=5432
DB_DATABASE=dify
# 数据库连接池大小
# 默认 30 连接,可适当增加
SQLALCHEMY_POOL_SIZE=30
# 数据库连接池回收时间,默认 3600 秒
SQLALCHEMY_POOL_RECYCLE=3600
# 是否打印 SQL,默认关闭
SQLALCHEMY_ECHO=false

# 数据库最大连接数
# 默认 100
#
# 参考:https://www.postgresql.org/docs/current/runtime-config-connection.html#GUC-MAX-CONNECTIONS
POSTGRES_MAX_CONNECTIONS=100

# 设置 PostgreSQL 共享缓冲区使用的共享内存量
# 默认 128MB
# 推荐值:可用内存的 25%
# 参考:https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-SHARED-BUFFERS
POSTGRES_SHARED_BUFFERS=128MB

# 设置每个数据库 worker 用于工作空间的内存
# 默认 4MB
#
# 参考:https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-WORK-MEM
POSTGRES_WORK_MEM=4MB

# 设置维护活动预留的内存
# 默认 64MB
#
# 参考:https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-MAINTENANCE-WORK-MEM
POSTGRES_MAINTENANCE_WORK_MEM=64MB

# 设置规划器对有效缓存大小的假设
# 默认 4096MB
#
# 参考:https://www.postgresql.org/docs/current/runtime-config-query.html#GUC-EFFECTIVE-CACHE-SIZE
POSTGRES_EFFECTIVE_CACHE_SIZE=4096MB

# ------------------------------
# Redis 配置
# 用于缓存和会话过程中的发布订阅
# ------------------------------
# ---------------------------------这个位置填写redis信息---------------------------------
REDIS_HOST=1Panel-redis-Yxxx
REDIS_PORT=6379
REDIS_USERNAME=
REDIS_PASSWORD=jhkdjhkxxxxxxxxxxxxxxxxxxxxxx
REDIS_USE_SSL=false
REDIS_DB=0

# 是否使用 Redis 哨兵模式
# 设置为 true 后,应用将通过哨兵自动发现并连接主节点
REDIS_USE_SENTINEL=false

# Redis 哨兵节点列表,启用哨兵模式时需提供至少一个哨兵 IP 和端口
# 格式:`<哨兵1_ip>:<哨兵1_port>,<哨兵2_ip>:<哨兵2_port>,<哨兵3_ip>:<哨兵3_port>`
REDIS_SENTINELS=
REDIS_SENTINEL_SERVICE_NAME=
REDIS_SENTINEL_USERNAME=
REDIS_SENTINEL_PASSWORD=
REDIS_SENTINEL_SOCKET_TIMEOUT=0.1

# Redis 集群节点列表,启用集群模式时需提供至少一个集群 IP 和端口
# 格式:`<集群1_ip>:<集群1_port>,<集群2_ip>:<集群2_port>,<集群3_ip>:<集群3_port>`
REDIS_USE_CLUSTERS=false
REDIS_CLUSTERS=
REDIS_CLUSTERS_PASSWORD=

# ------------------------------
# Celery 配置
# ------------------------------

# 使用 redis 作为 broker,redis db 1 用于 celery broker
# 格式:`redis://<redis用户名>:<redis密码>@<redis主机>:<redis端口>/<redis数据库>`
# 示例:redis://:difyai123456@redis:6379/1
# 如果使用 Redis 哨兵,格式:`sentinel://<哨兵用户名>:<哨兵密码>@<哨兵主机>:<哨兵端口>/<redis数据库>`
# 示例:sentinel://localhost:26379/1;sentinel://localhost:26380/1;sentinel://localhost:26381/1
CELERY_BROKER_URL=redis://:difxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@1Panel-redis-Yxxx:6379/1
BROKER_USE_SSL=false

# 如果使用 Redis 哨兵实现高可用,需配置以下设置
CELERY_USE_SENTINEL=false
CELERY_SENTINEL_MASTER_NAME=
CELERY_SENTINEL_SOCKET_TIMEOUT=0.1

# ------------------------------
# CORS 跨域配置
# 用于设置前端跨域访问策略
# ------------------------------

# Web API 跨域请求允许的源
# 例如:https://dify.app 或 * 表示允许所有源
WEB_API_CORS_ALLOW_ORIGINS=*

# 控制台 API 跨域请求允许的源
# 例如:https://cloud.dify.ai 或 * 表示允许所有源
CONSOLE_CORS_ALLOW_ORIGINS=*

# ------------------------------
# 文件存储配置
# ------------------------------

# 用户文件存储类型
STORAGE_TYPE=s3


# S3 配置
#
S3_ENDPOINT=http://1Panel-minio-Ixxx:9000
S3_REGION=
S3_BUCKET_NAME=dify
S3_ACCESS_KEY=F9vcwxxxxxxxxxxxxxxxxxxxxxxxxxs
S3_SECRET_KEY=2OaSSsjWxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 是否使用 AWS 托管 IAM 角色进行 S3 服务认证
# 如果设为 false,则必须提供 access key 和 secret key
S3_USE_AWS_MANAGED_IAM=false

# ------------------------------
# 向量数据库配置
# ------------------------------

# 向量存储类型
# 支持值:`weaviate`、`qdrant`、`milvus`、`myscale`、`relyt`、`pgvector`、`pgvecto-rs`、`chroma`、`opensearch`、`tidb_vector`、`oracle`、`tencent`、`elasticsearch`、`elasticsearch-ja`、`analyticdb`、`couchbase`、`vikingdb`、`oceanbase`
VECTOR_STORE=weaviate

# Weaviate 终端地址(仅当 VECTOR_STORE 为 `weaviate` 时生效)
WEAVIATE_ENDPOINT=http://weaviate:8080
WEAVIATE_API_KEY=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih

# ------------------------------
# 知识库配置
# ------------------------------

# 上传文件大小限制,默认 15M
UPLOAD_FILE_SIZE_LIMIT=15

# 单次最多上传文件数量,默认 5
UPLOAD_FILE_BATCH_LIMIT=5

# ETL 类型,支持:`dify`、`Unstructured`
# `dify` Dify 自研文件提取方案
# `Unstructured` Unstructured.io 文件提取方案
ETL_TYPE=dify

# Unstructured API 地址和 API key,当 ETL_TYPE 为 Unstructured 时需要配置
# 或在文档提取节点使用 pptx 时使用 Unstructured
# 示例:http://unstructured:8000/general/v0/general
UNSTRUCTURED_API_URL=http://unstructured:8000/general/v0/general
UNSTRUCTURED_API_KEY=
SCARF_NO_ANALYTICS=true

# ------------------------------
# 模型配置
# ------------------------------

# 提示生成工具允许的最大 token 数
# 该设置控制 LLM 在提示生成工具中生成提示时使用的最大 token 数
# 默认:512 个 token
PROMPT_GENERATION_MAX_TOKENS=512

# 代码生成工具允许的最大 token 数
# 该设置控制 LLM 在代码生成工具中生成代码时使用的最大 token 数
# 默认:1024 个 token
CODE_GENERATION_MAX_TOKENS=1024

# ------------------------------
# 多模态配置
# ------------------------------

# 输入多模态模型时发送的图片/视频/音频/文档格式
# 默认 base64,可选 url
# url 模式的调用延迟会低于 base64 模式
# 通常建议使用兼容性更好的 base64 模式
# 如果配置为 url,需要配置 FILES_URL 为可外网访问地址以便多模态模型可访问图片/视频/音频/文档
MULTIMODAL_SEND_FORMAT=base64
# 上传图片文件大小限制,默认 10M
UPLOAD_IMAGE_FILE_SIZE_LIMIT=10
# 上传视频文件大小限制,默认 100M
UPLOAD_VIDEO_FILE_SIZE_LIMIT=100
# 上传音频文件大小限制,默认 50M
UPLOAD_AUDIO_FILE_SIZE_LIMIT=50

# ------------------------------
# Sentry 配置
# 用于应用监控和错误日志追踪
# ------------------------------
SENTRY_DSN=

# API 服务 Sentry DSN 地址,默认空,为空时所有监控信息不向 Sentry 上报
# 如果不设置,将禁用 Sentry 错误上报
API_SENTRY_DSN=
# API 服务 Sentry 事件上报比例,0.01 表示 1%
API_SENTRY_TRACES_SAMPLE_RATE=1.0
# API 服务 Sentry 性能分析上报比例,0.01 表示 1%
API_SENTRY_PROFILES_SAMPLE_RATE=1.0

# Web 服务 Sentry DSN 地址,默认空,为空时所有监控信息不向 Sentry 上报
# 如果不设置,将禁用 Sentry 错误上报
WEB_SENTRY_DSN=

# ------------------------------
# Notion 集成配置
# 变量可通过申请 Notion 集成获取:https://www.notion.so/my-integrations
# ------------------------------

# 配置为 "public" 或 "internal"
# 由于 Notion 的 OAuth 跳转地址仅支持 HTTPS
# 如果本地部署请使用 Notion 的内部集成
NOTION_INTEGRATION_TYPE=public
# Notion OAuth 客户端密钥(公共集成类型使用)
NOTION_CLIENT_SECRET=
# Notion OAuth 客户端 ID(公共集成类型使用)
NOTION_CLIENT_ID=
# Notion 内部集成密钥
# 如果 NOTION_INTEGRATION_TYPE 值为 "internal",需配置此变量
NOTION_INTERNAL_SECRET=

# ------------------------------
# 邮件相关配置
# ------------------------------

# 邮件类型,支持:resend、smtp
MAIL_TYPE=smtp

# 默认发件邮箱地址(未指定时使用)
MAIL_DEFAULT_SEND_FROM=


# SMTP 服务器配置(当 MAIL_TYPE 为 `smtp` 时使用)
SMTP_SERVER=
SMTP_PORT=465
SMTP_USERNAME=
SMTP_PASSWORD=
SMTP_USE_TLS=true
SMTP_OPPORTUNISTIC_TLS=false

# ------------------------------
# 其他配置
# ------------------------------

# 索引分片 token 最大长度
INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=4000

# 成员邀请链接有效时间(小时)
# 默认:72
INVITE_EXPIRY_HOURS=72

# 重置密码令牌有效时间(分钟)
RESET_PASSWORD_TOKEN_EXPIRY_MINUTES=5

# 沙箱服务终端地址
# 如果给api的容器启用了http的代理,这个地方需要修改一下地址,不然无法正常访问沙箱,会被代理掉
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_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 请求节点配置
HTTP_REQUEST_NODE_MAX_BINARY_SIZE=10485760
HTTP_REQUEST_NODE_MAX_TEXT_SIZE=1048576

# SSRF 代理服务器 HTTP URL
SSRF_PROXY_HTTP_URL=http://ssrf_proxy:3128
# SSRF 代理服务器 HTTPS URL
SSRF_PROXY_HTTPS_URL=http://ssrf_proxy:3128

# ------------------------------
# web 服务环境变量
# ------------------------------

# 文本生成的超时时间(毫秒)
TEXT_GENERATION_TIMEOUT_MS=60000

# ------------------------------
# db 服务环境变量
# ------------------------------

PGUSER=${DB_USERNAME}
# 默认 postgres 用户密码
POSTGRES_PASSWORD=${DB_PASSWORD}
# 默认 postgres 数据库名称
POSTGRES_DB=${DB_DATABASE}
# postgres 数据目录
PGDATA=/var/lib/postgresql/data/pgdata

# ------------------------------
# sandbox 服务环境变量
# ------------------------------

# 沙箱服务 API key
SANDBOX_API_KEY=dify-sandbox
# Gin 框架运行模式
SANDBOX_GIN_MODE=release
# worker 超时时间(秒)
SANDBOX_WORKER_TIMEOUT=15
# 启用沙箱服务网络
SANDBOX_ENABLE_NETWORK=true
# SSRF 防护的 HTTP 代理地址
SANDBOX_HTTP_PROXY=http://ssrf_proxy:3128
# SSRF 防护的 HTTPS 代理地址
SANDBOX_HTTPS_PROXY=http://ssrf_proxy:3128
# 沙箱服务运行端口
SANDBOX_PORT=8194

# ------------------------------
# weaviate 服务环境变量
# (仅当 VECTOR_STORE 为 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


# ------------------------------
# SSRF 代理环境变量
# ------------------------------
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 环境变量
# (根据向量数据库类型,会使用对应的 docker compose profile)
# 如需使用 unstructured,请在末尾添加 ',unstructured'
# ------------------------------
COMPOSE_PROFILES=${VECTOR_STORE:-weaviate}

# ------------------------------
# Docker Compose 服务暴露主机端口配置
# ------------------------------
EXPOSE_NGINX_PORT=80
EXPOSE_NGINX_SSL_PORT=443

# ----------------------------------------------------------------------------
# 模型提供商和工具定位配置
# 用于指定应用中可使用的模型提供商和工具
# ----------------------------------------------------------------------------

# 固定、包含和排除的工具
# 使用逗号分隔值,项之间无空格
# 示例:POSITION_TOOL_PINS=bing,google
POSITION_TOOL_PINS=
POSITION_TOOL_INCLUDES=
POSITION_TOOL_EXCLUDES=

# 固定、包含和排除的模型提供商
# 使用逗号分隔值,项之间无空格
# 示例: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=

# 是否启用创建 TiDB 服务任务
CREATE_TIDB_SERVICE_JOB_ENABLED=false

# 并行节点执行线程池最大提交线程数
MAX_SUBMIT_COUNT=100

# RAG 检索最大 top-k 值
TOP_K_MAX_VALUE=10

# ------------------------------
# 插件守护进程配置
# ------------------------------

DB_PLUGIN_DATABASE=dify_plugin
EXPOSE_PLUGIN_DAEMON_PORT=5002
PLUGIN_DAEMON_PORT=5002
PLUGIN_DAEMON_KEY=lYkiYYT6owG+71oLerGzA7GXCgOT++6ovaezWAjpCjf+Sjc3ZtU+qUEi
PLUGIN_DAEMON_URL=http://plugin_daemon:5002
PLUGIN_MAX_PACKAGE_SIZE=52428800
PLUGIN_PPROF_ENABLED=false

PLUGIN_DEBUGGING_HOST=0.0.0.0
PLUGIN_DEBUGGING_PORT=5003
EXPOSE_PLUGIN_DEBUGGING_HOST=localhost
EXPOSE_PLUGIN_DEBUGGING_PORT=5003

PLUGIN_DIFY_INNER_API_KEY=QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1
PLUGIN_DIFY_INNER_API_URL=http://api:5001

ENDPOINT_URL_TEMPLATE=http://localhost/e/{hook_id}

MARKETPLACE_ENABLED=true
MARKETPLACE_API_URL=https://marketplace.dify.ai

FORCE_VERIFYING_SIGNATURE=true

修改docker-compose-template.yaml

删除不需要的容器代码,只保留下面的容器

  • api

  • worker

  • web

  • sandbox

  • plugin_daemon

  • ssrf_proxy

  • weaviate

x-shared-env: &shared-api-worker-env  # 定义一个名为 shared-api-worker-env 的 YAML 锚点,用于共享环境变量
services:
  # API 服务
  api:
    image: langgenius/dify-api:1.0.0  # 使用的 Docker 镜像
    restart: always  # 容器总是重启
    environment:
      # 使用共享的环境变量。
      <<: *shared-api-worker-env  # 使用之前定义的 YAML 锚点
      # 启动模式,'api' 启动 API 服务器。
      MODE: api
      SENTRY_DSN: ${API_SENTRY_DSN:-}  # Sentry DSN,用于错误跟踪
      SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0}  # Sentry 采样率
      SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0}  # Sentry 性能分析采样率
      PLUGIN_REMOTE_INSTALL_HOST: ${EXPOSE_PLUGIN_DEBUGGING_HOST:-localhost}  # 插件远程安装主机
      PLUGIN_REMOTE_INSTALL_PORT: ${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003}  # 插件远程安装端口
      PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} #插件最大包大小
      INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1}  # 插件内部 API 密钥
    ports:
      - "5001:5001"  # 暴露端口
    volumes:
      # 挂载存储目录到容器,用于存储用户文件。
      - ./volumes/app/storage:/app/api/storage
    networks:
      - 1panel-network

  # worker 服务
  # Celery worker 用于处理队列。
  worker:
    image: langgenius/dify-api:1.0.0  # 使用的 Docker 镜像
    restart: always  # 容器总是重启
    environment:
      # 使用共享的环境变量。
      <<: *shared-api-worker-env  # 使用之前定义的 YAML 锚点
      # 启动模式,'worker' 启动 Celery worker 用于处理队列。
      MODE: worker
      SENTRY_DSN: ${API_SENTRY_DSN:-}  # Sentry DSN,用于错误跟踪
      SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0}  # Sentry 采样率
      SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0}  # Sentry 性能分析采样率
      PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} #插件最大包大小
      INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1}  # 插件内部 API 密钥
    volumes:
      # 挂载存储目录到容器,用于存储用户文件。
      - ./volumes/app/storage:/app/api/storage
    networks:
      - 1panel-network

  # 前端 Web 应用程序。
  web:
    image: langgenius/dify-web:1.0.0  # 使用的 Docker 镜像
    restart: always  # 容器总是重启
    environment:
      CONSOLE_API_URL: ${CONSOLE_API_URL:-}  # 控制台 API URL
      APP_API_URL: ${APP_API_URL:-}  # 应用 API URL
      SENTRY_DSN: ${WEB_SENTRY_DSN:-}  # Sentry DSN,用于错误跟踪
      NEXT_TELEMETRY_DISABLED: ${NEXT_TELEMETRY_DISABLED:-0}  # 是否禁用 Next.js 遥测
      TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000}  # 文本生成超时时间(毫秒)
      CSP_WHITELIST: ${CSP_WHITELIST:-}  # 内容安全策略白名单
      MARKETPLACE_API_URL: ${MARKETPLACE_API_URL:-https://marketplace.dify.ai}  # 市场 API URL
      MARKETPLACE_URL: ${MARKETPLACE_URL:-https://marketplace.dify.ai}  # 市场 URL
      TOP_K_MAX_VALUE: ${TOP_K_MAX_VALUE:-} # Top K 最大值
      INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH: ${INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH:-} #索引最大分段token长度
      PM2_INSTANCES: ${PM2_INSTANCES:-2} #PM2实例数
    ports:
      - "3000:3000"  # 暴露端口
    networks:
      - 1panel-network
 
  # DifySandbox
  sandbox:
    image: langgenius/dify-sandbox:0.2.10  # 使用的 Docker 镜像
    restart: always  # 容器总是重启
    environment:
      # DifySandbox 配置
      # 确保在部署时使用强密钥更改此密钥。
      # 可以使用 `openssl rand -base64 42` 生成强密钥。
      API_KEY: ${SANDBOX_API_KEY:-dify-sandbox}  # API 密钥
      GIN_MODE: ${SANDBOX_GIN_MODE:-release}  # Gin 模式
      WORKER_TIMEOUT: ${SANDBOX_WORKER_TIMEOUT:-15}  # Worker 超时时间
      ENABLE_NETWORK: ${SANDBOX_ENABLE_NETWORK:-true}  # 是否启用网络
      HTTP_PROXY: ${SANDBOX_HTTP_PROXY:-http://ssrf_proxy:3128}  # HTTP 代理
      HTTPS_PROXY: ${SANDBOX_HTTPS_PROXY:-http://ssrf_proxy:3128}  # HTTPS 代理
      SANDBOX_PORT: ${SANDBOX_PORT:-8194} #沙盒端口
    volumes:
      - ./volumes/sandbox/dependencies:/dependencies  # 挂载依赖目录
      - ./volumes/sandbox/conf:/conf  # 挂载配置目录
    healthcheck:
      test: [ 'CMD', 'curl', '-f', 'http://localhost:8194/health' ]  # 健康检查命令
    ports:
      - "8194:8194"  # 暴露端口
    networks:
      - 1panel-network

  # 插件守护进程
  plugin_daemon:
    image: langgenius/dify-plugin-daemon:0.0.3-local  # 使用的 Docker 镜像
    restart: always  # 容器总是重启
    environment:
      # 使用共享的环境变量。
      <<: *shared-api-worker-env  # 使用之前定义的 YAML 锚点
      DB_DATABASE: ${DB_PLUGIN_DATABASE:-dify_plugin}  # 数据库名
      SERVER_PORT: ${PLUGIN_DAEMON_PORT:-5002}  # 服务器端口
      SERVER_KEY: ${PLUGIN_DAEMON_KEY:-lYkiYYT6owG+71oLerGzA7GXCgOT++6ovaezWAjpCjf+Sjc3ZtU+qUEi}  # 服务器密钥
      MAX_PLUGIN_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} #最大插件包大小
      PPROF_ENABLED: ${PLUGIN_PPROF_ENABLED:-false}  # 是否启用 pprof
      DIFY_INNER_API_URL: ${PLUGIN_DIFY_INNER_API_URL:-http://api:5001}  # Dify 内部 API URL
      DIFY_INNER_API_KEY: ${INNER_API_KEY_FOR_PLUGIN:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1}  # Dify 内部 API 密钥
      PLUGIN_REMOTE_INSTALLING_HOST: ${EXPOSE_PLUGIN_DEBUGGING_HOST:-localhost}  # 插件远程安装主机
      PLUGIN_REMOTE_INSTALLING_PORT: ${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003}  # 插件远程安装端口
      PLUGIN_WORKING_PATH: ${PLUGIN_WORKING_PATH:-/app/storage/cwd} #插件工作路径
      FORCE_VERIFYING_SIGNATURE: ${FORCE_VERIFYING_SIGNATURE:-true} #强制验证签名
    ports:
      - "${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003}:${PLUGIN_DEBUGGING_PORT:-5003}"  # 暴露端口
    volumes:
      - ./volumes/plugin_daemon:/app/storage  # 挂载存储目录
    networks:
      - 1panel-network

  # ssrf_proxy 服务器
  # 更多信息,请参考
  # https://docs.dify.ai/learn-more/faq/install-faq#id-18.-why-is-ssrf_proxy-needed
  ssrf_proxy:
    image: ubuntu/squid:latest  # 使用的 Docker 镜像
    restart: always  # 容器总是重启
    volumes:
      - ./ssrf_proxy/squid.conf.template:/etc/squid/squid.conf.template  # 挂载 Squid 配置文件模板
      - ./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:
      # 请根据您的网络环境修改 squid 环境变量。
      HTTP_PORT: ${SSRF_HTTP_PORT:-3128}  # HTTP 端口
      COREDUMP_DIR: ${SSRF_COREDUMP_DIR:-/var/spool/squid}  # Core Dump 目录
      REVERSE_PROXY_PORT: ${SSRF_REVERSE_PROXY_PORT:-8194}  # 反向代理端口
      SANDBOX_HOST: ${SSRF_SANDBOX_HOST:-sandbox}  # 沙盒主机
      SANDBOX_PORT: ${SANDBOX_PORT:-8194} #沙盒端口
    networks:
      - 1panel-network


  # Weaviate 向量存储。
  weaviate:
    image: semitechnologies/weaviate:1.19.0  # 使用的 Docker 镜像
    profiles:
      - ''  # 默认 profile
      - weaviate  # 使用 weaviate profile
    restart: always  # 容器总是重启
    volumes:
      # 挂载 Weaviate 数据目录到容器。
      - ./volumes/weaviate:/var/lib/weaviate
    environment:
      # Weaviate 配置
      # 您可以参考 [Weaviate](https://weaviate.io/developers/weaviate/config-refs/env-vars) 文档获取更多信息。
      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}  # 是否启用 API 密钥认证
      AUTHENTICATION_APIKEY_ALLOWED_KEYS: ${WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS:-WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih}  # 允许的 API 密钥
      AUTHENTICATION_APIKEY_USERS: ${WEAVIATE_AUTHENTICATION_APIKEY_USERS:-hello@dify.ai}  # API 密钥用户
      AUTHORIZATION_ADMINLIST_ENABLED: ${WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED:-true}  # 是否启用管理员列表授权
      AUTHORIZATION_ADMINLIST_USERS: ${WEAVIATE_AUTHORIZATION_ADMINLIST_USERS:-hello@dify.ai}  # 管理员列表用户
    networks:
      - 1panel-network

networks:
  1panel-network:
    external: true

一键生成docker-compose.yaml

修改完后,在1panel文件目录直接打开终端

  • 执行命令./generate_docker_compose 即可自动生成

    • cp .env.example .env 复制环境变量

    • docker compose up -d 启动容器

      • docker compose down 关闭容器

  • 或者使用1p的编排功能:创建-路径选择


以上的步骤的前提是,你已经安装好了minio,redis,pg数据库之后进行的

新建一个反向代理

当这几个容器创建完毕后,咱们是将官方的ssl证书和nginx容器去掉了,需要通过1panel创建反代和证书管理

location /console/api {
 proxy_pass http://127.0.0.1:5001; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_buffering off;
     proxy_read_timeout 600s;  # 大文件读取超时
    proxy_send_timeout 600s;  # 大文件发送超时
    proxy_http_version 1.1;
    }

location /api {
    proxy_pass http://127.0.0.1:5001; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_buffering off;
     proxy_read_timeout 600s;  # 大文件读取超时
    proxy_send_timeout 600s;  # 大文件发送超时
    proxy_http_version 1.1;
}
location /v1 {
    proxy_pass http://127.0.0.1:5001; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_buffering off;
     proxy_read_timeout 600s;  # 大文件读取超时
    proxy_send_timeout 600s;  # 大文件发送超时
    proxy_http_version 1.1;
}
location /files {
    proxy_pass http://127.0.0.1:5001; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_buffering off;
     proxy_read_timeout 600s;  # 大文件读取超时
    proxy_send_timeout 600s;  # 大文件发送超时
    proxy_http_version 1.1;
}
location /explore {
    proxy_pass http://127.0.0.1:3000; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_buffering off;
     proxy_read_timeout 600s;  # 大文件读取超时
    proxy_send_timeout 600s;  # 大文件发送超时
    proxy_http_version 1.1;
}
location /e/ {
    proxy_pass http://127.0.0.1:5002; 
    proxy_set_header Dify-Hook-Url $scheme://$host$request_uri; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_buffering off;
     proxy_read_timeout 600s;  # 大文件读取超时
    proxy_send_timeout 600s;  # 大文件发送超时
    proxy_http_version 1.1;
}
location / {
    proxy_pass http://127.0.0.1:3000; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_buffering off;
     proxy_read_timeout 600s;  # 大文件读取超时
    proxy_send_timeout 600s;  # 大文件发送超时
    proxy_http_version 1.1;
}

我当前测试的是局域网ip,案例图:

如何搭建域名?

只需要在以上的教程上注意3点

  • 反向代理:增加ssl证书

  • 反向代理:域名管理 填写 域名,这时候一般地址为https://xxxx.xxx.com

  • .env.example 中url地址全部更换为域名 这里所有地址替换为https://xxxx.xxx.com 上面地址即可