Coturn : installation avec docker et Let’s Encrypt

Installation et paramétrage de Coturn avec docker, docker compose et let’s encrypt

Introduction

Un serveur STUN est utile dans le processus de découverte de l’adresse IP publique à la fois pour les terminaux SIP mais surtout les applications WebRTC.

Le WebRTC nécessite une connexion directe entre les pairs, mais souvent une connexion directe ne peut pas être établie notamment à cause du NAT et un serveur TURN est donc nécessaire.

Dans cet article, nous allons expliquer comment vous pouvez exécuter votre propre serveur STUN/TURN en utilisant l’implémentation du serveur STUN/TURN open source, c’est-à-dire Coturn.

Qu’est-ce que Coturn ?

COTURN est une implémentation libre et gratuite d’un serveur STUN et TURN. Coturn peut être facilement téléchargé à partir de son site web : https://github.com/coturn/coturn

Coturn peut-être installé via les packages de votre distribution, mais nous allons l’exécuter en tant que conteneur docker. Les avantages sont noubreux : le process d’installation est le même quelque soit les distributions, le déploiement peut se faire aisément quelque soit l’infrastructure sous-jacente et la mise à jour est simplifiée tout en étant rapide.

Quels sont les Pré-requis pour Coturn ?

  • Un serveur linux avec une adresse IP publique (il peut-être natté) avec à minima 2 vcpu, 2 Go de RAM et 20 Go de stockage (essentiellement pour l’OS et les logs)
  • Un nom de domaine personnalisé (optionnel, mais nécessaire pour utiliser le certificat et les connexions sécurisées)
  • Installation de Docker et docker compose

Comment installer COTURN avec Docker ?

Nous allons exécuter Coturn dans Docker au lieu de l’exécuter directement sur le serveur en utilisant docker compose.

Je pars du principe que docker est correctement installé en respectant les consignes du site officiel : https://docs.docker.com/engine/install/debian/

Je fais le choix de positionner toutes mes données et configurations de mes conteneurs dans /srv , mais libre à vous de changer le dossier en adaptant les commandes suivantes.

Tout d’abord, il faut créer le dossier mkdir /srv/coturn.

Puis créer un fichier docker-compose.yml en copiant le contenu ci-dessous et en adaptant la version de Coturn selon vos souhaits (je mets jamais latest pour maîtriser mes déploiements) :

version: '3'
services:
  coturn_server:
    image: coturn/coturn:4.6
    restart: always
    network_mode: "host"
    expose:
      - '3478'
      - '5349'
    logging:
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"
    volumes:
      - /srv/coturn/turnserver.conf:/etc/coturn/turnserver.conf:ro
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /srv/coturn/cert.pem:/etc/turnserver/cert.pem:ro
      - /srv/coturn/privkey.pem:/etc/turnserver/privkey.pem:ro

Comment créer un certificat SSL pour Coturn ?

Let’s Encrypts certbot peut être utilisé pour générer rapidement des certificats SSL gratuits qui se renouvellent automatiquement avant l’expiration. D’autres sytèmes peuvent-être utilisés !

Certbot doit être installé à l’aide snap. Voici les commandes suivantes :

apt update
apt install snapd
snap install core
snap refresh core
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot

Après avoir installé certbot avec succès, vous pouvez générer un certificat à l’aide de la commande suivante (en remplaçant <DOMAIN> par votre nom de domaine) :

certbot certonly --standalone --preferred-challenges http -d <DOMAIN>

Nous demandons ici un certificat autonome.

Notez que les ports TCP 80 et 443 doivent-être ouvert et redirrigés vers la VM pour que la création et le renouvellement du certificat fonctionnent.

Actuellement, le certbot se renouvelle automatiquement par défaut

Pour s’assurer que les certificats soient lisibles par Coturn, nous allons ajouter un hook de renouvellement à la configuration de let’s encrypt.

Pour cela, nous allons créer un dossier $ mkdir -p /etc/letsencrypt/renewal-hooks/deploy puis un fichier coturn.
Puis, copier le contenu ci-dessous dans le fichier en remplaçant <DOMAIN> par votre domaine :

#!/bin/bash -e
for certfile in cert.pem privkey.pem ; do
    cp -L /etc/letsencrypt/live/<DOMAIN>/"${certfile}" /srv/coturn/"${certfile}".new
    chown turnserver:turnserver /srv/coturn/"${certfile}".new
    chmod 644 /srv/coturn/"${certfile}".new
    mv /srv/coturn/"${certfile}".new /srv/coturn/"${certfile}"
done
docker compose -f /srv/coturn/docker-compose.yml restart > /dev/null

Puis rendre ce fichier exécutable chmod 0755 /etc/letsencrypt/renewal-hooks/deploy/coturn

Puis on force la génération du certicat certbot renew --force-renewal

Créer l’utilisateur turnserver et l’affecter au groupe turnserver :

useradd turnserver
usermod - a -G turnserver turnserver

Nous indiquons à certbot qu’il doit redémarrer automatiquement le conteneur Coturn à chaque renouvellement du certificat. Cela permet de s’assurer que le certificat du serveur TURN est toujours à jour, mais présente l’inconvénient d’interrompre toutes les connexions TURN en cours.

Comment paramétrer COTURN ?

La configuration de Coturn se fait dans un fichier créé dans le dossier /srv/coturn.

Vous allez donc créer un fichier turnserver.com dans ce dossier et coller le contenu ci-dessous en adaptant votre domaine, vos adresses IP (si la VM porte directement une adresse IP publique, vous supprimez le / après cette adresse !) et le user/mdp de connexion.

# TURN server name and realm
realm=<DOMAIN>
server-name=<DOMAIN>

# Use fingerprint in TURN message
fingerprint

# IPs the TURN server listens to
listening-ip=0.0.0.0

# External IP-Address of the TURN server
external-ip=IP_ADDRESS_PUBLIC/IP_PRIVEE

# Main listening port
listening-port=3478

# Further ports that are open for communication
min-port=49152
max-port=65535

# Enable verbose logging
#verbose

# Specify the user for the TURN authentification
user=test:test123

# Enable long-term credential mechanism
lt-cred-mech

# SSL certificates
# From https://ssl-config.mozilla.org/ Intermediate, openssl 1.1.0g, 2020-01
cipher-list="ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
cert=/etc/turnserver/cert.pem
pkey=/etc/turnserver/privkey.pem

# Do not allow an TLS/DTLS version of protocol
no-tlsv1
no-tlsv1_1
#no-tlsv1_2

# Block connections to IP ranges which shouldn't be reachable
no-multicast-peers

# SSL
tls-listening-port=5349

# Misc
no-cli

# Uncomment to disable TCP listener
#no-tcp

# Uncomment and adjust value for quota use
#user-quota=0
#total-quota=100

# Uncomment and adjust value for setting a maximum server capacity
#bps-capacity=0

Il est possible de sécuriser plus fortement la connexion au serveur Coturn et utilisant une base de données pour gérer les mots de passe des utilisateurs.

Ceci étant assez simple, je vous laisse ceci en exercice sachant que vous trouverez les infos nécessaires sur le github du projet : https://github.com/coturn/coturn/tree/master/docker

Comment lancer COTURN ?

Pour démarrer le conteneur Coturn, saisissez la commande docker compose -f /srv/coturn/docker-compose.yml up -d

Pour redémarrer Coturn, la commande est docker compose -f /srv/coturn/docker-compose.yml restart

Comment voir les logs ?

Pour voir les logs, la commande est docker compose -f /srv/coturn/docker-compose.yml logs -f

Comment envoyer des SMS à partir d’un Raspberry ?

Une carte Raspberry peut-être utilisée pour de nombreux cas d’usage et nous allons l’utiliser pour envoyer des SMS.

Philippe vous a préparé un article détaillé expliquant la mise en oeuvre avec une carte GSM Nadhat et une Rapsberry 3B+ sous Debian : Raspberry et SMS

Et un autre article sur ce même sujet mettant en jeu Node-RED pour ajouter un peu de programmabilité : Envoyer un SMS sur changement d’état d’une GPIO

Bonne lecture et bon développement

freeswicth ansible role 2.0 just released

Je viens de publier la nouvelle version du role ansible permettant une installation / mise à jour automatisée de FreeSwitch avec plusieurs bonus optionnels comme fail2ban, sngrep … Le role est fait pour fonctionner exclusivement avec Debian Jessie. J’intégrerai Stretch le moment venu.

Contrairement à la version précédente, l’installation se fait à partir des paquets fournis par la team FreeSwitch (je suis leurs recommandations).

L’utilisation est présentée dans le README.

Vous le trouverez dans la galaxy ansible : https://galaxy.ansible.com/mwolff44/freeswitch-mw/

N’hésitez pas à me faire des retours.

Note : le repo officiel est hébergé par framagit : https://framagit.org/mwolff44/freeswitch-mw/ même si une copie existe sur github pour ansible-galaxy.

 

Modifications :

  • 12/04/2017 : v2.1 : mise à jour du kernel via les backports (performance) / installation de locales spécifiques / installation de paquets complémentaires – Ces 3 fonctions sont désactivées par défaut.

Installer FreeSwitch sur Ubuntu à partir des paquets

L’équipe de FreeSwitch vient de publier les paquets pour Ubuntu 14.04 LTS et 16.04 LTS. Une excellente nouvelle pour les utilisateurs d’Ubuntu. L’installation est maintenant simplifiée.

Pour Ubuntu 16.04 LTS, voici les commandes à taper pour installer la dernière version stable de FreeSwitch :

wget -O - https://files.freeswitch.org/repo/ubuntu-1604/freeswitch-unstable/freeswitch_archive_g0.pub | apt-key add -
 
echo "deb http://files.freeswitch.org/repo/ubuntu-1604/freeswitch-unstable/ xenial main" > /etc/apt/sources.list.d/freeswitch.list
 
# you may want to populate /etc/freeswitch at this point.
# if /etc/freeswitch does not exist, the standard vanilla configuration is deployed
apt-get update && apt-get install -y freeswitch-all

Pour Ubuntu 14.04 LTS :

wget -O - https://files.freeswitch.org/repo/ubuntu/freeswitch-unstable/freeswitch_archive_g0.pub | apt-key add -
 
echo "deb http://files.freeswitch.org/repo/ubuntu/freeswitch-unstable/ trusty main" > /etc/apt/sources.list.d/freeswitch.list
 
# you may want to populate /etc/freeswitch at this point.
# if /etc/freeswitch does not exist, the standard vanilla configuration is deployed
apt-get update && apt-get install -y freeswitch-all

Attention : les paquets permettant de gérer les flux vidéos ne sont pas installés. Des étapes complémentaires sont à prévoir.

Toutefois, l’équipe de FreeSwitch ne recommande d’utiliser cette méthode pour un usage en production pour le moment. Sur Ubuntu, seule la méthode en téléchargeant et compilant les sources est recommandée.

La documentation de la team FreeSwitch pour installer FreeSwitch sur Ubuntu.

Règles iptables afin de bloquer les scanners SIP

Les serveurs SIP (Asterisk, FreeSwitch … mais aussi les serveurs propriétaires) sont constamment scannés par des automates ou des humains avec pour seule idée, découvrir une faille à exploiter. En effet, les enjeux financiers sont importants.
Je partage avec vous ce jour, un script iptables pour bloquer les scanners SIP (à adapter notamment les ports si vous utilisez des différents de 5060).

iptables -N SIPDOS

iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “sundayddr” –algo bm –to 65535 -m comment –comment “deny sundayddr” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “sipsak” –algo bm –to 65535 -m comment –comment “deny sipsak” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “sipvicious” –algo bm –to 65535 -m comment –comment “deny sipvicious” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “friendly-scanner” –algo bm –to 65535 -m comment –comment “deny friendly-scanner” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “iWar” –algo bm –to 65535 -m comment –comment “deny iWar” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “sip-scan” –algo bm –to 65535 -m comment –comment “deny sip-scan” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “User-Agent: sipcli” –algo bm –to 65535 -m comment –comment “deny sipcli” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “User-Agent: Nmap NSE” –algo bm –to 65535 -m comment –comment “deny Nmap NSE” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “User-Agent: VaxSIPUserAgent” –algo bm –to 65535 -m comment –comment “deny VaxSIPUserAgent” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “From: sipp <sip:” –algo bm –to 65535 -m comment –comment “deny sipp” -j SIPDOS

iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “sundayddr” –algo bm –to 65535 -m comment –comment “deny sundayddr” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “sipsak” –algo bm –to 65535 -m comment –comment “deny sipsak” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “sipvicious” –algo bm –to 65535 -m comment –comment “deny sipvicious” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “friendly-scanner” –algo bm –to 65535 -m comment –comment “deny friendly-scanner” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “iWar” –algo bm –to 65535 -m comment –comment “deny iWar” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “sip-scan” –algo bm –to 65535 -m comment –comment “deny sip-scan” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “User-Agent: sipcli” –algo bm –to 65535 -m comment –comment “deny sipcli” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “User-Agent: Nmap NSE” –algo bm –to 65535 -m comment –comment “deny Nmap NSE” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “User-Agent: VaxSIPUserAgent” –algo bm –to 65535 -m comment –comment “deny VaxSIPUserAgent” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “From: sipp <sip:” –algo bm –to 65535 -m comment –comment “deny sipp” -j SIPDOS

iptables -A SIPDOS -j LOG –log-prefix “firewall-sipdos: ” –log-level 6
iptables -A SIPDOS -j DROP

Si vous avez des idées pour l’améliorer, toutes les suggestions sont les bienvenues, l’idée étant de faciliter la sécurisation des serveurs SIP au plus grand nombre.

Mises à jour :

  • 4 août 2016 : ajoût de règles + correction typo suite au commentaire de Ztur

Comparatif des versions des paquets dans ubuntu 14.04 et 16.04 et debian 8 et 9 que j’utilise le plus

Dans le cadre de mes différents projets, je suis amené à utiliser différents systèmes d’exploitation et différentes générations. Pour effectuer le bon choix, il est parfois utile de pouvoir comparer les versions des paquets disponibles dans les distributions (même si j’aime bien compiler certains paquets pour mieux coller à mes attentes, parfois il est nécessaire d’utiliser les paquets – pré-requis client par ex-).

J’ai choisi arbitrairement Ubuntu 14.04 LTS et la future 16.04 LTS ainsi que Debian stable (8) et testing. Il est bien sûr possible d’utiliser des ppa afin de disposer de versions plus à jour, mais cela est hors scope (et impose au passage une nécessaire confiance dans le contributeur et ajoûte une complexité de migration).
Pour préciser, ce comparatif a été réalisé dans l’objectif exclusif d’un usage en serveur et sans interface graphique !

Voici le tableau au 11/04/2016

Version des paquets selon la distribution Ubuntu / debian
PaquetsUbuntu 14.04 LTSUbuntu 16.04 LTSDebian 8Debian Testing
mariadb-server5.5.4710.0.23-210.0.2310.0.24
mysql-server5.5.475.7.115.5.475.6.28
postgresql9.3+1549.5+1739.4+1659.5+173
odbc-postgresql1:09.02.01001:09.03.03001:09.03.03001:09.03.0300
redis-server2:2.8.42:3.0.62:2.8.172:3.0.6
unixodbc2.2.142.3.12.3.12.3.1
apache22.4.72.4.182.4.102.4.18
nginx1.4.61.9.141.6.21.9.10
gunicorn17.519.4.519.019.4.5
ssh1:6.61:7.21:6.71:7.2
fail2ban0.8.110.9.30.8.130.9.3
iptables1.4.211.6.01.4.211.6.0
munin2.0.192.0.252.0.252.0.25
rsyslog7.4.48.16.08.4.28.16.0
freeswitchnananana
asterisk1:11.7.01:13.1.01:11.13.11:13.7.2
kamailio4.0.44.3.44.2.04.4.0
freeradius2.1.122.2.82.2.52.2.8
ansible1.5.42.0.0.21.7.22.0.1.0

Ma première conclusion de cette revue, est de ne plus lancer de nouveaux projets avec Ubuntu 14.04 LTS !

Je mettrais à jour de temps en temps cette liste (n’hésitez pas à proposer quelques paquets indispensables pour les projets télécoms)

 

Hellotux : supporter linux avec de beaux t-shirts

La majorité des projets du monde du logiciel libre fonctionnent grâce aux dons des utilisateurs. Un moyen sympa d’aider ces projets et d’acheter des goodies, mais quoi de mieux qu’un t-shirt, polo ou sweat. Vous donnez ainsi un peu d’argent au projet et vous mettez en avant le projet.
Aujourd’hui, j’ai décidé d’aider Linux Mint, le célèbre système d’exploitation de bureau beau et efficace !

Linux Mint Cinnamon

J’ai donc acheter un beau polo pour 25 € port compris mais aussi fait un don pour supporter l’équipe de Linux Mint qui fait un super boulot. Sur cette même boutique, Hellotu – linux t-shirtx, vous pouvez aussi acheter pour les projets Linux, Debian, Ubuntu, openSUSE, LXLE et KDE.

Hiawatha : le serveur web léger et sécurisé à découvrir

Présentation de Hiawatha, un serveur web léger, performant et sécurisé et de plus simple à configurer.

Table des matières

Introduction

J’étais à la recherche d’un serveur web léger et sécurisé afin de succéder à Cherokee. En effet, ce dernier ne semble plus maintenu. Après de nombreux tests, j’ai retenu Hiawatha.

Description de Hiawatha

Le serveur web Hiawatha a été créé en 2002 par un étudiant Hollandais du nom de Leisink. L’objectif était de pouvoir réutiliser de vieux serveurs comme serveurs web sans négliger la sécurité. Ainsi, est né ce serveur web qui est reconnu pour sa légèreté, sa performance et sa sécurité. Autre point important, le projet a remplace OpenSSL qui se débat au milieu de nombreux problèmes de sécurité par PolarSSL dès janvier 2012.

Hiawatha web server integre nativement de nombreuses fonctionnalités qui ne sont disponibles qu’au sein de modules dans d’autres serveurs (Apache par exemple). Cette intégration permet de gagner en efficacité et en sécurité.

Un autre point important concerne la simplicité de configuration. L’ensemble de la configuration est claire et se fait au sein d’un unique fichier de configuration.

Fonctionnalités

Installation de Hiawatha

L’installation de Hiawatha sur un serveur Debian/Ubuntu est simplifiée par la mise à disposition de paquets Debian Hiawatha par Chris WADGE.

Vous trouverez sur le site la liste des paquets non officiels pour votre distribution préférée.

Mais, il existe aussi un script shell très bien fait permettant une installation simplifiée d’un serveur complet intégrant Hiawatha, MariaDB, php-fpm et même wordpress ! Il suffit de changer la version du paquet Debian selon les releases (lignes 34 et 37) et d’exécuter le script.

Hiawatha script installation serveur web mariadb php-fpm

Présentation de Hiawatha

Je vous laisse découvrir cette présentation faite par le créateur de ce superbe serveur web.

Conclusion

J’ai été séduit par la qualité de ce serveur web. Je suis en train de tester l’integration avec Django et très prochainement, mes serveurs WordPress vont tourner sous Hiawatha (J’écrirais un tuto si vous êtes intéressez).

Par ailleurs, j’ai évité de publier des benchmarks, il y en a un plusieurs disponibles sur le net. Je pense que le mieux est de réaliser des tests avec son application et ainsi obtenir des résultats proches de ses propres besoins.

Enfin, je vous invite à découvrir le script de configuration de iptables, Firetable, développé par le même créateur.

Test OpenSuse 13.2

Table des matières

Introduction

J’apprécie la qualité des distributions OpenSuse même si je travaille au quotidien sur des distributions basées sur Debian. La sortie de la version 13.2 m’a donné envie de voir les évolutions que les développeurs ont apporté au système.

Nouveautés

Les nouveautés sont nombreuses. Je ne vais pas lister les versions logicielles mises à jour, vous trouverez ces infos sur le site d’OpenSuse. Je ne vais aborder que les points les plus importants. Un travail important a été fait afin d’apporter stabilité, vitesse et sécurité au système. La première nouveauté importante est l’adoption du système de fichier Btrfs comme système de fichiers par défaut.

Installation

Chez Suse, le système d’installation est un modèle du genre : clair, lisible, efficace et beau ce qui n’enlève rien à la qualité ! La reconnaissance du matériel, la gestion de la langue française et les différents paramétrages se font très simplement.

Capture d'écran : installation opensuse 13.2

A noter, un partitionnement particulièrement travaillé (il est bien sûr modifiable).

L’installation est très rapide sur un SSD.

Nous pouvons utiliser plusieurs bureaux avec OpenSuse, notamment le dernier Gnome. J’ai pris le choix de rester sur KDE, bureau le plus utilisé par OpenSuse.

Après l’installation, le système vous invite via le panneau de notification a effectuer la mise à jour. J’avais 577 paquets à mettre à jour !

 

Utilisation

L’ utilisation du système est très agréable. Le démarrage est rapide. Le menu KDE / OpenSuse est toujours aussi agréable à l’utilisation (j’ai toujours trouvé les bureaux KDE plus jolis que les bureaux Gnome, mais c’est une affaire de goût !). Il est facile et rapide de trouver l’application souhaitée. Un champ recherche est disponible et particulièrement efficace.

Le panneau de configuration s’inspire de MacOSX. Les différents éléments sont compréhensibles et facilement personnalisables.

800px-Opensuse13.2-02L’ ensemble des logiciels de bureautique sont présents : LibreOffice, Firefox, la suite Kmail (que je vous invite à découvrir si vous ne connaissez pas). Vous pouvez installer de nouvelles applications grâce à YaST, l’installateur maison. Là encore, c’est simple et efficace. Par ce même outil, vous pouvez paramétrer votre poste de travail.

Après quelques heures d’utilisation pour le surf et la bureautique (on verra un peu plus tard pour le dev), OpenSuse 13.2 semble bien née et agréable.

Conclusion

Une très bonne de distribution de bureau, sure et efficace. Le nombre d’applications disponibles est important permettant une utilisation quotidienne facile. La rapidité semble au rendez-vous. Qu’en pensez-vous en comparaisons avec Linux Mint, Ubuntu ou Fedora ?

GIT : mindmap des principales commandes

Une mindmap résumant les commandes git sous licence CC BY-SA