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.