c677393d08
Deploy Wiki to Production / deploy (push) Has been cancelled
- 银行业Agent建设方案/报告/ 4 篇:建设方案 · 智能中台 · 意图识别 · 合规风险 - 研发型企业AI转型方案/报告/ 9 篇:角色矩阵(交互版) · 培训1-6课 · 角色矩阵 · 实操培训 · 培训路线图 - AI Agent 驾驭工程/报告/ 1 篇:Harness Engineering 全面解析 - 简历AI技术讲解.html + .md - Dify部署分析报告.html
503 lines
29 KiB
HTML
503 lines
29 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Dify 本机部署分析报告</title>
|
||
<style>
|
||
:root {
|
||
--color-primary: #0078D4; --color-primary-hover: #106EBE; --color-primary-active: #005A9E; --color-primary-bg: #DEECF9;
|
||
--color-success: #107C10; --color-success-bg: #DFF6DD; --color-success-border: #A7E3A1;
|
||
--color-warning: #FF8C00; --color-warning-bg: #FFF4CE; --color-warning-border: #FFD335;
|
||
--color-error: #FF4D4F; --color-error-bg: #FDE7E9; --color-error-border: #EEACB2;
|
||
--bg: #FAF9F8; --bg-container: #FFFFFF; --bg-elevated: #F3F2F1;
|
||
--border: #E1DFDD; --border-light: #EDEBE9;
|
||
--text-primary: #201F1E; --text-secondary: #605E5C; --text-tertiary: #8A8886;
|
||
--radius-xs: 2px; --radius-sm: 4px; --radius-md: 6px; --radius-lg: 8px;
|
||
--shadow-sm: 0 0 2px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.14);
|
||
--shadow-md: 0 0 2px rgba(0,0,0,0.12), 0 2px 4px rgba(0,0,0,0.14);
|
||
--header-h: 64px; --sidebar-w: 260px;
|
||
}
|
||
*{margin:0;padding:0;box-sizing:border-box;}
|
||
body{font-family:'Segoe UI Variable Text','Segoe UI',system-ui,-apple-system,BlinkMacSystemFont,'PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;background:var(--bg);color:var(--text-primary);line-height:1.57;font-size:14px;}
|
||
::-webkit-scrollbar{width:6px;height:6px;}
|
||
::-webkit-scrollbar-track{background:transparent;}
|
||
::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px;}
|
||
|
||
/* ===== Header ===== */
|
||
.header{position:fixed;top:0;left:0;right:0;height:var(--header-h);background:rgba(255,255,255,0.85);backdrop-filter:blur(24px) saturate(125%);border-bottom:1px solid var(--border-light);display:flex;align-items:center;padding:0 2rem;z-index:100;}
|
||
.header .menu-btn{width:36px;height:36px;border:none;background:none;cursor:pointer;border-radius:var(--radius-sm);display:none;align-items:center;justify-content:center;flex-shrink:0;padding:0;color:var(--text-secondary);margin-right:8px;}
|
||
.header .menu-btn:hover{background:var(--bg-elevated);}
|
||
.header .menu-btn svg{width:20px;height:20px;}
|
||
.header .back-link{margin-right:16px;font-size:13px;color:var(--color-primary);text-decoration:none;flex-shrink:0;}
|
||
.header .back-link:hover{text-decoration:underline;}
|
||
.header h1{font-size:18px;font-weight:700;background:linear-gradient(135deg,#0078D4 0%,#2B88D8 100%);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent;}
|
||
|
||
/* ===== Sidebar ===== */
|
||
.sidebar{position:fixed;top:var(--header-h);left:0;bottom:0;width:var(--sidebar-w);background:var(--bg-container);border-right:1px solid var(--border);overflow-y:auto;padding:1.25rem 0;z-index:90;}
|
||
.sidebar .toc-label{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-tertiary);padding:0 1.25rem;margin-bottom:.75rem;font-weight:600;}
|
||
.sidebar nav a{display:block;padding:.45rem 1.25rem;color:var(--text-secondary);text-decoration:none;font-size:13px;line-height:1.4;border-left:2px solid transparent;transition:all .15s;}
|
||
.sidebar nav a:hover,.sidebar nav a.active{color:var(--color-primary);background:var(--color-primary-bg);}
|
||
.sidebar nav a.active{border-left-color:var(--color-primary);font-weight:600;}
|
||
|
||
/* ===== Sidebar overlay (mobile) ===== */
|
||
.sidebar-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,0.3);z-index:85;}
|
||
|
||
/* ===== Main ===== */
|
||
.main{margin-left:var(--sidebar-w);margin-top:var(--header-h);padding:32px 40px 64px;max-width:1100px;}
|
||
|
||
h2{font-size:22px;line-height:30px;padding-bottom:8px;border-bottom:1px solid var(--border);margin:40px 0 20px;color:var(--color-primary);scroll-margin-top:calc(var(--header-h) + 1rem);}
|
||
h3{font-size:18px;line-height:26px;margin:28px 0 12px;color:var(--text-primary);scroll-margin-top:calc(var(--header-h) + 1rem);}
|
||
h4{font-size:15px;line-height:22px;margin:20px 0 8px;color:var(--text-secondary);font-weight:600;}
|
||
|
||
p{margin:8px 0 16px;color:var(--text-secondary);}
|
||
strong{color:var(--text-primary);}
|
||
|
||
blockquote{background:var(--color-primary-bg);border-left:4px solid var(--color-primary);margin:16px 0;padding:12px 20px;border-radius:0 var(--radius-sm) var(--radius-sm) 0;font-size:14px;color:var(--text-primary);}
|
||
|
||
ul,ol{margin:8px 0 16px 20px;color:var(--text-secondary);}
|
||
li{margin-bottom:6px;line-height:1.6;}
|
||
|
||
code{font-family:'Cascadia Code','Fira Code','SF Mono',Consolas,monospace;background:var(--bg-elevated);padding:2px 6px;border-radius:var(--radius-xs);font-size:12.5px;color:var(--color-primary);}
|
||
pre{background:#1E1E1E;color:#D4D4D4;padding:16px 20px;border-radius:var(--radius-md);overflow-x:auto;margin:16px 0;font-size:13px;line-height:1.6;font-family:'Cascadia Code','Fira Code','SF Mono',Consolas,monospace;}
|
||
pre code{background:transparent;padding:0;color:inherit;font-size:inherit;}
|
||
|
||
.table-wrap{overflow-x:auto;margin:20px 0;border:1px solid var(--border);border-radius:var(--radius-md);}
|
||
table{width:100%;border-collapse:collapse;font-size:13px;margin:12px 0;}
|
||
th,td{padding:10px 14px;border:1px solid var(--border);text-align:left;vertical-align:top;line-height:1.5;}
|
||
th{background:var(--bg-elevated);font-weight:700;color:var(--text-primary);white-space:nowrap;font-size:12px;}
|
||
td{background:var(--bg-container);color:var(--text-secondary);}
|
||
|
||
.tag-row{display:flex;flex-wrap:wrap;gap:8px;margin:16px 0 24px;}
|
||
.tag-row span{font-size:12px;color:var(--text-secondary);background:var(--bg-elevated);padding:4px 12px;border-radius:var(--radius-sm);font-weight:500;}
|
||
|
||
.summary-box{background:var(--color-warning-bg);border:1px solid var(--color-warning-border);border-radius:var(--radius-md);padding:18px 22px;margin:14px 0;font-size:14px;color:var(--text-primary);}
|
||
|
||
/* status indicators */
|
||
.status-exited{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--color-warning);margin-right:6px;}
|
||
.status-oom{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--color-error);margin-right:6px;}
|
||
.status-ok{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--color-success);margin-right:6px;}
|
||
|
||
.badge{display:inline-block;font-size:11px;font-weight:600;padding:2px 8px;border-radius:var(--radius-xs);margin-left:6px;}
|
||
.badge-warn{background:var(--color-warning-bg);color:#8A6D00;}
|
||
.badge-err{background:var(--color-error-bg);color:var(--color-error);}
|
||
.badge-ok{background:var(--color-success-bg);color:var(--color-success);}
|
||
|
||
.arch-diagram{background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius-md);padding:20px 24px;margin:16px 0;overflow-x:auto;font-family:'Cascadia Code','Fira Code','SF Mono',Consolas,monospace;font-size:12px;line-height:1.7;white-space:pre;color:var(--text-secondary);}
|
||
|
||
.legend{display:flex;flex-wrap:wrap;gap:18px;margin:10px 0 16px;font-size:13px;color:var(--text-secondary);}
|
||
.legend span{display:inline-flex;align-items:center;gap:5px;}
|
||
|
||
details{margin:10px 0;}
|
||
details summary{cursor:pointer;font-size:14px;font-weight:600;color:var(--color-primary);padding:6px 0;user-select:none;}
|
||
details summary:hover{color:var(--color-primary-hover);}
|
||
|
||
.footer{text-align:center;padding:28px 0;color:var(--text-tertiary);font-size:13px;border-top:1px solid var(--border-light);margin-top:40px;}
|
||
|
||
/* ===== Tablet ===== */
|
||
@media(max-width:1024px){
|
||
:root{--sidebar-w:220px;}
|
||
.main{padding:24px 28px 48px;max-width:100%;}
|
||
}
|
||
|
||
/* ===== Mobile ===== */
|
||
@media(max-width:768px){
|
||
:root{--sidebar-w:0;}
|
||
.header .menu-btn{display:flex;}
|
||
.sidebar{transform:translateX(-100%);transition:transform 167ms cubic-bezier(0.8,0.0,0.2,1.0);}
|
||
.sidebar.open{transform:translateX(0);}
|
||
.sidebar-overlay.show{display:block;}
|
||
.main{margin-left:0;padding:20px 16px 40px;}
|
||
.header h1{font-size:15px;}
|
||
.arch-diagram{font-size:10px;padding:14px 16px;}
|
||
pre{font-size:11px;padding:12px 14px;}
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
|
||
<header class="header">
|
||
<button class="menu-btn" id="menuBtn" aria-label="菜单" onclick="toggleSidebar()">
|
||
<svg viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z" clip-rule="evenodd"/></svg>
|
||
</button>
|
||
<a href="./index.html" class="back-link">← 返回知识库</a>
|
||
<h1>Dify 本机部署分析报告</h1>
|
||
</header>
|
||
|
||
<div class="sidebar-overlay" id="sidebarOverlay" onclick="closeSidebar()"></div>
|
||
|
||
<aside class="sidebar" id="sidebar">
|
||
<div class="toc-label">章节导航</div>
|
||
<nav>
|
||
<a href="#s1">1. 什么是 Dify</a>
|
||
<a href="#s2">2. 部署概览</a>
|
||
<a href="#s3">3. 部署架构拓扑</a>
|
||
<a href="#s4">4. 核心功能技术方案</a>
|
||
<a href="#s5">5. 关键配置</a>
|
||
<a href="#s6">6. 数据卷</a>
|
||
<a href="#s7">7. 当前问题 & 排查方向</a>
|
||
<a href="#s8">8. 常用运维命令</a>
|
||
<a href="#s9">9. Profile 说明</a>
|
||
</nav>
|
||
</aside>
|
||
|
||
<div class="main">
|
||
|
||
<p style="font-size:15px;margin-top:4px;color:var(--text-tertiary);">分析日期:2026-06-08 | Dify 版本:1.14.2 | 部署环境:PRODUCTION</p>
|
||
|
||
<div class="tag-row">
|
||
<span>LLMOps</span><span>RAG 知识库</span><span>Workflow 工作流</span>
|
||
<span>Agent 智能体</span><span>Docker Compose</span><span>Weaviate</span><span>PostgreSQL</span>
|
||
</div>
|
||
|
||
<div class="summary-box">
|
||
<strong>⚠️ 当前状态:全部服务已停止</strong>(约 41 小时前退出)。部分容器因内存不足被杀(OOM)。<br>
|
||
重启命令:<code>cd /home/zdh/dify && docker compose up -d</code>
|
||
</div>
|
||
|
||
<!-- ===== 1. 什么是 Dify ===== -->
|
||
<h2 id="s1">1. 什么是 Dify</h2>
|
||
|
||
<blockquote>
|
||
<strong>Dify</strong> 是一个开源 LLMOps 平台——可视化搭建 AI 应用(RAG 知识库 + 工作流编排 + Agent),对接主流 LLM,提供 API + Web 聊天界面的一站式平台。
|
||
</blockquote>
|
||
|
||
<h3>三大核心场景</h3>
|
||
<ol>
|
||
<li><strong>知识库问答(RAG)</strong> — 上传文档 → 向量化 → LLM 检索增强生成</li>
|
||
<li><strong>工作流编排(Workflow)</strong> — 拖拽式画布,串联 LLM / 代码 / HTTP / 条件分支等节点</li>
|
||
<li><strong>Agent 智能体</strong> — 带工具调用(Function Calling)的自主推理 Agent</li>
|
||
</ol>
|
||
|
||
<!-- ===== 2. 部署概览 ===== -->
|
||
<h2 id="s2">2. 部署概览</h2>
|
||
|
||
<div class="table-wrap"><table>
|
||
<thead><tr><th>项目</th><th>详情</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>安装位置</td><td><code>/home/zdh/dify/</code></td></tr>
|
||
<tr><td>版本</td><td><strong>1.14.2</strong></td></tr>
|
||
<tr><td>部署环境</td><td>PRODUCTION</td></tr>
|
||
<tr><td>运行状态</td><td>⚠️ 全部容器已停止</td></tr>
|
||
<tr><td>暴露端口</td><td><code>8082</code> (HTTP)</td></tr>
|
||
<tr><td>安装方式</td><td>Docker Compose(源码拉取 + .env 配置)</td></tr>
|
||
</tbody>
|
||
</table></div>
|
||
|
||
<h3>容器镜像清单</h3>
|
||
<div class="table-wrap"><table>
|
||
<thead><tr><th>镜像</th><th>版本</th><th>镜像大小</th></tr></thead>
|
||
<tbody>
|
||
<tr><td><code>langgenius/dify-api</code></td><td>1.14.2</td><td>4.12 GB</td></tr>
|
||
<tr><td><code>langgenius/dify-web</code></td><td>1.14.2</td><td>759 MB</td></tr>
|
||
<tr><td><code>langgenius/dify-plugin-daemon</code></td><td>0.6.1-local</td><td>2.31 GB</td></tr>
|
||
<tr><td><code>langgenius/dify-sandbox</code></td><td>0.2.15</td><td>848 MB</td></tr>
|
||
</tbody>
|
||
</table></div>
|
||
|
||
<h3>全部容器状态</h3>
|
||
<div class="table-wrap"><table>
|
||
<thead><tr><th>容器名</th><th>镜像</th><th>退出码</th><th>状态</th></tr></thead>
|
||
<tbody>
|
||
<tr><td><code>dify-api-1</code></td><td>dify-api:1.14.2</td><td>0</td><td><span class="status-exited"></span>正常退出</td></tr>
|
||
<tr><td><code>dify-worker-1</code></td><td>dify-api:1.14.2</td><td>0</td><td><span class="status-exited"></span>正常退出</td></tr>
|
||
<tr><td><code>dify-worker_beat-1</code></td><td>dify-api:1.14.2</td><td>0</td><td><span class="status-exited"></span>正常退出</td></tr>
|
||
<tr><td><code>dify-api_websocket-1</code></td><td>dify-api:1.14.2</td><td>0</td><td><span class="status-exited"></span>正常退出</td></tr>
|
||
<tr><td><code>dify-web-1</code></td><td>dify-web:1.14.2</td><td>143</td><td><span class="status-exited"></span>SIGTERM</td></tr>
|
||
<tr><td><code>dify-plugin_daemon-1</code></td><td>plugin-daemon:0.6.1</td><td>0</td><td><span class="status-exited"></span>正常退出</td></tr>
|
||
<tr><td><code>dify-sandbox-1</code></td><td>sandbox:0.2.15</td><td>137</td><td><span class="status-oom"></span><span class="badge badge-err">OOM</span></td></tr>
|
||
<tr><td><code>dify-nginx-1</code></td><td>nginx:latest</td><td>137</td><td><span class="status-oom"></span><span class="badge badge-err">OOM</span></td></tr>
|
||
<tr><td><code>dify-ssrf_proxy-1</code></td><td>ubuntu/squid:latest</td><td>137</td><td><span class="status-oom"></span><span class="badge badge-err">OOM</span></td></tr>
|
||
<tr><td><code>dify-db_postgres-1</code></td><td>postgres:15-alpine</td><td>0</td><td><span class="status-exited"></span>正常退出</td></tr>
|
||
<tr><td><code>dify-redis-1</code></td><td>redis:6-alpine</td><td>0</td><td><span class="status-exited"></span>正常退出</td></tr>
|
||
<tr><td><code>dify-weaviate-1</code></td><td>weaviate:1.27.0</td><td>0</td><td><span class="status-exited"></span>正常退出</td></tr>
|
||
<tr><td><code>dify-init_permissions-1</code></td><td>busybox:latest</td><td>0</td><td><span class="status-ok"></span>已完成</td></tr>
|
||
</tbody>
|
||
</table></div>
|
||
|
||
<div class="legend">
|
||
<span><span class="status-exited"></span> 正常退出(0)</span>
|
||
<span><span class="status-oom"></span> OOM Kill(137)</span>
|
||
<span><span class="status-ok"></span> 已完成(0)</span>
|
||
</div>
|
||
|
||
<!-- ===== 3. 部署架构 ===== -->
|
||
<h2 id="s3">3. 部署架构拓扑</h2>
|
||
|
||
<div class="arch-diagram">
|
||
Internet
|
||
│
|
||
┌─────▼──────┐
|
||
│ Nginx │ ← 反向代理,暴露 :8082
|
||
│ (latest) │
|
||
└──┬─────┬───┘
|
||
│ │
|
||
┌─────────▼┐ ┌─▼──────────┐
|
||
│ Web │ │ API │ ← Gunicorn + gevent :5001
|
||
│ (Next.js)│ │ (Flask) │
|
||
└──────────┘ └─┬────┬─────┘
|
||
│ │
|
||
┌────────────▼┐ ┌▼──────────────┐
|
||
│ Worker │ │ Worker Beat │ ← Celery 异步
|
||
│ (Celery) │ │ (定时调度) │
|
||
└──┬──┬──┬────┘ └───────────────┘
|
||
│ │ │
|
||
┌────────────▼┐ │ └──────────────┐
|
||
│ PostgreSQL │ │ │
|
||
│ (外部172..) │ │ ┌──────▼──────────┐
|
||
└──────────────┘ │ │ Plugin Daemon │ ← 插件运行时 :5002
|
||
│ └─────────────────┘
|
||
┌──────▼──────┐
|
||
│ Redis 6 │ ← 缓存 + Celery Broker
|
||
└─────────────┘
|
||
</div>
|
||
|
||
<h3>安全隔离设计</h3>
|
||
<div class="arch-diagram">
|
||
外网 ─→ Nginx ─→ API/Web ─→ SSRF Proxy (Squid) ─→ 外部URL
|
||
│
|
||
Sandbox ────→ ssrf_proxy_network (internal: true)
|
||
(仅能通过代理访问外部)
|
||
</div>
|
||
<ul>
|
||
<li><code>ssrf_proxy_network</code> 是 Docker 内部网络(<code>internal: true</code>),sandbox 与外网完全隔离</li>
|
||
<li>sandbox 需要网络访问时,只能通过 Squid 代理,Squid 执行白名单控制</li>
|
||
<li>API 和 Worker 同时接入 default 网络和 ssrf_proxy_network</li>
|
||
</ul>
|
||
|
||
<h3>服务分层</h3>
|
||
<div class="table-wrap"><table>
|
||
<thead><tr><th>层</th><th>服务</th><th>技术栈</th><th>作用</th></tr></thead>
|
||
<tbody>
|
||
<tr><td><strong>网关</strong></td><td>Nginx</td><td>nginx:latest</td><td>反向代理,SSE/WebSocket 通道</td></tr>
|
||
<tr><td><strong>前端</strong></td><td>Web</td><td>Next.js</td><td>管理控制台 + 聊天界面</td></tr>
|
||
<tr><td><strong>API</strong></td><td>api, api_websocket</td><td>Python Flask + Gunicorn + gevent</td><td>所有业务逻辑,同步/实时协作</td></tr>
|
||
<tr><td><strong>异步</strong></td><td>worker, worker_beat</td><td>Celery + Redis</td><td>数据集索引、工作流调度、邮件、定时任务</td></tr>
|
||
<tr><td><strong>沙箱</strong></td><td>sandbox</td><td>Go (dify-sandbox)</td><td>代码节点安全的 Python 执行环境</td></tr>
|
||
<tr><td><strong>安全代理</strong></td><td>ssrf_proxy</td><td>Squid</td><td>阻止沙箱访问内部网络,白名单外连</td></tr>
|
||
<tr><td><strong>插件</strong></td><td>plugin_daemon</td><td>Go (plugin-daemon)</td><td>第三方插件管理、调试、运行时</td></tr>
|
||
<tr><td><strong>数据库</strong></td><td>PostgreSQL</td><td>外部 <code>172.18.79.129:5432</code></td><td>主业务数据(用户/应用/知识库/对话)</td></tr>
|
||
<tr><td><strong>缓存</strong></td><td>Redis</td><td>redis:6-alpine</td><td>Celery Broker + 缓存</td></tr>
|
||
<tr><td><strong>向量库</strong></td><td>Weaviate</td><td>weaviate:1.27.0</td><td>向量检索 + 关键词检索(BM25)</td></tr>
|
||
</tbody>
|
||
</table></div>
|
||
|
||
<!-- ===== 4. 核心功能技术方案 ===== -->
|
||
<h2 id="s4">4. 核心功能技术方案</h2>
|
||
|
||
<h3>4.1 RAG 知识库</h3>
|
||
<pre>文件上传 → 文档解析 (Unstructured / Firecrawl / JinaReader)
|
||
→ 文本分割 (可配置分段规则)
|
||
→ Embedding (调用 LLM 的 Embedding 模型)
|
||
→ 向量存储 (Weaviate,支持 15+ 种向量库)
|
||
|
||
用户提问 → Embedding → 向量检索 + BM25 全文检索(混合检索)
|
||
→ 重排序 (Rerank,可选)
|
||
→ Prompt 拼接 → LLM 生成 → 返回答案</pre>
|
||
|
||
<h4>支持的向量数据库</h4>
|
||
<p>Weaviate(当前使用)| pgvector | Milvus | Elasticsearch | OpenSearch | Qdrant | Chroma | OceanBase | SeekDB | Couchbase | Oracle | OpenGauss | MyScale | MatrixOne | Vastbase | pgvecto-rs | IRIS</p>
|
||
|
||
<h3>4.2 Workflow 工作流引擎</h3>
|
||
<ul>
|
||
<li>前端拖拽画布 → 生成 DAG 图 → 后端解析执行</li>
|
||
<li><strong>节点类型</strong>:LLM / 知识库检索 / 代码(Python)/ HTTP 请求 / 条件分支 / 循环 / 变量聚合 / 工具调用</li>
|
||
<li>代码节点在 sandbox 中隔离执行(Go 沙箱,超时 15s)</li>
|
||
<li>复杂度限制:<code>LOOP_NODE_MAX_COUNT=100</code> / <code>MAX_ITERATIONS_NUM=99</code> / <code>MAX_TREE_DEPTH=50</code></li>
|
||
<li>WebSocket 支持多人协作编辑工作流(<code>collaboration</code> profile)</li>
|
||
</ul>
|
||
|
||
<h3>4.3 Agent 智能体</h3>
|
||
<ul>
|
||
<li><strong>ReAct / Function Calling</strong> 模式:LLM 思考 → 选择工具 → 执行 → 观察 → 继续思考</li>
|
||
<li><strong>工具来源</strong>:内置工具 + 插件市场 + 自定义 API 工具</li>
|
||
<li>最大推理迭代:<code>MAX_ITERATIONS_NUM=99</code></li>
|
||
<li>最大并行工具调用:<code>MAX_PARALLEL_LIMIT=10</code></li>
|
||
<li>最大工具数:<code>MAX_TOOLS_NUM=10</code></li>
|
||
</ul>
|
||
|
||
<h3>4.4 插件系统(v1.14 引入)</h3>
|
||
<pre>Plugin Daemon (Go) ←→ Dify API (Flask)
|
||
│
|
||
├── 插件安装/卸载 (从 marketplace.dify.ai)
|
||
├── 插件调试端口 (:5003)
|
||
├── Python 虚拟环境管理 (per-plugin venv)
|
||
├── Stdio 通信协议 (buffer 1024 / max 5MB)
|
||
└── 本地存储 (/app/storage)</pre>
|
||
<ul>
|
||
<li><strong>Auth</strong>: RSA 签名验证(<code>FORCE_VERIFYING_SIGNATURE=true</code>)</li>
|
||
<li><strong>独立数据库</strong>: <code>dify_plugin</code></li>
|
||
<li><strong>Python 环境初始化超时</strong>: 120s</li>
|
||
<li><strong>插件最大执行超时</strong>: 600s</li>
|
||
<li><strong>单包大小限制</strong>: 50MB</li>
|
||
</ul>
|
||
|
||
<!-- ===== 5. 关键配置 ===== -->
|
||
<h2 id="s5">5. 关键配置</h2>
|
||
|
||
<div class="table-wrap"><table>
|
||
<thead><tr><th>配置项</th><th>值</th><th>说明</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>数据库</td><td>PostgreSQL 15 @ <code>172.18.79.129:5432</code></td><td>外部独立部署,库名 <code>dify</code></td></tr>
|
||
<tr><td>向量存储</td><td>Weaviate 1.27.0</td><td>内部 <code>weaviate:8080</code>,API Key 认证</td></tr>
|
||
<tr><td>缓存</td><td>Redis 6</td><td>带密码认证,DB 0/1</td></tr>
|
||
<tr><td>存储类型</td><td>本地文件系统 (opendal/fs)</td><td><code>./volumes/app/storage</code></td></tr>
|
||
<tr><td>Web 暴露端口</td><td><code>8082</code></td><td>映射到 Nginx 80</td></tr>
|
||
<tr><td>API 端口</td><td><code>5001</code></td><td>Gunicorn + gevent</td></tr>
|
||
<tr><td>插件 Daemon 端口</td><td><code>5002</code></td><td>Go 服务</td></tr>
|
||
<tr><td>插件调试端口</td><td><code>5003</code></td><td>暴露到宿主机</td></tr>
|
||
<tr><td>沙箱端口</td><td><code>8194</code></td><td>Go Gin 框架</td></tr>
|
||
<tr><td>SSRF 代理端口</td><td><code>3128</code></td><td>Squid</td></tr>
|
||
<tr><td>LLM 代理地址</td><td><code>https://api.openai.com/v1</code></td><td>可改为其他兼容 API</td></tr>
|
||
<tr><td>向量化分词</td><td><code>word</code> (GSE 中文分词=off)</td><td>中文场景建议开启 GSE</td></tr>
|
||
<tr><td>代码执行超时</td><td>15s</td><td>sandbox 中 Python 代码最长执行</td></tr>
|
||
<tr><td>LLM 调用超时</td><td>60s</td><td><code>TEXT_GENERATION_TIMEOUT_MS</code></td></tr>
|
||
<tr><td>Celery Worker</td><td>4 个</td><td><code>CELERY_WORKER_AMOUNT=4</code></td></tr>
|
||
<tr><td>WebSocket 超时</td><td>360s</td><td>长连接保持</td></tr>
|
||
<tr><td>Nginx 代理超时</td><td>3600s</td><td>SSE 流式传输</td></tr>
|
||
<tr><td>部署环境</td><td>PRODUCTION</td><td></td></tr>
|
||
<tr><td>协作模式</td><td>已开启</td><td><code>ENABLE_COLLABORATION_MODE=true</code></td></tr>
|
||
<tr><td>插件市场</td><td>已开启</td><td><code>MARKETPLACE_ENABLED=true</code></td></tr>
|
||
<tr><td>文档抓取</td><td>JinaReader + Firecrawl + Watercrawl</td><td>三种引擎均开启</td></tr>
|
||
</tbody>
|
||
</table></div>
|
||
|
||
<!-- ===== 6. 数据卷 ===== -->
|
||
<h2 id="s6">6. 数据卷</h2>
|
||
|
||
<div class="table-wrap"><table>
|
||
<thead><tr><th>卷路径</th><th>大小</th><th>内容</th></tr></thead>
|
||
<tbody>
|
||
<tr><td><code>volumes/plugin_daemon</code></td><td>209 MB</td><td>插件代码、venv、缓存</td></tr>
|
||
<tr><td><code>volumes/weaviate</code></td><td>124 KB</td><td>向量索引数据</td></tr>
|
||
<tr><td><code>volumes/app</code></td><td>84 KB</td><td>用户上传文件</td></tr>
|
||
<tr><td><code>volumes/redis</code></td><td>12 KB</td><td>缓存持久化</td></tr>
|
||
<tr><td><code>volumes/db</code></td><td>12 KB</td><td>PostgreSQL(基本未使用,走外部DB)</td></tr>
|
||
</tbody>
|
||
</table></div>
|
||
|
||
<!-- ===== 7. 问题诊断 ===== -->
|
||
<h2 id="s7">7. 当前问题 & 排查方向</h2>
|
||
|
||
<h3>7.1 内存溢出(OOM)</h3>
|
||
<p>以下容器因内存不足被内核杀掉(退出码 137):</p>
|
||
<ul>
|
||
<li><strong>sandbox</strong> (848MB) + <strong>plugin_daemon</strong> (2.3GB) + <strong>API</strong> (4.1GB) = 总镜像 ~7.3GB</li>
|
||
<li>WSL2 默认内存限制较小,建议增大 <code>.wslconfig</code> 中的内存分配</li>
|
||
</ul>
|
||
|
||
<h3>7.2 外部数据库依赖</h3>
|
||
<ul>
|
||
<li>PostgreSQL 配置为外部 IP <code>172.18.79.129:5432</code>,不在 Docker 网络内</li>
|
||
<li>如果此 IP 不可达,Dify API 和 Worker 将无法启动</li>
|
||
<li>本地 <code>db_postgres</code> 容器也部署了但未被使用(<code>DB_HOST</code> 指向外部)</li>
|
||
</ul>
|
||
|
||
<h3>7.3 API 日志关键信息</h3>
|
||
<ul>
|
||
<li>多次 <code>Handling signal: term</code> → 手动 <code>docker compose down</code> 或系统关机</li>
|
||
<li><code>Permission denied: '/home/dify'</code> → 非致命警告,不影响功能</li>
|
||
<li><code>Database migration skipped</code> → 数据库迁移未执行(可能已是最新)</li>
|
||
</ul>
|
||
|
||
<!-- ===== 8. 运维命令 ===== -->
|
||
<h2 id="s8">8. 常用运维命令</h2>
|
||
|
||
<pre># 启动全部服务
|
||
cd /home/zdh/dify && docker compose up -d
|
||
|
||
# 查看日志
|
||
docker compose logs -f api
|
||
docker compose logs -f worker
|
||
|
||
# 仅重启 API
|
||
docker compose restart api
|
||
|
||
# 停止全部
|
||
docker compose down
|
||
|
||
# 查看资源占用
|
||
docker stats
|
||
|
||
# 检查外部 PostgreSQL 连通性
|
||
nc -zv 172.18.79.129 5432</pre>
|
||
|
||
<h3>访问地址</h3>
|
||
<blockquote>
|
||
<strong>http://localhost:8082</strong> — 首次访问需创建管理员账号
|
||
</blockquote>
|
||
|
||
<!-- ===== 9. Profile 说明 ===== -->
|
||
<h2 id="s9">9. Docker Compose Profile 说明</h2>
|
||
<p>通过 <code>COMPOSE_PROFILES</code> 控制启用的基础设施:</p>
|
||
|
||
<div class="table-wrap"><table>
|
||
<thead><tr><th>Profile</th><th>服务</th><th>当前状态</th></tr></thead>
|
||
<tbody>
|
||
<tr><td><code>weaviate</code></td><td>Weaviate 向量库</td><td><span class="badge badge-ok">启用</span></td></tr>
|
||
<tr><td><code>postgresql</code></td><td>内置 PostgreSQL</td><td><span class="badge badge-ok">启用</span>(但实际走外部DB)</td></tr>
|
||
<tr><td><code>collaboration</code></td><td>WebSocket 协作</td><td><span class="badge badge-ok">启用</span></td></tr>
|
||
<tr><td><code>pgvector</code></td><td>pgvector 向量库</td><td><span class="badge badge-warn">未启用</span></td></tr>
|
||
<tr><td><code>milvus</code></td><td>Milvus 向量库</td><td><span class="badge badge-warn">未启用</span></td></tr>
|
||
<tr><td><code>elasticsearch</code></td><td>ES 向量库</td><td><span class="badge badge-warn">未启用</span></td></tr>
|
||
<tr><td><code>qdrant</code></td><td>Qdrant 向量库</td><td><span class="badge badge-warn">未启用</span></td></tr>
|
||
<tr><td><code>certbot</code></td><td>SSL 证书</td><td><span class="badge badge-warn">未启用</span></td></tr>
|
||
</tbody>
|
||
</table></div>
|
||
|
||
<footer class="footer">
|
||
Generated 2026-06-08 · Dify 1.14.2 · Source: /home/zdh/dify/
|
||
</footer>
|
||
|
||
</div>
|
||
|
||
<script>
|
||
/* ===== Scroll spy ===== */
|
||
(function(){
|
||
const navLinks = document.querySelectorAll('.sidebar nav a');
|
||
const headings = [];
|
||
navLinks.forEach(a => {
|
||
const id = a.getAttribute('href').slice(1);
|
||
const el = document.getElementById(id);
|
||
if (el) headings.push({ el, a });
|
||
});
|
||
|
||
function onScroll(){
|
||
let current = null;
|
||
const offset = 80;
|
||
for (const { el, a } of headings) {
|
||
if (el.getBoundingClientRect().top <= offset) {
|
||
current = a;
|
||
}
|
||
}
|
||
navLinks.forEach(a => a.classList.remove('active'));
|
||
if (current) current.classList.add('active');
|
||
}
|
||
|
||
window.addEventListener('scroll', onScroll, { passive: true });
|
||
onScroll();
|
||
})();
|
||
|
||
/* ===== Mobile sidebar toggle ===== */
|
||
function toggleSidebar(){
|
||
const sidebar = document.getElementById('sidebar');
|
||
const overlay = document.getElementById('sidebarOverlay');
|
||
sidebar.classList.toggle('open');
|
||
overlay.classList.toggle('show');
|
||
}
|
||
function closeSidebar(){
|
||
const sidebar = document.getElementById('sidebar');
|
||
const overlay = document.getElementById('sidebarOverlay');
|
||
sidebar.classList.remove('open');
|
||
overlay.classList.remove('show');
|
||
}
|
||
|
||
document.querySelectorAll('.sidebar nav a').forEach(a => {
|
||
a.addEventListener('click', () => {
|
||
if (window.innerWidth <= 768) closeSidebar();
|
||
});
|
||
});
|
||
</script>
|
||
</body>
|
||
</html>
|