
1panel定制化搭建dify 1.0.0正式版流程
dify是什么?
官方的简介:Dify 是一个开源 LLM 应用开发平台。其直观的界面结合了 Agentic AI 工作流、RAG 管道、代理功能、模型管理、可观察性功能等,让您可以快速从原型转向生产。
个人补充亮点:
支持市场主流模型接入
低代码
后端API
插件
工作流
它可以集合绘画,联网搜索,常用工具,http请求,python代码执行等等,只要你有想法,它将无所不能。
你可以用它来构建自己的知识库,也可以用来构建企业客服,也可以跟各种工具搭配制作属于自己的专属工具。
如何拉取dify?
两种方式
第一种:git clone https://github.com/langgenius/dify.git
第二种:去github下载

上传至目录
使用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
过程:
进入目录: 首先切换到
dify/docker
目录。环境配置:
复制
.env.example
为.env
,这是启动 Dify 的必需步骤。如果需要独立的中间件服务(如数据库、缓存等,通常用于开发环境),复制
middleware.env.example
为middleware.env
。
启动: 使用
docker compose up -d
命令启动 Dify 服务。SSL (可选): 如果需要配置 SSL 证书(生产环境强烈推荐),参考
docker/certbot/README.md
进行配置,但需要提前设置好域名 DNS 解析。中间件 (可选): 如果只需要单独启动中间件服务,可以使用
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(主要)
中文翻译下载链接: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 上面地址即可