研发效能 本地电脑连接云服务器中 dify 内部 pgsql 数据库

难以怀瑾 · 2026年09月18日 · 145 次阅读

dify 连接内部 pgsql 数据库

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


一、Dify 的数据库在哪里?

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

docker container ps 可以看到类似这样的容器:

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

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

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

很多人第一次尝试用 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 登录到服务器上,然后从服务器上连接 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 隧道,不需要在命令行手动敲 ssh -L,也不用担心关掉终端断线的问题。

在 Navicat 新建 PostgreSQL 连接时:

SSH 选项卡:

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

常规选项卡:

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

这样 Navicat 会自动建立并维护 SSH 隧道,关闭 Navicat 时隧道自动断开,下次打开自动重连,非常方便。


连接成功后如图所示

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册