dify连接内部pgsql数据库

前言:公司领导需要统计问答机器人的命中率和总数,目前采取的是调用dify的接口进行统计,需要遍历每条会话的详情,比较耗时,因此想通过直接查数据提高效率
在这里插入图片描述


一、Dify 的数据库在哪里?

如果你是通过 Docker Compose 部署的 Dify,不需要单独安装 PostgreSQL,因为 Dify 已经自带了一个 PostgreSQL 容器。

docker container ps 可以看到类似这样的容器:
在这里插入图片描述

这就是 Dify 内置的数据库容器。

默认连接信息如下(以 .env 文件实际配置为准):

字段默认值
主机db_postgres
端口5432
数据库dify
用户名postgres
密码difyai123456

二、为什么本地 Navicat 连不上?

很多人第一次尝试用 Navicat 连接公网 IP,会看到这样的报错:

could not connect to server: Connection timed out (0x0000274C/10060)
Is the server running on host "115.191.53.169" and accepting
TCP/IP connections on port 5432?

这个错误的本质是:TCP 连接在到达 PostgreSQL 之前就超时了,和密码对不对没有关系。

原因在于,默认的 docker-compose.yaml 中,db_postgres 服务没有声明 ports,也就是说 PostgreSQL 容器只在 Docker 内部网络中监听,宿主机和公网都访问不到。

db_postgres:
  image: postgres:15-alpine
  profiles:
    - postgresql
  # ...
  volumes:
    - ./volumes/db/data:/var/lib/postgresql/data
  # ⚠️ 没有 ports 字段

这其实是一件好事——Dify 默认没有把数据库暴露到公网,是出于安全考虑。


三、为什么不建议直接开放公网?

有的人可能会想:那我加上 ports: "公网地址:5432:5432",不就能连上了吗?

强烈不建议这么做。

一旦 PostgreSQL 暴露到公网:

  • 会被各种扫描器在几分钟内发现
  • 会遇到密码暴力破解
  • 数据泄露、被勒索的风险极高
  • 很多云厂商默认就封禁 5432 端口

正确的做法是:不开放公网端口,通过 SSH 隧道连接。


四、推荐方案:SSH 隧道 + Navicat 内置 SSH 功能

原理:先通过ssh登录到服务器上,然后从服务器上连接pgsql

第一步:服务器端只绑定本机回环地址

修改 docker-compose.yaml,给 db_postgres 添加 ports,但只绑定到 127.0.0.1

db_postgres:
  image: postgres:15-alpine
  profiles:
    - postgresql
  # ...
  volumes:
    - ./volumes/db/data:/var/lib/postgresql/data
  ports: # 新增
    - "127.0.0.1:5432:5432"   # 新增只允许服务器本机访问

重启dify

docker compose  down
docker compose  up -d

第二步:用 Navicat 内置 SSH 隧道连接

Navicat 本身就支持 SSH 隧道,不需要在命令行手动敲 ssh -L,也不用担心关掉终端断线的问题。

在 Navicat 新建 PostgreSQL 连接时:

SSH 选项卡:

字段
使用 SSH 隧道✅ 勾选
主机xxx(你的服务器公网 IP)
端口22
用户名服务器系统登录用户(如 root
验证方式密码
密码服务器登录密码

在这里插入图片描述

常规选项卡:

字段
主机127.0.0.1(相对于服务器的本机)
端口5432
数据库dify
用户名postgres
密码.env 里的 DB_PASSWORD

这样 Navicat 会自动建立并维护 SSH 隧道,关闭 Navicat 时隧道自动断开,下次打开自动重连,非常方便。
在这里插入图片描述


连接成功后如图所示

在这里插入图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐