Linux上使用dify构建RAG

Dify是一个开源的大语言模型(LLM)应用开发平台,旨在简化和加速生成式AI应用的创建和部署,相对于AnythingLLM来说dify更强大且灵活度比较高可以二次开发,不仅可以构建RAG管道,还可以有AI工作流、聊天助手、Agent、模型管理等丰富功能组件。

dify支持的模型有很多

安装docker

安装dify前首先需要安装docker,我的系统为Ubuntu系统,以Ubuntu为例展示安装过程。

1.首先卸载所有冲突的包,运行命令:
python 复制代码
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
2.然后设置 Docker 的apt存储库:
python 复制代码
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

但是当我运行sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc这行代码时,出现以下报错:

python 复制代码
curl: (35) OpenSSL SSL_connect: 连接被对方重设 in connection to download.docker.com:443

当时没注意继续运行下一行命令sudo chmod a+r /etc/apt/keyrings/docker.asc,出现报错才让我注意到:

python 复制代码
chmod: 无法访问 '/etc/apt/keyrings/docker.asc': 没有那个文件或目录

错误是由于在下载 Docker 的 GPG 密钥时网络连接失败,导致 /etc/apt/keyrings/docker.asc 文件未成功创建。接下来进行排查:

1.检查网络连通性

python 复制代码
# 测试能否 ping 通(如果服务器禁 ping 可能无响应,但可忽略)
ping download.docker.com

# 直接尝试通过 HTTPS 访问(更准确)
curl -v https://download.docker.com

如果出现 Connected to download.docker.com 且返回 HTTP 状态码,说明网络正常。

如果超时或失败,可能是网络限制或 DNS 问题。

我的网络是没有问题的。

2.解决网络限制

更换镜像源。如果无法直连 Docker 官方服务器,可改用国内镜像源(如阿里云、清华源)。

以 阿里云镜像 为例:

python 复制代码
# 下载阿里云提供的 Docker GPG 密钥
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

以上这行代码代替sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc,然后接着往下运行没问题。

2.接下来安装 Docker 包:
python 复制代码
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

有点问题,后面加上--fix-missing

错误是由于网络连接问题导致无法从 Docker 官方服务器下载软件包。错误核心:Could not handshake: Error in the pull function 表示 SSL/TLS 握手失败。

手动下载并安装依赖包,下载缺失的 .deb 文件:

python 复制代码
# 示例(替换为实际报错的 URL)
wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/containerd.io_1.7.25-1_amd64.deb
wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-buildx-plugin_0.20.0-1~ubuntu.20.04~focal_amd64.deb
sudo cp /etc/apt/sources.list.d/docker.list /etc/apt/sources.list.d/docker.list.bak
sudo sed -i 's|https://download.docker.com|https://mirrors.aliyun.com/docker-ce|g' /etc/apt/sources.list.d/docker.list
sudo apt-get update

如果无法下载,可通过浏览器访问 Docker Ubuntu 仓库 手动查找对应版本。

然后重新进行安装 Docker 包,就可以了。

3.验证是否成功安装 Docker:
python 复制代码
docker --version

出来版本号则证明安装成功。

4.测试是否可以使用 Docker拉取镜像并运行:
python 复制代码
sudo docker run hello-world

出现报错:

python 复制代码
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 130.211.15.150:443: connect: connection refused.
See 'docker run --help'.

报错信息 dial tcp 130.211.15.150:443: connect: connection refused 表示 Docker 引擎无法连接到 Docker Hub 的镜像仓库,调整一下镜像源:

python 复制代码
vim /etc/docker/daemon.json

配如下地址:

python 复制代码
{
"registry-mirrors": [
"https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com",
"https://docker.m.daocloud.io",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://your_preferred_mirror",
"https://dockerhub.icu",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}

重新加载配置文件及docker服务:

python 复制代码
systemctl daemon-reload
systemctl restart docker

然后拉取镜像,可以成功拉取

安装dify

dify官网下载整个工程,然后进入dify目录下的docker目录下,运行以下两条命令行:

python 复制代码
cp .env.example .env
docker compose up -d 

dify配置完成。

其他的就是ollama和模型的安装,这个在上一篇有讲过就不再赘述了。

安装完之后,点击进入网址,首次登录设置管理员账户:

然后输入账号密码登录。

下一次启动服务运行命令:

python 复制代码
docker-compose up -d

在dify中构建RAG

1.配置模型

进入主页后首先点击个人信息这块如图中①,然后点模型供应商,找到ollama后添加模型

然后填入模型名称和URL(http://host.docker.internal:11434)后点保存,模型名称要是忘了可以终端ollama list来查看(先添加llm的deepseek然后再是text的nomic)。

如果不行的话host.docker.internal换成本机的IP试一下,如果还是有如下的弹窗报错:

python 复制代码
An error occurred during credentials validation: HTTPConnectionPool(host='1
92.168.16.60', port=11434): Max retries exceeded with url: /api/embed (
Caused by NewConnectionError('<urllib3.connection.HTTPConnection object 
at 0x7f4698337bc0>: Failed to establish a new connection: [Errno 113] No
 route to host'))

可以试一下以下方法。

2.配置ollama报错解决

/etc/systemd/system/ollama.service文件里的[Service]部分下添

加一行:

python 复制代码
Environment="OLLAMA_HOST=0.0.0.0"

重载systemd并重启Ollama:

python 复制代码
sudo systemctl daemon-reload  
sudo systemctl restart ollama

这也做大概率就能解决问题了。

但是在我这还是继续有这样的报错弹窗,继续分析。
journalctl -u ollama -n 50 日志片段:

python 复制代码
-- Logs begin at Mon 2024-08-05 07:19:16 CST, end at Fri 2025-02-21 10:19:54 CS>
2月 21 10:19:28 yons-MS-7E06 systemd[1]: ollama.service: Main process exited, c>
2月 21 10:19:28 yons-MS-7E06 systemd[1]: ollama.service: Failed with result 'ex>
2月 21 10:19:31 yons-MS-7E06 systemd[1]: ollama.service: Scheduled restart job,>
2月 21 10:19:31 yons-MS-7E06 systemd[1]: Stopped Ollama Service.
2月 21 10:19:31 yons-MS-7E06 systemd[1]: Started Ollama Service.
2月 21 10:19:31 yons-MS-7E06 ollama[62023]: Error: listen tcp 0.0.0.0:11434: bi>
2月 21 10:19:31 yons-MS-7E06 systemd[1]: ollama.service: Main process exited, c>
2月 21 10:19:31 yons-MS-7E06 systemd[1]: ollama.service: Failed with result 'ex>
2月 21 10:19:35 yons-MS-7E06 systemd[1]: ollama.service: Scheduled restart job,>
2月 21 10:19:35 yons-MS-7E06 systemd[1]: Stopped Ollama Service.
2月 21 10:19:35 yons-MS-7E06 systemd[1]: Started Ollama Service.

journalctl日志显示listen tcp 0.0.0.0:11434: bind: address already in use,说明Ollama服务因端口冲突无法启动。

运行docker exec -it dify bashdocker network ls出现 permission denied,说明当前用户未加入 docker 组,首先修复Docker用户组权限:

python 复制代码
# 将当前用户加入docker组
sudo usermod -aG docker $USER

# 立即生效组权限变更(无需重启)
newgrp docker

# 验证权限
ls -l /var/run/docker.sock
# 正确输出应包含「docker」组权限,例如:
# srw-rw---- 1 root docker 0 Aug  5 07:19 /var/run/docker.sock

确认Docker服务状态

python 复制代码
# 检查Docker服务是否运行
sudo systemctl status docker | grep Active

# 如果未运行,启动服务
sudo systemctl start docker

精确查找容器

python 复制代码
# 列出所有容器(包括已停止的)
docker ps -a

# 典型输出示例:
# CONTAINER ID   IMAGE         COMMAND    CREATED       STATUS       PORTS     NAMES
# a1b2c3d4e5f6   nginx:latest  ...        2 hours ago   Up 2 hours   80/tcp    my-nginx

根据 docker ps 输出,Dify部署是通过Docker Compose项目运行的(容器名称前缀为 docker-xxx-1),而不是通过单独的 docker run 命令部署的。因此需要采用 Docker Compose 网络集成方案,而非直接使用 docker run 创建新容器。需要让 Ollama 容器加入与 Dify 相同的 Docker 网络(默认网络名为 docker_default),才能实现跨容器通信。

确认 Dify 的默认网络名称

python 复制代码
# 查看现有网络
docker network ls

# 查找包含 "docker_default" 的网络(名称可能因项目目录名不同而变化)
NETWORK ID     NAME              DRIVER    SCOPE
a1b2c3d4e5f6   docker_default    bridge    local

启动 Ollama 并接入 Dify 网络

python 复制代码
# 启动 Ollama 并附加到 Dify 网络(替换网络名)
docker run -d \
  --name ollama \
  --network docker_default \  # 与Dify容器共享网络
  -p 11434:11434 \
  ollama/ollama

# 验证网络连接
docker inspect ollama | grep NetworkMode
# 应显示:"NetworkMode": "docker_default"

在这一步我出现了问题,运行第一条启动 Ollama 并附加到 Dify 网络时出现报错:

python 复制代码
docker: Error response from daemon: Conflict. The container name "/ollama" is already in use by container "8e01b7ae7b3d2cf10048f6cfe51d4dee3248f705fa482cb10aabcad875e9f4b9". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

容器名称冲突问题,报错显示已存在名为 ollama 的容器(ID: 8e01b7ae7b3d...),需清理旧容器。

第二条验证网络连接运行后只出现一条结果:

python 复制代码
"NetworkMode": "ollama-net",

网络配置残留问题,显示旧容器使用 ollama-net 网络,但需要将其接入 docker_default 网络。

首先彻底清理旧容器及网络

python 复制代码
# 停止并删除旧容器
docker stop ollama && docker rm ollama

# 删除残留的ollama-net网络(如果存在)
docker network rm ollama-net

# 验证清理结果
docker ps -a | grep ollama  # 应无输出
docker network ls | grep ollama-net  # 应无输出

进行检查

python 复制代码
# 检查11434端口是否被其他进程占用
sudo lsof -i :11434

# 如果存在占用,强制释放
sudo kill -9 <PID>

发现sudo lsof -i :11434运行后有个ollama的command,使用kill杀掉以后,再运行sudo lsof -i :11434又能出现一个不同pid的ollama,不能完全被清理掉。

彻底关闭宿主机Ollama服务,停止并禁用系统级Ollama服务

python 复制代码
# 停止服务
sudo systemctl stop ollama

# 禁用开机自启
sudo systemctl disable ollama

# 确认服务状态
sudo systemctl status ollama
# 正确状态应为:inactive (dead)

清除残留进程

python 复制代码
# 强制终止所有ollama进程
sudo pkill -9 ollama

# 确认端口释放
sudo lsof -i :11434
# 应显示无任何进程占用

清理Docker残留配置

python 复制代码
# 删除旧容器(如果存在)
docker rm -f ollama 2>/dev/null

# 清理Docker网络规则
sudo systemctl restart docker

重新创建Docker容器

python 复制代码
# 带完整参数启动
docker run -d \
  --name ollama \
  --restart=unless-stopped \
  --network docker_default \
  -p 11434:11434 \
  -v ollama:/root/.ollama \
  ollama/ollama

# 验证容器状态
docker ps | grep ollama

完成之后要重新下载模型,在容器内下载所需模型

python 复制代码
docker exec ollama ollama pull nomic-embed-text
docker exec ollama ollama run deepseek-r1:70b

修改 Dify 配置指向 Ollama,在 Dify 的模型设置中基础URL: http://ollama:11434 (使用容器名称直接访问)。

添加完deepseek后继续添加nomic

模型类型选择text embedding。

然后上传文件。

相关推荐
落幕4 分钟前
C语言-进程
linux·运维·服务器
深度Linux13 分钟前
C++程序员内功修炼——Linux C/C++编程技术汇总
linux·项目实战·c/c++
chenbin52041 分钟前
Jenkins 自动构建Job
运维·jenkins
java 凯42 分钟前
Jenkins插件管理切换国内源地址
运维·jenkins
AI服务老曹1 小时前
运用先进的智能算法和优化模型,进行科学合理调度的智慧园区开源了
运维·人工智能·安全·开源·音视频
风静如云2 小时前
OpenBMC:BmcWeb定义service
linux
sszdzq2 小时前
Docker
运维·docker·容器
book01212 小时前
MySql数据库运维学习笔记
运维·数据库·mysql
leoufung2 小时前
VIM FZF 安裝和使用
linux·编辑器·vim
bugtraq20213 小时前
XiaoMi Mi5(gemini) 刷入Ubuntu Touch 16.04——安卓手机刷入Linux
linux·运维·ubuntu