You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose配置Hasura双数据库遇Postgres连接错误求助

Hasura分离元数据与业务数据库启动报错问题排查

问题描述

尝试在Docker Compose中为Hasura分离元数据存储库和业务数据存储库,使用的docker-compose.yml配置如下:

version: "3.8"
services:
  meta:
    image: postgres
    hostname: meta
    container_name: meta
    environment:
      POSTGRES_DB: meta
      POSTGRES_USER: meta
      POSTGRES_PASSWORD: metapass
    restart: always
    volumes:
      - db_meta:/var/lib/postgresql/data
    networks:
      - backend
  data:
    image: postgres
    hostname: data
    container_name: data
    environment: 
      POSTGRES_DB: data
      POSTGRES_USER: data
      POSTGRES_PASSWORD: datapass
    restart: always
    volumes:
      - db_data:/var/lib/postgresql/data
    networks:
      - backend
  graphql-engine:
    image: hasura/graphql-engine:v2.13.0
    ports:
    - "8080:8080"
    depends_on:
    - "meta"
    - "data"
    restart: always
    environment:
      ## postgres database to store Hasura metadata
      # Database URL postgresql://username:password@hostname:5432/database
      HASURA_GRAPHQL_METADATA_DATABASE_URL: meta://meta:metapass@meta:5432/meta
      ## this env var can be used to add the above postgres database to Hasura as a data source. this can be removed/updated based on your needs
      PG_DATABASE_URL: data://data:datapass@data:5432/data
      ## enable the console served by server
      HASURA_GRAPHQL_ENABLE_CONSOLE: "true" # set to "false" to disable console
      ## enable debugging mode. It is recommended to disable this in production
      HASURA_GRAPHQL_DEV_MODE: "true"
      HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log
      ## uncomment next line to run console offline (i.e load console assets from server instead of CDN)
      # HASURA_GRAPHQL_CONSOLE_ASSETS_DIR: /srv/console-assets
      ## uncomment next line to set an admin secret
      # HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey
    networks:
      - backend
volumes:
  db_data:
  db_meta:
networks: 
  backend: 
    driver: bridge

启动后出现连接错误:

{"detail":{"info":{"code":"postgres-error","error":"connection error","internal":"missing \"=\" after \"meta://meta:metapass@meta:5432/meta\" in connection info string\n","path":"$"},"kind":"catalog_migrate"},"level":"error","timestamp":"2022-10-24T14:16:06.432+0000","type":"startup"}

解决方案

错误根源是数据库连接URL的协议头不符合规范,和主机名无关:

Hasura要求PostgreSQL的连接URL必须以postgresql://(或简写postgres://)开头,你使用的meta://和data://不是合法的PostgreSQL连接协议头,导致解析失败。

1. 修正连接URL

修改Hasura服务的环境变量,替换协议头:

HASURA_GRAPHQL_METADATA_DATABASE_URL: postgresql://meta:metapass@meta:5432/meta
PG_DATABASE_URL: postgresql://data:datapass@data:5432/data

2. 优化容器启动依赖(可选但推荐)

默认的depends_on仅保证启动顺序,不确保PostgreSQL服务完全就绪。可以给两个Postgres服务添加健康检查,确保Hasura在数据库就绪后再启动:

给meta服务添加健康检查:

meta:
  # 原有配置...
  healthcheck:
    test: ["CMD-SHELL", "pg_isready -U meta -d meta"]
    interval: 5s
    timeout: 5s
    retries: 5

给data服务添加健康检查:

data:
  # 原有配置...
  healthcheck:
    test: ["CMD-SHELL", "pg_isready -U data -d data"]
    interval: 5s
    timeout: 5s
    retries: 5

修改Hasura的depends_on配置,依赖健康检查状态:

graphql-engine:
  # 原有配置...
  depends_on:
    meta:
      condition: service_healthy
    data:
      condition: service_healthy

3. 确认网络配置

你的配置中三个服务都加入了backend桥接网络,容器间可以通过服务名(meta、data)直接访问,无需额外配置主机名,这部分是正确的。


内容的提问来源于stack exchange,提问作者53845714nF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:10:38