On peut héberger un site sur un serveur, mais pas 15 !

On peut héberger un site sur deux serveurs, mais pas 15 !

On peut héberger un site sur trois serveurs, mais pas 15 !

Ah bah si, on peut héberger un site sur 15 serveurs.

 

Intro

Présenté en 2015 par Juan Benet (et non par Jeff Tûche), IPFS (Interplanetary File System) définit un système de stockage de fichiers décentralisé, à l’échelle mondiale.

IPFS est un protocole réseau P2P de partage de fichiers. Son objectif est de rendre des documents accessibles partout, sans interruption.

IPFS a été créé en réaction à la direction prise par Internet d’être de plus en plus centralisé. Où la notion de client et de serveur évoque un écosystème où des ressources sont centralisées sur des serveurs, auxquels se connectent des clients, créant ainsi des relations unidirectionnelles et des rôles inégaux.

Cet état de fait est d’autant plus marqué que certaines entreprises ont réussi à se positionner en réels points incontournables du réseau. Ce sont par exemple les GAFAM, pour les services commerciaux. Mais aussi des organisations permettant le fonctionnement d’Internet, comme l’ICANN.

Au-delà des aspects philosophiques, la centralisation d’internet crée également de multiples SPOF (Single Point of Failure), où un service pourrait rendre des ressources inaccessibles s’il tombait en panne.

IPFS veut revenir au but initial d’internet : une vraie distribution des ressources.

Fonctionnement général

IPFS propose un système distribué où chacun participe au fonctionnement du réseau, comme consommateur et comme acteur. Chacun apporte sa pierre à l’édifice pour éviter les pannes, les monopoles et la censure.

IPFS introduit un nouveau moyen de chercher des ressources, la recherche par contenu.

Internet et la recherche par localisation

Internet nous permet de rechercher des éléments par localisation.

Par exemple, via des URL : https://example.org/directory/image.png

Nous allons indiquer quelle ressource nous voulons (image.png) et à quel endroit, sur quel serveur, la chercher (https://example.org/directory/).

L’accès est direct, mais cette solution a quelques inconvénients :

  • Le serveur peut tomber en panne ou fermer et rendre la ressource indisponible
  • Un pirate peut avoir modifié la ressource pour la rendre malveillante, à l’insu de son administrateur
  • Le propriétaire de la ressource peut l’avoir modifiée intentionnellement, dans une situation de censure ou de tromperie
  • Un seul service doit supporter toute la bande passante de diffusion vers ses multiples clients.

IPFS et la recherche par contenu

Sur IPFS, les documents sont identifiés par un hash, issu de la signature numérique de leur contenu, qui va permettre d’une part d’y accéder et d’autre par de valider leur intégrité.

On accède aux ressources de cette façon : /ipfs/QmYNQJoKGNHTpPxCVPh9KkDpbExgd2duMa3aF6ytMpHdai/directory/image.png

On retrouve la ressource demandée (image.png), éventuellement dans une arborescence (/directory/), et surtout son hash (QmYNQJoKGNHTpPxCVPh9KkDpbExgd2duMa3aF6ytMpHdai).

Nous ne précisons pas où il faut chercher cette ressource. Nous demandons simplement à accéder à telle ressource et nous interrogeons le réseau sur ce contenu, il nous renverra alors les données en les récupérant là où elles se trouvent.

Si on modifie un document, on modifie également son hash. En utilisant le hash connu pour cette ressource, on tombera bien sur la version correspondante à ce hash.

Ici, avec le hash indiqué, nous sommes certains de récupérer le fichier image.png tel que nous l’avons initialement connu, il n’aura pas été altéré.

Fonctionnement détaillé

Quand on ajoute un fichier sur IPFS, il est d’abord découpé en blocs de 256Ko. Chacun de ces blocs est haché et un arbre de Merkle est constitué à partir de tous ces hashs afin de vérifier son intégrité.

Le fichier obtient alors un CID (Content IDentifier). C’est le hash avec lequel il sera connu sur le réseau.

Tout cela se passe sur notre nœud local. Pour le moment, nous sommes le seul fournisseur de ce fichier, il est stocké uniquement sur notre ordinateur.

Puis nous communiquons le hash de notre fichier à quelqu’un, qui va venir le récupérer. Il va en télécharger une copie. Nous sommes maintenant 2 fournisseurs pour ce document. N’importe qui pourra le consulter tant qu’au moins l’un de nos deux nœuds IPFS est actif. L’objectif est ainsi de multiplier les téléchargements pour multiplier les sources de ce fichier.

Sur IPFS, de base, chaque fichier est présent de façon éphémère sur le réseau. Mais sa durée de vie est impossible à estimer. Elle variera en fonction du besoin de libération d’espace.

Il est possible d’épingler un fichier. Il sera alors conservé durablement. Au plus il y a de nœuds IPFS qui vont épingler ce fichier, au plus il sera disponible.

Tant que des nœuds du réseau hébergent et épinglent un fichier, il ne pourra jamais disparaître. Pour cette raison, attention à l’utilisation d’IPFS dans cas de données sensibles telles que des données personnelles. Nous ne pouvons plus avoir la main dessus pour les supprimer ou les modifier comme la loi nous y oblige.

En pratique

Nous allons montrer comment il est possible d’héberger sur IPFS un site web statique.

Il existe un certain nombre de passerelles, qui permettent de récupérer des documents sur IPFS via un navigateur.

Une passerelle affichera dans le navigateur le contenu du fichier s’il est affichable comme tel. Par exemple des fichiers texte, HTML, image… Sinon le fichier sera simplement téléchargé sur notre ordinateur.

Nous allons nous appuyer sur 2 éléments :

  • Notre nœud IPFS local, pour ajouter notre site sur le réseau
  • Une passerelle, pour le visualiser une fois diffusé.

Installation

Il existe une version desktop d’IPFS : https://docs.ipfs.tech/install/ipfs-desktop/

Mais nous allons plutôt utiliser ici la version CLI, en version Linux : https://docs.ipfs.tech/how-to/command-line-quick-start/

Le client IPFS “officiel” s’appelle Kubo. Il s’installe de la façon suivante :

Récupération du binaire :

wget https://dist.ipfs.io/kubo/v0.14.0/kubo_v0.14.0_linux-amd64.tar.gz

Extraction :

tar -xvzf kubo_v0.14.0_linux-amd64.tar.gz

Installation :

cd kubo
sudo bash install.sh

Nous pouvons vérifier l’installation :

ipfs --version

Il faut maintenant initialiser notre nœud IPFS :

ipfs init

Un dossier ~/.ipfs est créé avec les données de notre nœud local.

On peut maintenant lancer le démon :

ipfs dameon

Ça y est, nous sommes connectés au réseau. Nous allons pouvoir stocker et récupérer des fichiers via notre nœud local.

Si le démon est bien lancé, on peut aussi aller jeter un œil sur http://127.0.0.1:5001/webui qui fournit une interface d’administration du nœud et un gestionnaire des fichiers stockés localement.

Création d’un document

Nous allons maintenant créer notre petit site statique. Créons d’abord un répertoire, avec 2 fichiers index.html et style.css :

mkdir ipfs-site
cd ipfs-site
touch index.html
touch style.css

Initialisons nos fichiers. Nous allons faire un simple affichage dans index.html, qui intègrera style.css afin de le mettre en forme.

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>IPFS website</title>
    <link rel="stylesheet" type="text/css" href="style.css" media="screen" />
</head>
<body>
    <div>
        <h1>Mon site sur IPFS</h1>
        <p>
            Bienvenue, vous êtes décentralisés !
        </p>
    </div>
</body>
</html>

style.css

body {
    font-family: Arial, Helvetica, sans-serif;
}

h1 {
    text-align: center;
}

p {
    color: red;
}

Et voilà, un petit site hyper basique. Nous pouvons l’enrichir avec tout un tas d’autres fichiers, ou même avec des bundles obtenus depuis React ou autres frameworks frontend. Mais avec nos 2 petits fichiers, nous avons le contenu minimum pour comprendre comment tout ça va fonctionner.

Déployons-le maintenant sur IPFS.

ipfs add -r .

Avec la commande ipfs add nous spécifions d’ajouter récursivement tout ce qui est contenu dans le répertoire courant.

Nous obtenons le résultat suivant :

added QmP32QsKYgJyGf31je13V7S9cLFXP8gaBSPz42tqMAMtzX ipfs-site/index.html
added QmeAWGXKryvDVb7EwiNso6eN1VW5uFBwNqHXddHLQRKqV6 ipfs-site/style.css
added QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx ipfs-site

Nous pouvons voir les CID générés pour chaque fichier. Mais surtout celui de notre répertoire, qui sera le hash de notre site.

Nous pouvons le consulter via la passerelle ipfs.io : https://ipfs.io/ipfs/QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx/

Attention, comme nous sommes le seul fournisseur de ces documents pour l’instant, il se peut que le premier accès soit très long. La passerelle va devoir parcourir le réseau jusqu’à venir les trouver sur notre nœud. Une fois qu’elle l’aura trouvé, les accès suivants seront plus rapides.

Notre site obtient donc un URL IPFS. Attention à bien utiliser des liens relatifs lors du développement. Les liens absolus ne fonctionneront pas avec cet URL.

Si nous voulons que notre site reste disponible de façon permanente, nous allons épingler notre répertoire avec ipfs pin add <hash> :

ipfs pin add QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx

Et voilà, notre site est déployé sur IPFS et épinglé afin de le persister.

Attention, pour le moment, nous sommes le seul fournisseur de ces fichiers. Si on éteint notre nœud, le site sera inaccessible. Il faut que d’autres nœuds le récupèrent et l’épinglent à leur tour afin de le rendre de plus en plus disponible.

Il existe des services comme Pinata, auxquels nous passons le hash de notre site et qui vont faire la récupération et l’épinglage. Ils permettent de déposer notre contenu sur un nœud de réseau disponible en permanence.

IPNS

IPNS (Interplanetary Name System) va nous créer une adresse qui sera liée à notre contenu.

Elle ne changera pas, et restera unique, même si nos fichiers, et donc leur hash, change.

 ipfs name publish /ipfs/QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx

On obtient le résultat :

Published to k51qzi5uqu5di9pchi0jc7ds0ocij9lu3oxaicx3wmep48o0g71yrkqhgafz4h: /ipfs/QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx

IPNS va nous créer une clé k51... qui ne changera jamais et qui identifiera toujours notre répertoire, malgré ses changements.

Maintenant, nous pouvons accéder à notre site via sa clé : https://ipfs.io/ipns/k51qzi5uqu5di9pchi0jc7ds0ocij9lu3oxaicx3wmep48o0g71yrkqhgafz4h/

Nous pouvons faire toutes les mises à jour que nous voulons, le hash de nos fichiers changera, ce qui pourra poser des problèmes si nous accédons au site via le hash du répertoire ou de l’index.html.

Mais si nous y accédons grâce à la clé, nous verrons toujours la dernière version, sans rien changer.

Récupération

Fichiers locaux

Nous pouvons voir les fichiers locaux grâce à la commande ipfs files qui permet d’utiliser les commandes UNIX classique du système de fichiers. Par exemple ls -l.

> ipfs files ls -l
ipfs-site/ QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx 0

Nous obtenons alors la liste des documents stockés sur le nœud local, et leur hash.

Nous pouvons lire le contenu d’un répertoire avec ipfs ls <hash>

> ipfs ls QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx
QmP32QsKYgJyGf31je13V7S9cLFXP8gaBSPz42tqMAMtzX 473 index.html
QmeAWGXKryvDVb7EwiNso6eN1VW5uFBwNqHXddHLQRKqV6 110 style.css

On récupère le contenu du répertoire. On peut alors consulter le contenu d’un fichier avec ipfs cat <hash>, pour index.html par exemple :

> ipfs cat QmP32QsKYgJyGf31je13V7S9cLFXP8gaBSPz42tqMAMtzX
<!DOCTYPE html>
...
Fichiers distants

Pour récupérer le contenu d’un fichier ou d’un répertoire et en devenir fournisseur, on utilise ipfs get <hash> :

ipfs get QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx

Tout ce que nous avons vu en ligne de commande est également faisable via l’interface web locale http://127.0.0.1:5001/webui.

Elle est très intuitive et très simple d’utilisation.

Les limites d’IPFS

IPFS est une technologie jeune. Elle n’est pas encore parfaite et mérite d’être fiabilisée avec l’usage.

Elle est encore assez peu répandue. En tant que protocole de décentralisation, il ne pourra réaliser son potentiel qu’avec une utilisation massive.

Pour que des documents soient conservés durablement sur le réseau, ils vont devoir être téléchargés et épinglés par un grand nombre d’utilisateurs, sinon ils sont amenés à disparaître. IPFS n’est donc pas fait pour de la sauvegarde de fichiers.

Il est important de noter que IPFS ne chiffre pas les contenus. Tout fichier est consultable par tout le monde. Si vous souhaitez partager un document confidentiel, c’est à vous de le chiffrer en amont.

A noter aussi qu’IPFS ne protège pas non plus l’anonymat de ses utilisateurs. Les trames réseau du protocole comportent beaucoup d’informations sur leur provenance.

Pour aller plus loin

Avec tout ce que nous avons vu, vous avez compris le fonctionnement de base d’IPFS.

Maintenant, vous allez pouvoir l’intégrer dans vos applications grâce à js.ipfs.

Ou encore l’utiliser via Filecoin, qui pose une blockchain et une cryptomonnaie par-dessus le protocole pour monétiser le service de stockage.

Liens