本地PC无法连接Synology DS920上Portainer部署的PostgreSQL
问题解决指南
一、正确的连接参数设置
你核心的错误是没搞清楚容器端口映射的逻辑:PostgreSQL容器的端口映射是2665:5432,这表示本地PC连接时要用宿主机(群晖)的2665端口,而非容器内部的5432端口。
- Host:填你的Synology DS920局域网IP(比如
192.168.x.x),不要用容器IP或localhost - Port:填映射的宿主机端口
2665,不是容器的5432
修正后的Python代码:
import psycopg2 conn = psycopg2.connect( host="你的群晖局域网IP", port=2665, database="Test", user="你的数据库用户名", password="你的数据库密码" )
二、连接失败的排查要点
- 端口映射校验:在Portainer的PostgreSQL容器详情里,确认端口映射是
0.0.0.0:2665->5432/tcp(0.0.0.0表示允许所有IP访问) - 群晖防火墙放行:进入群晖控制面板的「防火墙」,新增入站规则,允许2665端口的TCP请求
- pg_hba.conf访问控制:这是比
listen_addresses更关键的配置,必须添加允许局域网IP访问的规则:
通过Portainer打开PostgreSQL容器的终端,执行vi /var/lib/postgresql/data/pg_hba.conf,添加一行:
把host all all 192.168.0.0/16 scram-sha-256192.168.0.0/16换成你的实际局域网网段,之后重启PostgreSQL容器生效
三、查看允许访问的用户列表
有两种实用方法:
- SQL查询:连接数据库后执行语句,查看所有用户及权限:
若要查看特定数据库的用户权限:SELECT usename, usesuper, usecreatedb FROM pg_user;SELECT grantee, privilege_type FROM information_schema.table_privileges WHERE table_catalog = 'Test'; - 查看pg_hba.conf:该文件里的每一行都是一条访问控制规则,直接定义了哪些IP和用户能连接数据库
四、额外配置检查
除了listen_addresses = '*',还要注意:
- 如果是自定义配置文件,要确保容器启动时挂载了包含修改后
pg_hba.conf和postgresql.conf的卷,否则容器重启后配置会被重置 - 确认数据库用户的连接权限,部分用户可能默认只允许本地连接
内容的提问来源于stack exchange,提问作者Hotone
相关产品推荐
相关产品推荐

