使用 Docker 搭建 Dify 1.0.1 开源 LLM 应用平台:基于 1panel 定制化部署与官方文档的完整教程

本文详细介绍如何使用 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 管理服务器,可按以下步骤操作:

  1. 上传源码
    将下载或克隆的 Dify 压缩包上传至服务器目录(自己自定义目录)例如: /opt/1panel/apps/
  2. 新建目录并解压
    在上传目录中新建文件夹(如 dify),将压缩包(dify-main.zip)解压到该目录内。
  3. 使用 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如何避免重复部署并复用已安装的组件?

  1. 复用已安装组件:若这些服务(OpenResty, PostgreSQL, Redis, MinIO)已经在 1panel 中安装,可以避免使用 Dify 官方命令再次进行部署。在此情况下,您只需根据需求修改相关的环境变量和配置文件。
  2. 翻译环境变量和 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 文件中,删除不需要的容器代码,仅保留以下核心服务:

  1. api:提供核心 API 服务,负责处理业务逻辑和数据交互。
  2. worker:用于异步任务处理,支持高并发场景。
  3. web:前端服务,提供用户界面和交互功能。
  4. sandbox:沙箱环境,用于安全执行用户代码。
  5. plugin_daemon:插件守护进程,支持插件管理和运行。
  6. ssrf_proxy:SSRF 防护代理,增强服务安全性。
  7. 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前提条件

在完成以上步骤之前,请确保已安装并配置好以下服务:

  1. MinIO:用于文件存储。
  2. Redis:用于缓存和任务队列。
  3. 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】

3
0