范围与目标
本文面向首次接触 Dify 的技术团队与个人开发者,提供从零开始到对外可用的完整部署流程,覆盖本地验证、服务器上线、反向代理与 HTTPS、模型与向量库接入、性能与安全加固,以及面向生产的监控、备份、伸缩和自动化运维实践。示例以常见的 Linux 服务器与 Docker 生态为主,同时给出在 Kubernetes 集群中的落地思路,确保可平滑演进至更大规模与更高可用的架构。
架构概览
核心组件
- 应用层:Dify Web 控制台、API 服务、后台 Worker。
- 数据层:PostgreSQL(事务与配置数据)、Redis(缓存与任务队列)、对象存储(上传文件与知识库原文)。
- 检索层:向量数据库(pgvector、Milvus、Weaviate、Qdrant 等)。
- 模型层:LLM 与嵌入模型(OpenAI、Azure OpenAI、DeepSeek、Ollama、本地推理服务等)。
- 外围层:反向代理与 HTTPS、日志与监控、告警、备份与恢复。
典型流转
用户通过浏览器访问反向代理,反向代理将请求转发至 Dify API/Web;API 与 Worker 访问 PostgreSQL、Redis 与对象存储;知识检索路径经由向量数据库完成召回与重排序;模型调用走外部 LLM 平台或自建推理服务;日志与指标经由采集器输出至日志系统与监控平台。
部署方式对比
Docker Compose
- 优点:上手快、组件一体化、维护简单、适合单机或小规模。
- 适用:原型验证、中小团队内部部署、资源受限环境。
Kubernetes
- 优点:弹性伸缩、滚动升级、服务治理完善、易于与云原生生态集成。
- 适用:生产级、跨可用区、高可用与高吞吐需求。
云托管与自建
- 云托管:更少运维、快速上线、按需扩缩,成本可控但受平台限制。
- 自建:灵活可控、数据在握,需投入运维与监控体系建设。
前置准备
硬件与系统
- 操作系统:Ubuntu 20.04+ 或 Debian/RHEL 同级;确保时区与 NTP 正确。
- 资源建议:2–4 核 CPU、8–16GB 内存、50GB+ SSD;生产视并发与知识库规模增配。
- 网络:放通 80/443、数据库与 Redis 内网访问;禁止数据库与 Redis 对公网暴露。
- 依赖:Docker 24+、Docker Compose v2+ 或 Kubernetes 1.25+。
域名与证书
- 准备二级域名,如 app.example.com 指向服务器公网 IP。
- 建议使用自动签发证书(Caddy/Traefik/Certbot),或导入现有证书链。
外部服务与凭据
- 模型服务:OpenAI/兼容服务或 Azure OpenAI、DeepSeek、Ollama、本地推理网关。
- 对象存储:S3/MinIO,配置访问键与桶策略。
- 邮件:SMTP 凭据用于账号激活与通知。
- 单点登录:如企业内部 OAuth2/OIDC、SAML(可选)。
Docker Compose 部署
获取项目与目录结构
在部署主机创建工作目录,拉取发布版本镜像或官方示例编排文件,使用专用数据目录持久化 PostgreSQL、Redis 与对象存储数据,避免容器销毁导致数据丢失。建议结构如下:
/opt/dify/
├─ compose.yml
├─ .env
├─ config/
│ ├─ app.env
│ └─ nginx.conf
├─ data/
│ ├─ postgres/
│ ├─ redis/
│ └─ minio/
└─ logs/
环境变量与配置
核心环境项示例(根据实际镜像版本与发布说明调整):
# .env
DIFY_EXTERNAL_URL=https://app.example.com
DIFY_ENABLE_SIGNUP=false
DIFY_ENABLE_EMAIL_SIGNIN=true
DIFY_SMTP_HOST=smtp.example.com
DIFY_SMTP_PORT=587
DIFY_SMTP_USER=mailer@example.com
DIFY_SMTP_PASS=请替换为强密码
DIFY_SMTP_FROM=mailer@example.com
# 数据库
POSTGRES_USER=dify
POSTGRES_PASSWORD=强密码
POSTGRES_DB=dify
# Redis
REDIS_PASSWORD=强密码
# 对象存储(S3/MinIO)
S3_ENDPOINT=http://minio:9000
S3_ACCESS_KEY=minioadmin
S3_SECRET_KEY=minioadmin
S3_BUCKET=dify-objects
S3_REGION=us-east-1
S3_FORCE_PATH_STYLE=true
# 向量库(pgvector 或外部 Milvus/Weaviate)
VECTOR_DB=pgvector
应用容器读取上述变量以连接数据库、缓存、存储与外部服务。对外地址用于构建回调与资源链接,务必与反向代理暴露的域名一致。
示例 compose 文件
services:
postgres:
image: postgres:15
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- ./data/postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
interval: 10s
retries: 5
redis:
image: redis:7
command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}"]
volumes:
- ./data/redis:/data
minio:
image: minio/minio:latest
environment:
MINIO_ROOT_USER: ${S3_ACCESS_KEY}
MINIO_ROOT_PASSWORD: ${S3_SECRET_KEY}
command: server /data --console-address ":9001"
volumes:
- ./data/minio:/data
dify-api:
image: langgenius/dify-api:latest
env_file: .env
environment:
DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}
REDIS_URL: redis://default:${REDIS_PASSWORD}@redis:6379/0
STORAGE_ENDPOINT: ${S3_ENDPOINT}
STORAGE_ACCESS_KEY: ${S3_ACCESS_KEY}
STORAGE_SECRET_KEY: ${S3_SECRET_KEY}
STORAGE_BUCKET: ${S3_BUCKET}
depends_on:
- postgres
- redis
- minio
dify-web:
image: langgenius/dify-web:latest
environment:
DIFY_API_BASE_URL: http://dify-api:5001
depends_on:
- dify-api
dify-worker:
image: langgenius/dify-worker:latest
env_file: .env
environment:
DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}
REDIS_URL: redis://default:${REDIS_PASSWORD}@redis:6379/0
depends_on:
- dify-api
- redis
gateway:
image: caddy:2
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
depends_on:
- dify-web
- dify-api
volumes:
caddy_data:
caddy_config:
反向代理与 HTTPS
使用 Caddy 自动签发证书示例:
# Caddyfile
app.example.com {
encode zstd gzip
tls {
issuers acme
}
@web path_regexp ^/(?!api/).*
handle @web {
reverse_proxy dify-web:3000
}
handle_path /api/* {
reverse_proxy dify-api:5001
}
}
如使用 Nginx/Certbot,保持相同的路由与超时策略,建议为长链接与大文件上传适当提升超时与缓冲区。
首次启动与初始化
- 执行启动:在工作目录运行 docker compose up -d。
- 健康检查:确认各容器状态正常,日志无报错,能通过域名访问界面。
- 管理员:通过邮件或命令行初始化管理员账号,关闭公开注册。
- 存储桶:在 MinIO 控制台创建指定桶名称,设置私有访问与生命周期。
常见问题
- 502/超时:检查反向代理转发与 API 服务端口,增大 proxy_read_timeout。
- 对象存储失败:校验 S3_ENDPOINT、访问键与桶存在性,启用路径样式。
- 知识库检索为空:确认向量库配置与嵌入模型可用,检查 Worker 日志。
- 邮件收发异常:核对发件人域、端口与 TLS/STARTTLS 设置。
Kubernetes 部署
镜像与拉取
- 选用官方镜像并配置镜像源凭据(如私有仓库)。
- 使用 ImagePullSecrets 管理拉取凭据,统一镜像标签策略。
配置与密钥
- ConfigMap:非机密配置如外部 URL、特性开关。
- Secret:数据库、Redis、S3、SMTP 等机密凭据,分命名空间隔离。
工作负载与服务
# 示例片段(省略非关键字段)
apiVersion: apps/v1
kind: Deployment
metadata:
name: dify-api
spec:
replicas: 2
strategy:
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
template:
spec:
containers:
- name: api
image: langgenius/dify-api:latest
envFrom:
- configMapRef: {name: dify-config}
- secretRef: {name: dify-secrets}
readinessProbe:
httpGet: {path: /healthz, port: 5001}
livenessProbe:
httpGet: {path: /healthz, port: 5001}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dify
annotations:
cert-manager.io/cluster-issuer: letsencrypt
spec:
tls:
- hosts: [app.example.com]
secretName: dify-tls
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend: {service: {name: dify-web, port: {number: 3000}}}
- path: /api
pathType: Prefix
backend: {service: {name: dify-api, port: {number: 5001}}}
有状态与持久化
- PostgreSQL、Redis、MinIO 使用 StatefulSet+PVC 或托管云服务。
- 设置存储类、读写模式与备份快照策略;关键数据多副本或跨可用区。
伸缩与升级
- 开启 HPA,基于 CPU/内存/自定义指标进行弹性伸缩。
- 使用滚动升级与金丝雀发布;对 Worker 高峰任务可临时扩容。
监控与日志
- Prometheus 收集容器与自定义指标,Grafana 展示看板。
- Loki/Elastic 收集应用日志,配置按服务与环境分流。
- 告警:延迟、错误率、队列堆积、磁盘空间、证书到期。
外部能力接入
LLM 与嵌入模型
- OpenAI/兼容:配置 API Key、Base URL、模型名称、超时与重试。
- Azure OpenAI:指定资源名、部署名与 API 版本。
- DeepSeek 等:对齐兼容协议与鉴权头,留意并发限流与账单。
- Ollama/本地推理:将推理网关内网服务化,限制公网访问。
- 嵌入模型:区分中文与多语场景,评估向量维度与召回效果。
向量数据库
- pgvector:适合中小规模,维护简单,与 PostgreSQL 同源备份。
- Milvus/Weaviate/Qdrant:更高吞吐与扩展性,需专门运维与监控。
- 参数建议:合适的索引类型、分片与副本数、压缩与落盘策略。
对象存储
- S3/MinIO:启用私有桶与预签名访问,设置生命周期与版本管理。
- 网络:应用与存储位于同一私有网络或 VPC,减少延迟与外泄。
身份与权限
- SMTP:统一发信域,启用 SPF、DKIM、DMARC 以提高送达率。
- SSO:OIDC/SAML 对接企业 IdP,映射角色与租户边界。
- 审计:记录关键变更、模型调用与数据导出操作。
安全加固
网络与访问控制
- 仅暴露 80/443;数据库、Redis、对象存储保持内网访问。
- 细粒度防火墙策略与安全组,最小权限放通。
- 反爬与限流:由网关或 WAF 实施速率限制与 IP 封禁。
机密管理
- 分级管理 API Key 与凭据,定期轮换,启用审计与告警。
- Kubernetes 使用 Secret 与加密存储;Docker 环境避免将密钥写入镜像。
数据与合规
- 隐私:敏感字段脱敏存储与展示,访问日志留痕。
- 加密:传输层全站 HTTPS,静态数据采用磁盘与对象存储加密。
性能调优
应用与并发
- API 与 Worker 分离伸缩,异步任务充分利用队列并发。
- 连接池:数据库与向量库连接池大小依据核心数与延迟调整。
- 超时与重试:模型调用设置上限,区分幂等与非幂等操作策略。
数据库与索引
- PostgreSQL:合理 shared_buffers、work_mem、wal 相关参数;热点表与索引监控膨胀。
- 向量库:批量写入、分段构建索引,查询时控制 topK 与过滤条件。
缓存与队列
- Redis:划分独立 DB 与键前缀,设置过期与淘汰策略。
- 热点缓存:对模型配置、应用清单等短TTL缓存,减少数据库压力。
高可用与灾备
多副本与隔离
- API/Web 多副本部署,前置负载均衡健康检查。
- 数据库主从或云托管高可用版,读写分离与自动故障转移。
- 对象存储与向量库跨可用区副本与版本管理。
备份与演练
- 备份项:PostgreSQL 冷热备份、对象存储桶版本化、向量库快照、配置与密钥。
- 频率:日常增量、每周全量;保留周期与合规对齐。
- 演练:定期在隔离环境完成恢复验证,测量 RTO/RPO。
多环境与发布
环境分层
- dev/staging/prod 分离命名空间或独立集群,使用差异化配置。
- 外部依赖分环境隔离,避免测试流量进入生产账单。
灰度与回滚
- 基于权重或标签的流量分配,观测错误率与延迟后逐步扩大。
- 保留上一版本镜像与数据快照,触发自动回滚策略。
监控与可观测性
指标体系
- 服务健康:请求量、响应时间、错误率、队列堆积、并发数。
- 模型调用:成功率、重试率、单位成本、各模型配额与限流。
- 数据库:连接、慢查询、缓存命中、复制延迟。
日志与追踪
- 结构化日志:包含请求 ID、租户、用户、模块、耗时与错误码。
- 分布式追踪:接入标准追踪头,定位跨服务瓶颈。
成本与配额
资源与用量
- 按需扩缩:模型侧并发与 token 上限、向量库存储增长曲线。
- 分环境预算:开发与测试使用低成本模型与较小副本数。
- 缓存与复用:复用嵌入,减少重复向量化与调用次数。
自动化与运维脚本
CI/CD
- 构建:按分支生成镜像标签,扫描依赖漏洞与许可证。
- 部署:阶段化发布,集成数据库迁移脚本与健康检查。
定时与巡检
- 定时任务:日志归档、冷数据迁移、索引重建、备份校验。
- 巡检清单:证书有效期、磁盘与 inode、任务队列延迟、失败重试率。
上线校验与验收
功能验证
- 账号体系:注册、登录、密码重置、角色权限与租户隔离。
- 知识库:上传、切分、向量化、检索与召回结果可解释性。
- 应用编排:流程配置、变量注入、模型切换与 A/B 对照。
非功能验证
- 负载测试:典型并发与峰值压力,定位瓶颈并调优。
- 故障演练:断开外部模型、向量库与数据库,验证降级策略。
- 安全扫描:镜像、依赖、公开端口、弱口令与暴露面检查。
实用排错策略
定位路径
- 从网关到应用:先看 4xx/5xx,再查上游与下游服务。
- 分流量与数据:请求是否进入目标副本、是否命中缓存、是否触发限流。
- 最小化复现场景:用相同输入在测试环境重放,捕捉精确堆栈。
高频问题
- 模型限流:实现指数退避与熔断,必要时切换备用模型。
- 长文本超时:启用流式响应或分块处理,调整超时阈值。
- 检索不稳定:优化分词与切分粒度,提升向量化质量与召回阈值。
最佳实践清单
- 环境隔离:配置、凭据、网络、存储分环境分域管理。
- 最小权限:服务账号与访问策略仅授予必须的操作。
- 观测先行:没有可观测性就不要贸然扩容或改造。
- 自动化优先:构建、发布、备份、验证、回滚尽量流水线化。
- 经常演练:备份恢复、故障切换、证书与密钥轮换。
- 成本透明:模型与向量库账单可视化与告警。
示例操作步骤
单机到生产的迁移路径
- 步骤一:本地或单机 Docker Compose 启动,完成管理员初始化。
- 步骤二:接入外部模型与对象存储,验证知识库与应用流程。
- 步骤三:引入反向代理与正式域名,启用 HTTPS 与限流策略。
- 步骤四:分离数据层到托管服务或独立节点,设置备份与监控。
- 步骤五:将 API/Web/Worker 拆分多副本,设置水平伸缩。
- 步骤六:迁移至 Kubernetes(如需),引入 HPA、Ingress 与集中日志。
- 步骤七:完善 CI/CD、灰度发布、回滚与演练流程。
日常维护要点
- 变更管理:每次配置或模型策略变更需记录与回溯。
- 配额监控:API Key 用量、速率与账单阈值达标告警。
- 数据健康:数据库膨胀、索引重建、向量库碎片与再索引窗口。
- 安全基线:定期扫描镜像与依赖,修复高危 CVE。
- 用户支持:错误码与日志一致性,构建内部知识库便于自助排障。
参考参数建议
超时与重试
- 网关层:读超时 120–300s,上传适度放宽。
- 模型调用:重试 2–3 次,指数退避与抖动,区分可重试错误。
连接与队列
- 数据库连接池:每副本 20–50 起步,视延迟与并发调整。
- Redis 队列并发:Worker 实例并发乘以队列数,按 CPU 与 I/O 平衡。
安全与合规补充
数据生命周期
- 保留策略:原文与向量定期归档或清理,遵循最小保存期限。
- 访问边界:按租户、项目与角色隔离数据视图与操作权限。
第三方依赖
- 供应商评估:SLA、隐私条款、数据驻留、加密与安全认证。
- 密钥托管:集中化密钥管理,最小暴露,日志审计可查询。
实践范式
团队协作
- 配置即代码:所有环境变量、路由、资源配额写入版本库。
- 知识沉淀:将排错经验与运行手册放入内部文档与自动化脚本。
- 反馈闭环:从监控与工单回流到配置优化与容量规划。
© 版权声明
文章版权归作者所有,未经允许请勿转载。