Installer facilement Duniter 1.9-GVA

Voici une procédure détaillé, pas à pas, pour installer votre noeud Duniter 1.9-GVA sur votre machine.

Il s’agit de la dernière version en date de Duniter v1. Cette version rend notamment accessible la dernière API GVA, utile pour le fonctionnement de nombreux services comme Ğ1-stats, la carte monnaie libre, Ğ1 super bot ou Ginkgo.

Merci à @pini et @aya pour la dockerisation de cette version de Duniter !
N’hésitez pas à leur faire un don ! (leurs clés publiques sont visibles en cliquant sur leurs pseudo ici même).

Ils compléterons cette procédure si une erreur s’y est glissé, ou si des évolutions sont apportés à ce docker compose.

Il me semble que cette image Docker n’est disponible que pour les architectures x86 (amd64), et pas encore pour ARM, mais ça aussi ils le préciseront si je dis des bêtises.


  1. Installez Docker CE sur votre appareil en suivant leur documentation officielle.
  2. Créez un nouveau dossier sur votre appareil, que vous pouvez appeler duniter par exemple, et à l’intérieur, créez un nouveau fichier nommé docker-compose.yml
  3. Éditez ce fichier avec un éditeur de texte, et collez y ce contenu:
version: '3.6'

services:
  duniter:
    environment:
    - DEBUG_ENTRYPOINT=${DUNITER_DEBUG_ENTRYPOINT:-${DEBUG_ENTRYPOINT:-${DEBUG:-}}}
    - DUNITER_AUTO_SYNC=${DUNITER_AUTO_SYNC:-true}
    - DUNITER_BMA_ENABLED=${DUNITER_BMA_ENABLED:-true}
    - DUNITER_BMA_IP4=${DUNITER_BMA_IP4:-0.0.0.0}
    - DUNITER_BMA_REMOTE_HOST=${DUNITER_BMA_REMOTE_HOST:-duniter.localhost}
    - DUNITER_BMA_REMOTE_PORT=${DUNITER_BMA_REMOTE:-443}
    - DUNITER_GVA_ENABLED=${DUNITER_GVA_ENABLED:-true}
    - DUNITER_GVA_PATH=${DUNITER_GVA_PATH:-gva}
    - DUNITER_GVA_PORT=${DUNITER_GVA_PORT:-30901}
    - DUNITER_GVA_REMOTE_HOST=${DUNITER_GVA_REMOTE_HOST:-duniter.localhost}
    - DUNITER_GVA_REMOTE_PATH=${DUNITER_GVA_REMOTE_PATH:-gva}
    - DUNITER_GVA_REMOTE_PORT=${DUNITER_GVA_REMOTE_PORT:-443}
    - DUNITER_GVA_REMOTE_TLS=${DUNITER_GVA_REMOTE_TLS:-false}
    - DUNITER_GVA_WHITELIST=${DUNITER_GVA_WHITELIST:-127.0.0.1,::1}
    - DUNITER_MANUAL_CONFIG=${DUNITER_MANUAL_CONFIG:-false}
    - DUNITER_POW_PREFIX=${DUNITER_POW_PREFIX:-}
    - DUNITER_POW_CPU=${DUNITER_POW_CPU:-0.8}
    - DUNITER_POW_NBCORES=${DUNITER_POW_NBCORES:-1}
    - DUNITER_START_OPTS=${DUNITER_START_OPTS:-direct_webstart}
    - DUNITER_SYNC_HOST=${DUNITER_SYNC_HOST:-g1.duniter.org:443}
    - DUNITER_SYNC_OPTS=${DUNITER_SYNC_OPTS:-}
    - DUNITER_WS2P_HOST=${DUNITER_WS2P_HOST:-0.0.0.0}
    - DUNITER_WS2P_PORT=${DUNITER_W2SP_PORT:-20901}
    - DUNITER_WS2P_PUBLIC=${DUNITER_W2SP_PUBLIC:-true}
    - DUNITER_WS2P_REMOTE_HOST=${DUNITER_WS2P_REMOTE_HOST:-duniter.localhost}
    - DUNITER_WS2P_REMOTE_PATH=${DUNITER_WS2P_REMOTE_PATH:-ws2p}
    - DUNITER_WS2P_REMOTE_PORT=${DUNITER_WS2P_REMOTE_PORT:-443}
    image: duniter/duniter:dev
    networks:
    - private
    ports:
    - 0.0.0.0:10901:10901
    - 0.0.0.0:20901:20901
    - 0.0.0.0:30901:30901
    - 0.0.0.0:9220:9220
    restart: unless-stopped
    volumes:
    - data:/var/lib/duniter
    - etc:/etc/duniter

networks:
  private:
    name: ${DOCKER_NETWORK_PRIVATE:-duniter}
  public:
    name: ${DOCKER_NETWORK_PUBLIC:-host}

volumes:
  data:
  etc:

Vous pouvez optionnellement remplacer les valeurs duniter.localhost par le nom de domaine que vous souhaitez attribuer à votre noeud Duniter.
Enregistrer ensuite ce fichier.
4. Exécutez la commande suivante dans un terminal (attention à bien vous situer dans le répertoir contenant le fichier docker-compose.yml) :

docker compose up -d

Félicitation, votre noeud Duniter 1.9-GVA démarre, se synchronise au noeud g1.duniter.org, puis démarre !

Si tout se passe bien, votre noeud devrait être accessible à cette adresse: http://127.0.0.1:10901
Ainsi que le playground GVA à cette adresse: http://127.0.0.1:30901/gva/playground


Bonus:

  1. Pour afficher les logs de votre noeud: docker compose logs -f --tail 200
  2. Pour couper votre noeud: docker compose down
  3. Vérifier si votre noeud tourne ou non (que le processus est lancé): docker ps

Bonus 2:

Si vous voulez que votre noeud soit accessible depuis l’extérieur, voici le fichier de configuration nginx à adapter selon votre nom de domaine, et à placer dans votre répertoire /etc/nginx/conf.d/duniter.conf:

server {
   server_name    mon-noeud-duniter.fr;
   listen 80;

  location / {
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto $scheme;
    proxy_set_header        Host            $http_host;
    proxy_set_header        X-NgninX-Porxy  true;

    proxy_pass http://127.0.0.1:10901;
    proxy_redirect          off;

    # Socket.io support
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 86400s;
    proxy_send_timeout 86400s;
  }

  location /gva {
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto $scheme;
    proxy_set_header        Host            $http_host;
    proxy_set_header        X-NgninX-Proxy  true;

    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        #
        # Custom headers and headers various browsers *should* be OK with but aren't
        #
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        #
        # Tell client that this pre-flight info is valid for 20 days
        #
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
     }
     if ($request_method = 'POST') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
     }
     if ($request_method = 'GET') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
     }

    proxy_pass http://127.0.0.1:30901;
    proxy_redirect          off;
  }

  location /gva-sub  {
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto $scheme;
    proxy_set_header        Host            $http_host;
    proxy_set_header        X-NgninX-Porxy  true;

    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        #
        # Custom headers and headers various browsers *should* be OK with but aren't
        #
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        #
        # Tell client that this pre-flight info is valid for 20 days
        #
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
     }
     if ($request_method = 'POST') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
     }
     if ($request_method = 'GET') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
     }

    proxy_pass http://127.0.0.1:30901;
    proxy_redirect          off;

    # Socket.io support
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
  }

   location ^~ /ws2p/ {
      rewrite ^/ws2p/(.*)$ /$1 break;
      proxy_pass        http://127.0.0.1:20901;
      proxy_set_header  X-Real-IP  $remote_addr;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header  X-Forwarded-Proto https;
      proxy_set_header  Host $http_host;
      proxy_redirect    off;
      proxy_http_version 1.1;
      proxy_set_header  Upgrade $http_upgrade;
      proxy_set_header  Connection "upgrade";
   }
}

Replacez simplement mon-noeud-duniter.fr par votre nom de domaine, dont le DNS doit pointer sur l’adresse IP de votre machine.


Pour le moment, il n’est pas possible d’assigner votre clé publique membre à ce nœud via ce docker compose de manière à forger avec, mais cela viendra probablement dans de futures versions.

Vous pouvez néanmoins assigner votre clé membre manuellement en entrant dans le container Docker (docker exec -it duniter-duniter-1 sh) et en exécutant la commande wizard de Duniter directement (duniter wizard key)

N’hésitez pas si vous avez des questions/remarques.
N’hésitez pas également à partager le nom de domaine de votre noeud.

12 « J'aime »

Salut, merci pour ce tuto ! :slight_smile:
comment se rendre compte que duniter se synchronise comme il faut ? Car souvent le noeud g1.duniter.org est down…
J’essaye d’installer cette version sur un tout petit VPS de 2Go de RAM est-ce que tu penses que c’est réalisable ?
L’adresse du noeud que je tente de faire fonctionner => duniter.g1.lu
Amicalement, Francis

Je ne pense pas que la synchro fonctionne avec 2Go. Ça marcherait peut-être limite avec 3Go. 4Go c’est plus sûr.

1 « J'aime »

Salut, oui ça bloque… j’ai retenté une synchro en rentrant dans le container comme expliqué plus haut via docker exec -it duniter-duniter-1 sh puis duniter sync adresse d’un noeud mais ça a bloqué à 35% appliqué… dommage, augmenter ce VPS me coûterais un peu trop cher tous les mois, mais bon j’ai tenté l’expérience et grâce à ce tuto je vais peut-être pouvoir aider Econolibre à mettre en place un noeud sur un vPS plus costaud.

Ça marche sur un serveur dédié KS1 à 6€ par mois chez Kimsufi. J’ai même pu faire tourner deux mirroirs sur le même serveur (ğ1 et ğ1-test).

3 « J'aime »

Bonjour, merci pour ce tuto :pray:

Question d’une utilisatrice lamda : est-ce que c’est possible et c’est mieux de se connecter à un noeud 1.9-GVA avec Cesium pour éviter que ca rame ?

Non cela ne devrait pas avoir d’incidence :slight_smile:

1 « J'aime »

favorisez tout de même la connexion de cesium à des noeuds mirroirs car même s’ il n’ y a pas encore de cagnotte pour les rémuniteriser ce sont les plus stables (c+ aide aussi à la navigation et n’ a pas non plus de cagnotte dédiée au pods)

#donnerunejune

1 « J'aime »

Salut,
nous avons installé un noeud Econolibre sur duniter.econolib.re, je tente une synchronisation mais directe j’ai un message :
« Status: Peers…(node:61) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 pipe listeners added. Use emitter.setMaxListeners() to increase limit »
Je ne sais pas si la synchro va aller au bout du coup… sais-tu ce qu’il faut que je fasse ? Car je ne comprends pas ce message.
Le VPS qu’on utilise a 4 Go de RAM.
Amicalement, Francis

J’ai aussi ce message memory leak occasionellement dans mes logs. Ça se produit toujours dans la phase init: bundle of peers 7/9. Ça ne semble pas gêner le fonctionnement global. C’est plus à prendre comme un warning je pense.

1 « J'aime »

OK, merci pour ton retour. La synchro a bloqué à 88%, je l’ai relancé cette nuit elle a bloqué à 55%… Je retente ce matin.

Pour ma part je ne réalise plus de synchro depuis mes serveurs en faible ressources. Je fais une synchro sur mon PC, puis je transfère le volume Docker ainsi généré vers mon serveur qui peut alors reprendre tranquillement. Ainsi la durée totale de l’opération est de l’ordre de 2h et ça réussit à tous les coups, alors que sur mon serveur c’est minimum 8h avec risque de ne pas aller au bout.

1 « J'aime »

Comment procèdes-tu pour réaliser ces opérations ? As-tu les commandes à me donner s’il te plaît ? Merci :slight_smile:

1 « J'aime »

C’est une opération qui dépend beaucoup de ta configuration. Donc non, je ne peux te donner de mode opératoire détaillé, mais voici en substance comment je procède :

  1. Sur mon PC, lancement de la synchro avec un docker-compose qui déclare un volume docker nommé (et non un montage de répertoire local) pour /var/lib/duniter)
  2. Arrêt du service à la fin de la synchro
  3. Montage du volume dans une instance jetable (docker run --rm ...) afin de générer une tarball (archive tar.gz) du répertoire /var/lib/duniter/duniter_default/data.
  4. Transfert de cette archive sur mon serveur
  5. Arrêt du noeud sur le serveur (s’il est lancé)
  6. Sur le serveur, montage du volume dans une instance jetable pour remplacer le contenu du répertoire data par celui de l’archive
  7. Démarrage du service sur le serveur.

J’ai automatisé toutes ces opérations dans un petit script qui me permet de tout lancer en une seule
commande.

2 « J'aime »

Bon, ok, merci. Cela me semble compliqué pour moi… :slight_smile:

Bonjour Poka merci pour ce petti tuto voici le resutlat ( sur linux mint 21.1 X86_64) :

Cela fait depuis mi novembre 2022 que je me bats pour voir le noeud miroir et la enfin je l’ai.

j’ai pu avoir le résultat car j’ai installé nginx et j’ai ouvert mes ports sur mon parefeu.( pour toi et les développeur cela vous paraît normal et futile dans parler mais pour une personne qui s’y connait pas de trop en informatique s’est quand même essentiel pour le bon fonctionnement pour la suite pour installer le noeud.)

Pour un bon tuto je pense qui faut prendre une situation où un personne aurait un pc à disposition avec linux installer fraichement dessus.
Pour commencer lister la mise en place les paquets qu’il faut avant d’arriver sur docker.
La configuration de la box avec l’ouverture des ports, la mise en place du nom de domaine à inscrire dans la box .
la configuration des ports pour le par-feu de linux.

Puis arrive la ton tuto pour mettre docker. et là je pense qu’il y aurait beaucoup plus de noeuds par la suite.

à très bienôt car j’aurais d’autre questions

2 « J'aime »

Bonjour à tous,
Merci @poka pour le partage.
J’ai un souci avec le paramétrage de nginx.
J’ai donc installer docker, duniter à partir de ton fichier yml (sauf qu’au lieu d’utiliser g.duniter.org pour la synchro, j’ai utilisé un autre noeud 1.9 qui a réglé notre pb que @fdrubigny à poser).
Grâce à @1000i100 , en ajoutant du paramétrage dans le fichier de configuration du nginx, cela a résolu plusieurs soucis dont la possibilité du ssl et la protection de l’interface d’admin.

Par contre, j’ai une erreur pour afficher la page d’admin qui est du à ce type d’erreur dans les logs du nginx :
[error] 47621#47621: *261 connect() failed (111: Connection refused) while connecting to upstream, client: xxx.xxx.xxx.xxx, server: [nom de domaine], request: « GET [paths]/templates.js HTTP/2.0 », upstream: « http://[::1]:9220/templates.js », host: « [nom de domaine] », referrer: « https://[nom de domaine][path]/ »

Est-ce que quelqu’un saurait m’aider ?

1 « J'aime »

s’il est possible de builder une version arm, je peux remplacer mon noeud v1 avec la version docker.
@pini la commande du build est similaire a celle executée pour la v2, n’est ce pas ?

J’ai justement buildé hier duniter v1 dev en multiarch. Les images amd64 et arm64 sont dispo à ce tag : pinidh/duniter:dev.

bonne nouvelle, merci beaucoup. L’image est utilisable pour la prod ? Ou faut-il la cantonner à g1-test et g1-dev ?