无法通过自托管Directus连接本地PostgreSQL数据库求助
问题描述
通过Supabase Docker Compose部署本地PostgreSQL数据库后,本地执行以下命令可正常连接:
psql -h localhost -p 5432 -U postgres
但使用Docker Compose部署的自托管Directus尝试连接时失败,错误信息如下:
directus-directus-1 | Error: connect ECONNREFUSED 127.0.0.1:5432 directus-directus-1 | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1555:16) { directus-directus-1 | errno: -111, directus-directus-1 | code: 'ECONNREFUSED', directus-directus-1 | syscall: 'connect', directus-directus-1 | address: '127.0.0.1', directus-directus-1 | port: 5432 directus-directus-1 | }
Directus的Docker Compose配置文件如下:
version: "3" services: directus: image: directus/directus:10.9.0 ports: - 8055:8055 volumes: - ./database:/directus/database - ./uploads:/directus/uploads - ./extensions:/directus/extensions environment: KEY: "replace-with-random-value" SECRET: "replace-with-random-value" DB_CLIENT: "pg" DB_HOST: "localhost" DB_PORT: "5432" DB_DATABASE: "postgres" DB_USER: "postgres" DB_PASSWORD: "your-super-secret-and-long-postgres-password" WEBSOCKETS_ENABLED: "true"
问题排查与解决
核心原因
Docker容器内的localhost指向容器自身,而非宿主机。你的Directus容器尝试连接自己的5432端口,但该端口并未运行PostgreSQL服务,因此触发ECONNREFUSED错误。
针对性解决方法
场景1:Supabase与Directus在同一Docker Compose网络中
如果Supabase和Directus是通过同一套Docker Compose部署的,直接修改Directus配置中的DB_HOST为Supabase的PostgreSQL服务名称(Supabase默认服务名为db):
DB_HOST: "db"
重启Directus容器即可生效。
场景2:Supabase与Directus不在同一Docker Compose网络中
- 替换localhost为宿主机IP:
找到宿主机的局域网IP(例如192.168.1.100),修改Directus的DB_HOST为该IP:DB_HOST: "192.168.1.100" - 允许PostgreSQL监听外部连接:
修改Supabase的PostgreSQL配置(通常在supabase/docker/db/init/00-config.sql或对应配置文件),将listen_addresses设置为'*',开放外部连接权限。 - 更新PostgreSQL用户连接权限:
确保postgres用户允许从Directus所在网络连接,执行以下SQL:
也可以创建专门的Directus连接用户:ALTER USER postgres WITH PASSWORD 'your-super-secret-and-long-postgres-password'; GRANT ALL PRIVILEGES ON DATABASE postgres TO postgres; ALTER USER postgres CONNECTION LIMIT -1;
同步更新Directus配置中的CREATE USER directus_user WITH PASSWORD 'directus-password'; GRANT ALL PRIVILEGES ON DATABASE postgres TO directus_user;DB_USER和DB_PASSWORD。 - 重启容器:
重启Supabase和Directus容器,让所有配置生效。
额外检查项
- 确认宿主机5432端口未被防火墙/安全组拦截。
- 通过
docker ps检查Supabase的PostgreSQL容器是否正常运行。 - 验证Directus容器能否ping通宿主机IP或Supabase的PostgreSQL服务名称。
内容的提问来源于stack exchange,提问作者Yogesh
相关产品推荐
相关产品推荐

