Dify配置PostgreSQL数据库连接详细教程

写在前面:

在Dify Docker部署架构中,PostgreSQL作为核心依赖中间件,承担着整个系统所有结构化数据的存储职责------包括用户信息、应用配置、Prompt模板、知识库元数据、操作日志等关键内容,是Dify正常启动、稳定运行的基础支撑。

本教程适配特定部署环境:Windows系统通过Docker部署本地Dify,而PostgreSQL数据库部署在Linux服务器(非Docker容器化,为独立服务器部署)。

一、Dify Docker部署架构

Dify Docker 部署由5 个核心服务容器 + 6 个依赖组件容器 + 网络 / 存储 / 安全层组成,所有服务通过 Docker Compose 统一管理,默认使用内部网络通信,对外仅暴露 Nginx 端口Dify。

1、核心服务容器

(1)dify-web(前端)

  • 镜像:langgenius/dify-web

  • 技术栈:Next.js

  • 端口:3000(内部)

  • 职责:提供可视化管理控制台(应用编排、Prompt 编辑、知识库管理、插件配置),仅做页面渲染与 API 调用,无业务逻辑。

(2)dify-api(后端核心)

  • 镜像:langgenius/dify-api

  • 技术栈:Python/Flask/Gunicorn

  • 端口:5001(内部)

  • 职责:提供 RESTful API(应用 API、控制台 API、开放 API),处理认证授权、模型调用、文件管理、RAG 检索、应用运行时逻辑。

(3)dify-worker(异步任务)

  • 镜像:同dify-api(langgenius/dify-api)

  • 模式:MODE=worker

  • 职责:基于 Celery 处理异步任务(文档解析、向量入库、LLM 批量调用、邮件发送、数据清理),与 API 共享数据库与配置。

(4)dify-worker-beat(定时任务)

  • 镜像:同dify-api

  • 模式:MODE=worker-beat

  • 职责:Celery Beat 定时调度器,触发周期性任务(如知识库自动同步、日志清理)Dify。

(5)dify-plugin-daemon(插件守护进程)

  • 镜像:langgenius/dify-plugin-daemon

  • 端口:5002(内部)

  • 职责:管理第三方插件生命周期(加载 / 卸载 / 运行),提供插件与核心服务的通信通道。

2、依赖容器组件

(1)PostgreSQL(主数据库)

  • 端口:5432

  • 用途:存储结构化数据(用户、应用、Prompt、插件配置、日志、元数据),数据持久化到docker/volumes/db/data。

(2)Redis(缓存 / 队列)

  • 端口:6379

  • 用途:会话缓存、Celery 任务队列、限流、分布式锁,数据持久化到docker/volumes/redis/data。

(3)Weaviate(向量数据库,默认)

  • 端口:8080

  • 用途:RAG 知识库向量存储与检索,支持替换为 Qdrant、Milvus、Pinecone 等。

(4)dify-sandbox(代码沙箱)

  • 端口:8194

  • 用途:安全执行用户自定义代码(如函数调用、数据处理),隔离网络与文件系统,防止恶意代码攻击。

(5)dify-ssrf-proxy(SSRF 防护)

  • 端口:3128

  • 用途:代理 API 服务的外部请求,过滤危险地址,防止 SSRF 攻击。

(6)dify-nginx(反向代理)

  • 端口:80(对外)

  • 职责:统一入口,路由请求:

    • / → dify-web(前端)

    • /api、/console/api、/v1 → dify-api(后端)

二、环境准备

1、检查Docker环境

(1)在命令行(Win+R输入cmd)中输入指令,检查Docker是否运行,看到"Up"即为运行状态:

复制代码
docker ps

(2)查看Dify容器,看到"Up"即为运行状态:

复制代码
docker ps | grep dify

2、检查PostgreSQL(服务器端)

(1)检查是否已安装PostgreSQL,显示版本号即可:

复制代码
psql --version

(2)检查PostgreSQL是否运行:

复制代码
sudo systemctl status postgresql

出现active (running)即表示正在运行,如果是Ubuntu上的PostgreSQL就会出现如图所示active (exited), 这个状态表示PostgreSQL服务本身没有真正运行,active(exited)表示systemd的占位符服务已退出,Main PID: 3530508 (code=exited) 表示主进程已退出,没有正在运行的PostgreSQL进程,因此该命令对于Ubuntu上的PostgreSQL不准确。

原因解释:

Ubuntu 的 PostgreSQL 包有两个服务单元:

  1. postgresql.service(占位符/元服务)
  • 这是一个 wrapper 服务,只是用来触发集群启动

  • 启动后立即退出,所以显示 active (exited)

  • 它的作用是兼容旧版本和简化命令

  1. postgresql@15-main.service(实际服务)
  • 这才是真正运行 PostgreSQL 的服务

  • 状态会显示 active (running)

  • 格式:postgresql@<版本>-<集群名>.service

不同Linux发行版的区别:

✅ 可以用sudo systemctl status postgresql的发行版

发行版 服务名 说明
CentOS / RHEL / Fedora postgresql.service 单实例模式,直接管理
openSUSE / SLES postgresql.service 单实例模式
Arch Linux postgresql.service 单实例模式
Debian (新版) postgresql.service 部分版本已改

❌ 不能用sudo systemctl status postgresql的发行版

发行版 服务名 说明
Ubuntu postgresql@<版本>-< 集群名 >.service 多集群模式
Debian (旧版) postgresql@<版本>-< 集群名 >.service 多集群模式

所以,Ubuntu下的PostgreSQL的检查指令应该是(PostgreSQL版本是15):

复制代码
sudo systemctl status postgresql@15-main

(3)检查端口监听:

复制代码
sudo ss -tlnp | grep 5432

0.0.0.0:5432表示监听所有IPv4 地址,即任何IP都能连接这个5432端口。

::\]:5432表示监听所有IPv6地址,即兼容IPv6连接(不影响使用)。 users:(("postgres",pid=3536569...))表示这个端口由PostgreSQL进程占用,服务完全正常,没有被其他程序占用。 ## 三、配置外部PostgreSQL数据库 #### 1、创建Dify的专用数据库和用户 (1)创建Dify专用用户,密码设置为**dify123456**: sudo -u postgres psql -c "CREATE USER dify WITH PASSWORD 'dify123456';" ![](https://i-blog.csdnimg.cn/direct/aa6c765e4c614e599d1d4c1945260a2d.png) (2)创建名为dify的数据库,指定OWNER dify → 避免权限不足: sudo -u postgres psql -c "CREATE DATABASE dify OWNER dify;" ![](https://i-blog.csdnimg.cn/direct/e9d67f163ac54acf9039331d99f9d256.png) (3)授予权限: sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE dify TO dify;" ![](https://i-blog.csdnimg.cn/direct/39357785a53d48c0b46c13f081e4f365.png) (4)切换到dify数据并授予schema权限: sudo -u postgres psql -d dify -c "GRANT ALL ON SCHEMA public TO dify;" ![](https://i-blog.csdnimg.cn/direct/ce8986d4cd64471aa83c48dc5d89c188.png) #### 2、确认pg_hba.conf允许Dify容器访问 (1)pg_hba.conf是PostgreSQL客户端认证规则文件,控制哪些IP / 主机可以连接PostgreSQL,以及用什么密码方式登录。查看当前pg_hba.conf配置: sudo tail -10 /etc/postgresql/15/main/pg_hba.conf 规则格式固定:host 允许的库 允许的用户 允许的IP/网段 认证方式 图中host all all 172.27.0.0/16 scram-sha-256表示我们已经开放了一整段Docker可能用到的内网网段,不管Docker用 172.17、172.18、172.27......Docker容器全部都能连接PostgreSQL。 ![](https://i-blog.csdnimg.cn/direct/409ed35de50541e3a8e4a0752b7c59d5.png) 如果需要,添加允许Docker网段访问的规则,Docker默认网段通常是172.17.0.0/16: echo "host all all 172.17.0.0/16 scram-sha-256" | sudo tee -a /etc/postgresql/15/main/pg_hba.conf (2)重载PostgreSQL配置,输出 t 则表示配置重载成功,刚刚加入的Docker网段权限已经生效: sudo -u postgres psql -c "SELECT pg_reload_conf();" ![](https://i-blog.csdnimg.cn/direct/781f13248a6f48cc953f55bcd61d7cfe.png) (3)验证配置: sudo tail -5 /etc/postgresql/15/main/pg_hba.conf ![](https://i-blog.csdnimg.cn/direct/8a0032d8591c4503b107a594e1c4ec46.png) #### 3、测试从Docker容器连接 从任意Docker容器测试连接(172.27.XX.XX替换为你的服务器IP,PGPASSWORD=你设置的密码): E:\Dify\dify-main\docker>docker run --rm -e PGPASSWORD=dify123456 postgres:15 psql -h 172.27.XX.XX -U dify -d dify -c "SELECT 1;" ![](https://i-blog.csdnimg.cn/direct/e0a3c2cf79384ad28988579114576785.png) ## 四、在Dify中配置数据库连接 #### 1、修改Dify数据库配置 找到Dify的docker-compose.yaml或.env 文件,一般在安装位置的\\dify-main\\docker文件夹里。 ![](https://i-blog.csdnimg.cn/direct/854e59aeaa9a4c499f59892fd4ea3e11.png) 命令行进入这个目录E:\\Dify\\dify-main\\docker,备份配置: copy .env .env.bak ![](https://i-blog.csdnimg.cn/direct/801bc05d435a415ca6abb5c19b7be96b.png) 编辑.env文件,输入以下指令打开文件: notepad .env 找到这一部分: ![](https://i-blog.csdnimg.cn/direct/fcf51e694acd4d29be6ee29af04875e6.png) 把他改成以下内容,修改DB_USERNAME、DB_PASSWORD、DB_HOST: DB_TYPE=postgresql DB_USERNAME=dify DB_PASSWORD=dify123456 DB_HOST=172.27.XX.XX DB_PORT=5432 DB_DATABASE=dify * **DB_USERNAME**从postgres→ 改成dify(你之前设置的数据库用户名) * **DB_PASSWORD**从默认密码 → 改成你设置的安全密码dify123456 * **DB_HOST(最重要)**从db_postgres(内部容器)→ 改成你的PostgreSQL的真实IP:172.27.XX.XX 修改后保存并关闭记事本。 #### 2、重启Dify容器 还是在这个E:\\Dify\\dify-main\\docker目录下,停止容器: docker compose down ![](https://i-blog.csdnimg.cn/direct/fa9212afedfc49439ed90588e5477eb8.png) 重新启动: docker compose up -d ![](https://i-blog.csdnimg.cn/direct/79d184f080d9466db4f748b6bb5d04fc.png) 实时查看日志: docker compose logs -f api ![](https://i-blog.csdnimg.cn/direct/a22c847a99a24bb29572293c0a3eeb94.png) api-1 \| psycopg2 patched with gevent.是PostgreSQL 连接驱动加载成功的标志,Ctrl+C退出日志。 #### 3、验证数据库连接 首先输入以下指令查看一下容器的名字: docker ps ![](https://i-blog.csdnimg.cn/direct/db710b1975854b5ca7f1eeb0f73882b4.png) 如图所示容器的名字是:**docker-api-1** 查看连接日志,填入的是容器名字docker-api-1: docker logs docker-api-1 2>&1 | findstr -i "database connected error" ![](https://i-blog.csdnimg.cn/direct/5120051327534009919b3fde2cccd3a8.png) Preparing database migration...表示Dify正在尝试连接数据库,并准备检查/更新表结构。如果连不上数据库,这里直接报错:connection failed。 Database migration skipped表示数据库表结构已是最新,无需更新,连接正常! ## 五、配置向量数据库 Dify支持多种向量数据库,这里介绍常用的pgvector(使用PostgreSQL扩展)。 #### 1、在PostgreSQL上安装pgvector扩展 (1)首先检查一下dify数据库是否已经安装了pgvector扩展: sudo -u postgres psql -d dify -c "SELECT * FROM pg_extension WHERE extname = 'vector';" 如果显示(0行数据)那就是没有安装,因为PostgreSQL的扩展机制是:每个数据库**独立安装、独立存在、互不共享**的,如果我们在postgres库(默认库)安装了pgvector,但是新建的dify数据库中还是没有的,需要重新安装,每个数据库需要按需单独实行安装命令。 (2)安装编译依赖: sudo apt update sudo apt install -y postgresql-server-dev-15 build-essential git ![](https://i-blog.csdnimg.cn/direct/46b19164e7664bf291a096c097fbfc6d.png) (3)下载并编译pgvector: cd /tmp git clone https://github.com/pgvector/pgvector.git ![](https://i-blog.csdnimg.cn/direct/94a8a519044844c4a8e05335ce1935f5.png) cd pgvector make sudo make install (4)在dify数据库中启用扩展: sudo -u postgres psql -d dify -c "CREATE EXTENSION IF NOT EXISTS vector;" ![](https://i-blog.csdnimg.cn/direct/391a06e0ad614e5c886f88b0d77d1afa.png) (5)验证安装: sudo -u postgres psql -d dify -c "\dx" ![](https://i-blog.csdnimg.cn/direct/ea6d515b0a224bde8546bdbf77b11cc2.png) 显示存在vector表示安装成功。 #### 2、修改Dify向量数据库配置 (1)编辑.env文件: 还是在E:\\Dify\\dify-main\\docker目录下,打开.env文件找到pgvector设置: notepad .env ![](https://i-blog.csdnimg.cn/direct/133e8e911ac74cd6b3a204ea7d5d2b05.png) 改成以下内容,修改PGVECTOR_HOST、PGVECTOR_USER、PGVECTOR_PASSWORD,改成你的IP地址和数据库名称密码: PGVECTOR_HOST=172.27.XX.XX PGVECTOR_PORT=5432 PGVECTOR_USER=dify PGVECTOR_PASSWORD=dify123456 PGVECTOR_DATABASE=dify 保存后关闭记事本。 #### 3、重启Dify 还是在这个E:\\Dify\\dify-main\\docker目录下,停止容器再重新启动: docker compose down docker compose up -d 检查日志是否正常运行: docker logs -f docker-api-1 ![](https://i-blog.csdnimg.cn/direct/b6a14fff4a2d4b909ee440cbab877f01.png) 没有报错则配置成功。 ## 六、创建知识库并测试 #### 1、在Dify上创建知识库 打开浏览器访问:[http://localhost:8080](http://localhost:8080 "http://localhost:8080") 选择知识库→创建知识库,上传文件作为知识库内容。 ![](https://i-blog.csdnimg.cn/direct/fade4e82d5af495d86a76e717aaa65c8.png) #### 2、pgAdmin连接服务器的PostgreSQL数据库 右键Servers,选择Register→Server,填写名称为test,在"Connection"里面填写服务器IP名称,数据库名称和数据库用户。 ![](https://i-blog.csdnimg.cn/direct/a559ebaa15c446d8b9299fc49f6326d7.png) ![](https://i-blog.csdnimg.cn/direct/457ab4daf4634d65a9b0c4290f84e429.png) | 字段 | 填写内容 | 说明 | |----------------------|------------------|------------------------------| | Host name/address | 172.27.XX.XX | 你的 PostgreSQL 服务器 IP | | Port | 5432 | PostgreSQL 默认端口(如修改过按实际填写) | | Maintenance database | dify | 主数据库 | | Username | dify | 数据库用户 | | Password | dify123456 | 你在 `.env` 中配置的 `DB_PASSWORD` | | SSL mode | prefer 或 disable | 内网通常用 `disable` | 连接后打开dify→Schemas→Tables,找到存储知识库的数据表。 ![](https://i-blog.csdnimg.cn/direct/f82e500bc9d04831a4a215e5951f1a04.png) 数据流转说明: 1. 文件元数据 → documents 表 └── 文件名、类型、状态、总字数 2. 文件被切分成片段 → document_segments 表 └── 每个片段的实际文本内容 (content 字段) 3. 每个片段生成向量 → embeddings 表 └── 向量的哈希值、二进制向量数据 4. 知识库配置 → datasets 表 └── 知识库名称、描述、检索配置 欢迎交流!🌹🌹

相关推荐
云边有个稻草人2 小时前
MySQL 监控实战:mysql_exporter 部署与远程监控实现
数据库·mysql
未来转换2 小时前
Python 框架 Django 从入门到精通
数据库·python·django
LSL666_2 小时前
MybatisPlus——代码生成器
数据库·mybatisplus
小小AK2 小时前
吉客云与MySQL数据集成方案
数据库·mysql
shengli7223 小时前
Python在金融科技(FinTech)中的应用
jvm·数据库·python
xcLeigh3 小时前
IoTDB Python原生接口全攻略:从基础读写到高级实战
开发语言·数据库·python·api·iotdb·原生接口·读写数据
xcLeigh3 小时前
Python操作国产金仓数据库(KingbaseES)全流程:从环境搭建到实战应用
开发语言·数据库·python·国产数据库·kingbasees·金仓数据库
人道领域4 小时前
Day | 11 【苍穹外卖统计业务的实现:含详细思路分析】
java·数据库·后端·苍穹外卖
ZTLJQ10 小时前
数据的基石:Python中关系型数据库完全解析
开发语言·数据库·python