本文详细介绍如何使用 Docker 部署 Dify 1.0.1 —— 一个开源 LLM 应用开发平台。我们将逐步讲解从源码获取、环境变量配置、通过 1panel 上传部署、Docker 部署到域名反向代理的全流程,帮助你快速从原型转为生产级应用。
一、Dify 官方简介与核心亮点
Dify 是一个开源的 LLM 应用开发平台,其直观界面整合了 Agentic AI 工作流、RAG 管道、代理功能、模型管理以及可观察性功能,让你能低代码快速搭建各类 AI 应用。
主要功能亮点:
- 市场主流模型接入:支持多种主流模型,灵活对接。
- 低代码开发:提供后端 API、插件系统和工作流功能,降低开发门槛。
- 多功能集成:集成绘画、联网搜索、HTTP 请求、Python 代码执行等多种工具,满足多种业务需求。
- 应用场景广泛:可用于构建个人知识库、企业客服系统或定制专属工具。
二、获取 Dify
方式 1:Git 克隆
在终端中执行以下命令将 Dify 源码克隆到本地:
git clone https://github.com/langgenius/dify.git
方式 2:GitHub 下载
直接访问 Dify GitHub 页面 点击 “Download ZIP” 下载源码压缩包。

三、通过 1panel 图形化操作部署 Dify 前置准备
如果你使用 1panel 管理服务器,可按以下步骤操作:
- 上传源码
将下载或克隆的 Dify 压缩包上传至服务器目录(自己自定义目录)例如:/opt/1panel/apps
/ - 新建目录并解压
在上传目录中新建文件夹(如dify
),将压缩包(dify-main.zip
)解压到该目录内。 - 使用 1panel 管理工具
通过 1panel 的图形化界面打开目录/opt/1panel/apps/dify
/,确保文件结构完整后,进行后续 Docker 编排部署。

四、Docker 部署指南
下面提供两种 Docker 部署方案:
4.1 (可选)依据 Dify 官方 Docker 文档部署
如果你倾向于参考 Dify 官方 Docker 文档部署方案,请参见官方文档:Docker 部署指南
主要步骤包括:
#1. 进入到docker目录
cd opt/1panel/apps/dify/dify-main/docker
#2.复制配置好的 .env 文件
cp .env.example .env
#根据需要自定义.env文件。请参阅.env.example文件以了解详细的配置选项。
#3. (可选)如需要独立中间件,复制并配置 middleware.env
#用于docker-compose.middleware.yaml设置必要的中间件服务,如数据库和缓存。
cp middleware.env.example middleware.env
#4. (可选)如需要执行中间件并启动服务
docker-compose -f docker-compose.middleware.yaml up --env-file middleware.env -d
#5. 运行dify服务,从上述目录中执行docker来启动服务。
docker compose up
#6. SSL 证书设置,(生产环境必要)请参阅 docker/certbot/README.md 使用 Certbot 设置 SSL 证书。
#请提前配置好DNS解析
4.2 基于 1panel 部署(推荐)
在 1panel 环境下,您可以直接利用图形化界面完成 Docker 部署。1panel 本身使用基于 Nginx 的 OpenResty,包含反向代理和 SSL 证书申请等功能,极大简化了部署流程。
(可选)在 1panel 中安装必要组件
首先,建议在 1panel 应用商店一键安装以下组件:
- OpenResty:提供基于 Nginx 的反向代理和 SSL 证书管理
- PostgreSQL:数据库服务
- Redis:内存缓存服务
- MinIO:开源 S3 存储服务
这些组件为 Dify 部署提供了基础环境支持。



4.3如何避免重复部署并复用已安装的组件?
- 复用已安装组件:若这些服务(OpenResty, PostgreSQL, Redis, MinIO)已经在 1panel 中安装,可以避免使用 Dify 官方命令再次进行部署。在此情况下,您只需根据需求修改相关的环境变量和配置文件。
- 翻译环境变量和 Docker YAML 文件:使用 ChatGPT 对环境变量和 Docker YAML 文件进行翻译。以下是已翻译过的文件,可以根据自己的需求进行更改。翻译过程对照官方原版文件,逐行比对,确保没有任何删减,只包含纯粹的翻译和注释(标点和行数保持一致)。
重要注意事项
- .env.example 文件:在某些情况下,
.env.example
文件会去掉前面的点(.
),请自行加上。 - docker-compose-template.yaml 文件:在此文件中,您需要根据需要进行调整。确保正确配置各项服务。
4.4下载翻译后的配置文件
翻译后的.env.example 和 docker-compose-template.yaml (可直接修改后使用)
提取码: GSMp
.env.example和docker-compose-template.yaml对照每一行后面#注释翻译,(只能参考)
提取码: HtX2
4.5修改 .env.example
配置文件
1. 通用变量(重要)
APP_URL
:- 如果是局域网环境,填写局域网的 IP 地址。
- 如果是公网环境,填写你要使用的域名。
2. 服务器配置
- 调试模式:
- 开启
DEBUG=true
,日志级别为DEBUG
,方便排查问题。 - 其他配置根据实际需求填写。
- 开启
3. 数据库配置(复用 1)
- 在 1Panel 中新建一个 PostgreSQL 数据库:
- 进入 数据库 > pgSQL > 创建数据库。
- 注意填写正确的 用户名、数据库名、密码、Host 地址 和 端口。
4. Redis 配置(复用 2)
- 在 1Panel 中查看 Redis 连接信息:
- 进入 数据库 > Redis > 连接信息。
- 用户名一般为空或
default
,其他配置根据需求填写。
5. 跨域配置
- 如果公网访问,建议限制请求域名,以增强安全性。
6. 文件存储配置(复用 3)
- 在 1Panel 中查看 MinIO 信息,并新建一个存储桶(Bucket)并配置好key。
- 注意:
OPENDAL_SCHEME=s3
,如果使用云存储(如 AWS S3),请修改为对应的配置。


7. 向量存储类型(建议)
- 大多数用户没有现成的向量数据库,可以根据需求选择类型。
- 推荐使用 Weaviate,功能强大且易于集成。
8. 知识库配置(可选)
- 建议自建 Unstructured:
- 支持自托管,但资源占用较高(仅容器就接近 6GB+)。
- 如果服务器配置足够高,建议安装。
- 官方 SaaS 也采用 Unstructured。
9. Nginx 配置(复用 4)
- 直接删除相关配置,使用 1Panel 自带的 OpenResty 替代。
10. SMTP 配置(必填)
- 从 1.0.0 版本开始,SMTP 配置为必填项,否则 API 容器会报错很难排查。
- 确保填写正确的 SMTP 服务器信息。
4.6修改.env.example的内容
# ------------------------------
# API 服务和工作者的环境变量
# ------------------------------
# ------------------------------
# 公共变量
# ------------------------------
# 控制台 API 的后端 URL,
# 用于连接授权回调。
# 如果为空,则为相同的域名。(xxx改成你自己的)
# 示例: https://api.console.dify.ai
CONSOLE_API_URL=https://xxx.xxx.com
# 控制台 Web 的前端 URL,
# 用于连接一些前端地址和 CORS 配置。
# 如果为空,则为相同的域名。
# 示例: https://console.dify.ai
CONSOLE_WEB_URL=https://xxx.xxx.com
# 服务 API URL,
# 用于将服务 API 基础 URL 显示到前端。
# 如果为空,则为相同的域名。
# 示例: https://api.dify.ai
SERVICE_API_URL=https://xxx.xxx.com
# WebApp API 后端 URL,
# 用于声明前端 API 的后端 URL。
# 如果为空,则为相同的域名。
# 示例: https://api.app.dify.ai
APP_API_URL=https://xxx.xxx.com
# WebApp URL,
# 用于将 WebAPP API 基础 URL 显示到前端。
# 如果为空,则为相同的域名。
# 示例: https://app.dify.ai
APP_WEB_URL=https://xxx.xxx.com
# 文件预览或下载 URL 前缀。
# 用于将文件预览或下载 URL 显示到前端或作为多模型输入;
# URL 会签名并且有过期时间。
FILES_URL=https://xxx.xxx.com
# ------------------------------
# 服务器配置
# ------------------------------
# 应用程序的日志级别。
# 支持的值有 `DEBUG`、`INFO`、`WARNING`、`ERROR`、`CRITICAL`(先改为DEBUG测试好后在改生产)
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
# 设置管理员用户初始化密码。
# 如果未设置,管理员用户在创建初始管理员帐户时将不会被提示输入密码。
# 创建初始管理员帐户时。
# 密码的长度不能超过30个字符。(可以留空可以填写,看自己)
INIT_PASSWORD=
# 部署环境。
# 支持的值为 `PRODUCTION`,`TESTING`。默认值是 `PRODUCTION`。
# 测试环境。前端页面上将有一个不同的颜色标签,
# 表示这是一个测试环境。(测试的时候用TESTING没问题再切换PRODUCTION)
DEPLOY_ENV=TESTING
# ------------------------------
# 数据库配置
# 数据库使用 PostgreSQL。请使用公共模式。
# 它与下面“db”服务中的配置一致。
# ------------------------------
#数据库用户名
DB_USERNAME=dify_xxxx
#数据库密码
DB_PASSWORD=xxxx
#数据库地址
DB_HOST=1Panel-postgresql-xxxx
#数据库端口,默认即可
DB_PORT=5432
#数据库名称,创建的表名
DB_DATABASE=dify_xxxx
# 数据库连接池的大小。
# 默认是 30 个连接,可以适当增加。
SQLALCHEMY_POOL_SIZE=30
# 数据库连接池回收时间,默认是 3600 秒。
SQLALCHEMY_POOL_RECYCLE=3600
# 是否打印 SQL,默认值是 false。
SQLALCHEMY_ECHO=false
# 数据库的最大连接数
# 默认是 100
#
# 参考:https://www.postgresql.org/docs/current/runtime-config-connection.html#GUC-MAX-CONNECTIONS
POSTGRES_MAX_CONNECTIONS=100
# ------------------------------
# Redis 配置
# 该 Redis 配置用于缓存和在对话过程中进行发布/订阅。
# ------------------------------
#redis地址
REDIS_HOST=1Panel-redis-APsA
#redis端口
REDIS_PORT=6379
#redis用户名,在1panel数据库页面找到redis 打开就看的到终端 输入 acl list 显示default或者其他就是你的用户名
REDIS_USERNAME=default
#redis数据库密码
REDIS_PASSWORD=ZR36UAiQF5Ab40ONl
REDIS_USE_SSL=false
REDIS_DB=0
# ------------------------------
# Celery 配置
# ------------------------------
# 使用 redis 作为代理,redis db 1 作为 celery 代理。
# 格式如下:`redis://<redis_username>:<redis_password>@<redis_host>:<redis_port>/<redis_database>`
# 示例:redis://:difyai123456@redis:6379/1
# 如果使用 Redis Sentinel,格式如下:`sentinel://<sentinel_username>:<sentinel_password>@<sentinel_host>:<sentinel_port>/<redis_database>`
# 示例:sentinel://localhost:26379/1;sentinel://localhost:26380/1;sentinel://localhost:26381/1
#第一个xxxx是密码,第二个xxxx填写你1panel容器的名称后四位
CELERY_BROKER_URL=redis://default:xxxx@1Panel-redis-xxxx:6379/1
BROKER_USE_SSL=false
# S3 配置
#在1panel容器的地址http:// 要加上
S3_ENDPOINT=http://1Panel-minio-kSyJ:9001
#us-east-1 默认即可
S3_REGION=us-east-1
#S3数据库名称difyai 需要去minio里面创建这个名称的 或者改成你想要的,这里要同步修改
S3_BUCKET_NAME=difyai
#两个密钥,自己创建后填写
S3_ACCESS_KEY=xxxx
S3_SECRET_KEY=xxxx
# 是否使用 AWS 管理的 IAM 角色进行 S3 服务的身份验证。
# 如果设置为 false,则必须提供访问密钥和密钥。
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 端点 URL。仅在 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
# ------------------------------
# 模型配置
# ------------------------------
# 提示生成允许的最大 token 数量。
# 此设置控制 LLM 在提示生成工具中生成提示时可以使用的最多 token 数量。
# 当在提示生成工具中生成提示时。
# 默认值:512 tokens。(自行修改)
PROMPT_GENERATION_MAX_TOKENS=512
# 代码生成允许的最大 token 数量。
# 此设置控制 LLM 在代码生成工具中生成代码时可以使用的最多 token 数量。
# 当在代码生成工具中生成代码时。
# 默认值:1024 tokens。(自行修改)
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
# ------------------------------
# 邮件相关配置
# ------------------------------
# 邮件类型,支持:resend, smtp(邮箱开启了smtp去所在邮箱提供商找到文档进行配置)
MAIL_TYPE=smtp
# 默认发件人邮箱地址,如果未指定
MAIL_DEFAULT_SEND_FROM=
# Resend 邮件提供商的 API-Key,当 MAIL_TYPE 为 `resend` 时使用。
RESEND_API_URL=https://api.resend.com
RESEND_API_KEY=your-resend-api-key
# SMTP 服务器配置,当 MAIL_TYPE 为 `smtp` 时使用
#邮箱通信地址
SMTP_SERVER=smtp.xxx.xxx.com
#465是SSL链接方式的端口号 ,默认
SMTP_PORT=465
#邮箱地址
SMTP_USERNAME=hello@xxx.com
#邮箱密码或者两步验证码
SMTP_PASSWORD=xxxx
#默认关闭,反之开启
SMTP_USE_TLS=false
SMTP_OPPORTUNISTIC_TLS=false
# ------------------------------
# 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@xxx.com
WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED=true
WEAVIATE_AUTHORIZATION_ADMINLIST_USERS=hello@xxx.com
#邮箱改成自己的
#后面基本上没什么要改的了,如果需要深度定制可以复制每一个参数发送给AI 让他帮你配置。
4.7修改 docker-compose-template.yaml
配置文件
在 docker-compose-template.yaml
文件中,删除不需要的容器代码,仅保留以下核心服务:
api
:提供核心 API 服务,负责处理业务逻辑和数据交互。worker
:用于异步任务处理,支持高并发场景。web
:前端服务,提供用户界面和交互功能。sandbox
:沙箱环境,用于安全执行用户代码。plugin_daemon
:插件守护进程,支持插件管理和运行。ssrf_proxy
:SSRF 防护代理,增强服务安全性。weaviate
:向量数据库,用于高效存储和检索向量数据。
通过精简容器配置数量配置复用,可以显著减少资源占用,同时确保核心功能的正常运行。优化后的配置文件更简洁,便于维护和扩展。
4.8修改docker-compose-template .yaml的内容
#这里只需要简单的修改和删除很多创建的多余容器即可。
#例如API服里面有 db和网络选项删行即可,可以直接复制我的使用,也可以照着我的自己进行修改。
#除了以下的内容,多余的全部删除
x-shared-env: &shared-api-worker-env
services:
# API 服务
api:
image: langgenius/dify-api:1.0.1
restart: always
environment:
# 使用共享的环境变量。
<<: *shared-api-worker-env
# 启动模式,'api' 启动 API 服务器。
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}
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}
volumes:
# 将存储目录挂载到容器中,用于存储用户文件。
- ./volumes/app/storage:/app/api/storage
networks:
- 1panel-network
ports:
- "5001:5001"
# worker 服务
# 用于处理队列的 Celery worker。
worker:
image: langgenius/dify-api:1.0.1
restart: always
environment:
# 使用共享的环境变量。
<<: *shared-api-worker-env
# 启动模式下,“worker”启动Celery worker以处理队列。
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}
PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800}
INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1}
volumes:
# 将存储目录挂载到容器中,用于存储用户文件。
- ./volumes/app/storage:/app/api/storage
networks:
- 1panel-network
# 前端web应用程序。
web:
image: langgenius/dify-web:1.0.1
restart: always
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:-}
MARKETPLACE_API_URL: ${MARKETPLACE_API_URL:-https://marketplace.dify.ai}
MARKETPLACE_URL: ${MARKETPLACE_URL:-https://marketplace.dify.ai}
TOP_K_MAX_VALUE: ${TOP_K_MAX_VALUE:-}
INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH: ${INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH:-}
PM2_INSTANCES: ${PM2_INSTANCES:-2}
LOOP_NODE_MAX_COUNT: ${LOOP_NODE_MAX_COUNT:-100}
MAX_TOOLS_NUM: ${MAX_TOOLS_NUM:-10}
networks:
- 1panel-network
ports:
- "3000:3000"
# Dify 沙箱。
sandbox:
image: langgenius/dify-sandbox:0.2.10
restart: always
environment:
# Dify 沙箱配置。
# 请确保在部署时将此密钥更改为一个强密钥。
# 您可以使用 `openssl rand -base64 42` 生成一个强密钥。
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:
- ./volumes/sandbox/dependencies:/dependencies
- ./volumes/sandbox/conf:/conf
healthcheck:
test: [ 'CMD', 'curl', '-f', 'http://localhost:8194/health' ]
networks:
- 1panel-network
# 插件守护进程
plugin_daemon:
image: langgenius/dify-plugin-daemon:0.0.4-local
restart: always
environment:
# 使用共享的环境变量。
<<: *shared-api-worker-env
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}
DIFY_INNER_API_URL: ${PLUGIN_DIFY_INNER_API_URL:-http://api:5001}
DIFY_INNER_API_KEY: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1}
PLUGIN_REMOTE_INSTALLING_HOST: ${PLUGIN_DEBUGGING_HOST:-0.0.0.0}
PLUGIN_REMOTE_INSTALLING_PORT: ${PLUGIN_DEBUGGING_PORT:-5003}
PLUGIN_WORKING_PATH: ${PLUGIN_WORKING_PATH:-/app/storage/cwd}
FORCE_VERIFYING_SIGNATURE: ${FORCE_VERIFYING_SIGNATURE:-true}
PYTHON_ENV_INIT_TIMEOUT: ${PLUGIN_PYTHON_ENV_INIT_TIMEOUT:-120}
PLUGIN_MAX_EXECUTION_TIMEOUT: ${PLUGIN_MAX_EXECUTION_TIMEOUT:-600}
PIP_MIRROR_URL: ${PIP_MIRROR_URL:-}
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
restart: always
volumes:
- ./ssrf_proxy/squid.conf.template:/etc/squid/squid.conf.template
- ./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:
# pls clearly modify the squid env vars to fit your network 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:
- 1panel-network
# Weaviate 向量存储。
weaviate:
image: semitechnologies/weaviate:1.19.0
profiles:
- ''
- weaviate
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}
AUTHENTICATION_APIKEY_ALLOWED_KEYS: ${WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS:-WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih}
AUTHENTICATION_APIKEY_USERS: ${WEAVIATE_AUTHENTICATION_APIKEY_USERS:-hello@edirk.com}
AUTHORIZATION_ADMINLIST_ENABLED: ${WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED:-true}
AUTHORIZATION_ADMINLIST_USERS: ${WEAVIATE_AUTHORIZATION_ADMINLIST_USERS:-hello@edirk.com}
networks:
- 1panel-network
networks:
# 在 sandbox、api 和 ssrf_proxy 之间创建一个网络,并且无法访问外部。
1panel-network:
external: true
volumes:
oradata:
dify_es01_data:
.env.example和docker-compose-template.yaml按需要修改填入即可
提取码:kFJV
五、开始生成生成docker-compose.yaml的配置文件,准备部署
打开目录/opt/1panel/apps/dify/dify-main/docker删除目录下原本的.env.example和docker-compose-template.yaml文件,然后把下载的这两个文件替换进去。

使用你的SSH终端(推荐)或者1panel面板里面的自带终端输入命令
cp .env.example .env 复制环境变量
./generate_docker_compose 自动生成docker-compose.yaml部署文件
docker compose up -d 开始启动自动部署容器
docker compose down 关闭容器
5.1前提条件
在完成以上步骤之前,请确保已安装并配置好以下服务:
- MinIO:用于文件存储。
- Redis:用于缓存和任务队列。
- PostgreSQL:用于数据存储。
只有在这些服务正常运行后,才能顺利进行后续操作。
5.2使用1panel创建容器编排(可选)


六、如何使用域名进行访问?
6.1在1panel网站里面新建一个反向代理

然后点开网站的配置开始设置域名后端的访问反向地址,不配置可能一直卡引导安装界面无法访问(必要)
(api接口)
api /api http://127.0.0.1:5001
(后端API接口)
consoleapi /console/api http://127.0.0.1:5001
(文件地址)
files /files http://127.0.0.1:5001
(模型接口)
v1 /v1 http://127.0.0.1:5001


七、为你的域名开启SSL,(可选)
如果你在配置文件里面填入的6个地址是HTTPS开头的地址这里就必须要配置SSL
你需要上传你的域名证书,或者通过1panel面板进行申请免费的SSL证书(有效期3个月)自动续期,创建一个ACME账户和填入你自己的服务器DNS解析访问控制账户,申请好证书后去域名配置里面选择HTTPS开启SSL,我使用的是阿里云的服务,这里自行研究。


八、最后访问你设置的域名验证是否成功搭建完毕。
输入网站后第一次进入需要等待至多5分钟(看服务器配置),然后开始配置邮箱密码就进入了主页面,如果迟迟不进入一直转圈,可以打开容器的日志页面查看当前的容器信息,例如docker-worker-1这个容器


九、结尾,后续更新
后续更新请看:
本文为原创文章,灵感来源,B站UP主进击的肉饼饼帮助的过程 【如何在linux系统定制化本地部署Dify】