hasura / graphql-engine

Blazing fast, instant realtime GraphQL APIs on your DB with fine grained access control, also trigger webhooks on database events.
https://hasura.io
Apache License 2.0
31.18k stars 2.77k forks source link

HASURA_GRAPHQL_DATABASE_URL no effect #8535

Open rongcuid opened 2 years ago

rongcuid commented 2 years ago

Version Information

Server Version: 2.7.0

Environment

Docker compose

What is the expected behaviour?

The following docker-compose.yml should give a running instance with default database connection, but it does not.

version: '3.6'
services:
  postgres:
    image: postgres:14
    restart: always
    volumes:
    - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: postgrespassword
  graphql-engine:
    image: hasura/graphql-engine:v2.7.0.cli-migrations-v3
    # volumes:
    # - ./hasura/migrations:/hasura-migrations
    # - ./hasura/metadata:/hasura-metadata
    ports:
    - "8080:8080"
    depends_on:
    - "postgres"
    restart: always
    environment:
      ## postgres database to store Hasura metadata
      HASURA_GRAPHQL_METADATA_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
      ## 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: postgres://postgres:postgrespassword@postgres:5432/postgres 
      HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
      ## 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 set an admin secret
      # HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey
volumes:
  db_data:

Keywords

kaushik94 commented 2 years ago

Try

PG_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres

After that you need to manually track it

# Connect DB
curl -d '{
  "type": "pg_add_source",
  "args": {
    "name": "postgres",
    "configuration": {
      "connection_info": {
        "database_url": {
          "from_env": "PG_DATABASE_URL"
        },
        "pool_settings": {
          "retries": 1,
          "idle_timeout": 180,
          "max_connections": 50
        }
      }
    }
  }
}
' -H "Content-Type: application/json" \
  -H "X-Hasura-Role: admin" \
  -H "X-hasura-admin-secret:  secret" \
  -X POST http://hasura-url/v1/metadata
rongcuid commented 2 years ago

Is this second command documented anywhere? I didn't get this from the quick start documentation.

rikinsk commented 2 years ago

@rongcuid i was unfortunately not able to reproduce this. starting hasura with your configuration does start hasura with a default db connected. could you add any more details on your setup that might help reproduce this.

rongcuid commented 2 years ago

Unfortunately my full yml contains a private container, but I will put it down here anyways:

version: "3.6"
services:
  postgres:
    image: postgres:14
    restart: always
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: postgrespassword
  graphql-engine:
    image: hasura/graphql-engine:v2.7.0.cli-migrations-v3
    volumes:
      - ./hasura/migrations:/hasura-migrations
      - ./hasura/metadata:/hasura-metadata
    ports:
      - "8080:8080"
    depends_on:
      - "postgres"
    restart: always
    environment:
      ## postgres database to store Hasura metadata
      # HASURA_GRAPHQL_METADATA_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
      ## 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: postgres://postgres:postgrespassword@postgres:5432/postgres
      HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
      ## enable the console served by server
      HASURA_GRAPHQL_ENABLE_CONSOLE: "true" # set to "false" to disable console
      HASURA_GRAPHQL_NO_OF_RETRIES: 10
      ## 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 set an admin secret
      # HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey
  web:
    # build: .
    image: msccc
    ports:
      - "8000:8000"
    depends_on:
      - "postgres"
    # - "graphql-engine"
    # restart: on-failure
volumes:
  db_data:

When Hasura starts, I navigate to the console and go to the data tab. No database is set up automatically. I tried setting HASURA_GRAPHQL_DATABASE_URL and PG_DATABASE_URL, but neither gives the default connection. I also tested the "vanilla" image and the "migration" image, and neither sets up the connection automatically.

EDIT: metadata is set up correctly, however. It is just that there is no "Data" connection.

Right now I am working around by setting up migrations, which I need to do anyways. But I am glad to help fixing the original issue.

rikinsk commented 2 years ago

Thanks for the info. Could you also confirm what metadata you are mounting at - ./hasura/metadata:/hasura-metadata. I am wondering if it is possible that an empty metadata might be getting applied as soon as the server starts which is clearing out the database connected by default. One way to test that hypothesis would be commenting out the following lines in your file and then checking if the default db is present

 #volumes:
     #- ./hasura/migrations:/hasura-migrations
     #- ./hasura/metadata:/hasura-metadata
rongcuid commented 2 years ago

In fact, Hasura cannot start up at all if I mount an empty metadata directory. I have tried using the default (non-migration) image and without mounting the volumes. It gave the same behavior.