架构概览:这套组合在搭什么
n8n(工作流自动化)+ Ollama(本地大模型)+ Qdrant(向量数据库)+ PostgreSQL(持久化)这个组合是2025-2026 年最流行的自托管 AI 栈之一。n8n 官方维护的 self-hosted-ai-starter-kit 是一个开箱即用的 Docker Compose 模板,预装了:
我第一次部署的时候,以为拉下来就能跑起来。结果踩了 4 个坑才让整套系统跑通。
---
坑1:ECONNREFUSED — Docker 网络隔离导致的 Ollama 连接失败
问题现象
用 Docker Compose 启动后,n8n 里配置 Ollama Chat Model 时直接报错:
Error: The service refused the connection - perhaps it is offline
ERROR: fetch failed
凭证测试(Test Connection)也是红的。但奇怪的是直接 curl 宿主机 IP:11434 是通的。
根因分析
n8n 运行在 Docker 容器里,默认用 http://localhost:11434 连接 Ollama。但 Docker 容器内的 localhost 指向容器自己,不是宿主机。Ollama 实际跑在宿主机上,网络完全不通。
解决方案
修改 docker-compose.yml,在 n8n 服务中加入环境变量:
services:
n8n:
environment:
- OLLAMA_HOST=http://host.docker.internal:11434
host.docker.internal 是 Docker Desktop for Mac/Windows 内置的宿主主机引用。Linux 上如果没有这个域名,需要用宿主机的实际 IP:
# 先查宿主机在 Docker 网桥上的 IP
ip a show docker0 | grep inet
# 输出类似:inet 172.17.0.1/16
# 然后在 docker-compose.yml 里写死 IP
environment:
- OLLAMA_HOST=http://172.17.0.1:11434
###进阶:让 Ollama 监听所有网卡
只改 OLLAMA_HOST还不够,因为 Ollama 默认只监听 127.0.0.1。需要让 Ollama 监听 0.0.0.0:
# Linux/Mac 编辑 ollama 服务
systemctl edit ollama
# 添加:
[Service]
Environment="OLLAMA_HOST=0.0.0.0"
# 重启服务
sudo systemctl restart ollama
这样 Ollama 就会接受来自 Docker容器内的请求。
---
坑2:Chat Ollama 节点显示红星但凭证测试正常
问题现象
Ollama 凭证测试(Test Connection)显示✅,但在 Chat Ollama 节点上出现了红色星号⚠️,触发聊天时报错:
Error: Failed to receive response
根因分析
这是 n8n v1.10+ 引入的变化。新版 n8n 的 Chat Trigger 默认使用 `N8N_RUNNERS_MODE=external`,在 Ollama 这类本地模型 + AI Agent 组合的场景下存在兼容问题。n8n 社区论坛有详细讨论。
解决方案
在 docker-compose.yml 的 n8n 服务中加入:
services:
n8n:
environment:
- N8N_RUNNERS_MODE=internal
重启 n8n 容器后,红色星号消失,Chat Ollama 节点正常工作。
---
坑3:Qdrant 认证凭证失效(社区节点 bug)
问题现象
Qdrant v1.7+ 默认开启认证后,n8n 的 Qdrant Vector Store 节点开始报错:
"error":"Wrong credentials, authorization header is required"
根因分析
n8n 的 Qdrant 节点有已知 bug:删除并重新创建凭证后问题消失,但首次配置时如果 Qdrant 已经开启认证,节点可能会缓存错误的认证信息。
解决方案
方法一:重新创建凭证(推荐)
1. 在 n8n → Settings → Credentials 里删除 Qdrant 相关凭证
2. 重新创建,API Key 填写 Qdrant 启动时生成的 key
3. 再次测试连接
方法二:关闭 Qdrant 认证(仅开发环境)
services:
qdrant:
environment:
- QDRANT__SERVICE__API_KEY=
command: ["qdrant", "--no-auth"]
---
坑4:Qdrant 集合无法列出(防火墙端口问题)
问题现象
在 n8n 的 Qdrant Vector Store 节点里无法选择已有集合,列表为空。但通过 Qdrant Dashboard(:6333/dashboard)可以看到集合是存在的。
根因分析
Qdrant 有两个端口:
- **6333**(HTTP):API 和管理界面,**必须对外开放**
- **6334**(gRPC):高性能向量搜索,**必须对外开放**
防火墙只开了 6334 没开 6333,或者只开了 6333 没开 6334,都会导致集合列表加载失败。
解决方案
确保两个端口都开放:
# Ubuntu/Debian
sudo ufw allow 6333/tcp
sudo ufw allow 6334/tcp
sudo ufw reload
# CentOS/RHEL
sudo firewall-cmd --permanent --add-port=6333/tcp
sudo firewall-cmd --permanent --add-port=6334/tcp
sudo firewall-cmd --reload
---
实战:搭建 Ollama + n8n + Qdrant RAG 工作流
4 个坑都填完后,我搭了一个完整的 RAG(检索增强生成)工作流。整个流程用到了 n8n 的7 个节点:
工作流设计
[1. GitHub文档抓取] → [2. 文本分块] → [3. Ollama Embeddings]
→ [4. Qdrant向量存储] → [5. 语义检索]
→ [6. LLM生成回答]
节点1:GitHub 文档抓取
用 n8n 的 HTTP Request 节点抓取仓库的 README.md:
{
"method": "GET",
"url": "https://raw.githubusercontent.com/n8n-io/self-hosted-ai-starter-kit/main/README.md",
"options": {
"timeout": 30000
}
}
节点2:文本分块
用 Code 节点将长文档拆分为 512 token 一块(Qdrant 推荐向量维度对应长度):
const text = $input.item.json.body;
const chunkSize = 512;
const chunks = [];
for (let i = 0; i < text.length; i += chunkSize) {
chunks.push({ text: text.slice(i, i + chunkSize) });
}
return chunks.map(c => ({ json: c }));
节点3:Ollama Embeddings
n8n 的 Embeddings Ollama 节点,配置:
Model: nomic-embed-text
URL: http://ollama:11434 (容器内部网络,直接用服务名)
注意:http://ollama:11434 是 Docker Compose 服务名,只有 Ollama 和 n8n 在同一网络时才能用。
节点4:Qdrant 向量存储
Qdrant Vector Store - Insert 节点配置:
Collection Name: n8n-docs
Vector Size: 768 (nomic-embed-text 的维度)
Distance: Cosine
节点5:语义检索
Qdrant Vector Store - Retrieve 节点,用户问题作为查询向量,取 Top 3 相关文档块。
节点6:LLM 生成
Chat Ollama 节点,把检索到的文档块作为上下文喂给 LLM:
Model: llama3.2
System Message: 你是一个技术文档助手,基于提供的文档片段回答用户问题。
---
防止踩坑的 5 条经验
1. 部署前先确认 Ollama 的网络绑定
curl http://localhost:11434/api/tags
#确认返回模型列表后再继续
2. OLLAMA_HOST 在 Linux Docker 环境必须指向宿主机 IP
Docker Compose 默认不提供 host.docker.internal,需要手动查 IP 并写入环境变量。
3. n8n v1.10+ 的 Chat Trigger 需要加 N8N_RUNNERS_MODE=internal
这条环境变量在 Ollama + AI Agent 场景几乎是必须配置的。
4. Qdrant 认证问题:删除重建凭证是最快的解法
不要反复修改同一个凭证,直接删掉重建,通常一次解决。
5. 生产环境用 health check 确保 Ollama 模型拉取完成
在 docker-compose.yml 里加 depends_on + condition: service_healthy,确保 Ollama 完全启动后再启动 n8n:
services:
ollama:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"]
interval: 10s
timeout: 5s
retries: 30
n8n:
depends_on:
ollama:
condition: service_healthy
---
总结
n8n + Ollama + Qdrant 这套组合跑起来之后,完全不需要任何云端 API 费用,所有数据都在本地。4 个坑踩完后,我的 RAG 工作流响应时间在 3 秒以内(Ollama llama3.2 on RTX 3060),完全满足日常使用。
如果你也在搭这套组合,记住这 4 个坑的解法:ECONNREFUSED →改 OLLAMA_HOST;红星问题 → 加 N8N_RUNNERS_MODE=internal;Qdrant 认证 → 重建凭证;端口问题 → 同时开放 6333 和 6334。
👉 体验 AI 工作流自动化,推荐 MiniMax Token Plan,国内访问稳定,支持多模型切换。
📌 This article was AI-assisted generated and human-reviewed | TechPassive — An AI-driven content testing site focused on real tool reviews
🔗 Recommended Tools
These are carefully selected tools. Using our affiliate links supports us to keep producing quality content: