Mise en production de l'indexeur

J’aurais besoin d’aide pour la mise en production de l’indexeur.

Actuellement j’ai un docker-compose.yml qui ressemble à ça :

docker-compose.yml
services:
  # postgres database
  postgres:
    image: postgres:12
    restart: always
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: postgrespassword

  # hasura
  graphql-engine:
    image: duniter/hasura-indexer:latest
    depends_on:
      - postgres
    restart: always
    ports:
      - 127.0.0.1:8484:8080 # 8080 already used by wotwizard
    environment:
      # postgres database
      HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
      # enable the console served by server
      HASURA_GRAPHQL_ENABLE_CONSOLE: "true"
      # dev mode
      HASURA_GRAPHQL_DEV_MODE: "false"
      # logging
      # HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup
      # admin password
      HASURA_GRAPHQL_ADMIN_SECRET: hasura_password
      # Name of role when the Authorization header is absent in JWT
      HASURA_GRAPHQL_UNAUTHORIZED_ROLE: public
      # telemetry
      HASURA_GRAPHQL_ENABLE_TELEMETRY: "false"
      HASURA_GRAPHQL_MIGRATIONS_SERVER_TIMEOUT: 60

  # indexer (must have duniter-archive on duniter network)
  indexer:
    image: h30x/duniter-indexer
    environment:
      - POSTGRES_HOST=postgres
      - INDEXER_DUNITER_WS_ENDPOINT=ws://duniter-archive:9944
      - INDEXER_DUNITER_WS_ENDPOINT_GRAPHIQL=wss://gdev.coinduf.eu/ws
      - INDEXER_HASURA_GRAPHQL_ENDPOINT_GRAPHIQL=https://hasura.gdev.coinduf.eu
    restart: unless-stopped
    ports:
      - 127.0.0.1:3000:3000
    depends_on:
      # - duniter-archive # depends on archive node through network
      - postgres
      - graphql-engine
    volumes:
      - logs:/logs
      - resources:/resources
    # allows to connect to duniter node
    networks:
      - duniter

# define volumes
volumes:
  postgres-data:
  logs:
  resources:

# define duniter external network to allow connect to duniter archive node
networks:
  duniter:
    name: duniter-gdev-archive_default
    external: true

(oui, le mot de passe postgres est en clair pour l’instant)

J’utilise un network externe pour me connecter au nœud archive :

networks:
  duniter:
    name: duniter-gdev-archive_default
    external: true

Cette partie fonctionne.

J’utilise l’image image: h30x/duniter-indexer produite à partir de ma branche pour avoir le genesis du réseau en cours et parce qu’il faut réparer la CI.

Je définis la variable d’environnement POSTGRES_HOST=postgres, ça devrait permettre à l’indexeur de se connecter à la base postgres pour ajouter des choses dedans. Mais dans les logs (dans le volume de log qui contient le fichier production-logs.log), il y a des lignes {"level":50,"time":1700554974770,"pid":1,"hostname":"300fdc9080d0","msg":"getaddrinfo ENOTFOUND postgres"} .

Pourquoi est-ce qu’il ne trouve pas “postgres” ? Normalement dans un docker-compose, il y a des hostname correspondant aux différents services, jusque là ça marchait, et ça a l’air de fonctionner pour le hostname duniter-archive, mais là c’est cassé. Est-ce que le problème vient du connecteur sql ? Je ne sais pas pourquoi l’indexeur n’arrive plus à se connecter à sa base, pourtant rien n’a changé. Peut-être une mise à jour de docker ? Je ne sais pas tellement où chercher.


J’ai tenté :

# exécuter bash dans le conteneur de l'indexeur
docker exec -t -i 300fdc9080d0 /bin/sh

# chercher l'ip de duniter-archive
nslookup duniter-archive
# → il y a bien une réponse

# chercher l'ip de postgres
nslookup postgres
# → il n'y a pas de réponse
# ** server can't find postgres: NXDOMAIN

Donc c’est bien au niveau du réseau docker qu’il y a un problème, je vais creuser. (merci beaucoup à @Pini de m’avoir donné il y a quelques mois un petit cours introductif sur le réseau docker sinon je ne m’en serais jamais sorti)


Autre manière plus propre de faire la même chose :

docker compose run --rm indexer nslookup duniter-archive # réponse
docker compose run --rm indexer nslookup postgres # pas de réponse

Quelque chose a dû changer dans docker puisque j’ai dû ajouter le réseau default explicitement :

networks:
  - default
  - duniter

Et là docker compose run --rm indexer nslookup postgres me donne une réponse.

C’est bon, j’ai enfin un indexeur en production https://indexer.gdev.coinduf.eu/.

Il restait quelques petits trucs à régler et j’ai notamment galéré avec le nouveau système de log et les réseaux docker. Maintenant il ne me reste plus qu’à documenter, demander à d’autres de tester et de mettre au propre :slight_smile:

4 Likes