Files
wiki/Dify部署分析报告.html
zdh c677393d08
Deploy Wiki to Production / deploy (push) Has been cancelled
feat: 入库 17 个新报告页
- 银行业Agent建设方案/报告/ 4 篇:建设方案 · 智能中台 · 意图识别 · 合规风险
- 研发型企业AI转型方案/报告/ 9 篇:角色矩阵(交互版) · 培训1-6课 · 角色矩阵 · 实操培训 · 培训路线图
- AI Agent 驾驭工程/报告/ 1 篇:Harness Engineering 全面解析
- 简历AI技术讲解.html + .md
- Dify部署分析报告.html
2026-06-20 22:38:20 +08:00

503 lines
29 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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. 当前问题 &amp; 排查方向</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 &nbsp;|&nbsp; Dify 版本:1.14.2 &nbsp;|&nbsp; 部署环境: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 &amp;&amp; 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. 当前问题 &amp; 排查方向</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 &amp;&amp; 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> &nbsp;&nbsp; 首次访问需创建管理员账号
</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>