本教程基于极空间 NAS(x86 架构,16GB 内存)和 Docker 环境,详细记录从零开始部署 Ollama + DeepSeek-R1 7B 量化版以及 Dify + Embedding知识库 的全流程,包含所有遇到的踩坑点和解决方案。适合希望通过本地 AI 处理私密文档的小微企业或个人。
📌 环境准备
硬件
-
极空间 Z4pro性能版(或其他 x86 架构 NAS,支持 Docker)
-
内存建议 ≥ 16GB(7B 模型需 8~10GB,系统及其他服务占用约 4GB)
-
CPU 核心数 ≥ 4(N305 可流畅运行)
软件
-
开启 SSH(控制面板 → 终端机和 SNMP → 启用 SSH)
-
已安装 Docker(套件中心搜索 Docker 安装)
-
配置镜像加速器(解决国内拉取慢的问题)
推荐地址:
- 道客镜像站:https://docker.m.daocloud.io
- 凌霞加速器:https://docker.1panel.live
- 中科大:https://docker.mirrors.ustc.edu.cn
- 网易:http://hub-mirror.c.163.com
注意:在极空间 Docker 设置中,进入“加速器配置”标签页,填入上述任一地址即可。
一、部署 Ollama 并安装 DeepSeek 模型
1. 创建存储目录
在文件管理器中,在机械硬盘(如 /SATA存储11)下新建文件夹 ollama,用于存放模型文件。
- 拉取 Ollama 镜像
打开 Docker → 镜像 → 仓库,搜索 ollama,选择 ollama/ollama:latest 下载。
- 创建容器(关键配置)
| 配置项 | 值 |
| CPU 限制 | 3 核(可根据实际调整,留部分给系统) |
| 内存限制 | 9GB(9162 MB,给模型和缓存留足空间) |
| 文件/文件夹映射 | /SATA存储11/ollama → /root/.ollama(不要勾选只读) |
| 网络 | host 模式(使用宿主机网络,无需额外端口映射) |
其他保持默认,点击“应用”创建容器。
- 手动下载模型(避免网络问题)
由于直接 ollama pull 在国内极不稳定,推荐手动下载 GGUF 文件:
-
找到 DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf(约 4.7GB)并下载。
-
将下载的文件上传到 NAS 的 /SATA存储11/ollama 目录(不要放到子文件夹)。
-
在该目录下新建文本文件,命名为
Modelfile(无后缀),内容为:
FROM ./DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf
- 导入模型
SSH 登录 NAS,执行以下命令进入容器并创建模型:
bash
docker exec -it ollama bash
ollama create deepseek-r1:7b-q4_K_M -f Modelfile
完成后用 ollama list 验证,应显示该模型。
二、部署 Dify
- 下载 Dify 源码
- 从 GitHub 下载最新版 dify-main.zip,解压后上传到 NAS 中与 ollama 同级的目录(例如 /SATA存储11/dify-main)。
- 提权(避免权限问题)
SSH 登录后执行:
bash
sudo usermod -aG docker $USER
输入密码,然后重新登录 SSH 使组权限生效。
- 进入 Dify 目录并启动
bash
cd /路径/dify-main/docker # 根据你实际上传的路径
docker compose up -d
首次运行会自动拉取所需镜像。如果拉取缓慢或失败,可参考上面配置镜像加速器,或手动拉取以下镜像:
bash
docker pull langgenius/dify-api:latest
docker pull langgenius/dify-web:latest
docker pull postgres:15-alpine
docker pull redis:6-alpine
docker pull nginx:latest
docker pull langgenius/dify-sandbox:latest
拉取完成后再次执行 docker compose up -d。
- 处理端口冲突(如 nginx 启动失败)
如果启动时出现类似 failed to bind host port 0.0.0.0:8080/tcp: address already in use 的错误,说明端口被占用,需要修改配置。
步骤:
a. 复制环境变量模板并编辑:
bash
cp .env.example .env
nano .env
修改以下内容(可根据需要调整端口):
DB_USERNAME=postgres
DB_PASSWORD=difyai123456
DB_HOST=db_postgres # 注意服务名是 db_postgres 还是 db(查看 docker-compose.yaml)
DB_PORT=5432
DB_DATABASE=dify
EXPOSE_NGINX_PORT=8091 # 使用未被占用的端口
NGINX_SSL_ENABLED=false
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=difyai123456
SECRET_KEY=your-strong-secret-key # 可随机生成,如 NAS 登录密码
保存(Ctrl+O,回车)并退出(Ctrl+X)。
b. 修改 docker-compose.yaml 中 nginx 的端口映射:
bash
cp docker-compose.yaml docker-compose.yaml.bak
nano docker-compose.yaml
找到 nginx 服务的 ports 部分,将 "80:80" 改为 "${EXPOSE_NGINX_PORT:-80}:91",确保使用环境变量。保存退出。
c. 重新启动:
bash
docker compose down
docker compose up -d
- 处理 api/worker 重启问题
如果某些容器(如 api、plugin_daemon)不断重启,可能是数据库连接未就绪或环境变量未正确读取。可以尝试:
bash
docker compose stop api
docker compose rm -f api
docker compose up -d api
等待片刻,查看日志:docker logs docker-api-1 --tail 50,若仍有报错,请检查 .env 中 DB_HOST 是否与 docker-compose.yaml 中的数据库服务名一致(常见为 db 或 db_postgres)。
- 拉取 Embedding 模型(知识库必需)
在 Ollama 容器中拉取轻量嵌入模型:
bash
docker exec -it ollama ollama pull nomic-embed-text
三、配置 Dify 使用本地模型
- 访问 Dify Web 界面
浏览器打开 http://你的NAS_IP:你设置的端口(例如 http://192.168.5.219:8091)。首次访问需注册管理员账号(邮箱、用户名、密码自设)。
- 添加 DeepSeek 模型(LLM)
-
登录后,点击右上角头像 → 设置 → 模型供应商。
-
找到 Ollama,点击“添加模型”。
-
类型选择 LLM,填写:
- 模型名称:deepseek-r1:7b-q4_K_M(必须与 ollama list 一致)
- 基础 URL:http://你的NAS_IP:11434(注意是 NAS 的 IP,不要用 localhost)
- 保存,状态应变为“已启用”。
- 添加 Embedding 模型(用于知识库)
-
同样在 Ollama 供应商下,点击“添加模型”,类型选择 Text Embedding。
-
模型名称:nomic-embed-text
-
基础 URL:同上(http://你的NAS_IP:11434)
-
保存。
四、创建知识库并导入文档
- 创建知识库
左侧菜单 → 知识库 → 创建知识库 → 输入名称(如“公司资料”),选择语言(中文),创建。
- 导入文档
进入知识库,点击“导入文档”。支持:
-
上传文件:PDF、Word、Excel、PPT、TXT、Markdown 等(可多选)
-
网页导入:输入网址抓取内容
-
文本导入:直接粘贴文本
- 文档分段(分区)
Dify 自动将文档切分成段落(chunk)。默认每段 500 字符,重叠 50 字符,适合大多数场景。也可手动调整:
-
点击“分段设置”
-
修改“分段长度”(如技术文档可设为 1000)
-
修改“重叠长度”(避免关键信息切断)
- 等待向量化
上传后,系统使用 Embedding 模型将文本转为向量。状态栏显示“处理中”→“已完成”后即可使用。
五、创建应用并启用知识库
- 创建应用
左侧菜单 → 工作室 → 创建应用 → 选择 聊天助手,输入应用名称。
- 关联知识库
在应用编排页面右侧,找到 上下文 → 添加 → 选择你创建的知识库。
- 配置提示词(可选)
在左侧“提示词”框可自定义 AI 行为,例如:
你是一个专业的文档分析助手。请基于提供的知识库内容回答问题。如果无法回答,请如实告知。
- 发布并测试
点击右上角 发布,即可在对话框提问。例如:
-
“总结一下这份合同的核心条款”
-
“我们代理的防火墙有哪些型号?”
AI 会基于知识库内容回答。
六、常见问题与解决
| 问题 | 解决方案 |
| 拉取镜像超时| 配置镜像加速器(极空间 Docker 设置 → 加速器配置),或手动下载导入。 |
| docker 命令权限不足 | sudo usermod -aG docker $USER 并重新登录 SSH。 |
| 端口冲突导致 nginx 无法启动| 修改 .env 中的 EXPOSE_NGINX_PORT 为一个空闲端口,并确保 docker-compose.yaml 中对应使用该变量。 |
| api/worker 不断重启 | 检查 .env 中数据库连接是否正确(DB_HOST 应与 docker-compose.yaml 中的服务名一致)。尝试 docker compose rm -f api && docker compose up -d api。 |
| 上传文档后一直“处理中”| 检查 Embedding 模型是否已添加并启用,查看 worker 日志 docker logs docker-worker-1。 |
| AI 回答找不到知识库内容| 确认应用编排中已正确关联知识库,且文档已完成向量化。可调整检索策略(混合检索、相似度阈值)。 |
| 模型回答太慢| 监控 docker stats ollama 看内存是否吃紧,可降低并发数(在 Ollama 容器中设置 OLLAMA_NUM_PARALLEL=1)。 |
七、后续优化建议
-
提升检索效果:尝试使用更专业的 Embedding 模型(如 bge-m3),需在 Ollama 中拉取。
-
外网访问:如需在外网使用,建议配置 DDNS + 端口转发,极空间的节点小宝或使用 VPN(Tailscale/ZeroTier)更安全。
-
多知识库隔离:为不同部门或客户创建独立知识库,实现数据隔离。
-
监控资源:定期执行 docker stats 查看内存占用,避免 OOM。
📝 结语
至此,已在极空间 NAS 上成功部署了一套完全本地化、私密、免费的 AI 文档分析系统。所有数据保留在内网,无需担心泄露,且可无限次使用。
如果本教程对你有帮助,欢迎收藏或分享给需要的朋友。如有疑问,欢迎在评论区留言交流。
