在 NAS 上部署本地 AI(DeepSeek + Dify)用于文档分析与知识蒸馏

本教程基于极空间 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,用于存放模型文件。

 

  1. 拉取 Ollama 镜像

打开 Docker → 镜像 → 仓库,搜索 ollama,选择 ollama/ollama:latest 下载。

 

  1. 创建容器(关键配置)

| 配置项 | 值 |

| CPU 限制 | 3 核(可根据实际调整,留部分给系统) |

| 内存限制 | 9GB(9162 MB,给模型和缓存留足空间) |

| 文件/文件夹映射 | /SATA存储11/ollama → /root/.ollama(不要勾选只读) |

| 网络 | host 模式(使用宿主机网络,无需额外端口映射) |

 

其他保持默认,点击“应用”创建容器。

 

  1. 手动下载模型(避免网络问题)

由于直接 ollama pull 在国内极不稳定,推荐手动下载 GGUF 文件:

 

  1. 访问 HuggingFace 镜像站 

  2. 找到 DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf(约 4.7GB)并下载。 

  3. 将下载的文件上传到 NAS 的 /SATA存储11/ollama 目录(不要放到子文件夹)。 

  4. 在该目录下新建文本文件,命名为 Modelfile(无后缀),内容为:

   FROM ./DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf

  1. 导入模型

SSH 登录 NAS,执行以下命令进入容器并创建模型:

bash

docker exec -it ollama bash

ollama create deepseek-r1:7b-q4_K_M -f Modelfile

完成后用 ollama list 验证,应显示该模型。

 

二、部署 Dify

  1. 下载 Dify 源码
  • 从 GitHub 下载最新版 dify-main.zip,解压后上传到 NAS 中与 ollama 同级的目录(例如 /SATA存储11/dify-main)。
  1. 提权(避免权限问题)

SSH 登录后执行:

bash

sudo usermod -aG docker $USER

输入密码,然后重新登录 SSH 使组权限生效。

  1. 进入 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。

  1. 处理端口冲突(如 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

  

  1. 处理 api/worker 重启问题

如果某些容器(如 apiplugin_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)。

  1. 拉取 Embedding 模型(知识库必需)

在 Ollama 容器中拉取轻量嵌入模型:

bash

docker exec -it ollama ollama pull nomic-embed-text

三、配置 Dify 使用本地模型

  1. 访问 Dify Web 界面

浏览器打开 http://你的NAS_IP:你设置的端口(例如 http://192.168.5.219:8091)。首次访问需注册管理员账号(邮箱、用户名、密码自设)。

  1. 添加 DeepSeek 模型(LLM)
  • 登录后,点击右上角头像 → 设置 → 模型供应商。

  • 找到 Ollama,点击“添加模型”。

  • 类型选择 LLM,填写:

  - 模型名称:deepseek-r1:7b-q4_K_M(必须与 ollama list 一致)

  - 基础 URL:http://你的NAS_IP:11434(注意是 NAS 的 IP,不要用 localhost)

  • 保存,状态应变为“已启用”。
  1. 添加 Embedding 模型(用于知识库)
  • 同样在 Ollama 供应商下,点击“添加模型”,类型选择 Text Embedding。

  • 模型名称:nomic-embed-text

  • 基础 URL:同上(http://你的NAS_IP:11434)

  • 保存。

四、创建知识库并导入文档

  1. 创建知识库

左侧菜单 → 知识库 → 创建知识库 → 输入名称(如“公司资料”),选择语言(中文),创建。

  1. 导入文档

进入知识库,点击“导入文档”。支持:

  • 上传文件:PDF、Word、Excel、PPT、TXT、Markdown 等(可多选)

  • 网页导入:输入网址抓取内容

  • 文本导入:直接粘贴文本

  1. 文档分段(分区)

Dify 自动将文档切分成段落(chunk)。默认每段 500 字符,重叠 50 字符,适合大多数场景。也可手动调整:

  • 点击“分段设置”

  • 修改“分段长度”(如技术文档可设为 1000)

  • 修改“重叠长度”(避免关键信息切断)

  1. 等待向量化

上传后,系统使用 Embedding 模型将文本转为向量。状态栏显示“处理中”→“已完成”后即可使用。

五、创建应用并启用知识库

  1. 创建应用

左侧菜单 → 工作室 → 创建应用 → 选择 聊天助手,输入应用名称。

  1. 关联知识库

在应用编排页面右侧,找到 上下文 → 添加 → 选择你创建的知识库。

  1. 配置提示词(可选)

在左侧“提示词”框可自定义 AI 行为,例如:

你是一个专业的文档分析助手。请基于提供的知识库内容回答问题。如果无法回答,请如实告知。

  1. 发布并测试

点击右上角 发布,即可在对话框提问。例如:

  • “总结一下这份合同的核心条款”

  • “我们代理的防火墙有哪些型号?”

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)。 |

七、后续优化建议

  1. 提升检索效果:尝试使用更专业的 Embedding 模型(如 bge-m3),需在 Ollama 中拉取。

  2. 外网访问:如需在外网使用,建议配置 DDNS + 端口转发,极空间的节点小宝或使用 VPN(Tailscale/ZeroTier)更安全。

  3. 多知识库隔离:为不同部门或客户创建独立知识库,实现数据隔离。

  4. 监控资源:定期执行 docker stats 查看内存占用,避免 OOM。

📝 结语

至此,已在极空间 NAS 上成功部署了一套完全本地化、私密、免费的 AI 文档分析系统。所有数据保留在内网,无需担心泄露,且可无限次使用。

 

如果本教程对你有帮助,欢迎收藏或分享给需要的朋友。如有疑问,欢迎在评论区留言交流。

0
0
0
0
评论
未登录
暂无评论