Noeud miroir en ligne + mini dashboard de monitoring

Salut tout le monde !
J’ai réussi à mettre en place un noeud miroir de Duniter v2s, je suis content de participer !
Pour le fun, avec l’aide de ChatGPT je me suis fait un mini dashboard de monitoring du noeud visible ici : https://node.adn.life

Bon pas de mérite pour le Javascript car c’est le chat qui m’a tout fait, ce qui est sympas c’est de pouvoir modifier l’apparence avec le CSS du fichier HTML.

Vous en dites quoi de ce Dashboard ?

3 Likes

Bravo pour la participation. Quelques remarques :

  • ton noeud semble n’avoir que 8 pairs (cf Polkadot Telemetry), as-tu bien configuré ton écoute et ton annonce ?
  • je peux bien contacter ton noeud :
    curl -X POST https://node.adn.life/rpc/ws -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","id":1,"method":"duniter_peerings","params":{}}' | jq
  • mais pas avec gcli, on dirait que ton certificat n’est pas reconnu : :warning: faute de frappe
    gcli --url wss://note.adn.life/rpc/ws blockchain current-block                                                                                                                                     
    [2026-03-28T17:48:34Z ERROR rustls_platform_verifier::verification::others] failed to verify TLS certificate: invalid peer certificate: UnknownIssuer
    [2026-03-28T17:48:34Z ERROR rustls_platform_verifier::verification::others] failed to verify TLS certificate: invalid peer certificate: UnknownIssuer
    Duniter("can not connect to duniter wss://note.adn.life/rpc/ws")
    

Pour le dashboard, tant mieux si ça te sert. Mais à ce stade, ça fait un outil de plus avec des fonctionnalités partielles. Même si l’IA permet de générer des choses facilement, ce n’est pas forcément pertinent si on ne met pas en commun les efforts de développement.

N’hésite pas à ajouter ton nœud au dépôt nodes / networks · GitLab si tu penses que ton endpoint RPC est stable et peut être intégré aux applications par défaut.


[edit] en effet en corrigeant la faute de frappe ça fonctionne bien :laughing:

$ gcli --url wss://node.adn.life/rpc/ws blockchain current-block
on wss://node.adn.life/rpc/ws
finalized block	325442
current block	325444
2 Likes

Merci pour ton retour, normalement les ports sont bien renseignés et ouverts sur ma box, c’est un serveur auto-hébergé.
Pour gcli je vois que l’url c’est indiqué note.adn.life/… il y une erreur de frappe certainement c’est node.adn.life/… peut-être l’erreur vient de là ?

Oui pour le dashboard, je me suis amusé avec GPT mais ce n’est effectivement pas “vital”…

Je vais aller voir ton lien pour soumettre mon noeud mais à première vue cela ne me semble pas simple…

1 Like

De fait, ça passe :slight_smile:

g1cli --url wss://node.adn.life/rpc/ws blockchain current-block 
on wss://node.adn.life/rpc/ws
finalized block	309345
current block	309347
2 Likes

Par contre, quel port est-ce que tu as mappé pour la partie P2P (port interne 30333) ?

Et si il est bien mappé vers le Host; est-ce que tu forward bien ce port depuis ta box vers la machine qui host le noeud ?

    ports:
      # Format: x.x.x.x:<HostPort>:<DockerInternalPort>
      #   0.0.0.0 means publicly available from Host
      #   127.0.0.1 means only locally available from Host
      # P2P mapping
      - 0.0.0.0:30335:30333

Je pense que la première valeur retournée dans les peerings doit être ton noeud; et il ne mentionne pas les adresses publiques:

    "peerings": [
      {
        "peer_id": "12D3KooWHPvkGTzi9wKx91evLiuaoFtdo2JDWJywk6Te1JCfFHDf",
        "endpoints": []
      },

Pour publier ces adresses, il y a des variables d’environnement:

    environment:
      # URL Publique RPC à partager (pas pour les noeuds SMITH !)
      - DUNITER_PUBLIC_RPC=wss://node.adn.life/rpc/ws
      # P2P - Configuration interne (docker) du port P2P (mieux de laisser tel quel)
      - DUNITER_LISTEN_ADDR=/ip4/0.0.0.0/tcp/30333
      # url P2P Publique (sans la fin "/p2p/<peer_id>")
      #  Configurer le <HostPort>; ou celui qui est remappé dans la Box !
      - DUNITER_PUBLIC_ADDR=/dns/node.adn.life/tcp/30335

J’ai tenté de composer l’url P2P pour faire le test de connectivité, en supposant le port 30333, cela ne passe pas (il faut installer Kubo pour faire ce test)

ipfs swarm connect /dns/node.adn.life/tcp/30333/p2p/12D3KooWHPvkGTzi9wKx91evLiuaoFtdo2JDWJywk6Te1JCfFHDf
=>
Error: connect 12D3KooWHPvkGTzi9wKx91evLiuaoFtdo2JDWJywk6Te1JCfFHDf failure: failed to dial: failed to dial 12D3KooWHPvkGTzi9wKx91evLiuaoFtdo2JDWJywk6Te1JCfFHDf: all dials failed
  * [/ip4/82.66.93.221/tcp/30333] failed to negotiate security protocol: EOF
  * [/ip6/2a01:e0a:446:2520:befc:e7ff:fe8a:2a26/tcp/30333] dial tcp6 [::]:4001->[2a01:e0a:446:2520:befc:e7ff:fe8a:2a26]:30333: i/o timeout
1 Like

Bizarre, ce port est bien dans la config du docker-compose.yml et je l’ai ouvert sur ma box …

2 questions du coup:

  • node.adn.life est bien mappé sur la même IP publique (de ta box) ?
  • Dans la box, tu as bien fais le mapping en protocol “TCP” ou bien les 2 (TCP & UDP) ?
    • (Pour le P2P il faut le protocol TCP)
1 Like

Oui le nom de domaine pointe bien vers l’IP publique de ma box et j’ai ouvert le port 30333 en TCP et UDP.

Je n’ai pas installé Kubo car cela me semble compliqué à mon niveau… peux-tu refaire le test s’il te plaît ?
En effet, j’ai la particularité que mon serveur tourne sous YunoHost + Docker installé à côté. Mais c’est YunoHost qui gère les domaines. Du coup dans l’interface YunoHost j’ai ouvert le port 30333 qui n’apparaissait pas comme ouvert.
Merci de ton aide.

Même résultat.

ipfs swarm connect /dns/node.adn.life/tcp/30333/p2p/12D3KooWHPvkGTzi9wKx91evLiuaoFtdo2JDWJywk6Te1JCfFHDf
Error: connect 12D3KooWHPvkGTzi9wKx91evLiuaoFtdo2JDWJywk6Te1JCfFHDf failure: failed to dial: failed to dial 12D3KooWHPvkGTzi9wKx91evLiuaoFtdo2JDWJywk6Te1JCfFHDf: all dials failed
  * [/ip6/2a01:e0a:446:2520:befc:e7ff:fe8a:2a26/tcp/30333] failed to negotiate security protocol: EOF
  * [/ip4/82.66.93.221/tcp/30333] failed to negotiate security protocol: EOF

C’est tout de même étrange le message d’erreur est différent de si je tente vers un port non mappé (dans ce cas j’ai des i/o timeout).
On dirait qu’une partie est mappée ou … mais qu’il y a un soucis ?

Pour info, pour tester la bonne configuration de redirection de ports (et éventuellement configuration des firewall), … il y a une commande iperf3 qui est très utile (on peut la faire fonctionner en mode “client” et “serveur”).

@fdrubigny ok, j’ai trouvé :slight_smile:

L’erreur est parceque tu as configuré le port en WebSocket dans ta configuration; et du coup l’url doit également être adaptée (“/ws/” en plus avant le “/p2p/…”).

ipfs swarm connect /dns/node.adn.life/tcp/30333/ws/p2p/12D3KooWHPvkGTzi9wKx91evLiuaoFtdo2JDWJywk6Te1JCfFHDf
connect 12D3KooWHPvkGTzi9wKx91evLiuaoFtdo2JDWJywk6Te1JCfFHDf success

Du coup, si tu gardes cette configuration, la bonne valeur à mettre pour la “publication” de ton adresse P2P est celle-ci:

    environment:
      # P2P - Configuration interne (docker) du port P2P (mieux de laisser tel quel)
      - DUNITER_LISTEN_ADDR=/ip4/0.0.0.0/tcp/30333/ws
      # url P2P Publique (sans la fin "/p2p/<peer_id>")
      #  Configurer le <HostPort>; ou celui qui est remappé dans la Box !
      - DUNITER_PUBLIC_ADDR=/dns/node.adn.life/tcp/30333/ws

Si par contre tu veux fonctionner en tcp pur; il faut enlever le “/ws” des 2 côtés:

    environment:
      # P2P - Configuration interne (docker) du port P2P (mieux de laisser tel quel)
      - DUNITER_LISTEN_ADDR=/ip4/0.0.0.0/tcp/30333
      # url P2P Publique (sans la fin "/p2p/<peer_id>")
      #  Configurer le <HostPort>; ou celui qui est remappé dans la Box !
      - DUNITER_PUBLIC_ADDR=/dns/node.adn.life/tcp/30333
2 Likes

Je suppose que tu parles de la configuration du fichier docker-compose.yml ?
Je ne comprends pas ce que je dois mettre ici : # url P2P Publique (sans la fin "/p2p/<peer_id>)

Je parle bien de la configuration dans le docker-compose.yml oui.

Les lignes qui commencent par “#” sont des commentaires pour expliquer :slight_smile:

J’ai déjà mis les 2 bonnes valeurs pour ton cas pour DUNITER_LISTEN_ADDR et DUNITER_PUBLIC_ADDR suivant que tu gardes configuré avec WebSocket ou non.

Et si je prend l’exemple sans WebSocket: DUNITER_PUBLIC_ADDR=/dns/node.adn.life/tcp/30333

Le commentaire veut dire que l’url complète pour tester le P2P est cette valeur là plus “/p2p/<peer_id>”; ce qui donne dans ton cas:

/dns/node.adn.life/tcp/30333/p2p/12D3KooWHPvkGTzi9wKx91evLiuaoFtdo2JDWJywk6Te1JCfFHDf
1 Like

Ok ok, merci je comprends mieux, je vais vérifier mon docker-compose et faire les modifications nécessaires.

J’ai mis à jours ma configuration de docker-compose.yml normalment cela fonctionne… Merci @Nicolas80 :slight_smile:

Cet après-midi j’ai fait recoder mon dashboard à Claude code il m’a sorti un truc beaucoup plus sympa (à mes yeux, hein !) => https://node.adn.life (il faut actualiser la page au cas où c’ets l’ancienne version qui s’affiche).

J’en ai profité pour mettre ce fichier sur Gitlab pour celle et ceux qui voudraient l’ajuster à leur propre node et/ou l’améliorer, ce qui serait très bien :wink: => Sign in · GitLab

Bonne fin de journée, amicalement.

1 Like

Petit détail, je remarque que tu n’as pas configuré ton adresse publique RPC (“endpoints” toujours vides pour ton peer_id dans le retour de l’appel RPC mentionné par Hugo).

Pour la partager, il faut ajouter cette variable d’environnement:

    environment:
      # URL Publique RPC à partager (pas pour les noeuds SMITH !)
      - DUNITER_PUBLIC_RPC=wss://node.adn.life/rpc/ws

Edit: Comparaison des endpoints déclarés pour mon noeud Mirror (filtrage avec jq pour ne voir que le 1er résultat des peerings):

curl -s -X POST https://mirror-rpc.g1-bn.brussels.ovh -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","id":1,"method":"duniter_peerings","params":{}}' | jq -r '.result.peerings[0]'
>
{
  "peer_id": "12D3KooWBYwuuBHh3co7kr4mZTbccVWNCpdA8A1e7PKNxeHvGq9D",
  "endpoints": [
    {
      "protocol": "rpc",
      "address": "wss://mirror-rpc.g1-bn.brussels.ovh/"
    }
  ]
}

Réponse pour ton noeud:

curl -s -X POST https://node.adn.life/rpc/ws -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","id":1,"method":"duniter_peerings","params":{}}' | jq -r '.result.peerings[0]'
>
{
  "peer_id": "12D3KooWHPvkGTzi9wKx91evLiuaoFtdo2JDWJywk6Te1JCfFHDf",
  "endpoints": []
}
3 Likes

Merci pour toutes ces précisions, je suis vraiment newbie… :frowning:
C’est corrigé ! :slight_smile:

2 Likes

Merci beaucoup à vous deux pour ces échanges, ça fait chaud au cœur de se connecter au forum après un jour et de voir des personnes qui s’entraident avec patience et application ! C’est très motivant quand on débute de pouvoir observer ces discussions, ça fait vraiment la différence par rapport à un monde où chacun galère devant son IA.

5 Likes

J’ai mis à jours le dashboard de mon node + ajout d’un dashboard en “vue réseau” => https://node.adn.life

J’ai mis à jour sur Gitlab également => Sign in · GitLab

Belle et bonne journée à vous.

Bonjour à vous.
J’essaie de rajouter une autre page sur ce dashboard pour afficher une carte géographique des nodes avec leur statut quand on clique sur leur point de géolocalisation.
La page fait un refresh toutes les 30 secondes mais malgré cela elle n’affiche que 10 nodes sur 23 détectés dont 4 injoignables ou offline ?
La carte est disponible ici => Duniter Map Dashboard
Pour l’instant je ne l’ai pas publiée sur le Gitlab avec le reste car ce n’est pas opérationnel comme il faut.
Vous pouvez récupérer le code en clic droit sur la page puis afficher le code source.
Si vous avez des idées sur comment récupérer la géolocalisation de tous les nodes (au moins ceux qui exposent leur adresse IP publique), je suis preneur. :slight_smile:
Belle et bonne journée à vous.

1 Like