Dockerisation duniter 1.9

Salut @aya

Où en es-tu de la dockerisation de Duniter 1.9-GVA ? Besoin d’aide ?

yop,

j’ai regardé vite fait j’ai tout ce qu’il faut pour sortir une release.
j’ai retrouvé les dockers y’a déjà un gros boulot qui a été fait je vais l’intégrer.
je debug un pb de routage (email vers url) et j’attaque duniter pour notre prochaine release :slight_smile:

1 Like

Il se trouve que mes noeuds g1 mirroir et g1-test tournent depuis plusieurs mois avec duniter 1.9-dev dockerisé. @poka on avait fait quelques itérations sur le sujet à l’époque. Que te manque-t-il ?

Juste de pouvoir faire docker-compose up -d et d’avoir un noeud Ğ1 Duniter 1.9-GVA mirroir qui tourne :slight_smile:

Ben c’est exactement ce que je fais avec la branche dev actuelle.

Je génère l’image avec cette commande :

$ docker build -t duniter/duniter:dev -f release/docker/Dockerfile .

Et voici mon docker-compose.yml avec exclusions de quelques éléments spécifiques à mon serveur.

version: '2.4'

services:
  duniter:
    image: duniter/duniter:dev
    restart: unless-stopped
    environment:
      DUNITER_AUTO_SYNC: 'true'
      #DUNITER_SYNC_HOST: "g1-test.duniter.org:443"
      DUNITER_SYNC_HOST: "g1-test.cgeek.fr:443"
      DUNITER_BMA_ENABLED: 'true'
      DUNITER_BMA_IP4: "0.0.0.0"
      DUNITER_BMA_REMOTE_PORT: "443"
      DUNITER_BMA_REMOTE_HOST: "g1-test-dev.pini.fr"
      DUNITER_GVA_REMOTE_PORT: "443"
      DUNITER_GVA_ENABLED: 'true'
      DUNITER_GVA_REMOTE_HOST: "g1-test-dev.pini.fr"
      DUNITER_GVA_SUBSCRIPTIONS_PATH: "gva-sub"
      DUNITER_WS2P_HOST: "0.0.0.0"
      #DUNITER_WS2P_PORT: '20901'
      DUNITER_WS2P_PUBLIC: 'true'
      DUNITER_WS2P_REMOTE_HOST: "g1-test-dev.pini.fr"
      DUNITER_WS2P_REMOTE_PORT: "443"
      DUNITER_WS2P_REMOTE_PATH: "ws2p"
      #
      DUNITER_POW_CPU: "0.8"
      DUNITER_POW_NBCORES: "1"
      #
    volumes:
    - data:/var/lib/duniter
    - etc:/etc/duniter
    mem_limit: 2g
    logging:
      options:
        max-size: "10m"
        max-file: "3"

volumes:
  data:
  etc:

Note : je force la version 2.4 pour docker-compose afin de pouvoir utiliser la directive mem_limit.

EDIT : il ne peut pas y avoir un seul template docker-compose.yml qui réponde aux besoins de tous. Il faut que chacun fasse les adaptations nécessaires à son infra.

2 Likes

Génial !

@Blacksmith est-ce que certains parmis vous pourrais passer leurs noeuds mirroirs en version 1.9 de Duniter via ce docker-compose que @Pini nous fournit ?

Il suffit de changer:

  • DUNITER_SYNC_HOST: 'https://duniter-g1.p2p.legal' (ou n’importe quel noeud duniter Ğ1 à jour)
  • DUNITER_BMA_REMOTE_HOST, DUNITER_GVA_REMOTE_HOST et DUNITER_WS2P_REMOTE_HOST par votre nom de domaine pour ce noeud
  • mem_limit: ?g par la taille de RAM maximal alloué à ce noeud en GO ?

Une fois cette édition terminé, vous pouvez faire:

docker compose up -d

Et votre noeud Ğ1 mirroir tourne avec GVA d’accessible.

@Pini peux-tu nous partager ton vhost nginx ici stp ?

[edit] Voici ma config nginx pour un de mes anciens noeuds GVA:

server {
   server_name    duniter-g1.p2p.legal;
   listen 443 ssl;

  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://192.168.9.8:10010;
    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://192.168.9.8: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://192.168.9.8: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://192.168.9.8: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";
   }


    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


    ssl_certificate /etc/letsencrypt/live/duniter-g1.p2p.legal/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/duniter-g1.p2p.legal/privkey.pem; # managed by Certbot
}
server {
    if ($host = duniter-g1.p2p.legal) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

  listen 80;
  server_name duniter-g1.p2p.legal;
    return 404; # managed by Certbot
}

Mais pour les derniuères version de Duniter 1.9, il va jsute manquer le location /gva/playground ici

Merci de nous partager l’adresse de votre noeud ici lorsque c’est fait :slight_smile:

1 Like

Pas si simple car j’utilise un fork perso de nginx-proxy + acme-companion (j’héberge une dizaine de services dockerisés sur le même serveur), et mon vhost est généré automatiquement par ces outils. Le partager ici ne servira pas à grand chose.

Mais pas de souci pour filer un coup de main s’il faut aider à dépanner un service en rade.

EDIT : Voici la portion de mon vhost que je définis manuellement :

ssl_client_certificate /etc/nginx/auth_certs/pini_ca.crt;
ssl_verify_client optional;

location /ws2p {
  proxy_http_version 1.1;
  proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header   Host            $host;
  proxy_set_header   X-Real-IP       $remote_addr;
  proxy_set_header   Upgrade         $http_upgrade;
  proxy_set_header   Connection      "upgrade";

  proxy_pass http://g1-test-dev-ws2p.pini.fr_20901;
}

location /gva {
  proxy_pass http://g1-test-dev-gva.pini.fr_30901;
}

location /gva-sub {
  proxy_http_version 1.1;
  proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header   Host            $host;
  proxy_set_header   X-Real-IP       $remote_addr;
  proxy_set_header   Upgrade         $http_upgrade;
  proxy_set_header   Connection      "upgrade";

  proxy_pass http://g1-test-dev-gva.pini.fr_30901;
}

location ~ ^/(admin|fonts?|images|webmin)/ {
  if ($ssl_client_verify != SUCCESS) {
    return 403;
  }
  rewrite ^/admin/(.*)$ /$1 break;
  proxy_pass http://g1-test-dev-admin.pini.fr_9220;
}

Je n’ai pas de location gva/playground. Faudra m’expliquer comment c’est censé fonctionner pour que je l’ajoute.

1 Like

(de mémoire)

  • Il faut que tu remplaces ça par /gva/playground
  • Et que tu rajoutes ça:
  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://192.168.9.8: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://192.168.9.8: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;
  }

Et aussi passer ton noeud sur la Ğ1, là tu semble sync à la GTest.

1 Like

Hello,

Pour le moment je n’aurai pas le temps de l’installer, mais voici quelques suggestions de fonctionnalités pour ce composant, si elles n’existent pas déjà :

  • La possibilité de démarrer le noeud en activant l’interface web (clé de conf Environment=“DUNITER_WEB=web” dans le bloc [Service] de systemd, ou option webstart du binaire)
  • La possibilité de redémarrer automatiquement le noeud en cas de plantage (important car duniter plante régulièrement): clés systemd suivantes :
    Restart=on-failure
    RestartSec=10s
  • La possibilité de stocker les transactions sur le noeud (option --store-txs)
1 Like

@aya quand tu aura le temps, ce serait génial si tu fait un peu synthèse de tous ça à ta sauce :slight_smile:

Bonsoir, pas un pro, loin s’en faut mais si je peux aider. Je tourne 2 noeuds duniter V1.8.5 108 mais pas de noeud miroir à ma connaissance.
Si je peux être d’une quelconque aide, n’hésitez pas.
Bon courage à vous,
Damery

J’ai mis à jour la conf sur mon noeud mirroir ǧ1 duniter.pini.fr.

Tu me diras si ça répond comme il faut.

1 Like

Merci @Pini !

Je viens de changer le noeud de g1-stats de g1.librelois.fr vers duniter.pini.fr: change for pini GVA endpoint · ff3e9486a8 - g1-stats - P2Git

edit:

et non ta un pbm: GraphQL Playground

{
  balance(script: "Do99s6wQR2JLfhirPdpAERSjNbmjjECzGxHNJMiNKT3P") {
    amount
  }
}
{
  "data": {
    "balance": null
  }
}

Ton noeud est peut être mal synchronisé sur la Ğ1, ou bien un pbm avec la db GVA ?

D’après Kazou mon noeud est correctement synchronisé.

Comment diagnostiquer un problème avec la base de données GVA ?

EDIT : en fait sur ce noeud je n’ai activé GVA qu’à postériori, et pas pendant la synchro initiale. Est-ce que ça pourrait expliquer le pb ?

1 Like

Systemd n’est pas utile pour gérer les containers duniter, car docker est un serveur, et si installé correctement, il est géré par systemd, et c’est docker qui gère la relance des containers.

Mon nœud est installé via docker-compose et se relance automatiquement en cas de plantage. La politique de relance se gère avec un paramètre du genre restart_policy dans le docker-compose.

Par contre si tu lance un container manuellement avec docker run, alors il ne sera pas relancé au reboot, et si rien n’est précisé en option de la commande, il s’arrête en cas de panne.

1 Like

Oui probablemenr, je crois qu’il te faut compiler Dex et utiliser la commande dex migrate de mémoire lol

edit: oui tout est là: Prototype de GVA - #14 by elois

1 Like

Bon, je ne comprends pas trop. J’ai voulu resynchroniser avec --gva mais duniter a refusé cette option. J’ai donc fait une synchro standard puis j’ai passé un coup de dex migrate.

Après cette opération le noeud redémarre bien, a l’air syncrhonisé, mais l’URL gva/playground retourne une erreur 503. Je n’ai rien vu de bizarre dans les logs. qui annoncent un démarrage correct du service GVA :

2022-12-04T14:41:12+00:00 - info: generated self endpoints: ["GVA S duniter.pini.fr 443 gva"]                                                                                                                      
2022-12-04T14:41:12+00:00 - info: GvaServer::start: conf=GvaConf { enabled: true, ip4: 0.0.0.0, ip6: None, path: "gva", playground: true, port: 30901, remote_host: Some("duniter.pini.fr"), remote_port: Some(443), remote_path: None, remote_tls: None, whitelist: [127.0.0.1, ::1] }
2022-12-04T14:41:12+00:00 - info: GVA server listen on http://0.0.0.0:30901/gva
2022-12-04T14:41:12+00:00 - info: Server::run; addr=0.0.0.0:30901
2022-12-04T14:41:12+00:00 - info: listening on http://0.0.0.0:30901

Comment diagnostiquer ça ?

EDIT : non c’est bon. C’était un souci de conf de mon reverse proxy. C’est bien reparti, mais je n’obtiens pas mieux sur le test gva/playground :

{
  "data": {
    "balance": null
  }
}

Ola !

Je vous ai préparé une petite branche pour tester la version docker : Files · release/1.9 · Yann Autissier / duniter · GitLab

@pini je viens d’intégrer un docker nginx pour exposer les routes gva avec des headers acces-control-allow personnalisés je suis parti sur nginxproxy/nginx-proxy c’est bien celui la que tu utilises ? Tu saurais m’expliquer comment tu fais le routage multi path/ports avec ?

Il restera ensuite à prévoir un script de migration docker pour l’upgrade et on peut sortir une release 1.9 :slight_smile:

2 Likes

C’est un fork perso de nginxproxy/nginx-proxy que j’utilise, justement pour permettre le multi-ports. Le nom de l’image docker est pinidh/nginx-proxy. Et j’y ajoute pinidh/acme-companion (fork de nginxproxy/acme-companion) pour la gestion automatique des certificats.

1 Like

Je viens de regarder tes commits, bravo !!

Merci infinement pour ça, dit nous quand tout est carré, je dois pouvoir faire docker-compose up -d et j’ai duniter 1.9 qui tourne en mirroir avec GVA accessible et fonctionnel :slight_smile:

1 Like